Hello. I wrote custom transcode chain using linkapi. The chain gets MPEG2 or H264 video as input and transcodes it to H264 with or without deinterlacing. The picture is ok when mpeg2 is used as the input, but some kind of frame shift appears when I use H264 as the input even if it is the video transcoded by my chain.
Here is the some examples:
When MPEG2 as the input:
When previous output is used as the input:
Decoder params:
if(codecID == AV_CODEC_ID_MPEG2VIDEO) {
_params.chCreateParams[chId].format = IVIDEO_MPEG2HP;
} else {
_params.chCreateParams[chId].format = IVIDEO_H264HP;
}
_params.chCreateParams[chId].fieldMergeDecodeEnable = 0;
_params.chCreateParams[chId].numBufPerCh = 10;
_params.chCreateParams[chId].profile = IH264VDEC_PROFILE_ANY;
_params.chCreateParams[chId].displayDelay = -1;
_params.chCreateParams[chId].dpbBufSizeInFrames = IH264VDEC_DPB_NUMFRAMES_AUTO;
if(interlaced) {
_params.chCreateParams[chId].processCallLevel = VDEC_FIELDLEVELPROCESSCALL;
} else {
_params.chCreateParams[chId].processCallLevel = VDEC_FRAMELEVELPROCESSCALL;
}
_params.chCreateParams[chId].targetMaxWidth = 720;
_params.chCreateParams[chId].targetMaxHeight = 576;
_params.chCreateParams[chId].defaultDynamicParams.targetFrameRate = 25;
Encoder params:
_params.chCreateParams[chId].format = IVIDEO_H264HP;
_params.chCreateParams[chId].profile = IH264_HIGH_PROFILE;
_params.chCreateParams[chId].fieldMergeEncodeEnable = 0;
_params.chCreateParams[chId].encodingPreset = VENC_XDM_USER_DEFINED;
_params.chCreateParams[chId].rateControlPreset = VENC_RATE_CTRL_VBR;
_params.chCreateParams[chId].defaultDynamicParams.intraFrameInterval = 25;
_params.chCreateParams[chId].defaultDynamicParams.targetBitRate = 2000*1000;
_params.chCreateParams[chId].maxBitRate = _params.chCreateParams[chId].defaultDynamicParams.targetBitRate * 1.55;
_params.chCreateParams[chId].defaultDynamicParams.interFrameInterval = 1;
_params.chCreateParams[chId].defaultDynamicParams.mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL;
_params.chCreateParams[chId].defaultDynamicParams.inputFrameRate = inputFrameRate;
_params.chCreateParams[chId].defaultDynamicParams.rcAlg = VENC_RATE_CTRL_VBR;
_params.chCreateParams[chId].defaultDynamicParams.qpMin = 1;
_params.chCreateParams[chId].defaultDynamicParams.qpMax = 35;
_params.chCreateParams[chId].defaultDynamicParams.qpInit = -1;
Deinterlacer output queue is DEI_LINK_OUT_QUE_VIP_SC
Filling the buffer:
memcpy(list.bufs[0]->addr, packet->buf->data, packet->buf->size);
list.bufs[0]->fillLength = packet->buf->size;
list.bufs[0]->upperTimeStamp = static_cast<UInt32> ((packet->pts >> 32)& 0xFFFFFFFF);
list.bufs[0]->lowerTimeStamp = static_cast<UInt32> (packet->pts & 0xFFFFFFFF);
IpcBitsOutHLOS channel info:
_params.inQueInfo.chInfo[chId].width = 720;
_params.inQueInfo.chInfo[chId].height = 576;
_params.inQueInfo.chInfo[chId].scanFormat = scanFmt;
_params.inQueInfo.chInfo[chId].bufType = 0; // NOT USED
_params.inQueInfo.chInfo[chId].codingformat = 0; // NOT USED
_params.inQueInfo.chInfo[chId].dataFormat = 0; // NOT USED
_params.inQueInfo.chInfo[chId].memType = 0; // NOT USED
_params.inQueInfo.chInfo[chId].startX = 0; // NOT USED
_params.inQueInfo.chInfo[chId].startY = 0; // NOT USED
_params.inQueInfo.chInfo[chId].pitch[0] = 0; // NOT USED
_params.inQueInfo.chInfo[chId].pitch[1] = 0; // NOT USED
_params.inQueInfo.chInfo[chId].pitch[2] = 0; // NOT USED
_params.maxQueueDepth[chId] = 20;
_params.chMaxReqBufSize[chId] = 720 * 576;
_params.totalBitStreamBufferSize[chId] = 720 * 576 * 5;
I think it could be related to the buffer padding, because there was the same problem with ezsdk. Could you help me please?