Compartir a través de


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 desinterlacing y mezcla de vídeo.

Este tema contiene las secciones siguientes:

Información general

El hardware gráfico puede usar la unidad de procesamiento de gráficos (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:

  • Desinterlacación e inverso telecine
  • Mezcla de substreams de vídeo en la imagen de vídeo principal
  • Ajuste de color (ProcAmp) y filtrado de imágenes
  • Escalado de imágenes
  • Conversión de espacio de color
  • 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.

diagrama que muestra las fases del procesamiento de vídeo dxva.

La entrada de 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 subpicturas de DVD. Estas imágenes se muestran a través de la secuencia de vídeo principal y, por lo general, no están diseñadas 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 vídeo combina alfa las imágenes de substream con el fotograma desinterlacado actual de la secuencia de vídeo principal.

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

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 GUID. Los GUID siguientes están predefinidos:

  • DXVA2_VideoProcBobDevice. Este dispositivo realiza la desinterlacación de 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 e entrelazados. El dispositivo progresivo no se puede usar para este tipo de contenido de vídeo "mixto", ya que se requiere un paso de desinterlazado 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 GUID específicos del controlador. Por ejemplo, un controlador podría implementar un algoritmo de desinterlacing propietario que genera una salida de mejor calidad que la desinterlacación de bob. Algunos algoritmos de desinterlazado 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. Este es 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 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.

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

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

Obtener el 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 IDirectXVideoProcessorService llamando 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));

n algunos casos, un objeto crea el dispositivo Direct3D y, a continuación, lo comparte con otros objetos a través del Administrador de dispositivos Direct3D. En esta situación, puedes 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;
}

Enumerar los dispositivos de procesamiento de vídeo

Para obtener una lista de dispositivos de procesamiento de vídeo, rellene una estructura de 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, una 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 de 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. Los pasos restantes se pueden realizar mediante cualquiera de los GUID de dispositivo devueltos por este método.

Enumerar formatos de Render-Target

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 de 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 de 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
        );

Video Process Blit

La operación principal de procesamiento de vídeo es el procesamiento de vídeo blit. (Un blit es cualquier operación que combina dos o más mapas de bits en un solo mapa de bits. Un procesamiento de vídeo blit combina imágenes de entrada para crear un marco de salida). Para realizar un procesamiento de vídeo blit, llame a IDirectXVideoProcessor::VideoProcessBlt. Este método pasa un conjunto de ejemplos 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 desinterlazado, conversión de espacio de color y mezcla de substream. 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 de DXVA2_VideoProcessBltParams que especifica los parámetros de la blit.
  • pSamples es la dirección de una matriz de estructuras de DXVA2_VideoSample . Estas estructuras contienen las muestras de entrada para el 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 los siguientes ejemplos de entrada:

  • Imagen actual de la secuencia de vídeo principal.
  • Imágenes de referencia hacia delante y hacia atrás, si es necesario por el algoritmo de desinterlazado.
  • 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 ejemplo de entrada.

Parámetros Blit

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

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

    Para el contenido entrelazado, un marco con dos campos intercalados genera dos fotogramas de salida desinterlacados. En el primer fotograma de salida, la hora de presentación debe ser igual a la hora de inicio de la imagen actual en la secuencia de vídeo principal, al igual 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. La función 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 de destino define el rectángulo delimitador para todas las secuencias de vídeo de entrada. La colocación de secuencias individuales dentro de ese rectángulo se controla a través del parámetro pSamples de IDirectXVideoProcessor::VideoProcessBlt.

  • BackgroundColor proporciona el color del fondo donde no aparezca 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 (cuadro de letras), las regiones con bandejas de letras se muestran con el color de fondo. El color de fondo solo se aplica dentro del rectángulo de destino (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 ITU-R color BT.709 o BT.601. Esta información puede afectar a cómo se muestra la imagen. Para obtener más información, vea información de color extendida.

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

Ejemplos de entrada

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

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

El orden exacto en el que deben aparecer los ejemplos en la matriz se describe más adelante, en la sección Orden de ejemplo 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 la entrelazamiento del vídeo de entrada. Para obtener más información, consulte 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 del ejemplo de entrada. En el caso de las imágenes de substream, establezca estos valores en cero, ya que el tiempo 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 marco de salida compuesto. Para recortar la imagen, establézcala en un valor menor que el tamaño del marco. De lo contrario, establézcalo igual al tamaño del marco.
  • 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 blits píxeles del rectángulo de origen en el 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 flujo 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 marco 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 hasta la aplicación para 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 ). Para formatos no paletizados, borre esta matriz en cero.

