vp9_ratectrl.c 15.7 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

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

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

35
36
static const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] =
    { 1, 2, 3, 4, 5 };
John Koleszar's avatar
John Koleszar committed
37

Paul Wilkins's avatar
Paul Wilkins committed
38
39
40
// 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
41
double vp9_convert_qindex_to_q(int qindex) {
John Koleszar's avatar
John Koleszar committed
42
  // Convert the index to a real Q value (scaled down to match old Q values)
43
  return vp9_ac_quant(qindex, 0) / 4.0;
Paul Wilkins's avatar
Paul Wilkins committed
44
45
}

46
int vp9_gfboost_qadjust(int qindex) {
47
48
49
50
  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);
Paul Wilkins's avatar
Paul Wilkins committed
51
52
}

53
static int kfboost_qadjust(int qindex) {
54
55
56
57
  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);
Paul Wilkins's avatar
Paul Wilkins committed
58
59
}

60
61
int vp9_bits_per_mb(FRAME_TYPE frame_type, int qindex,
                    double correction_factor) {
62
  const double q = vp9_convert_qindex_to_q(qindex);
63
  int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000;
Paul Wilkins's avatar
Paul Wilkins committed
64

65
  // q based adjustment to baseline enumerator
Paul Wilkins's avatar
Paul Wilkins committed
66
  enumerator += (int)(enumerator * q) >> 12;
67
68
  return (int)(0.5 + (enumerator * correction_factor / q));
}
John Koleszar's avatar
John Koleszar committed
69

70
void vp9_save_coding_context(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
71
  CODING_CONTEXT *const cc = &cpi->coding_context;
72
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
73

John Koleszar's avatar
John Koleszar committed
74
  // Stores a snapshot of key state variables which can subsequently be
75
  // restored with a call to vp9_restore_coding_context. These functions are
76
  // intended for use in a re-code loop in vp9_compress_frame where the
John Koleszar's avatar
John Koleszar committed
77
  // quantizer value is adjusted between loop iterations.
78
79
80
81
  vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
  vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
  vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);

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

John Koleszar's avatar
John Koleszar committed
84
  vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
85
             cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
John Koleszar's avatar
John Koleszar committed
86

87
88
  vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
  vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
89

90
  cc->fc = cm->fc;
91
}
John Koleszar's avatar
John Koleszar committed
92

93
void vp9_restore_coding_context(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
94
  CODING_CONTEXT *const cc = &cpi->coding_context;
95
  VP9_COMMON *cm = &cpi->common;
John Koleszar's avatar
John Koleszar committed
96

John Koleszar's avatar
John Koleszar committed
97
  // Restore key state variables to the snapshot state stored in the
98
  // previous call to vp9_save_coding_context.
99
100
101
102
  vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
  vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
  vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);

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

John Koleszar's avatar
John Koleszar committed
105
106
  vpx_memcpy(cm->last_frame_seg_map,
             cpi->coding_context.last_frame_seg_map_copy,
107
             (cm->mi_rows * cm->mi_cols));
John Koleszar's avatar
John Koleszar committed
108

109
110
  vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
  vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
111

112
  cm->fc = cc->fc;
John Koleszar's avatar
John Koleszar committed
113
114
}

115
116
void vp9_setup_key_frame(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
117

118
  vp9_setup_past_independence(cm);
John Koleszar's avatar
John Koleszar committed
119

John Koleszar's avatar
John Koleszar committed
120
121
  // interval before next GF
  cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
122
  /* All buffers are implicitly updated on key frames. */
123
124
  cpi->refresh_golden_frame = 1;
  cpi->refresh_alt_ref_frame = 1;
John Koleszar's avatar
John Koleszar committed
125
}
126

