Move pick_frame_size() to ratectrl.c

This is a first step in cleaning up the redundancies between
vp8_calc_{auto_,}iframe_target_size. The pick_frame_size() function is
moved to ratectrl.c, and made to be the primary interface. This means
that the various calc_*_target_size functions can be made private.

Change-Id: I66a9a62a5f9c23c818015e03f92f3757bf3bb5c8
This commit is contained in:
John Koleszar 2011-04-25 15:02:54 -04:00
parent 0da77a840b
commit 81d2206ff8
3 changed files with 90 additions and 83 deletions

View File

@ -56,7 +56,6 @@ extern void vp8_loop_filter_frame(VP8_COMMON *cm, MACROBLOCKD *mbd, int filt
extern void vp8_loop_filter_frame_yonly(VP8_COMMON *cm, MACROBLOCKD *mbd, int filt_val, int sharpness_lvl);
extern void vp8_dmachine_specific_config(VP8_COMP *cpi);
extern void vp8_cmachine_specific_config(VP8_COMP *cpi);
extern void vp8_calc_auto_iframe_target_size(VP8_COMP *cpi);
extern void vp8_deblock_frame(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *post, int filt_lvl, int low_var_thresh, int flag);
extern void print_parms(VP8_CONFIG *ocf, char *filenam);
extern unsigned int vp8_get_processor_freq();
@ -2646,78 +2645,7 @@ static void resize_key_frame(VP8_COMP *cpi)
#endif
}
// return of 0 means drop frame
static int pick_frame_size(VP8_COMP *cpi)
{
VP8_COMMON *cm = &cpi->common;
// First Frame is a special case
if (cm->current_video_frame == 0)
{
#if !(CONFIG_REALTIME_ONLY)
if (cpi->pass == 2)
vp8_calc_auto_iframe_target_size(cpi);
else
#endif
{
/* 1 Pass there is no information on which to base size so use
* bandwidth per second * fraction of the initial buffer
* level
*/
cpi->this_frame_target = cpi->oxcf.starting_buffer_level / 2;
if(cpi->this_frame_target > cpi->oxcf.target_bandwidth * 3 / 2)
cpi->this_frame_target = cpi->oxcf.target_bandwidth * 3 / 2;
}
// Key frame from VFW/auto-keyframe/first frame
cm->frame_type = KEY_FRAME;
}
// Special case for forced key frames
// The frame sizing here is still far from ideal for 2 pass.
else if (cm->frame_flags & FRAMEFLAGS_KEY)
{
cm->frame_type = KEY_FRAME;
resize_key_frame(cpi);
vp8_calc_iframe_target_size(cpi);
}
else if (cm->frame_type == KEY_FRAME)
{
vp8_calc_auto_iframe_target_size(cpi);
}
else
{
// INTER frame: compute target frame size
cm->frame_type = INTER_FRAME;
vp8_calc_pframe_target_size(cpi);
// Check if we're dropping the frame:
if (cpi->drop_frame)
{
cpi->drop_frame = FALSE;
cpi->drop_count++;
return 0;
}
}
/* Apply limits on keyframe target.
*
* TODO: move this after consolidating
* vp8_calc_iframe_target_size() and vp8_calc_auto_iframe_target_size()
*/
if (cm->frame_type == KEY_FRAME && cpi->oxcf.rc_max_intra_bitrate_pct)
{
unsigned int max_rate = cpi->av_per_frame_bandwidth
* cpi->oxcf.rc_max_intra_bitrate_pct / 100;
if (cpi->this_frame_target > max_rate)
cpi->this_frame_target = max_rate;
}
return 1;
}
static void set_quantizer(VP8_COMP *cpi, int Q)
{
@ -3506,7 +3434,7 @@ static void encode_frame_to_data_rate
}
// Decide how big to make the frame
if (!pick_frame_size(cpi))
if (!vp8_pick_frame_size(cpi))
{
cm->current_video_frame++;
cpi->frames_since_key++;
@ -3834,7 +3762,10 @@ static void encode_frame_to_data_rate
}
if (cm->frame_type == KEY_FRAME)
{
resize_key_frame(cpi);
vp8_setup_key_frame(cpi);
}
// transform / motion compensation build reconstruction frame
vp8_encode_frame(cpi);
@ -3858,11 +3789,11 @@ static void encode_frame_to_data_rate
#else
if (decide_key_frame(cpi))
{
vp8_calc_auto_iframe_target_size(cpi);
// Reset all our sizing numbers and recode
cm->frame_type = KEY_FRAME;
vp8_pick_frame_size(cpi);
// Clear the Alt reference frame active flag when we have a key frame
cpi->source_alt_ref_active = FALSE;
@ -3891,7 +3822,6 @@ static void encode_frame_to_data_rate
loop_count++;
Loop = TRUE;
resize_key_frame(cpi);
continue;
}
#endif

