论坛里各位朋友好!
我使用rdk3.5平台, 编码出的jpeg图片发现偶尔会出现损坏的情形,具体见附件图片,还出现过编码后的jpeg图片无图片头(FF D8)从而打不开,想肯定哪位大侠帮我解答下出现这些异常的jpeg图片一般是什么原因造成的呢? (除了待编码的YUV数据存在问题外).先谢谢了!
Chris Meng:
Zhang Jensen,
第一张图像想是YUV数据没有写全,看看ISS的优先级是否配置为最大。
jpeg图片无图片头,会否是数据被篡改?例如配置的jpeg输出buffer太小了,数据写到了后面?
jensen zhang:
回复 Chris Meng:
非常感谢Chris Meng的回复.我刚才检查了下iss的优先级设置为3,是最高优先级了. 输出jpeg的buffer配置为 jpeg_width * jpeg_height + jpeg_width * jpeg_height * 24/256,即按照rdk中的配置设置的.我把jpeg的quality降低一些,貌似效果会好些,昨天测试了一个晚上,出现打不开的jpeg几率有千分之3, 出现半截的几率也大致差不多.总还是无法杜绝…还有别的原因吗? 或者我的配置有问题吗?
jensen zhang:
回复 jensen zhang:
下面是我用到的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;
Chris Meng:
回复 jensen zhang:
jensen zhang
非常感谢Chris Meng的回复.我刚才检查了下iss的优先级设置为3,是最高优先级了. 输出jpeg的buffer配置为 jpeg_width * jpeg_height + jpeg_width * jpeg_height * 24/256,即按照rdk中的配置设置的.我把jpeg的quality降低一些,貌似效果会好些,昨天测试了一个晚上,出现打不开的jpeg几率有千分之3, 出现半截的几率也大致差不多.总还是无法杜绝…还有别的原因吗? 或者我的配置有问题吗?
jensen zhang:
回复 Chris Meng:
再次感谢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); 不知道我的理解是否正确?
Chris Meng:
回复 jensen zhang:
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前面的空间使用者越界使用了。
jensen zhang:
回复 Chris Meng:
再次感谢Chris Meng的指导…我的内存配置(config.bld)如下
….
var LINUX_SIZE = 166*MB;var CMEM_SIZE = 135*MBvar 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指导下..不胜感激中…