Vdec Q&A

Q1:如何定位花屏问题?

  1. 首先在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);
    
  2. 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;

...