《電子技術應用》
您所在的位置:首頁 > 嵌入式技术 > 业界动态 > 在TMS320C6711 DSP上实现H.263视频编码器的EDMA数据存取策略

在TMS320C6711 DSP上实现H.263视频编码器的EDMA数据存取策略

2008-10-15
作者:朱 飞 吴裕斌 曹丹华

  摘 要: 提出了在TMS320C6711 DSP平臺上實現H.263視頻編碼器的過程中,如何使用EDMA優化數據存取的策略,從而減少了CPU花費在數據搬移上的開銷。
  關鍵詞: H.263 DSP  EDMA QDMA 數據存取策略


  目前,將H.263算法在DSP芯片上實現,已成為一種越來越廣泛的應用趨勢。采用DSP實現H.263算法,相對于以往的方案,具有更好的擴展性,可以很容易地將聲音編解碼和復用、通信協議添加進來,綜合在一塊DSP芯片中,具有很強的實用性。
  本文采用TI公司的TMS320C6711 DSP實現H.263的編碼,提出一種在DSP平臺上充分合理使用片上EDMA控制器,進行數據存取優化的策略。
1 TMS320C6711的直接存儲器訪問控制器
  直接存儲器訪問(DMA)是C6000 DSP的一種重要的數據訪問方式,它可以在沒有CPU參與的情況下,由DMA控制器完成DSP存儲空間內的數據搬移,數據搬移的源/目的地址可以在片內存儲器、片內外設" title="外設">外設和外部器件。
  在TMS320C6711中,EDMA控制器負責片內存儲器L2和外設之間的數據傳輸,其增強之處在于:
  ·提供了16個通道
  ·通道間的優先級設置
  ·支持不同結構數據傳輸的鏈接(QDMA除外)
  EDMA控制器是基于RAM結構的,EDMA的參數RAM(PaRAM)存放著傳輸控制參數。圖1給出了一個PaRAM的內部結構,總共6個字(32bit/word)。
  選項參數內容如圖2所示。


  TMS320C6711 DSP還提供一種快速DMA(QDMA)傳輸方式" title="傳輸方式">傳輸方式。QDMA與EDMA相似,支持幾乎所有的EDMA傳輸模式,但是提交傳輸申請的速度要快很多。在應用系統中,EDMA適合于固定周期的數據傳輸,但如果需要CPU干預控制搬移數據,QDMA則比較適合。
  QDMA的操作由兩組寄存器進行控制。第一組的五個寄存器寄存了QDMA傳輸所需的參數,與EDMA的PaRAM類似,只是沒有重加載" title="加載">加載/鏈接參數。第二組的五個寄存器是第一組寄存器的“偽映射”。
  下面就H.263編碼的某些環節說明如何采用EDMA技術對編碼數據進行優化存取。
2 原始圖像的獲取
  由于待處理的原始圖像都很大,即使QCIF格式的圖像,也要占用38KB左右的存儲空間,顯然不能將待編碼圖像存放于片內RAM(L2)中。通常的方法是在CPU干預下,采用“讀入-寫出”的方式,從視頻設備讀取數據,然后存入片外SDRAM中。使用C6000 DSP強大的EDMA,亦可以實現原始圖像幀的后臺傳輸,EDMA無需CPU的干預便可獨自將視頻設備的輸出圖像直接送往片外SDRAM。這樣,CPU就可以將搬移數據的時間用于圖像編碼的工作。
  在這里使用C6000 DSP的EDMA控制器的QDMA功能。相對于EDMA的傳輸方式,QDMA的傳輸方式有著更快的申請提交速度。
  在片外SDRAM中開辟三塊幀緩沖區Frame1(首地址0xA0000000)、Frame2、Frame3。初始化階段,先提交三個QDMA請求(此時也可使用通常的數據搬移手段),將視頻序列的前三幀數據分別存入三塊幀緩沖區內,填滿幀緩沖區。接著開始對Frame1內的圖像數據" title="圖像數據">圖像數據進行編碼,該幀編碼結束后,對Frame2內的圖像數據進行編碼,Frame2成為當前幀,而Frame1成為Frame2的先前幀,一旦Frame2編碼完畢,便對Frame3內的圖像數據進行編碼,同時立即提交一個新的QDMA請求,從視頻外設讀取一幀新的圖像數據到Frame1中(因為對Frame3進行編碼時,Frame2作為先前幀,Frame1已經不需要了)。待Frame3編碼完畢后,Frame2又不需要了,此時再提交一個新的QDMA請求,讀取新的一幀圖像數據到Frame2中。如此循環,每編碼完畢一幀圖像,就提交一個新的QDMA請求,依次在對應的幀緩沖區內存放新的一幀圖像數據。這樣,從外設獲取當前編碼圖像的下一幀與當前圖像的編碼工作同時進行,DSP每次都直接對圖像進行編碼,而不需要再花費開銷從外設讀取。


  要實現圖3所示的QDMA傳輸,有兩種等價的方式:
  ·1D-1D,幀同步傳輸
  ·1D-2D,陣列同步傳輸
  下面以圖3為例,給出采用1D-2D傳輸方式,將圖像數據送往Frame1中時所需提交的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)0xA0000000; //目的地址
   config.idx = (unsigned int)(352<<16); //數據單元索引忽略
   EDMA_qdmaConfig(&config);
  }
