Procesamiento de vídeo DXVA

El procesamiento de vídeo DXVA encapsula las funciones del hardware gráfico dedicado al procesamiento de imágenes de vídeo sin comprimir. Los servicios de procesamiento de vídeo incluyen desentrelazado y mezcla de vídeo.

Este tema contiene las siguientes secciones:

Información general

El hardware gráfico puede usar la unidad de procesamiento gráfico (GPU) para procesar imágenes de vídeo sin comprimir. Un dispositivo de procesamiento de vídeo es un componente de software que encapsula estas funciones. Las aplicaciones pueden usar un dispositivo de procesamiento de vídeo para realizar funciones como:

  • Desentrelazado y telecine inverso
  • Mezcla de substreams de vídeo en la imagen de vídeo principal
  • Ajuste de color (ProcAmp) y filtrado de imágenes
  • Escalado de imagen
  • Conversión de espacio de colores
  • Combinación alfa

En el diagrama siguiente se muestran las fases de la canalización de procesamiento de vídeo. El diagrama no está diseñado para mostrar una implementación real. Por ejemplo, el controlador de gráficos puede combinar varias fases en una sola operación. Todas estas operaciones se pueden realizar en una sola llamada al dispositivo de procesamiento de vídeo. Es posible que el controlador no admita algunas fases que se muestran aquí, como el filtrado de ruido y detalles.

diagram showing the stages of dxva video processing.

La entrada a la canalización de procesamiento de vídeo siempre incluye una secuencia de vídeo principal, que contiene los datos de imagen principales. La secuencia de vídeo principal determina la velocidad de fotogramas del vídeo de salida. Cada fotograma del vídeo de salida se calcula en relación con los datos de entrada de la secuencia de vídeo principal. Los píxeles de la secuencia principal siempre son opacos, sin datos alfa por píxel. La secuencia de vídeo principal puede ser progresiva o entrelazada.

Opcionalmente, la canalización de procesamiento de vídeo puede recibir hasta 15 substreams de vídeo. Una substream contiene datos auxiliares de imagen, como subtítulos o subimágenes de DVD. Estas imágenes se muestran sobre la secuencia de vídeo principal y, por lo general, no están pensadas para mostrarse por sí mismas. Las imágenes de substream pueden contener datos alfa por píxel y siempre son fotogramas progresivos. El dispositivo de procesamiento de video realiza una mezcla alfa de las imágenes de substream con el fotograma desentrelazado actual de la secuencia de video principal.

En el resto de este tema, el término imagen se usa para los datos de entrada a un dispositivo de procesamiento de vídeo. Una imagen puede constar de un fotograma progresivo, un único campo o dos campos intercalados. La salida siempre es un fotograma desentrelazado.

Un controlador de vídeo puede implementar más de un dispositivo de procesamiento de vídeo para proporcionar diferentes conjuntos de funcionalidades de procesamiento de vídeo. Los dispositivos se identifican mediante el GUID. Los GUID siguientes están predefinidos:

  • DXVA2_VideoProcBobDevice. Este dispositivo realiza el desentrelazado bob.
  • DXVA2_VideoProcProgressiveDevice. Este dispositivo se usa si el vídeo solo contiene fotogramas progresivos, sin fotogramas entrelazados. (Algunos contenidos de vídeo contienen una combinación de fotogramas progresivos y entrelazados. El dispositivo progresivo no se puede usar para este tipo de contenido de vídeo "mixto", ya que se requiere un paso de desentrelazado para los fotogramas entrelazados).

Cada controlador gráfico que admita el procesamiento de vídeo DXVA debe implementar al menos estos dos dispositivos. El controlador de gráficos también puede proporcionar otros dispositivos, que se identifican mediante los GUID específicos del controlador. Por ejemplo, un controlador podría implementar un algoritmo de desentrelazado propietario que genera una salida de mejor calidad que el desentrelazado bob. Algunos algoritmos de desentrelazado pueden requerir imágenes de referencia hacia delante o hacia atrás de la secuencia principal. Si es así, el autor de la llamada debe proporcionar estas imágenes al controlador en la secuencia correcta, como se describe más adelante en esta sección.

También se proporciona un dispositivo de software de referencia. El dispositivo de software está optimizado para la calidad en lugar de la velocidad, y puede que no sea adecuado para el procesamiento de vídeo en tiempo real. El dispositivo de software de referencia usa el valor GUID DXVA2_VideoProcSoftwareDevice.

Creación de un dispositivo de procesamiento de vídeo

