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.

关于在rdk3.5版本下jpeg图片问题



论坛里各位朋友好!

    我使用rdk3.5平台, 编码出的jpeg图片发现偶尔会出现损坏的情形,具体见附件图片,还出现过编码后的jpeg图片无图片头(FF D8)从而打不开,想肯定哪位大侠帮我解答下出现这些异常的jpeg图片一般是什么原因造成的呢? (除了待编码的YUV数据存在问题外).先谢谢了!

  • Zhang Jensen,

    第一张图像想是YUV数据没有写全,看看ISS的优先级是否配置为最大。

    jpeg图片无图片头,会否是数据被篡改?例如配置的jpeg输出buffer太小了,数据写到了后面?

  • 非常感谢Chris Meng的回复.我刚才检查了下iss的优先级设置为3,是最高优先级了. 输出jpeg的buffer配置为  jpeg_width * jpeg_height + jpeg_width * jpeg_height * 24/256,即按照rdk中的配置设置的.我把jpeg的quality降低一些,貌似效果会好些,昨天测试了一个晚上,出现打不开的jpeg几率有千分之3, 出现半截的几率也大致差不多.总还是无法杜绝...还有别的原因吗? 或者我的配置有问题吗?

  • 下面是我用到的encode link的参数,请帮我看看是否有没有问题的? 先谢谢了

        EncLink_CreateParams encPrm;
        EncLink_ChCreateParams * pLinkChPrm;
        EncLink_ChDynamicParams * pLinkChDynPrm;
        UInt32 idx;

        MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);
        for (idx = 0; idx < VENC_PRIMARY_CHANNELS; ++idx)
        {
            pLinkChPrm = &encPrm.chCreateParams[idx];
            pLinkChDynPrm = &pLinkChPrm->defaultDynamicParams;
            pLinkChPrm->format = (idx == 0 ? IVIDEO_MJPEG : IVIDEO_H264HP);
            pLinkChPrm->profile = 100;    
            pLinkChPrm->dataLayout = IVIDEO_PROGRESSIVE;            
            pLinkChPrm->fieldMergeEncodeEnable = FALSE;            
            pLinkChPrm->enableAnalyticinfo = (idx == 0 ? 1 : 0);
            pLinkChPrm->maxBitRate =   -1;
            pLinkChPrm->encodingPreset = 3;
            pLinkChPrm->rateControlPreset = IVIDEO_USER_DEFINED; //pChPrm->rcType;            
            pLinkChPrm->enableHighSpeed = FALSE;            
            pLinkChPrm->enableWaterMarking = 0;
            pLinkChPrm->StreamPreset = 0;
            pLinkChDynPrm->intraFrameInterval = 30;
            pLinkChDynPrm->targetBitRate = 800 * 1000 * 1000;
            pLinkChDynPrm->interFrameInterval = 1;    //
            pLinkChDynPrm->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
            pLinkChDynPrm->inputFrameRate = 30;
            pLinkChDynPrm->rcAlg = 0;
            pLinkChDynPrm->qpMin = 1;
            pLinkChDynPrm->qpMax = 51;
            pLinkChDynPrm->qpInit = -1;
            pLinkChDynPrm->vbrDuration = 8;
            pLinkChDynPrm->vbrSensitivity = 0;
            encPrm.numBufPerCh[idx] = 4;
            gVencModuleContext.encFormat[idx] = pLinkChPrm->format;
        }
        encPrm.chCreateParams[0].defaultDynamicParams.inputFrameRate = 30;
        encPrm.chCreateParams[1].defaultDynamicParams.inputFrameRate = 30;  
        encPrm.vsEnable = FALSE;

  • jensen zhang 说:

    非常感谢Chris Meng的回复.我刚才检查了下iss的优先级设置为3,是最高优先级了. 输出jpeg的buffer配置为  jpeg_width * jpeg_height + jpeg_width * jpeg_height * 24/256,即按照rdk中的配置设置的.我把jpeg的quality降低一些,貌似效果会好些,昨天测试了一个晚上,出现打不开的jpeg几率有千分之3, 出现半截的几率也大致差不多.总还是无法杜绝...还有别的原因吗? 或者我的配置有问题吗?

    首先需要定位问题:

    1. 出现半幅图像

    你能否尝试降低系统的DDR负荷,看是否这样的图片就没有了?

    2. 打不开图片

    你能否打印每张JPEG编码后输出的大小,看看是否有超过你设定的buffer大小的情况?

  • 再次感谢Chris Meng的解答.

    1. 出现半幅图像

    你能否尝试降低系统的DDR负荷,看是否这样的图片就没有了?

    这个我去尝试下哈.

    2. 打不开图片

    你能否打印每张JPEG编码后输出的大小,看看是否有超过你设定的buffer大小的情况?

    这个貌似不会,我看了那些打不开的jpeg图片(看图片实际内容实际是缺少了FF D8,FF C0等jpeg格式中要求的段)最终大小都没超过申请的输出buffer,

    比如有一张无法打开的jpeg图片大小为400k左右,而我申请的输出buffer大小为4096*3168+4096*3168*24/256=13M左右,应该是绝不可能超出这个大小的

    具体是在encLink_common.c的Utils_ringBuffer_init(&ringBuffer[i], 13M); 不知道我的理解是否正确?

  • jensen zhang 说:

    2. 打不开图片

    你能否打印每张JPEG编码后输出的大小,看看是否有超过你设定的buffer大小的情况?

    这个貌似不会,我看了那些打不开的jpeg图片(看图片实际内容实际是缺少了FF D8,FF C0等jpeg格式中要求的段)最终大小都没超过申请的输出buffer,

    比如有一张无法打开的jpeg图片大小为400k左右,而我申请的输出buffer大小为4096*3168+4096*3168*24/256=13M左右,应该是绝不可能超出这个大小的

    具体是在encLink_common.c的Utils_ringBuffer_init(&ringBuffer[i], 13M); 不知道我的理解是否正确?

    打印出图片缺少头的buffer的首地址,在程序的map文件里面看看,这个buffer前面的空间是谁在使用。很有可能是这个buffer前面的空间使用者越界使用了。

  • 再次感谢Chris Meng的指导...我的内存配置(config.bld)如下

    ....

    var LINUX_SIZE                 = 166*MB;
    var CMEM_SIZE                  = 135*MB
    var SR1_SIZE                   = 76*MB;
    var VIDEO_M3_CODE_SIZE         = 3*MB;

    ...

    1.我查看了使用CMem的代码,是没有可能超出范围的.

    2.我检查了下出错的jpeg图片,发现打不开的输出内存都是从0x92D91000开始的(即从301M+580K,大致是SR1空间起始地址偏移580K,前面的580K我看了是在cameraLink中Utils_memAlloc_cached()使用了),但不是所有输出缓冲地址为0x92D91000的jpeg图片都是有问题的(大部分都是正常的).

    咳,还得请Chris Meng指导下..不胜感激中...