summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Wilkins <paulwilkins@google.com>2010-11-17 15:12:04 +0000
committerPaul Wilkins <paulwilkins@google.com>2010-11-17 15:12:04 +0000
commitf874391e029044647f5b6632d8e9592fdb43071b (patch)
tree39270f704310c9c77706f91b4dc204882038de74
parent99d02c0f9f0944162c435801cec84c577e0cf2b0 (diff)
downloadlibvpx-f874391e029044647f5b6632d8e9592fdb43071b.tar
libvpx-f874391e029044647f5b6632d8e9592fdb43071b.tar.gz
libvpx-f874391e029044647f5b6632d8e9592fdb43071b.tar.bz2
libvpx-f874391e029044647f5b6632d8e9592fdb43071b.zip
Replaced recode loop test with a function call
Replaced existing code to decide if a frame recode is required with a function call. This is to simplify addition of extra clauses that may be needed for the planned constrained quality mode. Also fixed a bug where by alt ref not considered in the test. Change-Id: I3d40bb21abe3e19f8456761e6849deb171738b60
-rw-r--r--vp8/encoder/onyx_if.c48
1 files changed, 40 insertions, 8 deletions
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 00ecf97a6..cd047ab9b 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -804,7 +804,8 @@ void vp8_set_speed_features(VP8_COMP *cpi)
sf->thresh_mult[THR_SPLITA ] = 50000;
}
- // Only do recode loop on key frames and golden frames
+ // Only do recode loop on key frames, golden frames and
+ // alt ref frames
sf->recode_loop = 2;
sf->full_freq[0] = 31;
@@ -3435,6 +3436,37 @@ void write_cx_frame_to_file(YV12_BUFFER_CONFIG *frame, int this_frame)
#endif
// return of 0 means drop frame
+// Function to test for conditions that indeicate we should loop
+// back and recode a frame.
+static BOOL recode_loop_test( VP8_COMP *cpi,
+ int high_limit, int low_limit,
+ int q, int maxq, int minq )
+{
+ BOOL force_recode = FALSE;
+ VP8_COMMON *cm = &cpi->common;
+
+ // Is frame recode allowed at all
+ // Yes if either recode mode 1 is selected or mode two is selcted
+ // and the frame is a key frame. golden frame or alt_ref_frame
+ if ( (cpi->sf.recode_loop == 1) ||
+ ( (cpi->sf.recode_loop == 2) &&
+ ( (cm->frame_type == KEY_FRAME) ||
+ cm->refresh_golden_frame ||
+ cm->refresh_alt_ref_frame ) ) )
+ {
+ // General over and under shoot tests
+ if ( ((cpi->projected_frame_size > high_limit) && (q < maxq)) ||
+ ((cpi->projected_frame_size < low_limit) && (q > minq)) )
+ {
+ force_recode = TRUE;
+ }
+ // Specific rate control mode related tests
+ // TBD
+ }
+
+ return force_recode;
+}
+
static void encode_frame_to_data_rate
(
VP8_COMP *cpi,
@@ -4029,19 +4061,18 @@ static void encode_frame_to_data_rate
#if !(CONFIG_REALTIME_ONLY)
// Is the projected frame size out of range and are we allowed to attempt to recode.
- if (((cpi->sf.recode_loop == 1) ||
- ((cpi->sf.recode_loop == 2) && (cm->refresh_golden_frame || (cm->frame_type == KEY_FRAME)))) &&
- (((cpi->projected_frame_size > frame_over_shoot_limit) && (Q < top_index)) ||
- //((cpi->projected_frame_size > frame_over_shoot_limit ) && (Q == top_index) && (cpi->zbin_over_quant < ZBIN_OQ_MAX)) ||
- ((cpi->projected_frame_size < frame_under_shoot_limit) && (Q > bottom_index)))
- )
+ if ( recode_loop_test( cpi,
+ frame_over_shoot_limit, frame_under_shoot_limit,
+ Q, top_index, bottom_index ) )
{
int last_q = Q;
int Retries = 0;
// Frame size out of permitted range:
// Update correction factor & compute new Q to try...
- if (cpi->projected_frame_size > frame_over_shoot_limit)
+
+ // Frame is too large
+ if (cpi->projected_frame_size > cpi->this_frame_target)
{
//if ( cpi->zbin_over_quant == 0 )
q_low = (Q < q_high) ? (Q + 1) : q_high; // Raise Qlow as to at least the current value
@@ -4085,6 +4116,7 @@ static void encode_frame_to_data_rate
overshoot_seen = TRUE;
}
+ // Frame is too small
else
{
if (cpi->zbin_over_quant == 0)