vp9_ratectrl.c 36.2 KB
Newer Older
John Koleszar's avatar
John Koleszar committed
1
/*
2
 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
John Koleszar's avatar
John Koleszar committed
3
 *
4
 *  Use of this source code is governed by a BSD-style license
5 6
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
7
 *  in the file PATENTS.  All contributing project authors may
8
 *  be found in the AUTHORS file in the root of the source tree.
John Koleszar's avatar
John Koleszar committed
9 10 11 12 13 14 15 16
 */


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <limits.h>
#include <assert.h>
Dmitry Kovalev's avatar
Dmitry Kovalev committed
17
#include <math.h>
John Koleszar's avatar
John Koleszar committed
18

19 20
#include "vp9/common/vp9_alloccommon.h"
#include "vp9/common/vp9_common.h"
21
#include "vp9/encoder/vp9_ratectrl.h"
22
#include "vp9/common/vp9_entropymode.h"
John Koleszar's avatar
John Koleszar committed
23
#include "vpx_mem/vpx_mem.h"
24
#include "vp9/common/vp9_systemdependent.h"
25
#include "vp9/encoder/vp9_encodemv.h"
26
#include "vp9/common/vp9_quant_common.h"
27
#include "vp9/common/vp9_seg_common.h"
John Koleszar's avatar
John Koleszar committed
28

Deb Mukherjee's avatar
Deb Mukherjee committed
29
#define LIMIT_QRANGE_FOR_ALTREF_AND_KEY 1
30

Dmitry Kovalev's avatar
Dmitry Kovalev committed
31 32
#define MIN_BPB_FACTOR 0.005
#define MAX_BPB_FACTOR 50
John Koleszar's avatar
John Koleszar committed
33 34 35 36

// Bits Per MB at different Q (Multiplied by 512)
#define BPER_MB_NORMBITS    9

37 38 39 40 41 42 43 44
// Tables relating active max Q to active min Q
static int kf_low_motion_minq[QINDEX_RANGE];
static int kf_high_motion_minq[QINDEX_RANGE];
static int gf_low_motion_minq[QINDEX_RANGE];
static int gf_high_motion_minq[QINDEX_RANGE];
static int inter_minq[QINDEX_RANGE];
static int afq_low_motion_minq[QINDEX_RANGE];
static int afq_high_motion_minq[QINDEX_RANGE];
Deb Mukherjee's avatar
Deb Mukherjee committed
45 46 47 48
static int gf_high = 2000;
static int gf_low = 400;
static int kf_high = 5000;
static int kf_low = 400;
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

// Functions to compute the active minq lookup table entries based on a
// formulaic approach to facilitate easier adjustment of the Q tables.
// The formulae were derived from computing a 3rd order polynomial best
// fit to the original data (after plotting real maxq vs minq (not q index))
static int calculate_minq_index(double maxq,
                                double x3, double x2, double x1, double c) {
  int i;
  const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq + c,
                                maxq);

  // Special case handling to deal with the step from q2.0
  // down to lossless mode represented by q 1.0.
  if (minqtarget <= 2.0)
    return 0;

  for (i = 0; i < QINDEX_RANGE; i++) {
    if (minqtarget <= vp9_convert_qindex_to_q(i))
      return i;
  }

  return QINDEX_RANGE - 1;
}

73
void vp9_rc_init_minq_luts(void) {
74 75 76 77 78 79 80 81 82 83 84 85 86 87
  int i;

  for (i = 0; i < QINDEX_RANGE; i++) {
    const double maxq = vp9_convert_qindex_to_q(i);


    kf_low_motion_minq[i] = calculate_minq_index(maxq,
                                                 0.000001,
                                                 -0.0004,
                                                 0.15,
                                                 0.0);
    kf_high_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.000002,
                                                  -0.0012,
Deb Mukherjee's avatar
Deb Mukherjee committed
88
                                                  0.50,
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110
                                                  0.0);

    gf_low_motion_minq[i] = calculate_minq_index(maxq,
                                                 0.0000015,
                                                 -0.0009,
                                                 0.32,
                                                 0.0);
    gf_high_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.0000021,
                                                  -0.00125,
                                                  0.50,
                                                  0.0);
    afq_low_motion_minq[i] = calculate_minq_index(maxq,
                                                  0.0000015,
                                                  -0.0009,
                                                  0.33,
                                                  0.0);
    afq_high_motion_minq[i] = calculate_minq_index(maxq,
                                                   0.0000021,
                                                   -0.00125,
                                                   0.55,
                                                   0.0);
Deb Mukherjee's avatar
Deb Mukherjee committed
111 112 113 114 115
    inter_minq[i] = calculate_minq_index(maxq,
                                         0.00000271,
                                         -0.00113,
                                         0.75,
                                         0.0);
116 117 118
  }
}

Paul Wilkins's avatar
Paul Wilkins committed
119 120 121
// These functions use formulaic calculations to make playing with the
// quantizer tables easier. If necessary they can be replaced by lookup
// tables if and when things settle down in the experimental bitstream
122
double vp9_convert_qindex_to_q(int qindex) {
John Koleszar's avatar
John Koleszar committed
123
  // Convert the index to a real Q value (scaled down to match old Q values)
124
  return vp9_ac_quant(qindex, 0) / 4.0;
Paul Wilkins's avatar
Paul Wilkins committed
125 126
}

127 128
int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex,
                       double correction_factor) {
129
  const double q = vp9_convert_qindex_to_q(qindex);
130
  int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000;
Paul Wilkins's avatar
Paul Wilkins committed
131

132
  // q based adjustment to baseline enumerator
Paul Wilkins's avatar
Paul Wilkins committed
133
  enumerator += (int)(enumerator * q) >> 12;
134 135
  return (int)(0.5 + (enumerator * correction_factor / q));
}
John Koleszar's avatar
John Koleszar committed
136

