Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anterior Revisión previa Próxima revisión | Revisión previa | ||
|
fw:dshow [2013/11/21 17:55] alfred [Creación de un filtro source] |
fw:dshow [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 85: | Línea 85: | ||
| Los datos son almacenados en buffers (simples arrays de bytes), están dentro de un objeto COM denominado media sample (implementa IMediaSample) y son creados por los allocators (IMemAllocator). Un allocator se asigna a una conexión entre pines (dos o más conexiones de pines pueden compartir el mismo allocator). \\ | Los datos son almacenados en buffers (simples arrays de bytes), están dentro de un objeto COM denominado media sample (implementa IMediaSample) y son creados por los allocators (IMemAllocator). Un allocator se asigna a una conexión entre pines (dos o más conexiones de pines pueden compartir el mismo allocator). \\ | ||
| Cuando un filtro necesita rellenar un buffer con datos le pide un sample al allocator llamando a IMemAllocator::GetBuffer. Si los samples están libres retornará un puntero a uno de ellos, si están en uso el método se bloqueará hasta que quede uno disponible. Un sample queda libre cuando el filtro downstream ha dejado de utilizarlo (p.ej. renderizandolo), de esa forma los samples no se sobreescriben. | Cuando un filtro necesita rellenar un buffer con datos le pide un sample al allocator llamando a IMemAllocator::GetBuffer. Si los samples están libres retornará un puntero a uno de ellos, si están en uso el método se bloqueará hasta que quede uno disponible. Un sample queda libre cuando el filtro downstream ha dejado de utilizarlo (p.ej. renderizandolo), de esa forma los samples no se sobreescriben. | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | |||
| + | ==== Formato de los datos ==== | ||
| + | === Stride de la imagen === | ||
| + | El stride (o pitch) es el número de bytes de una fila de pixels que se reservan para agregar información adicional. Esto afecta al tamaño de la imagen en memoria pero no pero no a como esta se muestra. \\ | ||
| + | [[http://msdn.microsoft.com/en-us/library/windows/desktop/aa473780(v=vs.85).aspx|Artículo de MSDN]] | ||
| + | |||
| + | === Leer video no comprimido === | ||
| + | Video no comprimido es una secuencia de bitmaps mostrados en sucesión con ratio de unos 30 frames por segundo. Para descomprimir un frame se utilizará el método CTransformFilter::Transform; este recibe un puntero a IMediaSample donde están encapsulados los datos, IMediaSample::GetPointer retornará un puntero al primer byte de los datos. | ||
| + | |||
| + | === Producir video no comprimido === | ||
| + | |||
| + | Información sacada de la [[http://msdn.microsoft.com/en-us/library/windows/desktop/ff485865(v=vs.85).aspx|MSDN]], en ese artículo también hay ejemplos de... | ||
| + | * Función que asigna los valores para un vídeo sin comprimir. | ||
| + | * Descompresión de una imagen. | ||
| + | Cuando produzcamos vídeo no comprimido rellenaremos el IMFMediaType con los siguientes valores: | ||
| + | * MF_MT_MAJOR_TYPE: Asignarlo con MFMediaType_Video. | ||
| + | * MF_MT_SUBTYPE: [[http://msdn.microsoft.com/en-us/library/windows/desktop/aa370819(v=vs.85).aspx|Subtipos de video]]. | ||
| + | * MF_MT_DEFAULT_STRIDE: El número de bytes necesitado para ir de una fila de pixels a la siguiente (este valor se puede omitir si no es igual al ancho de la imagen en bytes). | ||
| + | * MF_MT_FRAME_RATE: Frame rate. | ||
| + | * MF_MT_FRAME_SIZE: Frame size. | ||
| + | * MF_MT_INTERLACE_MODE: Interlacing mode. | ||
| + | * MF_MT_ALL_SAMPLES_INDEPENDENT: Indica si cada sample es independiente (true en formato no comprimido). | ||
| + | * MF_MT_PIXEL_ASPECT_RATIO: Pixel aspect ratio. | ||
| + | Si se conocen se añadirán los siguientes valores: MF_MT_VIDEO_PRIMARIES, MF_MT_TRANSFER_FUNCTION, MF_MT_VIDEO_CHROMA_SITINGMF_MT_YUV_MATRIX y MF_MT_VIDEO_NOMINAL_RANGE. \\ | ||
| + | |||
| + | Existen las siguientes funciones que pueden ser de utilidad: | ||
| + | * MFAverageTimePerFrameToFrameRate: Calcula el frame rate a partir de la duración del frame. | ||
| + | * MFCalculateImageSize: Calcula el tamaño de la imagen para un video no comprimido. | ||
| + | * MFFrameRateToAverageTimePerFrame: Calcula la duracion de un video dando el frame rate. | ||
| + | * MFGetStrideForBitmapInfoHeader: Retorna el minimo valor de stride por formato de video. | ||
| + | * MFInitVideoFormat: Inicializa el MFVIDEOFORMAT para algunos formatos de video standard. | ||
| + | * MFIsFormatYUV: Indica si el formato es YUV. | ||
| + | |||
| + | |||
| + | === Cambio del formato de datos === | ||
| + | En el filtro upstream: | ||
| + | - El filtro downstream comprueba en la conexión quién debe ser propietario del allocator, si lo es el upstream no podrá cambiar el formato de los datos. | ||
| + | - El filtro downstream llama a IPin::QueryAccept del pin de output del upstream. | ||
| + | - Si QueryAccept retorna S_OK, entonce el filtro downstream llama al método privado del allocator para asignar el media type. Dentro de este método se llama a IMediaSample::SetMediaType. | ||
| + | - El filtro upstream llama a GetBuffer para tomar un nuevo sample y a IMediaSample::GetMediaType para obtener el media type. | ||
| + | - Cuando el filtro upstream deja el sample debe indicar el media type, de esa forma el filtro de downstream podrá conformar que el media type a cambiado. | ||
| + | |||
| + | === Explicación en MSDN === | ||
| + | * [[http://msdn.microsoft.com/en-us/library/windows/desktop/bb530104(v=vs.85).aspx|Conversion a YUV]] | ||
| + | * [[http://msdn.microsoft.com/en-us/library/windows/desktop/bb530115(v=vs.85).aspx|Crop, pan y aspect ratio]] | ||
| + | * [[http://msdn.microsoft.com/en-us/library/windows/desktop/dd407212(v=vs.85).aspx|Imagenes Top-Down y Bottom-Up]] | ||
| ==== Creación de un filtro ==== | ==== Creación de un filtro ==== | ||
| === CUnknown === | === CUnknown === | ||
| Línea 304: | Línea 354: | ||
| * CheckMediaType: que devuelve si acepta un tipo de datos (media type) concreto. Según implementes el GetMediaType será o no necesario sobreescribirlo. | * CheckMediaType: que devuelve si acepta un tipo de datos (media type) concreto. Según implementes el GetMediaType será o no necesario sobreescribirlo. | ||
| GetMediaType puede contener únicamente un puntero a CMediaType (cuando soporta un solo media type) o un puntero y una variable de índice (cuando soporta varios). Uno (y sólo uno) de los dos se ha de sobreescribir, en el caso de tener varios media types también deberá ser sobreescrito el CheckMediaType. \\ | GetMediaType puede contener únicamente un puntero a CMediaType (cuando soporta un solo media type) o un puntero y una variable de índice (cuando soporta varios). Uno (y sólo uno) de los dos se ha de sobreescribir, en el caso de tener varios media types también deberá ser sobreescrito el CheckMediaType. \\ | ||
| - | Para los formatos de video sin comprimir el filtro downstream podrá proponer cualquier stride value (valor de salto). \\ | + | Para los formatos de video sin comprimir el filtro downstream podrá proponer cualquier stride value (valor de salto, en cada fila de la imagen los valores adicionales que se añaden). \\ |
| También de deberá sobreescribir el método CBaseOutputPin::DecideBufferSize para indicar el tamaño de los buffers. \\ | También de deberá sobreescribir el método CBaseOutputPin::DecideBufferSize para indicar el tamaño de los buffers. \\ | ||
| ==== Definición de propiedades del filtro ==== | ==== Definición de propiedades del filtro ==== | ||
| Línea 322: | Línea 372: | ||
| - Si lo has hecho por COM, agrega otra CFactoryTemplate al array g_Templates que indica los objetos COM que tiene tu dll. | - Si lo has hecho por COM, agrega otra CFactoryTemplate al array g_Templates que indica los objetos COM que tiene tu dll. | ||
| ===== Notas ===== | ===== Notas ===== | ||
| + | * Flash Media Live Encoder reconocerá los filtros de captura en formatos sin procesar I420, YV12, YUY2, UYVY, RGB24 y RGB32. | ||
| + | * Script .bat para instalar un filtro: | ||
| + | <code> | ||
| + | @echo off | ||
| + | SET filterfile=VCamD.ax | ||
| + | AT > NUL | ||
| + | IF NOT %ERRORLEVEL% EQU 0 ( | ||
| + | ECHO Necesitas ser administrador para instalar el filtro | ||
| + | pause | ||
| + | EXIT /B 1 | ||
| + | ) | ||
| + | regsvr32 %~dp0%filterfile% | ||
| + | </code> | ||
| ==== Notas de programación COM ==== | ==== Notas de programación COM ==== | ||
| === Funciones de ayuda === | === Funciones de ayuda === | ||
| Línea 354: | Línea 416: | ||
| ==== Recursos ==== | ==== Recursos ==== | ||
| * {{:fw:dshow:com_in_plain_c_-_codeproject.pdf|Explicación del COM}} | * {{:fw:dshow:com_in_plain_c_-_codeproject.pdf|Explicación del COM}} | ||
| + | * {{:fw:dshow:graphstudio.zip|GraphStudio}}, aplicación para debugar los filtros y obtener info de ellos. | ||