I was trying VBR Rate control (MFX_RATECONTROL_VBR) for H.264 Encoder. The file size that gets generated is always same irrespective of amount of motion. I have specified max bit rate to be 2048 Kbps. It generates file size which matches roughly max bit rate and looks to be doing CBR.
Any other parameter that I need to set for making VBR work.
No additional parameters are needed. However, which parameter are you setting? The main parameter used is TargetKBPS. If this is not set you will get a default value. The maxKBPS setting does not actually cap the bitrate. It specifies the maximum bitrate at which the encoded data enters the Video Buffering Verifier (VBV) buffer.
I am setting TargetKbps to same as maxBitRate. Following are all the parameters that I am setting. I have tried setting maxBitrate to zero, in which case as per documentation encoder should compute this value.
param->mfx.CodecId = MFX_CODEC_AVC;
param->mfx.CodecProfile = MFX_PROFILE_AVC_MAIN;
param->mfx.CodecLevel = 0;
param->mfx.NumThread = 0;
param->mfx.TargetUsage = MFX_TARGETUSAGE_BALANCED;
param->mfx.RateControlMethod = MFX_RATECONTROL_VBR;
param->mfx.GopPicSize = 30;
param->mfx.GopRefDist = 1;
param->mfx.GopOptFlag = MFX_GOP_CLOSED;
param->mfx.IdrInterval = 0;
param->mfx.InitialDelayInKB = 0;
param->mfx.TargetKbps = 2048;
param->mfx.MaxKbps = 2048;
param->mfx.NumSlice = 0;
param->mfx.NumRefFrame = 0;
param->mfx.EncodedOrder = 0;
param->mfx.FrameInfo.PicStruct = MFX_PICSTRUCT_PROGRESSIVE;
param->mfx.FrameInfo.Width = BIT_ALIGN16(1280);
(MFX_PICSTRUCT_PROGRESSIVE == param->mfx.FrameInfo.PicStruct) ?
BIT_ALIGN16(720) : BIT_ALIGN32(720);
param->mfx.FrameInfo.FrameRateExtN = 30;
param->mfx.FrameInfo.FrameRateExtD = 1;
param->mfx.FrameInfo.FourCC = MFX_FOURCC_NV12;
param->mfx.FrameInfo.ChromaFormat = MFX_CHROMAFORMAT_YUV420;
param->mfx.FrameInfo.CropX = 0;
param->mfx.FrameInfo.CropY = 0;
param->mfx.FrameInfo.CropW = 1280;
param->mfx.FrameInfo.CropH = 720;
One way to start looking at this is if you can replicate the behavior with sample_encode, sample_multi_transcode, or one of the tutorials. If yes, then behavior may be related to content. If no, then there may be an application/parameter issue but you can use the example code as a guide. For example code we recommend the tutorials.
Let me share some background on CBR and VBR concepts as both are standard bitrate controls and more people might have questions on this as well. It all comes down to video quality and bitrate (file size).
Constant Bit Rate (CBR): The intended use for CBR are situations where bitrate variations are penalized and buffering is not possible (i.e. low latency for video conferencing, game streaming, very small physical decoder buffers).
Variable Bit Rate (VBR): The intended use for VBR are situations where a target bitrate is desired but bitrate variations are allowed. It can (but necessary don’t have to) provide higher quality at same bitrate versus CBR. Unlike CBR, VBR does not “pad” bitstream with unused bits.
Lookahead is an evolved VBR. Variations and latency are larger than VBR, but since it includes some benefits similar to 2-pass it can dramatically boost quality.
While the bitrate, and hence the file size, might be the same, the bitrate variation across a period of time is different compared to CBR and video quality might be higher using VBR instead of CBR. You might want to do a file size as well as a quality comparison when comparing CBR and VBR.