我用的IPNC3.8的RDK,一路800w-jpeg图片流(1s一张),一路200w h264视频流 25帧1s。。在A8端,App_ipcBitsRecvStreamFxn中用memcpy,将数据拷贝到共享内存,跑几个流程,A8会卡死,串口没有任何打印,也没有看到错误。但如果只用单路,就没问题。。如果用自己写的memcpy(和内核中一样),能跑100多次流程,但还是会卡死。。。。
MULTICH_INIT_STRUCT(EncLink_CreateParams, encPrm);
{ EncLink_ChCreateParams *pLinkChPrm;
EncLink_ChDynamicParams *pLinkDynPrm;
VENC_CHN_DYNAMIC_PARAM_S *pDynPrm;
VENC_CHN_PARAMS_S *pChPrm;
for (i = 0; i < VENC_PRIMARY_CHANNELS; i++)
{
pLinkChPrm = &encPrm.chCreateParams[i];
pLinkDynPrm = &pLinkChPrm->defaultDynamicParams;
pChPrm = &gVencModuleContext.vencConfig.encChannelParams[i];
pDynPrm = &pChPrm->dynamicParam;
pLinkChPrm->format = (i==0)? IVIDEO_MJPEG:IVIDEO_H264HP;
pLinkChPrm->profile = gVencModuleContext.vencConfig.h264Profile[i];
pLinkChPrm->dataLayout = IVIDEO_PROGRESSIVE;
pLinkChPrm->fieldMergeEncodeEnable = FALSE;
pLinkChPrm->enableAnalyticinfo = pChPrm->enableAnalyticinfo;
pLinkChPrm->maxBitRate = pChPrm->maxBitRate;
pLinkChPrm->encodingPreset = pChPrm->encodingPreset;
pLinkChPrm->rateControlPreset = IVIDEO_USER_DEFINED;
pLinkChPrm->enableHighSpeed = TRUE;
pLinkChPrm->enableWaterMarking = pChPrm->enableWaterMarking;
pLinkChPrm->StreamPreset = gUI_mcfw_config.StreamPreset[i];
pLinkDynPrm->intraFrameInterval = pDynPrm->intraFrameInterval;
pLinkDynPrm->targetBitRate = (i==0)?(3000*1000):(1200*1000);//pDynPrm->targetBitRate;
pLinkDynPrm->interFrameInterval = 1;
pLinkDynPrm->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;//IVIDENC2_MOTIONVECTOR_QUARTERPEL;//
pLinkDynPrm->inputFrameRate = pDynPrm->inputFrameRate;
pLinkDynPrm->rcAlg = pDynPrm->rcAlg;
pLinkDynPrm->qpMin = pDynPrm->qpMin;
pLinkDynPrm->qpMax = pDynPrm->qpMax;
pLinkDynPrm->qpInit = pDynPrm->qpInit;
pLinkDynPrm->vbrDuration = pDynPrm->vbrDuration;
pLinkDynPrm->vbrSensitivity = pDynPrm->vbrSensitivity;
encPrm.numBufPerCh[i] = (i==0)?2:2;//NUM_ENCODE_BUFFERS;
gVencModuleContext.encFormat[i] = pLinkChPrm->format;
}
}
Chris Meng:
你好,
请问DDR是否有做过SW leveling?
yang yang10:
回复 Chris Meng:
感谢回复~
没有做过,但是将DDR频率从400m降到200m,还是有这个问题。是不是App_ipcBitsRecvStreamFxn中不能memcpy数据进行处理呢。rdk自带的steam流保存要复杂一点,我也没用他带的cmem,而是自己开辟了一段共享内存。unsigned char frame_test[FRAME_SIZE];
memcpy((void *)frame_test,fullBufList.bitsBuf[i].bufVirtAddr+fullBufList.bitsBuf[i].startOffset,fullBufList.bitsBuf[i].filledBufSize);
Chris Meng:
回复 yang yang10:
你好,
请问你是如何开辟的一段共享内存?我建议你使用CMEM获取内存用于copy,再测试一下。
SW leveling是必须做的,不做无法保证DDR运行的稳定性。