3 圖像宏塊" title="宏塊">宏塊編碼
  從上面已經知道,圖像幀存放在片外SDRAM中。因此,在對I幀所有宏塊和P幀INTRA宏塊編碼時,或對P幀INTER宏塊進行運動估計時,每個宏塊都要進行片外存儲器訪問,會占用很大的CPU開銷。所以,最好將當前待編碼的宏塊存放于片內RAM中。這樣,整個宏塊的編碼就始終是片內訪問,宏塊編碼子函MB_Encode在效率上就能夠提高12%左右。
  最直接的做法就是在片內SRAM中事先開辟一個宏塊緩沖區,將待編碼圖像當前位置處的一個宏塊搬移到片內RAM中的宏塊緩沖區,之后再調用宏塊編碼子函MB_Encode。但是這樣仍然會浪費一定的CPU時間在數據塊的搬移上,所以還具有改進的余地。結合C6000 DSP強大的EDMA功能,提出了如下改進方案:
  由于每個塊組(GOB)共有8448個字節數據(CIF),因此可以在片內RAM中開辟兩個塊組緩沖區,采用乒乓方式,通過啟動EDMA塊組數據,使用獨立于CPU的EDMA數據通道,在后臺從片外搬移到片內。這樣一來,每次調用宏塊編碼時,數據都已經存放在指定緩沖區中,不僅無需做數據的搬移工作,而且還是在片內進行數據訪問。
  初始化時,可以采用普通的數據搬移手段(亦可使用EDMA),從片外存儲器將第一幀圖像的前兩個塊組搬移到片內,充滿塊組緩沖區,然后即可開始圖像編碼。在進行圖像編碼的過程中,逐一對塊組的乒緩沖區中的宏塊進行編碼,乒緩沖區宏塊編碼結束后,接著進行乓緩沖區的宏塊編碼,同時啟動EDMA,從片外存儲器搬移一個新的塊組到乒緩沖區來,使得編碼乓緩沖區和向乒緩沖區搬移塊組數據同時進行,一旦乓緩沖區宏塊也編碼完畢,即可處理乒緩沖區中新的塊組,如此循環。
  C6000系列DSP的EDMA具有高效地從一幀圖像中抽取子幀的能力。以CIF格式的圖像為例,說明如何設置EDMA參數。
  如圖4所示左側表示4:2:0亞采樣的一幀YCrCb圖像,亮度分量首地址為A000 0000h,色度分量首地址分別是A0001 8C00h和A001 EF00h;右側表示塊組的乒乓緩沖區,亮度分量y乒緩沖區首址在2000h,乓緩沖區首址在3600h,色度Cr分量的乒乓緩沖區首址分別為4C00h和5700h,色度Cb分量的乒乓緩沖區首址分別為5180h和5C80h。


  第一步,使用CPU啟動EDMA通道,將一個GOB的亮度分量y傳輸到GOB亮度分量的乒緩沖區。CPU可以通過寫事件置位寄存器ESR啟動一個EDMA通道,向ESR的某一位寫入“1”,強行觸發對應事件,此時EDMA的PaRAM中的傳輸控制參數被送往地址發生器,開始對EMIF、L2和片外SDRAM進行訪問。也可以使用QDMA進行第一步數據傳輸,通過設置QDMA的結束代碼(選項參數的TCC字段)啟動后續傳輸。
  第二步,EDMA通道完成了對GOB亮度分量的傳輸后,重新加載下一次傳輸所需要的傳輸控制參數,將該GOB的色度分量Cr傳送到片內對應的Cr乒緩沖區。由于需要傳輸的原始數據,在空間上不是連續存儲的,這里使用了C6000系列DSP的EDMA鏈接功能。鏈接功能可以將不同的EDMA傳輸控制參數連接起來,組成一個參數鏈,為同一個通道服務。一次EDMA傳輸任務結束后,會自動從PaRAM中加載下一次傳輸所需要的參數。
  第三步,同上,將該GOB的Cb分量送入片內對應的Cb乒緩沖區。
  將GOB搬移到乒緩沖區對應的EDMA通道的PaRAM設置參數如圖5所示。


  選擇幀同步、1D-2D數據傳輸類型,啟動EDMA通道后,依次加載參數鏈,連續進行三次EDMA數據傳輸之后,待編碼圖像的一個GOB即搬移到片內的對應緩沖區中。注意參數鏈的最后一個PaRAM,選項參數的LINK字段要設置為0。
  同樣可以得到將GOB搬移到乓緩沖區對應的EDMA通道的PaRAM設置參數,如圖6所示。


  下面給出向編碼塊組乒緩沖區傳輸數據的EDMA通道PaRAM參數鏈的配置程序。
  EDMA_Config  config;
  EDMA_Handle  hEdma_ping;   // 向乒緩沖區傳輸數據的EDMA通道句柄
  EDMA_Handle  hEdma_ping_tab1;  // 該通道的第一個鏈接PaRAM的句柄
  EDMA_Handle  hEdma_ping_tab2;  // 該通道的第二個鏈接PaRAM的句柄
  Uint32    link_tab1, link_tab2; // 該通道兩個鏈接PaRAM的地址
  if (EDMA_allocTableEx(1, &hEdma_ping_tab1))
  link_tab1= EDMA_getTableAddress(hEdma_ping_tab1);
  if (EDMA_allocTableEx(1, &hEdma_ping_tab2))
  link_tab2 = EDMA_getTableAddress(hEdma_ping_tab2);
  hEdma_ping = EDMA_open(EDMA_CHA_ANY, EDMA_
  OPEN_RESET);
  config.opt = (Uint32)0x55200003;  // 第一個PaRAM的選項參數
  config.src = (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 & 0xffff); // 鏈接到下一個PaRAM
  EDMA_config(hEdma_ping, &config);
  config.src = (Uint32)0xA00191880;
  config.cnt = (Uint32)0x000700B0;
  config.dst = (Uint32)0x00005700;
  config.rld = (Uint32)(0xB0<<16 | link_tab2 & 0xffff);// 鏈接到最后一個PaRAM
  EDMA_config(hEdma_ping_tab1, &config);
  config.opt = (Uint32) 0x55200001; // 最后一個PaRAM,LINK字段為0
  config.src = (Uint32)0xA001F480;
  config.dst = (Uint32)0x0005C880;
  config.rld = (Uint32)(0xB0<<16);
  EDMA_config(hEdma_ping_tab2, &config);
