Especificación operativa de IAMVideoAccelerator de aceleración de vídeo directX

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

El mecanismo preciso de operación es el siguiente:

  1. Cada perfil de modo restringido definido en este documento tiene un GUID de DirectX VA asociado que puede ser compatible con un pin de entrada de bajada IPin::QueryAccept e IPin::ReceiveConnection y enumerado en IAMVideoAccelerator::GetVideoAcceleratorGUIDs.

  2. De forma similar, cada tipo de protocolo de cifrado para su uso con DirectX VA tendrá un GUID de tipo de protocolo de cifrado asociado que puede ser compatible con IPin::QueryAccept e IPin::ReceiveConnection y enumerado en IAMVideoAccelerator::GetVideoAcceleratorGUIDs. El GUID "sin cifrado" DXVA_NoEncrypt no se enviará en esta lista, ya que es necesario admitirlo y, por lo tanto, implícito.

  3. Después de llamar a IPin::ReceiveConnection para intentar una conexión con el pin de entrada de bajada, el IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData devolverá un puntero a una estructura de datos DXVA_ConnectMode que contenga la información del modo de conexión para la conexión. Se llamará a IAMVideoAccelerator::GetCompBufferInfo con *pdwNumTypesCompBuffers = 16 y devolverá información de búfer comprimido en función de la convención de que el número de tipo de cada búfer (tal como se define en la sección 3.4 de la especificación de DirectX VA) se puede usar directamente como índice de base cero en la matriz de estructuras de datos AMVACompBufferInfo que se devuelven. Esto requiere que para cualquier tipo de búfer que no se use (incluido el tipo de búfer 0, ya que no hay ningún uso definido de ese tipo de búfer), el controlador del acelerador proporcionará estructuras de datos AMVACompBufferInfo con alguna forma de valores de parámetro "ficticios" (como dwNumCompBuffers=0, dwWidthToCreate=0, dwHeightToCreate=0 y dwBytesToAllocate=0).

  4. Las indicaciones de función DXVA y los búferes de datos asociados se envían mediante IAMVideoAccelerator::Execute. La función DXVA se indica en el parámetro dwFunction de la llamada. Las únicas funciones DXVA que son relevantes para la inicialización son DXVA_ConfigQueryOrReplyFunc y DXVA_EncryptProtocolFunc.

    • Si dwFunction contiene un DXVA_ConfigQueryOrReplyFunc, el puntero lpPrivateInputData para pasar datos al acelerador en esta llamada apuntará a una estructura de datos de configuración, el puntero lpPrivateOutputData para recibir información del acelerador señalará a un área donde se puede colocar una estructura de datos de configuración alternativa o duplicada, el puntero pamvaBufferInfo para una matriz de AMVABUFFERINFO será NULL, y dwNumBuffers serán cero. El HRESULT devuelto contiene la indicación de S_OK o S_FALSE, o E_FAIL o E_INVALIDARG o alguna otra indicación de error HRESULT en caso de un problema grave en la ejecución del protocolo (por ejemplo, un parámetro de configuración no válido). Todas las llamadas a IAMVideoAccelerator::Execute para todos los usos de DXVA_ConfigQueryOrReplyFunc precederán a todas las demás llamadas a IAMVideoAccelerator::Execute.

    • Si dwFunction contiene un DXVA_EncryptProtocolFunc, el puntero lpPrivateInputData para pasar datos al acelerador en esta llamada apuntará a una estructura de datos de protocolo de cifrado que comience por DXVA_EncryptProtocolHeader, el puntero lpPrivateOutputData para recibir información del acelerador señalará un área donde se pueden colocar los datos que se van a devolver (por ejemplo, un certificado) mediante el protocolo de cifrado (que comenzará con DXVA_EncryptProtocolHeader), El puntero pamvaBufferInfo para una matriz de AMVABUFFERINFO será NULL y dwNumBuffers será cero. El HRESULT devuelto contiene S_OK siempre que el protocolo de cifrado funcione normalmente y contenga E_FAIL o E_INVALIDARG o algún otro error que indique HRESULT en caso de un problema grave en la ejecución del protocolo.

      Después de la inicialización de la operación anterior, la operación real del descodificador continúa de la siguiente manera:

  5. Se llamará a IAMVideoAccelerator::BeginFrame antes de enviar cualquier bDXVA_Func con parámetros de búfer comprimidos que provoquen escrituras en una superficie de destino sin comprimir. El propósito de IAMVideoAccelerator::BeginFrame en DirectX VA es asociar superficies de destino con valores de índice y notificar al controlador del acelerador de vídeo de la intención para iniciar escrituras de una superficie para que el controlador pueda responder con una indicación de si la superficie está lista para sobrescribirse. La estructura AMVABeginFrameInfo pasada en IAMVideoAccelerator::BeginFrame contendrá un puntero pInputData a un único parámetro WORD wBeginPictureIndex que coincida con el índice de fotograma pasado a IAMVideoAccelerator::BeginFrame (y dwSizeInputData será 2). Este es el índice que se va a usar en un búfer comprimido para comandos de escritura en la superficie (por ejemplo, para usarse como wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex). Cada llamada a IAMVideoAccelerator::BeginFrame se emparejará con una llamada correspondiente a IAMVideoAccelerator::EndFrame como se describe a continuación. Por ejemplo, si una imagen comprimida se va a descodificar y, a continuación, se combina alfa mediante la combinación de búfer de front-end con una imagen gráfica, habría una llamada a IAMVideoAccelerator::BeginFrame antes de descodificar la imagen comprimida en una superficie especificada en wDecodedPictureIndex, entonces una llamada a IAMVideoAccelerator::EndFrame después de pasar todos los búferes comprimidos usados para descodificar la imagen, a continuación, una segunda llamada a IAMVideoAccelerator::BeginFrame antes de la combinación alfa de combinación del origen gráfico con la imagen descodificada en una superficie especificada en wBlendedDestinationIndex y, a continuación, una segunda llamada a IAMVideoAccelerator::EndFrame después de la operación de combinación de mezcla alfa. El puntero pOutputData en AMVABeginFrameInfo será NULL (y dwSizeOutputData será "0"). El VALOR HRESULT devuelto por IAMVideoAccelerator::BeginFrame será:

    • S_OK si la superficie sin comprimir está disponible y lista para su uso.
    • E_PENDING si la superficie sin comprimir aún no está disponible para su uso, pero estará disponible pronto (si la superficie sin comprimir se está leyendo para mostrar y la lectura y visualización de la superficie aún no se ha completado).
    • E_FAIL o E_INVALIDARG alguna otra indicación de error solo si se detecta un error de protocolo o formato de datos (por ejemplo, un valor incorrecto de dwSizeInputData o un pOutputData no NULL ).
  6. Las indicaciones de función DXVA y los búferes de datos asociados se envían mediante IAMVideoAccelerator::Execute. Se puede indicar más de un valor de bDXVA_Func en la misma llamada a IAMVideoAccelerator::Execute. Los valores de bDXVA_Func se empaquetarán en el parámetro dwFunction de la llamada, con el primer comando de función en los ocho MSB, el siguiente comando en los ocho bits siguientes, etc., con los bits restantes rellenados con ceros. El valor 0xFF para bDXVA_Func indica que el bDXVA_Func se extiende a dos o cuatro bytes. Si el segundo byte también está 0xFF, esto indica que bDXVA_Func se extiende a cuatro bytes. Si los cuatro bits superiores del tercer byte son 0xF o 0x0, esto indica que bDXVA_Func contiene un DXVA_ConfigQueryOrReplyFunc o DXVA_EncryptProtocolFunc. Los comandos de varios bytes no indicarán la continuación después del final de dwFunction. El descodificador debe tener cuidado para asegurarse de que no haya dependencias secuenciales entre distintos valores de bDXVA_Func especificados en la misma llamada a IAMVideoAccelerator::Execute y de que todas las posibles condiciones de carrera (como entre la descodificación de imágenes y la combinación de subpestañación de imágenes, entre la carga de sub-imagen y la combinación de imágenes secundarias, etc.) se impiden mediante las llamadas adecuadas a IAMVideoAccelerator:: BeginFrame e IAMVideoAccelerator::QueryRenderStatus antes de las llamadas posteriores a IAMVideoAccelerator::Execute.

    • Si dwFunction contiene un DXVA_ConfigQueryOrReplyFunc, el puntero lpPrivateInputData para pasar datos al acelerador en esta llamada apuntará a una estructura de datos de configuración, el puntero lpPrivateOutputData para recibir información del acelerador señalará a un área donde se puede colocar una estructura de datos de configuración alternativa o duplicada, el puntero pamvaBufferInfo para una matriz de AMVABUFFERINFO será NULL, y dwNumBuffers serán cero. El HRESULT devuelto contiene el S_OK o S_FALSE indicación en respuesta a la consulta, o E_FAIL o E_INVALIDARG alguna otra indicación de error HRESULT en caso de un problema grave en la ejecución del protocolo (por ejemplo, un parámetro invalid.configuration). Todas las llamadas a IAMVideoAccelerator::Execute para todos los usos de DXVA_ConfigQueryOrReplyFunc precederán a todas las demás llamadas a IAMVideoAccelerator::Execute.

    • Si dwFunction contiene un DXVA_EncryptProtocolFunc, el puntero lpPrivateInputData para pasar datos al acelerador en esta llamada apuntará a una estructura de datos de protocolo de cifrado que comience por DXVA_EncryptProtocolHeader, el puntero lpPrivateOutputData para recibir información del acelerador señalará un área donde se pueden colocar los datos que se van a devolver (por ejemplo, un certificado) mediante el protocolo de cifrado (que comenzará con DXVA_EncryptProtocolHeader), El puntero pamvaBufferInfo para una matriz de AMVABUFFERINFO será NULL y dwNumBuffers será cero. El HRESULT devuelto contiene S_OK siempre que el protocolo de cifrado funcione normalmente y contenga E_FAIL o E_INVALIDARG o algún otro error que indique HRESULT en caso de un problema grave en la ejecución del protocolo.

    • Si dwFunction no contiene un DXVA_ConfigQueryOrReplyFunc o DXVA_EncryptProtocolFunc, el puntero lpPrivateInputData para pasar datos al acelerador apuntará a una lista de descripción del búfer. Las cuatro primeras entradas de la estructura de lista de descripción del búfer para cada búfer (dwTypeIndex, dwBufferIndex, dwDataOffset y dwDataSize) serán iguales a las de la estructura de datos AMVABUFFERINFO para el mismo búfer. Si bDXVA_Func es igual a "1" se especifica dentro de dwFunction y bPicReadbackRequests es "1", el puntero lpPrivateOutputData para recibir información del acelerador señalará a un área de memoria persistente (por ejemplo, montón) que se va a rellenar. in with read-back macroblock data from the accelerator (such data not guaranteed to be present until IAMVideoAccelerator::QueryRenderStatus for writing to the same picture parameters buffer indica S_OK tal como se describe en el elemento 10 siguiente). De lo contrario, el puntero lpPrivateOutputData para recibir información del acelerador apuntará a un único DWORD que se establecerá en uno de los siguientes valores de indicación (especialmente útil para notificar errores de secuencia de bits en la operación VLD fuera del host).

      Valor Descripción
      0 Ejecución correcta.
      1 Se encontró un problema menor en el formato de datos.
      2 Se encontró un problema significativo en el formato de datos.
      3 Se encontró un problema grave en formato de datos.
      4 Se encontró otro problema grave.

       

      Si se indica cualquier tipo de problema "grave", el descodificador de software debe dejar de operar las funciones a menos que se pueda tomar medidas correctivas. El host no leerá estos datos devueltos por el acelerador hasta después de que se haya completado la representación del búfer de la imagen, como puede probar IAMVideoAccelerator::QueryRenderStatus. El HRESULT devuelto contiene S_OK siempre que la operación de interfaz funcione normalmente y puede devolver E_FAIL o E_INVALIDARG o alguna otra indicación de error HRESULT en caso de un problema grave.

  7. El búfer de parámetros de descodificación de imágenes estará entre los primeros búferes enviados para la descodificación de cada imagen al usar IAMVideoAccelerator::Execute con bDXVA_Func igual a "1", y todos los búferes para descodificar una imagen en una secuencia de bits se enviarán antes de que se envíen búferes para descodificar imágenes posteriores. Si se envía un búfer de comandos de control de macroblock, se enviará un búfer de datos de diferencia residual correspondiente (que contenga datos para los mismos macroblocks) con la misma llamada IAMVideoAccelerator::Execute .

  8. Se llamará a IAMVideoAccelerator::EndFrame una vez enviados todos los búferes comprimidos que provocarán la creación del contenido de salida en una superficie sin comprimir especificada (resultado de las operaciones especificadas para wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex). El propósito de esta llamada a IAMVideoAccelerator::EndFrame es notificar al hardware del acelerador de vídeo que se han enviado todos los datos necesarios para la operación especificada. El puntero a los datos que se van a enviar de bajada a través de IAMVideoAccelerator::EndFrame apuntará a un único word wEndPictureIndex que contiene el índice del marco que termina. Este parámetro coincidirá con el valor wBeginPictureIndex especificado en la llamada anterior a IAMVideoAccelerator::BeginFrame antes del envío de los búferes comprimidos pertinentes. Posterior a una llamada a IAMVideoAccelerator::EndFrame, La superficie sin comprimir con el índice wEndPictureIndex no se encuentra en wDecodedPictureIndex de ninguna imagen, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex hasta después de otra llamada a IAMVideoAccelerator::BeginFrame se emite para anunciar que esto se producirá y se ha devuelto una S_OK como resultado. Sin embargo, ese índice de superficie de destino puede producirse en comandos de acceso de lectura posteriores, como wForwardRefPictureIndex, wBackwardRefPictureIndex, wPicResampleSourcePicIndex o bRefPicSelect[i]. El HRESULT devuelto por IAMVideoAccelerator::EndFrame será S_OK a menos que haya algún tipo de formato de datos o error de protocolo, en cuyo caso puede ser E_FAIL o E_INVALIDARG o alguna otra indicación de error.

  9. En el caso de la descodificación basada en campos (por ejemplo, en secuencias de bits MPEG-2), no habrá una asignación uno a uno de imágenes funcionales en la secuencia de bits a superficies sin comprimir en la interfaz del acelerador. Al descodificar imágenes de campo en una secuencia de bits MPEG-2, habrá dos "imágenes" descodificadas para generar una superficie de salida completa sin comprimir. En la definición de la interfaz DE VA de DirectX, cada fotograma corresponde a cada uso de wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex. Por lo tanto, se requieren dos pares de llamadas a IAMVideoAccelerator::BeginFrame e IAMVideoAccelerator::EndFrame para la descodificación de imágenes de campo en superficies sin comprimir de salida.

  10. Una llamada a IAMVideoAccelerator::QueryRenderStatus con dwFlags igual a cero que ocurre algún tiempo después de una llamada a IAMVideoAccelerator::EndFrame con un wEndPictureIndex determinado y comprueba el estado de un búfer que se envió que contenía wEndPictureIndex en wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex devolverá una indicación de S_OK si todas las operaciones para escribir los datos en la superficie sin comprimir se han completado. y devolverá E_PENDING si la operación aún no se ha completado. E_FAIL o E_INVALIDARG u otra indicación de error se puede devolver en caso de error de protocolo.

Asignación de aceleración de vídeo de DirectX a IAMVideoAccelerator