Rectángulos de origen y destino en representadores de vídeo
[La característica asociada a esta página, DirectShow, es una característica heredada. Se ha reemplazado por MediaPlayer, IMFMediaEngine y Captura de audio/vídeo en Media Foundation. Esas características se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use MediaPlayer, IMFMediaEngine y Audio/Video Capture en Media Foundation en lugar de DirectShow, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Hay tres tamaños que se encuentran en las estructuras de formato VIDEOINFO, VIDEOINFOHEADER y VIDEOINFOHEADER2 de tipos de medios de vídeo. En este artículo se explica qué son y cómo funcionan.
En primer lugar, hay un tamaño en el miembro del imcHeader de estas estructuras. El miembro indexHeader es una estructura BITMAPINFOHEADER con sus propios miembros de ancho y alto, imcHeader.biWidth y imcHeader.biHeight.
En segundo lugar, hay un rectángulo en el miembro rcSource de estas estructuras; y, por último, hay un rectángulo en el miembro rcTarget de estas estructuras.
Supongamos que tiene dos filtros, A y B, y que estos filtros están conectados entre sí (A a la izquierda, o ascendente, y B a la derecha o descendente) con un determinado tipo de medio de vídeo.
Los búferes que pasan entre los filtros A y B tienen el tamaño (imcHeader.biWidth, imcHeader.biHeight). El filtro A debe tomar una parte de su vídeo de entrada determinado por rcSource y estirar ese vídeo para rellenar la parte rcTarget del búfer. La parte del vídeo de entrada que se va a usar se basa en cómo rcSource se compara con el tamaño (biWidth, biHeight) del tipo de medio con el que se filtra A y B originalmente conectado. Si rcSource está vacío, el filtro A usa todo su vídeo de entrada. Si rcTarget está vacío, el filtro A rellena todo el búfer de salida.
Por ejemplo, supongamos que el filtro A recibe datos de vídeo de 160 x 120 píxeles. Suponga también que el filtro A está conectado al filtro B con el siguiente tipo de medio.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 0, 0)
- rcTarget: (0, 0, 0, 0)
Esto significa que el filtro A estirará el vídeo que recibe en 2 en las direcciones x e y, y rellenará un búfer de salida de 320 x 240.
Como otro ejemplo, supongamos que el filtro A recibe datos de vídeo de 160 x 120 y que está conectado al filtro B con el siguiente tipo de medio.
- (biWidth, biHeight): 320, 240
- rcSource: (0, 0, 160, 240)
- rcTarget: (0, 0, 0, 0)
El miembro rcSource es relativo al tamaño del búfer conectado de 320, 240. Dado que el rcSource especificado (0, 0, 160, 240) es la mitad izquierda del búfer, el filtro A tomará la mitad izquierda de su vídeo de entrada, o la parte (0, 0, 80, 120) y estirará el vídeo a un tamaño de (320, 240) (por 4 en la dirección x, y en 2 en la dirección Y) y llenando el búfer de salida 320 x 240.
Ahora supongamos que el filtro A llama a CBaseAllocator::GetBuffer y el ejemplo multimedia devuelto tiene un tipo de medio asociado, lo que significa que el filtro B quiere que el filtro A proporcione un tamaño o tipo de vídeo diferente al que ha proporcionado anteriormente. Supongamos que el nuevo tipo de medio es:
- (biWidth, biHeight): 640, 480
- rcSource: (0, 0, 160, 120)
- rcTarget: (0, 0, 80, 60)
Esto significa que la muestra de medios tiene un búfer que tiene un tamaño de 640 x 480. El miembro rcSource es relativo al tipo de medio conectado original (320, 240) no al nuevo tipo de medio de (640, 480), por lo que rcSource especifica que se va a usar la esquina superior izquierda (25 %) del vídeo de entrada. Esta parte del vídeo de entrada se coloca en la parte superior izquierda (80, 60) píxeles del búfer de salida de 640 x 480, según lo especificado por rcTarget de (0, 0, 80, 60). Dado que el filtro A recibe 160 x 120 vídeos, la esquina superior izquierda del vídeo de entrada es una pieza (80, 60), el mismo tamaño del mapa de bits de salida y no se requiere ningún ajuste.
El filtro A no colocará ningún dato en los otros píxeles del búfer de salida y dejará esos bits intactos. El miembro rcSource está limitado por biWidth y biHeight del tipo de medio conectado original entre los filtros A y B, y rcTarget está limitado por el nuevo biWidth y biHeight del ejemplo multimedia. En el ejemplo anterior, rcSource no pudo salir de los límites de (0, 0, 320, 240) y rcTarget no pudo salir de los límites de (0, 0, 640, 480).