Vdec Q&A
Q1:如何定位花屏问题?
-
首先在vdec模块前级dump es流,使用视频分析软件查看es流文件是否有错误。
在代码中找到 MI_VDEC_SendStream 函数,在调用该函数之前通过fwrite将数据写到文件中,保存为es文件。如下:
MI_VDEC_VideoStream_t stVdecStream; MI_S32 s32Ret; memset(&stVdecStream, 0, sizeof(MI_VDEC_VideoStream_t)); stVdecStream.pu8Addr = data; stVdecStream.u32Len = size; stVdecStream.u64PTS = pts; stVdecStream.bEndOfFrame = 1; stVdecStream.bEndOfStream = 0; FILE *h264_fd = fopen("/mnt/h264_dump.es", "w+"); fwrite(stVdecStream.pu8Addr, stVdecStream.u32Len, 1, h264_fd); fclose(h264_fd); s32Ret = MI_VDEC_SendStream(VDEC_CHN_ID, &stVdecStream, 30);
-
dump vdec output的yuv图像或者disp input的图像,使用如下命令:
dump frame buf: echo dumpfb [chn] [path] [frmcnt] [bDumpAll] [bDetile] > /proc/mi_modules/mi_vdec/mi_vdec0 echo dumpfb 0 /mnt 3 0 0 > /proc/mi_modules/mi_vdec/mi_vdec0 //dump 3 张frame Dumpframe: echo dumpframe [layerid] [portid] [path] > /proc/mi_modules/mi_disp/mi_disp0 echo dumpframe 0 0 /mnt/ > /proc/mi_modules/mi_disp/mi_disp0
使用yuv工具查看图像是否花屏
Q2:如何处理tile mode格式的yuv图像?
当vdec输出tile mode格式的yuv图像时,vdec output buffer的宽为128对齐,高为32对齐。detile处理之后的buffer的size大于实际图像的size。
使用 MI_SYS_ChnInputPortGetBuf 接口将detile后的buffer拷贝到其他模块时,如venc。同样需要设置128x32对齐,并做crop,如下:
MI_SYS_BufConf_t stBufConf; MI_SYS_BufInfo_t stBufInfoVenc; stBufConf.stFrameCfg.stFrameBufExtraConf.u16BufHAlignment = 128; stBufConf.stFrameCfg.stFrameBufExtraConf.u16BufVAlignment = 32; stBufInfoVenc.stFrameData.stContentCropWindow.u16X = 0; stBufInfoVenc.stFrameData.stContentCropWindow.u16Y = 0; stBufInfoVenc.stFrameData.stContentCropWindow.u16Width = VIDEO_VDEC_INPUT_WIDTH; stBufInfoVenc.stFrameData.stContentCropWindow.u16Height = VIDEO_VDEC_INPUT_HEIGHT;
...