127
void vp9_setup_inter_frame(VP9_COMP *cpi) {
128
  VP9_COMMON *cm = &cpi->common;
Adrian Grange's avatar
Adrian Grange committed
129
  if (cm->error_resilient_mode || cm->intra_only)
130
    vp9_setup_past_independence(cm);
131

132
  assert(cm->frame_context_idx < NUM_FRAME_CONTEXTS);
133
  cm->fc = cm->frame_contexts[cm->frame_context_idx];
134
}
John Koleszar's avatar
John Koleszar committed
135

136
static int estimate_bits_at_q(int frame_kind, int q, int mbs,
John Koleszar's avatar
John Koleszar committed
137
                              double correction_factor) {
138
  const int bpm = (int)(vp9_bits_per_mb(frame_kind, q, correction_factor));
John Koleszar's avatar
John Koleszar committed
139

140
141
142
143
144
  // 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;
145
}
146
147


148
static void calc_iframe_target_size(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
149
150
  // boost defaults to half second
  int target;
John Koleszar's avatar
John Koleszar committed
151

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

John Koleszar's avatar
John Koleszar committed
155
156
  // New Two pass RC
  target = cpi->per_frame_bandwidth;
John Koleszar's avatar
John Koleszar committed
157

John Koleszar's avatar
John Koleszar committed
158
  if (cpi->oxcf.rc_max_intra_bitrate_pct) {
159
160
    int max_rate = cpi->per_frame_bandwidth
                 * cpi->oxcf.rc_max_intra_bitrate_pct / 100;
John Koleszar's avatar
John Koleszar committed
161

John Koleszar's avatar
John Koleszar committed
162
163
164
    if (target > max_rate)
      target = max_rate;
  }
John Koleszar's avatar
John Koleszar committed
165

John Koleszar's avatar
John Koleszar committed
166
  cpi->this_frame_target = target;
John Koleszar's avatar
John Koleszar committed
167
168
}

169

170
//  Do the best we can to define the parameters for the next GF based
Paul Wilkins's avatar
Paul Wilkins committed
171
//  on what information we have available.
172
173
174
//
//  In this experimental code only two pass is supported
//  so we just use the interval determined in the two pass code.
175
static void calc_gf_params(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
176
177
  // Set the gf interval
  cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
John Koleszar's avatar
John Koleszar committed
178
179
180
}


181
static void calc_pframe_target_size(VP9_COMP *cpi) {
182
183
  const int min_frame_target = MAX(cpi->min_frame_bandwidth,
                                   cpi->av_per_frame_bandwidth >> 5);
184
  if (cpi->refresh_alt_ref_frame) {
185
    // Special alt reference frame case
John Koleszar's avatar
John Koleszar committed
186
187
188
    // Per frame bit target for the alt ref frame
    cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
    cpi->this_frame_target = cpi->per_frame_bandwidth;
189
190
  } else {
    // Normal frames (gf,and inter)
John Koleszar's avatar
John Koleszar committed
191
192
    cpi->this_frame_target = cpi->per_frame_bandwidth;
  }
John Koleszar's avatar
John Koleszar committed
193

194
195
196
197
198
199
  // 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.
John Koleszar's avatar
John Koleszar committed
200
201
  if (cpi->this_frame_target < min_frame_target)
    cpi->this_frame_target = min_frame_target;
John Koleszar's avatar
John Koleszar committed
202

203
  if (!cpi->refresh_alt_ref_frame)
John Koleszar's avatar
John Koleszar committed
204
205
206
207
208
    // Note the baseline target data rate for this inter frame.
    cpi->inter_frame_target = cpi->this_frame_target;

  // Adjust target frame size for Golden Frames:
  if (cpi->frames_till_gf_update_due == 0) {
209
210
    const int q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME]
                                          : cpi->oxcf.fixed_q;
John Koleszar's avatar
John Koleszar committed
211

212
    cpi->refresh_golden_frame = 1;
213

John Koleszar's avatar
John Koleszar committed
214
215
216
217
218
219
220
221
222
223
    calc_gf_params(cpi);

    // 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
    if (!cpi->source_alt_ref_active) {
      if (cpi->oxcf.fixed_q < 0) {
        // The spend on the GF is defined in the two pass code
        // for two pass encodes
        cpi->this_frame_target = cpi->per_frame_bandwidth;
224
      } else {
John Koleszar's avatar
John Koleszar committed
225
        cpi->this_frame_target =
226
          (estimate_bits_at_q(1, q, cpi->common.MBs, 1.0)
John Koleszar's avatar
John Koleszar committed
227
           * cpi->last_boost) / 100;
228
229
230
      }
    } else {
      // If there is an active ARF at this location use the minimum
231
      // bits on this frame even if it is a constructed arf.
232
      // The active maximum quantizer insures that an appropriate
233
      // number of bits will be spent if needed for constructed ARFs.
John Koleszar's avatar
John Koleszar committed
234
      cpi->this_frame_target = 0;
John Koleszar's avatar
John Koleszar committed
235
    }
John Koleszar's avatar
John Koleszar committed
236
  }
