針對(duì)Intel移動(dòng)平臺(tái)的實(shí)時(shí)AVS軟編碼方法
【專利摘要】本發(fā)明公開(kāi)了一種針對(duì)Intel移動(dòng)平臺(tái)的實(shí)時(shí)AVS軟編碼方法。本方法為:1)AVS編碼器檢測(cè)當(dāng)前待編碼宏塊的類型,調(diào)用相應(yīng)的I幀編碼單元或P幀編碼單元進(jìn)行編碼;2)在進(jìn)行I幀宏塊編碼時(shí),通過(guò)利用預(yù)測(cè)模式的匹配代價(jià)均值作為閾值實(shí)現(xiàn)預(yù)測(cè)模式遍歷的提前終止;3)在進(jìn)行P幀宏塊編碼時(shí),通過(guò)利用匹配代價(jià)的最小值來(lái)作為閾值實(shí)現(xiàn)參考幀和預(yù)測(cè)模式遍歷的提前終止。在計(jì)算當(dāng)前宏塊和預(yù)測(cè)宏塊之前的匹配代價(jià)(SAD值)時(shí),采用Intel移動(dòng)平臺(tái)特有的SSE指令技術(shù)實(shí)現(xiàn)。本發(fā)明大大提高了處理器利用率,實(shí)現(xiàn)了每秒10幀的視頻采集和編碼。
【專利說(shuō)明】針對(duì)Intel移動(dòng)平臺(tái)的實(shí)時(shí)AVS軟編碼方法
【技術(shù)領(lǐng)域】
[0001]本方法涉及AVS視頻編碼技術(shù)、Android應(yīng)用程序開(kāi)發(fā)技術(shù)、NDK技術(shù)、程序優(yōu)化技術(shù)和SSE技術(shù)。本方法直接應(yīng)用于移動(dòng)平臺(tái)視頻編碼領(lǐng)域,實(shí)現(xiàn)了在Intel移動(dòng)平臺(tái)上的實(shí)時(shí)AVS軟編碼。
【背景技術(shù)】
[0002]AVS視頻編碼技術(shù):
[0003]AVS視頻標(biāo)準(zhǔn)是為了適應(yīng)數(shù)字電視廣播、數(shù)字存儲(chǔ)媒體、因特網(wǎng)流媒體、多媒體通信等應(yīng)用中對(duì)運(yùn)動(dòng)圖像壓縮技術(shù)的需要而制定的。該標(biāo)準(zhǔn)適用的范圍包括但不限于下述領(lǐng)域:數(shù)字地面電視廣播(DTTB, Digital terrestrial televis1n broadcasting) >有線電視(CATV, Cable TV)、交互存儲(chǔ)媒體、直播衛(wèi)星視頻業(yè)務(wù)(DBS, Direct broadcastSatellite video services)、寬帶視頻業(yè)務(wù)、多媒體郵件、分組網(wǎng)絡(luò)的多媒體業(yè)務(wù)(MSPN, Multimedia services on packet networks)、實(shí)時(shí)通信業(yè)務(wù)(視頻會(huì)議,可視電話等)、遠(yuǎn)程視頻監(jiān)控。
[0004]該標(biāo)準(zhǔn)采用了一系列技術(shù)來(lái)達(dá)到高效率的視頻編碼,包括幀內(nèi)預(yù)測(cè)、幀間預(yù)測(cè)、變換、量化和熵編碼等。幀間預(yù)測(cè)使用基于塊的運(yùn)動(dòng)矢量來(lái)消除圖像間的冗余;幀內(nèi)預(yù)測(cè)使用空間預(yù)測(cè)模式來(lái)消除圖像內(nèi)的冗余。通過(guò)對(duì)預(yù)測(cè)殘差進(jìn)行變換和量化消除圖像內(nèi)的視覺(jué)冗余。最后,運(yùn)動(dòng)矢量、預(yù)測(cè)模式、量化參數(shù)和變換系數(shù)用熵編碼進(jìn)行壓縮。
[0005]Android應(yīng)用程序開(kāi)發(fā)技術(shù):
[0006]Android是一種基于Linux的自由及開(kāi)放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦。Android的系統(tǒng)架構(gòu)和其操作系統(tǒng)一樣,采用了分層的架構(gòu),分為四個(gè)層,從高層到低層分別是應(yīng)用程序?qū)?、?yīng)用程序框架層、系統(tǒng)運(yùn)行庫(kù)層和Linux內(nèi)核層。Android開(kāi)發(fā)四大組件分別是:活動(dòng)(Activity):用于表現(xiàn)功能。服務(wù)(Service):后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn)。廣播接收器(BroadcastReceiver):用于接收廣播。內(nèi)容提供商(Content Provider):支持在多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù)。在Android集成開(kāi)發(fā)環(huán)境(IDE)利用上述組件可以完成基本的Android應(yīng)用開(kāi)發(fā)。
[0007]NDK 技術(shù):
[0008]Android NDK (Android Native DevelopmentKit)是一系列的開(kāi)發(fā)工具,允許程序開(kāi)發(fā)人員在Android應(yīng)用程序中嵌入C/C++語(yǔ)言編寫(xiě)的代碼。NDK允許程序開(kāi)發(fā)人員使用C/C++語(yǔ)言進(jìn)行庫(kù)文件開(kāi)發(fā),并提供便捷工具將庫(kù)文件打包到apk文件中。
[0009]程序優(yōu)化技術(shù):
[0010]程序優(yōu)化技術(shù)是指在不改變程序功能的情況下,根據(jù)處理器及系統(tǒng)的特性,通過(guò)修改原來(lái)程序的算法、結(jié)構(gòu),或利用軟件開(kāi)發(fā)工具對(duì)程序進(jìn)行改進(jìn)。使修改后的程序運(yùn)行速度更快或占用空間更小或能耗最低。優(yōu)化的原則有:等效原則、有效原則、經(jīng)濟(jì)原則。優(yōu)化的途徑主要有:程序多線程化、使用處理器專用編譯器、程序結(jié)構(gòu)優(yōu)化、代碼優(yōu)化等。
[0011]SSE 技術(shù):
[0012]SSE是指令集的簡(jiǎn)稱,它包括70條指令,其中包含單指令多數(shù)據(jù)浮點(diǎn)計(jì)算、以及額外的SMD整數(shù)和高速緩存控制指令。其優(yōu)勢(shì)包括:更高分辨率的圖像瀏覽和處理、高質(zhì)量音頻、MPEG2視頻、同時(shí)MPEG2加解密;語(yǔ)音識(shí)別占用更少CPU資源;更高精度和更快響應(yīng)速度。
[0013]現(xiàn)有的同類應(yīng)用存在AVS編碼效率低,處理器利用率低等缺點(diǎn)。
【發(fā)明內(nèi)容】
[0014]針對(duì)現(xiàn)有的同類技術(shù)方案存在AVS編碼效率低、處理器利用率低等問(wèn)題,本發(fā)明提出一種針對(duì)Intel移動(dòng)平臺(tái)的實(shí)時(shí)AVS軟編碼方法。
[0015]本方法首先運(yùn)用Android應(yīng)用開(kāi)發(fā)技術(shù)開(kāi)發(fā)出攝像機(jī)框架。之后運(yùn)用NDK技術(shù)將AVS編碼器移植到Android攝像機(jī)工程中。參照AVS視頻編碼原理和技術(shù),完成對(duì)AVS編碼器的算法優(yōu)化;運(yùn)用程序優(yōu)化技術(shù),完成攝像機(jī)程序的多線程優(yōu)化以及AVS編碼器C程序的結(jié)構(gòu)優(yōu)化和代碼優(yōu)化。最后,使用處理器專用的C編譯器,并使用處理器支持的SSE指令集,優(yōu)化計(jì)算,提高處理器利用率。
[0016]AVS視頻編碼的關(guān)鍵是對(duì)1、P、B三種圖像的編碼(本方法涉及的優(yōu)化只考慮了 I圖像和P圖像,并未涉及B圖像)。而對(duì)I圖像和P圖像的編碼都是以宏塊為單位的,所有關(guān)鍵技術(shù)都體現(xiàn)在對(duì)一個(gè)宏塊的編碼過(guò)程中。下面介紹對(duì)宏塊編碼的優(yōu)化。
[0017]本發(fā)明的技術(shù)方案為:
[0018]一種針對(duì)Intel移動(dòng)平臺(tái)的實(shí)時(shí)AVS軟編碼方法,其步驟為:
[0019]1)AVS編碼器檢測(cè)當(dāng)前待編碼宏塊的類型,如果為I幀宏塊,則調(diào)用I幀編碼單元進(jìn)行編碼;如果為P幀宏塊,則調(diào)用P幀編碼單元進(jìn)行編碼;
[0020]2) P幀編碼單元對(duì)當(dāng)前P幀宏塊進(jìn)行幀間預(yù)測(cè),選擇塊間絕對(duì)誤差和SAD最小的幀間宏塊模式為最佳幀間宏塊模式,將該幀間宏塊模式下得到預(yù)測(cè)宏塊作為最佳預(yù)測(cè)宏塊;將其與當(dāng)前P幀宏塊進(jìn)行殘差計(jì)算,并對(duì)得到的殘差矩陣進(jìn)行變換、量化、熵編碼;
[0021]3)1幀編碼單元對(duì)當(dāng)前I幀宏塊進(jìn)行幀內(nèi)預(yù)測(cè),得到當(dāng)前I幀宏塊的最佳幀內(nèi)預(yù)測(cè)塊,將其與當(dāng)前I幀宏塊進(jìn)行殘差計(jì)算,并對(duì)得到的殘差矩陣進(jìn)行變換、量化、熵編碼;其中,在每次幀內(nèi)預(yù)測(cè)模式遍歷過(guò)程中,判斷當(dāng)前幀內(nèi)預(yù)測(cè)模式下計(jì)算所得的8x8塊率失真代價(jià)是否小于率失真代價(jià)均值,如果是,則將其作為當(dāng)前I幀宏塊的最佳幀內(nèi)預(yù)測(cè)塊,終止遍歷;
[0022]所述率失真代價(jià)均值=所有已計(jì)算幀內(nèi)預(yù)測(cè)模式下8x8塊率失真代價(jià)之和/已計(jì)算的幀內(nèi)預(yù)測(cè)模式數(shù)。
[0023]進(jìn)一步的,獲取所述當(dāng)前P巾貞宏塊的最佳巾貞間宏塊模式的方法為:對(duì)于每一種中貞間宏塊模式的幀間預(yù)測(cè)中,進(jìn)行內(nèi)層循環(huán)參考幀遍歷時(shí),參考幀遍歷過(guò)第一幀后,如果當(dāng)前幀間宏塊模式當(dāng)前子塊對(duì)應(yīng)的代價(jià)小于之前的最小代價(jià),則將當(dāng)前參考幀作為當(dāng)前幀間宏塊模式當(dāng)前子塊的最佳參考幀,此時(shí)當(dāng)前子塊對(duì)應(yīng)的代價(jià)作為最小代價(jià),并終止內(nèi)層循環(huán)參考幀遍歷;對(duì)于外層幀間宏塊模式遍歷,幀間宏塊模式遍歷過(guò)第一種后,如果當(dāng)前幀間宏塊模式下的總代價(jià)小于之前最小總代價(jià),則將當(dāng)前幀間宏塊模式作為當(dāng)前P幀宏塊的最佳中貞間宏塊模式。
[0024]進(jìn)一步的,所述塊間絕對(duì)誤差和(SAD)的計(jì)算方法為:將所有待編碼塊全部分割為8x8塊的單位,然后采用SSE技術(shù)中的_mm_l0adljpi64()指令獲取待編碼8x8塊和預(yù)測(cè)8x8塊中各一整行像素值,然后利用SSE技術(shù)中的_mm_sacU5pu8 O指令計(jì)算這兩行像素值的絕對(duì)誤差和,利用SSE技術(shù)中的_mm_extraCt_epil6()指令提取該絕對(duì)誤差和并將其累加到總絕對(duì)誤差和上;當(dāng)所有行遍歷完后,即得到待編碼8x8塊和預(yù)測(cè)8x8塊之間的絕對(duì)誤差和。
[0025]進(jìn)一步的,所述幀間宏塊模式包括16x16、16x8、8xl6、8x8四種幀間宏塊模式。
[0026]進(jìn)一步的,采用UMHexagons運(yùn)動(dòng)估計(jì)算法進(jìn)行幀間預(yù)測(cè)。
[0027]進(jìn)一步的,所述幀內(nèi)預(yù)測(cè)包括:均值預(yù)測(cè)、水平預(yù)測(cè)、垂直預(yù)測(cè)、平面預(yù)測(cè)、左下對(duì)角預(yù)測(cè)和右下對(duì)角預(yù)測(cè)。
[0028]本方法的有益效果是:
[0029]提升移動(dòng)平臺(tái)上AVS編碼效率,使攝像機(jī)能夠完成每秒10幀的實(shí)時(shí)采集和編碼,提高了處理器利用率。下面結(jié)合測(cè)試實(shí)例進(jìn)行分析。
[0030]將搭載優(yōu)化前AVS編碼器的攝像機(jī)應(yīng)用和搭載優(yōu)化后AVS編碼器的攝像機(jī)應(yīng)用分別在移動(dòng)設(shè)備上運(yùn)行,通過(guò)對(duì)三個(gè)不同的YUV文件進(jìn)行編碼,得到測(cè)試數(shù)據(jù)。對(duì)測(cè)試數(shù)據(jù)進(jìn)行分析,得到測(cè)試數(shù)據(jù)分析結(jié)果。
[0031]移動(dòng)設(shè)備配置如表1所示。
[0032]表1移動(dòng)設(shè)備配置
[0033]
【權(quán)利要求】
1.一種針對(duì)Intel移動(dòng)平臺(tái)的實(shí)時(shí)AVS軟編碼方法,其步驟為: 1)AVS編碼器檢測(cè)當(dāng)前待編碼宏塊的類型,如果為I幀宏塊,則調(diào)用I幀編碼單元進(jìn)行編碼;如果為P幀宏塊,則調(diào)用P幀編碼單元進(jìn)行編碼; 2)P幀編碼單元對(duì)當(dāng)前P幀宏塊進(jìn)行幀間預(yù)測(cè),選擇塊間絕對(duì)誤差和SAD最小的幀間宏塊模式為最佳幀間宏塊模式,將該幀間宏塊模式下得到預(yù)測(cè)宏塊作為最佳預(yù)測(cè)宏塊;將其與當(dāng)前P幀宏塊進(jìn)行殘差計(jì)算,并對(duì)得到的殘差矩陣進(jìn)行變換、量化、熵編碼; 3)I幀編碼單元對(duì)當(dāng)前I幀宏塊進(jìn)行幀內(nèi)預(yù)測(cè),得到當(dāng)前I幀宏塊的最佳幀內(nèi)預(yù)測(cè)塊,將其與當(dāng)前I幀宏塊進(jìn)行殘差計(jì)算,并對(duì)得到的殘差矩陣進(jìn)行變換、量化、熵編碼;其中,在每次幀內(nèi)預(yù)測(cè)模式遍歷過(guò)程中,判斷當(dāng)前幀內(nèi)預(yù)測(cè)模式下計(jì)算所得的8x8塊率失真代價(jià)是否小于率失真代價(jià)均值,如果是,則將其作為當(dāng)前I幀宏塊的最佳幀內(nèi)預(yù)測(cè)塊,終止遍歷; 所述率失真代價(jià)均值=所有已計(jì)算幀內(nèi)預(yù)測(cè)模式下8x8塊率失真代價(jià)之和/已計(jì)算的幀內(nèi)預(yù)測(cè)模式數(shù)。
2.如權(quán)利要求1所述的方法,其特征在于獲取所述當(dāng)前P幀宏塊的最佳幀間宏塊模式的方法為:對(duì)于每一種幀間宏塊模式的幀間預(yù)測(cè)中,進(jìn)行內(nèi)層循環(huán)參考幀遍歷時(shí),參考幀遍歷過(guò)第一幀后,如果當(dāng)前幀間宏塊模式當(dāng)前子塊對(duì)應(yīng)的代價(jià)小于之前的最小代價(jià),則將當(dāng)前參考幀作為當(dāng)前幀間宏塊模式當(dāng)前子塊的最佳參考幀,此時(shí)當(dāng)前子塊對(duì)應(yīng)的代價(jià)作為最小代價(jià),并終止內(nèi)層循環(huán)參考幀遍歷;對(duì)于外層幀間宏塊模式遍歷,幀間宏塊模式遍歷過(guò)第一種后,如果當(dāng)前幀間宏塊模式下的總代價(jià)小于之前最小總代價(jià),則將當(dāng)前幀間宏塊模式作為當(dāng)前P幀宏塊的最佳幀間宏塊模式。
3.如權(quán)利要求1或2所述的方法,其特征在于所述塊間絕對(duì)誤差和SAD的計(jì)算方法為:將所有待編碼塊全部分割為8x8塊的單位,然后采用SSE技術(shù)中的_mm_loadl_^)i64 0指令獲取待編碼8x8塊和預(yù)測(cè)8x8塊中各一整行像素值,然后利用SSE技術(shù)中的_mm_sad_epu8 O指令計(jì)算這兩行像素值的絕對(duì)誤差和,利用SSE技術(shù)中的_mm_extract_epil6 O指令提取該絕對(duì)誤差和并將其累加到總絕對(duì)誤差和上;當(dāng)所有行遍歷完后,即得到待編碼8x8塊和預(yù)測(cè)8x8塊之間的絕對(duì)誤差和。
4.如權(quán)利要求1或2所述的方法,其特征在于所述幀間宏塊模式包括16xl6、16x8、8xl6、8x8四種巾貞間宏塊模式。
5.如權(quán)利要求1或2所述的方法,其特征在于采用UMHexagons運(yùn)動(dòng)估計(jì)算法進(jìn)行巾貞間預(yù)測(cè)。
6.如權(quán)利要求1所述的方法,其特征在于所述幀內(nèi)預(yù)測(cè)包括:均值預(yù)測(cè)、水平預(yù)測(cè)、垂直預(yù)測(cè)、平面預(yù)測(cè)、左下對(duì)角預(yù)測(cè)和右下對(duì)角預(yù)測(cè)。
【文檔編號(hào)】H04N5/232GK104168481SQ201410355678
【公開(kāi)日】2014年11月26日 申請(qǐng)日期:2014年7月24日 優(yōu)先權(quán)日:2014年7月24日
【發(fā)明者】劉宏志, 李 浩, 吳中海, 張興 申請(qǐng)人:北京大學(xué)