4 運動估計
  在P幀編碼中,對每個宏塊進行運動估計時,需要訪問存儲在片外存儲器的前一幀圖像。考慮到當前幀的每個宏塊都是在前一幀的搜索窗口內進行運動估計,所以可在片內RAM中開設一個大小為48字節×48字節的緩沖區,這個緩沖區對應參考圖像幀中以當前宏塊位置為中心的一個大小為48字節×48字節的窗口。
  依據與前面一樣的思想,這里同樣使用乒乓方式的搜索窗口緩沖區。在片內RAM中開辟兩個48字節×48字節的搜索窗口緩沖區,初始化時,先將搜索窗口緩沖區充滿。第一次運動估計時參考搜索窗口乒緩沖區;第二次運動估計時參考乓緩沖區,此時提交一個QDMA請求,將下一宏塊需要的搜索窗口數據送往搜索窗口乒緩沖區。如此反復,每次在參考某個搜索窗口緩沖區進行運動估計時,都提交一個QDMA請求,在后臺將下一宏塊的搜索窗口數據送入另一個搜索窗口緩沖區。
5 重建圖像幀
  本節實際上是圖像宏塊編碼的反過程,宏塊編碼時使用EDMA節省的是從片外SDRAM讀取圖像數據的開銷,而本節使用EDMA節省的是將重建數據幀從片內L2存儲器寫到片外SDRAM的開銷。
  在片內RAM中開辟兩個塊組緩沖區,同樣采用乒乓方式,用于保存編碼過程中當前編碼宏塊的重建數據。之所以開辟塊組大小的緩沖區,而不是宏塊大小的緩沖區,是為了防止過多的片內與片外數據傳輸的EDMA要求。這一點,圖像宏塊編碼也是一樣的。每當乒塊組緩沖區的宏塊都重建完畢,就通過提交一個QDMA請求,將該塊組緩沖區內的重建宏塊一次性復制到片外的重建幀緩沖區中,同時開始下一宏塊的重構,并將重構宏塊放在乓塊組緩沖區。
  本文提出的幾個H.263編碼環節,最自然的做法是CPU參與數據塊的搬移工作,然后再進行下一步的工序。使用EDMA的數據訪問策略,可以減少CPU花費在數據搬移上的開銷。在CPU和EDMA對片內存儲器L2進行各自獨立的訪問時,可能并不是理想的同時進行,有可能產生沖突。但是CPU對存儲器L2的訪問優先級高于EDMA對L2的訪問優先級,而且即使出現EDMA在數據搬移完畢之前,DSP已經處理完了上一步工序這樣一種最惡劣的情況,DSP也只需再稍微等待片刻即可。因為已經有部分數據傳輸完畢,所以整個數據搬移上耗費的時間相對于不用EDMA只可能減少。如果設置合理,這個時間通常是零。