137
void vp9_save_coding_context(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
138
  CODING_CONTEXT *const cc = &cpi->coding_context;
139
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
140

John Koleszar's avatar
John Koleszar committed
141
  // Stores a snapshot of key state variables which can subsequently be
142
  // restored with a call to vp9_restore_coding_context. These functions are
143
  // intended for use in a re-code loop in vp9_compress_frame where the
John Koleszar's avatar
John Koleszar committed
144
  // quantizer value is adjusted between loop iterations.
145 146 147 148
  vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
  vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
  vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);

149
  vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
150

John Koleszar's avatar
John Koleszar committed
151
  vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
152
             cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
John Koleszar's avatar
John Koleszar committed
153

154 155
  vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
  vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
156

157
  cc->fc = cm->fc;
158
}
John Koleszar's avatar
John Koleszar committed
159

160
void vp9_restore_coding_context(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
161
  CODING_CONTEXT *const cc = &cpi->coding_context;
162
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
163

John Koleszar's avatar
John Koleszar committed
164
  // Restore key state variables to the snapshot state stored in the
165
  // previous call to vp9_save_coding_context.
166 167 168 169
  vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
  vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
  vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);

170
  vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
Ronald S. Bultje's avatar
Ronald S. Bultje committed
171

John Koleszar's avatar
John Koleszar committed
172 173
  vpx_memcpy(cm->last_frame_seg_map,
             cpi->coding_context.last_frame_seg_map_copy,
174
             (cm->mi_rows * cm->mi_cols));
John Koleszar's avatar
John Koleszar committed
175

176 177
  vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
  vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
178

179
  cm->fc = cc->fc;
John Koleszar's avatar
John Koleszar committed
180 181
}

182 183
void vp9_setup_key_frame(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
184

185
  vp9_setup_past_independence(cm);
John Koleszar's avatar
John Koleszar committed
186

187
  /* All buffers are implicitly updated on key frames. */
188 189
  cpi->refresh_golden_frame = 1;
  cpi->refresh_alt_ref_frame = 1;
John Koleszar's avatar
John Koleszar committed
190
}
191

192
void vp9_setup_inter_frame(VP9_COMP *cpi) {
193
  VP9_COMMON *cm = &cpi->common;
Adrian Grange's avatar
Adrian Grange committed
194
  if (cm->error_resilient_mode || cm->intra_only)
195
    vp9_setup_past_independence(cm);
196

Dmitry Kovalev's avatar
Dmitry Kovalev committed
197
  assert(cm->frame_context_idx < FRAME_CONTEXTS);
198
  cm->fc = cm->frame_contexts[cm->frame_context_idx];
199
}
John Koleszar's avatar
John Koleszar committed
200

201
static int estimate_bits_at_q(int frame_kind, int q, int mbs,
John Koleszar's avatar
John Koleszar committed
202
                              double correction_factor) {
203
  const int bpm = (int)(vp9_rc_bits_per_mb(frame_kind, q, correction_factor));
John Koleszar's avatar
John Koleszar committed
204

205 206 207 208 209
  // Attempt to retain reasonable accuracy without overflow. The cutoff is
  // chosen such that the maximum product of Bpm and MBs fits 31 bits. The
  // largest Bpm takes 20 bits.
  return (mbs > (1 << 11)) ? (bpm >> BPER_MB_NORMBITS) * mbs
                           : (bpm * mbs) >> BPER_MB_NORMBITS;
210
}
211 212


213
static void calc_iframe_target_size(VP9_COMP *cpi) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
214 215
  const VP9_CONFIG *oxcf = &cpi->oxcf;
  RATE_CONTROL *const rc = &cpi->rc;
John Koleszar's avatar
John Koleszar committed
216
  int target;
John Koleszar's avatar
John Koleszar committed
217

218
  vp9_clear_system_state();  // __asm emms;
John Koleszar's avatar
John Koleszar committed
219

220 221 222
  // For 1-pass.
  if (cpi->pass == 0) {
    if (cpi->common.current_video_frame == 0) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
223
      target = oxcf->starting_buffer_level / 2;
224 225 226 227 228 229 230 231 232 233 234
    } else {
      // TODO(marpan): Add in adjustment based on Q.
      // If this keyframe was forced, use a more recent Q estimate.
      // int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY) ?
      //    cpi->rc.avg_frame_qindex : cpi->rc.ni_av_qi;
      int initial_boost = 32;
      // Boost depends somewhat on frame rate.
      int kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
      // Adjustment up based on q: need to fix.
      // kf_boost = kf_boost * kfboost_qadjust(Q) / 100;
      // Frame separation adjustment (down).
Dmitry Kovalev's avatar
Dmitry Kovalev committed
235 236 237
      if (rc->frames_since_key  < cpi->output_framerate / 2) {
        kf_boost = (int)(kf_boost * rc->frames_since_key /
                       (cpi->output_framerate / 2));
238 239
      }
      kf_boost = (kf_boost < 16) ? 16 : kf_boost;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
240
      target = ((16 + kf_boost) * rc->per_frame_bandwidth) >> 4;
241
    }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
242 243 244
    rc->active_worst_quality = rc->worst_quality;
  } else {
    target = rc->per_frame_bandwidth;
245 246
  }

