<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 模擬技術(shù) > 設(shè)計(jì)應(yīng)用 > 基于DM642的X.264編碼器優(yōu)化

          基于DM642的X.264編碼器優(yōu)化

          作者: 時(shí)間:2011-10-26 來源:網(wǎng)絡(luò) 收藏
          從表中可以看到,采用P幀半像素搜索方式對(duì)編碼速度提升30%以上,并且視覺上解壓出來的圖像沒有明顯失真。

            (3)對(duì)全像素塊運(yùn)動(dòng)預(yù)測(cè)搜索的方式,默認(rèn)為HEX(正六邊形搜索半徑為2),在對(duì)比測(cè)試了DIA(菱形搜索,半徑為1)和UMH(可變半徑六邊形搜索)后,對(duì)比了速率和峰值信噪比后,發(fā)現(xiàn)在峰值信噪比相差很小的情況下DIA搜索速率最快,本文選擇DIA作為運(yùn)動(dòng)預(yù)測(cè)搜索方式。表4給出3種方式的對(duì)比結(jié)果:

            

          基于DM642的X.264編碼器優(yōu)化

            2.2 代碼優(yōu)化

            需要有效的利用的特性,如軟件流水,芯片特性和指令集等,才能有效的提高X.264平臺(tái)的編碼效率。為了X.264能夠充分的利用起的特性,需要結(jié)合DM642本身的特點(diǎn)對(duì)移植過后的X.264代碼進(jìn)行優(yōu)化,才能夠提高X.264在DM642上執(zhí)行的效率。

            TI公司的DSP開發(fā)軟件CCS提供了功能非常強(qiáng)大的編譯器,編譯工具可以對(duì)代碼進(jìn)行各種優(yōu)化,以提高代碼的執(zhí)行速度,減小代碼尺寸。這些優(yōu)化包括了簡化循環(huán)、軟件流水、語句和表達(dá)式的順序重排和分配變量到寄存器。利用CCS編譯器進(jìn)行優(yōu)化后,仍然不能滿足視頻壓縮的需求,需要繼續(xù)對(duì)DM642上的X.264進(jìn)行優(yōu)化。

            (1)內(nèi)聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)是指用函數(shù)本身來代替函數(shù)調(diào)用這一過程。當(dāng)調(diào)用內(nèi)聯(lián)函數(shù)時(shí),C/C++源代碼把此函數(shù)插入到調(diào)用點(diǎn),而不采用傳統(tǒng)的跳轉(zhuǎn)。將函數(shù)設(shè)定為內(nèi)聯(lián)函數(shù)后,可以去掉復(fù)雜的函數(shù)調(diào)用過程來提高函數(shù)的執(zhí)行效率,而付出的代價(jià)是增加了代碼所占用的空間。使用關(guān)鍵字inline定義內(nèi)聯(lián)函數(shù),在X.264編碼器中的預(yù)測(cè)部分對(duì)其中一個(gè)頻繁調(diào)用的函數(shù)設(shè)置為內(nèi)聯(lián)。代碼如下:

            static inline inI clip_uint8(int a)

            (2)restrict關(guān)鍵字。為了幫助編譯器確定存儲(chǔ)器相關(guān)性,可以使用關(guān)鍵字restrict來限定指針、引用或數(shù)組。使用restrict關(guān)鍵字是為了確保其限定的指針在聲明的范圍內(nèi),是指向特定對(duì)象的惟一指針。編譯器在讀取函數(shù)的指針,數(shù)據(jù)時(shí),采取保守的辦法,認(rèn)為它們是相關(guān)的。這時(shí)編譯出的代碼必須執(zhí)行完前次寫操作,才能開始下次讀取操作。加入restrict關(guān)鍵字后,編譯器將認(rèn)為指針和數(shù)組沒有相關(guān)性,能夠并行提取數(shù)據(jù)。

            (3)軟件流水。軟件流水式編排循環(huán)指令是能夠使循環(huán)的多次迭代并行執(zhí)行的技術(shù)。編譯器總是力爭使用軟件流水技術(shù)。軟件流水是DSP的關(guān)鍵技術(shù),它利用的是算法中存在的指令并行性的特點(diǎn),使一個(gè)循環(huán)的多次迭代同時(shí)進(jìn)行??偟貋碚f,當(dāng)使用編譯器優(yōu)化的情況下,代碼尺寸小,程序性能更優(yōu)。x.264代碼含有很多循環(huán)操作,故提高循環(huán)體指令的并行度使循環(huán)能夠軟件流水是提高編碼效率的有效途徑之一。

            (4)函數(shù)合并。函數(shù)調(diào)用的過程中,要執(zhí)行一些額外的寄存器。在編碼過程中DCT、量化、zigzag、IDCT和反量化函數(shù)調(diào)用都非常頻繁,但代碼段都很短,部分代碼只包含一個(gè)循環(huán)操作或者賦值操作。反復(fù)的調(diào)用會(huì)花費(fèi)大量運(yùn)行周期在函數(shù)調(diào)用上。為減少不必要的操作,提高速度,將DCT變換、量化、反量化和反DCT變化的整個(gè)過程進(jìn)行優(yōu)化,將幾個(gè)函數(shù)合并到一個(gè)函數(shù)中。圖1所示為合并結(jié)構(gòu)。

            

          基于DM642的X.264編碼器優(yōu)化
          2.3 DM642的優(yōu)化

            (1)CACHE優(yōu)化。DM642采用了兩級(jí)CACHE的存儲(chǔ)器結(jié)構(gòu),兩級(jí)CACHE主要用于對(duì)程序和數(shù)據(jù)的緩存。CPU直接和一級(jí)CACHE連接,一級(jí)CACHE包括L1P(程序)和L1D(數(shù)據(jù)),大小分別為16 KB,分別占用獨(dú)立的存儲(chǔ);一級(jí)CACHE的存儲(chǔ)速度與CPU處理速度相同。一級(jí)CACHE與二級(jí)CACHE相連,稱為L2,大小為256 kB,可以對(duì)程序和數(shù)據(jù)進(jìn)行統(tǒng)一存取,L2 CACHE作為L1CACHE和片外存儲(chǔ)器之間的一個(gè)橋梁,可以由設(shè)計(jì)人員自行配置大小,分為SRAM和CACHE。L2CACHE的速度為CPU的一半。經(jīng)過試驗(yàn)對(duì)比,將L2分為128 kBCACHE和128 kB SRAM。將部分調(diào)用比較頻繁的函數(shù)和數(shù)據(jù)常量放在L2SRAM中,以提高讀寫速度。

            (2)EDMA。EDMA是增強(qiáng)的直接存儲(chǔ)器訪問,增加了高達(dá)64個(gè)傳輸通道,每個(gè)通道相互獨(dú)立,且通道間的優(yōu)先級(jí)可以設(shè)置。CIF格式的圖像格式為352×288,一幀數(shù)據(jù)需要101 376 b,L2的CACHE容量有限,不能將所需要的參考幀和當(dāng)前編碼幀都放到片內(nèi)CACHE中。X.264處理的最小模塊為宏塊16×16,將當(dāng)前編碼宏塊保存到片內(nèi)CACHE中來提速,DSP運(yùn)行的同時(shí)將片外的下一編碼宏塊傳輸?shù)狡瑑?nèi)。采用EDMA的ping-pong緩沖技術(shù)可以對(duì)X.264編碼器的數(shù)據(jù)傳輸部分進(jìn)行優(yōu)化。這樣既利用了DM642片內(nèi)數(shù)據(jù)存儲(chǔ)速度快的優(yōu)點(diǎn),又避免了使用較多的片內(nèi)存儲(chǔ)空間。ping-pong緩沖結(jié)構(gòu)中EDMA與CPU的工作原理如圖2所示。

            

          基于DM642的X.264編碼器優(yōu)化

            3 優(yōu)化結(jié)果

            完成對(duì)代碼的優(yōu)化過后,通過CCS的編譯將x2



          關(guān)鍵詞: DM642 X.264 編碼器

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();