Hi everybody, I decided to use Extended Dynamic Parameters because I need to generate and IDR frame every 40 frames (while the intraFrame value is 20 frames). I use Platinum Codec (dm365_h264enc_02_00_00_10_production) with dvsdk 2.10.01.18.
This is the parameter setting excerpt of my code:
/* Parameters */
VIDENC1_Params* encParams;
encParams = &defaultParams;
encParams->maxWidth = params->staticParameters.maxWidth;
encParams->maxHeight = params->staticParameters.maxHeight;
encParams->encodingPreset = XDM_DEFAULT;
encParams->rateControlPreset = IVIDEO_LOW_DELAY;
encParams->maxFrameRate = params->staticParameters.frameRate * 1000;
encParams->maxBitRate = params->staticParameters.bitRate < 0 ? 0 : params->staticParameters.bitRate;
encParams->inputChromaFormat = XDM_YUV_420SP;
encParams->reconChromaFormat = XDM_YUV_420SP;
encParams->maxInterFrameInterval = 1;
/* Use extended dynamic parameters. */
IH264VENC_DynamicParams dynParams = {
Venc1_DynamicParams_DEFAULT,
28, // intraFrameQP
28, // interPFrameQP
28, // initQ
45, // rcQMax
0, // rcQMin
42, // rcQMaxI
0, // rcQMinI
0, // airRate
0, // sliceSize ???
0, // lfDisableIdc
1, // rcAlgo
2000, // maxDelay
0, // intraSliceNum RESERVERD
0, // meMultiPart RESERVED
0, // enableBufSEI
0, // enablePicTimSEI
0, // intraThrQF RESERVED
1, // perceptualRC
40, // idrFrameInterval
0, // mvSADoutFlag
1, // resetHDVICPeveryFrame ?? Might be 0?
0, // enableROI
0, // metaDataGenerateConsume
0, // disableMVDCostFactor RESERVED
};
dynParams.videncDynamicParams.size = sizeof(IH264VENC_DynamicParams);
dynParams.videncDynamicParams.intraFrameInterval = params->dynamicParameters.iFrameInterval;
dynParams.videncDynamicParams.targetBitRate = params->staticParameters.bitRate;
dynParams.videncDynamicParams.inputWidth = params->dynamicParameters.imageWidth;
dynParams.videncDynamicParams.inputHeight = params->dynamicParameters.imageHeight;
if (dynParams.videncDynamicParams.inputHeight == 1088) {
dynParams.videncDynamicParams.inputHeight = 1080;
}
dynParams.videncDynamicParams.targetFrameRate = params->staticParameters.frameRate*1000;
dynParams.videncDynamicParams.refFrameRate = params->staticParameters.frameRate*1000;
dynParams.videncDynamicParams.interFrameInterval = 0;
encoderInstanceTable[index]->hVe1 = Venc1_create(hjEngine, encName, encParams, &dynParams);
IDR frames are generated correctly, but my problem now is that a lot of encoded frames seem to be of size = 0
This never happened before introducing extended parameters.
To clarify here's an excerpt of my logs:
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 157579
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 50298
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 49540
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 50327
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 49528
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 49914
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 198110
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 49641
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 50297
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 51411
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 0
DBG[EncoderEncodeFrame(), 320]: Encoded frame, size is 50711
[...]
What can the problem be? For clarity's sake, here's the command with which I encode:
// Encode the video buffer
if (Venc1_process(encoderInstanceTable[index]->hVe1, inBuf, outBuf) < 0) {
ERR("Failed to encode video buffer\n");
return CODEC_ENCODE_FAIL;
}
And the command with which I retrieve the size of the encoded frame:
int bytesGenerated = Buffer_getNumBytesUsed(outBuf);
(outBuf is a Buffer_Handle outBuf)
Best Regards,
Cristiano.