Tool/software: Linux
Customer trying to encode H.264 720p stream,(fps 29.97) but the output is only 15fps so far. They checked each performance, and noticed VIDENC2_process takes about 10ms for each 720p frame.
Is there any way to make it faster with 720p encoding?
Attached is their encode parameter.
//static functions
static int setInitParams(S_VidEncode_Obj *videoEnc, dceEncObj_t *dceEncObj)
{
IH264ENC_Params *h264enc_params = NULL;
VIDENC2_Params *params;
if ((videoEnc == NULL) || (dceEncObj == NULL))
{
Report_Log(LOG_WARNING, "dceEncObj object is NULL");
return -1;
}
dceEncObj->inArgs = dce_alloc(sizeof(IH264ENC_InArgs));
if (dceEncObj->inArgs == NULL) return -1;
dceEncObj->inArgs->size = sizeof(IH264ENC_InArgs);
dceEncObj->outArgs = dce_alloc(sizeof(IH264ENC_OutArgs));
if(!dceEncObj->outArgs) return -1;
dceEncObj->outArgs->size = sizeof(IH264ENC_OutArgs);
dceEncObj->h264enc_outArgs = (IH264ENC_OutArgs *) dceEncObj->outArgs;
dceEncObj->params = dce_alloc(sizeof(IH264ENC_Params));
if(!dceEncObj->params) return -1;
dceEncObj->params->size = sizeof(IH264ENC_Params);
params = dceEncObj->params;
params->encodingPreset = XDM_USER_DEFINED; //XDM_USER_DEFINED; //XDM_EncodingPreset
params->rateControlPreset = IVIDEO_USER_DEFINED;
params->maxHeight = videoEnc->vidHeight; //1080;
params->maxWidth = videoEnc->vidWidth; //1920;
params->dataEndianness = XDM_BYTE; //XDM_DataFormat
params->maxBitRate = -1; //IGNORED
params->minBitRate = 0;
params->inputChromaFormat = XDM_YUV_420SP; //XDM_ChromaFormat
params->inputContentType = IVIDEO_PROGRESSIVE; //IVIDEO_ContentType
params->operatingMode = IVIDEO_ENCODE_ONLY; //IVIDEO_OperatingMode
params->profile = dceEncObj->profile;
params->level = dceEncObj->level;
params->inputDataMode = IVIDEO_ENTIREFRAME; //IVIDEO_DataMode
params->outputDataMode = IVIDEO_ENTIREFRAME; //IVIDEO_DataMode
params->numInputDataUnits = 1;
params->numOutputDataUnits = 1;
params->metadataType[0] = IVIDEO_METADATAPLANE_NONE;
params->metadataType[1] = IVIDEO_METADATAPLANE_NONE;
params->metadataType[2] = IVIDEO_METADATAPLANE_NONE;
params->maxInterFrameInterval = 1; //1,31 if IVIDEO_ContentType is IVIDEO_PROGRESSIVE
h264enc_params = dceEncObj->h264enc_params = (IH264ENC_Params *) dceEncObj->params;
h264enc_params->interlaceCodingType = IH264_INTERLACE_DEFAULT;
h264enc_params->bottomFieldIntra = 0;
h264enc_params->gopStructure = IH264ENC_GOPSTRUCTURE_DEFAULT; // IH264ENC_GOPSTRUCTURE_NONUNIFORM
h264enc_params->entropyCodingMode = IH264_ENTROPYCODING_DEFAULT; // IH264_ENTROPYCODING_CAVLC - BASE PROFILE
h264enc_params->transformBlockSize = IH264_TRANSFORM_4x4; // BASE PROFILE
h264enc_params->log2MaxFNumMinus4 = 10;
h264enc_params->picOrderCountType = IH264_POC_TYPE_DEFAULT; // IH264_POC_TYPE_0
h264enc_params->enableWatermark = 0;
h264enc_params->IDRFrameInterval = 1;
h264enc_params->pConstantMemory = 0;
h264enc_params->maxIntraFrameInterval = 0x7FFFFFFF;
h264enc_params->debugTraceLevel = 0;
h264enc_params->lastNFramesToLog = 0;
h264enc_params->enableAnalyticinfo = 0;
h264enc_params->enableGMVSei = 0;
h264enc_params->constraintSetFlags = 20;
h264enc_params->enableRCDO = 0;
h264enc_params->enableLongTermRefFrame = IH264ENC_LTRP_NONE;
h264enc_params->LTRPPeriod = 0;
//H-P Coding Control Params
h264enc_params->numTemporalLayer = IH264_TEMPORAL_LAYERS_1;
h264enc_params->referencePicMarking = IH264_LONG_TERM_PICTURE;
h264enc_params->reservedParams[0] = 0;
h264enc_params->reservedParams[1] = 0;
h264enc_params->reservedParams[2] = 0;
//rate control params
h264enc_params->rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_DEFAULT;//IH264_RATECONTROLPARAMS_USERDEFINED;
h264enc_params->rateControlParams.scalingMatrixPreset = IH264_SCALINGMATRIX_NONE;
h264enc_params->rateControlParams.rcAlgo = IH264_RATECONTROL_DEFAULT; // 0
h264enc_params->rateControlParams.qpI = 28;
h264enc_params->rateControlParams.qpMaxI = 36;
h264enc_params->rateControlParams.qpMinI = 10;
h264enc_params->rateControlParams.qpP = 28;
h264enc_params->rateControlParams.qpMaxP = 40;
h264enc_params->rateControlParams.qpMinP = 10;
h264enc_params->rateControlParams.qpOffsetB = 4;
h264enc_params->rateControlParams.qpMaxB = 44;
h264enc_params->rateControlParams.qpMinB = 10;
h264enc_params->rateControlParams.allowFrameSkip = 0;
h264enc_params->rateControlParams.removeExpensiveCoeff = 0;
h264enc_params->rateControlParams.chromaQPIndexOffset = 0;
h264enc_params->rateControlParams.IPQualityFactor = IH264_QUALITY_FACTOR_DEFAULT; // 0
h264enc_params->rateControlParams.initialBufferLevel = 64000;
h264enc_params->rateControlParams.HRDBufferSize = 64000;
h264enc_params->rateControlParams.minPicSizeRatioI = 0;
h264enc_params->rateControlParams.maxPicSizeRatioI = 20;
h264enc_params->rateControlParams.minPicSizeRatioP = 0;
h264enc_params->rateControlParams.maxPicSizeRatioP = 0;
h264enc_params->rateControlParams.minPicSizeRatioB = 0;
h264enc_params->rateControlParams.maxPicSizeRatioB = 0;
h264enc_params->rateControlParams.enablePRC = 1;
h264enc_params->rateControlParams.enablePartialFrameSkip = 0;
h264enc_params->rateControlParams.discardSavedBits = 0;
h264enc_params->rateControlParams.reserved = 0;
h264enc_params->rateControlParams.VBRDuration = 8;
h264enc_params->rateControlParams.VBRsensitivity = 0;
h264enc_params->rateControlParams.skipDistributionWindowLength = 5;
h264enc_params->rateControlParams.numSkipInDistributionWindow =1;
h264enc_params->rateControlParams.enableHRDComplianceMode = 1;
h264enc_params->rateControlParams.frameSkipThMulQ5 = 0;
h264enc_params->rateControlParams.vbvUseLevelThQ5 = 0;
h264enc_params->rateControlParams.reservedRC[0] = 0;
h264enc_params->rateControlParams.reservedRC[1] = 0;
h264enc_params->rateControlParams.reservedRC[2] = 0;
//intercoding coding params
h264enc_params->interCodingParams.interCodingPreset = IH264_INTERCODING_USERDEFINED;
h264enc_params->interCodingParams.searchRangeHorP = 144;
h264enc_params->interCodingParams.searchRangeVerP = 32;
h264enc_params->interCodingParams.searchRangeHorB = 144;
h264enc_params->interCodingParams.searchRangeVerB = 16;
h264enc_params->interCodingParams.interCodingBias = IH264_BIASFACTOR_DEFAULT;
h264enc_params->interCodingParams.skipMVCodingBias = IH264_BIASFACTOR_MILD;
h264enc_params->interCodingParams.minBlockSizeP = IH264_BLOCKSIZE_8x8;
h264enc_params->interCodingParams.minBlockSizeB = IH264_BLOCKSIZE_8x8;
h264enc_params->interCodingParams.meAlgoMode = IH264ENC_MOTIONESTMODE_DEFAULT;
//intra coding params.
h264enc_params->intraCodingParams.intraCodingPreset = IH264_INTRACODING_DEFAULT;
h264enc_params->intraCodingParams.lumaIntra4x4Enable = 0;
h264enc_params->intraCodingParams.lumaIntra8x8Enable = 0x0FF;
h264enc_params->intraCodingParams.lumaIntra16x16Enable = 0; // BASE PROFILE
h264enc_params->intraCodingParams.chromaIntra8x8Enable = 0; // BASE PROFILE
h264enc_params->intraCodingParams.chromaComponentEnable = IH264_CHROMA_COMPONENT_CB_CR_BOTH; // BASE PROFILE
h264enc_params->intraCodingParams.intraRefreshMethod = IH264_INTRAREFRESH_DEFAULT;
h264enc_params->intraCodingParams.intraRefreshRate = 0;
h264enc_params->intraCodingParams.gdrOverlapRowsBtwFrames = 0;
h264enc_params->intraCodingParams.constrainedIntraPredEnable = 0;
h264enc_params->intraCodingParams.intraCodingBias = IH264ENC_INTRACODINGBIAS_DEFAULT;
//NALU Control Params.
h264enc_params->nalUnitControlParams.naluControlPreset = IH264_NALU_CONTROL_USERDEFINED;
h264enc_params->nalUnitControlParams.naluPresentMaskStartOfSequence = 0x21A0; // 416
h264enc_params->nalUnitControlParams.naluPresentMaskIDRPicture = 0x21A0; //32
h264enc_params->nalUnitControlParams.naluPresentMaskIntraPicture = 0x21A0;
h264enc_params->nalUnitControlParams.naluPresentMaskNonIntraPicture = 0x21A0;
h264enc_params->nalUnitControlParams.naluPresentMaskEndOfSequence = 0x0C00; // 3072
//Slice coding params
h264enc_params->sliceCodingParams.sliceCodingPreset = IH264_SLICECODING_DEFAULT;
h264enc_params->sliceCodingParams.sliceMode = IH264_SLICEMODE_DEFAULT;
h264enc_params->sliceCodingParams.sliceUnitSize = 0;
h264enc_params->sliceCodingParams.sliceStartOffset[0] = 0;
h264enc_params->sliceCodingParams.sliceStartOffset[1] = 0;
h264enc_params->sliceCodingParams.sliceStartOffset[2] = 0;
h264enc_params->sliceCodingParams.streamFormat = IH264_STREAM_FORMAT_DEFAULT;
//Loop Filter Params
h264enc_params->loopFilterParams.loopfilterPreset = IH264_LOOPFILTER_DEFAULT;
h264enc_params->loopFilterParams.loopfilterDisableIDC = IH264_DISABLE_FILTER_DEFAULT;
h264enc_params->loopFilterParams.filterOffsetA = 0;
h264enc_params->loopFilterParams.filterOffsetB = 0;
//fmo coding params
h264enc_params->fmoCodingParams.fmoCodingPreset = IH264_FMOCODING_DEFAULT;
h264enc_params->fmoCodingParams.numSliceGroups = 1;
h264enc_params->fmoCodingParams.sliceGroupMapType = IH264_SLICE_GRP_MAP_DEFAULT;
h264enc_params->fmoCodingParams.sliceGroupChangeDirectionFlag = IH264ENC_SLICEGROUP_CHANGE_DIRECTION_DEFAULT;
h264enc_params->fmoCodingParams.sliceGroupChangeRate = 0;
h264enc_params->fmoCodingParams.sliceGroupChangeCycle = 0;
h264enc_params->fmoCodingParams.sliceGroupParams[0] = 0;
h264enc_params->fmoCodingParams.sliceGroupParams[1] = 0;
//VUI Control Params
h264enc_params->vuiCodingParams.vuiCodingPreset = IH264_VUICODING_USERDEFINED;
h264enc_params->vuiCodingParams.aspectRatioInfoPresentFlag = 1;
h264enc_params->vuiCodingParams.aspectRatioIdc = IH264ENC_ASPECTRATIO_10_11;// : IH264ENC_ASPECTRATIO_16_11;
h264enc_params->vuiCodingParams.videoSignalTypePresentFlag = 0;
h264enc_params->vuiCodingParams.videoFormat = IH264ENC_VIDEOFORMAT_NTSC;
h264enc_params->vuiCodingParams.videoFullRangeFlag = 0;
h264enc_params->vuiCodingParams.timingInfoPresentFlag = 1;
h264enc_params->vuiCodingParams.hrdParamsPresentFlag = 0;
h264enc_params->vuiCodingParams.numUnitsInTicks = 1001;
//Stereo Info Control Params
h264enc_params->stereoInfoParams.stereoInfoPreset = IH264_STEREOINFO_DISABLE;
h264enc_params->stereoInfoParams.topFieldIsLeftViewFlag = 1;
h264enc_params->stereoInfoParams.viewSelfContainedFlag = 0;
//Frame Packing SEI Params
h264enc_params->framePackingSEIParams.framePackingPreset = IH264_FRAMEPACK_SEI_DISABLE;
h264enc_params->framePackingSEIParams.framePackingType = IH264_FRAMEPACK_TYPE_DEFAULT;
h264enc_params->framePackingSEIParams.frame0PositionX = 0;
h264enc_params->framePackingSEIParams.frame0PositionY = 0;
h264enc_params->framePackingSEIParams.frame1PositionX = 0;
h264enc_params->framePackingSEIParams.frame1PositionY = 0;
h264enc_params->framePackingSEIParams.reservedByte = 0;
//SVC coding params
h264enc_params->svcCodingParams.svcExtensionFlag = IH264_SVC_EXTENSION_FLAG_DISABLE;
h264enc_params->svcCodingParams.dependencyID = 0;
h264enc_params->svcCodingParams.qualityID = 0;
h264enc_params->svcCodingParams.enhancementProfileID = 0;
h264enc_params->svcCodingParams.layerIndex = 0;
h264enc_params->svcCodingParams.refLayerDQId = 0;
return 0;
}
static int setInitDynParams(S_VidEncode_Obj *videoEnc, dceEncObj_t *dceEncObj)
{
VIDENC2_DynamicParams *dynParams = NULL;
IH264ENC_DynamicParams *h264enc_dynParams = NULL;
dynParams = dceEncObj->dynParams = dce_alloc(sizeof(IH264ENC_DynamicParams));
if(!dceEncObj->dynParams) return -1;
dceEncObj->dynParams->size = sizeof(IH264ENC_DynamicParams);
dynParams->inputHeight = videoEnc->vidHeight;
dynParams->inputWidth = videoEnc->vidWidth;
dynParams->refFrameRate = videoEnc->frameRate * 10; // refFrameRate in fps * 1000
dynParams->targetFrameRate = videoEnc->frameRate * 10; // Target frame rate in fps * 1000
dynParams->targetBitRate = videoEnc->bitRate * 1024;
dynParams->intraFrameInterval = 30;
dynParams->generateHeader = XDM_ENCODE_AU;
dynParams->captureWidth = videoEnc->vidWidth;
dynParams->forceFrame = IVIDEO_NA_FRAME;
dynParams->sampleAspectRatioHeight = 1;
dynParams->sampleAspectRatioWidth = 1;
dynParams->ignoreOutbufSizeFlag = XDAS_FALSE; // If this is XDAS_TRUE then getBufferFxn and getBufferHandle needs to be set.
dynParams->putDataFxn = NULL;
dynParams->putDataHandle = NULL;
dynParams->getDataFxn = NULL;
dynParams->getDataHandle = NULL;
dynParams->getBufferFxn = NULL;
dynParams->getBufferHandle = NULL;
dynParams->lateAcquireArg = -1;
dynParams->interFrameInterval = 1; // 2 B frames
dynParams->mvAccuracy = IVIDENC2_MOTIONVECTOR_QUARTERPEL; //IVIDENC2_MotionVectorAccuracy
h264enc_dynParams = (IH264ENC_DynamicParams *) dynParams;
h264enc_dynParams->sliceGroupChangeCycle = 0;
h264enc_dynParams->searchCenter.x = 0x7FFF; // or 32767
h264enc_dynParams->searchCenter.y = 0x7FFF; // or 32767
h264enc_dynParams->enableStaticMBCount = 0;
h264enc_dynParams->enableROI = 0;
h264enc_dynParams->reservedDynParams[0] = 0;
h264enc_dynParams->reservedDynParams[1] = 0;
h264enc_dynParams->reservedDynParams[2] = 0;
//Rate Control Params
h264enc_dynParams->rateControlParams.rateControlParamsPreset = IH264_RATECONTROLPARAMS_EXISTING;
h264enc_dynParams->rateControlParams.scalingMatrixPreset = IH264_SCALINGMATRIX_NONE;
h264enc_dynParams->rateControlParams.rcAlgo = IH264_RATECONTROL_DEFAULT;
h264enc_dynParams->rateControlParams.qpI = 28;
h264enc_dynParams->rateControlParams.qpMaxI = 36;
h264enc_dynParams->rateControlParams.qpMinI = 10;
h264enc_dynParams->rateControlParams.qpP = 28;
h264enc_dynParams->rateControlParams.qpMaxP = 40;
h264enc_dynParams->rateControlParams.qpMinP = 10;
h264enc_dynParams->rateControlParams.qpOffsetB = 4;
h264enc_dynParams->rateControlParams.qpMaxB = 44;
h264enc_dynParams->rateControlParams.qpMinB = 10;
h264enc_dynParams->rateControlParams.allowFrameSkip = 0;
h264enc_dynParams->rateControlParams.removeExpensiveCoeff = 0;
h264enc_dynParams->rateControlParams.IPQualityFactor = IH264_QUALITY_FACTOR_DEFAULT;
h264enc_dynParams->rateControlParams.chromaQPIndexOffset = 0;
h264enc_dynParams->rateControlParams.initialBufferLevel = 64000;
h264enc_dynParams->rateControlParams.HRDBufferSize = 64000;
h264enc_dynParams->rateControlParams.enablePartialFrameSkip = 0;
h264enc_dynParams->rateControlParams.minPicSizeRatioI = 0;
h264enc_dynParams->rateControlParams.maxPicSizeRatioI = 20;
h264enc_dynParams->rateControlParams.minPicSizeRatioP = 0;
h264enc_dynParams->rateControlParams.maxPicSizeRatioP = 0;
h264enc_dynParams->rateControlParams.minPicSizeRatioB = 0;
h264enc_dynParams->rateControlParams.maxPicSizeRatioB = 0;
h264enc_dynParams->rateControlParams.enablePRC = 1;
h264enc_dynParams->rateControlParams.enableHRDComplianceMode = 0;
h264enc_dynParams->rateControlParams.reserved = 0;
h264enc_dynParams->rateControlParams.VBRDuration = 8;
h264enc_dynParams->rateControlParams.VBRsensitivity = 0;
h264enc_dynParams->rateControlParams.skipDistributionWindowLength = 5;
h264enc_dynParams->rateControlParams.numSkipInDistributionWindow = 1;
h264enc_dynParams->rateControlParams.enableHRDComplianceMode = 1;
h264enc_dynParams->rateControlParams.frameSkipThMulQ5 = 0;
h264enc_dynParams->rateControlParams.vbvUseLevelThQ5 = 0;
h264enc_dynParams->rateControlParams.reservedRC[0] = 0;
h264enc_dynParams->rateControlParams.reservedRC[1] = 0;
h264enc_dynParams->rateControlParams.reservedRC[2] = 0;
//Inter Coding Params
h264enc_dynParams->interCodingParams.interCodingPreset = IH264_INTERCODING_EXISTING;
h264enc_dynParams->interCodingParams.searchRangeHorP = 144;
h264enc_dynParams->interCodingParams.searchRangeVerP = 32;
h264enc_dynParams->interCodingParams.searchRangeHorB = 144;
h264enc_dynParams->interCodingParams.searchRangeVerB = 16;
h264enc_dynParams->interCodingParams.interCodingBias = IH264_BIASFACTOR_DEFAULT;
h264enc_dynParams->interCodingParams.skipMVCodingBias = IH264_BIASFACTOR_MILD;
h264enc_dynParams->interCodingParams.minBlockSizeP = IH264_BLOCKSIZE_8x8;
h264enc_dynParams->interCodingParams.minBlockSizeB = IH264_BLOCKSIZE_8x8;
h264enc_dynParams->interCodingParams.meAlgoMode = IH264ENC_MOTIONESTMODE_DEFAULT;
//Intra Coding Params
h264enc_dynParams->intraCodingParams.intraCodingPreset = IH264_INTRACODING_EXISTING;
h264enc_dynParams->intraCodingParams.lumaIntra4x4Enable = 0xFF; // or 255 BASE PROFILE
h264enc_dynParams->intraCodingParams.lumaIntra8x8Enable = 0; // BASE PROFILE
h264enc_dynParams->intraCodingParams.lumaIntra16x16Enable = 0;
h264enc_dynParams->intraCodingParams.chromaIntra8x8Enable = 0;
h264enc_dynParams->intraCodingParams.chromaComponentEnable = IH264_CHROMA_COMPONENT_CB_CR_BOTH;
h264enc_dynParams->intraCodingParams.intraRefreshMethod = IH264_INTRAREFRESH_DEFAULT;
h264enc_dynParams->intraCodingParams.intraRefreshRate = 0;
h264enc_dynParams->intraCodingParams.gdrOverlapRowsBtwFrames = 0;
h264enc_dynParams->intraCodingParams.constrainedIntraPredEnable = 0;
h264enc_dynParams->intraCodingParams.intraCodingBias = IH264ENC_INTRACODINGBIAS_DEFAULT;
//Slice Coding Params
h264enc_dynParams->sliceCodingParams.sliceCodingPreset = IH264_SLICECODING_EXISTING;
h264enc_dynParams->sliceCodingParams.sliceMode = IH264_SLICEMODE_DEFAULT;
h264enc_dynParams->sliceCodingParams.sliceUnitSize = 0;
h264enc_dynParams->sliceCodingParams.sliceStartOffset[0] = 0;
h264enc_dynParams->sliceCodingParams.sliceStartOffset[1] = 0;
h264enc_dynParams->sliceCodingParams.sliceStartOffset[2] = 0;
h264enc_dynParams->sliceCodingParams.streamFormat = IH264_STREAM_FORMAT_DEFAULT;
dceEncObj->h264enc_dynParams = h264enc_dynParams;
dceEncObj->h264enc_status = dce_alloc(sizeof(IH264ENC_Status));
if(!dceEncObj->h264enc_status)
{
Report_Log(LOG_WARNING, "dce_alloc enc status failed");
return -1;
}
((VIDENC2_Status*)(dceEncObj->h264enc_status))->size = sizeof(IH264ENC_Status);
dceEncObj->status = (VIDENC2_Status*) (dceEncObj->h264enc_status);
Report_Log(LOG_DEBUG, "encoder params res: %dx%d fr %dfps br %dkbps rotated %d profile_value %d level %d",
dynParams->inputWidth, dynParams->inputHeight, videoEnc->frameRate, videoEnc->bitRate, videoEnc->rotation, dceEncObj->profile, dceEncObj->level);
return 0;
}