Antes de usar el procesamiento de vídeo DXVA, la aplicación debe crear un dispositivo de procesamiento de vídeo. Aquí se muestra un breve esquema de los pasos, que se explican con mayor detalle en el resto de esta sección:

  1. Obtenga un puntero a la interfaz IDirectXVideoProcessorService.
  2. Cree una descripción del formato de vídeo para la secuencia de vídeo principal. Use esta descripción para obtener una lista de los dispositivos de procesamiento de vídeo que admiten el formato de vídeo. Los dispositivos se identifican mediante el GUID.
  3. Para un dispositivo determinado, obtenga una lista de formatos de destino de representación admitidos por el dispositivo. Los formatos se devuelven como una lista de valores D3DFORMAT. Si planea mezclar substreams, obtenga también una lista de los formatos de substream admitidos.
  4. Consulte las funcionalidades de cada dispositivo.
  5. Cree el dispositivo de procesamiento de vídeo.

En ocasiones, puede omitir algunos de estos pasos. Por ejemplo, en lugar de obtener la lista de formatos de destino de representación, podría intentar simplemente crear el dispositivo de procesamiento de vídeo con su formato preferido y ver si funciona. Es probable que un formato común, como D3DFMT_X8R8G8B8, funcione correctamente.

En el resto de esta sección se describen estos pasos en detalle.

Obtención del puntero IDirectXVideoProcessorService

La interfaz IDirectXVideoProcessorService se obtiene del dispositivo Direct3D. Hay dos maneras de obtener un puntero a esta interfaz:

Si tiene un puntero a un dispositivo Direct3D, puede obtener un puntero IDirectXVideoProcessorServicellamando a la función DXVA2CreateVideoService. Pase un puntero a la interfaz IDirect3DDevice9 del dispositivo y especifique IID_IDirectXVideoProcessorService para el parámetro riid, como se muestra en el código siguiente:

    // Create the DXVA-2 Video Processor service.
    hr = DXVA2CreateVideoService(g_pD3DD9, IID_PPV_ARGS(&g_pDXVAVPS));

En algunos casos, un objeto crea el dispositivo Direct3D y, luego, lo comparte con otros objetos mediante el Administrador de dispositivos Direct3D. En esta situación, puede llamar a IDirect3DDeviceManager9::GetVideoService en el administrador de dispositivos para obtener el puntero IDirectXVideoProcessorService, como se muestra en el código siguiente:

HRESULT GetVideoProcessorService(
    IDirect3DDeviceManager9 *pDeviceManager,
    IDirectXVideoProcessorService **ppVPService
    )
{
    *ppVPService = NULL;

    HANDLE hDevice;

    HRESULT hr = pDeviceManager->OpenDeviceHandle(&hDevice);
    if (SUCCEEDED(hr))
    {
        // Get the video processor service 
        HRESULT hr2 = pDeviceManager->GetVideoService(
            hDevice, 
            IID_PPV_ARGS(ppVPService)
            );

        // Close the device handle.
        hr = pDeviceManager->CloseDeviceHandle(hDevice);

        if (FAILED(hr2))
        {
            hr = hr2;
        }
    }

    if (FAILED(hr))
    {
        SafeRelease(ppVPService);
    }

    return hr;
}

Enumeración de los dispositivos de procesamiento de vídeo

Para obtener una lista de dispositivos de procesamiento de vídeo, rellene una estructura DXVA2_VideoDesc con el formato de la secuencia de vídeo principal y pase esta estructura al método IDirectXVideoProcessorService::GetVideoProcessorDeviceGuids. El método devuelve una matriz de GUID, uno para cada dispositivo de procesamiento de vídeo que se puede usar con este formato de vídeo.

Considere una aplicación que representa una secuencia de vídeo en formato YUY2, utilizando la definición BT.709 de color YUV, con una velocidad de fotogramas de 29,97 fotogramas por segundo. Supongamos que el contenido del vídeo consta completamente de fotogramas progresivos. El fragmento de código siguiente muestra cómo rellenar la descripción del formato y obtener los GUID del dispositivo:

    // Initialize the video descriptor.

    g_VideoDesc.SampleWidth                         = VIDEO_MAIN_WIDTH;
    g_VideoDesc.SampleHeight                        = VIDEO_MAIN_HEIGHT;
    g_VideoDesc.SampleFormat.VideoChromaSubsampling = DXVA2_VideoChromaSubsampling_MPEG2;
    g_VideoDesc.SampleFormat.NominalRange           = DXVA2_NominalRange_16_235;
    g_VideoDesc.SampleFormat.VideoTransferMatrix    = EX_COLOR_INFO[g_ExColorInfo][0];
    g_VideoDesc.SampleFormat.VideoLighting          = DXVA2_VideoLighting_dim;
    g_VideoDesc.SampleFormat.VideoPrimaries         = DXVA2_VideoPrimaries_BT709;
    g_VideoDesc.SampleFormat.VideoTransferFunction  = DXVA2_VideoTransFunc_709;
    g_VideoDesc.SampleFormat.SampleFormat           = DXVA2_SampleProgressiveFrame;
    g_VideoDesc.Format                              = VIDEO_MAIN_FORMAT;
    g_VideoDesc.InputSampleFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.InputSampleFreq.Denominator         = 1;
    g_VideoDesc.OutputFrameFreq.Numerator           = VIDEO_FPS;
    g_VideoDesc.OutputFrameFreq.Denominator         = 1;

    // Query the video processor GUID.

    UINT count;
    GUID* guids = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorDeviceGuids(&g_VideoDesc, &count, &guids);