View File

@ -329,7 +329,11 @@ void vp8_setup_key_frame(VP8_COMP *cpi)
cpi->common.refresh_alt_ref_frame = TRUE;
}
void vp8_calc_auto_iframe_target_size(VP8_COMP *cpi)
static void calc_iframe_target_size(VP8_COMP *cpi);
static void calc_auto_iframe_target_size(VP8_COMP *cpi)
{
// boost defaults to half second
int kf_boost;
@ -339,7 +343,7 @@ void vp8_calc_auto_iframe_target_size(VP8_COMP *cpi)
if (cpi->oxcf.fixed_q >= 0)
{
vp8_calc_iframe_target_size(cpi);
calc_iframe_target_size(cpi);
return;
}
@ -579,7 +583,8 @@ static int baseline_bits_at_q(int frame_kind, int Q, int MBs)
return (Bpm * MBs) >> BPER_MB_NORMBITS;
}
void vp8_calc_iframe_target_size(VP8_COMP *cpi)
static void calc_iframe_target_size(VP8_COMP *cpi)
{
int Q;
int Boost = 100;
@ -656,8 +661,7 @@ void vp8_calc_iframe_target_size(VP8_COMP *cpi)
}
void vp8_calc_pframe_target_size(VP8_COMP *cpi)
static void calc_pframe_target_size(VP8_COMP *cpi)
{
int min_frame_target;
int Adjustment;
@ -1569,3 +1573,75 @@ void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit,
}
}
}
// return of 0 means drop frame
int vp8_pick_frame_size(VP8_COMP *cpi)
{
VP8_COMMON *cm = &cpi->common;
// First Frame is a special case
if (cm->current_video_frame == 0)
{
#if !(CONFIG_REALTIME_ONLY)
if (cpi->pass == 2)
calc_auto_iframe_target_size(cpi);
else
#endif
{
/* 1 Pass there is no information on which to base size so use
* bandwidth per second * fraction of the initial buffer
* level
*/
cpi->this_frame_target = cpi->oxcf.starting_buffer_level / 2;
if(cpi->this_frame_target > cpi->oxcf.target_bandwidth * 3 / 2)
cpi->this_frame_target = cpi->oxcf.target_bandwidth * 3 / 2;
}
// Key frame from VFW/auto-keyframe/first frame
cm->frame_type = KEY_FRAME;
}
// Special case for forced key frames
// The frame sizing here is still far from ideal for 2 pass.
else if (cm->frame_flags & FRAMEFLAGS_KEY)
{
calc_iframe_target_size(cpi);
}
else if (cm->frame_type == KEY_FRAME)
{
calc_auto_iframe_target_size(cpi);
}
else
{
// INTER frame: compute target frame size
cm->frame_type = INTER_FRAME;
calc_pframe_target_size(cpi);
// Check if we're dropping the frame:
if (cpi->drop_frame)
{
cpi->drop_frame = FALSE;
cpi->drop_count++;
return 0;
}
}
/* Apply limits on keyframe target.
*
* TODO: move this after consolidating
* calc_iframe_target_size() and calc_auto_iframe_target_size()
*/
if (cm->frame_type == KEY_FRAME && cpi->oxcf.rc_max_intra_bitrate_pct)
{
unsigned int max_rate = cpi->av_per_frame_bandwidth
* cpi->oxcf.rc_max_intra_bitrate_pct / 100;
if (cpi->this_frame_target > max_rate)
cpi->this_frame_target = max_rate;
}
return 1;
}

View File

@ -17,11 +17,12 @@ extern void vp8_save_coding_context(VP8_COMP *cpi);
extern void vp8_restore_coding_context(VP8_COMP *cpi);
extern void vp8_setup_key_frame(VP8_COMP *cpi);
extern void vp8_calc_iframe_target_size(VP8_COMP *cpi);
extern void vp8_calc_pframe_target_size(VP8_COMP *cpi);
extern void vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var);
extern int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame);
extern void vp8_adjust_key_frame_context(VP8_COMP *cpi);
extern void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit, int *frame_over_shoot_limit);
// return of 0 means drop frame
extern int vp8_pick_frame_size(VP8_COMP *cpi);
#endif