基于DSP和FPGA的視頻編碼器
2 視頻壓縮算法優(yōu)化
(1)MPEG-4數據流優(yōu)化設計
實(shí)驗表明,如果代碼和代碼要訪(fǎng)問(wèn)的數據在C6201片內存儲區(PRAM和DRAM),其代碼執行速度要比代碼和數據在片外同步SDRAM中平均快17倍(片內總線(xiàn)寬度為256位,數據訪(fǎng)問(wèn)為1個(gè)CPU周期)。因此,將執行代碼和數據放到片內將大大提高程序的運行速度。
在MPEG-4算法中,由于沒(méi)有考慮存儲器的限制,算法每次讀入一幀YUV數據進(jìn)行壓縮編碼。但對于C6201來(lái)說(shuō),片內只有64K字節DRAM,不可能一次將一幀數據讀到片內存儲器進(jìn)行壓縮。如果將一幀數據一次讀到片外存儲器(SDRAM)中進(jìn)行壓縮,又會(huì )大大降低代碼的執行速度,因此,我們對視頻壓縮算法進(jìn)行了改進(jìn),一次對一個(gè)切片(slice)數據進(jìn)行壓縮編碼,并將壓縮碼流數據直接送入到發(fā)送緩沖區中。
編碼器一次將一個(gè)切片的YUV數據(當前幀)讀入到片內存儲器中,然后根據計算決定切片宏塊的編碼類(lèi)型(幀內/幀間編碼)。如果宏塊進(jìn)行幀內編碼,則YUV數據被分成8×8的像素塊(一個(gè)宏塊包含4個(gè)Y分量像素塊和2個(gè)UV分量像素塊)進(jìn)行DCT變化,以消除圖像空間冗余信息。DCT變化后的系數經(jīng)過(guò)量化后進(jìn)行游程編碼(RunLengthCoding即RLC)和變長(cháng)編碼(VariableLengthCoding,即VLC),變長(cháng)編碼的結果送入到視頻發(fā)送緩沖區中。與此同時(shí),量化后的DCT系數經(jīng)過(guò)反量化(結果放入內存B中)和反DCT過(guò)程形成重建幀,重建幀用作下一幀的參考幀。
如果宏塊進(jìn)行幀間編碼,則以宏塊為單位進(jìn)行運動(dòng)估計,根據運動(dòng)估計的結果建立預測幀。當前幀和預測幀的差值形成了殘差幀(residue frame),殘差幀的編碼過(guò)程與幀內編碼過(guò)程相同。
(2)宏塊編碼類(lèi)型判別算法
在MPEG-4算法中采用了快速運動(dòng)估計算法,但是在進(jìn)行宏塊編碼類(lèi)型判別時(shí)計算量仍然很大。為此,本文提出了基于宏塊空間復雜度的判別算法MTJBSC,進(jìn)一步降低了運動(dòng)估計過(guò)程中的計算量。
在編碼P幀宏塊的時(shí)候,首先要決定宏塊是進(jìn)行幀內編碼還是幀間編碼。在標準MPEG-4算法中是通過(guò)以下方法決定的[5]:
設參考宏塊的像素值(Y分量值,以下同)用P(x,y)表示,當前宏塊的像素值用C(x,y)表示,x,y表示宏塊的縱、橫坐標,M,N表示宏塊的寬和高。當前宏塊像素值的方差用EVAR表示,其值為
參考宏塊和當前宏塊的方差用EVMC表示,其值為
EVMC值越小(比如EVMC if(EVMC>EVARandEVMC≥9)then幀內編碼else幀間編碼 顯然,在MPEG-4算法中,為了判斷宏塊的編碼模式進(jìn)行了大量的計算(對于每一個(gè)P幀宏塊都要進(jìn)行上面的計算)。為了減少計算復雜度,本文提出了基于宏塊空間復雜度(EMBC)的宏塊類(lèi)型判斷(MTJBSC)算法,用以判斷P幀宏塊的幀內/幀間編碼模式。 定義宏塊的空間復雜度為水平方向上相鄰像素差值的絕對值之和,即 在基于幀間差原理進(jìn)行視頻壓縮的MPEG標準中,一般都是采用絕對差總合(ESAD)來(lái)進(jìn)行運動(dòng)估計的。在MPEG標準中,宏塊的ESAD值定義為 式中:m,n為該宏塊的運動(dòng)向量。 根據上述定義,MTJBSC算法可簡(jiǎn)單描述為: 如果宏塊的ESAD小于其EMBC,則該P幀宏塊進(jìn)行幀間編碼;否則進(jìn)行幀內編碼。實(shí)驗表明,在壓縮質(zhì)量和壓縮輸出碼率均沒(méi)有大的變動(dòng)的情況下,該算法有效降低了視頻編碼器的計算復雜度,編碼器的壓縮幀率(f/s)得到明顯提高。
評論