El código de este ejemplo se toma del ejemplo del SDK DXVA2_VideoProc.

La matriz pGuids de este ejemplo se asigna mediante el método GetVideoProcessorDeviceGuids, por lo que la aplicación debe liberar la matriz llamando a CoTaskMemFree. El resto de pasos se puede realizar mediante cualquiera de los GUID de dispositivo devueltos por este método.

Enumeración de formatos de destino de representación

Para obtener la lista de formatos de destino de representación admitidos por el dispositivo, pase el GUID del dispositivo y la estructura DXVA2_VideoDesc al método IDirectXVideoProcessorService::GetVideoProcessorRenderTargets, como se muestra en el código siguiente:

    // Query the supported render-target formats.

    UINT i, count;
    D3DFORMAT* formats = NULL;

    HRESULT hr = g_pDXVAVPS->GetVideoProcessorRenderTargets(
        guid, &g_VideoDesc, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorRenderTargets failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_RENDER_TARGET_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the render-target format.\n"));
        return FALSE;
    }

El método devuelve una matriz de valores D3DFORMAT. En este ejemplo, donde el tipo de entrada es YUY2, una lista típica de formatos podría ser D3DFMT_X8R8G8B8 (RGB de 32 bits) y D3DMFT_YUY2 (el formato de entrada). Sin embargo, la lista exacta dependerá del controlador.

La lista de formatos disponibles para las substreams puede variar en función del formato de destino de representación y del formato de entrada. Para obtener la lista de formatos de substream, pase el GUID del dispositivo, la estructura de formato y el formato de destino de representación al método IDirectXVideoProcessorService::GetVideoProcessorSubStreamFormats, como se muestra en el código siguiente:

    // Query the supported substream formats.

    formats = NULL;

    hr = g_pDXVAVPS->GetVideoProcessorSubStreamFormats(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &count, &formats);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorSubStreamFormats failed: 0x%x.\n", hr));
        return FALSE;
    }

    for (i = 0; i < count; i++)
    {
        if (formats[i] == VIDEO_SUB_FORMAT)
        {
            break;
        }
    }

    CoTaskMemFree(formats);

    if (i >= count)
    {
        DBGMSG((L"The device does not support the substream format.\n"));
        return FALSE;
    }

Este método devuelve otra matriz de valores D3DFORMAT. Los formatos típicos de substream son AYUV y AI44.

Consulta de las funcionalidades del dispositivo

Para obtener las funcionalidades de un dispositivo determinado, pase el GUID del dispositivo, la estructura de formato y un formato de destino de representación al método IDirectXVideoProcessorService::GetVideoProcessorCaps. El método rellena una estructura DXVA2_VideoProcessorCaps con las funcionalidades del dispositivo.

    // Query video processor capabilities.

    hr = g_pDXVAVPS->GetVideoProcessorCaps(
        guid, &g_VideoDesc, VIDEO_RENDER_TARGET_FORMAT, &g_VPCaps);

    if (FAILED(hr))
    {
        DBGMSG((L"GetVideoProcessorCaps failed: 0x%x.\n", hr));
        return FALSE;
    }

Creación del dispositivo

Para crear el dispositivo de procesamiento de vídeo, llame a IDirectXVideoProcessorService::CreateVideoProcessor. La entrada a este método es el GUID del dispositivo, la descripción del formato, el formato de destino de representación y el número máximo de substreams que planea mezclar. El método devuelve un puntero a la interfaz IDirectXVideoProcessor, que representa el dispositivo de procesamiento de vídeo.

    // Finally create a video processor device.

    hr = g_pDXVAVPS->CreateVideoProcessor(
        guid,
        &g_VideoDesc,
        VIDEO_RENDER_TARGET_FORMAT,
        SUB_STREAM_COUNT,
        &g_pDXVAVPD
        );

Blit de procesamiento de vídeo

