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 18:42] alfred [Pins y traslado de datos] |
fw:dshow [2020/05/09 09:25] (actual) |
||
|---|---|---|---|
| Línea 91: | Línea 91: | ||
| ==== Formato de los datos ==== | ==== 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 === | === Cambio del formato de datos === | ||
| Línea 99: | Línea 130: | ||
| - El filtro upstream llama a GetBuffer para tomar un nuevo sample y a IMediaSample::GetMediaType para obtener el media type. | - 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. | - 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 318: | 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 337: | Línea 373: | ||
| ===== Notas ===== | ===== Notas ===== | ||
| * Flash Media Live Encoder reconocerá los filtros de captura en formatos sin procesar I420, YV12, YUY2, UYVY, RGB24 y RGB32. | * 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 368: | 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. | ||