John Koleszar's avatar
John Koleszar committed
237
238
239
}


240
void vp9_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
241
242
  const int q = cpi->common.base_qindex;
  int correction_factor = 100;
John Koleszar's avatar
John Koleszar committed
243
244
  double rate_correction_factor;
  double adjustment_limit;
John Koleszar's avatar
John Koleszar committed
245

246
  int projected_size_based_on_q = 0;
John Koleszar's avatar
John Koleszar committed
247

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

John Koleszar's avatar
John Koleszar committed
251
252
253
  if (cpi->common.frame_type == KEY_FRAME) {
    rate_correction_factor = cpi->key_frame_rate_correction_factor;
  } else {
254
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
John Koleszar's avatar
John Koleszar committed
255
      rate_correction_factor = cpi->gf_rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
256
    else
John Koleszar's avatar
John Koleszar committed
257
258
259
      rate_correction_factor = cpi->rate_correction_factor;
  }

260
261
  // 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
262
  // Stay in double to avoid int overflow when values are large
263
264
265
  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
266
267
268

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

272
273
  // More heavily damped adjustment used if we have been oscillating either side
  // of target.
John Koleszar's avatar
John Koleszar committed
274
  switch (damp_var) {
John Koleszar's avatar
John Koleszar committed
275
    case 0:
John Koleszar's avatar
John Koleszar committed
276
277
      adjustment_limit = 0.75;
      break;
John Koleszar's avatar
John Koleszar committed
278
    case 1:
John Koleszar's avatar
John Koleszar committed
279
280
      adjustment_limit = 0.375;
      break;
John Koleszar's avatar
John Koleszar committed
281
282
    case 2:
    default:
John Koleszar's avatar
John Koleszar committed
283
284
285
286
287
288
289
      adjustment_limit = 0.25;
      break;
  }

  // if ( (correction_factor > 102) && (Q < cpi->active_worst_quality) )
  if (correction_factor > 102) {
    // We are not already at the worst allowable quality
290
    correction_factor =
291
        (int)(100 + ((correction_factor - 100) * adjustment_limit));
292
293
    rate_correction_factor =
        ((rate_correction_factor * correction_factor) / 100);
John Koleszar's avatar
John Koleszar committed
294
295
296
297

    // Keep rate_correction_factor within limits
    if (rate_correction_factor > MAX_BPB_FACTOR)
      rate_correction_factor = MAX_BPB_FACTOR;
298
  } else if (correction_factor < 99) {
John Koleszar's avatar
John Koleszar committed
299
    // We are not already at the best allowable quality
300
    correction_factor =
301
        (int)(100 - ((100 - correction_factor) * adjustment_limit));
302
303
    rate_correction_factor =
        ((rate_correction_factor * correction_factor) / 100);
John Koleszar's avatar
John Koleszar committed
304
305
306
307
308
309

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

310
  if (cpi->common.frame_type == KEY_FRAME) {
John Koleszar's avatar
John Koleszar committed
311
    cpi->key_frame_rate_correction_factor = rate_correction_factor;
312
  } else {
313
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
John Koleszar's avatar
John Koleszar committed
314
      cpi->gf_rate_correction_factor = rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
315
    else
John Koleszar's avatar
John Koleszar committed
316
317
      cpi->rate_correction_factor = rate_correction_factor;
  }
John Koleszar's avatar
John Koleszar committed
318
319
320
}