La operación principal de procesamiento de vídeo es el blit de procesamiento de vídeo. (Un blit es cualquier operación que combina dos o más mapas de bits en un solo mapa de bits. Un blit de procesamiento de vídeo combina imágenes de entrada para crear un fotograma de salida). Para realizar un blit de procesamiento de vídeo, llame a IDirectXVideoProcessor::VideoProcessBlt. Este método pasa un conjunto de muestras de vídeo al dispositivo de procesamiento de vídeo. En respuesta, el dispositivo de procesamiento de vídeo procesa las imágenes de entrada y genera un fotograma de salida. El procesamiento puede incluir desentrelazado, conversión de espacio de colores y mezcla de substreams. La salida se escribe en una superficie de destino proporcionada por el autor de la llamada.

El método VideoProcessBlt toma los parámetros siguientes:

  • pRT apunta a una superficie de destino de representación IDirect3DSurface9 que recibirá el fotograma de vídeo procesado.
  • pBltParams apunta a una estructura DXVA2_VideoProcessBltParams que especifica los parámetros del blit.
  • pSamples es la dirección de una matriz de estructuras DXVA2_VideoSample. Estas estructuras contienen las muestras de entrada del blit.
  • NumSamples proporciona el tamaño de la matriz pSamples.
  • El parámetro Reserved está reservado y debe establecerse en NULL.

En la matriz pSamples, el autor de la llamada debe proporcionar las siguientes muestras de entrada:

  • Imagen actual de la secuencia de vídeo principal.
  • Imágenes de referencia hacia delante y hacia atrás, si así lo requiere el algoritmo de desentrelazado.
  • Cero o más imágenes de substream, hasta un máximo de 15 substreams.

El controlador espera que esta matriz esté en un orden determinado, como se describe en Orden de muestras de entrada.

Parámetros del blit

La estructura DXVA2_VideoProcessBltParams contiene parámetros generales del blit. Los parámetros más importantes se almacenan en los siguientes miembros de la estructura:

  • TargetFrame es el tiempo de presentación del fotograma de salida. En el caso del contenido progresivo, este tiempo debe ser igual a la hora de inicio del fotograma actual desde la secuencia de vídeo principal. Este tiempo se especifica en el miembro Start de la estructura DXVA2_VideoSample para esta muestra de entrada.

    Para el contenido entrelazado, un fotograma con dos campos intercalados genera dos fotogramas de salida desentrelazados. En el primer fotograma de salida, el tiempo de presentación debe ser igual a la hora de inicio de la imagen actual en la secuencia de vídeo principal, lo mismo que el contenido progresivo. En el segundo fotograma de salida, la hora de inicio debe ser igual al punto medio entre la hora de inicio de la imagen actual en la secuencia de vídeo principal y la hora de inicio de la siguiente imagen de la secuencia. Por ejemplo, si el vídeo de entrada es de 25 fotogramas por segundo (50 campos por segundo), los fotogramas de salida tendrán las marcas de tiempo que se muestran en la tabla siguiente. Las marcas de tiempo se muestran en unidades de 100 nanosegundos.

    Imagen de entrada TargetFrame (1) TargetFrame (2)
    0 0 200000
    400000 0 600000
    800 000 800 000 1000000
    1200000 1200000 1400000

     

    Si el contenido entrelazado consta de campos únicos en lugar de campos intercalados, los tiempos de salida siempre coinciden con los tiempos de entrada, como con el contenido progresivo.

  • TargetRect define una región rectangular dentro de la superficie de destino. El blit escribirá la salida en esta región. En concreto, se modificarán todos los píxeles dentro de TargetRect y no se modificará ningún píxel fuera de TargetRect. El rectángulo objetivo define el rectángulo delimitador de todas las secuencias de vídeo de entrada. La colocación de secuencias individuales dentro de ese rectángulo se controla mediante el parámetro pSamples de IDirectXVideoProcessor::VideoProcessBlt.

  • BackgroundColor proporciona el color del fondo donde no aparece ninguna imagen de vídeo. Por ejemplo, cuando se muestra una imagen de vídeo de 16 x 9 dentro de un área de 4 x 3 (”letterboxing”), las regiones con este efecto se muestran con el color de fondo. El color de fondo solo se aplica dentro del rectángulo objetivo (TargetRect). Los píxeles fuera de TargetRect no se modifican.

  • DestFormat describe el espacio de color del vídeo de salida; por ejemplo, si se usa el color BT.709 o BT.601 de ITU-R. Esta información puede afectar a cómo se muestra la imagen. Para más información, consulte Información de color extendida.

Otros parámetros se describen en la página de referencia de la estructura DXVA2_VideoProcessBltParams.

