Condividi tramite


Specifica operativa dell'accelerazione video DirectX IAMVideoAccelerator

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Il meccanismo preciso dell'operazione è il seguente:

  1. Ogni profilo in modalità con restrizioni definito nel presente documento ha un GUID directX VA associato che può essere supportato da IPin::QueryAccept e IPin::ReceiveConnection e elencati in IAMVideoAccelerator::GetVideoAcceleratorGUID.

  2. Analogamente, ogni tipo di protocollo di crittografia da usare con DirectX VA deve avere un GUID del tipo di protocollo di crittografia associato che può essere supportato da IPin::QueryAccept e IPin::ReceiveConnection associati e elencati in IAMVideoAccelerator::GetVideoAcceleratorGUIDs. Il GUID "nessuna crittografia" DXVA_NoEncrypt non deve essere inviato in questo elenco, perché è necessario il supporto e pertanto implicito.

  3. Dopo aver chiamato IPin::ReceiveConnection per tentare una connessione al pin di input downstream, il decodificatore IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData restituirà un puntatore a una struttura di dati DXVA_ConnectMode contenente le informazioni sulla modalità di connessione per la connessione. IAMVideoAccelerator::GetCompBufferInfo deve essere chiamato con *pdwNumTypesCompBuffers = 16 e restituisce informazioni sul buffer compresso in base alla convenzione che il numero di tipo di ogni buffer (come definito nella sezione 3.4 della specifica DIRECTX VA) può essere usato direttamente come indice in base zero nella matrice di strutture di dati AMVACompBufferInfo restituite. Ciò richiede che per tutti i tipi di buffer che non verranno usati (incluso il tipo di buffer 0, poiché non è stato definito l'uso di tale tipo di buffer), il driver dell'acceleratore fornirà strutture di dati AMVACompBufferInfo con una forma di valori di parametro "dummy" (ad esempio dwNumCompBuffers=0, dwWidthToCreate=0, dwHeightToCreate=0 e dwBytesToAllocate=0).

  4. Le indicazioni della funzione DXVA e i buffer di dati associati vengono inviati tramite IAMVideoAccelerator::Execute. La funzione DXVA è indicata nel parametro dwFunction della chiamata. Le uniche funzioni DXVA rilevanti per l'inizializzazione sono DXVA_ConfigQueryOrReplyFunc e DXVA_EncryptProtocolFunc.

    • Se dwFunction contiene un DXVA_ConfigQueryOrReplyFunc, il puntatore lpPrivateInputData per il passaggio dei dati all'acceleratore in questa chiamata punterà a una struttura di dati di configurazione, il puntatore lpPrivateOutputData per la ricezione di informazioni dall'acceleratore punterà a un'area in cui è possibile posizionare una struttura di dati di configurazione alternativa o duplicata, il puntatore pamvaBufferInfo per una matrice di AMVABUFFERINFO sarà NULL, e dwNumBuffers devono essere zero. Il valore HRESULT restituito contiene l'indicazione S_OK o S_FALSE, E_FAIL o E_INVALIDARG o un'altra indicazione di errore HRESULT in caso di grave problema nell'esecuzione del protocollo , ad esempio un parametro di configurazione non valido. Tutte le chiamate a IAMVideoAccelerator::Execute per tutti gli usi di DXVA_ConfigQueryOrReplyFunc precedono tutte le altre chiamate a IAMVideoAccelerator::Execute.

    • Se dwFunction contiene un DXVA_EncryptProtocolFunc, il puntatore lpPrivateInputData per il passaggio dei dati all'acceleratore in questa chiamata punterà a una struttura di dati del protocollo di crittografia che inizia con DXVA_EncryptProtocolHeader, il puntatore lpPrivateOutputData per la ricezione di informazioni dall'acceleratore punterà a un'area in cui i dati da restituire (ad esempio un certificato) dal protocollo di crittografia (che inizierà con DXVA_EncryptProtocolHeader) possono essere posizionati, il puntatore pamvaBufferInfo per una matrice di AMVABUFFERINFO deve essere NULL e dwNumBuffers deve essere zero. Il valore HRESULT restituito contiene S_OK purché il protocollo di crittografia funzioni normalmente e contenga E_FAIL o E_INVALIDARG o un'altra indicazione di errore HRESULT in caso di grave problema nell'esecuzione del protocollo.

      Dopo l'inizializzazione dell'operazione in precedenza, l'operazione effettiva del decodificatore procede nel modo seguente:

  5. IAMVideoAccelerator::BeginFrame deve essere chiamato prima di inviare qualsiasi bDXVA_Func con parametri del buffer compressi che causano scritture in una superficie di destinazione non compressa. Lo scopo di IAMVideoAccelerator::BeginFrame in DirectX VA è associare le superfici di destinazione ai valori di indice e notificare al driver dell'acceleratore video la finalità di avviare scritture su una superficie in modo che il driver possa rispondere con un'indicazione se la superficie è pronta per essere sovrascritta. La struttura AMVABeginFrameInfo passata in IAMVideoAccelerator::BeginFrame conterrà un puntatore pInputData a un singolo parametro word wBeginPictureIndex corrispondente all'indice del frame passato in IAMVideoAccelerator::BeginFrame (e dwSizeInputData deve essere 2). Questo è l'indice da usare in un buffer compresso per comprimere una scrittura nella superficie(ad esempio, da usare come wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex). Ogni chiamata a IAMVideoAccelerator::BeginFrame deve essere associata a una chiamata corrispondente a IAMVideoAccelerator::EndFrame , come descritto di seguito. Ad esempio, se un'immagine compressa deve essere decodificata e quindi alfa si fonde usando la fusione da buffer front-end a buffer con un'immagine grafica, è presente una chiamata a IAMVideoAccelerator::BeginFrame prima di decodificare l'immagine compressa in una superficie specificata in wDecodedPictureIndex, quindi una chiamata a IAMVideoAccelerator::EndFrame dopo aver passato tutti i buffer compressi usati per decodificare l'immagine, quindi una seconda chiamata a IAMVideoAccelerator::BeginFrame prima del comando della combinazione di fusione alfa dell'origine grafica con l'immagine decodificata in una superficie specificata in wBlendedDestinationIndex e quindi una seconda chiamata a IAMVideoAccelerator::EndFrame dopo l'operazione di combinazione di fusione alfa. Il puntatore pOutputData in AMVABeginFrameInfo sarà NULL (e dwSizeOutputData sarà "0"). Il valore HRESULT restituito da IAMVideoAccelerator::BeginFrame deve essere:

    • S_OK se la superficie non compressa è disponibile e pronta per l'uso.
    • E_PENDING se la superficie non compressa non è ancora disponibile per l'uso, ma diventerà presto disponibile (se la superficie non compressa viene letta per la visualizzazione e la lettura/visualizzazione della superficie non è ancora stata completata).
    • E_FAIL o E_INVALIDARG un'altra indicazione di errore solo se viene rilevato un errore di formato dati o protocollo, ad esempio un valore non corretto di dwSizeInputData o un valore pOutputData non NULL .
  6. Le indicazioni della funzione DXVA e i buffer di dati associati vengono inviati tramite IAMVideoAccelerator::Execute. È possibile indicata più bDXVA_Func valore nella stessa chiamata a IAMVideoAccelerator::Execute. I valori bDXVA_Func devono essere compressi nel parametro dwFunction della chiamata, con il primo comando di funzione negli otto GB, il comando successivo negli otto bit successivi e così via, con tutti i bit rimanenti riempiti con zeri. Il valore 0xFF per bDXVA_Func indica che il bDXVA_Func viene esteso a due o quattro byte. Se anche il secondo byte viene 0xFF, questo indica che bDXVA_Func viene esteso a quattro byte. Se i quattro bit superiori del terzo byte sono 0xF o 0x0, questo indica che bDXVA_Func contiene un DXVA_ConfigQueryOrReplyFunc o un DXVA_EncryptProtocolFunc. I comandi a più byte non indicano la continuazione oltre la fine di dwFunction. È necessario prestare attenzione al decodificatore per garantire che non siano presenti dipendenze sequenziali tra valori diversi bDXVA_Func specificati nella stessa chiamata a IAMVideoAccelerator::Execute e che tutte le potenziali condizioni di race condition (ad esempio tra la decodifica dell'immagine e la fusione di immagini secondarie, tra il caricamento di immagini secondarie e la fusione di immagini secondarie e così via) vengano impedite dalle chiamate appropriate a IAMVideoAccelerator:: BeginFrame e IAMVideoAccelerator::QueryRenderStatus prima delle chiamate successive a IAMVideoAccelerator::Execute.

    • Se dwFunction contiene un DXVA_ConfigQueryOrReplyFunc, il puntatore lpPrivateInputData per il passaggio dei dati all'acceleratore in questa chiamata punterà a una struttura di dati di configurazione, il puntatore lpPrivateOutputData per la ricezione di informazioni dall'acceleratore punterà a un'area in cui è possibile posizionare una struttura di dati di configurazione alternativa o duplicata, il puntatore pamvaBufferInfo per una matrice di AMVABUFFERINFO sarà NULL, e dwNumBuffers devono essere zero. Il valore HRESULT restituito contiene l'indicazione S_OK o S_FALSE in risposta alla query oppure E_FAIL o E_INVALIDARG un'altra indicazione di errore HRESULT in caso di grave problema nell'esecuzione del protocollo , ad esempio un parametro invalid.configuration. Tutte le chiamate a IAMVideoAccelerator::Execute per tutti gli usi di DXVA_ConfigQueryOrReplyFunc precedono tutte le altre chiamate a IAMVideoAccelerator::Execute.

    • Se dwFunction contiene un DXVA_EncryptProtocolFunc, il puntatore lpPrivateInputData per il passaggio dei dati all'acceleratore in questa chiamata punterà a una struttura di dati del protocollo di crittografia che inizia con DXVA_EncryptProtocolHeader, il puntatore lpPrivateOutputData per la ricezione di informazioni dall'acceleratore punterà a un'area in cui i dati da restituire (ad esempio un certificato) dal protocollo di crittografia (che inizierà con DXVA_EncryptProtocolHeader) possono essere posizionati, il puntatore pamvaBufferInfo per una matrice di AMVABUFFERINFO deve essere NULL e dwNumBuffers deve essere zero. Il valore HRESULT restituito contiene S_OK purché il protocollo di crittografia funzioni normalmente e contenga E_FAIL o E_INVALIDARG o un'altra indicazione di errore HRESULT in caso di grave problema nell'esecuzione del protocollo.

    • Se dwFunction non contiene un DXVA_ConfigQueryOrReplyFunc o un DXVA_EncryptProtocolFunc, il puntatore lpPrivateInputData per il passaggio dei dati all'acceleratore deve puntare a un elenco di descrizioni del buffer. Le prime quattro voci nella struttura dell'elenco di descrizioni del buffer per ogni buffer (dwTypeIndex, dwBufferIndex, dwDataOffset e dwDataSize) devono essere uguali a quelli della struttura di dati AMVABUFFERINFO per lo stesso buffer. Se bDXVA_Func è uguale a "1" viene specificato all'interno di dwFunction e bPicReadbackRequests è "1", il puntatore lpPrivateOutputData per la ricezione di informazioni dall'acceleratore deve puntare a un'area di memoria persistente (ad esempio heap) per essere compilati con dati macroblock read-back dall'acceleratore (tali dati non sono sicuramente presenti fino a quando IAMVideoAccelerator::QueryRenderStatus per la scrittura nello stesso buffer di parametri immagine indica S_OK come descritto nell'elemento 10 riportato di seguito). In caso contrario, il puntatore lpPrivateOutputData per la ricezione di informazioni dall'acceleratore deve puntare a un singolo DWORD da impostare su uno dei valori di indicazione seguenti (particolarmente utile per segnalare gli errori bitstream nell'operazione VLD off-host).

      Valore Descrizione
      0 Esecuzione OK.
      1 Si è verificato un problema secondario nel formato dati.
      2 Si è verificato un problema significativo nel formato dati.
      3 Si è verificato un problema grave nel formato dati.
      4 Si è verificato un altro grave problema.

       

      Se viene indicato un tipo di problema "grave", il decodificatore software deve smettere di operare le funzioni, a meno che non sia possibile eseguire azioni correttive. Questi dati restituiti dall'acceleratore non verranno letti dall'host fino al completamento del rendering del buffer per l'immagine, come può essere testato da IAMVideoAccelerator::QueryRenderStatus. Il valore HRESULT restituito contiene S_OK purché l'operazione di interfaccia funzioni normalmente e possa restituire E_FAIL o E_INVALIDARG o un'altra indicazione di errore HRESULT in caso di un problema grave.

  7. Il buffer dei parametri di decodifica delle immagini deve essere tra i primi buffer inviati per la decodifica di ogni immagine quando si usa IAMVideoAccelerator::Execute con bDXVA_Func uguale a "1" e tutti i buffer per decodificare un'immagine in un bitstream devono essere inviati prima di eventuali buffer per decodificare le immagini successive. Se viene inviato un buffer dei comandi del controllo macroblock, verrà inviato un buffer di dati di differenza rimanente corrispondente (contenente i dati per gli stessi macroblock) con la stessa chiamata IAMVideoAccelerator::Execute .

  8. IAMVideoAccelerator::EndFrame verrà chiamato dopo l'invio di tutti i buffer compressi che causeranno la creazione del contenuto di output in una superficie non compressa specificata (risultato delle operazioni specificate per wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex). Lo scopo di questa chiamata a IAMVideoAccelerator::EndFrame è notificare all'hardware dell'acceleratore video che tutti i dati necessari per l'operazione specificata sono stati inviati. Il puntatore ai dati da inviare a valle tramite IAMVideoAccelerator::EndFrame punta a un singolo word wEndPictureIndex contenente l'indice del frame che termina. Questo parametro deve corrispondere al valore wBeginPictureIndex specificato nella chiamata precedente a IAMVideoAccelerator::BeginFrame prima dell'invio dei buffer compressi pertinenti. Successivamente a una chiamata a IAMVideoAccelerator::EndFrame, La superficie non compressa con index wEndPictureIndex non viene trovata in nessuna immagine wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex fino a quando non viene inviata un'altra chiamata a IAMVideoAccelerator::BeginFrame per annunciare che si verificherà e un S_OK è stato restituito di conseguenza. Tuttavia, l'indice della superficie di destinazione può verificarsi nei comandi di accesso in lettura successivi, ad esempio wForwardRefPictureIndex, wBackwardRefPictureIndex, wPicResampleSourcePicIndex o bRefPicSelect[i]. Il valore HRESULT restituito da IAMVideoAccelerator::EndFrame deve essere S_OK a meno che non vi sia un qualche tipo di errore di formato dati o protocollo, nel qual caso può essere E_FAIL o E_INVALIDARG o un'altra indicazione di errore.

  9. Nel caso della decodifica basata su campo (ad esempio, in MPEG-2 bitstream) non sarà presente un mapping uno-a-uno delle immagini funzionali nel bitstream alle superfici non compresse nell'interfaccia dell'acceleratore. Quando si decodificano immagini di campo in un flusso a bitstream MPEG-2, verranno decodificate due "immagini" per produrre una superficie di output completa non compressa. Nella definizione dell'interfaccia DIRECTX VA ogni fotogramma corrisponde a ogni uso di wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex. Sono quindi necessarie due coppie di chiamate a IAMVideoAccelerator::BeginFrame e IAMVideoAccelerator::EndFrame per la decodifica delle immagini di campo in superfici non compresse di output.

  10. Una chiamata a IAMVideoAccelerator::QueryRenderStatus con dwFlags uguale a zero, che si verifica qualche volta dopo una chiamata a IAMVideoAccelerator::EndFrame con un determinato wEndPictureIndex e controlla lo stato di un buffer inviato che conteneva wEndPictureIndex in wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex o wPicResampleDestPicIndex restituirà un'indicazione S_OK se tutte le operazioni per scrivere i dati nella superficie non compressa sono state completate e restituirà E_PENDING se l'operazione non è ancora stata completata. E_FAIL o E_INVALIDARG o un'altra indicazione di errore può essere restituita in caso di errore del protocollo.

Mapping dell'accelerazione video DirectX a IAMVideoAccelerator