DirectX 影片加速 IAMVideoAccelerator作規格
[與此頁面相關聯的功能,DirectShow是舊版功能。 它已被 MediaPlayer、imfMediaEngine 取代,並在媒體基金會 音訊/視訊擷取。 這些功能已針對 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,並列在 IAMVideoAccelerator::GetVideoAcceleratorGUIDs中。 此清單中不應傳送「無加密」GUID DXVA_NoEncrypt,因為其支援是必要的,因此為隱含。
呼叫 IPin::ReceiveConnection 嘗試連線到下游輸入針腳之後,譯碼器的 IAMVideoAcceleratorNotify::GetCreateVideoAcceleratorData 應傳回包含連線模式資訊的DXVA_ConnectMode數據結構的指標。 IAMVideoAccelerator::GetCompBufferInfo 應以 *pdwNumTypesCompBuffers = 16 呼叫,並根據類型號碼的慣例傳回壓縮的緩衝區資訊 每個緩衝區(如 DirectX VA 規格的第 3.4 節中所定義)可以直接當做以零起始的索引作為傳回 AMVACompBufferInfo 數組 數據結構。 這需要針對不會使用的任何緩衝區類型(包括緩衝區類型 0,因為沒有定義使用該緩衝區類型),加速器驅動程式會提供 AMVACompBufferInfo 數據結構,並具有某種形式的 “dummy” 參數值(例如 dwNumCompBuffers=0、dwWidthToCreate=0、dwHeightToCreate=0 和 dwBytesToAllocate=0)。
DXVA 函式指示和相關聯的數據緩衝區會使用 IAMVideoAccelerator::Execute來傳送。 DXVA 函式會在呼叫的 dwFunction 參數中指出。 唯一與初始化相關的 DXVA 函式是DXVA_ConfigQueryOrReplyFunc和DXVA_EncryptProtocolFunc。
如果 dwFunction 包含DXVA_ConfigQueryOrReplyFunc,將數據傳遞至此呼叫中快捷鍵的 lpPrivateInputData 指標應指向組態數據結構,lpPrivateOutputData 指標會指向可放置替代或重複組態數據結構的區域,AMVABUFFERINFO 陣列的 pamvaBufferInfo 指標應 NULL。 和 dwNumBuffers 應為零。 傳回的 HRESULT 包含S_OK或S_FALSE指示,或E_FAIL或E_INVALIDARG或其他錯誤指示 HRESULT,當通訊協定執行發生嚴重問題時(例如無效的組態參數)。 所有呼叫 IAMVideoAccelerator::Execute 的所有使用DXVA_ConfigQueryOrReplyFunc,都應該在所有其他呼叫之前,IAMVideoAccelerator::Execute。
如果 dwFunction 包含DXVA_EncryptProtocolFunc,lpPrivateInputData 指標將數據傳遞至此呼叫中的加速器,應指向以 DXVA_EncryptProtocolHeader 開頭的加密通訊協定數據結構,lpPrivateOutputData 指標會指向加密通訊協定傳回數據的區域(例如憑證),其開頭為DXVA_EncryptProtocolHeader, AMVABUFFERINFO 陣列的 pamvaBufferInfo 指標應 NULL,而 dwNumBuffers 應為零。 傳回的 HRESULT 包含S_OK,只要加密通訊協定正常運作,且在通訊協定執行發生嚴重問題時,會包含E_FAIL或E_INVALIDARG或其他錯誤指示 HRESULT。
以上述方式初始化作業之後,譯碼器的實際作業會繼續進行,如下所示:
IAMVideoAccelerator::BeginFrame 之前,必須先呼叫任何具有壓縮緩衝區參數的bDXVA_Func,這會導致寫入未壓縮的目的地介面。 在 DirectX VA 中 IAMVideoAccelerator::BeginFrame 的目的是讓目的地介面與索引值產生關聯,並通知影片加速器驅動程式起始寫入介面的目的,讓驅動程式可以回應是否準備好覆寫介面的指示。 AMVABeginFrameInfo 結構傳遞 IAMVideoAccelerator::BeginFrame 應包含 pInputData 指標給單一 WORD wBeginPictureIndex 參數,其符合傳入 IAMVideoAccelerator::BeginFrame 的框架索引(而 dwSizeInputData 應為 2)。 這是要用於壓縮緩衝區以命令寫入介面的索引(例如,要當做 wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex)。 IAMVideoAccelerator::BeginFrame 的每個呼叫,都應該與對應呼叫 IAMVideoAccelerator::EndFrame 配對,如下所述。 例如,如果要譯碼壓縮的圖片,然後使用前端緩衝區對緩衝區混合與圖形影像進行 Alpha 混合, 在將壓縮的圖片譯碼為 wDecodedPictureIndex 中指定的表面之前,會先呼叫 IAMVideoAccelerator::BeginFrame,然後在傳遞用來譯碼圖片的所有壓縮緩衝區之後,呼叫 IAMVideoAccelerator::EndFrame。 接著第二次呼叫 IAMVideoAccelerator::BeginFrame,然後命令圖形來源的 Alpha 混合組合,並將譯碼的圖片轉換成 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 指標會指向可放置替代或重複組態數據結構的區域,AMVABUFFERINFO 陣列的 pamvaBufferInfo 指標應 NULL。 和 dwNumBuffers 應為零。 傳回的 HRESULT 包含回應查詢的S_OK或S_FALSE指示,或在通訊協定執行發生嚴重問題時E_FAIL或E_INVALIDARG某些其他錯誤指示 HRESULT(例如 invalid.configuration 參數)。 所有呼叫 IAMVideoAccelerator::Execute 的所有使用DXVA_ConfigQueryOrReplyFunc,都應該在所有其他呼叫之前,IAMVideoAccelerator::Execute。
如果 dwFunction 包含DXVA_EncryptProtocolFunc,lpPrivateInputData 指標將數據傳遞至此呼叫中的加速器,應指向以 DXVA_EncryptProtocolHeader 開頭的加密通訊協定數據結構,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。
當使用 bDXVA_Func IAMVideoAccelerator::Execute 等於 “1” 時,圖片譯碼參數緩衝區應該是針對每個圖片譯碼所傳送的第一個緩衝區之一,而且所有用於譯碼位數據流中圖片的緩衝區,都必須在譯碼後續圖片的任何緩衝區之前傳送。 如果傳送巨集區塊控件命令緩衝區,應傳送對應的剩餘差異數據緩衝區(包含相同巨集區塊的數據),並使用相同的 IAMVideoAccelerator::Execute 呼叫。
IAMVideoAccelerator::EndFrame 必須在傳送所有壓縮緩衝區之後呼叫,這會導致在指定的未壓縮介面中建立輸出內容(針對 wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex 指定的作業結果)。 此呼叫 IAMVideoAccelerator::EndFrame 的目的是通知視訊加速器硬體已傳送指定作業所需的所有數據。 要透過 IAMVideoAccelerator::EndFrame 傳送下游之數據的指標應該指向包含結束框架索引的單一 WORD wEndPictureIndex。 此參數應該符合在傳送相關的壓縮緩衝區之前,先呼叫 IAMVideoAccelerator::BeginFrame 中指定的 wBeginPictureIndex 值。 在呼叫 IAMVideoAccelerator::EndFrame之後,任何圖片的 wDecodedPictureIndex 中都找不到索引為 wEndPictureIndex 的未壓縮表面, wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex 直到另一次呼叫 IAMVideoAccelerator::BeginFrame 發出,以宣佈會發生此情況,並傳回結果S_OK。 不過,該目的地介面索引可能會在後續讀取存取命令中發生,例如 wForwardRefPictureIndex、wBackwardRefPictureIndex、wPicResampleSourcePicIndex 或 bRefPicSelect[i]。 除非有某種數據格式或通訊協定錯誤,否則 IAMVideoAccelerator::EndFrame 所傳回的 HRESULT 應S_OK,在此情況下,它可以E_FAIL或E_INVALIDARG或其他錯誤指示。
在欄位型譯碼的情況下(例如,在 MPEG-2 位數據流中),不會有一對一的位流功能圖片對應到快捷鍵介面中未壓縮的表面。 在 MPEG-2 位數據流中譯碼字段圖片時,將會有兩個「圖片」譯碼,以產生一個完整的輸出未壓縮表面。 在 DirectX VA 介面定義中,每個畫面都會對應至 wDecodedPictureIndex、wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex 的每個用法。 因此,若要將欄位圖片譯碼成輸出未壓縮表面,需要兩對對 IAMVideoAccelerator::BeginFrame 和 IAMVideoAccelerator::EndFrame 的呼叫。
呼叫 IAMVideoAccelerator::QueryRenderStatus,dwFlags 等於零,有時會在呼叫 IAMVideoAccelerator::EndFrame 特定 wEndPictureIndex,並檢查在 wDecodedPictureIndex 中包含 wEndPictureIndex 的緩衝區狀態, wDeblockedPictureIndex、wBlendedDestinationIndex 或 wPicResampleDestPicIndex 會傳回S_OK指示,如果將數據寫入未壓縮介面的所有作業都有已完成,如果作業尚未完成,則會傳回E_PENDING。 E_FAIL或E_INVALIDARG或其他錯誤指示可能會在通訊協定錯誤時傳回。
相關主題