Muestras de entrada

El parámetro pSamples de IDirectXVideoProcessor::VideoProcessBlt apunta a una matriz de estructuras DXVA2_VideoSample. Cada una de estas estructuras contiene información sobre una muestra de entrada y un puntero a la superficie de Direct3D que contiene la muestra. Cada muestra es una de las siguientes:

  • Imagen actual de la secuencia principal.
  • Imagen de referencia hacia delante o hacia atrás de la secuencia principal, que se usa para el desentrelazado.
  • Imagen de substream.

El orden exacto en el que deben aparecer las muestras en la matriz se describe más adelante, en la sección Orden de muestras de entrada.

Se pueden proporcionar hasta 15 imágenes de substream, aunque la mayoría de las aplicaciones de vídeo solo necesitan una substream, como máximo. El número de substreams puede cambiar con cada llamada a VideoProcessBlt. Las imágenes de substream se indican estableciendo el miembro SampleFormat.SampleFormat de la estructura DXVA2_VideoSample igual a DXVA2_SampleSubStream. Para la secuencia de vídeo principal, este miembro describe el entrelazado del vídeo de entrada. Para más información, consulte la enumeración DXVA2_SampleFormat.

Para la secuencia de vídeo principal, los miembros Start y End de la estructura DXVA2_VideoSample proporcionan las horas de inicio y finalización de la muestra de entrada. En el caso de las imágenes de substream, establezca estos valores en cero, ya que la hora de presentación siempre se calcula a partir de la secuencia principal. La aplicación es responsable del seguimiento cuando se debe presentar cada imagen de substream y enviarla a VideoProcessBlt en el momento adecuado.

Dos rectángulos definen cómo se coloca el vídeo de origen para cada secuencia:

  • El miembro SrcRect de la estructura DXVA2_VideoSample especifica el rectángulo de origen, una región rectangular de la imagen de origen que aparecerá en el fotograma de salida compuesto. Para recortar la imagen, establézcalo en un valor menor que el tamaño del fotograma. De lo contrario, establézcalo igual al tamaño del fotograma.
  • El miembro DstRect de la misma estructura especifica el rectángulo de destino, una región rectangular de la superficie de destino donde aparecerá el fotograma de vídeo.

El controlador transfiere los bloques de blits del rectángulo de origen al rectángulo de destino. Los dos rectángulos pueden tener diferentes tamaños o relaciones de aspecto; el controlador escalará la imagen según sea necesario. Además, cada secuencia de entrada puede usar un factor de escalado diferente. De hecho, el escalado podría ser necesario para generar la relación de aspecto correcta en el fotograma de salida. El controlador no tiene en cuenta la relación de aspecto de píxeles del origen, por lo que si la imagen de origen usa píxeles no cuadrados, es la aplicación la que tiene que calcular el rectángulo de destino correcto.

Los formatos de substream preferidos son AYUV y AI44. Este último es un formato paletizado con 16 colores. Las entradas de paleta se especifican en el miembro Pal de la estructura DXVA2_VideoSample. (Si el formato de vídeo de origen se expresa originalmente como un tipo de medio de Media Foundation, las entradas de paleta se almacenan en el atributo MF_MT_PALETTE). Con formatos no paletizados, ponga esta matriz a cero.

Composición de imágenes

Cada operación de blit se define mediante los tres rectángulos siguientes:

  • El rectángulo objetivo (TargetRect) define la región dentro de la superficie de destino donde aparecerá la salida. La imagen de salida se recorta en este rectángulo.
  • El rectángulo de destino de cada secuencia (DstRect) define dónde aparece la secuencia de entrada en la imagen compuesta.
  • El rectángulo de origen de cada secuencia (SrcRect) define qué parte de la imagen de origen aparece.

Los rectángulos objetivo y de destino se especifican en relación con la superficie de destino. El rectángulo de origen se especifica en relación con la imagen de origen. Todos los rectángulos se especifican en píxeles.

diagram showing source, destination, and target rectangles

El dispositivo de procesamiento de vídeo crea una mezcla alfa de las imágenes de entrada, utilizando cualquiera de los siguientes orígenes de datos alfa:

  • Datos alfa por píxel de substreams.
  • Valor alfa planar para cada secuencia de vídeo, especificado en el miembro PlanarAlpha de la estructura DXVA2_VideoSample.
  • Valor alfa planar de la imagen compuesta, especificada en el miembro Alpha de la estructura DXVA2_VideoProcessBltParams. Este valor se usa para combinar toda la imagen compuesta con el color de fondo.

En esta sección se proporciona una serie de ejemplos que muestran cómo el dispositivo de procesamiento de vídeo crea la imagen de salida.

