DirectX 影片加速 IAMVideoAccelerator 操作規格
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
作業的精確機制如下:
此處定義的每個受限制模式設定檔都有相關聯的 DirectX VA GUID,可由下游輸入針腳的 IPin::QueryAccept 和 IPin::ReceiveConnection 支援,並列在 IAMVideoAccelerator::GetVideoAcceleratorGUIDs中。
同樣地,用於 DirectX VA 的每個加密通訊協定類型都應該有相關聯的加密通訊協定類型 GUID,下游輸入針腳的 IPin::QueryAccept 和 IPin::ReceiveConnection 和 IPin::ReceiveConnection ,並列在 IAMVideoAccelerator::GetVideoAcceleratorGUIDs中。 此清單中不得傳送「無加密」GUID DXVA_NoEncrypt,因為其支援是必要的,因此為隱含。
呼叫 IPin::ReceiveConnection 嘗試連線到下游輸入針腳之後,解碼器的 IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData 應該會傳回包含連線連線模式資訊的DXVA_ConnectMode資料結構的指標。 IAMVideoAccelerator::GetCompBufferInfo 應該使用 *pdwNumTypesCompBuffers = 16 呼叫,並根據傳回的 AMVACompBufferInfo 資料結構陣列中,每個緩衝區的類型數目 (定義于 DirectX VA) 規格第 3.4 節中所定義的慣例,直接當做以零起始的索引來呼叫。 這需要針對不會使用的任何緩衝區類型, (包括緩衝區類型 0, 由於沒有定義使用該緩衝區類型) ,因此快速鍵驅動程式會以某種形式的 「dummy」 參數值來提供 AMVACompBufferInfo 資料結構 (,例如 dwNumCompBuffers=0、dwWidthToCreate=0、dwHeightToCreate=0 和 dwBytesToAllocate=0) 。
DXVA 函式指示和相關聯的資料緩衝區會使用 IAMVideoAccelerator::Execute來傳送。 DXVA 函式會在呼叫的 dwFunction 參數中指出。 唯一與初始化相關的 DXVA 函式是DXVA_ConfigQueryOrReplyFunc和DXVA_EncryptProtocolFunc。
如果 dwFunction 包含DXVA_ConfigQueryOrReplyFunc,則 lpPrivateInputData 指標會將資料傳遞至此呼叫中的快速鍵應指向設定資料結構,lpPrivateOutputData 指標會指向從加速器接收資訊的 lpPrivateOutputData 指標應指向可放置替代或重複設定資料結構的區域、AMVABUFFERINFO 陣列的 pamvaBufferInfo 指標應為 Null、Null、 和 dwNumBuffers 應為零。 傳回的 HRESULT 包含S_OK或S_FALSE指示,或E_FAIL或E_INVALIDARG或其他錯誤指示 HRESULT,在通訊協定執行發生嚴重問題時, (例如不正確組態參數) 。 針對所有使用DXVA_ConfigQueryOrReplyFunc的 IAMVideoAccelerator::Execute 呼叫,都應該在對 IAMVideoAccelerator::Execute的所有其他呼叫之前。
如果 dwFunction 包含DXVA_EncryptProtocolFunc, lpPrivateInputData 指標會將資料傳遞至此呼叫中的加速器,應該指向以 DXVA_EncryptProtocolHeader 開頭的加密通訊協定資料結構,lpPrivateOutputData 指標會指向從加速器接收資訊的 lpPrivateOutputData 指標應指向要傳回 (的區域,例如加密通訊協定) 所傳回的憑證 (,其開頭為 DXVA_EncryptProtocolHeader) , AMVABUFFERINFO 陣列的 pamvaBufferInfo 指標應為 Null,而 dwNumBuffers 應為零。 傳回的 HRESULT 包含S_OK,只要加密通訊協定正常運作,並包含E_FAIL或E_INVALIDARG或其他錯誤指示 HRESULT,當通訊協定執行發生嚴重問題時。
以上述方式初始化作業之後,解碼器的實際作業會繼續進行,如下所示:
IAMVideoAccelerator::BeginFrame 必須先呼叫,再傳送含有壓縮緩衝區參數的任何bDXVA_Func,這會導致寫入未壓縮的目的地介面。 IAMVideoAccelerator::BeginFrame在 DirectX VA 中的目的是將目的地介面與索引值產生關聯,並通知視訊加速器驅動程式起始寫入介面,讓驅動程式可以回應是否準備好覆寫介面的指示。 傳入IAMVideoAccelerator::BeginFrame的AMVABeginFrameInfo結構應該包含 pInputData 指標,指向單一 WORD wBeginPictureIndex 參數,符合傳遞至IAMVideoAccelerator::BeginFrame (,而 dwSizeInputData 應為 2) 。 這是在壓縮緩衝區中使用的索引,用來命令寫入介面 (例如,做為 wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex) 。 每個 IAMVideoAccelerator::BeginFrame 的呼叫都應該與 IAMVideoAccelerator::EndFrame 的對應呼叫配對,如下所示。 例如,如果要將壓縮的圖片解碼,然後使用前端緩衝區對緩衝區混合與圖形影像進行 Alpha 混合,則會在傳遞用來解碼圖片的所有壓縮緩衝區之後呼叫 IAMVideoAccelerator::BeginFrame ,再將壓縮的圖片解碼成 wDecodedPictureIndex 中指定的表面,然後在傳遞用來解碼圖片的所有壓縮緩衝區之後呼叫 IAMVideoAccelerator::EndFrame , 接著,先呼叫 IAMVideoAccelerator::BeginFrame ,再命令將圖形來源與已解碼的圖片組合合併成 wBlendedDestinationIndex 中指定的表面,然後在 Alpha 混合作業之後第二次呼叫 IAMVideoAccelerator::EndFrame 。AMVABeginFrameInfo 中的指標 pOutputData 應該是 Null (,而 dwSizeOutputData 應為 「0」) 。 IAMVideoAccelerator::BeginFrame所傳回的 HRESULT 應該是:
- 如果未壓縮的介面可供使用且可供使用,S_OK。
- E_PENDING如果未壓縮的介面尚未可供使用,但很快就會 (未壓縮的介面正在讀取以顯示,且尚未完成表面的讀取/顯示) 。
- 只有在偵測到資料格式或通訊協定錯誤時,E_FAIL或E_INVALIDARG其他錯誤指示 (,例如 dwSizeInputData 或非Null pOutputData) 等不正確的值。
DXVA 函式指示和相關聯的資料緩衝區會使用 IAMVideoAccelerator::Execute來傳送。 在對 IAMVideoAccelerator::Execute的相同呼叫中,可能會指出多個bDXVA_Func值。 bDXVA_Func值應該封裝到呼叫的 dwFunction 參數中,並在八個 MSB 中使用第一個函式命令、下一個八位中的下一個命令等等,其中任何剩餘的位都會以零填補。 bDXVA_Func的值0xFF表示bDXVA_Func延伸至兩個或四個位元組。 如果第二個位元組也0xFF,這表示bDXVA_Func會延伸至四個位元組。 如果第三個位元組的上四個位0xF或0x0,這表示bDXVA_Func包含DXVA_ConfigQueryOrReplyFunc或DXVA_EncryptProtocolFunc。 多位元組命令不得表示接續超過 dwFunction 的結尾。 解碼器必須小心,以確保在與 IAMVideoAccelerator::Execute 相同呼叫中指定的不同bDXVA_Func值之間沒有循序相依性,以及所有可能的競爭狀況 (,例如圖片解碼和子圖片混合之間、子圖片載入和子圖片混合之間,等等,) 都無法透過 對 IAMVideoAccelerator 的適當呼叫來防止:BeginFrame 和 IAMVideoAccelerator::QueryRenderStatus ,之後再呼叫 IAMVideoAccelerator::Execute。
如果 dwFunction 包含DXVA_ConfigQueryOrReplyFunc,則 lpPrivateInputData 指標會將資料傳遞至此呼叫中的快速鍵應指向設定資料結構,lpPrivateOutputData 指標會指向從加速器接收資訊的 lpPrivateOutputData 指標應指向可放置替代或重複設定資料結構的區域、AMVABUFFERINFO 陣列的 pamvaBufferInfo 指標應為 Null、Null、 和 dwNumBuffers 應為零。 傳回的 HRESULT 包含回應查詢的S_OK或S_FALSE指示,或在通訊協定 (執行發生嚴重問題時E_FAIL或E_INVALIDARG一些其他錯誤指示 HRESULT,例如 invalid.configuration 參數) 。 針對所有使用DXVA_ConfigQueryOrReplyFunc的 IAMVideoAccelerator::Execute 呼叫,都應該在對 IAMVideoAccelerator::Execute的所有其他呼叫之前。
如果 dwFunction 包含DXVA_EncryptProtocolFunc, lpPrivateInputData 指標會將資料傳遞至此呼叫中的加速器,應該指向以 DXVA_EncryptProtocolHeader 開頭的加密通訊協定資料結構,lpPrivateOutputData 指標會指向從加速器接收資訊的 lpPrivateOutputData 指標應指向要傳回 (的區域,例如加密通訊協定) 所傳回的憑證 (,其開頭為 DXVA_EncryptProtocolHeader) , AMVABUFFERINFO 陣列的 pamvaBufferInfo 指標應為 Null,而 dwNumBuffers 應為零。 傳回的 HRESULT 包含S_OK,只要加密通訊協定正常運作,並包含E_FAIL或E_INVALIDARG或其他錯誤指示 HRESULT,當通訊協定執行發生嚴重問題時。
如果 dwFunction 不包含DXVA_ConfigQueryOrReplyFunc或DXVA_EncryptProtocolFunc,則傳遞資料的 lpPrivateInputData 指標應該指向緩衝區描述清單。 每個緩衝區的緩衝區描述清單結構中的前四個專案 (dwTypeIndex、dwBufferIndex、dwDataOffset 和 dwDataSize) 應等於相同緩衝區的 AMVABUFFERINFO 資料結構中的專案。 如果在 dwFunction 中指定bDXVA_Func等於 「1」,且 bPicReadbackRequests 為 「1」,則從加速器接收資訊的 lpPrivateOutputData 指標應該指向持續性記憶體 (的區域,例如堆積) 填入加速器的讀取後宏區塊資料, (這類資料不保證存在,直到 IAMVideoAccelerator:用於 寫入相同圖片參數緩衝區的 QueryRenderStatus 表示S_OK,如下列專案 10 所述) 。 否則,從加速器接收資訊的 lpPrivateOutputData 指標應該指向單一 DWORD,以設定為下列其中一個指示值, (特別適用于在非主機 VLD 作業中報告位流錯誤) 。
值 描述 0 執行確定。 1 發生資料格式的次要問題。 2 發生資料格式的重大問題。 3 資料格式發生嚴重問題。 4 發生其他嚴重問題。 如果指出任一類型的「嚴重」問題,除非可以採取更正動作,否則軟體解碼器應該停止操作函式 () 。 在圖片的緩衝區轉譯完成之後,主機才能讀取從加速器傳回的資料,如 IAMVideoAccelerator::QueryRenderStatus所測試。 傳回的 HRESULT 包含S_OK,只要介面作業正常運作,而且可能會在發生嚴重問題時傳回E_FAIL或E_INVALIDARG或其他錯誤指示 HRESULT。
當使用 IAMVideoAccelerator::Execute 與 bDXVA_Func等於 「1」 時,圖片解碼參數緩衝區應該是傳送給每個圖片的第一個緩衝區,而且在解碼位資料流程中圖片的所有緩衝區,都應該在解碼後續圖片的任何緩衝區之前傳送。 如果傳送宏區塊控制項命令緩衝區,則應該傳送對應的剩餘差異資料緩衝區 (包含相同宏區塊的資料,) 使用相同的 IAMVideoAccelerator::Execute 呼叫。
IAMVideoAccelerator::EndFrame 必須在傳送所有壓縮的緩衝區之後呼叫,這會導致在指定的未壓縮表面中建立輸出內容, (針對 wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex) 所指定的作業結果。 呼叫 IAMVideoAccelerator::EndFrame 的目的是通知視訊加速器硬體,指出已傳送指定作業所需的所有資料。 要透過 IAMVideoAccelerator::EndFrame 傳送下游之資料的指標應該指向包含結束框架索引的單一 WORD wEndPictureIndex。 此參數在傳送相關的壓縮緩衝區之前,應該比對 在呼叫 IAMVideoAccelerator::BeginFrame 中指定的 wBeginPictureIndex 值。 後續呼叫 IAMVideoAccelerator::EndFrame, 任何圖片的 wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestindex 或 wPicResampleDestPicIndex 的未壓縮表面都不能找到,直到發出另一個呼叫 IAMVideoAccelerator::BeginFrame 之後才會發出,以宣告會發生此情況,並傳回S_OK作為結果。 不過,該目的地介面索引可能會在後續讀取存取命令中發生,例如 wForwardRefPictureIndex、wBackwardRefPictureIndex、wPicResampleSourcePicIndex 或 bRefPicSelect[i]。 除非有某種資料格式或通訊協定錯誤,否則 IAMVideoAccelerator::EndFrame 所傳回的 HRESULT 必須S_OK,在此情況下,它可以E_FAIL或E_INVALIDARG或其他一些錯誤指示。
例如,在欄位型解碼 (的情況下,在 MPEG-2 位資料流程中,) bitstream 中不會有一對一的功能圖片對應到快速鍵介面中未壓縮的介面。 在 MPEG-2 位資料流程中解碼欄位圖片時,將會有兩個「圖片」解碼,以產生一個未壓縮的輸出完整介面。 在 DirectX VA 介面定義中,每個框架都會對應至 wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex 的每個用法。 因此,將欄位圖片解碼成未壓縮表面需要兩對 IAMVideoAccelerator::BeginFrame 和 IAMVideoAccelerator::EndFrame 的呼叫。
呼叫 IAMVideoAccelerator::QueryRenderStatus 且 dwFlags 等於零,在呼叫具有特定 wEndPictureIndex 的 IAMVideoAccelerator::EndFrame 之後發生,並檢查在 wDecodedPictureIndex 中包含 wEndPictureIndex 的緩衝區狀態。 wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex 會傳回S_OK指示,如果將資料寫入未壓縮表面的所有作業都已完成如果作業尚未完成,則會傳回E_PENDING。 E_FAIL或E_INVALIDARG或其他錯誤指示可能會在通訊協定錯誤時傳回。
相關主題