Dmitry Kovalev's avatar
Dmitry Kovalev committed
247 248 249 250
  if (oxcf->rc_max_intra_bitrate_pct) {
    const int max_rate = rc->per_frame_bandwidth *
                             oxcf->rc_max_intra_bitrate_pct / 100;
    target = MIN(target, max_rate);
John Koleszar's avatar
John Koleszar committed
251
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
252
  rc->this_frame_target = target;
John Koleszar's avatar
John Koleszar committed
253 254
}

255 256
// Update the buffer level: leaky bucket model.
void vp9_update_buffer_level(VP9_COMP *const cpi, int encoded_frame_size) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
257 258
  const VP9_COMMON *const cm = &cpi->common;
  const VP9_CONFIG *oxcf = &cpi->oxcf;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
259
  RATE_CONTROL *const rc = &cpi->rc;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
260

261 262
  // Non-viewable frames are a special case and are treated as pure overhead.
  if (!cm->show_frame) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
263
    rc->bits_off_target -= encoded_frame_size;
264
  } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
265
    rc->bits_off_target += rc->av_per_frame_bandwidth - encoded_frame_size;
266
  }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
267

268
  // Clip the buffer level to the maximum specified buffer size.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
269
  rc->buffer_level = MIN(rc->bits_off_target, oxcf->maximum_buffer_size);
270 271 272
}

int vp9_drop_frame(VP9_COMP *const cpi) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
273
  const VP9_CONFIG *oxcf = &cpi->oxcf;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
274 275
  RATE_CONTROL *const rc = &cpi->rc;

Dmitry Kovalev's avatar
Dmitry Kovalev committed
276 277

  if (!oxcf->drop_frames_water_mark) {
278 279
    return 0;
  } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
280
    if (rc->buffer_level < 0) {
281 282 283 284 285
      // Always drop if buffer is below 0.
      return 1;
    } else {
      // If buffer is below drop_mark, for now just drop every other frame
      // (starting with the next frame) until it increases back over drop_mark.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
286 287
      int drop_mark = (int)(oxcf->drop_frames_water_mark *
                                oxcf->optimal_buffer_level / 100);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
288 289 290 291 292 293
      if ((rc->buffer_level > drop_mark) &&
          (rc->decimation_factor > 0)) {
        --rc->decimation_factor;
      } else if (rc->buffer_level <= drop_mark &&
          rc->decimation_factor == 0) {
        rc->decimation_factor = 1;
294
      }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
295 296 297
      if (rc->decimation_factor > 0) {
        if (rc->decimation_count > 0) {
          --rc->decimation_count;
298 299
          return 1;
        } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
300
          rc->decimation_count = rc->decimation_factor;
301 302 303
          return 0;
        }
      } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
304
        rc->decimation_count = 0;
305 306 307 308 309 310 311
        return 0;
      }
    }
  }
}

// Adjust active_worst_quality level based on buffer level.
312 313
static int adjust_active_worst_quality_from_buffer_level(const VP9_CONFIG *oxcf,
    const RATE_CONTROL *rc) {
314 315 316 317 318
  // Adjust active_worst_quality: If buffer is above the optimal/target level,
  // bring active_worst_quality down depending on fullness over buffer.
  // If buffer is below the optimal level, let the active_worst_quality go from
  // ambient Q (at buffer = optimal level) to worst_quality level
  // (at buffer = critical level).
319

Dmitry Kovalev's avatar
Dmitry Kovalev committed
320
  int active_worst_quality = rc->active_worst_quality;
321 322 323
  // Maximum limit for down adjustment, ~20%.
  int max_adjustment_down = active_worst_quality / 5;
  // Buffer level below which we push active_worst to worst_quality.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
324
  int critical_level = oxcf->optimal_buffer_level >> 2;
325 326
  int adjustment = 0;
  int buff_lvl_step = 0;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
327
  if (rc->buffer_level > oxcf->optimal_buffer_level) {
328 329
    // Adjust down.
    if (max_adjustment_down) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
330 331 332 333 334
      buff_lvl_step = (int)((oxcf->maximum_buffer_size -
          oxcf->optimal_buffer_level) / max_adjustment_down);
      if (buff_lvl_step)
        adjustment = (int)((rc->buffer_level - oxcf->optimal_buffer_level) /
                            buff_lvl_step);
335 336
      active_worst_quality -= adjustment;
    }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
337
  } else if (rc->buffer_level > critical_level) {
338 339
    // Adjust up from ambient Q.
    if (critical_level) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
340
      buff_lvl_step = (oxcf->optimal_buffer_level - critical_level);
341
      if (buff_lvl_step) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
342 343 344
        adjustment = (rc->worst_quality - rc->avg_frame_qindex[INTER_FRAME]) *
                         (oxcf->optimal_buffer_level - rc->buffer_level) /
                             buff_lvl_step;
345
      }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
346
      active_worst_quality = rc->avg_frame_qindex[INTER_FRAME] + adjustment;
347 348 349
    }
  } else {
    // Set to worst_quality if buffer is below critical level.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
350
    active_worst_quality = rc->worst_quality;
351 352 353 354 355
  }
  return active_worst_quality;
}

// Adjust target frame size with respect to the buffering constraints:
356 357 358 359 360
static int target_size_from_buffer_level(const VP9_CONFIG *oxcf,
                                         const RATE_CONTROL *rc) {
  int target = rc->this_frame_target;
  const int64_t diff = oxcf->optimal_buffer_level - rc->buffer_level;
  const int one_pct_bits = 1 + oxcf->optimal_buffer_level / 100;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
361

362
  if (diff > 0) {
363
    // Lower the target bandwidth for this frame.
364 365 366
    const int pct_low = MIN(diff / one_pct_bits, oxcf->under_shoot_pct);
    target -= (target * pct_low) / 200;
  } else  if (diff < 0) {
367
    // Increase the target bandwidth for this frame.
368 369
    const int pct_high = MIN(-diff / one_pct_bits, oxcf->over_shoot_pct);
    target += (target * pct_high) / 200;
370
  }
371 372

  return target;
373
}
John Koleszar's avatar
John Koleszar committed
374