Ejemplo 1: ”Letterboxing”

En este ejemplo se muestra cómo aplicar ”letterboxing” a la imagen de origen estableciendo que el rectángulo de destino sea menor que el rectángulo objetivo. La secuencia de vídeo principal de este ejemplo es una imagen de 720 × 480 y está pensada para mostrarse con una relación de aspecto 16:9. La superficie de destino es de 640 × 480 píxeles (relación de aspecto de 4:3). Para lograr la relación de aspecto correcta, el rectángulo de destino debe ser de 640 × 360. Por motivos de simplicidad, este ejemplo no incluye una substream. En el diagrama siguiente se muestran los rectángulos de origen y destino.

diagram showing letterboxing.

En el diagrama anterior se muestran los rectángulos siguientes:

  • Rectángulo objetivo: { 0, 0, 640, 480 }

  • Vídeo principal:

    • Rectángulo de origen: { 0, 0, 720, 480 }
    • Rectángulo de destino: { 0, 60, 640, 420 }

El controlador desentrelazará el vídeo, reducirá el fotograma desentrelazado a 640 × 360 y transferirá bloques de bits del fotograma al rectángulo de destino. El rectángulo objetivo es mayor que el rectángulo de destino, por lo que el controlador usará el color de fondo para rellenar las barras horizontales encima y debajo del fotograma. El color de fondo se especifica en la estructura DXVA2_VideoProcessBltParams.

Ejemplo 2: Estirar imágenes de substream

Las imágenes de substream pueden extenderse más allá de la imagen de vídeo principal. En el vídeo de DVD, por ejemplo, la secuencia de vídeo principal puede tener una relación de aspecto de 4:3 mientras que la substream es de 16:9. En este ejemplo, ambas secuencias de vídeo tienen las mismas dimensiones de origen (720 × 480), pero la substream está pensada para mostrarse en una relación de aspecto de 16:9. Para lograr esta relación de aspecto, la imagen de substream se estira horizontalmente. Los rectángulos de origen y destino se muestran en el diagrama siguiente.

diagram showing substream image stretching.

En el diagrama anterior se muestran los rectángulos siguientes:

  • Rectángulo objetivo: { 0, 0, 854, 480 }

  • Vídeo principal:

    • Rectángulo de origen: { 0, 0, 720, 480 }
    • Rectángulo de destino: { 0, 107, 474, 480 }
  • Substream:

    • Rectángulo de origen: { 0, 0, 720, 480 }
    • Rectángulo de destino: { 0, 0, 854, 480 }

Estos valores conservan el alto de la imagen y escalan ambas imágenes horizontalmente. En las regiones donde aparecen ambas imágenes, se crea una mezcla alfa. Cuando la imagen de substream se extiende más allá del vídeo principal, la substream se crea una mezcla alfa con el color de fondo. Esta mezcla alfa tiene en cuenta los colores modificados en el lado derecho del diagrama.

Ejemplo 3: Alturas de secuencia no coincidentes

En el ejemplo anterior, la substream y la secuencia principal tienen la misma altura. Las secuencias también pueden tener alturas no coincidentes, como se muestra en este ejemplo. Las áreas dentro del rectángulo de destino donde no aparece ningún vídeo se dibujan con el color de fondo: negro en este ejemplo. Los rectángulos de origen y destino se muestran en el diagrama siguiente.

diagram showing mismatched stream heights,

En el diagrama anterior se muestran los rectángulos siguientes:

  • Rectángulo objetivo: { 0, 0, 150, 85 }
  • Vídeo principal:
    • Rectángulo de origen: { 0, 0, 150, 50 }
    • Rectángulo de destino: { 0, 17, 150, 67 }
  • Substream:
    • Rectángulo de origen: { 0, 0, 100, 85 }
    • Rectángulo de destino: { 25, 0, 125, 85 }

Ejemplo 4: Rectángulo objetivo menor que la superficie de destino

En este ejemplo se muestra un caso en el que el rectángulo objetivo es menor que la superficie de destino.

diagram showing a blit to a destination rectangle.

En el diagrama anterior se muestran los rectángulos siguientes:

  • Superficie de destino: { 0, 0, 300, 200 }
  • Rectángulo objetivo: { 0, 0, 150, 85 }
  • Vídeo principal:
    • Rectángulo de origen: { 0, 0, 150, 50 }
    • Rectángulo de destino: { 0, 17, 150, 67 }
  • Substream:
    • Rectángulo de origen: { 0, 0, 100, 85 }
    • Rectángulo de destino: { 25, 0, 125, 85 }

