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呀?
不知道我这么问对不对….