Composición de imágenes

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

  • El rectángulo de destino (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 flujo (DstRect) define dónde aparece el flujo 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 de destino y 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.

diagrama que muestra rectángulos de origen, destino y destino

El dispositivo de procesamiento de vídeo alfa combina las imágenes de entrada mediante 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 escribir la imagen de origen estableciendo que el rectángulo de destino sea menor que el rectángulo de destino. La secuencia de vídeo principal de este ejemplo es una imagen de 720 × 480 y está pensada para mostrarse en 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 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.

diagrama que muestra la bandeja de letras.

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

  • Rectángulo de destino: { 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 desinterlazará el vídeo, reducirá el fotograma desinterlazado a 640 × 360 y blitá el fotograma en el rectángulo de destino. El rectángulo de destino 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 marco. 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 4:3 mientras que la substream es 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 extiende horizontalmente. Los rectángulos de origen y destino se muestran en el diagrama siguiente.

diagrama que muestra el ajuste de la imagen de substream.

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

  • Rectángulo de destino: { 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 mezclan alfa. Donde la imagen de substream se extiende más allá del vídeo principal, la substream se combina con el color de fondo. Esta combinación alfa tiene en cuenta los colores modificados en el lado derecho del diagrama.

Ejemplo 3: Alturas de flujo no coincidentes

En el ejemplo anterior, la substream y la secuencia principal tienen el mismo alto. Las secuencias también pueden tener alturas no coincidentes, como se muestra en este ejemplo. Á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.

diagrama en el que se muestran los altos de flujo no coincidentes,

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

  • Rectángulo de destino: { 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 de destino menor que la superficie de destino

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

diagrama que muestra una blit en un rectángulo de destino.

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

  • Superficie de destino: { 0, 0, 300, 200 }
  • Rectángulo de destino: { 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 de destino no se modifican, por lo que el color de fondo solo aparece dentro del rectángulo de destino. El área de puntos indica partes de la superficie de destino que no se ven afectadas por la ranura.

Ejemplo 5: Rectángulos de origen

Si especifica un rectángulo de origen que sea menor que la imagen de origen, el controlador se transferirá solo a 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 hash en el diagrama). Los rectángulos de destino son los mismos tamaños que los rectángulos de origen, por lo que el vídeo no se extiende. Los rectángulos de origen y destino se muestran en el diagrama siguiente.

diagrama que muestra una blit de dos rectángulos de origen.

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

  • Rectángulo de destino: { 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 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.

diagrama que muestra rectángulos de destino intersecntes.

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

  • Rectángulo de destino: { 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 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 extiende una región de 180 × 120 de cada flujo para cubrir un área de 360 × 240 en el rectángulo de destino.

diagrama que muestra el ajuste y el recorte.

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

  • Rectángulo de destino: { 0, 0, 720, 480 }
  • Vídeo principal:
    • Tamaño de 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 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 ejemplo de entrada

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

  • Los ejemplos de la secuencia de vídeo principal aparecen primero en la matriz, en orden temporal. Según el modo de desinterlace, el controlador puede requerir uno o varios ejemplos 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 estos ejemplos de referencia incluso si el contenido del vídeo es progresivo y no requiere desinterlazado. (Esto puede ocurrir cuando se proporcionan fotogramas progresivos a un dispositivo de desinterlazado, por ejemplo, cuando el origen contiene una combinación de fotogramas entrelazados y progresivos).
  • Después de los ejemplos de la secuencia de vídeo principal, la matriz puede contener hasta 15 ejemplos de substream, organizados 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 ejemplos 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 para ellas en la matriz pSamples , pero marque las muestras que faltan como tener 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 para ejemplos 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 desinterlacing no requiere muestras de referencia (NumForwardRefSamples y NumBackwardRefSamples son cero). Bob deinterlacing 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 hora T es la hora de inicio del fotograma de vídeo actual.

Ejemplo 2

En este ejemplo, la aplicación combina dos substreams con la secuencia principal. El algoritmo de desinterlazado no requiere ejemplos de referencia. En la tabla siguiente se muestra cómo se organizan estos ejemplos 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 desinterlace requiere un ejemplo de referencia hacia atrás y un ejemplo de referencia hacia delante. Además, se proporcionan dos imágenes de substream, para un total de cinco superficies. La ordenación correcta 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

 

La hora T -1 es la hora de inicio del fotograma antes del marco 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 desinterlace, la aplicación debe proporcionar el mismo número de muestras, como se muestra 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 los ejemplos de referencia hacia delante y hacia atrás no estén disponibles. Cuando esto sucede, las entradas de los ejemplos que faltan se incluyen en la matriz pSamples , con el tipo de ejemplo DXVA2_SampleUnknown.

Suponiendo que el modo de desinterlace necesita un ejemplo de referencia hacia delante y otro 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] Desconocido 0
pSamples[1] Desconocido 0
pSamples[2] Imagen entrelazada (referencia) T +1

 

Índice Tipo de superficie Ubicación temporal
pSamples[0] Desconocido 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

 

aceleración de vídeo directX 2.0

ejemplo de DXVA2_VideoProc