Xilinx提供超低延時(shí)編解碼方案,并提供了全套軟件。MPSoC Video Codec Unit提供了詳細(xì)說(shuō)明。其中的底層應(yīng)用軟件是VCU Control-Software(Ctrl-SW)。
本文主要說(shuō)明為Ctrl-SW增加功能,支持不同Stride/Pitch(步長(zhǎng))的YUV文件的編碼。
1.1. VCU輸入和輸出格式
Video Codec Unit(VCU) 輸入和輸出都是是NV12/NV16格式的視頻,Y分量存放在一塊連續(xù)內(nèi)存區(qū),UV分量交替存放在Y分量后面的連續(xù)內(nèi)存。具體信息,可以參考VCU Product Guide中的“Source Frame Format”和“Memory Format”。
1.2. VCU內(nèi)存的pitch
視頻數(shù)據(jù)在內(nèi)存區(qū)中存放時(shí),兩行之間的數(shù)據(jù)可以有間隔。對(duì)于每個(gè)像素的Y分量用8-bit表示的圖像,每個(gè)像素的Y分量對(duì)應(yīng)內(nèi)存的一個(gè)字節(jié),圖像Y分量的每一行對(duì)應(yīng)的內(nèi)存大小就是其寬度代表的字節(jié)數(shù)。比如1920x1080,每一行圖像的Y分量需要1920字節(jié)內(nèi)存。如果以2048字節(jié)來(lái)存儲(chǔ)一行1920x1080的圖像數(shù)據(jù),則在前面存放圖像數(shù)據(jù),后面的數(shù)據(jù)被VCU忽略。也可以參考PG252的“Figure 7: Frame Buffer Pitch”。
02
NEWS
輸入文件分辨率
與視頻數(shù)據(jù)在內(nèi)存區(qū)中存放一樣,視頻數(shù)據(jù)在文件中存放時(shí)也有類似的情況。
Ctrl-SW假設(shè)輸入文件的分辨率一般和實(shí)際圖像分辨率一致,也就是pitch和圖像寬度一致。但是實(shí)際應(yīng)用時(shí),輸入文件的分辨率、實(shí)際圖像分辨率并不一致。在文件里,有一部分?jǐn)?shù)據(jù)是真實(shí)圖像數(shù)據(jù),有一部分是無(wú)用數(shù)據(jù)。比如有YUV NV12文件的文件分辨率是3840x1080,實(shí)際圖像的分辨率是1920x1080。每一行的數(shù)據(jù)中,只有前面1920字節(jié)是有效圖像數(shù)據(jù),后面的1920字節(jié)是冗余數(shù)據(jù)。
03
NEWS
代碼
為了支持這種場(chǎng)景,需要修改代碼。Ctrl-SW的讀YUV文件的代碼,在文件YuvIO.cpp里的函數(shù)ReadOneFrameYuv()里。下面是基于Ctrl-SW 2020.2的修改。
首先定義一個(gè)全局變量,用于存儲(chǔ)輸入文件的Stride/Pitch(步長(zhǎng))。
int gi_encoder_input_stride=0;
接下來(lái)增加的ctrlsw_encoder的命令行選項(xiàng)。這樣命令行選項(xiàng)里可以對(duì)圖像步長(zhǎng)gi_encoder_input_stride賦值。
opt.addInt(“--input-stride”, &gi_encoder_input_stride, “Stride in input YUV file.”);
最后修改函數(shù)ReadOneFrameYuv()。原來(lái)的代碼,直接使用真實(shí)圖像寬度計(jì)算YUV文件里每行的數(shù)據(jù)的字節(jié)數(shù),代碼是“uRowSizeLuma = GetIOLumaRowSize(tFourCC, tDim.iWidth)”。修改后的代碼,使用真實(shí)圖像寬度作為YUV文件里圖像步長(zhǎng)iYuvStride的缺省值。另外增加代碼,檢查命令行選項(xiàng)里賦值的圖像步長(zhǎng)gi_encoder_input_stride。如果gi_encoder_input_stride不為0,則將gi_encoder_input_stride賦值給圖像步長(zhǎng)iYuvStride。接下來(lái)使用圖像步長(zhǎng)iYuvStride計(jì)算YUV文件里,每行的數(shù)據(jù)的字節(jié)數(shù)。
bool ReadOneFrameYuv(std::ifstream& File, AL_TBuffer* pBuf, bool bLoop)
{
if(!pBuf || !File.is_open())
throw std::runtime_error(“invalid argument”);
if((File.peek() == EOF) && !bLoop)
return false;
TFourCC tFourCC = AL_PixMapBuffer_GetFourCC(pBuf);
AL_TDimension tDim = AL_PixMapBuffer_GetDimension(pBuf);
int32_t iYuvStride = tDim.iWidth;
if( 0 != gi_encoder_input_stride )
{
iYuvStride = gi_encoder_input_stride;
LogVerbose(“New YUV width size:%d at %s:%d.
”, iYuvStride, __func__, __LINE__ );
}
//uint32_t uRowSizeLuma = GetIOLumaRowSize(tFourCC, tDim.iWidth);
uint32_t uRowSizeLuma = GetIOLumaRowSize(tFourCC, iYuvStride);
LogVerbose(“YUV Luma row size:%d at %s:%d.
”, uRowSizeLuma, __func__, __LINE__ );
ReadFile(File, pBuf, uRowSizeLuma, tDim.iHeight);
if((File.rdstate() & std::failbit) && bLoop)
{
File.clear();
File.seekg(0, std::beg);
ReadFile(File, pBuf, uRowSizeLuma, tDim.iHeight);
}
if(File.rdstate() & std::failbit)
throw std::runtime_error(“not enough data for a complete frame”);
return true;
}
其它的代碼,不需要修改。
注意,YUV文件里圖像步長(zhǎng)(stride/pitch),要不小于內(nèi)存里的圖像步長(zhǎng)(stride/pitch)。因此,測(cè)試時(shí),同時(shí)使用了選項(xiàng)“--stride”和選項(xiàng)“--input-stride”。
04
NEWS
測(cè)試
測(cè)試了輸入分辨率是3840x1080的NV12 yuv文件,編碼圖像分辨率1920x1080,得到了正確的265文件。命令如下:
有意思的是,結(jié)合選項(xiàng)“--stride”、選項(xiàng)“--stride-height”、和選項(xiàng)“--input-stride”,相等于在編碼前對(duì)圖像實(shí)現(xiàn)了裁剪(crop)功能。
05
NEWS
其它 5.1. 命令行選項(xiàng)
“--input-width”和“--input-height”
Ctrl-SW 2020.2里有兩個(gè)命令行選項(xiàng),“--input-width”,和“--input-height”。這兩個(gè)選用用于指定實(shí)際圖像分辨率,可以取代配置文件里的圖像分辨率。這個(gè)選項(xiàng)并不能指定輸入文件的分辨率。
opt.addInt(“--input-width”, &cfg.MainInput.FileInfo.PictWidth, “Specifies YUV input width”);
opt.addInt(“--input-height”, &cfg.MainInput.FileInfo.PictHeight, “Specifies YUV input height”);
06
NEWS
未來(lái)工作
未來(lái)可以繼續(xù)測(cè)試NV16的圖像,也可以測(cè)試其它分辨率的圖像。
原文標(biāo)題:【工程師分享】MPSoC VCU Ctrl-SW 2020.2 編碼不同Stride的YUV文件
文章出處:【微信公眾號(hào):FPGA開(kāi)發(fā)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
責(zé)任編輯:haq
-
內(nèi)存
+關(guān)注
關(guān)注
8文章
3025瀏覽量
74056 -
VCU
+關(guān)注
關(guān)注
17文章
80瀏覽量
20562
原文標(biāo)題:【工程師分享】MPSoC VCU Ctrl-SW 2020.2 編碼不同Stride的YUV文件
文章出處:【微信號(hào):FPGA-EETrend,微信公眾號(hào):FPGA開(kāi)發(fā)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論