HTM中的TComPicYuv和TVideoIOYuv類(二)

轉載地址: http://blog.sina.com.cn/s/blog_9f945ced0102w0ub.html


前面講過了,YUV圖像類的中的成員,我們清楚的知道了YUV的圖像的組織結構和訪問每個像素的機制。這裏我們看一下HTM中的輸入輸出類,TVideoIOYuv,如下:

HTM中的TComPicYuv和TVideoIOYuv類(二)

下面看看,這兩個類是如何組織原始幀的列表、重建幀列表等。
首先,有一個編碼工程類TAppEncTop如下
HTM中的TComPicYuv和TVideoIOYuv類(二)

可以看到了編碼工程類關聯了兩個輸入輸出類TVideoIOYuv的數組。可以通過這兩個成員進行原始數據的輸入和重建幀的輸出。而最後一個變量則是YUV圖像類的二維數組(用於記錄每個layer中的重建幀的列表)。現在主要的任務就是如何將這個三個變量,關聯到參數文件指定的輸入輸出文件中。同時編碼工程類TAppEncTop是編碼參數類的一個繼承類。(因爲編碼工程類就是對編碼參數類,進行操作)。
其中編碼參數類裏有幾個參數如下:
HTM中的TComPicYuv和TVideoIOYuv類(二)

搞清楚了相互關聯的這個關係,現在從Main  函數開始理順這個先後的關聯,主要找到關聯的函數,這樣可以通過修改參數文件,就可以實現我們額外要輸出的文件。首先main函數先建立了一個編碼工程類的對象。當然包含其基類的如上參數。
在Main  函數的另一條語句,TAppEncCfg::parseCfg( Int argc, Char* argv[] ),該函數爲編碼參數,而語句 const list& argv_unhandled = po::scanArgv(opts, argc, (const Char**) argv); // 實現了編碼基類的編碼參數類中的原始幀的列表和重建幀的列表進行賦值。
接下來的main函數裏,調用了一個encode()函數。該函數的中的首先是要準備一些編碼過程用到的變量的內存的開闢和賦值。有函數:
xInitLibCfg();  // 爲6個編碼層開闢了內存空間,編碼工程類中的兩個成員已經開闢了內存但是並未正確賦值
  xCreateLib(); // 函數中有語句, m_acTVideoIOYuvInputFileList[layer]->open( m_pchInputFileList[layer],     false, m_inputBitDepthY, m_inputBitDepthC, m_internalBitDepthY, m_internalBitDepthC );
  xInitLib(m_isField); 正式的將 編碼編碼工程類中的兩個管理原始幀和重建幀的成員變量類中的m_handle和其基類的配置參數指定的輸入輸出文件相關聯。

此外,在encode的函數中有個語句
TComPicYuv*       pcPicYuvOrg = new TComPicYuv;
之後通過YUV圖像類的creat函數對YUV圖像類的成員進行賦值。pcPicYuvOrg->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth );
接下來的m_acTVideoIOYuvInputFileList[layer]->read      ( pcPicYuvOrg, m_aiPad ); 是讀取一幀的數據存儲在YUV圖像類的m_piPicOrgY成員中。
而對於重建的圖像的list,函數Void TAppEncTop::xGetBuffer( TComPicYuv*& rpcPicYuvRec, UInt layer)裏有如下代碼

  rpcPicYuvRec = new TComPicYuv;
    rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, m_uiMaxCUWidth, m_uiMaxCUHeight, m_uiMaxCUDepth)
 m_picYuvRec[layer]->pushBack( rpcPicYuvRec );
以上是爲每個編碼層(紋理圖像和深度圖像),創建重建的YUV的重建幀。

最終看encode函數中的一句代碼
   m_acTEncTopList[layer]->encode( eos[layer], flush[layer] ? 0 : pcPicYuvOrg, *m_picYuvRec[layer], outputAccessUnits, iNumEncoded, gopId ); 
這個函數就是編碼一幀,其中其參數pcPicYuvOrg:爲encode的函數中創建的YUV的圖像類,該變量已經讀寫了編碼工程類中的輸入輸出m_handle中的原始幀數據,而m_handle已經和編碼參數類的輸入輸出的文件名相關聯。
*m_picYuvRec[layer]是編碼圖像的重建參考幀,YUV圖像類的一個list。

對於最終的輸出的重建幀,
在encode函數之後, xWriteOutput(bitstreamFile, iNumEncoded, outputAccessUnits, layer);
m_acTVideoIOYuvReconFileList[layerId]->write( pcPicYuvRecTop, pcPicYuvRecBottom, m_confLeft, m_confRight, m_confTop, m_confBottom, m_isTopFieldFirst );   將重建幀寫入到輸出文件中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章