Index: source/libvpx/vp9/encoder/vp9_firstpass.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_firstpass.c (revision 240950) |
+++ source/libvpx/vp9/encoder/vp9_firstpass.c (working copy) |
@@ -11,17 +11,16 @@ |
#include <math.h> |
#include <limits.h> |
#include <stdio.h> |
+#include "vp9/common/vp9_systemdependent.h" |
#include "vp9/encoder/vp9_block.h" |
+#include "vp9/encoder/vp9_encodeframe.h" |
+#include "vp9/encoder/vp9_encodemb.h" |
+#include "vp9/encoder/vp9_extend.h" |
+#include "vp9/encoder/vp9_firstpass.h" |
+#include "vp9/encoder/vp9_mcomp.h" |
#include "vp9/encoder/vp9_onyx_int.h" |
#include "vp9/encoder/vp9_variance.h" |
-#include "vp9/encoder/vp9_encodeintra.h" |
-#include "vp9/encoder/vp9_mcomp.h" |
-#include "vp9/encoder/vp9_firstpass.h" |
#include "vpx_scale/vpx_scale.h" |
-#include "vp9/encoder/vp9_encodeframe.h" |
-#include "vp9/encoder/vp9_encodemb.h" |
-#include "vp9/common/vp9_extend.h" |
-#include "vp9/common/vp9_systemdependent.h" |
#include "vpx_mem/vpx_mem.h" |
#include "vpx_scale/yv12config.h" |
#include "vp9/encoder/vp9_quantize.h" |
@@ -77,7 +76,20 @@ |
return ret_val; |
} |
+static int gfboost_qadjust(int qindex) { |
+ const double q = vp9_convert_qindex_to_q(qindex); |
+ return (int)((0.00000828 * q * q * q) + |
+ (-0.0055 * q * q) + |
+ (1.32 * q) + 79.3); |
+} |
+static int kfboost_qadjust(int qindex) { |
+ const double q = vp9_convert_qindex_to_q(qindex); |
+ return (int)((0.00000973 * q * q * q) + |
+ (-0.00613 * q * q) + |
+ (1.316 * q) + 121.2); |
+} |
+ |
// Resets the first pass file to the given position using a relative seek from |
// the current position. |
static void reset_fpf_position(VP9_COMP *cpi, FIRSTPASS_STATS *position) { |
@@ -337,9 +349,11 @@ |
const double max_bits = (1.0 * cpi->twopass.bits_left / |
(cpi->twopass.total_stats.count - cpi->common.current_video_frame)) * |
(cpi->oxcf.two_pass_vbrmax_section / 100.0); |
- |
- // Trap case where we are out of bits. |
- return MAX((int)max_bits, 0); |
+ if (max_bits < 0) |
+ return 0; |
+ if (max_bits >= INT_MAX) |
+ return INT_MAX; |
+ return (int)max_bits; |
} |
void vp9_init_first_pass(VP9_COMP *cpi) { |
@@ -350,36 +364,32 @@ |
output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats); |
} |
-static void zz_motion_search(VP9_COMP *cpi, MACROBLOCK *x, |
- YV12_BUFFER_CONFIG *recon_buffer, |
- int *best_motion_err, int recon_yoffset) { |
+static unsigned int zz_motion_search(VP9_COMP *cpi, MACROBLOCK *x, |
+ YV12_BUFFER_CONFIG *recon_buffer, |
+ int recon_yoffset) { |
MACROBLOCKD *const xd = &x->e_mbd; |
+ const uint8_t *const src = x->plane[0].src.buf; |
+ const int src_stride = x->plane[0].src.stride; |
+ const uint8_t *const ref = xd->plane[0].pre[0].buf |
+ = recon_buffer->y_buffer + recon_yoffset; |
+ const int ref_stride = xd->plane[0].pre[0].stride; |
- // Set up pointers for this macro block recon buffer |
- xd->plane[0].pre[0].buf = recon_buffer->y_buffer + recon_yoffset; |
- |
+ unsigned int sse; |
switch (xd->mi_8x8[0]->mbmi.sb_type) { |
case BLOCK_8X8: |
- vp9_mse8x8(x->plane[0].src.buf, x->plane[0].src.stride, |
- xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, |
- (unsigned int *)(best_motion_err)); |
+ vp9_mse8x8(src, src_stride, ref, ref_stride, &sse); |
break; |
case BLOCK_16X8: |
- vp9_mse16x8(x->plane[0].src.buf, x->plane[0].src.stride, |
- xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, |
- (unsigned int *)(best_motion_err)); |
+ vp9_mse16x8(src, src_stride, ref, ref_stride, &sse); |
break; |
case BLOCK_8X16: |
- vp9_mse8x16(x->plane[0].src.buf, x->plane[0].src.stride, |
- xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, |
- (unsigned int *)(best_motion_err)); |
+ vp9_mse8x16(src, src_stride, ref, ref_stride, &sse); |
break; |
default: |
- vp9_mse16x16(x->plane[0].src.buf, x->plane[0].src.stride, |
- xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride, |
- (unsigned int *)(best_motion_err)); |
+ vp9_mse16x16(src, src_stride, ref, ref_stride, &sse); |
break; |
} |
+ return sse; |
} |
static void first_pass_motion_search(VP9_COMP *cpi, MACROBLOCK *x, |
@@ -396,8 +406,7 @@ |
int step_param = 3; |
int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param; |
int n; |
- vp9_variance_fn_ptr_t v_fn_ptr = |
- cpi->fn_ptr[xd->mi_8x8[0]->mbmi.sb_type]; |
+ vp9_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[xd->mi_8x8[0]->mbmi.sb_type]; |
int new_mv_mode_penalty = 256; |
int sr = 0; |
@@ -407,8 +416,6 @@ |
// for first pass test |
while ((quart_frm << sr) < MAX_FULL_PEL_VAL) |
sr++; |
- if (sr) |
- sr--; |
step_param += sr; |
further_steps -= sr; |
@@ -436,10 +443,11 @@ |
tmp_mv.as_int = 0; |
ref_mv_full.as_mv.col = ref_mv->as_mv.col >> 3; |
ref_mv_full.as_mv.row = ref_mv->as_mv.row >> 3; |
- tmp_err = cpi->diamond_search_sad(x, &ref_mv_full, &tmp_mv, step_param, |
+ tmp_err = cpi->diamond_search_sad(x, &ref_mv_full.as_mv, &tmp_mv.as_mv, |
+ step_param, |
x->sadperbit16, &num00, &v_fn_ptr, |
x->nmvjointcost, |
- x->mvcost, ref_mv); |
+ x->mvcost, &ref_mv->as_mv); |
if (tmp_err < INT_MAX - new_mv_mode_penalty) |
tmp_err += new_mv_mode_penalty; |
@@ -459,11 +467,11 @@ |
if (num00) { |
num00--; |
} else { |
- tmp_err = cpi->diamond_search_sad(x, &ref_mv_full, &tmp_mv, |
+ tmp_err = cpi->diamond_search_sad(x, &ref_mv_full.as_mv, &tmp_mv.as_mv, |
step_param + n, x->sadperbit16, |
&num00, &v_fn_ptr, |
x->nmvjointcost, |
- x->mvcost, ref_mv); |
+ x->mvcost, &ref_mv->as_mv); |
if (tmp_err < INT_MAX - new_mv_mode_penalty) |
tmp_err += new_mv_mode_penalty; |
@@ -482,6 +490,10 @@ |
VP9_COMMON *const cm = &cpi->common; |
MACROBLOCKD *const xd = &x->e_mbd; |
TileInfo tile; |
+ struct macroblock_plane *const p = x->plane; |
+ struct macroblockd_plane *const pd = xd->plane; |
+ PICK_MODE_CONTEXT *ctx = &x->sb64_context; |
+ int i; |
int recon_yoffset, recon_uvoffset; |
const int lst_yv12_idx = cm->ref_frame_map[cpi->lst_fb_idx]; |
@@ -525,6 +537,15 @@ |
vp9_frame_init_quantizer(cpi); |
+ for (i = 0; i < MAX_MB_PLANE; ++i) { |
+ p[i].coeff = ctx->coeff_pbuf[i][1]; |
+ p[i].qcoeff = ctx->qcoeff_pbuf[i][1]; |
+ pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1]; |
+ p[i].eobs = ctx->eobs_pbuf[i][1]; |
+ } |
+ x->skip_recode = 0; |
+ |
+ |
// Initialise the MV cost table to the defaults |
// if( cm->current_video_frame == 0) |
// if ( 0 ) |
@@ -558,10 +579,9 @@ |
int this_error; |
int gf_motion_error = INT_MAX; |
int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row); |
- double error_weight; |
+ double error_weight = 1.0; |
vp9_clear_system_state(); // __asm emms; |
- error_weight = 1.0; // avoid uninitialized warnings |
xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset; |
xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset; |
@@ -584,19 +604,19 @@ |
xd->mi_8x8[0]->mbmi.ref_frame[0] = INTRA_FRAME; |
set_mi_row_col(xd, &tile, |
mb_row << 1, |
- 1 << mi_height_log2(xd->mi_8x8[0]->mbmi.sb_type), |
+ num_8x8_blocks_high_lookup[xd->mi_8x8[0]->mbmi.sb_type], |
mb_col << 1, |
- 1 << mi_width_log2(xd->mi_8x8[0]->mbmi.sb_type), |
+ num_8x8_blocks_wide_lookup[xd->mi_8x8[0]->mbmi.sb_type], |
cm->mi_rows, cm->mi_cols); |
- if (cpi->sf.variance_adaptive_quantization) { |
+ if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |
int energy = vp9_block_energy(cpi, x, xd->mi_8x8[0]->mbmi.sb_type); |
error_weight = vp9_vaq_inv_q_ratio(energy); |
} |
// do intra 16x16 prediction |
this_error = vp9_encode_intra(x, use_dc_pred); |
- if (cpi->sf.variance_adaptive_quantization) { |
+ if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |
vp9_clear_system_state(); // __asm emms; |
this_error *= error_weight; |
} |
@@ -622,11 +642,9 @@ |
// Other than for the first frame do a motion search |
if (cm->current_video_frame > 0) { |
int tmp_err; |
- int motion_error = INT_MAX; |
+ int motion_error = zz_motion_search(cpi, x, lst_yv12, recon_yoffset); |
int_mv mv, tmp_mv; |
- |
// Simple 0,0 motion with no mv overhead |
- zz_motion_search(cpi, x, lst_yv12, &motion_error, recon_yoffset); |
mv.as_int = tmp_mv.as_int = 0; |
// Test last reference frame using the previous best mv as the |
@@ -634,7 +652,7 @@ |
first_pass_motion_search(cpi, x, &best_ref_mv, |
&mv.as_mv, lst_yv12, |
&motion_error, recon_yoffset); |
- if (cpi->sf.variance_adaptive_quantization) { |
+ if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |
vp9_clear_system_state(); // __asm emms; |
motion_error *= error_weight; |
} |
@@ -645,7 +663,7 @@ |
tmp_err = INT_MAX; |
first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv.as_mv, |
lst_yv12, &tmp_err, recon_yoffset); |
- if (cpi->sf.variance_adaptive_quantization) { |
+ if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |
vp9_clear_system_state(); // __asm emms; |
tmp_err *= error_weight; |
} |
@@ -659,13 +677,12 @@ |
// Experimental search in an older reference frame |
if (cm->current_video_frame > 1) { |
// Simple 0,0 motion with no mv overhead |
- zz_motion_search(cpi, x, gld_yv12, |
- &gf_motion_error, recon_yoffset); |
+ gf_motion_error = zz_motion_search(cpi, x, gld_yv12, recon_yoffset); |
first_pass_motion_search(cpi, x, &zero_ref_mv, |
&tmp_mv.as_mv, gld_yv12, |
&gf_motion_error, recon_yoffset); |
- if (cpi->sf.variance_adaptive_quantization) { |
+ if (cpi->oxcf.aq_mode == VARIANCE_AQ) { |
vp9_clear_system_state(); // __asm emms; |
gf_motion_error *= error_weight; |
} |
@@ -699,11 +716,9 @@ |
// very close and very low. This helps with scene cut |
// detection for example in cropped clips with black bars |
// at the sides or top and bottom. |
- if ((((this_error - intrapenalty) * 9) <= |
- (motion_error * 10)) && |
- (this_error < (2 * intrapenalty))) { |
+ if (((this_error - intrapenalty) * 9 <= motion_error * 10) && |
+ this_error < 2 * intrapenalty) |
neutral_count++; |
- } |
mv.as_mv.row *= 8; |
mv.as_mv.col *= 8; |
@@ -712,8 +727,7 @@ |
xd->mi_8x8[0]->mbmi.tx_size = TX_4X4; |
xd->mi_8x8[0]->mbmi.ref_frame[0] = LAST_FRAME; |
xd->mi_8x8[0]->mbmi.ref_frame[1] = NONE; |
- vp9_build_inter_predictors_sby(xd, mb_row << 1, |
- mb_col << 1, |
+ vp9_build_inter_predictors_sby(xd, mb_row << 1, mb_col << 1, |
xd->mi_8x8[0]->mbmi.sb_type); |
vp9_encode_sby(x, xd->mi_8x8[0]->mbmi.sb_type); |
sum_mvr += mv.as_mv.row; |
@@ -916,11 +930,11 @@ |
intra_cost = bitcost(av_intra); |
// Estimate of extra bits per mv overhead for mbs |
- // << 9 is the normalization to the (bits * 512) used in vp9_bits_per_mb |
+ // << 9 is the normalization to the (bits * 512) used in vp9_rc_bits_per_mb |
mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9; |
// Crude estimate of overhead cost from modes |
- // << 9 is the normalization to (bits * 512) used in vp9_bits_per_mb |
+ // << 9 is the normalization to (bits * 512) used in vp9_rc_bits_per_mb |
mode_cost = |
(int)((((av_pct_inter - av_pct_motion) * zz_cost) + |
(av_pct_motion * motion_cost) + |
@@ -956,19 +970,19 @@ |
// (now uses the actual quantizer) but has not been tuned. |
static void adjust_maxq_qrange(VP9_COMP *cpi) { |
int i; |
- // Set the max corresponding to cpi->avg_q * 2.0 |
- double q = cpi->avg_q * 2.0; |
- cpi->twopass.maxq_max_limit = cpi->worst_quality; |
- for (i = cpi->best_quality; i <= cpi->worst_quality; i++) { |
+ // Set the max corresponding to cpi->rc.avg_q * 2.0 |
+ double q = cpi->rc.avg_q * 2.0; |
+ cpi->twopass.maxq_max_limit = cpi->rc.worst_quality; |
+ for (i = cpi->rc.best_quality; i <= cpi->rc.worst_quality; i++) { |
cpi->twopass.maxq_max_limit = i; |
if (vp9_convert_qindex_to_q(i) >= q) |
break; |
} |
- // Set the min corresponding to cpi->avg_q * 0.5 |
- q = cpi->avg_q * 0.5; |
- cpi->twopass.maxq_min_limit = cpi->best_quality; |
- for (i = cpi->worst_quality; i >= cpi->best_quality; i--) { |
+ // Set the min corresponding to cpi->rc.avg_q * 0.5 |
+ q = cpi->rc.avg_q * 0.5; |
+ cpi->twopass.maxq_min_limit = cpi->rc.best_quality; |
+ for (i = cpi->rc.worst_quality; i >= cpi->rc.best_quality; i--) { |
cpi->twopass.maxq_min_limit = i; |
if (vp9_convert_qindex_to_q(i) <= q) |
break; |
@@ -983,10 +997,8 @@ |
int target_norm_bits_per_mb; |
double section_err = fpstats->coded_error / fpstats->count; |
- double sr_correction; |
double err_per_mb = section_err / num_mbs; |
double err_correction_factor; |
- double speed_correction = 1.0; |
if (section_target_bandwitdh <= 0) |
return cpi->twopass.maxq_max_limit; // Highest value allowed |
@@ -995,53 +1007,17 @@ |
? (512 * section_target_bandwitdh) / num_mbs |
: 512 * (section_target_bandwitdh / num_mbs); |
- // Look at the drop in prediction quality between the last frame |
- // and the GF buffer (which contained an older frame). |
- if (fpstats->sr_coded_error > fpstats->coded_error) { |
- double sr_err_diff = (fpstats->sr_coded_error - fpstats->coded_error) / |
- (fpstats->count * cpi->common.MBs); |
- sr_correction = fclamp(pow(sr_err_diff / 32.0, 0.25), 0.75, 1.25); |
- } else { |
- sr_correction = 0.75; |
- } |
- // Calculate a corrective factor based on a rolling ratio of bits spent |
- // vs target bits |
- if (cpi->rolling_target_bits > 0 && |
- cpi->active_worst_quality < cpi->worst_quality) { |
- double rolling_ratio = (double)cpi->rolling_actual_bits / |
- (double)cpi->rolling_target_bits; |
- |
- if (rolling_ratio < 0.95) |
- cpi->twopass.est_max_qcorrection_factor -= 0.005; |
- else if (rolling_ratio > 1.05) |
- cpi->twopass.est_max_qcorrection_factor += 0.005; |
- |
- cpi->twopass.est_max_qcorrection_factor = fclamp( |
- cpi->twopass.est_max_qcorrection_factor, 0.1, 10.0); |
- } |
- |
- // Corrections for higher compression speed settings |
- // (reduced compression expected) |
- // FIXME(jimbankoski): Once we settle on vp9 speed features we need to |
- // change this code. |
- if (cpi->compressor_speed == 1) |
- speed_correction = cpi->oxcf.cpu_used <= 5 ? |
- 1.04 + (/*cpi->oxcf.cpu_used*/0 * 0.04) : |
- 1.25; |
- |
// Try and pick a max Q that will be high enough to encode the |
// content at the given rate. |
for (q = cpi->twopass.maxq_min_limit; q < cpi->twopass.maxq_max_limit; q++) { |
int bits_per_mb_at_this_q; |
err_correction_factor = calc_correction_factor(err_per_mb, |
- ERR_DIVISOR, 0.4, 0.90, q) * |
- sr_correction * speed_correction * |
- cpi->twopass.est_max_qcorrection_factor; |
+ ERR_DIVISOR, 0.4, 0.90, q); |
- bits_per_mb_at_this_q = vp9_bits_per_mb(INTER_FRAME, q, |
- err_correction_factor); |
+ bits_per_mb_at_this_q = vp9_rc_bits_per_mb(INTER_FRAME, q, |
+ err_correction_factor); |
if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) |
break; |
@@ -1052,14 +1028,6 @@ |
q < cpi->cq_target_quality) |
q = cpi->cq_target_quality; |
- // Adjust maxq_min_limit and maxq_max_limit limits based on |
- // average q observed in clip for non kf/gf/arf frames |
- // Give average a chance to settle though. |
- // PGW TODO.. This code is broken for the extended Q range |
- if (cpi->ni_frames > ((int)cpi->twopass.total_stats.count >> 8) && |
- cpi->ni_frames > 25) |
- adjust_maxq_qrange(cpi); |
- |
return q; |
} |
@@ -1075,9 +1043,6 @@ |
double section_err = (fpstats->coded_error / fpstats->count); |
double err_per_mb = section_err / num_mbs; |
double err_correction_factor; |
- double sr_err_diff; |
- double sr_correction; |
- double speed_correction = 1.0; |
double clip_iiratio; |
double clip_iifactor; |
@@ -1086,31 +1051,6 @@ |
: 512 * (section_target_bandwitdh / num_mbs); |
- // Corrections for higher compression speed settings |
- // (reduced compression expected) |
- if (cpi->compressor_speed == 1) { |
- if (cpi->oxcf.cpu_used <= 5) |
- speed_correction = 1.04 + (/*cpi->oxcf.cpu_used*/ 0 * 0.04); |
- else |
- speed_correction = 1.25; |
- } |
- |
- // Look at the drop in prediction quality between the last frame |
- // and the GF buffer (which contained an older frame). |
- if (fpstats->sr_coded_error > fpstats->coded_error) { |
- sr_err_diff = |
- (fpstats->sr_coded_error - fpstats->coded_error) / |
- (fpstats->count * cpi->common.MBs); |
- sr_correction = (sr_err_diff / 32.0); |
- sr_correction = pow(sr_correction, 0.25); |
- if (sr_correction < 0.75) |
- sr_correction = 0.75; |
- else if (sr_correction > 1.25) |
- sr_correction = 1.25; |
- } else { |
- sr_correction = 0.75; |
- } |
- |
// II ratio correction factor for clip as a whole |
clip_iiratio = cpi->twopass.total_stats.intra_error / |
DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.coded_error); |
@@ -1124,11 +1064,10 @@ |
// Error per MB based correction factor |
err_correction_factor = |
- calc_correction_factor(err_per_mb, 100.0, 0.4, 0.90, q) * |
- sr_correction * speed_correction * clip_iifactor; |
+ calc_correction_factor(err_per_mb, 100.0, 0.4, 0.90, q) * clip_iifactor; |
bits_per_mb_at_this_q = |
- vp9_bits_per_mb(INTER_FRAME, q, err_correction_factor); |
+ vp9_rc_bits_per_mb(INTER_FRAME, q, err_correction_factor); |
if (bits_per_mb_at_this_q <= target_norm_bits_per_mb) |
break; |
@@ -1136,10 +1075,10 @@ |
// Clip value to range "best allowed to (worst allowed - 1)" |
q = select_cq_level(q); |
- if (q >= cpi->worst_quality) |
- q = cpi->worst_quality - 1; |
- if (q < cpi->best_quality) |
- q = cpi->best_quality; |
+ if (q >= cpi->rc.worst_quality) |
+ q = cpi->rc.worst_quality - 1; |
+ if (q < cpi->rc.best_quality) |
+ q = cpi->rc.best_quality; |
return q; |
} |
@@ -1589,13 +1528,13 @@ |
if (cpi->twopass.frames_to_key <= (FIXED_ARF_GROUP_SIZE + 8)) { |
// Setup a GF group close to the keyframe. |
cpi->source_alt_ref_pending = 0; |
- cpi->baseline_gf_interval = cpi->twopass.frames_to_key; |
- schedule_frames(cpi, 0, (cpi->baseline_gf_interval - 1), 2, 0, 0); |
+ cpi->rc.baseline_gf_interval = cpi->twopass.frames_to_key; |
+ schedule_frames(cpi, 0, (cpi->rc.baseline_gf_interval - 1), 2, 0, 0); |
} else { |
// Setup a fixed period ARF group. |
cpi->source_alt_ref_pending = 1; |
- cpi->baseline_gf_interval = FIXED_ARF_GROUP_SIZE; |
- schedule_frames(cpi, 0, -(cpi->baseline_gf_interval - 1), 2, 1, 0); |
+ cpi->rc.baseline_gf_interval = FIXED_ARF_GROUP_SIZE; |
+ schedule_frames(cpi, 0, -(cpi->rc.baseline_gf_interval - 1), 2, 1, 0); |
} |
// Replace level indicator of -1 with correct level. |
@@ -1692,10 +1631,10 @@ |
// At high Q when there are few bits to spare we are better with a longer |
// interval to spread the cost of the GF. |
active_max_gf_interval = |
- 12 + ((int)vp9_convert_qindex_to_q(cpi->active_worst_quality) >> 5); |
+ 12 + ((int)vp9_convert_qindex_to_q(cpi->rc.active_worst_quality) >> 5); |
- if (active_max_gf_interval > cpi->max_gf_interval) |
- active_max_gf_interval = cpi->max_gf_interval; |
+ if (active_max_gf_interval > cpi->rc.max_gf_interval) |
+ active_max_gf_interval = cpi->rc.max_gf_interval; |
i = 0; |
while (((i < cpi->twopass.static_scene_max_gf_interval) || |
@@ -1789,7 +1728,7 @@ |
} |
// Set the interval until the next gf or arf. |
- cpi->baseline_gf_interval = i; |
+ cpi->rc.baseline_gf_interval = i; |
#if CONFIG_MULTIPLE_ARF |
if (cpi->multi_arf_enabled) { |
@@ -1815,24 +1754,25 @@ |
(mv_in_out_accumulator > -2.0)) && |
(boost_score > 100)) { |
// Alternative boost calculation for alt ref |
- cpi->gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost, |
+ cpi->rc.gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost, |
&b_boost); |
cpi->source_alt_ref_pending = 1; |
#if CONFIG_MULTIPLE_ARF |
// Set the ARF schedule. |
if (cpi->multi_arf_enabled) { |
- schedule_frames(cpi, 0, -(cpi->baseline_gf_interval - 1), 2, 1, 0); |
+ schedule_frames(cpi, 0, -(cpi->rc.baseline_gf_interval - 1), 2, 1, 0); |
} |
#endif |
} else { |
- cpi->gfu_boost = (int)boost_score; |
+ cpi->rc.gfu_boost = (int)boost_score; |
cpi->source_alt_ref_pending = 0; |
#if CONFIG_MULTIPLE_ARF |
// Set the GF schedule. |
if (cpi->multi_arf_enabled) { |
- schedule_frames(cpi, 0, cpi->baseline_gf_interval - 1, 2, 0, 0); |
- assert(cpi->new_frame_coding_order_period == cpi->baseline_gf_interval); |
+ schedule_frames(cpi, 0, cpi->rc.baseline_gf_interval - 1, 2, 0, 0); |
+ assert(cpi->new_frame_coding_order_period == |
+ cpi->rc.baseline_gf_interval); |
} |
#endif |
} |
@@ -1905,8 +1845,9 @@ |
// Clip cpi->twopass.gf_group_bits based on user supplied data rate |
// variability limit (cpi->oxcf.two_pass_vbrmax_section) |
if (cpi->twopass.gf_group_bits > |
- (int64_t)max_bits * cpi->baseline_gf_interval) |
- cpi->twopass.gf_group_bits = (int64_t)max_bits * cpi->baseline_gf_interval; |
+ (int64_t)max_bits * cpi->rc.baseline_gf_interval) |
+ cpi->twopass.gf_group_bits = |
+ (int64_t)max_bits * cpi->rc.baseline_gf_interval; |
// Reset the file position |
reset_fpf_position(cpi, start_pos); |
@@ -1919,19 +1860,18 @@ |
i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); |
++i) { |
int allocation_chunks; |
- int q = cpi->oxcf.fixed_q < 0 ? cpi->last_q[INTER_FRAME] |
- : cpi->oxcf.fixed_q; |
+ int q = cpi->rc.last_q[INTER_FRAME]; |
int gf_bits; |
- int boost = (cpi->gfu_boost * vp9_gfboost_qadjust(q)) / 100; |
+ int boost = (cpi->rc.gfu_boost * gfboost_qadjust(q)) / 100; |
// Set max and minimum boost and hence minimum allocation |
- boost = clamp(boost, 125, (cpi->baseline_gf_interval + 1) * 200); |
+ boost = clamp(boost, 125, (cpi->rc.baseline_gf_interval + 1) * 200); |
if (cpi->source_alt_ref_pending && i == 0) |
- allocation_chunks = ((cpi->baseline_gf_interval + 1) * 100) + boost; |
+ allocation_chunks = ((cpi->rc.baseline_gf_interval + 1) * 100) + boost; |
else |
- allocation_chunks = (cpi->baseline_gf_interval * 100) + (boost - 100); |
+ allocation_chunks = (cpi->rc.baseline_gf_interval * 100) + (boost - 100); |
// Prevent overflow |
if (boost > 1023) { |
@@ -1948,10 +1888,10 @@ |
// If the frame that is to be boosted is simpler than the average for |
// the gf/arf group then use an alternative calculation |
// based on the error score of the frame itself |
- if (mod_frame_err < gf_group_err / (double)cpi->baseline_gf_interval) { |
+ if (mod_frame_err < gf_group_err / (double)cpi->rc.baseline_gf_interval) { |
double alt_gf_grp_bits = |
(double)cpi->twopass.kf_group_bits * |
- (mod_frame_err * (double)cpi->baseline_gf_interval) / |
+ (mod_frame_err * (double)cpi->rc.baseline_gf_interval) / |
DOUBLE_DIVIDE_CHECK(cpi->twopass.kf_group_error_left); |
int alt_gf_bits = (int)((double)boost * (alt_gf_grp_bits / |
@@ -1976,7 +1916,7 @@ |
gf_bits = 0; |
// Add in minimum for a frame |
- gf_bits += cpi->min_frame_bandwidth; |
+ gf_bits += cpi->rc.min_frame_bandwidth; |
if (i == 0) { |
cpi->twopass.gf_bits = gf_bits; |
@@ -1984,7 +1924,7 @@ |
if (i == 1 || (!cpi->source_alt_ref_pending |
&& (cpi->common.frame_type != KEY_FRAME))) { |
// Per frame bit target for this frame |
- cpi->per_frame_bandwidth = gf_bits; |
+ cpi->rc.per_frame_bandwidth = gf_bits; |
} |
} |
@@ -2007,7 +1947,7 @@ |
cpi->twopass.gf_group_error_left = (int64_t)gf_group_err; |
cpi->twopass.gf_group_bits -= cpi->twopass.gf_bits |
- - cpi->min_frame_bandwidth; |
+ - cpi->rc.min_frame_bandwidth; |
if (cpi->twopass.gf_group_bits < 0) |
cpi->twopass.gf_group_bits = 0; |
@@ -2015,8 +1955,9 @@ |
// This condition could fail if there are two kfs very close together |
// despite (MIN_GF_INTERVAL) and would cause a divide by 0 in the |
// calculation of alt_extra_bits. |
- if (cpi->baseline_gf_interval >= 3) { |
- const int boost = cpi->source_alt_ref_pending ? b_boost : cpi->gfu_boost; |
+ if (cpi->rc.baseline_gf_interval >= 3) { |
+ const int boost = cpi->source_alt_ref_pending ? |
+ b_boost : cpi->rc.gfu_boost; |
if (boost >= 150) { |
int alt_extra_bits; |
@@ -2035,7 +1976,7 @@ |
zero_stats(§ionstats); |
reset_fpf_position(cpi, start_pos); |
- for (i = 0; i < cpi->baseline_gf_interval; i++) { |
+ for (i = 0; i < cpi->rc.baseline_gf_interval; i++) { |
input_stats(cpi, &next_frame); |
accumulate_stats(§ionstats, &next_frame); |
} |
@@ -2092,10 +2033,10 @@ |
cpi->twopass.gf_group_bits = 0; |
// Add in the minimum number of bits that is set aside for every frame. |
- target_frame_size += cpi->min_frame_bandwidth; |
+ target_frame_size += cpi->rc.min_frame_bandwidth; |
// Per frame bit target for this frame. |
- cpi->per_frame_bandwidth = target_frame_size; |
+ cpi->rc.per_frame_bandwidth = target_frame_size; |
} |
// Make a damped adjustment to the active max q. |
@@ -2135,74 +2076,29 @@ |
vp9_clear_system_state(); |
if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) { |
- cpi->active_worst_quality = cpi->oxcf.cq_level; |
- } else { |
+ cpi->rc.active_worst_quality = cpi->oxcf.cq_level; |
+ } else if (cpi->common.current_video_frame == 0) { |
// Special case code for first frame. |
- if (cpi->common.current_video_frame == 0) { |
- int section_target_bandwidth = |
- (int)(cpi->twopass.bits_left / frames_left); |
- cpi->twopass.est_max_qcorrection_factor = 1.0; |
+ int section_target_bandwidth = |
+ (int)(cpi->twopass.bits_left / frames_left); |
- // Set a cq_level in constrained quality mode. |
- // Commenting this code out for now since it does not seem to be |
- // working well. |
- /* |
- if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) { |
- int est_cq = estimate_cq(cpi, &cpi->twopass.total_left_stats, |
- section_target_bandwidth); |
+ // guess at maxq needed in 2nd pass |
+ cpi->twopass.maxq_max_limit = cpi->rc.worst_quality; |
+ cpi->twopass.maxq_min_limit = cpi->rc.best_quality; |
- if (est_cq > cpi->cq_target_quality) |
- cpi->cq_target_quality = est_cq; |
- else |
- cpi->cq_target_quality = cpi->oxcf.cq_level; |
- } |
- */ |
+ tmp_q = estimate_max_q(cpi, &cpi->twopass.total_left_stats, |
+ section_target_bandwidth); |
- // guess at maxq needed in 2nd pass |
- cpi->twopass.maxq_max_limit = cpi->worst_quality; |
- cpi->twopass.maxq_min_limit = cpi->best_quality; |
+ cpi->rc.active_worst_quality = tmp_q; |
+ cpi->rc.ni_av_qi = tmp_q; |
+ cpi->rc.avg_q = vp9_convert_qindex_to_q(tmp_q); |
- tmp_q = estimate_max_q(cpi, &cpi->twopass.total_left_stats, |
- section_target_bandwidth); |
- |
- cpi->active_worst_quality = tmp_q; |
- cpi->ni_av_qi = tmp_q; |
- cpi->avg_q = vp9_convert_qindex_to_q(tmp_q); |
- |
-#ifndef ONE_SHOT_Q_ESTIMATE |
- // Limit the maxq value returned subsequently. |
- // This increases the risk of overspend or underspend if the initial |
- // estimate for the clip is bad, but helps prevent excessive |
- // variation in Q, especially near the end of a clip |
- // where for example a small overspend may cause Q to crash |
- adjust_maxq_qrange(cpi); |
-#endif |
- } |
- |
-#ifndef ONE_SHOT_Q_ESTIMATE |
- // The last few frames of a clip almost always have to few or too many |
- // bits and for the sake of over exact rate control we dont want to make |
- // radical adjustments to the allowed quantizer range just to use up a |
- // few surplus bits or get beneath the target rate. |
- else if ((cpi->common.current_video_frame < |
- (((unsigned int)cpi->twopass.total_stats.count * 255) >> 8)) && |
- ((cpi->common.current_video_frame + cpi->baseline_gf_interval) < |
- (unsigned int)cpi->twopass.total_stats.count)) { |
- int section_target_bandwidth = |
- (int)(cpi->twopass.bits_left / frames_left); |
- if (frames_left < 1) |
- frames_left = 1; |
- |
- tmp_q = estimate_max_q( |
- cpi, |
- &cpi->twopass.total_left_stats, |
- section_target_bandwidth); |
- |
- // Make a damped adjustment to active max Q |
- cpi->active_worst_quality = |
- adjust_active_maxq(cpi->active_worst_quality, tmp_q); |
- } |
-#endif |
+ // Limit the maxq value returned subsequently. |
+ // This increases the risk of overspend or underspend if the initial |
+ // estimate for the clip is bad, but helps prevent excessive |
+ // variation in Q, especially near the end of a clip |
+ // where for example a small overspend may cause Q to crash |
+ adjust_maxq_qrange(cpi); |
} |
vp9_zero(this_frame); |
if (EOF == input_stats(cpi, &this_frame)) |
@@ -2219,7 +2115,7 @@ |
} |
// Is this a GF / ARF (Note that a KF is always also a GF) |
- if (cpi->frames_till_gf_update_due == 0) { |
+ if (cpi->rc.frames_till_gf_update_due == 0) { |
// Define next gf group and assign bits to it |
this_frame_copy = this_frame; |
@@ -2253,10 +2149,10 @@ |
if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)) { |
// Assign a standard frames worth of bits from those allocated |
// to the GF group |
- int bak = cpi->per_frame_bandwidth; |
+ int bak = cpi->rc.per_frame_bandwidth; |
this_frame_copy = this_frame; |
assign_std_frame_bits(cpi, &this_frame_copy); |
- cpi->per_frame_bandwidth = bak; |
+ cpi->rc.per_frame_bandwidth = bak; |
} |
} else { |
// Otherwise this is an ordinary frame |
@@ -2277,7 +2173,7 @@ |
} |
// Set nominal per second bandwidth for this frame |
- cpi->target_bandwidth = (int)(cpi->per_frame_bandwidth |
+ cpi->target_bandwidth = (int)(cpi->rc.per_frame_bandwidth |
* cpi->output_framerate); |
if (cpi->target_bandwidth < 0) |
cpi->target_bandwidth = 0; |
@@ -2410,7 +2306,7 @@ |
cpi->source_alt_ref_active = 0; |
// Kf is always a gf so clear frames till next gf counter |
- cpi->frames_till_gf_update_due = 0; |
+ cpi->rc.frames_till_gf_update_due = 0; |
cpi->twopass.frames_to_key = 1; |
@@ -2573,7 +2469,7 @@ |
} |
// For the first few frames collect data to decide kf boost. |
- if (i <= (cpi->max_gf_interval * 2)) { |
+ if (i <= (cpi->rc.max_gf_interval * 2)) { |
if (next_frame.intra_error > cpi->twopass.kf_intra_err_min) |
r = (IIKFACTOR2 * next_frame.intra_error / |
DOUBLE_DIVIDE_CHECK(next_frame.coded_error)); |
@@ -2631,7 +2527,7 @@ |
// Make a note of baseline boost and the zero motion |
// accumulator value for use elsewhere. |
- cpi->kf_boost = kf_boost; |
+ cpi->rc.kf_boost = kf_boost; |
cpi->kf_zeromotion_pct = (int)(zero_motion_accumulator * 100.0); |
// We do three calculations for kf size. |
@@ -2701,10 +2597,10 @@ |
cpi->twopass.kf_group_bits -= cpi->twopass.kf_bits; |
// Add in the minimum frame allowance |
- cpi->twopass.kf_bits += cpi->min_frame_bandwidth; |
+ cpi->twopass.kf_bits += cpi->rc.min_frame_bandwidth; |
// Peer frame bit target for this frame |
- cpi->per_frame_bandwidth = cpi->twopass.kf_bits; |
+ cpi->rc.per_frame_bandwidth = cpi->twopass.kf_bits; |
// Convert to a per second bitrate |
cpi->target_bandwidth = (int)(cpi->twopass.kf_bits * |
cpi->output_framerate); |
@@ -2718,3 +2614,21 @@ |
// sizes. |
cpi->twopass.modified_error_left -= kf_group_err; |
} |
+ |
+void vp9_twopass_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) { |
+#ifdef DISABLE_RC_LONG_TERM_MEM |
+ cpi->twopass.bits_left -= cpi->rc.this_frame_target; |
+#else |
+ cpi->twopass.bits_left -= 8 * bytes_used; |
+#endif |
+ if (!cpi->refresh_alt_ref_frame) { |
+ double lower_bounds_min_rate = FRAME_OVERHEAD_BITS * cpi->oxcf.framerate; |
+ double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * |
+ cpi->oxcf.two_pass_vbrmin_section |
+ / 100); |
+ if (two_pass_min_rate < lower_bounds_min_rate) |
+ two_pass_min_rate = lower_bounds_min_rate; |
+ cpi->twopass.bits_left += (int64_t)(two_pass_min_rate / |
+ cpi->oxcf.framerate); |
+ } |
+} |