Los píxeles fuera del rectángulo objetivo no se modifican, por lo que el color de fondo solo aparece dentro del rectángulo objetivo. El área de puntos indica partes de la superficie de destino que no se ven afectadas por el blit.

Ejemplo 5: Rectángulos de origen

Si especifica un rectángulo de origen más pequeño que la imagen de origen, el controlador transferirá bloques de bits justo de esa parte de la imagen. En este ejemplo, los rectángulos de origen especifican el cuadrante inferior derecho de la secuencia de vídeo principal y el cuadrante inferior izquierdo de la substream (indicado por marcas de hash en el diagrama). Los rectángulos de destino son del mismo tamaño que los rectángulos de origen, por lo que el vídeo no se estira. Los rectángulos de origen y destino se muestran en el diagrama siguiente.

diagram showing a blit from two source rectangles.

En el diagrama anterior se muestran los rectángulos siguientes:

  • Rectángulo objetivo { 0, 0, 720, 576 }
  • Vídeo principal:
    • Tamaño de la superficie de origen: { 0, 0, 720, 480 }
    • Rectángulo de origen: { 360, 240, 720, 480 }
    • Rectángulo de destino: { 0, 0, 360, 240 }
  • Substream:
    • Tamaño de la superficie de origen: { 0, 0, 640, 576 }
    • Rectángulo de origen: { 0, 288, 320, 576 }
    • Rectángulo de destino: { 400, 0, 720, 288 }

Ejemplo 6: Intersección de rectángulos de destino

Este ejemplo es similar al anterior, pero los rectángulos de destino se intersecan. Las dimensiones de superficie son las mismas que en el ejemplo anterior, pero los rectángulos de origen y destino no. De nuevo, el vídeo se recorta pero no se estira. Los rectángulos de origen y destino se muestran en el diagrama siguiente.

diagram showing intersecting destination rectangles.

En el diagrama anterior se muestran los rectángulos siguientes:

  • Rectángulo objetivo { 0, 0, 720, 576 }
  • Vídeo principal:
    • Tamaño de la superficie de origen: { 0, 0, 720, 480 }
    • Rectángulo de origen: { 260, 92, 720, 480 }
    • Rectángulo de destino: { 0, 0, 460, 388 }
  • Substream:
    • Tamaño de la superficie de origen: { 0, 0, 640, 576 }
    • Rectángulo de origen: { 0, 0, 460, 388 }
    • Rectángulo de destino: { 260, 188, 720, 576 }

Ejemplo 7: Estirar y recortar vídeo

En este ejemplo, el vídeo se amplía y se recorta. Se estira una región de 180 × 120 de cada secuencia para cubrir un área de 360 × 240 en el rectángulo de destino.

diagram showing stretching and cropping.

En el diagrama anterior se muestran los rectángulos siguientes:

  • Rectángulo objetivo: { 0, 0, 720, 480 }
  • Vídeo principal:
    • Tamaño de la superficie de origen: { 0, 0, 360, 240 }
    • Rectángulo de origen: { 180, 120, 360, 240 }
    • Rectángulo de destino: { 0, 0, 360, 240 }
  • Substream:
    • Tamaño de la superficie de origen: { 0, 0, 360, 240 }
    • Rectángulo de origen: { 0, 0, 180, 120 }
    • Rectángulo de destino: { 360, 240, 720, 480 }

Orden de muestras de entrada

El parámetro pSamples del método VideoProcessBlt es un puntero a una matriz de muestras de entrada. Las muestras de la secuencia de vídeo principal aparecen primero, seguidas de imágenes de substream en orden Z. Las muestras deben colocarse en la matriz en el orden siguiente:

  • Las muestras de la secuencia de vídeo principal aparecen primero en la matriz, en orden temporal. Según el modo de desentrelazado, el controlador puede requerir una o varias muestras de referencia de la secuencia de vídeo principal. Los miembros NumForwardRefSamples y NumBackwardRefSamples de la estructura DXVA2_VideoProcessorCaps especifican cuántos ejemplos de referencia hacia delante y hacia atrás se necesitan. El autor de la llamada debe proporcionar estas muestras de referencia incluso si el contenido de vídeo es progresivo y no requiere desentrelazado. (Esto puede ocurrir cuando se proporcionan fotogramas progresivos a un dispositivo de desentrelazado, por ejemplo, cuando el origen contiene una mezcla de fotogramas entrelazados y progresivos).
  • Después de las muestras de la secuencia de vídeo principal, la matriz puede contener hasta 15 muestras de substream, organizadas en orden Z, de abajo a arriba. Las substreams siempre son progresivas y no requieren imágenes de referencia.