375
static void calc_pframe_target_size(VP9_COMP *const cpi) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
376 377 378 379
  RATE_CONTROL *const rc = &cpi->rc;
  const VP9_CONFIG *const oxcf = &cpi->oxcf;
  int min_frame_target = MAX(rc->min_frame_bandwidth,
                             rc->av_per_frame_bandwidth >> 5);
380
  if (cpi->refresh_alt_ref_frame) {
381
    // Special alt reference frame case
John Koleszar's avatar
John Koleszar committed
382
    // Per frame bit target for the alt ref frame
Dmitry Kovalev's avatar
Dmitry Kovalev committed
383 384
    rc->per_frame_bandwidth = cpi->twopass.gf_bits;
    rc->this_frame_target = rc->per_frame_bandwidth;
385
  } else {
386
    // Normal frames (gf and inter).
Dmitry Kovalev's avatar
Dmitry Kovalev committed
387
    rc->this_frame_target = rc->per_frame_bandwidth;
388
    // Set target frame size based on buffer level, for 1 pass CBR.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
389
    if (cpi->pass == 0 && oxcf->end_usage == USAGE_STREAM_FROM_SERVER) {
390 391
      // Need to decide how low min_frame_target should be for 1-pass CBR.
      // For now, use: cpi->rc.av_per_frame_bandwidth / 16:
Dmitry Kovalev's avatar
Dmitry Kovalev committed
392
      min_frame_target = MAX(rc->av_per_frame_bandwidth >> 4,
393
                             FRAME_OVERHEAD_BITS);
394
      rc->this_frame_target = target_size_from_buffer_level(oxcf, rc);
395
      // Adjust qp-max based on buffer level.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
396
      rc->active_worst_quality =
397
          adjust_active_worst_quality_from_buffer_level(oxcf, rc);
398
    }
John Koleszar's avatar
John Koleszar committed
399
  }
John Koleszar's avatar
John Koleszar committed
400

401 402 403 404 405 406
  // Check that the total sum of adjustments is not above the maximum allowed.
  // That is, having allowed for the KF and GF penalties, we have not pushed
  // the current inter-frame target too low. If the adjustment we apply here is
  // not capable of recovering all the extra bits we have spent in the KF or GF,
  // then the remainder will have to be recovered over a longer time span via
  // other buffer / rate control mechanisms.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
407 408
  if (rc->this_frame_target < min_frame_target)
    rc->this_frame_target = min_frame_target;
John Koleszar's avatar
John Koleszar committed
409 410

  // Adjust target frame size for Golden Frames:
411
  if (cpi->refresh_golden_frame) {
John Koleszar's avatar
John Koleszar committed
412 413 414
    // If we are using alternate ref instead of gf then do not apply the boost
    // It will instead be applied to the altref update
    // Jims modified boost
Dmitry Kovalev's avatar
Dmitry Kovalev committed
415
    if (!rc->source_alt_ref_active) {
416 417
      // The spend on the GF is defined in the two pass code
      // for two pass encodes
Dmitry Kovalev's avatar
Dmitry Kovalev committed
418
      rc->this_frame_target = rc->per_frame_bandwidth;
419 420
    } else {
      // If there is an active ARF at this location use the minimum
421
      // bits on this frame even if it is a constructed arf.
422
      // The active maximum quantizer insures that an appropriate
423
      // number of bits will be spent if needed for constructed ARFs.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
424
      rc->this_frame_target = 0;
John Koleszar's avatar
John Koleszar committed
425
    }
John Koleszar's avatar
John Koleszar committed
426
  }
John Koleszar's avatar
John Koleszar committed
427 428
}

429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450
static double get_rate_correction_factor(const VP9_COMP *cpi) {
  if (cpi->common.frame_type == KEY_FRAME) {
    return cpi->rc.key_frame_rate_correction_factor;
  } else {
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
      return cpi->rc.gf_rate_correction_factor;
    else
      return cpi->rc.rate_correction_factor;
  }
}

static void set_rate_correction_factor(VP9_COMP *cpi, double factor) {
  if (cpi->common.frame_type == KEY_FRAME) {
    cpi->rc.key_frame_rate_correction_factor = factor;
  } else {
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
      cpi->rc.gf_rate_correction_factor = factor;
    else
      cpi->rc.rate_correction_factor = factor;
  }
}

451
void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
452 453
  const int q = cpi->common.base_qindex;
  int correction_factor = 100;
454
  double rate_correction_factor = get_rate_correction_factor(cpi);
John Koleszar's avatar
John Koleszar committed
455
  double adjustment_limit;
John Koleszar's avatar
John Koleszar committed
456

457
  int projected_size_based_on_q = 0;
John Koleszar's avatar
John Koleszar committed
458

John Koleszar's avatar
John Koleszar committed
459
  // Clear down mmx registers to allow floating point in what follows
460
  vp9_clear_system_state();  // __asm emms;
John Koleszar's avatar
John Koleszar committed
461

462 463
  // Work out how big we would have expected the frame to be at this Q given
  // the current correction factor.
John Koleszar's avatar
John Koleszar committed
464
  // Stay in double to avoid int overflow when values are large
465 466 467
  projected_size_based_on_q = estimate_bits_at_q(cpi->common.frame_type, q,
                                                 cpi->common.MBs,
                                                 rate_correction_factor);
