Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
[Das dieser Seite zugeordnete Feature DirectShow-ist ein Legacyfeature. Es wurde von MediaPlayer, IMFMediaEngineund Audio/Video Capture in Media Foundationersetzt. Diese Features wurden für Windows 10 und Windows 11 optimiert. Microsoft empfiehlt dringend, dass neuer Code MediaPlayer-, IMFMediaEngine und Audio-/Videoaufnahme in Media Foundation anstelle von DirectShow-verwendet, wenn möglich. Microsoft schlägt vor, dass vorhandener Code, der die Legacy-APIs verwendet, um die neuen APIs zu verwenden, falls möglich umgeschrieben werden.]
Der genaue Betriebsmechanismus lautet wie folgt:
Jedes hierin definierte Eingeschränkte Modusprofil verfügt über eine zugeordnete DirectX VA-GUID, die von den IPin::QueryAccept und IPin::ReceiveConnection unterstützt und in IAMVideoAccelerator::GetVideoAcceleratorGUIDsaufgeführt werden kann.
Ebenso muss jeder Verschlüsselungsprotokolltyp für die Verwendung mit DirectX VA über eine zugehörige Verschlüsselungsprotokolltyp-GUID verfügen, die von den IPin::QueryAccept und IPin::ReceiveConnection unterstützt und in IAMVideoAccelerator::GetVideoAcceleratorGUIDsaufgeführt werden kann. Die GUID "no encryption" DXVA_NoEncrypt darf nicht in dieser Liste gesendet werden, da dies erforderlich und daher implizit ist.
Nachdem IPin::ReceiveConnection aufgerufen wurde, um eine Verbindung mit dem downstream-Eingabenadel herzustellen, gibt die IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData einen Zeiger an eine DXVA_ConnectMode Datenstruktur zurück, die die Verbindungsmodusinformationen für die Verbindung enthält. IAMVideoAccelerator::GetCompBufferInfo muss mit *pdwNumTypesCompBuffers = 16 aufgerufen werden und gibt komprimierte Pufferinformationen basierend auf der Konvention zurück, die die Typnummer jedes Puffers (gemäß Definition in Abschnitt 3.4 der DirectX VA-Spezifikation) direkt als nullbasierten Index in das Array AMVACompBufferInfo zurückgegebenen Datenstrukturen verwendet werden kann. Dies erfordert, dass für alle Puffertypen, die nicht verwendet werden (einschließlich Puffertyp 0, da es keine definierte Verwendung dieses Puffertyps gibt), der Zugriffstastentreiber AMVACompBufferInfo-Datenstrukturen mit einer Form von "dummy"-Parameterwerten (z. B. dwNumCompBuffers=0, dwWidthToCreate=0, dwHeightToCreate=0 und dwNumCompcate=0) bereitstellt.
DXVA-Funktionsanzeigen und zugeordnete Datenpuffer werden mithilfe von 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 einen DXVA_ConfigQueryOrReplyFunc enthält, verweist der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste in diesem Aufruf auf eine Konfigurationsdatenstruktur, der lpPrivateOutputData-Zeiger für den Empfang von Informationen vom Accelerator auf einen Bereich, in dem eine alternative oder doppelte Konfigurationsdatenstruktur platziert werden kann, der PamvaBufferInfo-Zeiger für ein Array von AMVABUFFERINFO muss NULLsein. und dwNumBuffers müssen null sein. Das zurückgegebene HRESULT enthält die S_OK- oder S_FALSE-Indikation oder E_FAIL oder E_INVALIDARG oder einen anderen Fehlerindikator HRESULT im Falle eines schwerwiegenden Problems bei der Protokollausführung (z. B. einem ungültigen Konfigurationsparameter). Alle Aufrufe von IAMVideoAccelerator::Execute für alle Verwendungen von DXVA_ConfigQueryOrReplyFunc müssen allen anderen Aufrufen von IAMVideoAccelerator::Executevorausgehen.
Wenn dwFunction einen DXVA_EncryptProtocolFunc enthält, verweist der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste in diesem Aufruf auf eine Verschlüsselungsprotokolldatenstruktur, die mit DXVA_EncryptProtocolHeader beginnt, der lpPrivateOutputData-Zeiger für den Empfang von Informationen aus der Zugriffstaste auf einen Bereich, in dem die daten zurückgegeben werden (z. B. ein Zertifikat) durch das Verschlüsselungsprotokoll (das mit DXVA_EncryptProtocolHeader beginnt) platziert werden können, der PamvaBufferInfo-Zeiger für ein Array von AMVABUFFERINFO muss NULL-sein, und dwNumBuffers müssen Null sein. Das zurückgegebene HRESULT enthält S_OK, solange das Verschlüsselungsprotokoll normal funktioniert und E_FAIL oder E_INVALIDARG oder eine andere Fehleranzeige HRESULT enthält, wenn ein schwerwiegendes Problem bei der Protokollausführung auftritt.
Nach der Initialisierung des Vorgangs wird der tatsächliche Betrieb des Decoders wie folgt fortgesetzt:
IAMVideoAccelerator::BeginFrame muss aufgerufen werden, bevor alle bDXVA_Func mit komprimierten Pufferparametern gesendet werden, die zu Schreibvorgängen auf eine nicht komprimierte Zieloberfläche führen. Der Zweck von IAMVideoAccelerator::BeginFrame in DirectX VA besteht darin, Zieloberflächen indexwerten zuzuordnen und den Videobeschleunigertreiber über die Absicht zu informieren, eine Oberfläche zu initiieren, damit der Treiber mit einem Hinweis darauf reagieren kann, ob die Oberfläche überschrieben werden kann. Die AMVABeginFrameInfo Struktur, die in IAMVideoAccelerator::BeginFrame übergeben wird, enthält einen pInputData-Zeiger auf einen einzelnen WORD wBeginPictureIndex-Parameter, der mit dem an IAMVideoAccelerator::BeginFrame übergeben wird (und dwSizeInputData muss 2 sein). Dies ist der Index, der in einem komprimierten Puffer verwendet werden soll, um einen Schreibzugriff auf die Oberfläche (z. B. als wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex) zu verwenden. Jeder Aufruf von IAMVideoAccelerator::BeginFrame muss mit einem entsprechenden Aufruf von IAMVideoAccelerator::EndFrame wie unten beschrieben kombiniert werden. Wenn beispielsweise ein komprimiertes Bild decodiert werden soll und dann alphaniert wird, indem der Front-End-Puffer-zu-Puffer mit einem Grafikbild kombiniert wird, es wäre ein Aufruf von IAMVideoAccelerator::BeginFrame vor dem Decodieren des komprimierten Bilds in eine in wDecodedPictureIndex angegebene Oberfläche, dann ein Aufruf von IAMVideoAccelerator::EndFrame, nachdem alle komprimierten Puffer übergeben wurden, die zum Decodieren des Bilds verwendet wurden, dann ein zweiter Aufruf von IAMVideoAccelerator::BeginFrame vor dem Befehl der Alphamischungskombination der Grafikquelle mit der decodierten Grafik in eine Oberfläche, die in wBlendedDestinationIndex angegeben ist, und dann ein zweiter Aufruf von IAMVideoAccelerator::EndFrame nach dem Alpha-Blend-Kombinationsvorgang. Der Zeiger pOutputData in AMVABeginFrameInfo muss NULL- sein (und dwSizeOutputData muss "0" sein). Das von IAMVideoAccelerator::BeginFrame zurückgegebene HRESULT lautet:
- S_OK, wenn die nicht komprimierte Oberfläche verfügbar und einsatzbereit ist.
- E_PENDING, wenn die nicht komprimierte Oberfläche noch nicht zur Verwendung verfügbar ist, aber in Kürze verfügbar wird (wenn die nicht komprimierte Oberfläche zur Anzeige gelesen wird und das Lesen/Anzeigen der Oberfläche noch nicht abgeschlossen wurde).
- E_FAIL oder E_INVALIDARG andere Fehlerindikatoren nur, wenn ein Datenformat oder Protokollfehler erkannt wird (z. B. ein falscher Wert von dwSizeInputData oder ein nichtNULL pOutputData).
DXVA-Funktionsanzeigen und zugeordnete Datenpuffer werden mithilfe von IAMVideoAccelerator::Executegesendet. Mehrere bDXVA_Func Wert können im gleichen Aufruf von IAMVideoAccelerator::Executeangegeben werden. Die bDXVA_Func Werte werden in den dwFunction-Parameter des Aufrufs verpackt, 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 wird. Der Wert 0xFF für bDXVA_Func gibt an, dass der bDXVA_Func auf zwei oder vier Byte erweitert wird. Wenn das zweite Byte ebenfalls 0xFF ist, gibt dies an, dass bDXVA_Func auf vier Byte 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 geben keine Fortsetzung über das Ende von dwFunction an. Achten Sie auf den Decoder, um sicherzustellen, dass keine sequenziellen Abhängigkeiten zwischen verschiedenen bDXVA_Func Werten vorhanden sind, die im gleichen Aufruf von IAMVideoAccelerator::Execute angegeben sind und dass alle potenziellen Racebedingungen (z. B. zwischen Bilddecodierung und Unterbildvermischung, zwischen Unterbildlade- und Unterbildmischung usw.) durch geeignete Aufrufe an IAMVideoAccelerator verhindert werden: BeginFrame und IAMVideoAccelerator::QueryRenderStatus vor nachfolgenden Aufrufen von IAMVideoAccelerator::Execute.
Wenn dwFunction einen DXVA_ConfigQueryOrReplyFunc enthält, verweist der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste in diesem Aufruf auf eine Konfigurationsdatenstruktur, der lpPrivateOutputData-Zeiger für den Empfang von Informationen vom Accelerator auf einen Bereich, in dem eine alternative oder doppelte Konfigurationsdatenstruktur platziert werden kann, der PamvaBufferInfo-Zeiger für ein Array von AMVABUFFERINFO muss NULLsein. und dwNumBuffers müssen null sein. Das zurückgegebene HRESULT enthält die S_OK oder S_FALSE Angabe als Reaktion auf die Abfrage, oder E_FAIL oder E_INVALIDARG andere Fehleranzeige HRESULT im Falle eines schwerwiegenden Problems bei der Protokollausführung (z. B. ein invalid.configuration-Parameter). Alle Aufrufe von IAMVideoAccelerator::Execute für alle Verwendungen von DXVA_ConfigQueryOrReplyFunc müssen allen anderen Aufrufen von IAMVideoAccelerator::Executevorausgehen.
Wenn dwFunction einen DXVA_EncryptProtocolFunc enthält, verweist der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste in diesem Aufruf auf eine Verschlüsselungsprotokolldatenstruktur, die mit DXVA_EncryptProtocolHeader beginnt, der lpPrivateOutputData-Zeiger für den Empfang von Informationen aus der Zugriffstaste auf einen Bereich, in dem die daten zurückgegeben werden (z. B. ein Zertifikat) durch das Verschlüsselungsprotokoll (das mit DXVA_EncryptProtocolHeader beginnt) platziert werden können, der PamvaBufferInfo-Zeiger für ein Array von AMVABUFFERINFO muss NULL-sein, und dwNumBuffers müssen Null sein. Das zurückgegebene HRESULT enthält S_OK, solange das Verschlüsselungsprotokoll normal funktioniert und E_FAIL oder E_INVALIDARG oder eine andere Fehleranzeige HRESULT enthält, wenn ein schwerwiegendes Problem bei der Protokollausführung auftritt.
Wenn dwFunction keine DXVA_ConfigQueryOrReplyFunc oder DXVA_EncryptProtocolFunc enthält, verweist der lpPrivateInputData-Zeiger zum Übergeben von Daten an die Zugriffstaste auf eine Pufferbeschreibungsliste. Die ersten vier Einträge in der Listenstruktur der Pufferbeschreibung für jeden Puffer (dwTypeIndex, dwBufferIndex, dwDataOffset und dwDataSize) müssen den Einträgen in der AMVABUFFERINFO-Datenstruktur für denselben Puffer entsprechen. Wenn bDXVA_Func gleich "1" innerhalb von dwFunction angegeben ist und bPicReadbackRequests "1" ist, zeigt der lpPrivateOutputData-Zeiger zum Empfangen von Informationen vom Zugriffstastenbereich auf einen Bereich des persistenten Speichers (z. B. Heap), der mit Lese-Back-Makroblockdaten aus der Zugriffstaste gefüllt werden soll (solche Daten sind erst vorhanden, wenn IAMVideoAccelerator:: QueryRenderStatus- zum Schreiben in den gleichen Bildparameterpuffer gibt S_OK an, wie in Element 10 unten beschrieben). Andernfalls verweist der lpPrivateOutputData-Zeiger für den Empfang von Informationen von der Zugriffstaste auf einen einzelnen DWORD-Wert, der auf einen der folgenden Indikationswerte festgelegt werden soll (besonders nützlich für die Meldung von Bitstreamfehlern im Off-Host-VLD-Vorgang).
Wert Beschreibung 0 Ausführung OK. 1 Geringfügiges Problem im Datenformat. 2 Ein erhebliches Problem im Datenformat ist aufgetreten. 3 Es ist ein schwerwiegendes Problem im Datenformat aufgetreten. 4 Ein anderes schwerwiegendes Problem ist aufgetreten. Wenn eine der Arten von "schwerwiegenden" Problemen angegeben ist, sollte der Softwaredecoder die Funktion(en) nicht mehr bedienen, es sei denn, Korrekturmaßnahmen können ergriffen werden. Diese daten, die von der Zugriffstaste zurückgegeben werden, dürfen erst vom Host gelesen werden, nachdem das Pufferrendering für das Bild abgeschlossen wurde, wie es durch IAMVideoAccelerator::QueryRenderStatusgetestet werden kann. Das zurückgegebene HRESULT enthält S_OK, solange der Schnittstellenvorgang normal funktioniert, und kann E_FAIL oder E_INVALIDARG oder eine andere Fehleranzeige HRESULT im Falle eines schwerwiegenden Problems zurückgeben.
Der Bilddecodierungsparameterpuffer gehört zu den ersten Puffern, die bei Verwendung von IAMVideoAccelerator::Execute mit bDXVA_Func gleich "1" gesendet werden, und alle Puffer zum Decodieren eines Bilds in einem Bitstream müssen vor allen Puffern zum Decodieren nachfolgender Bilder gesendet werden. Wenn ein Makroblock-Befehlspuffer gesendet wird, muss ein entsprechender Restdifferenzdatenpuffer (mit Daten für dieselben Makroblocks) mit demselben IAMVideoAccelerator::Execute Aufruf gesendet werden.
IAMVideoAccelerator::EndFrame muss aufgerufen werden, nachdem alle komprimierten Puffer gesendet wurden, die die Erstellung des Ausgabeinhalts in einer angegebenen nicht komprimierten Oberfläche verursachen (ein Ergebnis von Vorgängen, die für wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex angegeben sind). Der Zweck dieses Aufrufs von IAMVideoAccelerator::EndFrame besteht darin, die Videobeschleunigerhardware zu benachrichtigen, dass alle für den angegebenen Vorgang erforderlichen Daten gesendet wurden. Der Zeiger auf Daten, die über IAMVideoAccelerator::EndFrame nachgeschaltet werden sollen, verweist auf einen einzelnen WORD wEndPictureIndex, der den Index des frames enthält, der endet. Dieser Parameter muss mit dem im vorherigen Aufruf von IAMVideoAccelerator::BeginFrame angegebenen wBeginPictureIndex-Wert übereinstimmen, bevor die relevanten komprimierten Puffer gesendet werden. Nach einem Aufruf von IAMVideoAccelerator::EndFramewird die nicht komprimierte Oberfläche mit index wEndPictureIndex nicht im wDecodedPictureIndex gefunden, wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex bis nach einem weiteren Aufruf von IAMVideoAccelerator::BeginFrame wird ausgegeben, um mitzuteilen, dass dies erfolgt und ein S_OK als Ergebnis 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 gibt eine Art von Datenformat oder Protokollfehler, in diesem Fall kann es E_FAIL oder E_INVALIDARG oder ein anderer Fehlerindikator sein.
Bei feldbasierter Decodierung (z. B. in MPEG-2-Bitstreams) gibt es keine 1:1-Zuordnung funktionaler Bilder 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 unkomprimierte Ausgabeoberfläche zu erzeugen. In der DirectX VA-Schnittstellendefinition entspricht jeder Frame jeder Verwendung von wDecodedPictureIndex, wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex. Daher sind zwei Aufrufpaare an IAMVideoAccelerator::BeginFrame und IAMVideoAccelerator::EndFrame für die Decodierung von Feldbildern in ausgabeunkomprimierte Oberflächen erforderlich.
Ein Aufruf von IAMVideoAccelerator::QueryRenderStatus mit dwFlags gleich Null, die einige Zeit nach einem Aufruf von IAMVideoAccelerator::EndFrame mit einem bestimmten wEndPictureIndex auftritt und den Status eines Puffers überprüft, der gesendet wurde, der den wEndPictureIndex in wDecodedPictureIndex enthielt, wDeblockedPictureIndex, wBlendedDestinationIndex oder wPicResampleDestPicIndex gibt einen S_OK Hinweis zurück, wenn alle Vorgänge zum Schreiben der Daten auf die nicht komprimierte Oberfläche verfügen. abgeschlossen und gibt E_PENDING zurück, wenn der Vorgang noch nicht abgeschlossen wurde. E_FAIL oder E_INVALIDARG oder ein anderer Fehlerindikator kann im Falle eines Protokollfehlers zurückgegeben werden.
Verwandte Themen