專利名稱::加速視頻編碼的制作方法加速視頻編碼相關(guān)申請(qǐng)本申請(qǐng)是2006年2月24日提交的題為"AcceleratedVideoEncoding(加速視頻編碼)"的共同待審的美國專利申請(qǐng)第11/276,336號(hào)的部分延續(xù),并且該申請(qǐng)通過引用結(jié)合于此。背景多媒體內(nèi)容產(chǎn)生和分發(fā)操作通常包括視頻編碼。視頻編碼過程通常是非常數(shù)據(jù)和計(jì)算密集型的。結(jié)果,視頻編碼過程可能是非常耗時(shí)的。例如,軟件編碼器編碼一高質(zhì)量高清電影可能要花費(fèi)數(shù)十小時(shí)。由于視頻編碼過程的質(zhì)量和速度對(duì)于成功的多媒體內(nèi)容產(chǎn)生和分發(fā)流水線而言是重要因素,因此提高能編碼高質(zhì)量視頻內(nèi)容的速度的系統(tǒng)和技術(shù)將是有用的。概述提供本概述是為了用簡化的形式介紹將在以下詳細(xì)描述中進(jìn)一步描述的一些概念。本概述不旨在標(biāo)識(shí)所要求保護(hù)的主題的關(guān)鍵特征或必要特征,也不旨在用于幫助確定所要求保護(hù)的主題的范圍。鑒于以上原因,描述了一種提高視頻編碼的速度和質(zhì)量中的一個(gè)或多個(gè)的視頻編碼加速服務(wù)。該服務(wù)擔(dān)當(dāng)任意視頻編碼器計(jì)算機(jī)程序應(yīng)用程序和任意視頻加速硬件之間的中介。該服務(wù)從視頻編碼器接收一個(gè)或多個(gè)查詢以標(biāo)識(shí)視頻加速硬件的實(shí)現(xiàn)細(xì)節(jié)。該服務(wù)與視頻加速硬件接口以獲得該實(shí)現(xiàn)細(xì)節(jié)。該服務(wù)將該實(shí)現(xiàn)細(xì)節(jié)傳送到視頻編碼器。該實(shí)現(xiàn)細(xì)節(jié)使得視頻編碼器能夠(a)確定與視頻編碼器相關(guān)聯(lián)的軟件編碼操作的速度和質(zhì)量中的一個(gè)或多個(gè)是否能用一個(gè)或多個(gè)支持的編碼流水線配置和能力的流水線的實(shí)現(xiàn)來提高,以及(b)通過與該服務(wù)交互來實(shí)現(xiàn)該流水線。附圖簡述在附圖中,組件參考標(biāo)號(hào)最左邊的數(shù)字標(biāo)識(shí)了該組件首次出現(xiàn)的特定附圖。圖1示出根據(jù)一個(gè)實(shí)施例的用于加速視頻編碼的示例性系統(tǒng)。圖2示出了視頻編碼流水線配置的一個(gè)示例性實(shí)施例,其中某些編碼過程在硬件中加速。圖3示出根據(jù)一個(gè)實(shí)施例的用于加速視頻編碼的示例性過程。附錄中的圖4示出了根據(jù)一個(gè)實(shí)施例的示例性視頻編碼器應(yīng)用程序,其示出了可以利用該視頻編碼器加速應(yīng)用程序編程接口的方式。附錄中的圖5示出了根據(jù)一個(gè)實(shí)施例的一個(gè)示例性視頻編碼流水線配置,其中加速硬件加速了運(yùn)動(dòng)估計(jì)、變換、量化和反過程以產(chǎn)生已編碼圖像。附錄中的圖6示出了根據(jù)一個(gè)實(shí)施例的示例性視頻編碼流水線配置,其中硬件僅加速運(yùn)動(dòng)估計(jì)。附錄中的圖7示出了根據(jù)一個(gè)實(shí)施例的若干示例性運(yùn)動(dòng)估計(jì)參數(shù)。附錄中的圖8示出了根據(jù)一個(gè)實(shí)施例的儲(chǔ)存在顯示三維(D3D)表面中的示例性運(yùn)動(dòng)矢量數(shù)據(jù)。附錄中的圖9示出了根據(jù)一個(gè)實(shí)施例的指示亮度表面的寬度匹配原始YCbCr圖像的示例性圖示。附錄中的圖10示出了根據(jù)一個(gè)實(shí)施例的指示視頻的每行殘差值的數(shù)量是原始視頻圖像的寬度的K的示例性圖示。附錄中的圖11示出了根據(jù)一個(gè)實(shí)施例的指示殘差表面的寬度是原始逐行幀的寬度的%的示例性圖示。詳細(xì)描述概覽用于加速視頻編碼的系統(tǒng)和方法提供了一種視頻編碼加速服務(wù)。該服務(wù)允許任意視頻編碼器應(yīng)用程序以設(shè)備無關(guān)的方式與任意視頻加速硬件接口以定義并實(shí)現(xiàn)基本上最優(yōu)的視頻編碼流水線。為此,該服務(wù)展示了視頻加速(VA)應(yīng)用程序接口(API)。這些API封裝了視頻編碼過程的模型。為定義編碼流水線,該視頻編碼器應(yīng)用程序使用VAAPI來查詢可用視頻(圖形)加速硬件的實(shí)現(xiàn)細(xì)節(jié)(例如能力等)。該視頻編碼器鑒于應(yīng)用程序的特定視頻編碼體系結(jié)構(gòu)(軟件實(shí)現(xiàn)的)來評(píng)估這些細(xì)節(jié)以標(biāo)識(shí)可從在硬件中加速而獲益(例如,速度和/或質(zhì)量上獲益)的任何編碼操作。這些操作包括,例如運(yùn)動(dòng)估計(jì)、變換和量化操作,以及諸如運(yùn)動(dòng)補(bǔ)償、反變換和反量化等反操作。該API還允許視頻編碼器設(shè)計(jì)基本上最小化了與主機(jī)計(jì)算設(shè)備和加速硬件相關(guān)聯(lián)的總線和處理器上的數(shù)據(jù)流轉(zhuǎn)移的編碼流水線,并且因此進(jìn)一步提高了編碼速度。該API還允許加速硬件影響數(shù)據(jù)的定位以改善本地高速緩存(例如,視頻加速硬件可在對(duì)視頻硬件本地的存儲(chǔ)器上更高效地運(yùn)作)?;谶@些評(píng)估,該視頻編碼器設(shè)計(jì)了一種在軟件中執(zhí)行部分編碼操作并使用加速硬件執(zhí)行部分編碼操作(即,可從硬件加速中獲益的操作的至少一個(gè)子集)的定制視頻編碼流水線。該編碼器應(yīng)用程序然后使用該API來創(chuàng)建該流水線并編碼視頻內(nèi)容。該定制流水線與完全軟件實(shí)現(xiàn)的流水線相比基本得到優(yōu)化,因?yàn)槟承┚幋a操作被加速,并且主機(jī)和加速硬件之間的數(shù)據(jù)轉(zhuǎn)移被最小化。另外,通過加速編碼過程的某些方面并最小化數(shù)據(jù)轉(zhuǎn)移而釋放的處理時(shí)間允許主機(jī)處理器以被釋放的處理周期來執(zhí)行更高質(zhì)量的編碼操作。該API還被設(shè)計(jì)成允許組件并行地操作以使計(jì)算資源使用能被最大化。用于加速視頻編碼的系統(tǒng)和方法的這些和其它方面現(xiàn)將更詳細(xì)地討論。示例性系統(tǒng)盡管并非所需,但用于加速視頻編碼的系統(tǒng)和方法在由諸如個(gè)人計(jì)算機(jī)和圖形(視頻)編碼加速硬件等計(jì)算設(shè)備執(zhí)行的計(jì)算機(jī)可執(zhí)行指令(程序模塊)的一般上下文中描述。程序模塊一般包括執(zhí)行特定任務(wù)或?qū)崿F(xiàn)特定抽象數(shù)據(jù)類型的例程、程序、對(duì)象、組件、數(shù)據(jù)結(jié)構(gòu)等。圖1示出了根據(jù)一個(gè)實(shí)施例的用于加速視頻編碼的示例性系統(tǒng)100。系統(tǒng)100包括主機(jī)計(jì)算設(shè)備102。主機(jī)計(jì)算設(shè)備102表示任何類型的計(jì)算設(shè)備,諸如個(gè)人計(jì)算機(jī)、膝上型計(jì)算機(jī)、服務(wù)器、手持式或移動(dòng)計(jì)算設(shè)備等等。主機(jī)計(jì)算設(shè)備102包括通過總線103耦合到存儲(chǔ)器106的一個(gè)或多個(gè)處理單元104。系統(tǒng)存儲(chǔ)器106包括計(jì)算機(jī)程序模塊("程序模塊")108和程序數(shù)據(jù)110。處理器104從程序模塊108中相應(yīng)的模塊中取出并執(zhí)行計(jì)算機(jī)程序指令。程序模塊108包括用于處理視頻內(nèi)容的視頻處理模塊112,以及諸如操作系統(tǒng)、設(shè)備驅(qū)動(dòng)程序(例如,用于接口到視頻編碼加速硬件等)和/或其它等的其它程序模塊114。視頻處理模塊112包括,例如視頻編碼器116、視頻編碼加速服務(wù)118、以及其它處理模塊120,例如視頻解碼器、視頻過濾器和視頻呈現(xiàn)器等等。在此實(shí)現(xiàn)中,視頻編碼器116是任意視頻編碼器。這意味著由視頻編碼器116實(shí)現(xiàn)和/或利用的特定體系結(jié)構(gòu)、操作、數(shù)據(jù)格式等是任意的。例如,視頻編碼器116可以通過第三方、OEM等來分發(fā)。另外,盡管圖l示出了獨(dú)立于操作系統(tǒng)的"其它程序模塊"114部分的視頻編碼加速服務(wù)118,但是在一個(gè)實(shí)現(xiàn)中,視頻編碼加速服務(wù)118是操作系統(tǒng)的一部分。視頻處理模塊112接收壓縮的或未壓縮的輸入視頻數(shù)據(jù)122。當(dāng)輸入視頻數(shù)據(jù)122是壓縮(已編碼)的時(shí)候,視頻處理模塊112解碼該輸入視頻數(shù)據(jù)122以產(chǎn)生已解碼源視頻數(shù)據(jù)。這一解碼操作由解碼器模塊來執(zhí)行。在另一實(shí)現(xiàn)中,也可保留部分解碼的數(shù)據(jù)以便進(jìn)一步協(xié)助編碼過程。出于示例性說明的目的,這一解碼器模塊被示為"其它視頻處理模塊"120的相應(yīng)部分。由此,已解碼源視頻數(shù)據(jù)或者由在已解碼狀態(tài)下接收到的輸入視頻數(shù)據(jù)122來表示,或者用對(duì)在己編碼狀態(tài)下接收到的輸入視頻數(shù)據(jù)122進(jìn)行解碼的結(jié)果來表示。已解碼源視頻數(shù)據(jù)被示為"其它程序數(shù)據(jù)"124的相應(yīng)部分。為設(shè)計(jì)并實(shí)現(xiàn)能用于將已解碼源視頻數(shù)據(jù)編碼成已編碼視頻數(shù)據(jù)126的定制視頻編碼流水線,視頻編碼器116經(jīng)由視頻加速(VA)API128與視頻編碼加速服務(wù)118接口。VAAPI128的多種可能實(shí)現(xiàn)的一個(gè)示例性實(shí)現(xiàn)在附錄中描述。為定義編碼流水線,視頻編碼器應(yīng)用程序使用VAAPI128中相應(yīng)的幾個(gè)(例如,參見附錄§3.4,IVideoEncoderService)以獲得可用加速硬件130的實(shí)現(xiàn)細(xì)節(jié)。這些實(shí)現(xiàn)細(xì)節(jié)包括,例如標(biāo)識(shí)加速硬件130的支持的視頻編碼流水線配置的枚舉陣列(例如,經(jīng)由在附錄§3.4.1中描述的GetCapabilities接口獲得);支持的視頻格式的指示(例如,MPEG、WMV等等;參見附錄的GetSupportedFormats,§3.4.2);用于運(yùn)動(dòng)估計(jì)(ME)操作的支持的搜索度量(參見附錄的GetDistanceMetrics,§3.4.3);用于處理時(shí)間與質(zhì)量之間的折衷判定的支持的搜索簡檔(參見附錄的GetSearchProfiles,§3.4.4);和/或支持的ME能力,例如圖像大小信息、最大搜索窗大小、可變宏塊支持指示等(參見附錄的GetMECapabilities,§3.4.5)響應(yīng)于從視頻編碼器116接收到這些請(qǐng)求,視頻編碼加速服務(wù)118向視頻加速硬件130査詢所請(qǐng)求的實(shí)現(xiàn)細(xì)節(jié)并從加速硬件130向視頻編碼器116返回與對(duì)應(yīng)的響應(yīng)相關(guān)聯(lián)的信息。視頻編碼加速服務(wù)118使用對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)程序與視頻加速硬件130接口。這一設(shè)備驅(qū)動(dòng)程序被示為"其它程序模塊"114的相應(yīng)部分。視頻編碼器116鑒于應(yīng)用程序的特定視頻編碼體系結(jié)構(gòu)(軟件實(shí)現(xiàn)的)來評(píng)估加速硬件130所支持的實(shí)現(xiàn)細(xì)節(jié)以標(biāo)識(shí)能從在硬件中加速而獲益(例如,速度和/或質(zhì)量上獲益)的任何編碼操作、選擇一搜索簡檔以封裝視頻編碼質(zhì)量和速度之間的折衷、最小化總線上和處理器之間的數(shù)據(jù)轉(zhuǎn)移等等??蓮挠布铀佾@益的示例性操作可包括,例如運(yùn)動(dòng)估計(jì)、變換和量化。例如,在硬件中執(zhí)行量化的一個(gè)原因是最小化流水線各階段之間的數(shù)據(jù)流。圖2示出了視頻編碼流水線配置的一個(gè)示例性實(shí)施例,其中某些編碼過程在硬件中加速。出于示例性說明和描述的目的,與圖2相關(guān)聯(lián)的操作和數(shù)據(jù)流參考圖1的組件中的特定幾個(gè)組件來描述。在該描述中,一參考標(biāo)號(hào)最左邊的數(shù)字指示其中首次引入該組件/數(shù)據(jù)路徑/引用的項(xiàng)目的特定附圖。例如,流水線200的最左邊的數(shù)字是"2",指示它是在圖2中首次引入的。在此示例中,編碼流水線200是由與視頻編碼服務(wù)118接口的視頻編碼器116(圖1)來配置/定制的,使得由主機(jī)102中的相應(yīng)幾個(gè)實(shí)現(xiàn)的處理操作在硬件130中加速。出于說明的目的,在圖2中的加粗虛線的右側(cè)所示的處理操作由硬件(例如,圖1的加速硬件130)來加速,而該圖的左側(cè)所示的處理操作由主機(jī)計(jì)算設(shè)備102(圖1)來執(zhí)行。在編碼流水線200中,以未加粗的虛線示出了可任選地配置的數(shù)據(jù)訪問通路。橢圓204和212表示相應(yīng)的原始和已編碼圖像記憶存儲(chǔ)。在該示例實(shí)現(xiàn)中,視頻編碼器116(圖1)取某一形式的己壓縮或未壓縮視頻數(shù)據(jù)202(還請(qǐng)參見圖1的輸入視頻數(shù)據(jù)122)作為輸入。請(qǐng)注意,如果源202不是源自主機(jī)102且如果主機(jī)決策制定引擎(例如,視頻編碼器116)不使用源視頻,則圖2的示例性流水線配置并不將輸入源視頻202("原始視頻源")復(fù)制到主機(jī)計(jì)算設(shè)備102。例如,如果量化決策不要求主機(jī)接觸視頻數(shù)據(jù),則將不傳輸該數(shù)據(jù)。在此示例中,流水線200被配置成使用塊206、208和214到218中的相應(yīng)操作將輸入數(shù)據(jù)202轉(zhuǎn)換成另一壓縮形式。這些操作可包括將未壓縮(YUV)視頻數(shù)據(jù)轉(zhuǎn)換成壓縮的MPEG-2,或者它可包括將視頻數(shù)據(jù)從MPEG-2數(shù)據(jù)格式譯碼成WMV數(shù)據(jù)格式。出于示例性說明的目的,假設(shè)譯碼操作包括完全或部分解壓階段后跟一編碼階段(存在繞過解壓并完全在變換(DCT)空間中工作的更高效的模型)。多個(gè)視頻壓縮格式利用了運(yùn)動(dòng)估計(jì)、變換和量化來實(shí)現(xiàn)壓縮。在壓縮階段中,運(yùn)動(dòng)估計(jì)通常是最慢的步驟,包括其中編碼器(例如,視頻編碼器116)試圖為給定圖像中的宏塊找到最接近的匹配參考宏塊的大量搜索操作。一旦對(duì)每一宏塊確定(例如,經(jīng)由框206)了最優(yōu)運(yùn)動(dòng)矢量,編碼器116就基于先前編碼的圖像和最優(yōu)運(yùn)動(dòng)矢量來計(jì)算差分殘差(例如,經(jīng)由框208)。運(yùn)動(dòng)矢量連同差分殘差一起是當(dāng)前圖像的緊湊表示。運(yùn)動(dòng)矢量數(shù)據(jù)被進(jìn)一步差分地表示。主機(jī)編碼器可任選地請(qǐng)求視頻加速硬件重新評(píng)估運(yùn)動(dòng)矢量以找出具有更小的組合運(yùn)動(dòng)矢量和/或殘差的宏塊。所得的差分運(yùn)動(dòng)矢量數(shù)據(jù)和殘差數(shù)據(jù)例如使用如行程長度編碼(RLE)和差分編碼(例如,哈夫曼和算術(shù)編碼)等技術(shù)來壓縮(例如,經(jīng)由塊218),以生成最終的已編碼比特流(已編碼視頻數(shù)據(jù)126)以便傳送到目的地(框218)來向用戶呈現(xiàn)。在此示例中,框206、208和214到218的操作(例如,諸如運(yùn)動(dòng)估計(jì)(206)、模式判定、運(yùn)動(dòng)矢量(MV)選擇和速率控制(208)、預(yù)測(cè)形成(210)、變換和量化操作(214)、反量化器和變換及版本(216)以及熵編碼(218)等操作)在本領(lǐng)域中是公知的,因此此處不再描述。再次參考圖l,在一個(gè)實(shí)現(xiàn)中,視頻編碼器116是為完全利用加速硬件130而提供的多線程應(yīng)用程序。在此實(shí)現(xiàn)中,當(dāng)確定哪些視頻編碼操作要在硬件中加速時(shí),視頻編碼器116可以結(jié)構(gòu)化特定流水線配置,使得處理器104和加速硬件130兩者都得到完全利用。例如,當(dāng)對(duì)于視頻數(shù)據(jù)的一特定幀,視頻編碼流水線運(yùn)動(dòng)估計(jì)操作是由硬件來執(zhí)行的時(shí)候,該流水線可被配置成由主機(jī)對(duì)該視頻數(shù)據(jù)的一不同幀在軟件中執(zhí)行熵(或算術(shù)或哈夫曼)編碼操作。表示所選/結(jié)構(gòu)化的特定流水線配置的一個(gè)示例性單運(yùn)動(dòng)矢量流水線以下在附錄的5丄1節(jié)中描述。其中視頻編碼器116向加速硬件130請(qǐng)求多個(gè)運(yùn)動(dòng)矢量并基于各參數(shù)來選擇一個(gè)運(yùn)動(dòng)矢量流水線的示例性多運(yùn)動(dòng)矢量(相對(duì)復(fù)雜的)流水線在以下附錄的5丄2節(jié)中描述。關(guān)于選擇搜索簡檔,運(yùn)動(dòng)矢量的質(zhì)量指的是通過使用運(yùn)動(dòng)矢量生成的流的比特率。高質(zhì)量運(yùn)動(dòng)矢量與低比特率流相關(guān)聯(lián)。質(zhì)量由塊搜索的完整性、算法的質(zhì)量、使用的距離度量等來確定。高質(zhì)量運(yùn)動(dòng)矢量應(yīng)用于執(zhí)行高質(zhì)量視頻編碼操作。為此,視頻編碼加速服務(wù)118提供一稱為搜索簡檔(searchprofile)的通用構(gòu)造以封裝質(zhì)量和時(shí)間之間的折衷。該搜索簡檔還包括標(biāo)識(shí)加速硬件130使用的搜索算法等的元數(shù)據(jù)。視頻編碼器116基于編碼器實(shí)現(xiàn)的特定要求選擇一特定的搜索簡檔。關(guān)于最小化總線上和處理器之間的數(shù)據(jù)轉(zhuǎn)移,由視頻編碼流水線配置實(shí)現(xiàn)的編碼過程通常包括若干處理階段,每一處理階段可以經(jīng)由或不經(jīng)由加速硬件130來加速。在其中視頻編碼器116確定在編碼流水線的連續(xù)階段中利用硬件加速的情況下,可能不必將數(shù)據(jù)從基于加速硬件130的存儲(chǔ)器132移至與主機(jī)計(jì)算設(shè)備102相關(guān)聯(lián)的系統(tǒng)存儲(chǔ)器106,然后移回基于加速硬件的存儲(chǔ)器132以便執(zhí)行下一階段,依此類推。更具體地,盡管指向各種類型的視頻和運(yùn)動(dòng)矢量數(shù)據(jù)的指針可以在主機(jī)計(jì)算設(shè)備102和加速硬件130之間來回傳輸,但是在一個(gè)實(shí)現(xiàn)中,實(shí)際數(shù)據(jù)僅在數(shù)據(jù)指針(D3D9表面指針)使用例如IDirect3DSurface9::LockRect明確地鎖定時(shí)才被復(fù)制到系統(tǒng)存儲(chǔ)器106。用于鎖定表面的示例性接口是已知的(例如,公知的IDirect3DSurface9::LockRect接口)。由此,在兩個(gè)編碼流水線階段彼此緊跟,并且主機(jī)計(jì)算設(shè)備102不需要執(zhí)行任何中間處理的情況下,主機(jī)計(jì)算設(shè)備102可決定不"鎖定"在處理階段之間已分配的緩沖區(qū)。這將防止對(duì)數(shù)據(jù)的冗余的存儲(chǔ)器復(fù)制,并且因此避免了不必要的數(shù)據(jù)移動(dòng)/傳輸。以此方式,視頻編碼器116設(shè)計(jì)了基本上最小化了總線上以及處理器之間的數(shù)據(jù)傳輸,且因此進(jìn)一步提高視頻編碼速度的視頻編碼流水線。此時(shí),視頻編碼器116己經(jīng)鑒于應(yīng)用程序的特定視頻編碼體系結(jié)構(gòu)(軟件實(shí)現(xiàn)的)評(píng)估了加速硬件130所支持的實(shí)現(xiàn)細(xì)節(jié)以標(biāo)識(shí)能從在硬件中加速獲益的任何編碼操作、選擇了搜索簡檔、最小化了總線上以及處理器之間的數(shù)據(jù)轉(zhuǎn)移、和/或其它等等。基于這些判定,視頻編碼器116選擇一特定流水線配置來編碼已加碼的源視頻數(shù)據(jù),并因此生成已編碼視頻數(shù)據(jù)126。接著,視頻編碼器116與視頻編碼加速服務(wù)118接口以創(chuàng)建一編碼器對(duì)象來實(shí)現(xiàn)所選的流水線(參見附錄中的CreateVideoEncoderAPI,§3.4.6)。在此實(shí)現(xiàn)中,編碼器對(duì)象(例如,常規(guī)的COM對(duì)象)是通過標(biāo)識(shí)所選流水線配置以及以下的一個(gè)或多個(gè)來創(chuàng)建的輸出的已編碼比特流的格式、與流水線配置相關(guān)聯(lián)的輸入和輸出數(shù)據(jù)流的數(shù)量、靜態(tài)配置特性、基于所選流水線配置用于與不同I/0流相關(guān)聯(lián)的建議的緩沖區(qū)(表面)數(shù)量、以及基于圖形驅(qū)動(dòng)程序能夠收集的資源的驅(qū)動(dòng)程序指定的分配符隊(duì)列大小、以及其它參數(shù)。(隊(duì)列大小和數(shù)據(jù)緩沖區(qū)的數(shù)量本質(zhì)上指的是相同的東西一個(gè)是"建議的",另一個(gè)是"實(shí)際的")。接著,視頻編碼器116使用所創(chuàng)建的編碼器對(duì)象來與視頻編碼加速服務(wù)118接口以對(duì)已解碼的源視頻數(shù)據(jù)進(jìn)行編碼。為此,編碼器對(duì)象向加速硬件130提交執(zhí)行請(qǐng)求(參見附錄中的IVideoEncode:ExecuteAPI,§3.2.3)。鑒于以上原因,系統(tǒng)100允許視頻編碼器應(yīng)用程序116的任意實(shí)現(xiàn)在運(yùn)行時(shí)定義并創(chuàng)建視頻編碼流水線配置以完全利用可用的視頻編碼加速硬件來提高編碼速度和質(zhì)量。作為這些運(yùn)行時(shí)配置操作的一部分,視頻編碼器116可使用VAAPI128來指定編碼流水線要實(shí)現(xiàn)交互式有向搜索(細(xì)化遞增的多遍搜索)、定義并使用一般可選擇的搜索策略(例如,基于獨(dú)立于關(guān)于所采用的實(shí)際算法的任何細(xì)節(jié)知識(shí)的質(zhì)量度量來選擇搜索算法)、利用格式無關(guān)方法(例如,其中視頻編碼器116不知道輸入視頻數(shù)據(jù)122的特定圖像格式,且加速硬件130不知道已編碼視頻數(shù)據(jù)126的壓縮的輸出格式)來控制搜索、自適應(yīng)數(shù)據(jù)大小(例如,其中視頻編碼器116基于搜索算法來選擇宏塊大小)等等。示例性過程圖3示出根據(jù)一個(gè)實(shí)施例的用于加速視頻編碼的示例性過程300。出于示例性描述的目的,參考圖1的系統(tǒng)100的各組件描述該過程的操作。一組件參考標(biāo)號(hào)最左邊的標(biāo)號(hào)指示首次描述該組件的特定附圖。在框302處,視頻編碼器116(圖1)接收輸入視頻數(shù)據(jù)122。如果輸入視頻數(shù)據(jù)122是未壓縮的,則該輸入視頻數(shù)據(jù)表示已解碼的源視頻數(shù)據(jù)。在框304處,如果輸入視頻數(shù)據(jù)122是壓縮的,則視頻編碼器116解壓該輸入視頻數(shù)據(jù)以生成已解壓的源視頻數(shù)據(jù)。在框306處,視頻編碼器116與VAAPI128接口以向加速硬件130查詢能力以及視頻編碼流水線配置實(shí)現(xiàn)細(xì)節(jié)。在框308處,視頻編碼器116在視頻編碼器116的實(shí)現(xiàn)的上下文內(nèi)評(píng)估支持的能力和實(shí)現(xiàn)細(xì)節(jié),以標(biāo)識(shí)與可從硬件加速獲益的視頻編碼器116的特定實(shí)現(xiàn)相關(guān)聯(lián)的視頻編碼操作、作出編碼速度和/或質(zhì)量決策、最小化總線上以及處理器之間的數(shù)據(jù)轉(zhuǎn)移和/或其它等等。在框310處,視頻編碼器116創(chuàng)建實(shí)現(xiàn)被配置成執(zhí)行所標(biāo)識(shí)的可從在加速硬件130中的硬件加速獲益的視頻編碼操作的編碼流水線的編碼對(duì)象、實(shí)現(xiàn)速度/質(zhì)量折衷(例如,經(jīng)由所選的搜索簡檔)、并最小化數(shù)據(jù)流轉(zhuǎn)移。在框312處,視頻編碼器使用所創(chuàng)建的編碼器對(duì)象來根據(jù)由在框310處生成的定制視頻編碼流水線描繪的操作序列和編碼體系結(jié)構(gòu)對(duì)己解碼源視頻數(shù)據(jù)進(jìn)行編碼???12的這些編碼操作生成已編碼視頻數(shù)據(jù)126(圖1)。結(jié)論盡管以對(duì)結(jié)構(gòu)特征和/或方法操作或動(dòng)作專用的語言描述了用于加速視頻編碼的系統(tǒng)和方法,但是可以理解,所附權(quán)利要求書中定義的實(shí)現(xiàn)不一定要限于所描述的具體特征或動(dòng)作。例如,盡管圖1的API128是在編碼視頻數(shù)據(jù)的上下文中描述的,但是API128可在編碼上下文之外用于諸如邊緣檢測(cè)、基于運(yùn)動(dòng)矢量的降噪、圖像穩(wěn)定、銳化、幀速率轉(zhuǎn)換、計(jì)算機(jī)視覺應(yīng)用程序的速率計(jì)算等其它功能的硬件加速。例如,關(guān)于降噪,在一個(gè)實(shí)現(xiàn)中,視頻編碼器116(圖1)對(duì)己解碼的源圖像數(shù)據(jù)的所有宏塊計(jì)算運(yùn)動(dòng)矢量。然后,視頻編碼器116利用運(yùn)動(dòng)幅值、方向和與周圍宏塊的運(yùn)動(dòng)矢量的相關(guān)來確定在輸入圖像中是否有局部對(duì)象運(yùn)動(dòng)。在此實(shí)現(xiàn)中,視頻編碼器116然后利用矢量的幅值來指導(dǎo)特定對(duì)象的對(duì)象跟蹤/過濾侵略性或平均移位以減少統(tǒng)計(jì)隨機(jī)噪聲。在關(guān)于圖像穩(wěn)定的另一示例中,在一個(gè)實(shí)現(xiàn)中,視頻編碼器116對(duì)所有宏塊和已解碼源數(shù)據(jù)計(jì)算運(yùn)動(dòng)矢量。視頻編碼器116然后確定圖像中是否有全局運(yùn)動(dòng)。這通過將所有運(yùn)動(dòng)矢量值相關(guān)并確定相關(guān)的矢量值是否相似來實(shí)現(xiàn)。如果是,則視頻編碼器116得出存在全局運(yùn)動(dòng)的結(jié)論。或者,視頻編碼器116利用大的宏塊大小并確定是否存在大宏塊的總體運(yùn)動(dòng)。在確定是否存在全局運(yùn)動(dòng)之后,如果視頻編碼器116還發(fā)現(xiàn)全局運(yùn)動(dòng)矢量趨向于跨幀急動(dòng),則視頻編碼器116得出存在照相機(jī)急動(dòng)的結(jié)論并在開始噪聲過濾和編碼操作之前補(bǔ)償這一急動(dòng)。因此,系統(tǒng)100的具體特征和操作是作為實(shí)現(xiàn)所要求保護(hù)的主題的示例性形式而公開的。附錄A示例性視頻編碼加速API視頻編碼本附錄描述了用于加速視頻編碼(也稱為VA編碼)的視頻編碼加速API128(圖l)的一個(gè)示例性實(shí)現(xiàn)的各方面。在此實(shí)現(xiàn)中,API128被設(shè)計(jì)成使得編碼和視頻處理應(yīng)用程序(例如,視頻編碼器模塊116)能夠利用加速硬件130(例如,GPU)對(duì)加速運(yùn)動(dòng)估計(jì)、殘差計(jì)算、運(yùn)動(dòng)補(bǔ)償和變換的支持。1目錄視頻編碼.................................................................................................111目^:..................................................................................................112示例性設(shè)計(jì).......................................................................................142.1編碼器布局..............................................................................142.2流水線或模式配置...................................................................142.2.1VA2—EncodePipe_Full.....................................................142.2.2VA2_EncodePipe—MotionEstimation..............................153示例性API.......................................................................................163.1接口定義..................................................................................163.1.1IVideoEncoder.................................................................163.1.2IVideoEncoderService.....................................................163.2方法IVideoEncoder.............................................................173.2.1GetBuffer.........................................................................173.2.2ReleaseBuffer...................................................................193.2.3Execute.............................................................................193.3數(shù)據(jù)結(jié)構(gòu)Execute.................................................................213.1.1VA2_Encode—ExecuteDataParameter.............................223.3.2VA2—Encode_ExecuteConfigurationParameter..............223.3.3DataParameter一MotionVectors.......................................233.3.4DataParameter一Residues................................................233.3.5DataParameter一InputImage............................................243.3.6DataParameter一ReferenceImages...................................243.3.7DataParameter_DecodedImage.......................................253.3.8VA2一Encode一Imagelnfo..................................................263.3.9ConfigurationParameter_MotionEstimatioii..................263.3.10VA2_Encode_SearchResolution....................................273.3.11VA2_Encode_SearchProfile..........................................273.3.12VA2—Encode_MBDescription........................................283.3.13VA2_Encode_SearchBounds.........................................293.3.14VA2—Encode_ModeType...............................................293.3.15ConfigurationParameter一Quaiitization........................303.4方法IVideoEncoderService.................................................313.4.1GetPipelineConfigurations..............................................313.4.2GetFormats......................................................................313.4.3GetDistanceMetrics.........................................................323.4.4GetSearchProfiles............................................................323.4.5GetMECapabilities..........................................................333.4.6CreateVideoEncoder.......................................................333.5數(shù)據(jù)結(jié)構(gòu)IVideoEncoderService..........................................353.5.1VA2_Encode—MECaps....................................................353.5.2VA2_Encode_StaticConfiguratioii..................................363.5.3VA2_Encode—Allocator...................................................373.5.4VA2_Encode_StreamDescription....................................373.5.5VA2_Encode_StreamType...............................................373.5.6VA2_Encode_StreamDescription_Video.........................383.5.7VA2_Encode_StreamDescription_MV............................383.5.8VA2_Encode_StreamDescriptoin_Residues....................393.6數(shù)據(jù)結(jié)構(gòu)運(yùn)動(dòng)矢量...............................................................403.6.1運(yùn)動(dòng)矢量布局..................................................................403.6.2新的D3D格式................................................................403.6.3VA2_Encode_MVSurface................................................413.6.4VA2_Encode_MVType....................................................413.6.5VA2一Encode一MYLayout.................................................423.6.6VA2_Encode_MotionVector8..........................................423.6.7VA2_Encode_MotionVectorl6........................................423.6.8VA2EncodeMotionVectorEx8......................................433.6.9VA2_Encode_MotionVectorExl6....................................433.7數(shù)據(jù)結(jié)構(gòu)殘差......................................................................443.7.1亮度平面.........................................................................443.7.2色度4:2:2........................................................................453.7.3色度4:2:0........................................................................454示例性DDI文檔..............................................................................454.1枚舉和能力..............................................................................454.1.1FND3DDDI_GETCAPS...................................................464.1.2VADDI_QUERYEXTENSIONCAPSINPUT..................464.1.3D3DDDIARG_CREATEEXTENSIONDEVICE.............464.2編碼功能..................................................................................474.2.1VADDI_Encode—Function—Execute_Input.....................474.2.2VADDI一Encode一Function_Execute_Output...................474.3擴(kuò)展設(shè)備結(jié)構(gòu)..........................................................................484.3.1VADDI_PRIVATEBUFFER............................................484.3.2D3DDDIARG_EXTENSIONEXECUTE.........................484.3.3FND3DDDI_DESTROYEXTENSIONDEVICE..............484.3.4FND3DDDI_EXTENSIONEXECUTE............................484.3.5D3DDDI_DEVICEFUNCS..............................................494.4D3D9結(jié)構(gòu)和函數(shù)....................................................................495示例性編程模型...............................................................................495.1流水線效率..............................................................................495.1.1示例單個(gè)運(yùn)動(dòng)矢量(流水線滿)................................495.2.1示例多個(gè)運(yùn)動(dòng)矢量.......................................................522示例性設(shè)計(jì)2.1編碼器布局圖5示出了根據(jù)一個(gè)實(shí)施例的示例性視頻編碼器應(yīng)用程序以示出可利用視頻編碼加速API的方式。在此示例中,視頻編碼器116是以DMO或MFT的形式來實(shí)現(xiàn)的。圖5示出了在若干處理階段之后的輸入數(shù)據(jù)(對(duì)應(yīng)于"接收")和輸出數(shù)據(jù)。各框表示數(shù)據(jù),而圓圈表示由編碼器應(yīng)用程序調(diào)用的API函數(shù)。因此,圓圈表示編碼器應(yīng)用程序看到的API的核心。2.2流水線或模式配置加速硬件被視為流水線,并使用流水線GUID來描述該流水線的最基本配置元素。編碼加速的目標(biāo)可被認(rèn)為是與流水線效率的目標(biāo)密切相關(guān)。該設(shè)計(jì)允許拆分的(或多階段)流水線,其中在獲得最終輸出之前數(shù)據(jù)在主機(jī)PC和硬件之間來回傳遞。尚未設(shè)計(jì)出多階段流水線配置,以下配置描述了非拆分的、單階段流水線。2.2.1VA2一EncodePipe一Fu11//{BFC87EA2-63B6-4378-A619-5B451EDCB940icpp—quote("DEFINE一GUID(VA2—EncodePipe一Full,0xbfc87ea2,0x63b6,0x4378,0xa6,0x19,0x5b,0x45,0xlS,0xdc,0xb9,一0x40)")—一圖6示出了根據(jù)一個(gè)實(shí)施例的示例性視頻編碼流水線配置,其中加速硬件加速運(yùn)動(dòng)估計(jì)、變換、量化和反過程以產(chǎn)生已解碼圖像。該硬件產(chǎn)生運(yùn)動(dòng)矢量、殘差(亮度和色度)和已解碼圖像作為輸出。已解碼圖像不需要被傳送到系統(tǒng)存儲(chǔ)器,因?yàn)槠湮ㄒ坏哪康氖怯?jì)算用于下一幀的運(yùn)動(dòng)矢量。稍后的文獻(xiàn)將談及稱為NumStreams(流數(shù))的參數(shù)。對(duì)于此流水線配置,NumStreams為5。實(shí)際的Streamld(流ID)在圖中的括號(hào)中示出。這是單階段的非拆分流水線,因此Execute(執(zhí)行)的Stage(階段)參數(shù)不適用。流描述注意,StreamType—*是VA2—Encode—StreamType—*的縮寫。輸入圖像StreamID是l,且流類型是StreamType—Video。該流表示對(duì)其尋找運(yùn)動(dòng)數(shù)據(jù)的圖像。用于該流的分配符是可協(xié)商的一當(dāng)前接口可以提供一個(gè)分配符,或者可使用外部分配符。對(duì)分配符的選擇是在創(chuàng)建時(shí)作出的,并且如果選擇了外部分配符,則流ID1將被認(rèn)為是對(duì)于GetBuffer(獲得緩沖區(qū))的非法輸入值。參考圖像流ID為2,并且流類型是StreamType_Video。該流表示用于計(jì)算運(yùn)動(dòng)矢量的參考圖像列表。當(dāng)前接口不為該流提供單獨(dú)的分配符。輸入表面從已解碼圖像流(ID=5)中回收,或者從別處獲得。運(yùn)動(dòng)矢量流ID是3,且流類型是StreamType_MV。該流表示包含運(yùn)動(dòng)矢量數(shù)據(jù)的輸出參數(shù)。用于該流的緩沖區(qū)只能經(jīng)由GetBuffer獲得。殘差流ID是4,且流類型是StreamType_Residues。該流表示包含用于所有三個(gè)平面的殘差值的輸出參數(shù)。用于該流的緩沖區(qū)只能經(jīng)由GetBuffer獲得。已解碼圖像流ID是5,并且流類型是StreamType—Video。該流表示包含從量化的殘差和運(yùn)動(dòng)矢量值獲得的已解碼圖像的輸出參數(shù)。用于該流的緩沖區(qū)只能經(jīng)由GetBuffer獲得。<image>imageseeoriginaldocumentpage20</image>圖7示出了根據(jù)一個(gè)實(shí)施例的示例性視頻編碼流水線配置,其中硬件僅加速運(yùn)動(dòng)估計(jì)。該流水線配置取一組參考圖像作為輸入,并轉(zhuǎn)儲(chǔ)運(yùn)動(dòng)矢量作為輸出。在此情況下的已解碼圖像必須由主機(jī)軟件來生成和提供。用于此流水線配置的NumStreams是3。用于各種流的Steamld在圖中的括號(hào)中示出。這是單階段、非拆分的流水線,并且Excute的Stage參數(shù)不適用。3示例性API3.1接口定義3.1.1IVideoEncoderinterfaceIVideoEncoder:工UnknownHRESUI/TGetBuffer(UINT8Streamld,[in]UINT32StreamType,[in]BOOIiBlocking,[out]PVO工DpBufferHRESULTReleaseBuffer([in]UINT8Streamld,[in]UINT32StreamType[in]PVOIDpBufferHRESULTExecute(UINT8Stage,UINT32NumInputDataParamete;rs,[in,size一is(Num工nputDataParameters)〗VA2_Encode_ExecuteDataPai:ameter**plnputData,[in]UINT32NumOutputDataParameters,[out,size—is(NumOutputDataParameters]VA2_Encode_ExecuteDataParameter**pOutputData,[in]UINT32NumConfigurationParameters,[in,size一is(NumConfigurationParameters]VA2一Encode一ExecuteConfigurationParameter**pConfiguration,[in〗HANDLEhE7ent,[out]HRESULT*pStatus),'3.1.2IVideoEncoderServiceinterfaceIVideoEncoderService:IVideoAccelerationServiceHRESULTGetPipelineConfigurations([out]UINT32*pCount,GUID**pGuids),'一HRESULTGetFormats(UINT32*pCount,GUID**pGuids),"~HRESULTGetDistanceMetrics([outUINT32*pCoimt,GUID**pGuidsHRESULTGetSearchProfiles([out]UINT32*pCount,VA2_Encode—SearchProfile**pSearchProfiles),'_——HRESULTGetMECapabilities(VA2—Encode—MECaps*pMECapsHRESULTCreateVideoEncoder([in]REFGUIDPipelineGuid,[in]REFGUIDFomatGuid,[in]UINT32NumStreams,VA2一Encode一StaticConfiguration*pConfiguration,VA2—Encode_DataDescription*pDataDescription,[in,size—is(NumStreams)]VA2—Encode—Allocator*SuggestedAllocatorProperties,[out,size—is(MumStreams)]VA2—Encode_Allocator*pActualAllocatorProperties,[out]IVideoEncoder**ppEncode3.2方法-IVideoE譜der3.2.1GetBuffer該函數(shù)返回在Excute調(diào)用中使用的緩沖區(qū)(編碼表面)。該緩沖區(qū)在使用之后通過調(diào)用ReleaseBuffer(釋放緩沖區(qū))來立即釋放,以避免使流水線停止。HRESULTGetBuffer(U工NT8Streamld,[in]UINT32StreamType,[in]BOOLBlocking,[out]PVOIDpBuffer弁defineE—NOTAVAILABLEHRESULT—FROM—WIN32(ERROR—INSUFFICIENT—BUFFER)弁defineE二INVALIDPARAMETERHRESULf^FRO[WIN32(ERRC^INVALID—PArA"mETER)參數(shù)指的是對(duì)其需要緩沖區(qū)的特定流。取決于特定的流,將返回不同類型的緩沖區(qū),如輸入圖像緩沖區(qū)、運(yùn)動(dòng)矢量緩沖區(qū)等等。并非對(duì)給定配置的所有流ID都是對(duì)此函數(shù)的有效輸入。對(duì)于Streamld的允許值作為流水線配置的一部分來指定。指定要返回的緩沖區(qū)的類型。通常,流類型由Streamld暗示,并且在創(chuàng)建時(shí)協(xié)商。如果StreamType與Streamld不一致,則該函數(shù)返回出錯(cuò)值。數(shù)據(jù)緩沖區(qū)如由備注一節(jié)中的表格所描述的基于StreamType的值來解釋(強(qiáng)制類型轉(zhuǎn)換)。指定當(dāng)存在"饑餓"時(shí)函數(shù)的行為,或用于扼流的某一其它需求。值True(真)指示該函數(shù)應(yīng)當(dāng)阻塞,而False(假)指示該函數(shù)應(yīng)當(dāng)返回E一NOTAVAILABLE。指向要經(jīng)由ReleaseBuffer釋放的數(shù)據(jù)緩沖區(qū)的指針。該指針基于StreamType參數(shù)來重新強(qiáng)制轉(zhuǎn)換(解釋),并且在以下備注一節(jié)中的表格中描述。返回值函數(shù)成功。五—M9n息^B丄五這是在驅(qū)動(dòng)程序因缺乏緩沖區(qū)而饑餓,并且Blocking標(biāo)志被設(shè)為假時(shí)返回的。輸入?yún)?shù)不正確。這可例如在StreamType不匹配給定Streamld的期望值時(shí)使用。r尸HWVOT/尸尸(9及7EZ)—譜^^Streamld無效。GetBuffer不提供用于指定流ID的緩沖區(qū)。對(duì)Streamld的允許值作為流水線配置的一部分來描述。對(duì)于指定的流ID,分配符可以是外部的,或者可以完全沒有分配符。函數(shù)失敗。備注通常,該函數(shù)非??斓胤祷乜刂?,因?yàn)榫彌_區(qū)已經(jīng)存在于分配符隊(duì)列中。該函數(shù)應(yīng)當(dāng)阻塞(或返回E一NOTAVAILABLE)的唯一條件是當(dāng)來自分配符隊(duì)列的所有緩沖區(qū)都被提交給設(shè)備,或被應(yīng)用程序消耗,因此不被釋放的時(shí)候。流類型和緩沖區(qū)格式<table>tableseeoriginaldocumentpage23</column></row><table><table>tableseeoriginaldocumentpage24</column></row><table>3.2.2ReleaseBuffer該函數(shù)用于將表面釋放回分配符隊(duì)列以便經(jīng)由GetBuffer重復(fù)使用。HRESULTReleaseBuffer([in]UINT8Streamld,[in]UINT8StreamType,[in]PVOIDpBuffer)參數(shù)與緩沖區(qū)相關(guān)聯(lián)的流ID。用于緩沖區(qū)的流類型。要釋放回分配符隊(duì)列的緩沖區(qū)。返回值函數(shù)成功。函數(shù)失敗。3.2.3Execute該函數(shù)用于向硬件提交請(qǐng)求。它包含經(jīng)由GetBuffer獲得的輸入和輸出數(shù)據(jù)緩沖區(qū)以及某些配置信息。該函數(shù)是異步的,并且其完成由用信號(hào)表示的事件來指示。完成狀態(tài)使用pStatus參數(shù)來指示,該參數(shù)在堆上分配,并且僅在用信號(hào)表示事件之后才檢查。作為參數(shù)提供給此函數(shù)的緩沖區(qū)在該函數(shù)真正完成之前不被應(yīng)用程序讀取(例如,經(jīng)由LockRect)或?qū)懭?。真正的完成是由函?shù)返回出錯(cuò)值來暗示的,或者如果該函數(shù)返回成功,則通過用信號(hào)表示hEvent(該函數(shù)的參數(shù))來暗示。當(dāng)將同一緩沖區(qū)輸入到Execute調(diào)用的幾個(gè)實(shí)例時(shí),在所有相關(guān)聯(lián)的Execute調(diào)用完成之前不訪問該緩沖區(qū)。指向Execute使用的表面的指針仍作為參數(shù)提供給與Execute類似的VA函數(shù),因?yàn)檫@不需要鎖定數(shù)據(jù)。該最后一條規(guī)則解釋了如何可同時(shí)在多個(gè)Execute調(diào)用中使用同一輸入圖像。提供給該調(diào)用的緩沖區(qū)遵循在創(chuàng)建時(shí)協(xié)商的分配符語義。如果在期望使用GetBuffer時(shí)使用了外部分配符,則該函數(shù)將返回E_FAIL。HRESUI/TExecute(〔in]UINT8Stage,UINT32NumlnputDataParameters,[in,size—is(NumlnputDataParameters)]VA2一Encode—ExecuteDataParameter**pI叩utData,[in]UINT32NumOutputDataParameters,[out,size一is(NumOutputDataParameters)]VA2一Encode—ExecuteDataParameter**pOutputData,[in]UINT32NumConfigurationPararueters,[in,size一is(NumConfigurationParameters〗VA2一Encode—ExecuteConfigurationParameter**pConfiguration,[in〗HAND工EhEvent,[out]HRESUKT*pStatus),'參數(shù)對(duì)于拆分的流水線配置,該參數(shù)標(biāo)識(shí)拆分的流水線的特定階段。編號(hào)是基于1的,并且對(duì)于非拆分的流水線該參數(shù)被忽略。輸入數(shù)據(jù)數(shù)組(下一參數(shù))的大小。指向輸入數(shù)據(jù)值的指針數(shù)組。個(gè)別數(shù)據(jù)指針基于Streamld值來適當(dāng)?shù)刂匦聫?qiáng)制轉(zhuǎn)換,該值具有在創(chuàng)建時(shí)指定的相關(guān)聯(lián)的StreamDescription(流描述)。數(shù)據(jù)緩沖區(qū)是在創(chuàng)建時(shí)分配的,并且在流傳送過程期間通過調(diào)用GetBuffer來獲得。輸出數(shù)據(jù)數(shù)組(下一參數(shù))的大小。指向輸出數(shù)據(jù)值的指針數(shù)組。個(gè)別數(shù)據(jù)指針基于Streamld值來適當(dāng)?shù)刂匦聫?qiáng)制轉(zhuǎn)換,該值具有在創(chuàng)建時(shí)指定的相關(guān)聯(lián)的StreamDescription。數(shù)據(jù)緩沖區(qū)是在創(chuàng)建時(shí)分配的,并且在流傳送過程期間通過調(diào)用GetBuffer來獲得。配置數(shù)組(下一參數(shù))的大小控制流水線的執(zhí)行的配置參數(shù)的數(shù)組??傮w配置是該結(jié)構(gòu)以及在創(chuàng)建編碼器時(shí)提供的靜態(tài)配置參數(shù)的并集。用信號(hào)標(biāo)識(shí)輸出數(shù)據(jù)就緒的事件句柄。指示所請(qǐng)求的操作是否成功完成的狀態(tài)。允許的值包括S_OK(成功完成)、EJTIMEOUT(如果超過了TimeLimit(時(shí)限))以及E_SCENECHANGE(如果啟用場(chǎng)景改變檢測(cè)并檢測(cè)到該改變)。在兩種出錯(cuò)的情況下,沒有一個(gè)輸出表面包含有用數(shù)據(jù)。該參數(shù)在堆上分配,并且返回值僅在用信號(hào)表示了hEvent之后才檢查。返回值51—0《函數(shù)成功。函數(shù)失敗。備注如果用信號(hào)表示了事件句柄,則意味著當(dāng)LockRect在任一輸出表面上調(diào)用時(shí)其應(yīng)立即完成,因?yàn)樗鼈円呀?jīng)就緒。特別地,期望LockRect調(diào)用通過在任何事件句柄上等待而不會(huì)在任何時(shí)間長度上鎖定。也不允許通過忙碌的自旋來浪費(fèi)CPU時(shí)間。3.3數(shù)據(jù)結(jié)構(gòu)ExecuteExecute調(diào)用具有數(shù)據(jù)參數(shù)和配置參數(shù)。具體的數(shù)據(jù)參數(shù)可以被認(rèn)為是從VA2—Encode—ExecuteDataParameter基類(或結(jié)構(gòu))導(dǎo)出的,而具體的配置參數(shù)可以被認(rèn)為是從VA2—Encode一ExecuteConfigurationParameter基類(或結(jié)構(gòu))導(dǎo)出的。3.1.1VA2_Encode_ExecuteDataParametertypedefstruct—VA2_Encode—ExecuteDataParajneter{UINT32L"ingtli,'—UINT32Streamld,-1VA2_Encode—ExecuteDataParameter'.成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。緩沖區(qū)格式在創(chuàng)建時(shí)使用StreamDescription(、流描述)參數(shù)來協(xié)商。3.3.2VA2Encode—ExecuteConfigurationParametertypedefstruct一VA2—Encode一ExecuteConfigurationParametei:(U工NT32L"ingtlw—UINT32Streamld;UINT32ConfigurationType''}VA2一Encode一ExecuteConfigurationParameter''弁defineVA2_Encode_ConfigurationType一MotionEstimation0xl#defineVA2—Encode—ConfigurationType—Quantization0x2成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。這可用于推斷數(shù)據(jù)是輸入還是輸出。該參數(shù)描述了配置參數(shù),并用于適當(dāng)?shù)貙?duì)當(dāng)前結(jié)構(gòu)進(jìn)行類型強(qiáng)制轉(zhuǎn)換。備注該結(jié)構(gòu)用作更專門的配置信息的基礎(chǔ)類型。該基礎(chǔ)類型基于ConfigurationType(配置類型)參數(shù)進(jìn)行類型強(qiáng)制轉(zhuǎn)換為更專門的類型。ConfigurationType和專門的結(jié)構(gòu)之間的映射在下表中描述。配置類型<table>tableseeoriginaldocumentpage28</column></row><table>成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。這可用于推斷數(shù)據(jù)是輸入還是輸出。指向包含運(yùn)動(dòng)矢量D3D表面的結(jié)構(gòu)。3.3.4DataParameter一Residuestypedefstruct—VA2一Encode—ExecuteDataPai:ameter一Residiies{U工NT32———Length,'—UINT32Streamld'-VA2—Encode—ResidueSurface*pResidueSurfaceY'-VAS—Encode_ResidueSurface*pResidueSurfaceCb'-VAS—Encode—ResidueSurface*pResidueSurfaceCr;}VA2—Encode—ExecuteDataParameter—Residues成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。這可用于推斷數(shù)據(jù)是輸入還是輸出。包含亮度值的殘差表面。包含色度Cb值的殘差表面。包含色度Cr值的殘差表面。3.3.5DataParameter一Inputlmagetypedefstruct—VA2—Encode一ExecuteDataParameter—Input工mage{UINT32——Le;gth'.—UINT32Streamld'-VA2_Encode_ImageInf*plmageData;}VA2—Encode一ExecuteDataParameter—InputImage/成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。這可用于推斷數(shù)據(jù)是輸入還是輸出。指向包含輸入圖像D3D表面的結(jié)構(gòu)的指針。這是對(duì)其需要運(yùn)動(dòng)矢量的表面。3.3.6DataParameter一Referencelmagestypedefstruct一VA2—Encode—ExecuteDataParameter—Referencelmages{U工NT32——Length-—UINT32Stream工d/UINT32NumReferenceImagesVA2—Encode—Imagelnfo*pReferencelmages}VA2—Encode一ExecuteDataParamete;i:—Referencelmages,'成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。這可用于推斷數(shù)據(jù)是輸入還是輸出。參考圖像數(shù)組(下一參數(shù))的大小作為運(yùn)動(dòng)矢量的基礎(chǔ)的參考圖像的數(shù)組。對(duì)于如MPEG-2的簡單格式,可以僅使用一個(gè)逐行幀(或兩個(gè)半幀)。另一方面,如H.264和VC-1等格式支持跨越幾個(gè)幀的運(yùn)動(dòng)矢量。MPEG-2中的P幀僅使用一個(gè)參考圖像,而B幀具有隔行的視頻,并且半幀類型的運(yùn)動(dòng)可能使用4個(gè)圖像,其中每一圖像可以是一幀或一個(gè)半幀。3,3,7DataParameter一Decodedlmagetypedefstruct—VA2一Encode—ExecuteDataParameter一DecodedlmageUINT32——Length;—UINT32Streamld'-VA2_Encode—Imagelnfo*pYCbCrImage/}VA2一Encode—ExecuteDataParametei:一Decodeci工mage,'成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。這可用于推斷數(shù)據(jù)是輸入還是輸出。在反量化、反變換和運(yùn)動(dòng)補(bǔ)償之后獲得的輸出的已解碼圖像。對(duì)于良好的流水線,相關(guān)聯(lián)的D3D表面不應(yīng)被鎖定,也不必將數(shù)據(jù)傳送到系統(tǒng)存儲(chǔ)器。表面指針仍可用作參考圖像。3.3.8VA2_Encode—ImageInfotypedefstruct一VA2—Encode—ImagelnfofIDirect3DSui:face9*pSurface,'BOOLField;BOOLInterlaced,*RECTWindow;}VA2—Encode—Image工nfo,'成員指向包含YCbCr格式的圖像的D3D表面的指針。值為1指示該表面包含視頻數(shù)據(jù)的一個(gè)半幀,并且該數(shù)據(jù)假定為隔行的。o指示完整的逐行幀。值為1指示該圖像數(shù)據(jù)是隔行的。該標(biāo)志應(yīng)僅在Field(上一個(gè)參數(shù))被設(shè)為l時(shí)才使用。如果Field被設(shè)為l,則數(shù)據(jù)被假定為是隔行的。圖像內(nèi)的矩形。這可用于限制運(yùn)動(dòng)估計(jì)調(diào)用僅返回用于整個(gè)圖像內(nèi)的一個(gè)矩形的運(yùn)動(dòng)矢量。3.3.9ConfigurationParameter一MotionEstimationtypedefstruct_VA2—Encode—ExecuteConfigurationParameter—MotionEstimation{UINT32———Length,.—UINT32Streamld'.UINT32ConfigurationType'-VAS—Encode—MEParameters*pMEParams;}VA2—Encode一ExecuteConfigurationParameter—MotionEstimation'-成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。這可用于推斷數(shù)據(jù)是輸入還是輸出。指向定義支配包括搜索窗的運(yùn)動(dòng)搜索等的各種參數(shù)的結(jié)構(gòu)的指針。備注圖8示出了根據(jù)一個(gè)實(shí)施例的幾個(gè)示例性運(yùn)動(dòng)估計(jì)參數(shù)。這些參數(shù)在以下結(jié)構(gòu)中使用。3.3.10VA2—Encode_SearchResolutiontypedefenum(VA2—Encode—SearchResolution—FullPixel,VA2一Encode—SearchResolution—HalfPixel,VA2—Encode—SearchResolution—QuarterPixel}VA2_Encode—SearchResolution;描述運(yùn)動(dòng)矢量是以完整的像素為單位來計(jì)算的。運(yùn)動(dòng)矢量是以半像素為單位來計(jì)算的。因此運(yùn)動(dòng)矢量值(5,5)表示離開(2.5,2.5)像素的數(shù)據(jù)宏塊。運(yùn)動(dòng)矢量是以四分之一像素為單位來計(jì)算的。因此運(yùn)動(dòng)矢量值(io,io)表示離開(2.5,2.5)像素的數(shù)據(jù)宏塊。在計(jì)算子像素運(yùn)動(dòng)矢量值時(shí),編碼器使用內(nèi)插來估計(jì)亮度和色度值。具體的內(nèi)插方案是格式相關(guān)的,并且以下GUID(靜態(tài)配置的一部分)控制內(nèi)插方案。//(E9AF78CB-7A8A-4d62-887F-B6A4183"C791cpp—quote("DEFINE—GUID(VA2一Encode—工nterpolation一MPEG2Bilinear,0xe9af78cb,0x7a8a,0x4d62,0x88,0x7f,0xb6,5xa4,0x18,0x36丁0x4c,0x79);77)//(A94BBFCB-lBFl-475c-92DE-67298AF56BB0)cpp一quote("DEFINE—GU工D(VA2—Encode一工nterpolation—MPEG2Bicubic,0xa94bbfcb,Oxlbfl,0x475c,0x92,0xdS,0x67,0x29,一0x8a,0xf5,0x6&0xb0);")—3.3.11VA2—Encode—SearchProfiletypedefstruct一VA2一ErLcode一SearchProfile{UINT8Quairty!^vel,'—UINT8TimeTaken'-GU工DSearchTechniquezGUIDSubpixellnterpolation,'}VA2EncodeSearchProfile,,成員范圍在的數(shù)字,指示運(yùn)動(dòng)矢量在設(shè)備支持的不同簡檔中的相對(duì)質(zhì)范圍在的數(shù)字,指示對(duì)不同搜索簡檔花費(fèi)的相對(duì)時(shí)間。這使得應(yīng)用程序能夠作出合理的時(shí)間一質(zhì)量折衷。指示所使用的搜索算法的GUID。指示所使用的子像素內(nèi)插方案的GUID。備注沒有統(tǒng)一接受的絕對(duì)質(zhì)量定義,因此同意接受相對(duì)度量。針對(duì)TimeTaken指示的值應(yīng)當(dāng)遵循嚴(yán)格的比例規(guī)則。如果簡檔1花費(fèi)10ms而簡檔2花費(fèi)20ms,則TimeTaken值的比例應(yīng)為20/10=2。3.3.12VA2_Encode_MBDescriptiontypedefstruct一VA2—Encode—MBDescription{BOOIjConstantMBSize,'UINT32MBWidth,.UINT32MBHeight'.UINT32MBCount/RECT*pMBRectangles;}VA2—Encode一MBDesci:iptioru成員值為l指示當(dāng)前圖像中的所有宏塊具有相同的大小。這對(duì)于如R264等格式并不如此。M扁淑宏塊的寬度。僅當(dāng)bConstantMBSize為1時(shí)才有效。宏塊的高度。僅當(dāng)bConstantMBSize為1時(shí)才有效。如果bConstantMBSize為0,則使用矩形數(shù)組來描述圖像中的宏塊(或段)。該參數(shù)用以下pMBRectangles參數(shù)的元素來描述大小。描述如何切割圖像的矩形數(shù)組。3.3.13VA2一Encode—SearchBoundstypedefstruct—VA2—Encode—SearchBounds{BOOLDetectSceneChange'.UINT32MaxDistanceInMetric,.UINT32TimeLimit,'UINT32MaxSearchWindowX;UINT32MaxSearchWindowY'.}VA2一Encode一SearchBounds,'成員如果該值為1,則請(qǐng)求場(chǎng)景改變檢測(cè)。在這一情況下,如果檢測(cè)到場(chǎng)景改變,則Execute調(diào)用不計(jì)算運(yùn)動(dòng)矢量,并且因此不計(jì)算殘差或己解碼圖像。這是經(jīng)由Execute調(diào)用的pStatus參數(shù)來的,在此情況下該參數(shù)應(yīng)被設(shè)為E_SCENECHANGE。指的是當(dāng)使用當(dāng)前選擇的距離度量來進(jìn)行比較時(shí)宏塊之間的差別。如果該距離超過MaxDistancelnMetric值,則拒絕這一運(yùn)動(dòng)矢量。允許硬件花費(fèi)在運(yùn)動(dòng)估計(jì)階段上的最大時(shí)間。如果花費(fèi)的時(shí)間要長于該時(shí)間,則Execute調(diào)用的pStatus參數(shù)被設(shè)為E—TIMEOUT。返回的運(yùn)動(dòng)矢量的x分量的最大值。換言之,搜索窗的大小(沿x維度)。運(yùn)動(dòng)矢量的y分量的最大值。換言之,搜索窗的大小(沿y維度)。備注3.3.14VA2一E譜de一ModeTypetypedefstruct—VA2—Encode—ModeType{UINT32SearchProfilelndex;GUIDOistanceMetric'.置16HintX,INT16HintY,-}VA2—Encode一ModeType'-成員由GetSearchProfilesAPI調(diào)用返回的搜索簡檔列表的索引。當(dāng)比較兩個(gè)宏塊時(shí)使用的度量。常用的度量包括SAD(絕對(duì)距離和)和SSE(均方誤差和)。關(guān)于要引導(dǎo)運(yùn)動(dòng)搜索的期望運(yùn)動(dòng)方向的提示。這指的是圖像中的整體運(yùn)動(dòng),并且不在每一MB的基礎(chǔ)上適用。歷"J關(guān)于要引導(dǎo)運(yùn)動(dòng)搜索的期望運(yùn)動(dòng)方向的提示。這指的是圖像中的整體運(yùn)動(dòng),并且不在每一MB的基礎(chǔ)上適用。3.3.15ConfigurationParameter_Quantizationtypedefstruct—VA2—Encode—ExecuteConfigurationParameter—Quantization(UINT32Lengtliz——一UINT32Streamld'.UINT32ConfigurationType,'UINT32StepSize;}VA2—Encode—ExecuteConfiguraticmParameter—Quantizatiorw成員該結(jié)構(gòu)中的字節(jié)數(shù)。為可擴(kuò)展性提供。在流水線配置中定義的數(shù)據(jù)流的ID。這可用于推斷數(shù)據(jù)是輸入還是輸出。當(dāng)執(zhí)行量化時(shí)要使用的步長。該設(shè)計(jì)允許對(duì)在此調(diào)用中請(qǐng)求了運(yùn)動(dòng)矢量和殘差的圖像的整個(gè)部分僅使用一個(gè)步長。3.4方法IVideoEncoderService該接口中的方法允許應(yīng)用程序向硬件查詢其能力并用給定配置創(chuàng)建編碼器對(duì)象3.4.1GetPipdineConfigurationsHRESULTGetPipelineConfigurations([out]UINT32*pCount,GUID**pGuids參數(shù)返回值描述了由該函數(shù)返回的pGuids數(shù)組(下一參數(shù))的大小。描述設(shè)備支持的各種流水線配置的GUID數(shù)組。存儲(chǔ)器由被調(diào)用者分配,并且應(yīng)當(dāng)由調(diào)用者使用CoTaskMemFree來釋放。返回值51—0《函數(shù)成功。函數(shù)無法分配存儲(chǔ)器來返回GUID列表£—F息由于某一設(shè)備出錯(cuò)無法確定所支持的流水線配置。3.4.2GetFormatsHRESULTGetFormats(GUID**pGuids)—參數(shù)返回值描述了由該函數(shù)返回的pGuids數(shù)組(下一參數(shù))的大小。描述設(shè)備支持的用于運(yùn)動(dòng)估計(jì)的各種搜索度量的GUID數(shù)組。存儲(chǔ)器由被調(diào)用者分配,并且應(yīng)當(dāng)由調(diào)用者使用CoTaskMemFree來釋放。返回值S—OK函數(shù)成功。函數(shù)無法分配存儲(chǔ)器來返回GUID列表£—F息由于某一設(shè)備出錯(cuò)無法確定所支持的度量。3.4.4GetSearchProfilesHRESULTGetSearchProfiles([out]UINT32*pCount,VA2—Encode—SearchProfile**pSearchProfiles———參數(shù)返回值描述了該函數(shù)返回的pGuids數(shù)組(下一參數(shù))的大小。表示設(shè)備支持的搜索簡檔的GUID數(shù)組。該搜索簡檔允許編解碼器應(yīng)用程序更高效地進(jìn)行時(shí)間—質(zhì)量折衷。存儲(chǔ)器由被調(diào)用者分配,并且由調(diào)用者使用CoTaskMemFree來釋放。返回值函數(shù)成功。函數(shù)無法分配存儲(chǔ)器來返回GUID列表由于某一設(shè)備出錯(cuò)無法確定所支持的搜索簡檔。3.4.5GetMECapa隨iesHRESULTGetMECapabilities(VA2—Encode—MECaps*pMECaps),'一一參數(shù)指向設(shè)備的運(yùn)動(dòng)估計(jì)能力的指針。這包括關(guān)于設(shè)備能夠處理的圖像的大小、最大搜索窗大小以及設(shè)備是否支持可變宏塊大小的信息。用于該參數(shù)的存儲(chǔ)器由調(diào)用者分配。返回值51,函數(shù)成功。由于某一設(shè)備出錯(cuò)函數(shù)失敗。3.4.6CreateVideoEncoder該函數(shù)創(chuàng)建IVideoEncoder的實(shí)例。HRESULTCreateVideoEncoder([in]REFGUIDPipelineGuid,[inlREFGUIDFormatGuid,[in]UINT32NumStreams,VA2—Encode—StaticConfiguration*pConfiguratiori,VA2—Encode—StreamDescription*pStreamDescription,[in,size一is(NuiuStreams)]VA2一Encodle—Allocator*SuggestedAllocatorProperties,[out,size一is(NumStreams)]VA2—Encode—Allocator*pActualAllocatorProperties,[out]IVideoEncoder**ppEncocie);參數(shù)表示所需的流水線配置的GUID。配置列表經(jīng)由GetCapabilities獲得,并且每一GUID與描述關(guān)于該配置的必要細(xì)節(jié)的公共文檔相關(guān)聯(lián)。表示最終編碼的比特流的格式的GUID。如變換和量化等許多編碼操作對(duì)其具有格式專用的元素。盡管這些格式專用元素可以由具有足夠速度的CPU來處理,但是信息交換將必須使用額外的流水線階段并且使得更難實(shí)現(xiàn)高流水線效率。與流水線配置相關(guān)聯(lián)的輸入和輸出數(shù)據(jù)流的數(shù)量。這在許多情況下由流水線GUID來暗示。指向靜態(tài)配置特性的指針。描述流經(jīng)該流的數(shù)據(jù)的結(jié)構(gòu)數(shù)組,每一個(gè)流一個(gè)。iSwgg^敗W〃oc她r尸ra/7eWw調(diào)用者(編解碼器應(yīng)用程序)基于其流水線設(shè)計(jì)建議要與不同的流相關(guān)聯(lián)的特定數(shù)量的緩沖區(qū)(表面)。驅(qū)動(dòng)程序基于其能夠收集的資源和其它考慮事項(xiàng)指定實(shí)際分配符隊(duì)列大小。假設(shè)是如果應(yīng)用程序不能用可用的緩沖(分配符隊(duì)列大小)來構(gòu)建高效的流水線則其將放棄對(duì)該接口的使用。輸出編碼器對(duì)象。調(diào)用者應(yīng)當(dāng)將此認(rèn)為是要經(jīng)由IUnknown::Rdease釋放的常規(guī)COM對(duì)象。返回值函數(shù)成功。函數(shù)失敗(可能是缺少資源)。3.5數(shù)據(jù)結(jié)構(gòu)IVideoEncoderService3.5.1VA2_Encode_MECapstypedefstruct_VA2_Encode—MECaps{BOOLVariableMBSizeSupported'-BOOLMotionVectorHintSupported/UINT16MaxSesrchWindowX,'U工NT16MaxSearchWindowYUINT32MaxImageWidth;UINT32MaxImageHeight'.UINT32MaxMBSizeX'*UINT32MaxMBSizeY,'}Encode—MECaps/成員值為i指示當(dāng)執(zhí)行運(yùn)動(dòng)估計(jì)時(shí)硬件支持可變宏塊大小。特別地,如果支持可變宏塊大小,則此API的調(diào)用者在VA2_Encode—MBDescription結(jié)構(gòu)中將ConstantMBSize設(shè)為0并使用pMBRectangles參數(shù)來描述對(duì)圖像的劃分是合法的。值為l指示硬件能夠在其運(yùn)動(dòng)搜索算法中使用來自調(diào)用者的某些提示。特別地,調(diào)用者可設(shè)置作為Execute配置參數(shù)的VA2_Encode_ModeType的HintX和HintY成員。作為VA2—Encode_SearchBounds的成員的SearchWindowX的最大合法值,VA2一Encode—SearchBounds是運(yùn)動(dòng)估計(jì)配置參數(shù)。作為VA2—Encode_SearchBounds的成員的SearchWindowY的最大合法值,VA2一Encode—SearchBounds是運(yùn)動(dòng)估計(jì)配置參數(shù)。Mox/mage附湖輸入圖像的最大允許寬度。輸入圖像的最大允許高度。宏塊的最大允許寬度。宏塊的最大允許高度。3.5.2VA2—Encode_StaticConfigurationtypedefstruct—VA2—Encode—StaticConfiguration{GUIDTransformOperatorGU工DPixelInterpolation;GUIDQuantization,,UINT8NumMotionVectoirsPerMB,VA2一Encode—MVLayoutMVLayout',VA2—Encode一ResidueljayoutResLayout,'}VA2—Encode一StaticConfiguration'-成員表示Transform算子—MPEG-2DCT、WMV9變換等之——的GUID。表示要使用的子像素內(nèi)插的GUID。雙線性和雙三次內(nèi)插系統(tǒng)具有格式專用的多個(gè)系數(shù)。表示要使用的量化方案的GUID。每一宏塊要計(jì)算的運(yùn)動(dòng)矢量的數(shù)』流水線配置可能要求該值為i。運(yùn)動(dòng)矢量表面的布局。殘差表面的布局。該接口的較早的版本所支持的簡單3,5,3VA2一Encode一Allocatortypedefstruct—VA2—Encode一Allocator{BOOIjExternalAllocator',UINT32NumSurfaces/}VA2_Encode—Allocator-成員False指示緩沖區(qū)是經(jīng)由GetBuffer獲得的,而True指示緩沖區(qū)是經(jīng)由外部分配符獲得的,或者沒有與所討論的流相關(guān)聯(lián)的分配符。流水線配置在許多情況下強(qiáng)迫該字段的值(通常為0)。一個(gè)值得注意的例外是在允許來自外部分配符的輸入圖像流中。要與分配符隊(duì)列相關(guān)聯(lián)的表面的數(shù)量。3.5.4VA2一Encode一StreamDescriptiontypedefstruct一VA2—Encode—StreamDescription{UINT32Lengtli,'——UINT32StreamType,'}VA2—Encode—StreamDescription'-成員用于確認(rèn)類型強(qiáng)制轉(zhuǎn)換并允許可擴(kuò)展性的整個(gè)結(jié)構(gòu)的長度。描述與該流相關(guān)聯(lián)的數(shù)據(jù)的類型。用于類型強(qiáng)制轉(zhuǎn)換。備注該基本結(jié)構(gòu)被類型強(qiáng)制轉(zhuǎn)換為StreamType字段上的派生類型。類型強(qiáng)制轉(zhuǎn)換在關(guān)于VA2_Encode_StreamType的文檔中有描述。3.5.5VA2_Encode—StreamType弁defineVA2_Encode—StreamType_Video0x1#defineVA2_Encode—StreamType一MV0x2弁defineVA2—Encode—StreamType_Residues0x3類型描述相關(guān)聯(lián)的流描述結(jié)構(gòu)可被VA2—Encode—StreamDescription—Video。相關(guān)聯(lián)的流描述結(jié)構(gòu)可被VA2一Encode—StreamDescription—MV。相關(guān)聯(lián)的流描述結(jié)構(gòu)可被VA2—Encode_StreamDescription_Residues。3.5.6VA2一Encode—StreamDescription—Videotypedefstruct—VA2_Encode_StreamDescription{UINT32IiengtlizUINT32StreamType'.VA2_VideoDescVideoDescription;}VA2_Encode_StreamDescriptiorw成員用于確認(rèn)類型強(qiáng)制轉(zhuǎn)換并允許可擴(kuò)展性的整個(gè)結(jié)構(gòu)的長度。描述與該流相關(guān)聯(lián)的數(shù)據(jù)的類型。用于類型強(qiáng)制轉(zhuǎn)換。描述視頻流的各種特性,包括維數(shù)、幀速率、色原等等。3.5.7VA2一Encode—StreamDescription一MVtypedefstruct—VA2—Encode—StreamDescription{U工NT32liengtTi''UINT32StreamType,'VA2_Encode—MVTypeMVType,.VA2—Encode—MVLayoutMVLayout,'}VA2_Encode_StreamDescription,'成員強(qiáng)制轉(zhuǎn)換為強(qiáng)制轉(zhuǎn)換為強(qiáng)制轉(zhuǎn)換為用于確認(rèn)類型強(qiáng)制轉(zhuǎn)換并允許可擴(kuò)展性的整個(gè)結(jié)構(gòu)的長度。描述與該流相關(guān)聯(lián)的數(shù)據(jù)的類型。用于類型強(qiáng)制轉(zhuǎn)換。描述用于返回運(yùn)動(dòng)數(shù)據(jù)的運(yùn)動(dòng)矢量結(jié)構(gòu)的類型。用于解釋運(yùn)動(dòng)矢量表面的內(nèi)容。描述在存儲(chǔ)器中如何布局用于給定輸入圖像的運(yùn)動(dòng)矢量結(jié)構(gòu)。3.5,8VA2一Encode一StreamDescriptoin—Residuestypedefstruct—VA2—Encode_StreamDescription{UINT32Length/—UINT32StreamType,'VA2一Encode—SamplingTypeSamplingType'.U工N亍32LumaWidth;UINT32:LumaHeight,'UINT32ChromaCbWidth;UINT32ChromaCbHeight/UINT32ChromaCrWidth/UINT32ChromaCrHeight'.}VA2—Encode—StreamDescription;成員用于確認(rèn)類型強(qiáng)制轉(zhuǎn)換并允許可擴(kuò)展性的整個(gè)結(jié)構(gòu)的長度。描述與該流相關(guān)聯(lián)的數(shù)據(jù)的類型。用于類型強(qiáng)制轉(zhuǎn)換。指定殘差數(shù)據(jù)是否為4:4:4、4:2:2等等。亮度表面的寬度。亮度表面的高度。C7zro,C6W淑包含Cb殘差值的表面的寬度。包含Cb殘差值的表面的高度。C7zrawaOW湖包含Cr殘差值的表面的寬度。C7zra,Oi/e妙f包含Cr殘差值的表面的高度。3.6數(shù)據(jù)結(jié)構(gòu)運(yùn)動(dòng)矢量3.6.1運(yùn)動(dòng)矢量布局圖9示出了根據(jù)一個(gè)實(shí)施例的儲(chǔ)存在D3D結(jié)構(gòu)中的示例性運(yùn)動(dòng)矢量數(shù)據(jù)。被描述為"MV"的每一單元是運(yùn)動(dòng)矢量結(jié)構(gòu)。取決于VA2_Encode_MVType和VA2_Encode_MVLayout的值使用不同的表示。實(shí)際的結(jié)構(gòu)和布局描述如下。3.6.2新的D3D格式typedefenum—D3DF0RMAT{—D3DFMT—MOTIONVECTOR16=105,D3DFMT二MOTIONVECTOR32-106,D3DFMT二RES工DUEl6=107,}D3DFORMAT/運(yùn)動(dòng)矢量表面和殘差表面與以上新的D3D格式類型相關(guān)聯(lián),該類型指示了個(gè)別運(yùn)動(dòng)矢量和殘差的大小。該大小信息由驅(qū)動(dòng)程序在應(yīng)用程序使用創(chuàng)建API提供的表面或資源之一來創(chuàng)建表面時(shí)使用。與編碼表面相關(guān)聯(lián)的資源標(biāo)志是VA2一EncodeBuffer?!ň彌_區(qū)類型<formula>formulaseeoriginaldocumentpage45</formula>3.6.3VA2一E譜de一MVSurface該結(jié)構(gòu)從IDirect3DSurface9中高效地派生,并且攜帶了允許解釋嵌入的D3D結(jié)構(gòu)的內(nèi)容的狀態(tài)信息。typedefstruct—VA2—Encode一MVSurface{工Dii:ect3DSui:face9*pMVSurface'-VAS—Encode—MVTypeMVTypeVA2一Encode一MVLayoutMVLayoutGUIDDistanceMetric,.)Encode—MVSurface,,成員指向包含運(yùn)動(dòng)矢量的D3D表面的指針。MIT,該值用于標(biāo)識(shí)要用于解釋個(gè)別運(yùn)動(dòng)矢量的結(jié)構(gòu)(VA2一Encode一MotionVector8等)。該值標(biāo)識(shí)如何在D3D表面中布局個(gè)別運(yùn)動(dòng)矢量結(jié)構(gòu)。表示用于測(cè)量兩個(gè)宏塊之間的距離的距離度量的GUID。距離度量用于標(biāo)識(shí)最接近的宏塊,且因此是最優(yōu)運(yùn)動(dòng)矢量。3.6.4VA2_Encode_MVType該枚舉值用于解碼運(yùn)動(dòng)矢量D3D9表面的內(nèi)容。取決于運(yùn)動(dòng)矢量的類型,使用幾個(gè)不同的運(yùn)動(dòng)矢量結(jié)構(gòu)之一來解釋該表面的內(nèi)容。typedefenum{VA2—Encode一MVType—Simple8,VA2—Encode_MVType_Simplel6,VA2—Encode一MVType—Extended8,VA2一Encode一MVType—Extended16}VA2—Encode—^VType;描述運(yùn)動(dòng)矢量結(jié)構(gòu)是VA2—Encode—MotionVector8。運(yùn)動(dòng)矢量結(jié)構(gòu)是VA2一Encode一MotionVector16。運(yùn)動(dòng)矢量結(jié)構(gòu)是VA2—Encode_MotionVectorEx8。運(yùn)動(dòng)矢量結(jié)構(gòu)是VA2—Encode—MotionVectorEx16。3.6.5VA2_Encode_MYLayouttypedefenum{VA2—Encode一MVLayout—A,VA2—Encode—MVLayout—B,VA2—Encode—MVLayout—C}VA2一Encode一MVLayout,'描述類爿實(shí)際的D3D表面是由宏塊索引和行索引來索引的運(yùn)動(dòng)矢量結(jié)構(gòu)數(shù)組。類飾這是其中每一宏塊的運(yùn)動(dòng)矢量的數(shù)量不是常量的壓縮布局。細(xì)節(jié)待定。鄉(xiāng)C3.6.6VA2一Encode—MotionVector8typedefstruct—VA2—Encode一MotionVector81INT8x'.—工NT8y,')VA2—Encode一MotionVector8;成員運(yùn)動(dòng)矢量的x坐標(biāo)。少運(yùn)動(dòng)矢量的y坐標(biāo)。3.6.7VA2_Encode_MotionVectorl6typedefstruct一VA2—Encode—MotionVectorl6{INT16INT16y,'}VA2Encode—MotionVectorl6''成員運(yùn)動(dòng)矢量的x坐標(biāo)。運(yùn)動(dòng)矢量的y坐標(biāo)。3.6.8VA2_Encode_MotionVectorEx8typedefstruct一VA2—Encode—MotionVectorEx8IINT8—INT8y,'UINT8Imagelndex,'U工NT8Distance,'}VA2—Encocie一MotionVectorEx8/成員運(yùn)動(dòng)矢量的x坐標(biāo)。運(yùn)動(dòng)矢量的y坐標(biāo)。對(duì)在對(duì)ComputeMotionVectors的調(diào)用中提供的參考圖像列表的基于0的索引。測(cè)量單位由VA—Encode—MVSurface的DistanceMetric字段指定。它測(cè)量當(dāng)前宏塊與實(shí)際運(yùn)動(dòng)矢量(x,y)所涉及的參考宏塊的距離。3.6.9VA2_Encode_MotionVectorExl6typedefstruct—VA2_Encode_MotionVectorExl6{INT16x,'—INT16y,'UINT16Imagelndex'.UINT16Distance/}VA2一Encode—MQtionVectorExl6;成員X運(yùn)動(dòng)矢量的x坐標(biāo)。運(yùn)動(dòng)矢量的y坐標(biāo)。對(duì)在對(duì)ComputeMotionVectors的調(diào)用中提供的參考圖像列表的基于0的索引。測(cè)量單位由VA_Encode—MVSurface的DistanceMetric字段指定。它測(cè)量當(dāng)前宏塊與實(shí)際運(yùn)動(dòng)矢量(x,y)所涉及的參考宏塊的距離。3.7數(shù)據(jù)結(jié)構(gòu)殘差殘差表面是兩字節(jié)長的有符號(hào)整數(shù)值的數(shù)組一換言之,其類型為INT16。該方案看似在所有重要的情況下都是恰當(dāng)?shù)?。例如,MPEG-2處理9位殘差值,而H.264處理12位殘差。并且,如果原始數(shù)據(jù)是YUV2,則每一亮度值占據(jù)一字節(jié),且因此殘差使用9位(0-255=-255)。此外,應(yīng)用DCT類型的變換將數(shù)據(jù)要求增加到每一殘差值11位。所有這些情況都通過使用2字節(jié)的長整型有符號(hào)殘差值來適當(dāng)?shù)靥幚?。殘差表面的寬度是一行中的殘差值的?shù)量。例如,具有4:2:2的采樣的640x480逐行圖像每行具有640個(gè)亮度值和320個(gè)色度值。相關(guān)聯(lián)的亮度表面的大小是640x480x2,而色度表面的大小是320x480x2字節(jié)。殘差表面是使用D3DFMT一RESIDUE16格式標(biāo)志和VA2_EncodeBuffer資源類型來創(chuàng)建的。3.7.1亮度平面圖IO示出了指示亮度表面的寬度匹配原始的YCbCr圖像的示例性圖示。例如,一個(gè)640x480的圖像每行具有480個(gè)亮度值,因此亮度表面的寬度是480。因此,亮度表面的大小是640x480x2字節(jié)。平面-VA2—Encode—Residue一Y采樣-VA2—Encode—SamplingType」3.7.2色度4:2:2圖11示出了根據(jù)一個(gè)實(shí)施例的指示視頻的每行的殘差值的數(shù)量是原始視頻圖像的寬度的一半的示例性圖示。因此,對(duì)于640x480的圖像,每行的殘差值的數(shù)量以及因此的表面寬度是320。平面-VA2—Encode一Residue一U或VA2—Encode一Residue一V采樣-VA2—Encode—SamplingType—4223.7.3色度4:2:0在此情形中,殘差表面的寬度是原始逐行幀的寬度的一半,并且高度也是一半。因此,對(duì)于640x480的圖像,色度表面本身將是320寬240長。平面VA2—Encode一Residue一U或VA2一Encode一Residue一V采樣-VA2—Encode—SamplingType—4204示例性DDI文檔擴(kuò)展設(shè)備是由VA接口提供的通過(pass-through)機(jī)制,以添加除了現(xiàn)有的視頻解碼器和視頻處理器功能之外的新功能。例如,它們將用于支持新的視頻編碼器功能。擴(kuò)展設(shè)備類似于應(yīng)用程序可用于向驅(qū)動(dòng)程序發(fā)送數(shù)據(jù)/從驅(qū)動(dòng)程序接收數(shù)據(jù)的非類型化漏斗來工作。數(shù)據(jù)的含義對(duì)于VA棧是未知的,并且由驅(qū)動(dòng)程序基于CreateExtensionDevice調(diào)用的pGuid參數(shù)禾口ExtensionExecute的Function參數(shù)來解釋。VA編碼器使用以下GUID值(與IVideoEncoder的uuid相同)(7AC3D93D-41FC-化6c-AlCB-A875E4F5CA4}DEFINE—GUID(VA—Encoder—Extension,0x7ac3d93d,0x41fc,0x4c6c,Oxal,0xcb,0xa8,0x75,0xe4,0xf5,0x7c,0xa4),'4.1枚舉和能力擴(kuò)展設(shè)備使用其類型參數(shù)被設(shè)為G£r£Xr£A^/CWGC//DC6>C/AT或GE7EJiT£:A^/CWGt//A的FA^3DDD/_GiTC4/^來枚舉。編解碼器應(yīng)用程序在由G£7^\T£A^/CWGC//AS返回的擴(kuò)展guid列表中查找五"co&^&c&ww'ow以確定VA編碼支持是否可用。4.1.1FND3DDDI一GETCAPStypedefHRESULT(APIENTRY*PFND3DDDI—GETCAPS)(一HANDLEhAdapter,CONSTD3DDDIARG—GETCAPS*當(dāng)查詢擴(kuò)展設(shè)備(編碼器設(shè)備)的能力時(shí),使用具有以下結(jié)構(gòu)的G五r五;rr五A^/CWCMPS作為D3Z)Z)DL4及G—G^7Tv4尸S結(jié)構(gòu)中的plnfo。4.1.2VADDI_QUERYEXTENSIONCAPSINPUTtypedefstruct一VADDIJ2UERYEXTENSIOMCAPSINPUT{一一CONSTGUID*pGuid,.UINTCapType,'VADDI_PRIVATEDATA*pPrivate'.}VADDI一^bERYEXTENSIONCAPSINPUT,'M"Z)/—gf/五7ra^7^^S76WC4尸S/W尸6T的pGuid參數(shù)被設(shè)為VA_Encoder—Extension。#defineVADDI—Encode一Captype—GuidsVADDI—EXTENSION—CAPTYPE一MIN弁defineVADDI:Encode=Captype=DistanceMetricsVAD5l—EXTENSl5k—CAPTyFe—M工N+1#defineVADDI—Encode—Captype—SearchProfilesVADDI一EXTENSION—CAPTYPE—MIN+2并defineVADD工二Encode二Captype二MECapsVADDI—£kTENSION—6XpTYPE—lSiN+3G五r五Y7^A^S76WC4尸S的輸出在D3Z)DZ)"及G—G五7TM尸S的;Z)ato參數(shù)中封裝。;Z)flto參數(shù)如下解釋Captype—Guids:Type=(GUID*).DataSize=sizeof(GUID)*guid—countCaptype—DistanceMetrics:Type=(GUID*).DataSize=sizeof(GUID)*guid一coimt.Captype—SearchProfiles:Type=(VADDI_Encode—SearchProfile*).DataSize=sizeof(VADDI—Encode_SearchProfile).Captype—MECaps:Type=(VADD乙Encode—MECaps).DataSize=sizeof(V;DDIE歸deMECaps).4.1.3D3DDDIARG_CREATEEXTENSIONDEVICE實(shí)際創(chuàng)建經(jīng)由"!D"£)/_C/^v4r££^T£A^/CW£>£P(guān)7C£調(diào)用發(fā)生,其主自變量如下示出typedefstruct_D3DDDIARG—CREATEEXTENSIONDEVICECONSTGUID*pGuid'*VADDI—PRIVATEDATA*pPrivate,'HANDLEhExtension'.}D3DDDIARG一CREATEEXTENSIONDEV工CE,'4.2編碼功能實(shí)際擴(kuò)展單元功能經(jīng)由z)3ddd/—£xr£A^/cw£X£Ct/r_£調(diào)用來調(diào)用。擴(kuò)展單元的實(shí)例已經(jīng)與一GUID相關(guān)聯(lián),因此擴(kuò)展單元的類型在作出執(zhí)行調(diào)用時(shí)已經(jīng)是已知的。唯一的附加參數(shù)是指示要執(zhí)行的特定操作的Fw""/o"。例如,類型為Encoder(編碼器)的擴(kuò)展設(shè)備可支持MotionEstimation(運(yùn)動(dòng)估計(jì))作為其功能之一。通常,擴(kuò)展設(shè)備具有其自己的枚舉擴(kuò)展設(shè)備的能力的GetCaps函數(shù)。typedefstruct一D3DDDIARG一EXTENSIONEXECUTEHANDLEhExtension,'U工NTFtmctioruVADDI—PRIVATEDATA*pPrivatelnput;VADDI二PRIVATEDATA*pPrivateOutputUINTNumBuffers,'VADDI—PRIVATEBUFFER*pBuffers'*}D3DDDI^"RG一EXTENSIONEXECUTE;pBuffers參數(shù)不被VA編碼器使用,并且應(yīng)被認(rèn)為是一保留參數(shù)。Function參數(shù)對(duì)于VA編碼器取以下值#defineVADDI—Encode—Function—Execute1D3DDDL4iG一五;iTSA^/CW五v^:CLT五的/戶nva^/";wf和;尸n'va&OW/W參數(shù)用于封裝ExecuteAPI調(diào)用的參數(shù)。嵌入在以下輸入和輸出參數(shù)中的編碼專用參數(shù)尚未從API領(lǐng)域映射到DDI領(lǐng)域一但這只是重命名的事情,并且有可能能夠應(yīng)付單個(gè)定義。4.2.1VADDI_Encode_Functioii—Execute_Iiiput該參數(shù)包含對(duì)ExecuteAPI調(diào)用的輸入?yún)?shù)。typedefstruct一VADD工—Encode—Function—Execute—Input{—————UINT32NumDataParameters;VA2一Encode—ExecuteDataParameter**pData;UINT32NumConfigurationParameters'-VAS—Encode—ExecuteConfigurationParameter**pConfiguration,'}VADDI—Encode—Function—Execute—Input4.2.2VADDI_Encode_Function_Execute_Output該結(jié)構(gòu)封裝了來自Execute調(diào)用的輸出數(shù)據(jù)。typedefstruct—VADDI—Encode—Function—Execute—OutputUINT32NumDataParameters,VA2_Encode_ExecuteDataParameter"pData,'}VADD工—Encode一Function一Execute一Output74.3擴(kuò)展設(shè)備結(jié)構(gòu)下節(jié)描述了與VA擴(kuò)展機(jī)制相關(guān)聯(lián)的各種結(jié)構(gòu)和函數(shù)回調(diào)。4.3.1VADDI一PRIVATEBUFFERtypedefstruct一VADDI一PRIVATEBUETERHANDLEhResource^UINTSubResourceIndex''UINTDataOffset'.U工NTDataSize,'}VADDI—PRIVATEBUFFER,'typedefstruct一VADDI—PRIVATEDATA{一—VOID*pData,*UINTDataSize,'}VADDI一PR工VATEDATA,'4.3.2D3DDDIARG_EXTENSIONEXECUTEtypedefstruct一D3DDDIARG—EXTENSIONEXECUTEHANDLEhExtension,'UINTFunction'-VADDI_PRIVATEDATA*pPrivatelnputVADDI_PR;rVATEDATA*pPrivateOutput;UINT一NumBuffers''VADDI_PRIVATEBUFFER*pBuffers;}D3DDDI^"RG—EXTENSIONEXECUTE,-typedefHRESU二T(APIENTRY*PFND3DDDI—CREATEEXTENSIONDEVICE)(一HANDLEhDevice,D3DDDIARG—CREATEEXTENSIONDEVICE*),'—hDevice參數(shù)涉及D3D9設(shè)備,并且是使用對(duì)D3DDDI—CREATEDEVICE的調(diào)用來創(chuàng)建的。43FND3DDDI—DESTROYEXTE腦ONDEVICEtypedefHRESUL/T(AP工ENTRY*PFND3DDDI—DESTROYEXTENS工ONDEV工CE)(_HANDLEhDevice,HANDLEhExtension4.3.4FND3DDDI—EXTENSIONEXECUTEtypedefHRESUI/T(APIENTRY*PFND3DDDI_EXTENSIONEXECUTE)(一HANDLEhDevice,CONSTD3DDDIARG_EXTENSIONEXECUTE*)一4.3,5D3DDDI一DEVICEFUNCStypedefStruct—D3DDDI一DEVICEFUNCSPFND3DDDI—CREATEEXTENSIONDEVICEPFND3DDDI:DESTR0YEXTENSI0NDEVICEPFND3DDDI二EXTENSIONEXECUTEiD3DDDI—DEvf"cEFUNCS,'4.4D3D9結(jié)構(gòu)和函數(shù)以下D3D結(jié)構(gòu)和回調(diào)表示了獲得擴(kuò)展設(shè)備的能力的通用D3D機(jī)制。typedefenum一D3DDDICAPS一TYPE{一一D3DDDICAPS—GETEXTENS工ONGU工DCOUNTD3DDDICAPS二GETEXTENSIONGU工DSD3DDDICAPS二GETEXTENSIONCAPS}D3DDD工CAPS—*FyPE,,typedefstruct—D3DDDIARG—GETCAPS{——D3DDDICAPS—TYPEType;VOID*plnfo,'VOID*pData,'UINTDataSize,'}D3DDD工ARG一GETCAPS5示例性編程模型5.1流水線效率為了實(shí)現(xiàn)最大效率,編碼器應(yīng)用程序以使得CPU以及圖形硬件兩者都被完全利用的方式來結(jié)構(gòu)化。由此,盡管運(yùn)動(dòng)估計(jì)對(duì)于某一幀是正在進(jìn)行中,但是在一不同的幀上運(yùn)行量化步驟可能是有益的。獲得完全硬件利用是用多線程編碼器來促進(jìn)的。5.1.1示例單個(gè)運(yùn)動(dòng)矢量(流水線滿)以下2線程應(yīng)用程序(偽代碼)示出了編碼器實(shí)現(xiàn)2階段軟件流水線的一種方式,并提供了關(guān)于如何高效地使用VA編碼接口的某些方針。特別地,如在軟件線程中所見到的,它實(shí)施了k-AllocatorSize的緩沖。這解決了在提交硬件請(qǐng)求時(shí)存在異步性的事實(shí)硬件線程提交請(qǐng)求,同時(shí)軟件線程稍后拾取該結(jié)果并處理它們。HardwareThread()pfnCreateExtensionDevice,'pfnDestroyExtensionDevice'-pfriExtensicmExecute''=31=32,=33,while(Streaming)LoadFrame(ppI叩utBuffer[n])Codec->ProcessInput(ppI叩utBuffer[n]>//阻塞GetBuffer+Execute}SoftwareThread()k=AllocatorSize()while(Streaming)//k表示流水線階段之間的緩沖區(qū)Codec->ProcessOutput(ppOutputBuffer[n-k〗),.//等待,ReleaseBufferVIiE()Bitstream()'-}}以上的Processlnput(進(jìn)程輸入)可被認(rèn)為是Execute和GetBuffer外部的包裝,而ProcessOutput(進(jìn)程輸出)可被認(rèn)為是執(zhí)行事件上的Wait(等待)以及之后的適當(dāng)ReleaseBuffer調(diào)用外部的包裝。并不清楚如何確定表示流水線階段之間的緩沖區(qū)的參數(shù)k。它表示分配符大小,并且作為一個(gè)起始點(diǎn),可以使用在編解碼器和VA編碼器對(duì)象之間的分配符協(xié)商中使用的同一值(隊(duì)列長度)。如果k大于分配符大小,則Processl叩ut調(diào)用很可能甚至在使用k個(gè)緩沖區(qū)之前無論如何都阻塞。應(yīng)用程序的目標(biāo)應(yīng)是最大化花費(fèi)在SoftwareThread(軟件線程)中的時(shí)間而在ProcessOutput上沒有阻塞。換言之,應(yīng)用程序大多數(shù)時(shí)間應(yīng)在VLE()和Bitstream0函數(shù)上工作。如果硬件非常慢,則盡管分配符大小為"k",ProcessOutput()也將阻塞。軟件將始終"在前面"。以上流水線僅在硬件處理緩沖區(qū)花費(fèi)的時(shí)間與軟件運(yùn)行VLE和Bitstream花費(fèi)的時(shí)間相同的意義上才是高效的。"k"個(gè)緩沖所實(shí)現(xiàn)的全部是填充抖動(dòng)。以下代碼段示出了GetBuffer和ReleaseBuffer的粗略實(shí)現(xiàn)。IVideoEncoder::GetBuffer(Type,ppBuffer,Blocking)if(Empty)if(Blocking)Wait(NotEmptyEvent)'*elsereturnSTATUS—EMPTY}一*ppBuffer=pQueue[Type][Head],-Head++'if(Head==Tail)(Empty=l'.ResetEvent(NotEmptyEvent)returnSOK,'IVideoEncoder::ReleaseBuffer(Type,pBuffer)if((Tail==Head)&&!Empty)returnSTATUS—FULL,'pQueue[Type][Tail]-pBuffer,'Tail++''if(Empty)Empty-false,'SetEvent(NotEmptyEvent);returnSOK/以下略述了Processlnput和ProcessOutput的編解碼器實(shí)現(xiàn):〃本實(shí)現(xiàn)不像普通語義,是阻塞的Codec::Processlnput(工MediaBufferp工nput)GetBuffer(TypeUncompressed,pYUVBuffer,true)GetBuffer(TypeMotionVector,pMVBuffer,true);GetBuffer(TypeResidues,pResidueBuffer,true)memcpy(pYUVBuffer,plnput.Image)Execute(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent)CodecQueue.Enqueue(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent)Codec::ProcessOutput(IMediaBufferpOutput)if(CodecQueue.Empty()){pOutput.dwFlags-DMO—OUTPUT_DATABUFTERF_INCOMPLETE;returnS—FALSE,'}—CociecQueue,Dequeue(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent),'Wait(pEvent)memcpy(pOutput.MVBuffer,pMVBuffer);memcpy(pOutput.ResidueBuffer,pResidueBuffer)ReleaseBuffer(TypeUncompressed,pYUVBuffer)ReleaseBuffer(TypeMotionVector,pMVBuffer);ReleaseBuffer(TypeResidues,pResidueBuffer)returnSOK,'此處是Codec::ProcessI叩ut的一個(gè)替換實(shí)現(xiàn),它如普通語義一樣是非阻塞的。Codec::Processlnput(IMediaBufferplnput)if(GetBuffer(TypeUncompressed,pYUVBuffer,false)==STATUS—EMPTY){一returnDMO—E—NOTACCEPTING,'}——if(GetBuffer(TypeMotionVector,pMVBuffer,false)==STATUS—EMPTY)returnDM0—E一NOTACCEPT工NG;if(GetBuffer(TypeResidues,pResidueBuffer,false)==STATUS_EMPTY)returnDMOENOTACCEPTING,.memcpy(pYUVBuffer,plnput.Image);Execute(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent)CodecQueue-Enqueue(pYUVBuffer,pMVBuffer,pResidueBuffer,pEvent)i5.2.1示例多個(gè)運(yùn)動(dòng)矢量在本節(jié)中,觀察其中編碼器向硬件請(qǐng)求多個(gè)運(yùn)動(dòng)矢量并且基于各種參數(shù)選擇其中一個(gè)并重新提交它們以便處理的更復(fù)雜的流水線。以下代碼單純地如上一樣繼續(xù)使用2階段流水線,請(qǐng)求多個(gè)運(yùn)動(dòng)矢量并重新提交最佳的那一個(gè)。在此實(shí)現(xiàn)中涉及固有串行化。HardwareThread()while(Streaming):LoadFrame(ppI叩utBuffer[r\l);Processlnput(ppInputBuffei:[n])ProcessOutput(ppOutputBuffer[n])SelectMV(ppOutputBuffer[n〗,ppOutputBuffer2[n]),'Pi:ocess工叩ut2(ppOutputBuffer2[n])SoftwareThread()while(Streaming){ProcessOutput2(ppOutputBuffer2[n-k])VLE(ppOutputBuffer2[n-k])Bitst;ceam(ppOutputBuffer2[n-k])在以上示例中,軟件將有一半時(shí)間在ProcessOutput和ProcessOutput2上阻塞,這很明顯是不利于流水線效率的。另一方面,CPU利用是相當(dāng)?shù)偷模⑶铱偼掏铝咳砸哂诜羌铀倬幋a?;?個(gè)線程的3階段流水線將如下解決串行化問題HardwareThreadl()while(Streaming)(LoadFrame(ppInputBuffer[n]),'Processlnput(ppI叩utBuffer[n])HardwareThread2()while(Streaming)ProcessOutput(ppOutputBuffer[nSelectMV(ppOutputBuffer[n-klProcessInput2(ppOutputBuffer2[n,ppOutputBuffer2[n-kl])z-kl]);SoftwareThread()while(Streaming)(ProcessOutput2(ppOutputBuffer2[n--k2]),'VLE(ppOutputBuffer2[n-kl-k2])Bitstream(ppOutputBuffer2[n-kl-k2〗)}由于有3個(gè)流水線階段,因此添加了附加的緩沖區(qū)以便在兩個(gè)硬件階段之間填充。因此有兩個(gè)值kl和k2。權(quán)利要求1.一種用于視頻編碼加速服務(wù)的、至少部分地由計(jì)算設(shè)備實(shí)現(xiàn)的方法,所述方法包括由所述視頻編碼加速服務(wù)從視頻編碼器接收一個(gè)或多個(gè)查詢以標(biāo)識(shí)加速硬件的實(shí)現(xiàn)細(xì)節(jié);響應(yīng)于接收所述一個(gè)或多個(gè)查詢,所述視頻編碼加速服務(wù)與所述加速硬件接口以獲得所述實(shí)現(xiàn)細(xì)節(jié);響應(yīng)于接收所述實(shí)現(xiàn)細(xì)節(jié),將所述實(shí)現(xiàn)細(xì)節(jié)傳送到所述視頻編碼器;以及其中,所述實(shí)現(xiàn)細(xì)節(jié)使得所述視頻編碼器在運(yùn)行時(shí)能夠(a)確定與所述視頻編碼器相關(guān)聯(lián)的軟件編碼操作的速度和質(zhì)量中的一個(gè)或多個(gè)是否能用一個(gè)或多個(gè)支持的編碼流水線配置和能力的特定編碼流水線的實(shí)現(xiàn)來提高;以及(b)通過與所述視頻編碼加速服務(wù)接口來實(shí)現(xiàn)所述特定編碼流水線。2.如權(quán)利要求1所述的方法,其特征在于,所述軟件編碼操作包括運(yùn)動(dòng)估計(jì)、殘差計(jì)算、運(yùn)動(dòng)補(bǔ)償和變換操作中的一個(gè)或多個(gè)。3.如權(quán)利要求l所述的方法,其特征在于,所述軟件編碼操作包括降噪、圖像穩(wěn)定、邊緣檢測(cè)、銳化和幀速率轉(zhuǎn)換操作中的一個(gè)或多個(gè)。4.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)査詢包括獲得能力查詢,并且其中所接收到的實(shí)現(xiàn)細(xì)節(jié)包括與所述一個(gè)或多個(gè)支持的編碼流水線配置相關(guān)聯(lián)的信息。5.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)査詢包括獲得距離度量査詢,并且其中所接收到的實(shí)現(xiàn)細(xì)節(jié)包括所述視頻編碼加速硬件支持的用于運(yùn)動(dòng)估計(jì)操作的一個(gè)或多個(gè)搜索度量的描述。6.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)査詢包括獲得搜索簡檔査詢,并且其中所接收到的實(shí)現(xiàn)細(xì)節(jié)包括所述視頻編碼加速硬件支持的一個(gè)或多個(gè)搜索簡檔的描述,所述一個(gè)或多個(gè)搜索簡檔允許所述視頻編碼器評(píng)估視頻編碼處理時(shí)間和視頻編碼質(zhì)量度量之間的特定于實(shí)現(xiàn)的折衷。7.如權(quán)利要求1所述的方法,其特征在于,所述一個(gè)或多個(gè)查詢包括獲得運(yùn)動(dòng)估計(jì)能力査詢,并且其中,所接收到的實(shí)現(xiàn)細(xì)節(jié)包括指示最大支持圖像大小、最大支持搜索窗大小和加速硬件是否支持可變宏塊大小的指示中的一個(gè)或多個(gè)的數(shù)據(jù)。8.如權(quán)利要求l所述的方法,其特征在于,還包括由所述視頻編碼加速服務(wù)接收包括一組配置參數(shù)的請(qǐng)求以創(chuàng)建實(shí)現(xiàn)所述特定編碼流水線的對(duì)象;以及響應(yīng)于接收到所述請(qǐng)求,基于所述配置參數(shù)來創(chuàng)建所述對(duì)象,所述編碼器對(duì)象用于使用所述特定編碼流水線來對(duì)己解碼的源視頻數(shù)據(jù)進(jìn)行編碼。9.如權(quán)利要求8所述的方法,其特征在于,所述配置參數(shù)指定所述特定編碼流水線、己編碼視頻的輸出格式、用于與所述特定編碼流水線相關(guān)聯(lián)的多個(gè)I/O數(shù)據(jù)流的數(shù)量、用于內(nèi)插亮度和色度值的靜態(tài)配置特性、用于所述I/O數(shù)據(jù)流的建議的數(shù)據(jù)緩沖區(qū)數(shù)量、以及基于可用資源的設(shè)備驅(qū)動(dòng)程序指定的隊(duì)列大小中的一個(gè)或多個(gè)。10.如權(quán)利要求l所述的方法,其特征在于,還包括-由所述視頻編碼加速服務(wù)從所述視頻編碼器接收?qǐng)?zhí)行請(qǐng)求和一組參數(shù),所述執(zhí)行請(qǐng)求對(duì)應(yīng)于與所述特定編碼流水線相關(guān)聯(lián)的操作以對(duì)已解碼的源視頻數(shù)據(jù)進(jìn)行編碼;響應(yīng)于接收到所述執(zhí)行請(qǐng)求,所述視頻編碼加速服務(wù)將所述執(zhí)行請(qǐng)求和所述參數(shù)傳送到所述加速硬件-,從所述加速硬件接收與所傳送的執(zhí)行請(qǐng)求相關(guān)聯(lián)的響應(yīng);以及將所述響應(yīng)轉(zhuǎn)發(fā)給所述視頻編碼器。11.一種包括可由處理器執(zhí)行的計(jì)算機(jī)程序指令的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),所述指令用于由視頻編碼器程序模塊將一個(gè)或多個(gè)請(qǐng)求傳送到視頻編碼加速服務(wù)以標(biāo)識(shí)加速硬件支持的視頻編碼流水線配置和能力中的一個(gè)或多個(gè)的能力;響應(yīng)于從所述視頻編碼加速服務(wù)接收到所述能力,所述視頻編碼器基于所述能力標(biāo)識(shí)與所述視頻編碼器相關(guān)聯(lián)的、在由所述加速硬件實(shí)現(xiàn)的情況下將在速度和質(zhì)量中的一個(gè)或多個(gè)上獲益的一個(gè)或多個(gè)視頻編碼操作;由所述視頻編碼器請(qǐng)求所述視頻編碼加速服務(wù)創(chuàng)建定制視頻編碼流水線,用于經(jīng)由所述加速硬件來實(shí)現(xiàn)所述一個(gè)或多個(gè)視頻編碼操作,使得任何其余的視頻編碼操作以軟件來實(shí)現(xiàn)。12.如權(quán)利要求11所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述一個(gè)或多個(gè)視頻編碼操作包括運(yùn)動(dòng)估計(jì)、殘差計(jì)算、運(yùn)動(dòng)補(bǔ)償和變換操作中的一個(gè)或多個(gè)。13.如權(quán)利要求11所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述一個(gè)或多個(gè)視頻編碼操作包括降噪、圖像穩(wěn)定、邊緣檢測(cè)、銳化和幀速率轉(zhuǎn)換操作中的一個(gè)或多個(gè)。14.如權(quán)利要求11所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,所述用于請(qǐng)求的計(jì)算機(jī)程序指令還包括用于指示所述視頻編碼加速服務(wù)創(chuàng)建所述定制視頻編碼流水線,使得系統(tǒng)存儲(chǔ)器和圖形設(shè)備存儲(chǔ)器之間的數(shù)據(jù)流最小化的指令。15.如權(quán)利要求11所述的計(jì)算機(jī)可讀存儲(chǔ)介質(zhì),其特征在于,還包括可由所述處理器執(zhí)行的用于執(zhí)行以下動(dòng)作的計(jì)算機(jī)程序指令由所述視頻編碼器接收己編碼或已解碼的源視頻數(shù)據(jù);以及如果所接收的源視頻數(shù)據(jù)是己編碼的,則由所述視頻編碼器至少部分地解碼所述源視頻數(shù)據(jù)以生成已解碼的源視頻數(shù)據(jù)以便由所述視頻編碼加速服務(wù)創(chuàng)建的編碼對(duì)象來編碼,所述編碼對(duì)象實(shí)現(xiàn)所述定制視頻編碼流水線。16.如權(quán)利要求11所述的計(jì)算機(jī)存儲(chǔ)介質(zhì),其特征在于,所述計(jì)算機(jī)程序指令還包括用于使用所述定制視頻編碼流水線來編碼已解碼的源視頻數(shù)據(jù)的指令。17.—種計(jì)算設(shè)備,包括供視頻編碼加速服務(wù)執(zhí)行以下動(dòng)作的接口裝置從視頻編碼器接收一個(gè)或多個(gè)査詢,所述一個(gè)或多個(gè)查詢請(qǐng)求所述視頻編碼加速服務(wù)標(biāo)識(shí)加速硬件的實(shí)現(xiàn)細(xì)節(jié),所述實(shí)現(xiàn)細(xì)節(jié)用于使得所述視頻編碼器能夠(a)確定與所述視頻編碼器相關(guān)聯(lián)的軟件編碼操作的速度和質(zhì)量中的一個(gè)或多個(gè)是否能用一個(gè)或多個(gè)支持的編碼流水線配置和能力的特定編碼流水線的實(shí)現(xiàn)來提高;以及(b)經(jīng)由所述視頻編碼加速服務(wù)實(shí)現(xiàn)所述特定編碼流水線以對(duì)已解碼的源視頻數(shù)據(jù)進(jìn)行編碼;查詢所述加速硬件以獲得所述實(shí)現(xiàn)細(xì)節(jié);以及將從所述加速硬件接收到的實(shí)現(xiàn)細(xì)節(jié)傳送到所述視頻編碼器。18.如權(quán)利要求17所述的計(jì)算設(shè)備,其特征在于,所述軟件編碼操作包括運(yùn)動(dòng)估計(jì)、殘差計(jì)算、運(yùn)動(dòng)補(bǔ)償和變換操作中的一個(gè)或多個(gè)。19.如權(quán)利要求17所述的計(jì)算設(shè)備,其特征在于,所述軟件編碼操作包括降噪、圖像穩(wěn)定、邊緣檢測(cè)、銳化、和幀速率轉(zhuǎn)換操作中的一個(gè)或多個(gè)。20.如權(quán)利要求17所述的計(jì)算設(shè)備,其特征在于,所述接口裝置還包括供所述視頻編碼加速服務(wù)執(zhí)行以下動(dòng)作的裝置從所述視頻編碼器接收創(chuàng)建編碼器對(duì)象請(qǐng)求以創(chuàng)建實(shí)現(xiàn)所述特定編碼流水線的編碼器對(duì)象;從所述視頻編碼器接收一個(gè)或多個(gè)執(zhí)行請(qǐng)求以在所述加速硬件中實(shí)現(xiàn)與所述特定編碼流水線相關(guān)聯(lián)的操作;以及將與所述一個(gè)或多個(gè)執(zhí)行請(qǐng)求相關(guān)聯(lián)的信息轉(zhuǎn)發(fā)到所述加速硬件以對(duì)所述已解碼的源視頻數(shù)據(jù)進(jìn)行編碼。全文摘要描述了一種提高視頻編碼的速度和質(zhì)量中的一個(gè)或多個(gè)的視頻編碼加速服務(wù)。該服務(wù)用作任意視頻編碼器計(jì)算機(jī)程序應(yīng)用程序和任意視頻加速硬件之間的中介。該服務(wù)從視頻編碼器接收一個(gè)或多個(gè)查詢以標(biāo)識(shí)視頻加速硬件的實(shí)現(xiàn)細(xì)節(jié)。該服務(wù)與視頻加速硬件接口以獲得實(shí)現(xiàn)細(xì)節(jié)。該服務(wù)將實(shí)現(xiàn)細(xì)節(jié)傳送到視頻編碼器。實(shí)現(xiàn)細(xì)節(jié)使得視頻編碼器能夠(a)確定與視頻編碼器相關(guān)聯(lián)的軟件編碼操作的速度和質(zhì)量中的一個(gè)或多個(gè)是否能用一個(gè)或多個(gè)支持的編碼流水線配置和能力的流水線的實(shí)現(xiàn)來提高;以及(b)通過與該服務(wù)接口來實(shí)現(xiàn)該流水線。文檔編號(hào)H04N7/24GK101390397SQ200780006564公開日2009年3月18日申請(qǐng)日期2007年2月21日優(yōu)先權(quán)日2006年2月24日發(fā)明者A·甘納什,D·J·穆瑟爾,G·F·伊萬斯,G·J·沙利文,S·J·埃斯特羅普,S·薩德瓦尼申請(qǐng)人:微軟公司