This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

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文件在电脑上显示却异常:

这是为什么呢?

应该怎么保存文件呢?

先谢谢各位了!

  • 原代码是在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保存数据哪里错了,到底该怎么保存文件呢?

  • Harry,

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

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

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

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

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

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

  • Harry,

    因为使能了VNF的关系,请参考以下VNF相关文档。

  • 你好!

    再麻烦你一下。

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

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