321
int vp9_regulate_q(VP9_COMP *cpi, int target_bits_per_frame) {
322
  int q = cpi->active_worst_quality;
John Koleszar's avatar
John Koleszar committed
323

John Koleszar's avatar
John Koleszar committed
324
325
326
327
328
  int i;
  int last_error = INT_MAX;
  int target_bits_per_mb;
  int bits_per_mb_at_this_q;
  double correction_factor;
329

John Koleszar's avatar
John Koleszar committed
330
  // Select the appropriate correction factor based upon type of frame.
331
  if (cpi->common.frame_type == KEY_FRAME) {
John Koleszar's avatar
John Koleszar committed
332
    correction_factor = cpi->key_frame_rate_correction_factor;
333
  } else {
334
    if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame)
John Koleszar's avatar
John Koleszar committed
335
      correction_factor = cpi->gf_rate_correction_factor;
John Koleszar's avatar
John Koleszar committed
336
    else
John Koleszar's avatar
John Koleszar committed
337
338
      correction_factor = cpi->rate_correction_factor;
  }
John Koleszar's avatar
John Koleszar committed
339

340
341
  // Calculate required scaling factor based on target frame size and size of
  // frame produced using previous Q.
John Koleszar's avatar
John Koleszar committed
342
  if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
343
344
345
    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
346
  else
347
348
    target_bits_per_mb =
        (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
John Koleszar's avatar
John Koleszar committed
349

John Koleszar's avatar
John Koleszar committed
350
  i = cpi->active_best_quality;
John Koleszar's avatar
John Koleszar committed
351

John Koleszar's avatar
John Koleszar committed
352
  do {
353
354
    bits_per_mb_at_this_q = (int)vp9_bits_per_mb(cpi->common.frame_type, i,
                                                 correction_factor);
John Koleszar's avatar
John Koleszar committed
355

John Koleszar's avatar
John Koleszar committed
356
357
    if (bits_per_mb_at_this_q <= target_bits_per_mb) {
      if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
358
        q = i;
John Koleszar's avatar
John Koleszar committed
359
      else
360
        q = i - 1;
John Koleszar's avatar
John Koleszar committed
361

John Koleszar's avatar
John Koleszar committed
362
      break;
363
    } else {
John Koleszar's avatar
John Koleszar committed
364
      last_error = bits_per_mb_at_this_q - target_bits_per_mb;
365
    }
John Koleszar's avatar
John Koleszar committed
366
  } while (++i <= cpi->active_worst_quality);
John Koleszar's avatar
John Koleszar committed
367

368
  return q;
John Koleszar's avatar
John Koleszar committed
369
370
}

371