參考文獻
1 TMS320C6711 DSP Controllers Reference Guide.TI,2001
2 TMS320C6000 Optimizing C Compiler User’s Guide.TI,2001
3 Applications Using the TMS320C6000 Enhanced DMA.TI,2001
4 ITU-T DRAFT H.263. 2 May,1996
5 李方慧,王飛.TMS320C6000系列DSPs原理與應用(第二版).北京:電子工業出版社,2002
6 沈蘭蓀,卓 力,田 棟,汪孔橋. 視頻編碼與低速率傳輸.北京:電子工業出版社,2002

本站內容除特別聲明的原創文章之外,轉載內容只為傳遞更多信息,并不代表本網站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創文章及圖片等內容無法一一聯系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯系電話:010-82306118;郵箱:aet@chinaaet.com。
主站蜘蛛池模板: 国产精品久久久久久久久久| 国产精品成人一区二区| 欧美人成在线视频| 日韩欧美99| 国产日韩欧美自拍| 热门国产精品亚洲第一区在线V| 国产精品香蕉国产| 久久精品美女视频网站| 欧美中文在线视频| 91老司机精品视频| 久久久久久久久91| 国产精品亚发布| 国产中文日韩欧美| 亚洲成人午夜在线| 精品久久久久久久久久中文字幕| 日本久久中文字幕| 亚洲午夜精品久久久久久人妖| 国产成人精品综合久久久| 欧美在线视频一二三| 中文字幕在线亚洲三区| 国产福利视频一区| 国产精品久久视频| 日韩有码在线观看| 亚洲精品中文字幕在线| 一本二本三本亚洲码| 伊人久久婷婷色综合98网| 精品久久国产精品| 欧美精品一区三区在线观看| 日韩人妻无码精品久久久不卡| 亚洲精品无码久久久久久| 亚洲一卡二卡| 午夜精品美女久久久久av福利| 国产精品91视频| 国产成人成网站在线播放青青| 国产精品久久久久久久av电影| 国产精品亚洲二区在线观看| 99视频精品免费| 国产成a人亚洲精v品在线观看| 国产精品美女999| 欧美交换配乱吟粗大25p| 欧洲午夜精品久久久|