John Koleszar's avatar
John Koleszar committed
468 469 470

  // Work out a size correction factor.
  if (projected_size_based_on_q > 0)
471
    correction_factor =
472
        (100 * cpi->rc.projected_frame_size) / projected_size_based_on_q;
John Koleszar's avatar
John Koleszar committed
473

474 475
  // More heavily damped adjustment used if we have been oscillating either side
  // of target.
John Koleszar's avatar
John Koleszar committed
476
  switch (damp_var) {
John Koleszar's avatar
John Koleszar committed
477
    case 0:
John Koleszar's avatar
John Koleszar committed
478 479
      adjustment_limit = 0.75;
      break;
John Koleszar's avatar
John Koleszar committed
480
    case 1:
John Koleszar's avatar
John Koleszar committed
481 482
      adjustment_limit = 0.375;
      break;
John Koleszar's avatar
John Koleszar committed
483 484
    case 2:
    default:
John Koleszar's avatar
John Koleszar committed
485 486 487 488 489 490
      adjustment_limit = 0.25;
      break;
  }

  if (correction_factor > 102) {
    // We are not already at the worst allowable quality
491
    correction_factor =
492
        (int)(100 + ((correction_factor - 100) * adjustment_limit));
493 494
    rate_correction_factor =
        ((rate_correction_factor * correction_factor) / 100);
John Koleszar's avatar
John Koleszar committed
495 496 497 498

    // Keep rate_correction_factor within limits
    if (rate_correction_factor > MAX_BPB_FACTOR)
      rate_correction_factor = MAX_BPB_FACTOR;
499
  } else if (correction_factor < 99) {
John Koleszar's avatar
John Koleszar committed
500
    // We are not already at the best allowable quality
501
    correction_factor =
502
        (int)(100 - ((100 - correction_factor) * adjustment_limit));
503 504
    rate_correction_factor =
        ((rate_correction_factor * correction_factor) / 100);
John Koleszar's avatar
John Koleszar committed
505 506 507 508 509 510

    // Keep rate_correction_factor within limits
    if (rate_correction_factor < MIN_BPB_FACTOR)
      rate_correction_factor = MIN_BPB_FACTOR;
  }

511
  set_rate_correction_factor(cpi, rate_correction_factor);
John Koleszar's avatar
John Koleszar committed
512 513 514
}


Deb Mukherjee's avatar
Deb Mukherjee committed
515 516 517
int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame,
                      int active_best_quality, int active_worst_quality) {
  int q = active_worst_quality;
John Koleszar's avatar
John Koleszar committed
518
  int last_error = INT_MAX;
519 520
  int i, target_bits_per_mb, bits_per_mb_at_this_q;
  const double correction_factor = get_rate_correction_factor(cpi);
John Koleszar's avatar
John Koleszar committed
521

522 523
  // Calculate required scaling factor based on target frame size and size of
  // frame produced using previous Q.
John Koleszar's avatar
John Koleszar committed
524
  if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
525 526 527
    target_bits_per_mb =
        (target_bits_per_frame / cpi->common.MBs)
        << BPER_MB_NORMBITS;  // Case where we would overflow int
John Koleszar's avatar
John Koleszar committed
528
  else
529 530
    target_bits_per_mb =
        (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
John Koleszar's avatar
John Koleszar committed
531

Deb Mukherjee's avatar
Deb Mukherjee committed
532
  i = active_best_quality;
John Koleszar's avatar
John Koleszar committed
533

John Koleszar's avatar
John Koleszar committed
534
  do {
535 536
    bits_per_mb_at_this_q = (int)vp9_rc_bits_per_mb(cpi->common.frame_type, i,
                                                    correction_factor);
John Koleszar's avatar
John Koleszar committed
537

John Koleszar's avatar
John Koleszar committed
538 539
    if (bits_per_mb_at_this_q <= target_bits_per_mb) {
      if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
540
        q = i;
John Koleszar's avatar
John Koleszar committed
541
      else
542
        q = i - 1;
John Koleszar's avatar
John Koleszar committed
543

John Koleszar's avatar
John Koleszar committed
544
      break;
545
    } else {
John Koleszar's avatar
John Koleszar committed
546
      last_error = bits_per_mb_at_this_q - target_bits_per_mb;
547
    }
Deb Mukherjee's avatar
Deb Mukherjee committed
548
  } while (++i <= active_worst_quality);
549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573

  return q;
}

static int get_active_quality(int q,
                              int gfu_boost,
                              int low,
                              int high,
                              int *low_motion_minq,
                              int *high_motion_minq) {
  int active_best_quality;
  if (gfu_boost > high) {
    active_best_quality = low_motion_minq[q];
  } else if (gfu_boost < low) {
    active_best_quality = high_motion_minq[q];
  } else {
    const int gap = high - low;
    const int offset = high - gfu_boost;
    const int qdiff = high_motion_minq[q] - low_motion_minq[q];
    const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap;
    active_best_quality = low_motion_minq[q] + adjustment;
  }
  return active_best_quality;
}

Deb Mukherjee's avatar
Deb Mukherjee committed
574
int vp9_rc_pick_q_and_adjust_q_bounds(const VP9_COMP *cpi,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
575
                                      int *bottom_index, int *top_index) {
Deb Mukherjee's avatar
Deb Mukherjee committed
576
  const VP9_COMMON *const cm = &cpi->common;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
577 578
  const RATE_CONTROL *const rc = &cpi->rc;
  const VP9_CONFIG *const oxcf = &cpi->oxcf;
Deb Mukherjee's avatar
Deb Mukherjee committed
579
  int active_best_quality;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
580
  int active_worst_quality = rc->active_worst_quality;
Deb Mukherjee's avatar
Deb Mukherjee committed
581
  int q;
582 583

  if (frame_is_intra_only(cm)) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
584
    active_best_quality = rc->best_quality;
585 586 587 588
#if !CONFIG_MULTIPLE_ARF
    // Handle the special case for key frames forced when we have75 reached
    // the maximum key frame interval. Here force the Q to a range
    // based on the ambient Q to reduce the risk of popping.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
589 590
    if (rc->this_key_frame_forced) {
      int qindex = rc->last_boosted_qindex;
591
      double last_boosted_q = vp9_convert_qindex_to_q(qindex);
Dmitry Kovalev's avatar
Dmitry Kovalev committed
592 593 594 595
      int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
                                            (last_boosted_q * 0.75));
      active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
    } else if (!(cpi->pass == 0 && cm->current_video_frame == 0)) {
Alex Converse's avatar
Alex Converse committed
596
      // not first frame of one pass and kf_boost is set
597 598 599 600
      double q_adj_factor = 1.0;
      double q_val;

      // Baseline value derived from cpi->active_worst_quality and kf boost
Deb Mukherjee's avatar
Deb Mukherjee committed
601
      active_best_quality = get_active_quality(active_worst_quality,
Dmitry Kovalev's avatar
Dmitry Kovalev committed
602
                                               rc->kf_boost,
Deb Mukherjee's avatar
Deb Mukherjee committed
603 604 605
                                               kf_low, kf_high,
                                               kf_low_motion_minq,
                                               kf_high_motion_minq);
606 607 608 609 610 611 612

      // Allow somewhat lower kf minq with small image formats.
      if ((cm->width * cm->height) <= (352 * 288)) {
        q_adj_factor -= 0.25;
      }

      // Make a further adjustment based on the kf zero motion measure.
613
      q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct);
614 615 616

      // Convert the adjustment factor to a qindex delta
      // on active_best_quality.
Deb Mukherjee's avatar
Deb Mukherjee committed
617 618
      q_val = vp9_convert_qindex_to_q(active_best_quality);
      active_best_quality +=
619 620 621 622 623
          vp9_compute_qdelta(cpi, q_val, (q_val * q_adj_factor));
    }
