基于TMS320C64x 的MPEG-4實時編碼器設(shè)計與實現(xiàn)
首先主機通過PCI初始化DSP并對其加載程序;DSP開始運行MPEG-4編碼程序,從視頻端口獲取實時采集的視頻,如圖1所示。SAA7113輸出BT.656格式的數(shù)字視頻,作為DM642 VPORT的輸入,VPORT輸出YUV(4:2:0)格式的圖像,作為編碼程序的輸入;DSP完成一幀圖像的編碼,通過PCI向主機發(fā)出中斷;主機響應(yīng)中斷,從DSP的存儲空間讀取原始圖像數(shù)據(jù)和壓縮后的碼流。主機程序在VC++環(huán)境下編寫,提供與用戶交互的界面,可對數(shù)據(jù)進行各種處理,包括原始視頻的實時播放、保存,壓縮碼流的實時解壓播放、保存、回放、網(wǎng)絡(luò)傳輸,從網(wǎng)絡(luò)接收壓縮碼流實時解壓回放等。
需要注意的是原始圖像和壓縮碼流在DSP中的存儲。視頻端口、編碼程序和主機都要訪問原始圖像,例如在某一時刻,編碼程序訪問當前幀圖像,主機讀取上一幀圖像,而視頻端口正在輸入下一幀圖像,為了避免訪問沖突,原始圖像在DSP中采用三緩沖區(qū)進行管理。壓縮碼流由編碼程序?qū)懭?主機讀取,所以采用乒乓制進行存儲。
1.3 內(nèi)存分配
DM642片內(nèi)只有256KB的存儲空間,因此當前幀、參考幀和當前幀的重建幀都必須放至片外存儲器,壓縮碼流若被主機讀取,也放至片外。其它數(shù)據(jù)如程序代碼、全局變量、VLC碼表、各編碼模塊產(chǎn)生的中間數(shù)據(jù)等均可放至片內(nèi)。
由于CPU訪問片外的速度通常要比訪問片內(nèi)慢幾十倍,片外數(shù)據(jù)的傳輸通常成為程序運行時的瓶頸,即使代碼效率很高,流水線也會因為等待數(shù)據(jù)而被嚴重阻塞。解決這一問題的有效方法是用EDMA傳送數(shù)據(jù)。程序是逐個宏塊進行編碼的,在編碼當前宏塊的同時,EDMA將下一個宏塊的數(shù)據(jù)、用到的參考幀數(shù)據(jù)由片外傳送至片內(nèi);當前宏塊做完運動補償后,EDMA將重建后的宏塊由片內(nèi)傳送至片外。這樣CPU只對片內(nèi)數(shù)據(jù)進行操作,使得流水線可以順利進行,而壓縮碼流按逐個碼字有時間間隔地寫入,可由CPU直接寫至片外。
2 采用預(yù)測技術(shù)的運動估計算法
運動估計是MPEG-4編碼中計算量最大的一部分,占據(jù)整個編碼時間的50%以上。各種快速運動估計算法也成為近年來研究的熱點。本文通過實驗證明,采用預(yù)測技術(shù)的運動估計不但可以大大縮短計算時間,而且也有助于提高圖像的質(zhì)量。
宏塊(Macro Block)的運動矢量(Motion Vector)在時間和空間都具有相關(guān)性,預(yù)測的原理就是利用當前幀和參考幀內(nèi)相鄰位置宏塊的MV來預(yù)測當前宏塊的MV。下面詳述本文所采用的預(yù)測算法。
(1)確定當前宏塊MV的7個候選值PreMV1~7。
如圖3所示。PreMV1=(0,0);PreMV4取當前宏塊左邊相鄰宏塊的MV值;PreMV5取上邊相鄰宏塊的MV值;PreMV6取右上方相鄰宏塊的MV值;PreMV2=mid{PreMV4, PreMV5, PreMV6},即取三者的中值;PreMV3取參考幀相同位置宏塊的MV值;PreMV7取參考幀右下方相鄰宏塊的MV值。
圖3 預(yù)測運動矢量示意圖
(2)確定篩選候選值的依據(jù)——SAD(絕對誤差和)的門限值ThreshSAD。
SAD是確定最佳匹配塊的準則。門限值ThreshSAD是指這樣一個值:如果參考幀內(nèi)某一宏塊和當前宏塊的SAD小于ThreshSAD,則當前宏塊的MV值就可取作二者之間的位移。因此,ThreshSAD就可作為篩選7個候選值的依據(jù)。
由于SAD在空間上的相關(guān)性,ThreshSAD由相鄰宏塊的SAD值來確定:
ThreshSAD=Min{SADleft,SADtop,SADtop_left}
其中,SADleft、SADtop、SADtop-right分別為MBleft、MBtop、MBtop-right和其對應(yīng)匹配塊的SAD值,ThreshSAD取三者的最小值。
(3)從7個候選值中選出當前宏塊的MV值。
按照PreMV1~7的順序,依次計算當前宏塊和7個匹配塊的SAD值。如果有SAD值小于ThreshSAD,即停止計算,選用對應(yīng)的PreMV作為當前宏塊的MV值;如果7個SAD值均大于ThreshSAD,則采用運動搜索來確定當前宏塊的MV值。該運動搜索并不以MV=(0,0)為中心,而是以對應(yīng)SAD值最小的PreMV為中心,搜索采用簡化的菱形算法。
對標準視頻序列foreman.cif(352×288)進行編碼(碼率300kbps),測得表1所示數(shù)據(jù)。采用預(yù)測的運動估計算法利用視頻序列在時間和空間上的相關(guān)性,無需對每個宏塊都進行運動搜索,而且其搜索中心點也同樣利用了相關(guān)信息,搜索算法也可進一步簡化,因此大大減少了運動估計的計算量;同時,預(yù)測有助于提高圖像質(zhì)量,直接進行快速運動搜索通常會帶來局部最小的問題,從而影響圖像質(zhì)量,而PreMV1~7取自位于當前宏塊周圍各個方向的宏塊的MV值,避免陷入局部最小。
霍爾傳感器相關(guān)文章:霍爾傳感器工作原理
霍爾傳感器相關(guān)文章:霍爾傳感器原理
評論