372
static int estimate_keyframe_frequency(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
373
  int i;
John Koleszar's avatar
John Koleszar committed
374

John Koleszar's avatar
John Koleszar committed
375
376
  // Average key frame frequency
  int av_key_frame_frequency = 0;
John Koleszar's avatar
John Koleszar committed
377

John Koleszar's avatar
John Koleszar committed
378
379
380
381
382
383
  /* First key frame at start of sequence is a special case. We have no
   * frequency data.
   */
  if (cpi->key_frame_count == 1) {
    /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
     * whichever is smaller.
384
     */
John Koleszar's avatar
John Koleszar committed
385
    int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1;
James Zern's avatar
James Zern committed
386
    av_key_frame_frequency = (int)cpi->output_framerate * 2;
John Koleszar's avatar
John Koleszar committed
387

John Koleszar's avatar
John Koleszar committed
388
389
    if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq)
      av_key_frame_frequency = cpi->oxcf.key_freq;
John Koleszar's avatar
John Koleszar committed
390

John Koleszar's avatar
John Koleszar committed
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
    cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1]
      = av_key_frame_frequency;
  } else {
    unsigned int total_weight = 0;
    int last_kf_interval =
      (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;

    /* reset keyframe context and calculate weighted average of last
     * KEY_FRAME_CONTEXT keyframes
     */
    for (i = 0; i < KEY_FRAME_CONTEXT; i++) {
      if (i < KEY_FRAME_CONTEXT - 1)
        cpi->prior_key_frame_distance[i]
          = cpi->prior_key_frame_distance[i + 1];
      else
        cpi->prior_key_frame_distance[i] = last_kf_interval;

      av_key_frame_frequency += prior_key_frame_weight[i]
                                * cpi->prior_key_frame_distance[i];
      total_weight += prior_key_frame_weight[i];
John Koleszar's avatar
John Koleszar committed
411
    }
John Koleszar's avatar
John Koleszar committed
412

413
    av_key_frame_frequency /= total_weight;
John Koleszar's avatar
John Koleszar committed
414
415
  }
  return av_key_frame_frequency;
416
417
418
}


419
void vp9_adjust_key_frame_context(VP9_COMP *cpi) {
John Koleszar's avatar
John Koleszar committed
420
  // Clear down mmx registers to allow floating point in what follows
421
  vp9_clear_system_state();
John Koleszar's avatar
John Koleszar committed
422

John Koleszar's avatar
John Koleszar committed
423
424
  cpi->frames_since_key = 0;
  cpi->key_frame_count++;
John Koleszar's avatar
John Koleszar committed
425
426
}

427

428
void vp9_compute_frame_size_bounds(VP9_COMP *cpi, int *frame_under_shoot_limit,
429
                                   int *frame_over_shoot_limit) {
John Koleszar's avatar
John Koleszar committed
430
431
432
433
434
435
436
437
438
439
  // Set-up bounds on acceptable frame size:
  if (cpi->oxcf.fixed_q >= 0) {
    // Fixed Q scenario: frame size never outranges target (there is no target!)
    *frame_under_shoot_limit = 0;
    *frame_over_shoot_limit  = INT_MAX;
  } else {
    if (cpi->common.frame_type == KEY_FRAME) {
      *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
      *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
    } else {
440
      if (cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) {
John Koleszar's avatar
John Koleszar committed
441
442
443
444
445
446
447
448
449
450
        *frame_over_shoot_limit  = cpi->this_frame_target * 9 / 8;
        *frame_under_shoot_limit = cpi->this_frame_target * 7 / 8;
      } else {
        // Stron overshoot limit for constrained quality
        if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
          *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
          *frame_under_shoot_limit = cpi->this_frame_target * 2 / 8;
        } else {
          *frame_over_shoot_limit  = cpi->this_frame_target * 11 / 8;
          *frame_under_shoot_limit = cpi->this_frame_target * 5 / 8;
John Koleszar's avatar
John Koleszar committed
451
        }
John Koleszar's avatar
John Koleszar committed
452
      }
John Koleszar's avatar
John Koleszar committed
453
    }
John Koleszar's avatar
John Koleszar committed
454
455
456
457
458
459
460
461
462

    // 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;
  }
John Koleszar's avatar
John Koleszar committed
463
}
464
465
466


// return of 0 means drop frame
467
468
int vp9_pick_frame_size(VP9_COMP *cpi) {
  VP9_COMMON *cm = &cpi->common;
469

John Koleszar's avatar
John Koleszar committed
470
471
472
473
  if (cm->frame_type == KEY_FRAME)
    calc_iframe_target_size(cpi);
  else
    calc_pframe_target_size(cpi);
474

John Koleszar's avatar
John Koleszar committed
475
  return 1;
476
}