#else
    double current_q;
    // Force the KF quantizer to be 30% of the active_worst_quality.
Deb Mukherjee's avatar
Deb Mukherjee committed
624 625
    current_q = vp9_convert_qindex_to_q(active_worst_quality);
    active_best_quality = active_worst_quality
626 627
        + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
#endif
Dmitry Kovalev's avatar
Dmitry Kovalev committed
628
  } else if (!rc->is_src_frame_alt_ref &&
629 630
             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {

Deb Mukherjee's avatar
Deb Mukherjee committed
631
    // Use the lower of active_worst_quality and recent
632 633
    // average Q as basis for GF/ARF best Q limit unless last frame was
    // a key frame.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
634 635 636
    if (rc->frames_since_key > 1 &&
        rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
      q = rc->avg_frame_qindex[INTER_FRAME];
Deb Mukherjee's avatar
Deb Mukherjee committed
637 638
    } else {
      q = active_worst_quality;
639 640
    }
    // For constrained quality dont allow Q less than the cq level
Dmitry Kovalev's avatar
Dmitry Kovalev committed
641
    if (oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) {
642 643
      if (q < cpi->cq_target_quality)
        q = cpi->cq_target_quality;
Dmitry Kovalev's avatar
Dmitry Kovalev committed
644 645
      if (rc->frames_since_key > 1) {
        active_best_quality = get_active_quality(q, rc->gfu_boost,
Deb Mukherjee's avatar
Deb Mukherjee committed
646 647 648
                                                 gf_low, gf_high,
                                                 afq_low_motion_minq,
                                                 afq_high_motion_minq);
649
      } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
650
        active_best_quality = get_active_quality(q, rc->gfu_boost,
Deb Mukherjee's avatar
Deb Mukherjee committed
651 652 653
                                                 gf_low, gf_high,
                                                 gf_low_motion_minq,
                                                 gf_high_motion_minq);
654 655
      }
      // Constrained quality use slightly lower active best.
Deb Mukherjee's avatar
Deb Mukherjee committed
656
      active_best_quality = active_best_quality * 15 / 16;
657

Dmitry Kovalev's avatar
Dmitry Kovalev committed
658
    } else if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
659
      if (!cpi->refresh_alt_ref_frame) {
Deb Mukherjee's avatar
Deb Mukherjee committed
660
        active_best_quality = cpi->cq_target_quality;
661
      } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
662
        if (rc->frames_since_key > 1) {
Deb Mukherjee's avatar
Deb Mukherjee committed
663
          active_best_quality = get_active_quality(
Dmitry Kovalev's avatar
Dmitry Kovalev committed
664
              q, rc->gfu_boost, gf_low, gf_high,
665
              afq_low_motion_minq, afq_high_motion_minq);
666
        } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
667
          active_best_quality = get_active_quality(
Dmitry Kovalev's avatar
Dmitry Kovalev committed
668
              q, rc->gfu_boost, gf_low, gf_high,
669
              gf_low_motion_minq, gf_high_motion_minq);
670 671 672
        }
      }
    } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
673
      active_best_quality = get_active_quality(
Dmitry Kovalev's avatar
Dmitry Kovalev committed
674
          q, rc->gfu_boost, gf_low, gf_high,
Deb Mukherjee's avatar
Deb Mukherjee committed
675
          gf_low_motion_minq, gf_high_motion_minq);
676 677
    }
  } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
