Hi,
We are using TI H.264 Baseline Profile Encoder on C6678 chip.
We are experiencing heavy problems with video quality using this encoder:
1) Most of bit-rate algorithms do not work properly.
The only 2 bit-rate control setups that work:
-params.videncParams.rateControlPreset = IVIDEO_USER_DEFINED; params.rcAlgo = 0;
-params.videncParams.rateControlPreset = IVIDEO_LOW_DELAY;
2) When using multi-core encoder, the bit-rate is not handled in a proper way (after configuring the bit-rate to 4Mbps, we get 5Mbps and higher bit-rate) - especcially in multi-core setup
3) On lower bit-rates, for example 720p, 30fps, 3Mbps, the image looks bad, very high quantization and moreover, the quantization is much higher near the border between regions that are encoded on different cores. The result is that even in almost static image, the quality is not improved even after many P-frames were generated that are supposed to send more details and to improve frame quality
My encoder params and dynamic params configuration is as following:
p_obj->params.profileIdc = 66;
p_obj->params.searchRange = 64;
p_obj->params.videncParams.inputChromaFormat = XDM_YUV_420P;
p_obj->params.videncParams.encodingPreset = XDM_USER_DEFINED;
if(p_obj->encoder_config.is_variable_bitrate)
{
p_obj->params.videncParams.rateControlPreset = IVIDEO_USER_DEFINED;
p_obj->params.rcAlgo = 0;
}
else
{
p_obj->params.videncParams.rateControlPreset = IVIDEO_LOW_DELAY;
}
p_obj->params.videncParams.maxHeight = p_obj->encoder_config.input_height;
p_obj->params.videncParams.maxWidth = p_obj->encoder_config.input_width;
p_obj->params.videncParams.maxFrameRate = 30000;
p_obj->params.videncParams.maxBitRate = 10000000;
p_obj->params.videncParams.dataEndianness = XDM_BYTE;
p_obj->params.videncParams.maxInterFrameInterval = 0;
p_obj->params.videncParams.inputContentType =IVIDEO_PROGRESSIVE;
p_obj->dynamic_params.videncDynamicParams.inputWidth = p_obj->encoder_config.input_width;
p_obj->dynamic_params.videncDynamicParams.inputHeight = p_obj->encoder_config.input_height;
p_obj->dynamic_params.videncDynamicParams.intraFrameInterval = p_obj->encoder_config.intra_frame_frequency;
p_obj->dynamic_params.videncDynamicParams.generateHeader = XDM_ENCODE_AU;
p_obj->dynamic_params.videncDynamicParams.captureWidth = 0;
p_obj->dynamic_params.videncDynamicParams.forceIFrame = 0;
p_obj->dynamic_params.qpIntra = -1;
p_obj->dynamic_params.qpInter = -1;
p_obj->dynamic_params.quartPelDisable = 0;
p_obj->dynamic_params.qpMax = 51;
p_obj->dynamic_params.qpMin = 0;
p_obj->dynamic_params.airMbPeriod = 0;
p_obj->dynamic_params.maxMBsPerSlice = 0;
p_obj->dynamic_params.sliceRefreshRowStartNumber = 0;
p_obj->dynamic_params.sliceRefreshRowNumber = 0;
p_obj->dynamic_params.filterOffsetA = 0;
p_obj->dynamic_params.filterOffsetB = 0;
p_obj->dynamic_params.log2MaxFNumMinus4 = 0;
p_obj->dynamic_params.picOrderCountType = 0;
p_obj->dynamic_params.chromaQPIndexOffset = 0;
p_obj->dynamic_params.constrainedIntraPredEnable = 1;
p_obj->dynamic_params.maxMVperMB = 4;
p_obj->dynamic_params.intra4x4EnableIdc = INTRA4x4_IPSLICES;
p_obj->dynamic_params.hierCodingEnable = 1;
p_obj->dynamic_params.mvDataEnable = 0;
p_obj->dynamic_params.streamFormat = IH264_BYTE_STREAM;
p_obj->dynamic_params.intraRefreshMethod = IH264_INTRAREFRESH_NONE;
p_obj->dynamic_params.Intra_QP_modulation = 0;
p_obj->dynamic_params.Max_delay = 3;
p_obj->dynamic_params.lfDisableIdc = DISABLE_FILTER_SLICE_EDGES; /* when enabling, causes artifacts on different core's boundaries */
p_obj->dynamic_params.sliceGroupChangeCycle = 0;
p_obj->dynamic_params.idrEnable = 0;
p_obj->dynamic_params.streamFormat = IH264_BYTE_STREAM;
p_obj->dynamic_params.pfNalUnitCallBack = NULL;
p_obj->dynamic_params.top_slice_line = top_slice_line;
p_obj->dynamic_params.bottom_slice_line = bottom_slice_line;
p_obj->dynamic_params.videncDynamicParams.targetBitRate = (XDAS_Int32)p_obj->encoder_config.target_bitrate;
p_obj->dynamic_params.qpMax = 51;
p_obj->dynamic_params.qpMin = 0;
p_obj->dynamic_params.videncDynamicParams.intraFrameInterval = p_obj->encoder_config.intra_frame_frequency;
p_obj->dynamic_params.maxBytesPerSlice = p_obj->encoder_config.max_video_packet_size;
p_obj->dynamic_params.videncDynamicParams.targetFrameRate = ((p_obj->encoder_config.frames_per_sec_2x) >> 1) * 1000;
p_obj->dynamic_params.videncDynamicParams.refFrameRate = p_obj->dynamic_params.videncDynamicParams.targetFrameRate;
Is there any another way to improve the video quality with this encoder?
Thank you,
Oleg Fomenko
Surf Communication Solutions