TI中文支持网
TI专业的中文技术问题搜集分享网站

YUV_FRAMES_TO_A8 显示正常但保存YUV数据有误

Hi,

DM8127_IPNC_RDK_3.8

在采集显示直通usecase中,multich_capturedisplay.c,在Rules.make打开了宏YUV_FRAMES_TO_A8,准备把cameraLink的queue0保存到本地

pCameraOutPrm = &pCameraInstPrm->outParams[0];
pCameraOutPrm->dataFormat = SYSTEM_DF_YUV422I_UYVY;
pCameraOutPrm->scEnable = FALSE;
pCameraOutPrm->scOutWidth = 1920;
pCameraOutPrm->scOutHeight = 1080;
pCameraOutPrm->outQueId = 0;

本地保存YUV数据的代码并未完善,在ti_mcfw_ipcframes.c中,打开了宏CUSTOM_SD_DEMO,并在App_ipcFramesFileWriteCreate中修改代码指定了文件名及路径;

编译通过,运行,可以正常显示图像。

说明在App_ipcFramesSendRecvFxn()中,Vcam_getFullVideoFrames(&bufList,0)确实从ipcFramesInHost获取到了视频数据;Vdis_putFullVideoFrames(&bufList)也确实把数据又发给了ipcFramsOutHost,并且显示正常,那么这个bufList应该是没问题的吧。

但是在App_ipcFrameFileWrite(&bufList)中,虽然确实保存了文件VID_CH00.yuv下来,但是该yuv文件在电脑上显示却异常:

这是为什么呢?

应该怎么保存文件呢?

先谢谢各位了!

Harry:

原代码是在fopen文件后一直在fwrite保存,文件会越来越大;我修改了App_ipcFrameFileWrite,在for(frameId=0; frameId<pFrameBufList->numFrames; frameId++)中fopen文件,fwrite保存一帧,fclose文件,其实我的需求就是要求保存一帧就够了。

for(frameId=0; frameId<pFrameBufList->numFrames; frameId++)

{

App_ipcFramesFileOpen(); pBuf = &pFrameBufList->frames[frameId]; if(pBuf->channelNum<VENC_CHN_MAX) {

  pChInfo = &gApp_ipcFramesCtrl.chFrameInfo[pBuf->channelNum];

  frameSize = (pBuf->frameWidth * pBuf->frameHeight) << 1;

  pChInfo->totalDataSize += frameSize;

  pChInfo->numFrames++;

if(pBuf->frameWidth > pChInfo->maxWidth) pChInfo->maxWidth = pBuf->frameWidth;

if(pBuf->frameHeight > pChInfo->maxHeight) pChInfo->maxHeight = pBuf->frameHeight;

} if(gApp_ipcFramesCtrl.fileFrameWriteEnable) {  if(pBuf->channelNum== gApp_ipcFramesCtrl.fileFrameWriteChn && gApp_ipcFramesCtrl.fileFrameWriteState == FILE_WRITE_RUNNING)  {    UInt32 pMemVirtAddr;    pMemVirtAddr = 0;   App_mMap((UInt32)(pBuf->phyAddr[0][0]), frameSize, &pMemVirtAddr);

   writeDataSize = fwrite((Ptr) pMemVirtAddr, 1, frameSize, gApp_ipcFramesCtrl.fp);  if(writeDataSize!=frameSize)  {    gApp_ipcFramesCtrl.fileFrameWriteState = FILE_WRITE_STOPPED;   fclose(gApp_ipcFramesCtrl.fp);   OSA_printf(" Closing file [%s] for CH%d\n", gApp_ipcFramesCtrl.fileFrameWriteName, gApp_ipcFramesCtrl.fileFrameWriteChn);  }  App_unmapMem(); } } fclose(gApp_ipcFramesCtrl.fp); }

保存下来的yuv文件在电脑上显示也是异常的……

按理说,通过bufList,ipcFramesInHost获取到数据——>送回数据到ipcFramesOutHost,并显示正常了,应该能说明bufList这个数据没问题吧。请问中间的通过bufList保存数据哪里错了,到底该怎么保存文件呢?

Chris Meng:

回复 Harry:

Harry,

看图像的话就是偏移(pitch)不对(图像buffer的宽度可能比实际图像要大)。你可以尝试把得到的YUV的宽度配置为1920+32或者1920+64看看。

Harry:

回复 Chris Meng:

Chris Meng看图像的话就是偏移(pitch)不对(图像buffer的宽度可能比实际图像要大)。你可以尝试把得到的YUV的宽度配置为1920+32或者1920+64看看。

非常感谢Chris Meng的再次解答!谢谢!

根据你的建议,我修改图像宽度为1920+64,(高度192081080/1084=1045)后,图像显示如下,除了右侧部分其他正常显示了!

非常感谢你的指点,又让我看到了希望。

现在我就是疑惑,为什么会这样,右侧的那片灰色是怎么回事?

Harry:

回复 Chris Meng:

你好!

再麻烦你一下。

我了解了VNF会对图像做padding,导致增加pitch,可是我在multich_capturedisplay.c这个usecase中并未用到VNF呀?

不知道我这么问对不对….

赞(0)
未经允许不得转载:TI中文支持网 » YUV_FRAMES_TO_A8 显示正常但保存YUV数据有误
分享到: 更多 (0)