En cualquier momento, la secuencia de vídeo principal puede cambiar entre contenido entrelazado y progresivo, y el número de substreams puede cambiar.

El miembro SampleFormat.SampleFormat de la estructura DXVA2_VideoSample indica el tipo de imagen. Para las imágenes de substream, establezca este valor en DXVA2_SampleSubStream. Para las imágenes progresivas, el valor es DXVA2_SampleProgressiveFrame. Para las imágenes entrelazadas, el valor depende del diseño del campo.

Si el controlador requiere muestras de referencia hacia delante y hacia atrás, es posible que el número completo de muestras no esté disponible al principio de la secuencia de vídeo. En ese caso, incluya entradas de estas en la matriz pSamples, pero marque las muestras que faltan como que tienen el tipo DXVA2_SampleUnknown.

Los miembros Start y End de la estructura DXVA2_VideoSample proporcionan la ubicación temporal de cada muestra. Estos valores solo se usan con muestras de la secuencia de vídeo principal. En el caso de las imágenes de substream, establezca ambos miembros en cero.

Los ejemplos siguientes pueden ayudar a aclarar estos requisitos.

Ejemplo 1

El caso más sencillo se produce cuando no hay substreams y el algoritmo de desentrelazado no requiere muestras de referencia (NumForwardRefSamples y NumBackwardRefSamples son cero). El desentrelazado bob es un ejemplo de este tipo de algoritmo. En este caso, la matriz pSamples debe contener una sola superficie de entrada, como se muestra en la tabla siguiente.

Índice Tipo de superficie Ubicación temporal
pSamples[0] Imagen entrelazada. T

 

Se supone que el valor de tiempo T es la hora de inicio del fotograma de vídeo actual.

Ejemplo 2

En este ejemplo, la aplicación mezcla dos substreams con la secuencia principal. El algoritmo de desentrelazado no requiere ejemplos de referencia. En la tabla siguiente se muestra cómo se organizan estas muestras en la matriz pSamples.

Índice Tipo de superficie Ubicación temporal Orden Z
pSamples[0] Imagen entrelazada T 0
pSamples[1] Substream 0 1
pSamples[2] Substream 0 2

 

Ejemplo 3

Ahora, supongamos que el algoritmo de desentrelazado requiere una muestra de referencia hacia atrás y una muestra de referencia hacia delante. Además, se proporcionan dos imágenes de substream, para un total de cinco superficies. El orden correcto se muestra en la tabla siguiente.

Índice Tipo de superficie Ubicación temporal Orden Z
pSamples[0] Imagen entrelazada (referencia) T -1 No aplicable
pSamples[1] Imagen entrelazada T 0
pSamples[2] Imagen entrelazada (referencia) T +1 No aplicable
pSamples[3] Substream 0 1
pSamples[4] Substream 0 2

 

El tiempo T -1 es la hora de inicio del fotograma antes del fotograma actual y T +1 es la hora de inicio del siguiente fotograma.

Si la secuencia de vídeo cambia al contenido progresivo, con el mismo modo de desentrelazado, la aplicación debe proporcionar el mismo número de muestras, como se indica en la tabla siguiente.

Índice Tipo de superficie Ubicación temporal Orden Z
pSamples[0] Imagen progresiva (referencia) T -1 No aplicable
pSamples[1] Imagen progresiva T 0
pSamples[2] Imagen progresiva (referencia) T +1 No aplicable
pSamples[3] Substream 0 1
pSamples[4] Substream 0 2

 

Ejemplo 4

Al principio de una secuencia de vídeo, es posible que las muestras de referencia hacia delante y hacia atrás no estén disponibles. Cuando esto sucede, las entradas de las muestras que faltan se incluyen en la matriz pSamples, con el tipo de muestra DXVA2_SampleUnknown.

Suponiendo que el modo de desentrelazado necesita una muestra de referencia hacia delante y otra hacia atrás, las tres primeras llamadas a VideoProcessBlt tendrían las secuencias de entradas que se muestran en las tres tablas siguientes.

Índice Tipo de superficie Ubicación temporal
pSamples[0] Unknown 0
pSamples[1] Unknown 0
pSamples[2] Imagen entrelazada (referencia) T +1

 

Índice Tipo de superficie Ubicación temporal
pSamples[0] Unknown 0
pSamples[1] Imagen entrelazada T
pSamples[2] Imagen entrelazada (referencia) T +1

 

Índice Tipo de superficie Ubicación temporal
pSamples[0] Imagen entrelazada T -1
pSamples[1] Imagen entrelazada T
pSamples[2] Imagen entrelazada (referencia) T +1

 

DirectX Video Acceleration 2.0

Muestra de DXVA2_VideoProc