在TMS320C6711 DSP上實(shí)現H.263視頻編碼器的EDMA數據存取策略 作者: 時(shí)間:2007-03-09 來(lái)源:網(wǎng)絡(luò ) 加入技術(shù)交流群 掃碼加入和技術(shù)大咖面對面交流海量資料庫查詢(xún) 收藏 摘要:提出了在TMS320C6711 DSP平臺上實(shí)現H.263視頻編碼器的過(guò)程中,如何使用EDMA優(yōu)化數據存取的策略,從而減少了CPU花費在數據搬移上的開(kāi)銷(xiāo)。 關(guān)鍵詞:H.263 DSP EDMA QDMA 數據存取策略 目前,將H.263算法在DSP芯片上實(shí)現,已成為一種越來(lái)越廣泛的應用趨勢。采用DSP實(shí)現H.263算法,相對于以往的方案,具有更好的擴展性,可以很容易地將聲音編解碼和復用、通信協(xié)議添加進(jìn)來(lái),綜合在一起DSP芯片中,具有很強的實(shí)用性。 本文采用TI公司的TMS320C6711 DSP實(shí)現H.263的編碼,提出一種在DSP平臺上充分合理使用片上EDMA控制器,進(jìn)行數據存取優(yōu)化的策略。 1 TMS320C6711的直接存儲器訪(fǎng)問(wèn)控制器 直接存儲器訪(fǎng)問(wèn)(DMA)是C6000 DSP的一種重要的數據訪(fǎng)問(wèn)方式,它可以在沒(méi)有CPU參與的情況下,由DMA控制器完成DSP存儲空間內的數據搬移,數據搬移的源/目的地址可以在片內存儲器、片內外設和外設器件。 在TMS320C6711中,EDMA控制器負責片內存儲器L2和外設之間的數據傳輸,其增強之處在于: %26;#183;提供了16個(gè)通道 %26;#183;通道間的優(yōu)先級設置 %26;#183;支持不同結構數據傳輸的鏈接(QDMA除外) EDMA控制器是基于RAM結構的,EDMA的參數RAM(PaRAM)存放著(zhù)傳輸控制參數。圖1給出了一個(gè)PaRAM的內部結構,總共6個(gè)字(32bit/word)。選項參數內容如圖2所示。 TMS320C6711 DSP還提供一種快速DMA(QDMA)傳輸方式。QDMA與EDMA相似,支持幾乎所有的EDMA傳輸方式,但是提交傳輸申請的速度要快很多。在應用系統中,EDMA適合于固定周期的數據傳輸,但如果需要CPU干擾控制搬移數據,QDMA則比較適合。 QDMA的操作由兩組寄存器進(jìn)行控制。第一組的五個(gè)寄存器寄存了QDMA傳輸所需的參數,與EDMA的PaRAM類(lèi)似,只是沒(méi)重加載/鏈接參數。第二組的五個(gè)寄存器是第一組寄存器的“偽映射”。 下面就H.263編碼的某些環(huán)節說(shuō)明如何采用EDMA技術(shù)對編碼數據數據進(jìn)行優(yōu)化存取。 2 原始圖像的獲取 由于待處理的原始圖像都很大,即使QCIF格式的圖像,也要占用38KB左右的存儲空間,顯然不能將待編碼圖像存放于片內RAM(L2)中。通常的方法是在CPU干預下,采用“讀入-寫(xiě)出”的方式,從視頻設備讀取數據,然后存入片外SDRAM中。使用C6000 DSP強大的EDMA,亦可以實(shí)現原始圖像幀的后臺傳輸,EDMA無(wú)需CPU的干預便可獨自將視頻設備的輸出圖像直接送往片外SDRAM。這樣,CPU就可以將搬移數據的時(shí)間用于圖像編碼的工作。 在這里使用C6000 DSP的EDMA控制器的QDMA功能。相對于EDMA的傳輸方式,QDMA的傳輸方式有著(zhù)更快的申請提交速度。在片外SDRAM中開(kāi)辟三塊幀緩沖區Framel(首地址0xA00000000)、Frame2、Frame3。初始化階段,先提交三個(gè)QDMA請求(此時(shí)也可使用通常的數據搬移手段),將視頻序列的前三幀數據分別存入三塊幀緩沖區內,填滿(mǎn)幀緩沖區。接著(zhù)開(kāi)始對Frame1內的圖像數據進(jìn)行編碼,該幀編碼結束后,對Frame2內的圖像數據進(jìn)行編碼,Frame2成為當前幀,而Frame1成為Frame2的先前幀,一旦Rrame2編碼完畢,便對Frame3內的圖像數據進(jìn)行編碼,同時(shí)立即提交一個(gè)新的QDMA請求,從視頻外設讀取一幀新的圖像數據到Frame1中(因為對Frame3進(jìn)行編碼時(shí),Frame2作為先前幀,Frame1已經(jīng)不需要了)。待Frame3編碼完畢后,Frame2又不需要了,此時(shí)再提交一個(gè)新的QDMA請求,讀取新一幀圖像數據到Frame2中。如此循環(huán),每編碼完畢一幀圖像,就提交一個(gè)新的QDMA請求,依次在對應的幀緩沖區內存放新的一幀圖像數據。這樣,依次在對應的幀緩沖區內存放新一幀圖像數據。這樣,從外設獲取當前編碼圖像的下一幀與當前圖像的編碼工作同時(shí)進(jìn)行,DSP每次都直接對圖像進(jìn)行編碼,而不需要再花費開(kāi)銷(xiāo)從外設讀取。 要實(shí)現圖3所示的QDMA傳輸,有兩種等價(jià)的方式: %26;#183;1D-1D,幀同步傳輸 %26;#183;1D-2D,陣列同步傳輸 下面以圖3為例,給出采用1D-2D傳輸方式,將圖像數據送往Frame1中時(shí)所需提交的QDMA的具體參數設置。 Void submit_qdma(void) { EDMA_Config config; Config.opt=(unsigned int)0x28A00001; Config.src=(unsigned int)0x90010000;//視頻外設的數據口地址 Config.cnt=(unsigned int)((288-1)<<16|352); Config.dst=(unsigned int)0xA00000000;//目的地址 Config.idx=(unsigned int)(352<<16);//數據單元索引忽略 EDMA_qdmaConfig(%26;amp;config); }圖33 圖像宏塊編碼 從上面已經(jīng)知道,圖像幀存放在片外SDRAM中。因此,在對I幀所有宏塊和P幀INTRA宏塊編碼時(shí),或對P幀INTER宏塊進(jìn)行運行估計時(shí),每個(gè)宏塊都要進(jìn)行片外存儲器訪(fǎng)問(wèn),會(huì )占用很大的CPU開(kāi)銷(xiāo)。所以,最好將當前待編碼的宏塊存入于片內RAM中。這樣,整個(gè)宏塊的編碼就始終是片內訪(fǎng)問(wèn),宏塊編碼子函MB_Encode在效率上就能夠提高12%左右。 最直接的做法就是在片內SRAM中事先開(kāi)辟一個(gè)宏塊緩部眍,待將編碼圖像當前位置處的現代戰爭宏塊搬移到片內RAM中的宏塊緩沖區,之后再調用宏塊編碼子函MB_Encode。但是這樣仍然會(huì )浪費一定CPU時(shí)間在數據塊的搬移上,所以還具有改進(jìn)的余地。結合C6000 DSP強大的EDMA功能,提出了如下改進(jìn)方案: 由于每次塊組(GOB)共有8448個(gè)字節數據(CIF),因此可以在片內RAM中開(kāi)辟兩個(gè)塊緩沖區,采用乒乓方式,通過(guò)啟動(dòng)EDMA塊組數據,使用獨立于CPU的EDMA數據通道,在后臺從片外搬移到片內。這樣一來(lái),每次調用宏塊編碼時(shí),數據都已經(jīng)存放在指定緩沖區中,不僅無(wú)需做數據的搬移工作,而且還是在片內進(jìn)行數據訪(fǎng)問(wèn)。 初始化時(shí),可以采用普通的數據搬移手段(亦可使用EDMA),從片外存儲器將第一幀圖像的前面兩個(gè)塊組搬移到片內,充滿(mǎn)塊組緩沖區,然后即可開(kāi)始圖像編碼。在進(jìn)行圖像編碼的過(guò)程中,逐一對塊組的乒緩沖區中的宏塊進(jìn)行編碼,乒緩沖區宏塊編碼結束后,接著(zhù)進(jìn)行乓緩部眍的宏塊編碼,同時(shí)啟動(dòng)EDMA,從片外存儲器搬移一個(gè)新的塊組到乒緩部眍來(lái),使得編碼乓緩部沖區和向乒緩沖區搬移塊組數據同時(shí)進(jìn)行,一旦乓緩沖宏塊也編碼完畢,即可處理乒緩沖區中新的塊組,如此循環(huán)。 C6000系列DSP的EDMA具有高效地從一幀圖像中抽取子幀的能力。以CIF格式的圖像為例,說(shuō)明如何設置EDMA參數。 如圖4所示左側表示4:2:0亞采樣的一幀YcrCb圖像,亮度分量首地址為A000 0000h,色度分量首地址分別是A0001 8C00h和A001 EF00h;右側表示塊組的乒乓緩沖區,亮度分量y乒緩沖區首址在2000h,乓緩沖區首址為3600h,色度Cr分量的乒乓緩部沖區首址分別為4C00h和5700h,色度Cb分量的乒乓緩沖區首址分別為5180h和5C80h。 第一步,使用CPU啟動(dòng)EDMA通道,將一個(gè)GOB的亮度分量y傳輸到GOB亮度分量的乒緩沖區。CPU可以通過(guò)寫(xiě)事件置位寄存器ESR啟動(dòng)一個(gè)EDMA通道,向ESR的某一位寫(xiě)入“1”,強行觸發(fā)對應事件,此時(shí)EDMA的PaRAM中的傳輸控制參數被送往地址發(fā)生器,開(kāi)始對EMIF、L2和片外SDRAM進(jìn)行訪(fǎng)問(wèn)。也可以使用QDMA進(jìn)行第一步數據傳輸,通過(guò)設置QDMA的結束代碼(選項參數的TCC字段)啟動(dòng)后續傳輸。 第二步,EDMA通道完成了對GOB亮度分量的傳輸后,重新加載下一次傳輸所需要的傳輸控制參數,將該GOB的色度分量Cr傳磁室片內對應的Cr兵緩沖區。由于需要傳輸的原始數據,在空間上不是連續在存儲的,這里使用了C6000系列DSP的EDMA鏈接功能。鏈接功能可以將不同的EDMA傳輸控制參數連接起來(lái),組成一個(gè)參數鏈,為同一個(gè)通道服務(wù)。一次EDMA傳輸任務(wù)結束后,會(huì )自動(dòng)從PaRAM中加載下一次傳輸所需要的參數。 第三步,同上,將該 GOB的Cb分量送入片內對應的Cb兵緩沖區。圖4將GOB搬移到乒緩沖區對應的EDMA通道的PaRAM設置參數如圖5所示。 選擇幀同步、1D-2D數據傳輸數據,啟動(dòng)EDMA通道后,依次加載參數鏈,連續進(jìn)行三次EDMA數據傳輸之后,待編碼圖像的一個(gè)GOB即搬移到片內的對應緩沖區中。注意參數鏈的最后一個(gè)PaRAM,選項參數的LINK字段要設置為0。 同樣可以得到將GOB搬移到乓緩沖區對應的EDMA通道的PaRAM設置參數,如圖6所示。 下面給出向編碼塊組乒緩沖區傳輸數據的EDMA通道PaRAM參數鏈的配置程序。 EDMA_Config config; EDMA_Handle hEdma_ping; //向乒緩沖區傳輸數據的EDMA通道句柄 EDMA_Handle hEdma_ping_tab1;//該通道的第一個(gè)鏈接PaRAM的句柄 EDMA_Handle hEdma_ping_tab2;//該通道的第二個(gè)鏈接PaRAM的句柄 Uint32 link_tab1,link_tab2;//該通道兩個(gè)鏈接PaRAM的地址 if(EDMA_allocTableEx(1,%26;amp;hEdma_ping_tab1)) link_tab1=EDMA_getTableAddress(hEdma_ping_tab1); if(EDMA_allocTableEx(1,%26;amp;hEdma_ping_tab2)) link_tab2=EDMA_getTableAddress(hEdma_ping_tab2) hEdma_ping=EDMA_open(EDMA_CHA_ANY,EDMA_OPEN_RESET); config.opt=(Uint32)0x55200003;//第一個(gè)PaRAM的選項參數 config.ser=(Uint32)0xA0000000;//待傳輸塊組Y分量的首地址 config.cnt=(Uint32)0x000f0160;//每行352像素,共16行 config.dst=(Uint32)0x00002000;//設置在片內的塊組緩沖區 config.idx=(Uint32)0; //源采用幀同步、2-D傳輸 config.rld=(Uint32)(0x160<<16| link_tab1 %26;amp; 0xffff);//鏈接到下一個(gè)PaRAM EDMA_config(hEdma_ping,%26;amp;config); Config.src=(Uint32)0xA00191880; Config.cnt=(Uint32)0x000700B0; Config.dst=(Uint32)0x00005700; Config.rld=(Uint32)(0xB0<<16| link_tab2 %26;amp;0xffff); 鏈接到最后一個(gè)PaRAM EDMA_config(hEdma_ping_tab1,%26;amp;config); Config.opt=(Uint32)0x55200001; //最后一個(gè)PaRAM,LINK字段為0 config.src=(Uint32)0xA001F480; config.dst=(Uint32)0x0005C880; config.rld=(Uint32)(0xB0<<16); EDMA_config(hEdma_ping_tab2,%26;amp;config); 4 運動(dòng)估計 在P幀編碼中,對每個(gè)宏塊進(jìn)行運行估計時(shí),需要訪(fǎng)問(wèn)存儲在片外存儲器的前一幀圖像??紤]到當前幀的每個(gè)宏塊都是在前一幀的搜索窗口內進(jìn)行運行估計,所以可在片內RAM中開(kāi)設一個(gè)大小為48字節%26;#215;48字節的緩沖區,這個(gè)緩沖區對應參數圖像幀中以當前宏塊位置為中心的一個(gè)大小為48字節%26;#215;48字節的窗口。 依據與前面一樣的思想,這里同樣使用乒播講方式的搜索窗口緩沖區。在片內RAM中開(kāi)辟兩個(gè)48字節%26;#215;48字節的搜索窗口緩沖區,初始化時(shí),先將搜索窗口緩沖區充滿(mǎn)。第一次運行估計的參考搜索窗口乒緩沖區;第二次運行估計時(shí)參考乓緩沖區,此時(shí)提交一個(gè)QDMA請求,將下一宏塊需要的搜索窗口數據送往搜索窗口乒緩沖區。如此反復,每次在參考某具搜索窗口緩沖區進(jìn)行運動(dòng)估計時(shí),都提交一個(gè)QDMA請求,在后臺將下一宏塊的搜索窗口數據送入另一個(gè)搜索窗口緩沖區。圖5和圖6本節實(shí)際上是圖像宏塊編碼的反過(guò)程,宏塊編碼時(shí)使用EDMA節省的是從片外SDRAM讀取圖像數據的開(kāi)銷(xiāo),而本節使用EDMA節省的是將重建數據幀從片內L2存儲器寫(xiě)到片外SDRAM的開(kāi)銷(xiāo)。 在片內RAM中開(kāi)辟兩個(gè)塊組緩沖區,同樣采用乒乓方式,用于保存編碼過(guò)程中當膠編碼宏塊的重建數據。之所以開(kāi)辟塊組大小的緩沖區,而不是宏塊大小的緩沖區,是為了防止過(guò)多的片內與片外數據傳輸的EDMA要求。這一點(diǎn),圖像宏塊編碼也是一樣的。每當乒塊組緩沖區的宏塊都重建完畢,就通過(guò)提交一個(gè)QDMA請求,將該塊組緩沖區內的重建宏塊一次性復制到片外的重建幀緩沖區中,同時(shí)開(kāi)始下一宏塊的重構,并將重構宏塊放在乓塊組緩沖區。 本文提出的幾個(gè)H.263編碼環(huán)節,最自然的做法是CPU參數與數據塊的搬移工作,然后再進(jìn)行下一步的工序。使用EDMA的數據訪(fǎng)問(wèn)策略,可以減少CPU花費在數據搬移上的開(kāi)銷(xiāo)。在CPU和EDMA對片內存儲器L2進(jìn)行各自獨立的訪(fǎng)問(wèn)時(shí),可能并不是理想的同時(shí)進(jìn)行,有可能產(chǎn)生沖突。但是CPU對存儲器L2的訪(fǎng)問(wèn)優(yōu)先級高于EDMA對L2的訪(fǎng)問(wèn)優(yōu)先級,而且即使出現EDMA在數據搬移完畢之前,DSP已經(jīng)處理完了上一步工序這樣一種最?lèi)毫拥那闆r,DSP也只需再稍微等待片刻即可。因為已經(jīng)有部分數據傳輸完畢,所以整個(gè)數據搬移上耗費的時(shí)間相對于不用EDMA只可能減少。如果設置合理,這個(gè)時(shí)間通常是零。
評論