Compartir a través de


Transformaciones de preprocesamiento del descodificador MPEG

[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.

Cuadro de cartas y PanScan

La imagen 4x3 se puede formar rellenando la parte superior e inferior de la imagen (denominada imagen letterbox) o extrayendo una parte 4x3 de la imagen (denominada imagen PanScan). Los menús y secuencias de subpictura se superponen en la parte superior de la imagen de vídeo final. Las imágenes de relación de 16x9 se almacenan en un formato anamórfico 4x3. Extender el vídeo de origen anamórfico de 4x3 relación de aspecto 720x480 a una relación de aspecto de 16x9 forma la imagen de aspecto original de 16x9.

A continuación se muestra una descripción de cómo mostrar correctamente cada uno de los modos y sus resaltados:

  • Pantalla ancha: El vídeo de origen se extendió en el área de 16x9 más grande de la ventana de salida. Los resaltados son relativos al interior del área 16x9. Las barras negras deben agregarse a la parte superior e inferior o a los lados para mantener un área de 16x9.
  • Examen panorámico: En el vídeo 16x9, use el desplazamiento horizontal proporcionado en la secuencia MPEG2 para extraer una subventana 4x3. Coloque la subventana 4x3 en el área 4x3 más grande de la ventana del cliente de salida. Las coordenadas del resaltado son relativas a la ventana de salida 4x3 y no tienen ninguna relación con el vídeo de origen 16x9. Las barras negras deben agregarse a la parte superior e inferior o a los lados para mantener un área de 4x3.
  • Buzón: Calcule el área 4x3 más grande de la ventana de salida. Las barras negras deben agregarse a la parte superior e inferior o a los lados para mantener un área de 4x3. El vídeo anamórfico de origen 4x3 (que representa una imagen de 16x9) se coloca en el subwindow de 16x9 más grande dentro del área 4x3. Se deben agregar barras negras a la parte superior e inferior de la subventana para mantener un área de 16x9. Las coordenadas del resaltado son relativas al área 4x3 y no tienen ninguna relación con el vídeo de origen 16x9. Es posible que un disco especifique un resaltado que se encuentra fuera del área 16x9 (pero todavía en la ventana 4x3). Para vídeo 4x3, el vídeo se coloca en el área de salida 4x3 más grande de la ventana del cliente de salida. Las barras negras deben agregarse a la parte superior e inferior o a los lados para mantener un área de 4x3.

Preprocesamiento MPEG con el navegador de DVD y VMR

Actualmente, el descodificador se pasa un tipo de medio FORMAT_MPEG2_VIDEO (cuyo bloque de formato apunta a una estructura MPEG2VIDEOINFO ). En los pines de salida, el descodificador genera un tipo de medio FORMAT_VideoInfo2, cuyo bloque de formato apunta a una estructura VIDEOINFOHEADER2 . Se ha cambiado el nombre del campo dwReserved de la estructura a las marcas dwControls .

El miembro dwControlFlags ahora contendrá los nuevos bits.

Etiqueta Value
AMCONTROL_USED 0x00000001
AMCONTROL_PAD_TO_4x3 0x00000002
AMCONTROL_PAD_TO_16x9 0x00000004

 

AMCONTROL_USED se usa para probar si se admiten estas nuevas marcas. Un filtro de origen debe establecer la marca de AMCONTROL_USED y ver si QueryAccept(MediaType) se realiza correctamente en la patilla de bajada. Si se rechaza, no se pueden usar las marcas AMCONTROL y dwReserved1 debe establecerse en 0.

AMCONTROL_PAD_TO_4x3 indica que la imagen debe rellenarse y mostrarse en un área de 4x3.

AMCONTROL_PAD_TO_16x9 indica que la imagen debe rellenarse y mostrarse en un área de 16x9.

El descodificador debe copiar o procesar los bits de forma ciega. Si el descodificador realiza la creación de cuadros de letras, debe modificar la relación de aspecto de píxeles, rellenar la imagen y quitar los bits de AMCONTROL_* correspondientes.

MPEG2VIDEOINFO.dwFlags ahora contiene tres marcas para controlar cómo se debe mostrar el contenido:

  • AMMPEG2_DoPanScan (0x00000001): si se establece esta marca, el descodificador de vídeo MPEG-2 debe recortar la imagen de salida basada en vectores de examen panorámico en picture_display_extension y cambiar la relación de aspecto de la imagen a 4x3. VmR no debe recibir un ejemplo de 16x9 con esta marca. Una implementación sencilla podría modificar el rectángulo de origen para indicar una región de origen de 540 anchos con un borde izquierdo igual al desplazamiento de visualización en el picture_display_extension.

  • AMMPEG2_LetterboxAnalogOut (0x00000020): cuando un descodificador de hardware muestra esta secuencia en una salida de vídeo (normalmente un conector SVIDEO en la tarjeta), debe aplicar las reglas para mostrar un ejemplo de 16x9 en una pantalla de 4x3.

    Un descodificador de software (o un descodificador de hardware que genera la salida enviada a VMR) tiene dos opciones al procesar imágenes:

    1. Omita esta marca y pase el contenido de VideoInfoHeader2 a VMR (la marca de AMCONTROL_PAD_TO_4x3 ya estará establecida por el navegador de DVD en el ejemplo). VmR encontrará una muestra de vídeo de 16 x 9 con la marca de AMCONTROL_PAD_TO_4x3 establecida y una secuencia de subpictura de 4x3. La aplicación debe establecer los rectángulos de destino normalizados de salida de los dos flujos para que sean del mismo ancho.
    2. Convierta la secuencia anamórfica en una imagen 4x3 rellenando la parte superior e inferior de la imagen y estableciendo la relación de aspecto de la imagen en 4 x 3 (vea cuadro de letra arriba) y quitando el bit de AMCONTROL_PAD_TO_4x3 de VIDEOINFOHEADER2.

    Los descodificadores de DirectXVA que combinan las secuencias de vídeo y subpicture tendrán que procesar esta marca. Si el hardware no puede escalar la subpictura combinada, el descodificador debe generar una secuencia de subpictura independiente para que vmR se combine con el vídeo.

  • AMMPEG2_WidescreenAnalogOut (0x00000200): cuando un descodificador de hardware muestra esta secuencia en una salida de vídeo (normalmente un conector SVIDEO en la tarjeta), debe suponer una pantalla de 16x9 (anamórfica).

    Un descodificador de software (o un descodificador de hardware que genera la salida enviada a VMR) tiene dos opciones al procesar una imagen anamórfica:

    1. Omita esta marca y copie el contenido de VideoInfoHeader2 en VMR. VmR rellenará 4 x 3 imágenes en 16x9 si tienen el AMCONTROL_PAD_TO_16x9 establecido.
    2. Rellenar la imagen de salida en una imagen de 16 x 9 y quitar el bit de AMCONTROL_PAD_TO_16x9.

La mayoría de los descodificadores deben usar GetMediaType para detectar un cambio multimedia en el pin de entrada y copiar el contenido de VIDEOINFOHEADER2 (contenido en MPEG2INFOHEADER) en el pin de salida. Probablemente solo procesarán el bit PanScan.

En el código de ejemplo siguiente se muestra cómo copiar el contenido de VIDEOINFOHEADER2 de un pin de entrada a un pin de salida.

#include <dvdmedia.h>
HRESULT CopyMPeg2ToVideoInfoHeader2(CMediaSample* pInSample, CMediaSample* pOutSample)
{
    HRESULT hr = S_OK;
    // Check for a media type on the input sample.
    AM_MEDIA_TYPE* pInType;
    if (pInSample->GetMediaType(&pInType) == S_OK) 
    {
        // Make sure it's an MPEG2 Video format.
        if ((pInType->formattype == FORMAT_MPEG2_VIDEO) &&
            (pInType->cbFormat >= sizeof(MPEG2VIDEOINFO)))
        {
            hr = S_OK; // Initialize hr for the CMediaType constructor.
            CMediaType outType(*pInType, &hr);
            if (FAILED(hr))
            {
                DeleteMediaType( pInType );
                return hr;
            }

            // Set the format type GUID.
            outType.SetFormatType(&FORMAT_VideoInfo2);
                
            // Truncate the format block to include just the VIDEOINFOHEADER part.
            MPEG2VIDEOINFO *pMPeg2Header = (MPEG2VIDEOINFO*)pInType->pbFormat;
            BYTE *pVIH = (BYTE*)&pMPeg2Header->hdr;
            hr = (outType.SetFormat(pVIH, sizeof(VIDEOINFOHEADER2)) ? S_OK : E_OUTOFMEMORY);
            if (SUCCEEDED(hr))
            {
                hr = pOutSample->SetMediaType(&outType);
            }
        } 
        else 
        {
            ASSERT(FALSE); // Not a MPEG2 header.
            hr = VFW_E_INVALIDMEDIATYPE;
        }
        DeleteMediaType( pInType );
    } 

    return hr;
}