1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      基于DM642的X264開源代碼實現的研究

      更新時間: 2009-08-14 08:14:35來源: 粵嵌教育瀏覽量:1304

       本文概述了H.264視頻壓縮編碼標準的主要特性,簡要介紹了當前H.264的幾種開源軟件。

             詳細分析了其中X264參考程序的具體結構,并針對TMS320DM642平臺建議了可能的優化方向。

             引言

             H.264/AVC是ISO/IEC和ITU-T兩大國際標準化組織聯合制定的新一代視頻編碼標準。它引入多種宏塊劃分、多模式的幀內和幀間預測編碼、高精度亞像素運動估計、多參考幀運動補償等技術,提高了壓縮比;采用整數DCT變換,避免了精度的損失。在碼流結構上,提出VCL層和NAL層的概念,其中增加的NAL層負責將編碼器的輸出碼流適配到各種類型的網絡中,提供了友好的網絡接口。同時,標準提供的許多工具如參數集、靈活的宏塊排列次序、冗余片等,使得H.264的碼流在網絡中傳輸時具有更強的抗誤碼性能。基于H.264的實時編解碼器設計與實現已經成為當前視頻通信領域的熱點問題。

            1、H.264開源代碼簡介

             H.264所具有的獨特優勢促進了與之對應的開源軟件的開發與應用。目前常見的H.264開源軟件編解碼器有以下三種 :

             1)JM

             H.264的官方測試源碼,由德國HHI研究所負責開發。該代碼旨在實現H.264的所有特性,因而結構冗長,編碼復雜度極高,多用于學術研究,不適于實際應用。

             2)X264

             X264是由法國巴黎中心學校的中心研究所于2004年6月發起,并由許多視頻編碼愛好者共同完成的項目。其目標是實現實用的264編碼器,所以它引入MMX、SSE等匯編指令來提高編碼速度,同時摒棄了一些耗時但對編碼性能提高微小的模塊,如多參考幀等。

             3)T264

             由中國視頻編碼自由組織聯合開發的H.264編解碼器。它和X264一樣注重實用,吸收了JM、X264、XVID的優點。但其解碼器只能解T264編碼器生成的碼流。

            2、X264代碼分析

             本文所介紹的X264為060418版,下文所提到的程序結構和運行結果如不作特殊說明均針對該版本。

             代碼的實現流程如圖1所示。


      圖1  X264編碼流程圖

             整個代碼的執行可以分為以下三個部分:

             1)數據的讀入與存放

             X264開辟了unused、next、current、reference等區域分別保存未處理原始圖片序列、即將編碼幀序列、當前編碼幀和參考幀序列,同時還開辟了fenc和fdec區域用于存放已編碼幀和重構幀。

             程序按以下順序讀入數據:首先,從YUV數據文件中讀取數據存到臨時變量pic_in,同時為unused開辟存儲空間,并用fenc指針指向這個空間。接著,將pic_in中的圖片數據拷貝到fenc所指向的區域,并在拷貝完成后對圖片大小進行判斷,如果長寬不為16的整數倍則進行像素擴展;將處理后的fenc區域數據放入next區域。之后,如果存在B幀,則從next區域取出B幀以后的P幀放到current區域中,也就是說先編碼I、P幀再編碼之間的B幀;否則,直接從next區域取出一幀存入current區域。此時current區域中存放的就是已經過預處理的即將要編碼的幀數據了。,由于fenc區域是編碼的直接對象,再將current區域中的內容拷貝到fenc中正式開始編碼。

             2)數據的壓縮編碼

             ①判斷幀類型,初始化相關參數

             如果是IDR幀,意味著是一個新切片的開始。在H.264中為了防止編碼錯誤擴散規定當前切片不以本切片以外的其它幀為參考,因而遇到IDR幀需要重置參考幀區域。同時,將SEI(Sequence Enhancement Information)、SPS(Sequence Parameter Set)和PPS(Picture Parameter Set)分別單獨寫入NAL單元。這三個參數集集合了編解碼的核心參數,直接關系解碼端能否正常解碼。如果不是IDR幀,依據幀類型設定當前NAL單元的類型和切片類型。

              接著進行一系列初始化參數的操作,包括建立關于參考幀的list0和list1,初始化量化參數QP、MV、參考幀等相關變量,初始化比特流的起始位置和大小等。

              ②以宏塊為單位對視頻數據進行編碼

              在進行預測編碼之前必須得到周圍塊的相關信息。在X264中開辟了intra4x4_pred_mode和non_zero_count區域用來存放當前宏塊左側和上側相鄰宏塊的預測模式和非零值個數。在編碼開始之前通過x264_macroblock_cache_load()函數將相關數據載入緩存。然后,利用x264_macroblock_analyse()函數分析參數,確定編碼模式。I片從9種4x4模式和4種16x16模式中選擇模式; P片選擇幀間預測模式下的宏塊分割方式或幀內預測模式下的4x4模式和16x16模式。接著,用x264_macroblock_encode()函數對宏塊進行編碼。編碼過程嚴格按照編碼框架中規定的DCT變換、zigzag掃描和熵編碼的過程以先亮度塊再色度塊的順序進行。需要聲明的是編碼過程對DC參數和AC參數的處理是分開進行的:首先對整個宏塊進行DCT變換,然后將亮度塊和色度塊的DC參數抽出分別組成4×4和2×2的子塊并對剩余AC參數進行量化掃描,接著對DC子塊再進行Hadmard變換、量化、zigzag掃描、反變換、反量化,再對剩下的AC參數進行反量化,將處理后的DC子塊和AC子塊重新組合并對組合后的宏塊進行IDCT變換。

              以上過程完畢以后,統計CBP(Coded Block Pattern)信息。CBP一共6bit,用于表示當前宏塊是否存在非零值,主要用于決定熵編碼時采用的碼表。其中,高2bit表示2個8×8色度塊的CBP (2:Cb、Cr中至少一個4×4塊的AC系數不全為0;1:Cb、Cr中至少一個2×2的DC系數不全為0;0:所有色度系數全0)。低4bit分別對應4個8×8亮度塊,第i位(i= 0、1、2、3)表示一個MB中第i行的4個4×4子塊是否有非零參數。若存在非零值,則將相應位置1。將各子塊的非零值個數保存到non_zero_count區域。使用先前得到的CBP查相應碼表進行熵編碼,將編碼參數和編碼數據寫入比特流。

             ③保存編碼信息

             利用x264_macroblock_cache_save()函數將當前MB下一行和右一列的子塊的編碼模式保存到intra4x4_pred_mode,將子塊非零參數的個數保存到non_zero_count中,以備下一次預測編碼采用。,統計MB信息,更新參考幀列表,并從unused區域取出新的幀放入fenc區域以備下次編碼。

              3)數據的輸出

            對NAL編碼數據加上NAL頭信息組成完整的NAL單元,輸出到本地文件。

             3、X264在TMS320DM642平臺上的移植與優化

              原始的X264代碼是基于PC平臺的,程序通過采用MMX和SSE語言編寫SAD、DCT等函數使X264具有很高的編碼速度。而在實際應用中,要想實時實現H.264的復雜算法,必須借助DSP這樣具有超強運算能力的嵌入式平臺。本文采用TMS320DM642開發板作為實現和開發的平臺,并在其上進行代碼的移植和優化。

              1)TMS320DM642硬件平臺簡介

              TMS320DM642是一款基于TI 的第二代高性能超長指令字(VLIW) 架構VelociTI.2(tm)的高性能DSP,該器件是目前計算密集型視頻/圖像應用領域的理想選擇,其主要特點如下 :

              ① 增強功能單元:DM642 的8 個功能單元中的VelociTI.2 擴展包括加速視頻與影像應用性能的新指令。

              ② L1/L2 分級存儲器結構:16 KB 直接映射的L1P 程序高速緩存,16 KB 雙路關聯L1D 數據高速緩存,256 KB L2 統一映射RAM/高速緩存(靈活的RAM/緩存分配)。

              ③ 64 位外部存儲器接口(EMIF):可實現與異步存儲器和同步存儲器無縫連接。

               ④ 增強型直接存儲器存取(EDMA)控制器(64個獨立通道)。

              以DM642為硬件平臺開發視頻編碼器,開發者可以充分利用其硬件特性,提高視頻編解碼算法的運算速度。

                2)X264的移植

                由于適用于PC機通過MMX和SSE編寫的代碼在DSP上無法運行,想要使X264代碼在DM642上運行,必須將原來的代碼加以修改使其變成純C語言的代碼。具體做法是:在X264代碼中將HAVE_MMX編譯選項屏蔽,同時將代碼中與該編譯選項相關的代碼注釋掉。當程序成為純C代碼時,就可以開始往DM642上移植了。

               然而,DSP開發工具CCS有自己的ANSI C編譯器和優化器,并有自己的語法規則和定義。所以需要將代碼作相應修改,使其完全符合DSP中C的規則,同時要配置CCS的編譯選項,才能使X264在CCS和VC下運行產生的結果一致。這個過程稱為代碼的DSP化。

              由于純C語言編寫的程序無法利用DSP的并行處理機制,此時代碼的運行速度非常慢。在DM642平臺上,對相同的YUV數據(此處采用container.qcif)進行編碼,若采用帶X86匯編的X264代碼(DCT和SAD部分采用匯編代碼)在VC環境下運行,編碼速度能達到QCIF 60fps;若將代碼改為純C語言仍然在VC下運行,則編碼速度馬上降到QCIF 10fps ;將該代碼稍作修改移植到DM642的硬件平臺,用CCS編譯,編碼速度僅能達到1幀/6秒。這樣的速度離實時處理的目標還非常遙遠。

              所以,必須結合DSP本身的特點,對代碼進行優化,才能在DM642平臺上實現X264對視頻圖像的實時處理。

              3)X264的優化

              X264代碼的優化分為三個層次:項目級優化,算法級優化和指令級優化。

              ①項目級優化:主要通過設置CCS編譯器的選項,調整代碼結構和合理分配內存來實現。如設置-o3選項,將常用數據分配到訪問速度高的片內內存等。

               ②算法級優化:提出快速高效算法,從算法上挖掘潛力,提高運行速度,達到優化目的。用X264支持的4種運動估計算法(菱形搜索算法、六邊形搜索算法、非對稱十字型多層次六邊形格點搜索算法和連續消除法)處理同樣的YUV數據(此處仍為container.qcif),編碼速度分別為13fps、11fps、9fps和4fps,可見不同的運動估計算法引起的編碼速度的差別非常明顯。

               ③指令級優化:這部分又可以分為C語言級的優化和匯編級的優化。前者主要包括消除冗余代碼、調整數據類型、優化程序結構、打開for循環和充分利用內聯函數等操作。后者主要是將耗時函數抽取出來,用線性匯編改寫,充分利用豐富的媒體處理指令,限度的利用DSP的并行性,加快編碼速度。匯編級優化涉及到的主要部分有SAD計算、DCT變換、反DCT變換、量化等過程比較規范,重復性比較高的計算過程。

              4、結束語

             目前,H.264視頻編碼技術以其獨有的優勢,受到業界幾乎所有主流視頻相關設備、產品廠商的支持。由于完全獨立開發編解碼器所需要的人力和物力都很大,許多公司和團體都采用直接修改移植開源代碼的方式以求縮短開發周期。在目前可選的幾種開源代碼中, X264以其結構精簡適于應用的特點,成為眾多團體選擇的對象。熟悉X264代碼,以此為基礎將其移植到DSP平臺并進行優化,對構建高效的多媒體平臺具有一定的實際意義。

            

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲综合色区另类小说久久久 | 亚洲中文字幕二区三区 | 日本中文字幕aⅴ高清看片 亚洲欧美性综合在线 | 三上悠亚AV福利在线观看 | 亚洲另类视频免费看 | 中文字幕婷婷日韩欧美亚洲 |