Hi Everyone:
I'm using the mx53 vpu(and will use imx6Q) to encode VGA pictures(yuv420) to h264 vedio stream. After vpu encodes one frame, we send related h264 datas using wirless network to another dev. Because the wireless bandwidth is limited to an constant value , we hope the h264 bitrate can be or most nearly a constant value "400Kb". My configurations of the vpu are as follows. Howerver ,we mornitored the network's bitrate, the vpu's bitrate isn't an constant, it changes from 100kb to 800kb, also the video quality is much more worse than vedio from TI's dm365 which generates h264 vedio stream with the same bitrate .
Can anyone help me to check which parameter is not right or how to config the vpu to get constant bitrate with high vedio quality ?
Thanks !!
encConfig.stdMode = STD_AVC;
encConfig.picWidth=640;
encConfig.picHeight=480;
encConfig.encWidth=640;
encConfig.encHeight=480;
encConfig.offsetX=0;
encConfig.offsetY=0;
encConfig.bitRate =400; //bitrate set here ,but not working
encConfig.rotatedAngle=0; //rotate
encConfig.initialDelay=0; // no use for h264
encConfig.vbvBufferSize=0; //initial delay==0 , delay this param
encConfig.frameRate=25; //
encConfig.gopsize =50; // 3 IPP, 4IPPP,...
encConfig.enableAutoSkip= 0; //skipe encode
encConfig.intraRefresh =8; // 0 - Intra MB refresh is not used.
encConfig.rcIntraQp=(26); //26, default, Quantization parameter for I frame.
encConfig.annexJ =0;
encConfig.annexK =1;
encConfig.annexT =0;
encConfig.quantparam =48; //vbr 0-51for 264, 1 ~ 31 for MPEG-4
// Fill parameters for encoding.
encOP.bitstreamBuffer = g_BitstreamPhy;
encOP.bitstreamBufferSize = 0x100000;
encOP.bitstreamFormat = encConfig.stdMode;
encOP.frameRateInfo = encConfig.frameRate;
encOP.bitRate = encConfig.bitRate;
encOP.initialDelay = encConfig.initialDelay;
encOP.vbvBufferSize = encConfig.vbvBufferSize; // 0 = ignore
encOP.gopSize = encConfig.gopsize; // only first picture is I
encOP.slicemode.sliceMode = 1; // 0:1 slice per picture, 1: multi slice
encOP.slicemode.sliceSizeMode = 0;
encOP.slicemode.sliceSize = 6000;//12000
encOP.intraRefresh = encConfig.intraRefresh;
encOP.rcIntraQp = encConfig.rcIntraQp;
encOP.userQpMax = 38; //default 1 szj change
encOP.userQpMin = 38;
encOP.userQpMinEnable = 1;
encOP.userQpMaxEnable = 1;
encOP.userGamma = 4096;
encOP.RcIntervalMode = 0;
encOP.MbInterval = 90;
encOP.interleavedCbCr = 0;
encOP.avcIntra16x16OnlyModeEnable = 0;
encOP.picWidth = encConfig.picWidth;
encOP.picHeight = encConfig.picHeight;
encOP.encWidth = encConfig.encWidth;
encOP.encHeight = encConfig.encHeight;
encOP.offsetX = encConfig.offsetX;
encOP.offsetY = encConfig.offsetY;
encOP.rotationAngle = encConfig.rotatedAngle;
if (encConfig.stdMode == STD_MPEG4)
{
encOP.EncStdParam.mp4Param.mp4_dataPartitionEnable = 0;
encOP.EncStdParam.mp4Param.mp4_reversibleVlcEnable = 0;
encOP.EncStdParam.mp4Param.mp4_intraDcVlcThr = 0;
encOP.EncStdParam.mp4Param.mp4_hecEnable = 0;
encOP.EncStdParam.mp4Param.mp4_verid = 2;
}
if (encConfig.stdMode == STD_AVC)
{
encOP.EncStdParam.avcParam.avc_constrainedIntraPredFlag = 0;
encOP.EncStdParam.avcParam.avc_disableDeblk = 0;
encOP.EncStdParam.avcParam.avc_deblkFilterOffsetAlpha = 0;
encOP.EncStdParam.avcParam.avc_deblkFilterOffsetBeta = 0;
encOP.EncStdParam.avcParam.avc_chromaQpOffset = 0;
encOP.EncStdParam.avcParam.avc_audEnable = 1;
encOP.EncStdParam.avcParam.avc_fmoEnable = 0;
encOP.EncStdParam.avcParam.avc_fmoType = 0;
encOP.EncStdParam.avcParam.avc_fmoSliceNum = 0;
encOP.EncStdParam.avcParam.avc_fmoSliceSaveBufSize = MAX_FMO_SLICE_SAVE_BUF_SIZE;
}
encOP.ringBufferEnable = 0;
encOP.dynamicAllocEnable = 0;
encOP.picWidth = (encOP.picWidth + 15) & ~15;
encOP.picHeight = (encOP.picHeight + 15) & ~15;
YFrameSize = encOP.picWidth * encOP.picHeight;
srcFrameIdx = initialInfo.minFrameBufferCount;
exit_t = 0;
frameIdx = 0;
encParam.sourceFrame = &frameBuf[srcFrameIdx];
encParam.quantParam = encConfig.quantparam;
encParam.forceIPicture = 0; //default 0
encParam.skipPicture = 0;
encParam.enableAutoSkip = encConfig.enableAutoSkip;