678
    if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
Deb Mukherjee's avatar
Deb Mukherjee committed
679
      active_best_quality = cpi->cq_target_quality;
680
    } else {
Deb Mukherjee's avatar
Deb Mukherjee committed
681
      if (cpi->pass == 0 &&
Dmitry Kovalev's avatar
Dmitry Kovalev committed
682
          rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality)
Deb Mukherjee's avatar
Deb Mukherjee committed
683 684
        // 1-pass: for now, use the average Q for the active_best, if its lower
        // than active_worst.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
685
        active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]];
Deb Mukherjee's avatar
Deb Mukherjee committed
686 687
      else
        active_best_quality = inter_minq[active_worst_quality];
688 689 690

      // For the constrained quality mode we don't want
      // q to fall below the cq level.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
691
      if ((oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) &&
Deb Mukherjee's avatar
Deb Mukherjee committed
692
          (active_best_quality < cpi->cq_target_quality)) {
693 694 695
        // If we are strongly undershooting the target rate in the last
        // frames then use the user passed in cq value not the auto
        // cq value.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
696 697
        if (rc->rolling_actual_bits < rc->min_frame_bandwidth)
          active_best_quality = oxcf->cq_level;
698
        else
Deb Mukherjee's avatar
Deb Mukherjee committed
699
          active_best_quality = cpi->cq_target_quality;
700 701 702 703 704
      }
    }
  }

  // Clip the active best and worst quality values to limits
Dmitry Kovalev's avatar
Dmitry Kovalev committed
705 706
  if (active_worst_quality > rc->worst_quality)
    active_worst_quality = rc->worst_quality;
707

Dmitry Kovalev's avatar
Dmitry Kovalev committed
708 709
  if (active_best_quality < rc->best_quality)
    active_best_quality = rc->best_quality;
710

Dmitry Kovalev's avatar
Dmitry Kovalev committed
711 712
  if (active_best_quality > rc->worst_quality)
    active_best_quality = rc->worst_quality;
713

Deb Mukherjee's avatar
Deb Mukherjee committed
714 715
  if (active_worst_quality < active_best_quality)
    active_worst_quality = active_best_quality;
716

Deb Mukherjee's avatar
Deb Mukherjee committed
717 718
  *top_index = active_worst_quality;
  *bottom_index = active_best_quality;
719 720

#if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
721
  // Limit Q range for the adaptive loop.
Dmitry Kovalev's avatar
Dmitry Kovalev committed
722 723
  if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
    if (!(cpi->pass == 0 && cm->current_video_frame == 0)) {
724
      *top_index =
Deb Mukherjee's avatar
Deb Mukherjee committed
725
          (active_worst_quality + active_best_quality * 3) / 4;
726
    }
Dmitry Kovalev's avatar
Dmitry Kovalev committed
727 728
  } else if (!rc->is_src_frame_alt_ref &&
             (oxcf->end_usage != USAGE_STREAM_FROM_SERVER) &&
729 730
             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
    *top_index =
Deb Mukherjee's avatar
Deb Mukherjee committed
731
      (active_worst_quality + active_best_quality) / 2;
732
  }
733
#endif
734

Dmitry Kovalev's avatar
Dmitry Kovalev committed
735
  if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
Deb Mukherjee's avatar
Deb Mukherjee committed
736
    q = active_best_quality;
737
  // Special case code to try and match quality with forced key frames
Dmitry Kovalev's avatar
Dmitry Kovalev committed
738 739
  } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) {
    q = rc->last_boosted_qindex;
740
  } else {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
741
    q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
742
                          active_best_quality, active_worst_quality);
Paul Wilkins's avatar
Paul Wilkins committed
743 744 745 746 747 748 749
    if (q > *top_index) {
      // Special case when we are targeting the max allowed rate
      if (cpi->rc.this_frame_target >= cpi->rc.max_frame_bandwidth)
        *top_index = q;
      else
        q = *top_index;
    }
750
  }
Deb Mukherjee's avatar
Deb Mukherjee committed
751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767
#if CONFIG_MULTIPLE_ARF
  // Force the quantizer determined by the coding order pattern.
  if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
      cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
    double new_q;
    double current_q = vp9_convert_qindex_to_q(active_worst_quality);
    int level = cpi->this_frame_weight;
    assert(level >= 0);
    new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
    q = active_worst_quality +
        vp9_compute_qdelta(cpi, current_q, new_q);

    *bottom_index = q;
    *top_index    = q;
    printf("frame:%d q:%d\n", cm->current_video_frame, q);
  }
#endif
Dmitry Kovalev's avatar
Dmitry Kovalev committed
768 769 770 771 772
  assert(*top_index <= rc->worst_quality &&
         *top_index >= rc->best_quality);
  assert(*bottom_index <= rc->worst_quality &&
         *bottom_index >= rc->best_quality);
  assert(q <= rc->worst_quality && q >= rc->best_quality);
773
  return q;
John Koleszar's avatar
John Koleszar committed
774 775
}

