ref: f3919f187999b0f0c55cb252ae92394483f0152b
parent: 3702229d9f7bc2d120b2de7aeaf2714d0468cad5
parent: 9a6740af807d47a605d600e008e60f5f8364dd1f
author: John Koleszar <jkoleszar@google.com>
date: Wed Nov 17 19:05:04 EST 2010
Merge remote branch 'internal/upstream' into HEAD
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -801,7 +801,8 @@
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;
@@ -3431,6 +3432,37 @@
#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,
@@ -4028,12 +4060,9 @@
#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;
@@ -4040,7 +4069,9 @@
// 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
@@ -4084,6 +4115,7 @@
overshoot_seen = TRUE;
}
+ // Frame is too small
else
{
if (cpi->zbin_over_quant == 0)
--- a/vp8/encoder/rdopt.c
+++ b/vp8/encoder/rdopt.c
@@ -477,67 +477,6 @@
return error;
}
-#if !(CONFIG_REALTIME_ONLY)
-static int macro_block_max_error(MACROBLOCK *mb)
-{
- int error = 0;
- int dc = 0;
- BLOCK *be;
- int i, j;
- int berror;
-
- dc = !(mb->e_mbd.mode_info_context->mbmi.mode == B_PRED || mb->e_mbd.mode_info_context->mbmi.mode == SPLITMV);
-
- for (i = 0; i < 16; i++)
- {
- be = &mb->block[i];
-
- berror = 0;
-
- for (j = dc; j < 16; j++)
- {
- int this_diff = be->coeff[j];
- berror += this_diff * this_diff;
- }
-
- error += berror;
- }
-
- for (i = 16; i < 24; i++)
- {
- be = &mb->block[i];
- berror = 0;
-
- for (j = 0; j < 16; j++)
- {
- int this_diff = be->coeff[j];
- berror += this_diff * this_diff;
- }
-
- error += berror;
- }
-
- error <<= 2;
-
- if (dc)
- {
- be = &mb->block[24];
- berror = 0;
-
- for (j = 0; j < 16; j++)
- {
- int this_diff = be->coeff[j];
- berror += this_diff * this_diff;
- }
-
- error += berror;
- }
-
- error >>= 4;
- return error;
-}
-#endif
-
int VP8_UVSSE(MACROBLOCK *x, const vp8_variance_rtcd_vtable_t *rtcd)
{
unsigned char *uptr, *vptr;
@@ -610,11 +549,10 @@
return cost;
}
-int vp8_rdcost_mby(MACROBLOCK *mb)
+static int vp8_rdcost_mby(MACROBLOCK *mb)
{
int cost = 0;
int b;
- int type = 0;
MACROBLOCKD *x = &mb->e_mbd;
ENTROPY_CONTEXT_PLANES t_above, t_left;
ENTROPY_CONTEXT *ta;
@@ -626,16 +564,12 @@
ta = (ENTROPY_CONTEXT *)&t_above;
tl = (ENTROPY_CONTEXT *)&t_left;
- if (x->mode_info_context->mbmi.mode == SPLITMV)
- type = 3;
-
for (b = 0; b < 16; b++)
- cost += cost_coeffs(mb, x->block + b, type,
+ cost += cost_coeffs(mb, x->block + b, 0,
ta + vp8_block2above[b], tl + vp8_block2left[b]);
- if (x->mode_info_context->mbmi.mode != SPLITMV)
- cost += cost_coeffs(mb, x->block + 24, 1,
- ta + vp8_block2above[24], tl + vp8_block2left[24]);
+ cost += cost_coeffs(mb, x->block + 24, 1,
+ ta + vp8_block2above[24], tl + vp8_block2left[24]);
return cost;
}
@@ -1062,10 +996,7 @@
}
// 2nd order fdct
- if (x->mode_info_context->mbmi.mode != SPLITMV)
- {
- mb->short_walsh4x4(mb_y2->src_diff, mb_y2->coeff, 8);
- }
+ mb->short_walsh4x4(mb_y2->src_diff, mb_y2->coeff, 8);
// Quantization
for (b = 0; b < 16; b++)
@@ -1074,22 +1005,11 @@
}
// DC predication and Quantization of 2nd Order block
- if (x->mode_info_context->mbmi.mode != SPLITMV)
- {
+ mb->quantize_b(mb_y2, x_y2);
- {
- mb->quantize_b(mb_y2, x_y2);
- }
- }
-
// Distortion
- if (x->mode_info_context->mbmi.mode == SPLITMV)
- d = ENCODEMB_INVOKE(rtcd, mberr)(mb, 0) << 2;
- else
- {
- d = ENCODEMB_INVOKE(rtcd, mberr)(mb, 1) << 2;
- d += ENCODEMB_INVOKE(rtcd, berr)(mb_y2->coeff, x_y2->dqcoeff);
- }
+ d = ENCODEMB_INVOKE(rtcd, mberr)(mb, 1) << 2;
+ d += ENCODEMB_INVOKE(rtcd, berr)(mb_y2->coeff, x_y2->dqcoeff);
*Distortion = (d >> 4);
@@ -2015,40 +1935,6 @@
#endif
}
-
-#if 0
- else
- {
- int rateuseskip;
- int ratenotuseskip;
- int maxdistortion;
- int minrate;
- int skip_rd;
-
- // distortion when no coeff is encoded
- maxdistortion = macro_block_max_error(x);
-
- ratenotuseskip = rate_y + rate_uv + vp8_cost_bit(cpi->prob_skip_false, 0);
- rateuseskip = vp8_cost_bit(cpi->prob_skip_false, 1);
-
- minrate = rateuseskip - ratenotuseskip;
-
- skip_rd = RDFUNC(x->rdmult, x->rddiv, minrate, maxdistortion - distortion2, cpi->target_bits_per_mb);
-
- if (skip_rd + 50 < 0 && x->e_mbd.mbmi.ref_frame != INTRA_FRAME && rate_y + rate_uv < 4000)
- {
- force_no_skip = 1;
- rate2 = rate2 + rateuseskip - ratenotuseskip;
- distortion2 = maxdistortion;
- }
- else
- {
- force_no_skip = 0;
- }
-
- }
-
-#endif
}