DirectX Video Acceleration IAMVideoAccelerator Operational Specification
Der genaue Vorgangsmechanismus sieht wie folgt aus:
Jedes profil im eingeschränkten Modus, das hier definiert ist, verfügt über eine zugeordnete DirectX VA-GUID, die von den IPin::QueryAccept und IPin::ReceiveConnection eines Downstreameingabepins unterstützt und in IAMVideoAccelerator::GetVideoAcceleratorGUIDsaufgeführt wird.
Ebenso muss jeder Verschlüsselungsprotokolltyp für die Verwendung mit DirectX VA über eine zugeordnete Verschlüsselungsprotokolltyp-GUID verfügen, die von den IPin::QueryAccept und IPin::ReceiveConnection eines Downstreameingabepins unterstützt und in IAMVideoAccelerator::GetVideoAcceleratorGUIDs aufgeführt werden kann. Die GUID "No Encryption" DXVA _ NoEncrypt darf in dieser Liste nicht gesendet werden, da sie unterstützt werden muss und daher implizit ist.
Nachdem IPin::ReceiveConnection aufgerufen wurde, um eine Verbindung mit dem Downstreameingabepin herzustellen, muss die IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData des Decoders einen Zeiger auf eine DXVA _ ConnectMode-Datenstruktur zurückgeben, die die Verbindungsmodusinformationen für die Verbindung enthält. IAMVideoAccelerator::GetCompBufferInfo muss mit * pdwNumTypesCompBuffers = 16 aufgerufen werden und komprimierte Pufferinformationen basierend auf der Konvention zurückgeben, dass die Typnummer jedes Puffers (wie in Abschnitt 3.4 der DirectX VA-Spezifikation definiert) direkt als nullbasierter Index in das Array der zurückgegebenen AMVACompBufferInfo-Datenstrukturen verwendet werden kann. Dies erfordert, dass der Zugriffstastentreiber für alle Puffertypen, die nicht verwendet werden (einschließlich Puffertyp 0, da dieser Puffertyp nicht definiert ist), AMVACompBufferInfo-Datenstrukturen mit einer Form von Dummyparameterwerten bereitstellt (z. B. dwNumCompBuffers=0, dwWidthToCreate=0, dwHeightToCreate=0 und dwBytesToAllocate=0).
DXVA-Funktionshinweise und zugeordnete Datenpuffer werden mit IAMVideoAccelerator::Executegesendet. Die DXVA-Funktion wird im dwFunction-Parameter des Aufrufs angegeben. Die einzigen DXVA-Funktionen, die für die Initialisierung relevant sind, sind DXVA _ ConfigQueryOrReplyFunc und DXVA _ EncryptProtocolFunc.
Wenn dwFunction eine _ DXVA-ConfigQueryOrReplyFunc enthält, muss der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste in diesem Aufruf auf eine Konfigurationsdatenstruktur verweisen. Der lpPrivateOutputData-Zeiger zum Empfangen von Informationen vom Accelerator muss auf einen Bereich zeigen, in dem eine alternative oder doppelte Konfigurationsdatenstruktur platziert werden kann, der pamvaBufferInfo-Zeiger für ein Array von AMVABUFFERINFO null sein muss, und dwNumBuffers muss null sein. Das zurückgegebene HRESULT enthält die _ S OK- oder S _ FALSE-Angabe oder E _ FAIL oder E _ INVALIDARG oder einen anderen Fehlerhinweis HRESULT im Falle eines schwerwiegenden Problems bei der Protokollausführung (z. B. ein ungültiger Konfigurationsparameter). Alle Aufrufe von IAMVideoAccelerator::Execute für alle Verwendungen von DXVA _ ConfigQueryOrReplyFunc müssen allen anderen Aufrufen von IAMVideoAccelerator::Execute vorangestellt werden.
Wenn dwFunction eine DXVA _ EncryptProtocolFunc enthält, muss der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste in diesem Aufruf auf eine Verschlüsselungsprotokolldatenstruktur verweisen, die mit DXVA _ EncryptProtocolHeader beginnt. Der lpPrivateOutputData-Zeiger zum Empfangen von Informationen von der Zugriffstaste muss auf einen Bereich zeigen, in dem die vom Verschlüsselungsprotokoll (das mit DXVA EncryptProtocolHeader beginnt) zurückzugebenden Daten (z. B. ein _ Zertifikat) platziert werden können. Der pamvaBufferInfo-Zeiger für ein Array von AMVABUFFERINFO muss NULL sein, und dwNumBuffers muss null sein. Das zurückgegebene HRESULT enthält S _ OK, solange das Verschlüsselungsprotokoll normal funktioniert, und enthält E _ FAIL oder E _ INVALIDARG oder einen anderen Fehlerhinweis HRESULT im Falle eines schwerwiegenden Problems bei der Protokollausführung.
Nach der Initialisierung des Vorgangs in der obigen Weise wird der tatsächliche Vorgang des Decoders wie folgt fortgesetzt:
IAMVideoAccelerator::BeginFrame muss aufgerufen werden, bevor bDXVA _ Func mit komprimierten Pufferparametern gesendet wird, die Schreibvorgänge auf eine nicht komprimierte Zieloberfläche verursachen. Der Zweck von IAMVideoAccelerator::BeginFrame in DirectX VA besteht darin, Zieloberflächen Indexwerten zuzuordnen und den Videobeschleunigungstreiber über die Absicht zu benachrichtigen, eine Oberfläche zu initiieren, damit der Treiber darauf reagieren kann, ob die Oberfläche überschrieben werden kann. Die amVABeginFrameInfo-Struktur, die in IAMVideoAccelerator::BeginFrame übergeben wird, muss einen pInputData-Zeiger auf einen einzelnen WORD wBeginPictureIndex-Parameter enthalten, der dem an IAMVideoAccelerator::BeginFrame übergebenen Frameindex entspricht (und dwSizeInputData muss 2 sein). Dies ist der Index, der in einem komprimierten Puffer verwendet werden soll, um einen Schreibvorgang auf die Oberfläche zu befehlen (z. B. als wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex). Jeder Aufruf von IAMVideoAccelerator::BeginFrame muss wie unten beschrieben mit einem entsprechenden Aufruf von IAMVideoAccelerator::EndFrame gekoppelt werden. Wenn z. B. ein komprimiertes Bild decodiert und dann mithilfe der Front-End-Puffer-zu-Puffer-Mischung mit einem grafikgrafischen Bild alphanuriert werden soll, gibt es einen Aufruf von IAMVideoAccelerator::BeginFrame, bevor das komprimierte Bild in eine in wDecodedPictureIndex angegebene Oberfläche decodiert wird. dann ein Aufruf von IAMVideoAccelerator::EndFrame, nachdem alle komprimierten Puffer übergeben wurden, die zum Decodieren des Bilds verwendet werden, und dann ein zweiter Aufruf von IAMVideoAccelerator::BeginFrame vor dem Befehl der Alphamischungskombination der Grafikquelle mit dem decodierten Bild in eine in wBlendedDestinationIndex angegebene Oberfläche und dann ein zweiter Aufruf von IAMVideoAccelerator::EndFrame nach dem Alphablend-Kombinationsvorgang. Der Zeiger pOutputData in AMVABeginFrameInfo muss NULL sein (und dwSizeOutputData muss "0") sein. Das von IAMVideoAccelerator::BeginFrame zurückgegebene HRESULT muss wie folgt sein:
- S _ OK, wenn die nicht komprimierte Oberfläche verfügbar und einsatzbereit ist.
- E _ Ausstehend, wenn die nicht komprimierte Oberfläche noch nicht zur Verwendung verfügbar ist, aber bald verfügbar ist (wenn die nicht komprimierte Oberfläche zur Anzeige gelesen wird und das Lesen/Anzeigen der Oberfläche noch nicht abgeschlossen ist).
- E _ FAIL oder E _ INVALIDARG eine andere Fehleranzeige nur, wenn ein Datenformat- oder Protokollfehler erkannt wird (z. B. ein falscher Wert von dwSizeInputData oder ein pOutputData ungleich NULL).
DXVA-Funktionshinweise und zugeordnete Datenpuffer werden mit IAMVideoAccelerator::Execute gesendet. Mehrere bDXVA _ Func-Werte können im selben Aufruf von IAMVideoAccelerator::Executeangegeben werden. Die bDXVA _ Func-Werte müssen in den dwFunction-Parameter des Aufrufs gepackt werden, wobei der erste Funktionsbefehl in den acht MSBs, der nächste Befehl in den nächsten acht Bits usw. mit allen verbleibenden Bits mit Nullen aufgefüllt werden. Der Wert 0xFF für bDXVA _ Func gibt an, dass der bDXVA _ Func auf zwei oder vier Bytes erweitert wird. Wenn das zweite Byte ebenfalls 0xFF ist, gibt dies an, dass bDXVA _ Func auf vier Bytes erweitert wird. Wenn die oberen vier Bits des dritten Byte 0xF oder 0x0 sind, gibt dies an, dass bDXVA _ Func eine _ DXVA-ConfigQueryOrReplyFunc oder DXVA _ EncryptProtocolFunc enthält. Multi-Byte-Befehle dürfen keine Fortsetzung nach dem Ende von dwFunction angeben. Der Decoder muss darauf achten, dass keine sequenziellen Abhängigkeiten zwischen verschiedenen bDXVA Func-Werten vorhanden sind, _ die im selben Aufruf von IAMVideoAccelerator::Execute angegeben sind, und dass alle möglichen Racebedingungen (z. B. zwischen Bilddecodierung und Unterbildmischung, zwischen dem Laden von Untergeordneten Bildern und der Unterbildmischung usw.) werden durch entsprechende Aufrufe von IAMVideoAccelerator::BeginFrame und IAMVideoAccelerator::QueryRenderStatus vor nachfolgenden Aufrufen von IAMVideoAccelerator::Execute verhindert.
Wenn dwFunction eine _ DXVA-ConfigQueryOrReplyFunc enthält, muss der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste in diesem Aufruf auf eine Konfigurationsdatenstruktur verweisen. Der lpPrivateOutputData-Zeiger zum Empfangen von Informationen vom Accelerator muss auf einen Bereich zeigen, in dem eine alternative oder doppelte Konfigurationsdatenstruktur platziert werden kann, der pamvaBufferInfo-Zeiger für ein Array von AMVABUFFERINFO null sein muss, und dwNumBuffers muss null sein. Das zurückgegebene HRESULT enthält die _ S OK- oder S _ FALSE-Angabe als Antwort auf die Abfrage oder E _ FAIL oder E _ INVALIDARG einen anderen Fehlerhinweis HRESULT im Falle eines schwerwiegenden Problems bei der Protokollausführung (z. B. einen invalid.configuration-Parameter). Alle Aufrufe von IAMVideoAccelerator::Execute für alle Verwendungen von DXVA _ ConfigQueryOrReplyFunc müssen allen anderen Aufrufen von IAMVideoAccelerator::Execute vorangestellt werden.
Wenn dwFunction eine DXVA _ EncryptProtocolFunc enthält, muss der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste in diesem Aufruf auf eine Verschlüsselungsprotokolldatenstruktur verweisen, die mit DXVA _ EncryptProtocolHeader beginnt. Der lpPrivateOutputData-Zeiger zum Empfangen von Informationen von der Zugriffstaste muss auf einen Bereich zeigen, in dem die vom Verschlüsselungsprotokoll (das mit DXVA EncryptProtocolHeader beginnt) zurückzugebenden Daten (z. B. ein _ Zertifikat) platziert werden können. Der pamvaBufferInfo-Zeiger für ein Array von AMVABUFFERINFO muss NULL sein, und dwNumBuffers muss null sein. Das zurückgegebene HRESULT enthält S _ OK, solange das Verschlüsselungsprotokoll normal funktioniert, und enthält E _ FAIL oder E _ INVALIDARG oder einen anderen Fehlerhinweis HRESULT im Falle eines schwerwiegenden Problems bei der Protokollausführung.
Wenn dwFunction keine _ DXVA-ConfigQueryOrReplyFunc oder DXVA _ EncryptProtocolFunc enthält, muss der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste auf eine Pufferbeschreibungsliste verweisen. Die ersten vier Einträge in der Pufferbeschreibungslistenstruktur für jeden Puffer (dwTypeIndex, dwBufferIndex, dwDataOffset und dwDataSize) müssen denen in der AMVABUFFERINFO-Datenstruktur für denselben Puffer entsprechen. Wenn bDXVA _ Func gleich "1" ist, wird in dwFunction angegeben, und bPicReadbackRequests ist "1", Der lpPrivateOutputData-Zeiger zum Empfangen von Informationen von der Zugriffstaste muss auf einen Bereich mit persistentem Speicher (z. B. Heap) zeigen, der mit zurückgelesenen Makroblockdaten aus der Zugriffstaste gefüllt werden soll (solche Daten sind nicht garantiert bis IAMVideoAccelerator::QueryRenderStatus zum Schreiben in den gleichen Bildparameterpuffer vorhanden, geben S _ OK an, wie in Element 10 unten beschrieben). Andernfalls muss der lpPrivateOutputData-Zeiger zum Empfangen von Informationen von der Zugriffstaste auf ein einzelnes DWORD verweisen, das auf einen der folgenden Anzeigewerte festgelegt werden soll (besonders nützlich für die Meldung von Bitstreamfehlern bei VLD-Offhost-Ausfällen).
Wert Beschreibung 0 Ausführung OK. 1 Kleineres Problem im Datenformat aufgetreten. 2 Es ist ein erhebliches Problem im Datenformat aufgetreten. 3 Schwerwiegendes Problem im Datenformat. 4 Es ist ein anderes schwerwiegendes Problem aufgetreten. Wenn eine der beiden Arten von "schwerwiegenden" Problemen angezeigt wird, sollte der Softwaredecoder die Funktion(en) nicht mehr betreiben, es sei denn, es können Korrekturmaßnahmen ergriffen werden. Diese von der Zugriffstaste zurückgegebenen Daten dürfen erst vom Host gelesen werden, nachdem das Pufferrendering für das Bild abgeschlossen ist, wie von IAMVideoAccelerator::QueryRenderStatusgetestet werden kann. Das zurückgegebene HRESULT enthält S _ OK, solange der Schnittstellenvorgang normal funktioniert und bei einem schwerwiegenden Problem E _ FAIL oder E _ INVALIDARG oder einen anderen Fehlerhinweis HRESULT zurückgeben kann.
Der Puffer für die Bilddecodierungsparameter muss zu den ersten Puffern gehören, die für die Decodierung jedes Bilds gesendet werden, wenn IAMVideoAccelerator::Execute mit bDXVA _ Func gleich "1" verwendet wird, und alle Puffer zum Decodieren eines Bilds in einem Bitstream müssen gesendet werden, bevor Puffer zum Decodieren nachfolgender Bilder gesendet werden. Wenn ein Befehlspuffer für das Macroblock-Steuerelement gesendet wird, muss ein entsprechender Restdifferenzdatenpuffer (der Daten für dieselben Makroblocks enthält) mit demselben IAMVideoAccelerator::Execute-Aufruf gesendet werden.
IAMVideoAccelerator::EndFrame muss aufgerufen werden, nachdem alle komprimierten Puffer gesendet wurden, die die Erstellung des Ausgabeinhalts auf einer angegebenen nicht komprimierten Oberfläche verursachen (ein Ergebnis von Vorgängen, die für wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex angegeben wurden). Der Zweck dieses Aufrufs von IAMVideoAccelerator::EndFrame besteht darin, die Videobeschleunigungshardware darüber zu informieren, dass alle für den angegebenen Vorgang erforderlichen Daten gesendet wurden. Der Zeiger auf Daten, die downstream über IAMVideoAccelerator::EndFrame gesendet werden sollen, muss auf ein einzelnes WORD wEndPictureIndex zeigen, das den Index des zu beendenden Frames enthält. Dieser Parameter muss mit dem wBeginPictureIndex-Wert übereinstimmen, der im vorherigen Aufruf von IAMVideoAccelerator::BeginFrame vor dem Senden der relevanten komprimierten Puffer angegeben wurde. Nach einem Aufruf von IAMVideoAccelerator::EndFrame sollte die nicht komprimierte Oberfläche mit dem Index wEndPictureIndex nicht im wDecodedPictureIndex eines Bilds gefunden werden. wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex, bis nach einem weiteren Aufruf von IAMVideoAccelerator::BeginFrame dies angekündigt wird und ein S _ OK zurückgegeben wurde. Dieser Zieloberflächenindex kann jedoch in nachfolgenden Lesezugriffsbefehlen wie wForwardRefPictureIndex, wBackwardRefPictureIndex, wPicResampleSourcePicIndex oder bRefPicSelect [ i ] auftreten. Das von IAMVideoAccelerator::EndFrame zurückgegebene HRESULT muss S _ OK sein, es sei denn, es liegt ein Datenformat- oder Protokollfehler vor. In diesem Fall kann es sich um E _ FAIL, E _ INVALIDARG oder eine andere Fehleranzeige handelt.
Bei der feldbasierten Decodierung (z. B. in MPEG-2-Bitstreams) gibt es keine 1:1-Zuordnung von funktionalen Bildern im Bitstream zu nicht komprimierten Oberflächen in der Zugriffstastenschnittstelle. Beim Decodieren von Feldbildern in einem MPEG-2-Bitstream werden zwei "Bilder" decodiert, um eine vollständige, nicht komprimierte Ausgabeoberfläche zu erzeugen. In der Definition der DirectX VA-Schnittstelle entspricht jeder Frame jeder Verwendung von wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex. Daher sind zwei Aufrufpaare von IAMVideoAccelerator::BeginFrame und IAMVideoAccelerator::EndFrame erforderlich, um Feldbilder in nicht komprimierte Ausgabeoberflächen zu decodieren.
Aufruf von IAMVideoAccelerator::QueryRenderStatus mit dwFlags gleich 0 (null), der nach einem Aufruf von IAMVideoAccelerator::EndFrame mit einem bestimmten wEndPictureIndex auftritt und den Status eines gesendeten Puffers überprüft, der den wEndPictureIndex in wDecodedPictureIndex enthielt. wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex gibt eine _ S OK-Angabe zurück, wenn alle Vorgänge zum Schreiben der Daten auf die nicht komprimierte Oberfläche abgeschlossen wurden, und gibt E _ PENDING zurück, wenn der Vorgang noch nicht abgeschlossen wurde. E _ FAIL oder E _ INVALIDARG oder ein anderer Fehlerhinweis kann im Falle eines Protokollfehlers zurückgegeben werden.