Deb Mukherjee's avatar
Deb Mukherjee committed
776
void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi,
777 778 779
                                      int this_frame_target,
                                      int *frame_under_shoot_limit,
                                      int *frame_over_shoot_limit) {
John Koleszar's avatar
John Koleszar committed
780
  // Set-up bounds on acceptable frame size:
781
  if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
John Koleszar's avatar
John Koleszar committed
782 783 784 785
    *frame_under_shoot_limit = 0;
    *frame_over_shoot_limit  = INT_MAX;
  } else {
    if (cpi->common.frame_type == KEY_FRAME) {
786 787
      *frame_over_shoot_limit  = this_frame_target * 9 / 8;
      *frame_under_shoot_limit = this_frame_target * 7 / 8;
John Koleszar's avatar
John Koleszar committed
788
    } else {
789
      if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) {
790 791
        *frame_over_shoot_limit  = this_frame_target * 9 / 8;
        *frame_under_shoot_limit = this_frame_target * 7 / 8;
John Koleszar's avatar
John Koleszar committed
792 793 794
      } else {
        // Stron overshoot limit for constrained quality
        if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
795 796
          *frame_over_shoot_limit  = this_frame_target * 11 / 8;
          *frame_under_shoot_limit = this_frame_target * 2 / 8;
John Koleszar's avatar
John Koleszar committed
797
        } else {
798 799
          *frame_over_shoot_limit  = this_frame_target * 11 / 8;
          *frame_under_shoot_limit = this_frame_target * 5 / 8;
John Koleszar's avatar
John Koleszar committed
800
        }
John Koleszar's avatar
John Koleszar committed
801
      }
John Koleszar's avatar
John Koleszar committed
802
    }
John Koleszar's avatar
John Koleszar committed
803 804 805 806 807 808 809 810

    // For very small rate targets where the fractional adjustment
    // (eg * 7/8) may be tiny make sure there is at least a minimum
    // range.
    *frame_over_shoot_limit += 200;
    *frame_under_shoot_limit -= 200;
    if (*frame_under_shoot_limit < 0)
      *frame_under_shoot_limit = 0;
Paul Wilkins's avatar
Paul Wilkins committed
811 812 813 814 815

    // Clip to maximum allowed rate for a frame.
    if (*frame_over_shoot_limit > cpi->rc.max_frame_bandwidth) {
      *frame_over_shoot_limit = cpi->rc.max_frame_bandwidth;
    }
John Koleszar's avatar
John Koleszar committed
816
  }
John Koleszar's avatar
John Koleszar committed
817
}
818 819

// return of 0 means drop frame
Deb Mukherjee's avatar
Deb Mukherjee committed
820
int vp9_rc_pick_frame_size_target(VP9_COMP *cpi) {
821
  VP9_COMMON *cm = &cpi->common;
822

John Koleszar's avatar
John Koleszar committed
823 824 825 826
  if (cm->frame_type == KEY_FRAME)
    calc_iframe_target_size(cpi);
  else
    calc_pframe_target_size(cpi);
827

Paul Wilkins's avatar
Paul Wilkins committed
828 829 830 831
  // Clip the frame target to the maximum allowed value.
  if (cpi->rc.this_frame_target > cpi->rc.max_frame_bandwidth)
    cpi->rc.this_frame_target = cpi->rc.max_frame_bandwidth;

832 833 834
  // Target rate per SB64 (including partial SB64s.
  cpi->rc.sb64_target_rate = ((int64_t)cpi->rc.this_frame_target * 64 * 64) /
                             (cpi->common.width * cpi->common.height);
John Koleszar's avatar
John Koleszar committed
835
  return 1;
836
}
837

Deb Mukherjee's avatar
Deb Mukherjee committed
838 839 840 841 842 843 844 845 846 847 848 849 850 851 852
static void update_alt_ref_frame_stats(VP9_COMP *cpi) {
  // this frame refreshes means next frames don't unless specified by user
  cpi->rc.frames_since_golden = 0;

#if CONFIG_MULTIPLE_ARF
  if (!cpi->multi_arf_enabled)
#endif
    // Clear the alternate reference update pending flag.
    cpi->rc.source_alt_ref_pending = 0;

  // Set the alternate reference frame active flag
  cpi->rc.source_alt_ref_active = 1;
}

static void update_golden_frame_stats(VP9_COMP *cpi) {
Dmitry Kovalev's avatar
Dmitry Kovalev committed
853 854
  RATE_CONTROL *const rc = &cpi->rc;

Deb Mukherjee's avatar
Deb Mukherjee committed
855 856 857
  // Update the Golden frame usage counts.
  if (cpi->refresh_golden_frame) {
    // this frame refreshes means next frames don't unless specified by user
Dmitry Kovalev's avatar
Dmitry Kovalev committed
858
    rc->frames_since_golden = 0;
Deb Mukherjee's avatar
Deb Mukherjee committed
859

Dmitry Kovalev's avatar
Dmitry Kovalev committed
860 861
    if (!rc->source_alt_ref_pending)
      rc->source_alt_ref_active = 0;
Deb Mukherjee's avatar
Deb Mukherjee committed
862 863

    // Decrement count down till next gf
Dmitry Kovalev's avatar
Dmitry Kovalev committed
864 865
    if (rc->frames_till_gf_update_due > 0)
      rc->frames_till_gf_update_due--;
Deb Mukherjee's avatar
Deb Mukherjee committed
866 867 868

  } else if (!cpi->refresh_alt_ref_frame) {
    // Decrement count down till next gf
Dmitry Kovalev's avatar
Dmitry Kovalev committed
869 870
    if (rc->frames_till_gf_update_due > 0)
      rc->frames_till_gf_update_due--;
Deb Mukherjee's avatar
Deb Mukherjee committed
871

Dmitry Kovalev's avatar
Dmitry Kovalev committed
872
    rc->frames_since_golden++;
Deb Mukherjee's avatar
Deb Mukherjee committed
873 874 875
  }
}

876
void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
877
  VP9_COMMON *const cm = &cpi->common;
878
  RATE_CONTROL *const rc = &cpi->rc;
879
  // Update rate control heuristics
880
  rc->projected_frame_size = (bytes_used << 3);
881 882

  // Post encode loop adjustment of Q predicti