michael@0: /* michael@0: * Copyright (c) 2010 The WebM project authors. All Rights Reserved. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license michael@0: * that can be found in the LICENSE file in the root of the source michael@0: * tree. An additional intellectual property rights grant can be found michael@0: * in the file PATENTS. All contributing project authors may michael@0: * be found in the AUTHORS file in the root of the source tree. michael@0: */ michael@0: michael@0: michael@0: #include michael@0: #include michael@0: #include michael@0: #include michael@0: #include michael@0: #include michael@0: michael@0: #include "vp9/common/vp9_alloccommon.h" michael@0: #include "vp9/common/vp9_common.h" michael@0: #include "vp9/encoder/vp9_ratectrl.h" michael@0: #include "vp9/common/vp9_entropymode.h" michael@0: #include "vpx_mem/vpx_mem.h" michael@0: #include "vp9/common/vp9_systemdependent.h" michael@0: #include "vp9/encoder/vp9_encodemv.h" michael@0: #include "vp9/common/vp9_quant_common.h" michael@0: #include "vp9/common/vp9_seg_common.h" michael@0: michael@0: #define MIN_BPB_FACTOR 0.005 michael@0: #define MAX_BPB_FACTOR 50 michael@0: michael@0: // Bits Per MB at different Q (Multiplied by 512) michael@0: #define BPER_MB_NORMBITS 9 michael@0: michael@0: static const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = michael@0: { 1, 2, 3, 4, 5 }; michael@0: michael@0: // These functions use formulaic calculations to make playing with the michael@0: // quantizer tables easier. If necessary they can be replaced by lookup michael@0: // tables if and when things settle down in the experimental bitstream michael@0: double vp9_convert_qindex_to_q(int qindex) { michael@0: // Convert the index to a real Q value (scaled down to match old Q values) michael@0: return vp9_ac_quant(qindex, 0) / 4.0; michael@0: } michael@0: michael@0: int vp9_gfboost_qadjust(int qindex) { michael@0: const double q = vp9_convert_qindex_to_q(qindex); michael@0: return (int)((0.00000828 * q * q * q) + michael@0: (-0.0055 * q * q) + michael@0: (1.32 * q) + 79.3); michael@0: } michael@0: michael@0: static int kfboost_qadjust(int qindex) { michael@0: const double q = vp9_convert_qindex_to_q(qindex); michael@0: return (int)((0.00000973 * q * q * q) + michael@0: (-0.00613 * q * q) + michael@0: (1.316 * q) + 121.2); michael@0: } michael@0: michael@0: int vp9_bits_per_mb(FRAME_TYPE frame_type, int qindex, michael@0: double correction_factor) { michael@0: const double q = vp9_convert_qindex_to_q(qindex); michael@0: int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000; michael@0: michael@0: // q based adjustment to baseline enumerator michael@0: enumerator += (int)(enumerator * q) >> 12; michael@0: return (int)(0.5 + (enumerator * correction_factor / q)); michael@0: } michael@0: michael@0: void vp9_save_coding_context(VP9_COMP *cpi) { michael@0: CODING_CONTEXT *const cc = &cpi->coding_context; michael@0: VP9_COMMON *cm = &cpi->common; michael@0: michael@0: // Stores a snapshot of key state variables which can subsequently be michael@0: // restored with a call to vp9_restore_coding_context. These functions are michael@0: // intended for use in a re-code loop in vp9_compress_frame where the michael@0: // quantizer value is adjusted between loop iterations. michael@0: vp9_copy(cc->nmvjointcost, cpi->mb.nmvjointcost); michael@0: vp9_copy(cc->nmvcosts, cpi->mb.nmvcosts); michael@0: vp9_copy(cc->nmvcosts_hp, cpi->mb.nmvcosts_hp); michael@0: michael@0: vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs); michael@0: michael@0: vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy, michael@0: cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols)); michael@0: michael@0: vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas); michael@0: vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas); michael@0: michael@0: cc->fc = cm->fc; michael@0: } michael@0: michael@0: void vp9_restore_coding_context(VP9_COMP *cpi) { michael@0: CODING_CONTEXT *const cc = &cpi->coding_context; michael@0: VP9_COMMON *cm = &cpi->common; michael@0: michael@0: // Restore key state variables to the snapshot state stored in the michael@0: // previous call to vp9_save_coding_context. michael@0: vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost); michael@0: vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts); michael@0: vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp); michael@0: michael@0: vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs); michael@0: michael@0: vpx_memcpy(cm->last_frame_seg_map, michael@0: cpi->coding_context.last_frame_seg_map_copy, michael@0: (cm->mi_rows * cm->mi_cols)); michael@0: michael@0: vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas); michael@0: vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas); michael@0: michael@0: cm->fc = cc->fc; michael@0: } michael@0: michael@0: void vp9_setup_key_frame(VP9_COMP *cpi) { michael@0: VP9_COMMON *cm = &cpi->common; michael@0: michael@0: vp9_setup_past_independence(cm); michael@0: michael@0: // interval before next GF michael@0: cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; michael@0: /* All buffers are implicitly updated on key frames. */ michael@0: cpi->refresh_golden_frame = 1; michael@0: cpi->refresh_alt_ref_frame = 1; michael@0: } michael@0: michael@0: void vp9_setup_inter_frame(VP9_COMP *cpi) { michael@0: VP9_COMMON *cm = &cpi->common; michael@0: if (cm->error_resilient_mode || cm->intra_only) michael@0: vp9_setup_past_independence(cm); michael@0: michael@0: assert(cm->frame_context_idx < NUM_FRAME_CONTEXTS); michael@0: cm->fc = cm->frame_contexts[cm->frame_context_idx]; michael@0: } michael@0: michael@0: static int estimate_bits_at_q(int frame_kind, int q, int mbs, michael@0: double correction_factor) { michael@0: const int bpm = (int)(vp9_bits_per_mb(frame_kind, q, correction_factor)); michael@0: michael@0: // Attempt to retain reasonable accuracy without overflow. The cutoff is michael@0: // chosen such that the maximum product of Bpm and MBs fits 31 bits. The michael@0: // largest Bpm takes 20 bits. michael@0: return (mbs > (1 << 11)) ? (bpm >> BPER_MB_NORMBITS) * mbs michael@0: : (bpm * mbs) >> BPER_MB_NORMBITS; michael@0: } michael@0: michael@0: michael@0: static void calc_iframe_target_size(VP9_COMP *cpi) { michael@0: // boost defaults to half second michael@0: int target; michael@0: michael@0: // Clear down mmx registers to allow floating point in what follows michael@0: vp9_clear_system_state(); // __asm emms; michael@0: michael@0: // New Two pass RC michael@0: target = cpi->per_frame_bandwidth; michael@0: michael@0: if (cpi->oxcf.rc_max_intra_bitrate_pct) { michael@0: int max_rate = cpi->per_frame_bandwidth michael@0: * cpi->oxcf.rc_max_intra_bitrate_pct / 100; michael@0: michael@0: if (target > max_rate) michael@0: target = max_rate; michael@0: } michael@0: michael@0: cpi->this_frame_target = target; michael@0: } michael@0: michael@0: michael@0: // Do the best we can to define the parameters for the next GF based michael@0: // on what information we have available. michael@0: // michael@0: // In this experimental code only two pass is supported michael@0: // so we just use the interval determined in the two pass code. michael@0: static void calc_gf_params(VP9_COMP *cpi) { michael@0: // Set the gf interval michael@0: cpi->frames_till_gf_update_due = cpi->baseline_gf_interval; michael@0: } michael@0: michael@0: michael@0: static void calc_pframe_target_size(VP9_COMP *cpi) { michael@0: const int min_frame_target = MAX(cpi->min_frame_bandwidth, michael@0: cpi->av_per_frame_bandwidth >> 5); michael@0: if (cpi->refresh_alt_ref_frame) { michael@0: // Special alt reference frame case michael@0: // Per frame bit target for the alt ref frame michael@0: cpi->per_frame_bandwidth = cpi->twopass.gf_bits; michael@0: cpi->this_frame_target = cpi->per_frame_bandwidth; michael@0: } else { michael@0: // Normal frames (gf,and inter) michael@0: cpi->this_frame_target = cpi->per_frame_bandwidth; michael@0: } michael@0: michael@0: // Check that the total sum of adjustments is not above the maximum allowed. michael@0: // That is, having allowed for the KF and GF penalties, we have not pushed michael@0: // the current inter-frame target too low. If the adjustment we apply here is michael@0: // not capable of recovering all the extra bits we have spent in the KF or GF, michael@0: // then the remainder will have to be recovered over a longer time span via michael@0: // other buffer / rate control mechanisms. michael@0: if (cpi->this_frame_target < min_frame_target) michael@0: cpi->this_frame_target = min_frame_target; michael@0: michael@0: if (!cpi->refresh_alt_ref_frame) michael@0: // Note the baseline target data rate for this inter frame. michael@0: cpi->inter_frame_target = cpi->this_frame_target; michael@0: michael@0: // Adjust target frame size for Golden Frames: michael@0: if (cpi->frames_till_gf_update_due == 0) { michael@0: const int q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] michael@0: : cpi->oxcf.fixed_q; michael@0: michael@0: cpi->refresh_golden_frame = 1; michael@0: michael@0: calc_gf_params(cpi); michael@0: michael@0: // If we are using alternate ref instead of gf then do not apply the boost michael@0: // It will instead be applied to the altref update michael@0: // Jims modified boost michael@0: if (!cpi->source_alt_ref_active) { michael@0: if (cpi->oxcf.fixed_q < 0) { michael@0: // The spend on the GF is defined in the two pass code michael@0: // for two pass encodes michael@0: cpi->this_frame_target = cpi->per_frame_bandwidth; michael@0: } else { michael@0: cpi->this_frame_target = michael@0: (estimate_bits_at_q(1, q, cpi->common.MBs, 1.0) michael@0: * cpi->last_boost) / 100; michael@0: } michael@0: } else { michael@0: // If there is an active ARF at this location use the minimum michael@0: // bits on this frame even if it is a constructed arf. michael@0: // The active maximum quantizer insures that an appropriate michael@0: // number of bits will be spent if needed for constructed ARFs. michael@0: cpi->this_frame_target = 0; michael@0: } michael@0: } michael@0: } michael@0: michael@0: michael@0: void vp9_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) { michael@0: const int q = cpi->common.base_qindex; michael@0: int correction_factor = 100; michael@0: double rate_correction_factor; michael@0: double adjustment_limit; michael@0: michael@0: int projected_size_based_on_q = 0; michael@0: michael@0: // Clear down mmx registers to allow floating point in what follows michael@0: vp9_clear_system_state(); // __asm emms; michael@0: michael@0: if (cpi->common.frame_type == KEY_FRAME) { michael@0: rate_correction_factor = cpi->key_frame_rate_correction_factor; michael@0: } else { michael@0: if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) michael@0: rate_correction_factor = cpi->gf_rate_correction_factor; michael@0: else michael@0: rate_correction_factor = cpi->rate_correction_factor; michael@0: } michael@0: michael@0: // Work out how big we would have expected the frame to be at this Q given michael@0: // the current correction factor. michael@0: // Stay in double to avoid int overflow when values are large michael@0: projected_size_based_on_q = estimate_bits_at_q(cpi->common.frame_type, q, michael@0: cpi->common.MBs, michael@0: rate_correction_factor); michael@0: michael@0: // Work out a size correction factor. michael@0: if (projected_size_based_on_q > 0) michael@0: correction_factor = michael@0: (100 * cpi->projected_frame_size) / projected_size_based_on_q; michael@0: michael@0: // More heavily damped adjustment used if we have been oscillating either side michael@0: // of target. michael@0: switch (damp_var) { michael@0: case 0: michael@0: adjustment_limit = 0.75; michael@0: break; michael@0: case 1: michael@0: adjustment_limit = 0.375; michael@0: break; michael@0: case 2: michael@0: default: michael@0: adjustment_limit = 0.25; michael@0: break; michael@0: } michael@0: michael@0: // if ( (correction_factor > 102) && (Q < cpi->active_worst_quality) ) michael@0: if (correction_factor > 102) { michael@0: // We are not already at the worst allowable quality michael@0: correction_factor = michael@0: (int)(100 + ((correction_factor - 100) * adjustment_limit)); michael@0: rate_correction_factor = michael@0: ((rate_correction_factor * correction_factor) / 100); michael@0: michael@0: // Keep rate_correction_factor within limits michael@0: if (rate_correction_factor > MAX_BPB_FACTOR) michael@0: rate_correction_factor = MAX_BPB_FACTOR; michael@0: } else if (correction_factor < 99) { michael@0: // We are not already at the best allowable quality michael@0: correction_factor = michael@0: (int)(100 - ((100 - correction_factor) * adjustment_limit)); michael@0: rate_correction_factor = michael@0: ((rate_correction_factor * correction_factor) / 100); michael@0: michael@0: // Keep rate_correction_factor within limits michael@0: if (rate_correction_factor < MIN_BPB_FACTOR) michael@0: rate_correction_factor = MIN_BPB_FACTOR; michael@0: } michael@0: michael@0: if (cpi->common.frame_type == KEY_FRAME) { michael@0: cpi->key_frame_rate_correction_factor = rate_correction_factor; michael@0: } else { michael@0: if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) michael@0: cpi->gf_rate_correction_factor = rate_correction_factor; michael@0: else michael@0: cpi->rate_correction_factor = rate_correction_factor; michael@0: } michael@0: } michael@0: michael@0: michael@0: int vp9_regulate_q(VP9_COMP *cpi, int target_bits_per_frame) { michael@0: int q = cpi->active_worst_quality; michael@0: michael@0: int i; michael@0: int last_error = INT_MAX; michael@0: int target_bits_per_mb; michael@0: int bits_per_mb_at_this_q; michael@0: double correction_factor; michael@0: michael@0: // Select the appropriate correction factor based upon type of frame. michael@0: if (cpi->common.frame_type == KEY_FRAME) { michael@0: correction_factor = cpi->key_frame_rate_correction_factor; michael@0: } else { michael@0: if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) michael@0: correction_factor = cpi->gf_rate_correction_factor; michael@0: else michael@0: correction_factor = cpi->rate_correction_factor; michael@0: } michael@0: michael@0: // Calculate required scaling factor based on target frame size and size of michael@0: // frame produced using previous Q. michael@0: if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS)) michael@0: target_bits_per_mb = michael@0: (target_bits_per_frame / cpi->common.MBs) michael@0: << BPER_MB_NORMBITS; // Case where we would overflow int michael@0: else michael@0: target_bits_per_mb = michael@0: (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs; michael@0: michael@0: i = cpi->active_best_quality; michael@0: michael@0: do { michael@0: bits_per_mb_at_this_q = (int)vp9_bits_per_mb(cpi->common.frame_type, i, michael@0: correction_factor); michael@0: michael@0: if (bits_per_mb_at_this_q <= target_bits_per_mb) { michael@0: if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error) michael@0: q = i; michael@0: else michael@0: q = i - 1; michael@0: michael@0: break; michael@0: } else { michael@0: last_error = bits_per_mb_at_this_q - target_bits_per_mb; michael@0: } michael@0: } while (++i <= cpi->active_worst_quality); michael@0: michael@0: return q; michael@0: } michael@0: michael@0: michael@0: static int estimate_keyframe_frequency(VP9_COMP *cpi) { michael@0: int i; michael@0: michael@0: // Average key frame frequency michael@0: int av_key_frame_frequency = 0; michael@0: michael@0: /* First key frame at start of sequence is a special case. We have no michael@0: * frequency data. michael@0: */ michael@0: if (cpi->key_frame_count == 1) { michael@0: /* Assume a default of 1 kf every 2 seconds, or the max kf interval, michael@0: * whichever is smaller. michael@0: */ michael@0: int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1; michael@0: av_key_frame_frequency = (int)cpi->output_framerate * 2; michael@0: michael@0: if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq) michael@0: av_key_frame_frequency = cpi->oxcf.key_freq; michael@0: michael@0: cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1] michael@0: = av_key_frame_frequency; michael@0: } else { michael@0: unsigned int total_weight = 0; michael@0: int last_kf_interval = michael@0: (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1; michael@0: michael@0: /* reset keyframe context and calculate weighted average of last michael@0: * KEY_FRAME_CONTEXT keyframes michael@0: */ michael@0: for (i = 0; i < KEY_FRAME_CONTEXT; i++) { michael@0: if (i < KEY_FRAME_CONTEXT - 1) michael@0: cpi->prior_key_frame_distance[i] michael@0: = cpi->prior_key_frame_distance[i + 1]; michael@0: else michael@0: cpi->prior_key_frame_distance[i] = last_kf_interval; michael@0: michael@0: av_key_frame_frequency += prior_key_frame_weight[i] michael@0: * cpi->prior_key_frame_distance[i]; michael@0: total_weight += prior_key_frame_weight[i]; michael@0: } michael@0: michael@0: av_key_frame_frequency /= total_weight; michael@0: } michael@0: return av_key_frame_frequency; michael@0: } michael@0: michael@0: michael@0: void vp9_adjust_key_frame_context(VP9_COMP *cpi) { michael@0: // Clear down mmx registers to allow floating point in what follows michael@0: vp9_clear_system_state(); michael@0: michael@0: cpi->frames_since_key = 0; michael@0: cpi->key_frame_count++; michael@0: } michael@0: michael@0: michael@0: void vp9_compute_frame_size_bounds(VP9_COMP *cpi, int *frame_under_shoot_limit, michael@0: int *frame_over_shoot_limit) { michael@0: // Set-up bounds on acceptable frame size: michael@0: if (cpi->oxcf.fixed_q >= 0) { michael@0: // Fixed Q scenario: frame size never outranges target (there is no target!) michael@0: *frame_under_shoot_limit = 0; michael@0: *frame_over_shoot_limit = INT_MAX; michael@0: } else { michael@0: if (cpi->common.frame_type == KEY_FRAME) { michael@0: *frame_over_shoot_limit = cpi->this_frame_target * 9 / 8; michael@0: *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8; michael@0: } else { michael@0: if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) { michael@0: *frame_over_shoot_limit = cpi->this_frame_target * 9 / 8; michael@0: *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8; michael@0: } else { michael@0: // Stron overshoot limit for constrained quality michael@0: if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) { michael@0: *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8; michael@0: *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8; michael@0: } else { michael@0: *frame_over_shoot_limit = cpi->this_frame_target * 11 / 8; michael@0: *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8; michael@0: } michael@0: } michael@0: } michael@0: michael@0: // For very small rate targets where the fractional adjustment michael@0: // (eg * 7/8) may be tiny make sure there is at least a minimum michael@0: // range. michael@0: *frame_over_shoot_limit += 200; michael@0: *frame_under_shoot_limit -= 200; michael@0: if (*frame_under_shoot_limit < 0) michael@0: *frame_under_shoot_limit = 0; michael@0: } michael@0: } michael@0: michael@0: michael@0: // return of 0 means drop frame michael@0: int vp9_pick_frame_size(VP9_COMP *cpi) { michael@0: VP9_COMMON *cm = &cpi->common; michael@0: michael@0: if (cm->frame_type == KEY_FRAME) michael@0: calc_iframe_target_size(cpi); michael@0: else michael@0: calc_pframe_target_size(cpi); michael@0: michael@0: return 1; michael@0: }