- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi,
When ipp-samples is compiled with #define SLICE_CHECK_LIMIT eabled, H264VideoEncoder's bitrate controls aren't obeyed. For example, on CIF videos with a good amount of movement, target bitrate set to 200 kbps, and params.num_slices set to -1300, the H264VideoEncoder generates output whose bitrate is almost 3X that requested.
I'm setting the following:
params.profile_idc = UMC::H264_BASE_PROFILE;
params.B_frame_rate = 0; // Disable B-frames
params.entropy_coding_mode = 0; // CAVLC
params.transform_8x8_mode_flag = false;
params.num_slices = -1300; // Maximum slice size: 1300 bytes
params.numThreads = 1;
params.num_ref_frames = 2;
params.mv_search_method = 2;
params.me_split_mode = 1;
params.rate_controls.method = UMC::H264_RCM_CBR;
params.me_search_x = 8;
params.me_search_y = 8;
params.direct_pred_mode = 1;
encoderParams.info.clip_info.width = 352;
encoderParams.info.clip_info.height = 288;
encoderParams.info.framerate = 15.0;
encoderParams.level_idc = 12;
encoderParams.info.bitrate = 200000;
encoderParams.key_frame_controls.method = UMC::H264_KFCM_INTERVAL;
encoderParams.key_frame_controls.interval = (Ipp32s) (2*15.0);
encoderParams.key_frame_controls.idr_interval = 1; // Each intra-frame is an IDR frame
On the other hand, if SLICE_CHECK_LIMIT is disabled and params.num_slices not explicitly set (i.e. - default value), the H264VideoEncoder gnerates output whose bitrate is for all practical purposes equal to that requested.
Has anyone gotton bitrate controls to work with #define SLICE_CHECK_LIMIT? If so, what changes are required?
Thanks In Advance,
Steve
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Steve,
I was able to make it work several releases ago.
Looking at the latest drop, it seems that the api H264_AVBR_PostFrame in the H264_RCM_CBR case is not called when SLICE_CHECK_LIMIT is enabled. However there is a call to H264_AVBR_PostFrame in the H264_RCM_CBR_SLICE mode, maybe you can try this one.
Emmanuel
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Emmanuel,
Thanks for your response. I tried your suggestion of setting params.rate_controls.method = UMC::H264_RCM_CBR_SLICE. It resulted in a bitstream with an even higher bitrate (e.g. - over 5X what I was previously experiencing).
Did you have to modify the code in older releases to make bitrate controls work? If so, what modifications should I make in ipp-samples 6.1.5.068 ?
Many Thanks,
Steve
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I did have to change quite some code at the time includingcode related to therate control to make the SLICE_CHECK_LIMIT works.
I can't remember exactly what code I had to change and I am not currently using the IPP rate control algorithm.
In order to make things work I think you need to add up the bits generated for each slice to get the total size of the frame generated and provide the information to the AVBR object in the H264_AVBR_PostFrame method once for each frame.
Hope this helps.
Emmanuel
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Emmanuel,
Thanks again for your reply. Would you mind ifwe discuss this further offline? You can reach me at steveipps@gmail.com.
Thanks,
Steve
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
[bash][/bash]
Here is a small fix that seems to address the issue.
In the umc_h264_gen_enc_templ.cpp.h inthe H264CoreEncoder_CompressFrame function, around line 858 replace
[bash]#ifdef SLICE_CHECK_LIMIT } #endif // SLICE_CHECK_LIMIT[/bash]
by
#ifdef SLICE_CHECK_LIMIT
}
else
{
if (core_enc->m_info.rate_controls.method == H264_RCM_VBR || core_enc->m_info.rate_controls.method == H264_RCM_CBR) {
bitsPerFrame = (dst->GetDataSize() - data_size) << 3;
H264_AVBR_PostFrame(&core_enc->avbr, core_enc->m_PicType, bitsPerFrame);
}
}
#endif // SLICE_CHECK_LIMIT
Emmanuel
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Just let you know the modified codewas integrated to IPP 7.0.5 sample. Code Samples for the Intel Integrated Performance Primitives (Intel IPP) Library 7.0*
Thanks a lot for the sharing
Best Regards,
Ying
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page