• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  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.
9  */
10 
11 #include <assert.h>
12 #include <limits.h>
13 #include <math.h>
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17 
18 #include "vpx_mem/vpx_mem.h"
19 
20 #include "vp9/common/vp9_alloccommon.h"
21 #include "vp9/common/vp9_common.h"
22 #include "vp9/common/vp9_entropymode.h"
23 #include "vp9/common/vp9_quant_common.h"
24 #include "vp9/common/vp9_seg_common.h"
25 #include "vp9/common/vp9_systemdependent.h"
26 
27 #include "vp9/encoder/vp9_encodemv.h"
28 #include "vp9/encoder/vp9_ratectrl.h"
29 
30 #define DEFAULT_KF_BOOST 2000
31 #define DEFAULT_GF_BOOST 2000
32 
33 #define LIMIT_QRANGE_FOR_ALTREF_AND_KEY 1
34 
35 #define MIN_BPB_FACTOR 0.005
36 #define MAX_BPB_FACTOR 50
37 
38 // Bits Per MB at different Q (Multiplied by 512)
39 #define BPER_MB_NORMBITS    9
40 
41 // Tables relating active max Q to active min Q
42 static int kf_low_motion_minq[QINDEX_RANGE];
43 static int kf_high_motion_minq[QINDEX_RANGE];
44 static int gf_low_motion_minq[QINDEX_RANGE];
45 static int gf_high_motion_minq[QINDEX_RANGE];
46 static int inter_minq[QINDEX_RANGE];
47 static int afq_low_motion_minq[QINDEX_RANGE];
48 static int afq_high_motion_minq[QINDEX_RANGE];
49 static int gf_high = 2000;
50 static int gf_low = 400;
51 static int kf_high = 5000;
52 static int kf_low = 400;
53 
54 // Functions to compute the active minq lookup table entries based on a
55 // formulaic approach to facilitate easier adjustment of the Q tables.
56 // The formulae were derived from computing a 3rd order polynomial best
57 // fit to the original data (after plotting real maxq vs minq (not q index))
get_minq_index(double maxq,double x3,double x2,double x1)58 static int get_minq_index(double maxq, double x3, double x2, double x1) {
59   int i;
60   const double minqtarget = MIN(((x3 * maxq + x2) * maxq + x1) * maxq,
61                                 maxq);
62 
63   // Special case handling to deal with the step from q2.0
64   // down to lossless mode represented by q 1.0.
65   if (minqtarget <= 2.0)
66     return 0;
67 
68   for (i = 0; i < QINDEX_RANGE; i++)
69     if (minqtarget <= vp9_convert_qindex_to_q(i))
70       return i;
71 
72   return QINDEX_RANGE - 1;
73 }
74 
vp9_rc_init_minq_luts()75 void vp9_rc_init_minq_luts() {
76   int i;
77 
78   for (i = 0; i < QINDEX_RANGE; i++) {
79     const double maxq = vp9_convert_qindex_to_q(i);
80 
81     kf_low_motion_minq[i] = get_minq_index(maxq, 0.000001, -0.0004, 0.15);
82     kf_high_motion_minq[i] = get_minq_index(maxq, 0.000002, -0.0012, 0.50);
83     gf_low_motion_minq[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.32);
84     gf_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.50);
85     afq_low_motion_minq[i] = get_minq_index(maxq, 0.0000015, -0.0009, 0.33);
86     afq_high_motion_minq[i] = get_minq_index(maxq, 0.0000021, -0.00125, 0.55);
87     inter_minq[i] = get_minq_index(maxq, 0.00000271, -0.00113, 0.75);
88   }
89 }
90 
91 // These functions use formulaic calculations to make playing with the
92 // quantizer tables easier. If necessary they can be replaced by lookup
93 // tables if and when things settle down in the experimental bitstream
vp9_convert_qindex_to_q(int qindex)94 double vp9_convert_qindex_to_q(int qindex) {
95   // Convert the index to a real Q value (scaled down to match old Q values)
96   return vp9_ac_quant(qindex, 0) / 4.0;
97 }
98 
vp9_rc_bits_per_mb(FRAME_TYPE frame_type,int qindex,double correction_factor)99 int vp9_rc_bits_per_mb(FRAME_TYPE frame_type, int qindex,
100                        double correction_factor) {
101   const double q = vp9_convert_qindex_to_q(qindex);
102   int enumerator = frame_type == KEY_FRAME ? 3300000 : 2250000;
103 
104   // q based adjustment to baseline enumerator
105   enumerator += (int)(enumerator * q) >> 12;
106   return (int)(0.5 + (enumerator * correction_factor / q));
107 }
108 
vp9_save_coding_context(VP9_COMP * cpi)109 void vp9_save_coding_context(VP9_COMP *cpi) {
110   CODING_CONTEXT *const cc = &cpi->coding_context;
111   VP9_COMMON *cm = &cpi->common;
112 
113   // Stores a snapshot of key state variables which can subsequently be
114   // restored with a call to vp9_restore_coding_context. These functions are
115   // intended for use in a re-code loop in vp9_compress_frame where the
116   // quantizer value is adjusted between loop iterations.
117   vp9_copy(cc->nmvjointcost,  cpi->mb.nmvjointcost);
118   vp9_copy(cc->nmvcosts,  cpi->mb.nmvcosts);
119   vp9_copy(cc->nmvcosts_hp,  cpi->mb.nmvcosts_hp);
120 
121   vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
122 
123   vpx_memcpy(cpi->coding_context.last_frame_seg_map_copy,
124              cm->last_frame_seg_map, (cm->mi_rows * cm->mi_cols));
125 
126   vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
127   vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
128 
129   cc->fc = cm->fc;
130 }
131 
vp9_restore_coding_context(VP9_COMP * cpi)132 void vp9_restore_coding_context(VP9_COMP *cpi) {
133   CODING_CONTEXT *const cc = &cpi->coding_context;
134   VP9_COMMON *cm = &cpi->common;
135 
136   // Restore key state variables to the snapshot state stored in the
137   // previous call to vp9_save_coding_context.
138   vp9_copy(cpi->mb.nmvjointcost, cc->nmvjointcost);
139   vp9_copy(cpi->mb.nmvcosts, cc->nmvcosts);
140   vp9_copy(cpi->mb.nmvcosts_hp, cc->nmvcosts_hp);
141 
142   vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
143 
144   vpx_memcpy(cm->last_frame_seg_map,
145              cpi->coding_context.last_frame_seg_map_copy,
146              (cm->mi_rows * cm->mi_cols));
147 
148   vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
149   vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
150 
151   cm->fc = cc->fc;
152 }
153 
estimate_bits_at_q(int frame_kind,int q,int mbs,double correction_factor)154 static int estimate_bits_at_q(int frame_kind, int q, int mbs,
155                               double correction_factor) {
156   const int bpm = (int)(vp9_rc_bits_per_mb(frame_kind, q, correction_factor));
157 
158   // Attempt to retain reasonable accuracy without overflow. The cutoff is
159   // chosen such that the maximum product of Bpm and MBs fits 31 bits. The
160   // largest Bpm takes 20 bits.
161   return (mbs > (1 << 11)) ? (bpm >> BPER_MB_NORMBITS) * mbs
162                            : (bpm * mbs) >> BPER_MB_NORMBITS;
163 }
164 
vp9_rc_clamp_pframe_target_size(const VP9_COMP * const cpi,int target)165 int vp9_rc_clamp_pframe_target_size(const VP9_COMP *const cpi, int target) {
166   const RATE_CONTROL *rc = &cpi->rc;
167   const int min_frame_target = MAX(rc->min_frame_bandwidth,
168                                    rc->av_per_frame_bandwidth >> 5);
169   if (target < min_frame_target)
170     target = min_frame_target;
171   if (cpi->refresh_golden_frame && rc->is_src_frame_alt_ref) {
172     // If there is an active ARF at this location use the minimum
173     // bits on this frame even if it is a constructed arf.
174     // The active maximum quantizer insures that an appropriate
175     // number of bits will be spent if needed for constructed ARFs.
176     target = min_frame_target;
177   }
178   // Clip the frame target to the maximum allowed value.
179   if (target > rc->max_frame_bandwidth)
180     target = rc->max_frame_bandwidth;
181   return target;
182 }
183 
vp9_rc_clamp_iframe_target_size(const VP9_COMP * const cpi,int target)184 int vp9_rc_clamp_iframe_target_size(const VP9_COMP *const cpi, int target) {
185   const RATE_CONTROL *rc = &cpi->rc;
186   const VP9_CONFIG *oxcf = &cpi->oxcf;
187   if (oxcf->rc_max_intra_bitrate_pct) {
188     const int max_rate = rc->av_per_frame_bandwidth *
189         oxcf->rc_max_intra_bitrate_pct / 100;
190     target = MIN(target, max_rate);
191   }
192   if (target > rc->max_frame_bandwidth)
193     target = rc->max_frame_bandwidth;
194   return target;
195 }
196 
197 
198 // Update the buffer level for higher layers, given the encoded current layer.
update_layer_buffer_level(VP9_COMP * const cpi,int encoded_frame_size)199 static void update_layer_buffer_level(VP9_COMP *const cpi,
200                                       int encoded_frame_size) {
201   int temporal_layer = 0;
202   int current_temporal_layer = cpi->svc.temporal_layer_id;
203   for (temporal_layer = current_temporal_layer + 1;
204       temporal_layer < cpi->svc.number_temporal_layers; ++temporal_layer) {
205     LAYER_CONTEXT *lc = &cpi->svc.layer_context[temporal_layer];
206     RATE_CONTROL *lrc = &lc->rc;
207     int bits_off_for_this_layer = (int)(lc->target_bandwidth / lc->framerate -
208         encoded_frame_size);
209     lrc->bits_off_target += bits_off_for_this_layer;
210 
211     // Clip buffer level to maximum buffer size for the layer.
212     lrc->bits_off_target = MIN(lrc->bits_off_target, lc->maximum_buffer_size);
213     lrc->buffer_level = lrc->bits_off_target;
214   }
215 }
216 
217 // Update the buffer level: leaky bucket model.
update_buffer_level(VP9_COMP * cpi,int encoded_frame_size)218 static void update_buffer_level(VP9_COMP *cpi, int encoded_frame_size) {
219   const VP9_COMMON *const cm = &cpi->common;
220   const VP9_CONFIG *oxcf = &cpi->oxcf;
221   RATE_CONTROL *const rc = &cpi->rc;
222 
223   // Non-viewable frames are a special case and are treated as pure overhead.
224   if (!cm->show_frame) {
225     rc->bits_off_target -= encoded_frame_size;
226   } else {
227     rc->bits_off_target += rc->av_per_frame_bandwidth - encoded_frame_size;
228   }
229 
230   // Clip the buffer level to the maximum specified buffer size.
231   rc->bits_off_target = MIN(rc->bits_off_target, oxcf->maximum_buffer_size);
232   rc->buffer_level = rc->bits_off_target;
233 
234   if (cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
235     update_layer_buffer_level(cpi, encoded_frame_size);
236   }
237 }
238 
vp9_rc_drop_frame(VP9_COMP * cpi)239 int vp9_rc_drop_frame(VP9_COMP *cpi) {
240   const VP9_CONFIG *oxcf = &cpi->oxcf;
241   RATE_CONTROL *const rc = &cpi->rc;
242 
243   if (!oxcf->drop_frames_water_mark) {
244     return 0;
245   } else {
246     if (rc->buffer_level < 0) {
247       // Always drop if buffer is below 0.
248       return 1;
249     } else {
250       // If buffer is below drop_mark, for now just drop every other frame
251       // (starting with the next frame) until it increases back over drop_mark.
252       int drop_mark = (int)(oxcf->drop_frames_water_mark *
253           oxcf->optimal_buffer_level / 100);
254       if ((rc->buffer_level > drop_mark) &&
255           (rc->decimation_factor > 0)) {
256         --rc->decimation_factor;
257       } else if (rc->buffer_level <= drop_mark &&
258           rc->decimation_factor == 0) {
259         rc->decimation_factor = 1;
260       }
261       if (rc->decimation_factor > 0) {
262         if (rc->decimation_count > 0) {
263           --rc->decimation_count;
264           return 1;
265         } else {
266           rc->decimation_count = rc->decimation_factor;
267           return 0;
268         }
269       } else {
270         rc->decimation_count = 0;
271         return 0;
272       }
273     }
274   }
275 }
276 
get_rate_correction_factor(const VP9_COMP * cpi)277 static double get_rate_correction_factor(const VP9_COMP *cpi) {
278   if (cpi->common.frame_type == KEY_FRAME) {
279     return cpi->rc.key_frame_rate_correction_factor;
280   } else {
281     if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
282         !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
283       return cpi->rc.gf_rate_correction_factor;
284     else
285       return cpi->rc.rate_correction_factor;
286   }
287 }
288 
set_rate_correction_factor(VP9_COMP * cpi,double factor)289 static void set_rate_correction_factor(VP9_COMP *cpi, double factor) {
290   if (cpi->common.frame_type == KEY_FRAME) {
291     cpi->rc.key_frame_rate_correction_factor = factor;
292   } else {
293     if ((cpi->refresh_alt_ref_frame || cpi->refresh_golden_frame) &&
294         !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER))
295       cpi->rc.gf_rate_correction_factor = factor;
296     else
297       cpi->rc.rate_correction_factor = factor;
298   }
299 }
300 
vp9_rc_update_rate_correction_factors(VP9_COMP * cpi,int damp_var)301 void vp9_rc_update_rate_correction_factors(VP9_COMP *cpi, int damp_var) {
302   const int q = cpi->common.base_qindex;
303   int correction_factor = 100;
304   double rate_correction_factor = get_rate_correction_factor(cpi);
305   double adjustment_limit;
306 
307   int projected_size_based_on_q = 0;
308 
309   // Clear down mmx registers to allow floating point in what follows
310   vp9_clear_system_state();
311 
312   // Work out how big we would have expected the frame to be at this Q given
313   // the current correction factor.
314   // Stay in double to avoid int overflow when values are large
315   projected_size_based_on_q = estimate_bits_at_q(cpi->common.frame_type, q,
316                                                  cpi->common.MBs,
317                                                  rate_correction_factor);
318   // Work out a size correction factor.
319   if (projected_size_based_on_q > 0)
320     correction_factor = (100 * cpi->rc.projected_frame_size) /
321                             projected_size_based_on_q;
322 
323   // More heavily damped adjustment used if we have been oscillating either side
324   // of target.
325   switch (damp_var) {
326     case 0:
327       adjustment_limit = 0.75;
328       break;
329     case 1:
330       adjustment_limit = 0.375;
331       break;
332     case 2:
333     default:
334       adjustment_limit = 0.25;
335       break;
336   }
337 
338   if (correction_factor > 102) {
339     // We are not already at the worst allowable quality
340     correction_factor =
341         (int)(100 + ((correction_factor - 100) * adjustment_limit));
342     rate_correction_factor =
343         ((rate_correction_factor * correction_factor) / 100);
344 
345     // Keep rate_correction_factor within limits
346     if (rate_correction_factor > MAX_BPB_FACTOR)
347       rate_correction_factor = MAX_BPB_FACTOR;
348   } else if (correction_factor < 99) {
349     // We are not already at the best allowable quality
350     correction_factor =
351         (int)(100 - ((100 - correction_factor) * adjustment_limit));
352     rate_correction_factor =
353         ((rate_correction_factor * correction_factor) / 100);
354 
355     // Keep rate_correction_factor within limits
356     if (rate_correction_factor < MIN_BPB_FACTOR)
357       rate_correction_factor = MIN_BPB_FACTOR;
358   }
359 
360   set_rate_correction_factor(cpi, rate_correction_factor);
361 }
362 
363 
vp9_rc_regulate_q(const VP9_COMP * cpi,int target_bits_per_frame,int active_best_quality,int active_worst_quality)364 int vp9_rc_regulate_q(const VP9_COMP *cpi, int target_bits_per_frame,
365                       int active_best_quality, int active_worst_quality) {
366   const VP9_COMMON *const cm = &cpi->common;
367   int q = active_worst_quality;
368   int last_error = INT_MAX;
369   int i, target_bits_per_mb;
370   const double correction_factor = get_rate_correction_factor(cpi);
371 
372   // Calculate required scaling factor based on target frame size and size of
373   // frame produced using previous Q.
374   if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS))
375     // Case where we would overflow int
376     target_bits_per_mb = (target_bits_per_frame / cm->MBs) << BPER_MB_NORMBITS;
377   else
378     target_bits_per_mb = (target_bits_per_frame << BPER_MB_NORMBITS) / cm->MBs;
379 
380   i = active_best_quality;
381 
382   do {
383     const int bits_per_mb_at_this_q = (int)vp9_rc_bits_per_mb(cm->frame_type, i,
384                                                              correction_factor);
385 
386     if (bits_per_mb_at_this_q <= target_bits_per_mb) {
387       if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error)
388         q = i;
389       else
390         q = i - 1;
391 
392       break;
393     } else {
394       last_error = bits_per_mb_at_this_q - target_bits_per_mb;
395     }
396   } while (++i <= active_worst_quality);
397 
398   return q;
399 }
400 
get_active_quality(int q,int gfu_boost,int low,int high,int * low_motion_minq,int * high_motion_minq)401 static int get_active_quality(int q, int gfu_boost, int low, int high,
402                               int *low_motion_minq, int *high_motion_minq) {
403   if (gfu_boost > high) {
404     return low_motion_minq[q];
405   } else if (gfu_boost < low) {
406     return high_motion_minq[q];
407   } else {
408     const int gap = high - low;
409     const int offset = high - gfu_boost;
410     const int qdiff = high_motion_minq[q] - low_motion_minq[q];
411     const int adjustment = ((offset * qdiff) + (gap >> 1)) / gap;
412     return low_motion_minq[q] + adjustment;
413   }
414 }
415 
calc_active_worst_quality_one_pass_vbr(const VP9_COMP * cpi)416 static int calc_active_worst_quality_one_pass_vbr(const VP9_COMP *cpi) {
417   const RATE_CONTROL *const rc = &cpi->rc;
418   const unsigned int curr_frame = cpi->common.current_video_frame;
419   int active_worst_quality;
420 
421   if (cpi->common.frame_type == KEY_FRAME) {
422     active_worst_quality = curr_frame == 0 ? rc->worst_quality
423                                            : rc->last_q[KEY_FRAME] * 2;
424   } else {
425     if (!rc->is_src_frame_alt_ref &&
426         (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
427       active_worst_quality =  curr_frame == 1 ? rc->last_q[KEY_FRAME] * 5 / 4
428                                               : rc->last_q[INTER_FRAME];
429     } else {
430       active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 2
431                                              : rc->last_q[INTER_FRAME] * 2;
432     }
433   }
434 
435   return MIN(active_worst_quality, rc->worst_quality);
436 }
437 
438 // Adjust active_worst_quality level based on buffer level.
calc_active_worst_quality_one_pass_cbr(const VP9_COMP * cpi)439 static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) {
440   // Adjust active_worst_quality: If buffer is above the optimal/target level,
441   // bring active_worst_quality down depending on fullness of buffer.
442   // If buffer is below the optimal level, let the active_worst_quality go from
443   // ambient Q (at buffer = optimal level) to worst_quality level
444   // (at buffer = critical level).
445   const VP9_CONFIG *oxcf = &cpi->oxcf;
446   const RATE_CONTROL *rc = &cpi->rc;
447   // Buffer level below which we push active_worst to worst_quality.
448   int64_t critical_level = oxcf->optimal_buffer_level >> 2;
449   int64_t buff_lvl_step = 0;
450   int adjustment = 0;
451   int active_worst_quality;
452   if (cpi->common.frame_type == KEY_FRAME)
453     return rc->worst_quality;
454   if (cpi->common.current_video_frame > 1)
455     active_worst_quality = MIN(rc->worst_quality,
456                                rc->avg_frame_qindex[INTER_FRAME] * 5 / 4);
457   else
458     active_worst_quality = MIN(rc->worst_quality,
459                                rc->avg_frame_qindex[KEY_FRAME] * 3 / 2);
460   if (rc->buffer_level > oxcf->optimal_buffer_level) {
461     // Adjust down.
462     // Maximum limit for down adjustment, ~30%.
463     int max_adjustment_down = active_worst_quality / 3;
464     if (max_adjustment_down) {
465       buff_lvl_step = ((oxcf->maximum_buffer_size -
466                         oxcf->optimal_buffer_level) / max_adjustment_down);
467       if (buff_lvl_step)
468         adjustment = (int)((rc->buffer_level - oxcf->optimal_buffer_level) /
469                             buff_lvl_step);
470       active_worst_quality -= adjustment;
471     }
472   } else if (rc->buffer_level > critical_level) {
473     // Adjust up from ambient Q.
474     if (critical_level) {
475       buff_lvl_step = (oxcf->optimal_buffer_level - critical_level);
476       if (buff_lvl_step) {
477         adjustment =
478             (int)((rc->worst_quality - rc->avg_frame_qindex[INTER_FRAME]) *
479                   (oxcf->optimal_buffer_level - rc->buffer_level) /
480                   buff_lvl_step);
481       }
482       active_worst_quality = rc->avg_frame_qindex[INTER_FRAME] + adjustment;
483     }
484   } else {
485     // Set to worst_quality if buffer is below critical level.
486     active_worst_quality = rc->worst_quality;
487   }
488   return active_worst_quality;
489 }
490 
rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP * cpi,int * bottom_index,int * top_index)491 static int rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi,
492                                              int *bottom_index,
493                                              int *top_index) {
494   const VP9_COMMON *const cm = &cpi->common;
495   const RATE_CONTROL *const rc = &cpi->rc;
496   int active_best_quality;
497   int active_worst_quality = calc_active_worst_quality_one_pass_cbr(cpi);
498   int q;
499 
500   if (frame_is_intra_only(cm)) {
501     active_best_quality = rc->best_quality;
502     // Handle the special case for key frames forced when we have75 reached
503     // the maximum key frame interval. Here force the Q to a range
504     // based on the ambient Q to reduce the risk of popping.
505     if (rc->this_key_frame_forced) {
506       int qindex = rc->last_boosted_qindex;
507       double last_boosted_q = vp9_convert_qindex_to_q(qindex);
508       int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
509                                             (last_boosted_q * 0.75));
510       active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
511     } else if (cm->current_video_frame > 0) {
512       // not first frame of one pass and kf_boost is set
513       double q_adj_factor = 1.0;
514       double q_val;
515 
516       active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME],
517                                                rc->kf_boost,
518                                                kf_low, kf_high,
519                                                kf_low_motion_minq,
520                                                kf_high_motion_minq);
521 
522       // Allow somewhat lower kf minq with small image formats.
523       if ((cm->width * cm->height) <= (352 * 288)) {
524         q_adj_factor -= 0.25;
525       }
526 
527       // Convert the adjustment factor to a qindex delta
528       // on active_best_quality.
529       q_val = vp9_convert_qindex_to_q(active_best_quality);
530       active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
531                                                    q_adj_factor);
532     }
533   } else if (!rc->is_src_frame_alt_ref &&
534              !cpi->use_svc &&
535              (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
536     // Use the lower of active_worst_quality and recent
537     // average Q as basis for GF/ARF best Q limit unless last frame was
538     // a key frame.
539     if (rc->frames_since_key > 1 &&
540         rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
541       q = rc->avg_frame_qindex[INTER_FRAME];
542     } else {
543       q = active_worst_quality;
544     }
545     active_best_quality = get_active_quality(
546         q, rc->gfu_boost, gf_low, gf_high,
547         gf_low_motion_minq, gf_high_motion_minq);
548   } else {
549     // Use the lower of active_worst_quality and recent/average Q.
550     if (cm->current_video_frame > 1) {
551       if (rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality)
552         active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]];
553       else
554         active_best_quality = inter_minq[active_worst_quality];
555     } else {
556       if (rc->avg_frame_qindex[KEY_FRAME] < active_worst_quality)
557         active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]];
558       else
559         active_best_quality = inter_minq[active_worst_quality];
560     }
561   }
562 
563   // Clip the active best and worst quality values to limits
564   active_best_quality = clamp(active_best_quality,
565                               rc->best_quality, rc->worst_quality);
566   active_worst_quality = clamp(active_worst_quality,
567                                active_best_quality, rc->worst_quality);
568 
569   *top_index = active_worst_quality;
570   *bottom_index = active_best_quality;
571 
572 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
573   // Limit Q range for the adaptive loop.
574   if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
575     if (!(cm->current_video_frame == 0))
576       *top_index = (active_worst_quality + active_best_quality * 3) / 4;
577   }
578 #endif
579   // Special case code to try and match quality with forced key frames
580   if (cm->frame_type == KEY_FRAME && rc->this_key_frame_forced) {
581     q = rc->last_boosted_qindex;
582   } else {
583     q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
584                           active_best_quality, active_worst_quality);
585     if (q > *top_index) {
586       // Special case when we are targeting the max allowed rate
587       if (cpi->rc.this_frame_target >= cpi->rc.max_frame_bandwidth)
588         *top_index = q;
589       else
590         q = *top_index;
591     }
592   }
593   assert(*top_index <= rc->worst_quality &&
594          *top_index >= rc->best_quality);
595   assert(*bottom_index <= rc->worst_quality &&
596          *bottom_index >= rc->best_quality);
597   assert(q <= rc->worst_quality && q >= rc->best_quality);
598   return q;
599 }
600 
rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP * cpi,int * bottom_index,int * top_index)601 static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi,
602                                              int *bottom_index,
603                                              int *top_index) {
604   const VP9_COMMON *const cm = &cpi->common;
605   const RATE_CONTROL *const rc = &cpi->rc;
606   const VP9_CONFIG *const oxcf = &cpi->oxcf;
607   int active_best_quality;
608   int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi);
609   int q;
610 
611   if (frame_is_intra_only(cm)) {
612     active_best_quality = rc->best_quality;
613 #if !CONFIG_MULTIPLE_ARF
614     // Handle the special case for key frames forced when we have75 reached
615     // the maximum key frame interval. Here force the Q to a range
616     // based on the ambient Q to reduce the risk of popping.
617     if (rc->this_key_frame_forced) {
618       int qindex = rc->last_boosted_qindex;
619       double last_boosted_q = vp9_convert_qindex_to_q(qindex);
620       int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
621                                             (last_boosted_q * 0.75));
622       active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
623     } else if (cm->current_video_frame > 0) {
624       // not first frame of one pass and kf_boost is set
625       double q_adj_factor = 1.0;
626       double q_val;
627 
628       active_best_quality = get_active_quality(rc->avg_frame_qindex[KEY_FRAME],
629                                                rc->kf_boost,
630                                                kf_low, kf_high,
631                                                kf_low_motion_minq,
632                                                kf_high_motion_minq);
633 
634       // Allow somewhat lower kf minq with small image formats.
635       if ((cm->width * cm->height) <= (352 * 288)) {
636         q_adj_factor -= 0.25;
637       }
638 
639       // Convert the adjustment factor to a qindex delta
640       // on active_best_quality.
641       q_val = vp9_convert_qindex_to_q(active_best_quality);
642       active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
643                                                    q_adj_factor);
644     }
645 #else
646     double current_q;
647     // Force the KF quantizer to be 30% of the active_worst_quality.
648     current_q = vp9_convert_qindex_to_q(active_worst_quality);
649     active_best_quality = active_worst_quality
650         + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
651 #endif
652   } else if (!rc->is_src_frame_alt_ref &&
653              (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
654     // Use the lower of active_worst_quality and recent
655     // average Q as basis for GF/ARF best Q limit unless last frame was
656     // a key frame.
657     if (rc->frames_since_key > 1 &&
658         rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
659       q = rc->avg_frame_qindex[INTER_FRAME];
660     } else {
661       q = rc->avg_frame_qindex[KEY_FRAME];
662     }
663     // For constrained quality dont allow Q less than the cq level
664     if (oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) {
665       if (q < cpi->cq_target_quality)
666         q = cpi->cq_target_quality;
667       if (rc->frames_since_key > 1) {
668         active_best_quality = get_active_quality(q, rc->gfu_boost,
669                                                  gf_low, gf_high,
670                                                  afq_low_motion_minq,
671                                                  afq_high_motion_minq);
672       } else {
673         active_best_quality = get_active_quality(q, rc->gfu_boost,
674                                                  gf_low, gf_high,
675                                                  gf_low_motion_minq,
676                                                  gf_high_motion_minq);
677       }
678       // Constrained quality use slightly lower active best.
679       active_best_quality = active_best_quality * 15 / 16;
680 
681     } else if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
682       if (!cpi->refresh_alt_ref_frame) {
683         active_best_quality = cpi->cq_target_quality;
684       } else {
685         if (rc->frames_since_key > 1) {
686           active_best_quality = get_active_quality(
687               q, rc->gfu_boost, gf_low, gf_high,
688               afq_low_motion_minq, afq_high_motion_minq);
689         } else {
690           active_best_quality = get_active_quality(
691               q, rc->gfu_boost, gf_low, gf_high,
692               gf_low_motion_minq, gf_high_motion_minq);
693         }
694       }
695     } else {
696       active_best_quality = get_active_quality(
697           q, rc->gfu_boost, gf_low, gf_high,
698           gf_low_motion_minq, gf_high_motion_minq);
699     }
700   } else {
701     if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
702       active_best_quality = cpi->cq_target_quality;
703     } else {
704       // Use the lower of active_worst_quality and recent/average Q.
705       if (cm->current_video_frame > 1)
706         active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]];
707       else
708         active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]];
709       // For the constrained quality mode we don't want
710       // q to fall below the cq level.
711       if ((oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) &&
712           (active_best_quality < cpi->cq_target_quality)) {
713         // If we are strongly undershooting the target rate in the last
714         // frames then use the user passed in cq value not the auto
715         // cq value.
716         if (rc->rolling_actual_bits < rc->min_frame_bandwidth)
717           active_best_quality = oxcf->cq_level;
718         else
719           active_best_quality = cpi->cq_target_quality;
720       }
721     }
722   }
723 
724   // Clip the active best and worst quality values to limits
725   active_best_quality = clamp(active_best_quality,
726                               rc->best_quality, rc->worst_quality);
727   active_worst_quality = clamp(active_worst_quality,
728                                active_best_quality, rc->worst_quality);
729 
730   *top_index = active_worst_quality;
731   *bottom_index = active_best_quality;
732 
733 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
734   // Limit Q range for the adaptive loop.
735   if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
736     if (!(cm->current_video_frame == 0))
737       *top_index = (active_worst_quality + active_best_quality * 3) / 4;
738   } else if (!rc->is_src_frame_alt_ref &&
739              (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
740     *top_index = (active_worst_quality + active_best_quality) / 2;
741   }
742 #endif
743   if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
744     q = active_best_quality;
745   // Special case code to try and match quality with forced key frames
746   } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) {
747     q = rc->last_boosted_qindex;
748   } else {
749     q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
750                           active_best_quality, active_worst_quality);
751     if (q > *top_index) {
752       // Special case when we are targeting the max allowed rate
753       if (cpi->rc.this_frame_target >= cpi->rc.max_frame_bandwidth)
754         *top_index = q;
755       else
756         q = *top_index;
757     }
758   }
759 #if CONFIG_MULTIPLE_ARF
760   // Force the quantizer determined by the coding order pattern.
761   if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
762       cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
763     double new_q;
764     double current_q = vp9_convert_qindex_to_q(active_worst_quality);
765     int level = cpi->this_frame_weight;
766     assert(level >= 0);
767     new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
768     q = active_worst_quality +
769         vp9_compute_qdelta(cpi, current_q, new_q);
770 
771     *bottom_index = q;
772     *top_index    = q;
773     printf("frame:%d q:%d\n", cm->current_video_frame, q);
774   }
775 #endif
776   assert(*top_index <= rc->worst_quality &&
777          *top_index >= rc->best_quality);
778   assert(*bottom_index <= rc->worst_quality &&
779          *bottom_index >= rc->best_quality);
780   assert(q <= rc->worst_quality && q >= rc->best_quality);
781   return q;
782 }
783 
rc_pick_q_and_bounds_two_pass(const VP9_COMP * cpi,int * bottom_index,int * top_index)784 static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi,
785                                          int *bottom_index,
786                                          int *top_index) {
787   const VP9_COMMON *const cm = &cpi->common;
788   const RATE_CONTROL *const rc = &cpi->rc;
789   const VP9_CONFIG *const oxcf = &cpi->oxcf;
790   int active_best_quality;
791   int active_worst_quality = cpi->twopass.active_worst_quality;
792   int q;
793 
794   if (frame_is_intra_only(cm)) {
795 #if !CONFIG_MULTIPLE_ARF
796     // Handle the special case for key frames forced when we have75 reached
797     // the maximum key frame interval. Here force the Q to a range
798     // based on the ambient Q to reduce the risk of popping.
799     if (rc->this_key_frame_forced) {
800       int qindex = rc->last_boosted_qindex;
801       double last_boosted_q = vp9_convert_qindex_to_q(qindex);
802       int delta_qindex = vp9_compute_qdelta(cpi, last_boosted_q,
803                                             (last_boosted_q * 0.75));
804       active_best_quality = MAX(qindex + delta_qindex, rc->best_quality);
805     } else {
806       // Not forced keyframe.
807       double q_adj_factor = 1.0;
808       double q_val;
809       // Baseline value derived from cpi->active_worst_quality and kf boost.
810       active_best_quality = get_active_quality(active_worst_quality,
811                                                rc->kf_boost,
812                                                kf_low, kf_high,
813                                                kf_low_motion_minq,
814                                                kf_high_motion_minq);
815 
816       // Allow somewhat lower kf minq with small image formats.
817       if ((cm->width * cm->height) <= (352 * 288)) {
818         q_adj_factor -= 0.25;
819       }
820 
821       // Make a further adjustment based on the kf zero motion measure.
822       q_adj_factor += 0.05 - (0.001 * (double)cpi->twopass.kf_zeromotion_pct);
823 
824       // Convert the adjustment factor to a qindex delta
825       // on active_best_quality.
826       q_val = vp9_convert_qindex_to_q(active_best_quality);
827       active_best_quality += vp9_compute_qdelta(cpi, q_val, q_val *
828                                                    q_adj_factor);
829     }
830 #else
831     double current_q;
832     // Force the KF quantizer to be 30% of the active_worst_quality.
833     current_q = vp9_convert_qindex_to_q(active_worst_quality);
834     active_best_quality = active_worst_quality
835         + vp9_compute_qdelta(cpi, current_q, current_q * 0.3);
836 #endif
837   } else if (!rc->is_src_frame_alt_ref &&
838              (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
839     // Use the lower of active_worst_quality and recent
840     // average Q as basis for GF/ARF best Q limit unless last frame was
841     // a key frame.
842     if (rc->frames_since_key > 1 &&
843         rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) {
844       q = rc->avg_frame_qindex[INTER_FRAME];
845     } else {
846       q = active_worst_quality;
847     }
848     // For constrained quality dont allow Q less than the cq level
849     if (oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) {
850       if (q < cpi->cq_target_quality)
851         q = cpi->cq_target_quality;
852       if (rc->frames_since_key > 1) {
853         active_best_quality = get_active_quality(q, rc->gfu_boost,
854                                                  gf_low, gf_high,
855                                                  afq_low_motion_minq,
856                                                  afq_high_motion_minq);
857       } else {
858         active_best_quality = get_active_quality(q, rc->gfu_boost,
859                                                  gf_low, gf_high,
860                                                  gf_low_motion_minq,
861                                                  gf_high_motion_minq);
862       }
863       // Constrained quality use slightly lower active best.
864       active_best_quality = active_best_quality * 15 / 16;
865 
866     } else if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
867       if (!cpi->refresh_alt_ref_frame) {
868         active_best_quality = cpi->cq_target_quality;
869       } else {
870         if (rc->frames_since_key > 1) {
871           active_best_quality = get_active_quality(
872               q, rc->gfu_boost, gf_low, gf_high,
873               afq_low_motion_minq, afq_high_motion_minq);
874         } else {
875           active_best_quality = get_active_quality(
876               q, rc->gfu_boost, gf_low, gf_high,
877               gf_low_motion_minq, gf_high_motion_minq);
878         }
879       }
880     } else {
881       active_best_quality = get_active_quality(
882           q, rc->gfu_boost, gf_low, gf_high,
883           gf_low_motion_minq, gf_high_motion_minq);
884     }
885   } else {
886     if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
887       active_best_quality = cpi->cq_target_quality;
888     } else {
889       active_best_quality = inter_minq[active_worst_quality];
890 
891       // For the constrained quality mode we don't want
892       // q to fall below the cq level.
893       if ((oxcf->end_usage == USAGE_CONSTRAINED_QUALITY) &&
894           (active_best_quality < cpi->cq_target_quality)) {
895         // If we are strongly undershooting the target rate in the last
896         // frames then use the user passed in cq value not the auto
897         // cq value.
898         if (rc->rolling_actual_bits < rc->min_frame_bandwidth)
899           active_best_quality = oxcf->cq_level;
900         else
901           active_best_quality = cpi->cq_target_quality;
902       }
903     }
904   }
905 
906   // Clip the active best and worst quality values to limits.
907   active_best_quality = clamp(active_best_quality,
908                               rc->best_quality, rc->worst_quality);
909   active_worst_quality = clamp(active_worst_quality,
910                                active_best_quality, rc->worst_quality);
911 
912   *top_index = active_worst_quality;
913   *bottom_index = active_best_quality;
914 
915 #if LIMIT_QRANGE_FOR_ALTREF_AND_KEY
916   // Limit Q range for the adaptive loop.
917   if (cm->frame_type == KEY_FRAME && !rc->this_key_frame_forced) {
918     *top_index = (active_worst_quality + active_best_quality * 3) / 4;
919   } else if (!rc->is_src_frame_alt_ref &&
920              (oxcf->end_usage != USAGE_STREAM_FROM_SERVER) &&
921              (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) {
922     *top_index = (active_worst_quality + active_best_quality) / 2;
923   }
924 #endif
925 
926   if (oxcf->end_usage == USAGE_CONSTANT_QUALITY) {
927     q = active_best_quality;
928   // Special case code to try and match quality with forced key frames.
929   } else if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced) {
930     q = rc->last_boosted_qindex;
931   } else {
932     q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
933                           active_best_quality, active_worst_quality);
934     if (q > *top_index) {
935       // Special case when we are targeting the max allowed rate.
936       if (rc->this_frame_target >= rc->max_frame_bandwidth)
937         *top_index = q;
938       else
939         q = *top_index;
940     }
941   }
942 #if CONFIG_MULTIPLE_ARF
943   // Force the quantizer determined by the coding order pattern.
944   if (cpi->multi_arf_enabled && (cm->frame_type != KEY_FRAME) &&
945       cpi->oxcf.end_usage != USAGE_CONSTANT_QUALITY) {
946     double new_q;
947     double current_q = vp9_convert_qindex_to_q(active_worst_quality);
948     int level = cpi->this_frame_weight;
949     assert(level >= 0);
950     new_q = current_q * (1.0 - (0.2 * (cpi->max_arf_level - level)));
951     q = active_worst_quality +
952         vp9_compute_qdelta(cpi, current_q, new_q);
953 
954     *bottom_index = q;
955     *top_index    = q;
956     printf("frame:%d q:%d\n", cm->current_video_frame, q);
957   }
958 #endif
959   assert(*top_index <= rc->worst_quality &&
960          *top_index >= rc->best_quality);
961   assert(*bottom_index <= rc->worst_quality &&
962          *bottom_index >= rc->best_quality);
963   assert(q <= rc->worst_quality && q >= rc->best_quality);
964   return q;
965 }
966 
vp9_rc_pick_q_and_bounds(const VP9_COMP * cpi,int * bottom_index,int * top_index)967 int vp9_rc_pick_q_and_bounds(const VP9_COMP *cpi,
968                              int *bottom_index,
969                              int *top_index) {
970   int q;
971   if (cpi->pass == 0) {
972     if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
973       q = rc_pick_q_and_bounds_one_pass_cbr(cpi, bottom_index, top_index);
974     else
975       q = rc_pick_q_and_bounds_one_pass_vbr(cpi, bottom_index, top_index);
976   } else {
977     q = rc_pick_q_and_bounds_two_pass(cpi, bottom_index, top_index);
978   }
979 
980   // Q of 0 is disabled because we force tx size to be
981   // 16x16...
982   if (cpi->sf.use_nonrd_pick_mode) {
983     if (q == 0)
984       q++;
985     if (cpi->sf.force_frame_boost == 1)
986       q -= cpi->sf.max_delta_qindex;
987 
988     if (q < *bottom_index)
989       *bottom_index = q;
990     else if (q > *top_index)
991       *top_index = q;
992   }
993   return q;
994 }
995 
vp9_rc_compute_frame_size_bounds(const VP9_COMP * cpi,int this_frame_target,int * frame_under_shoot_limit,int * frame_over_shoot_limit)996 void vp9_rc_compute_frame_size_bounds(const VP9_COMP *cpi,
997                                       int this_frame_target,
998                                       int *frame_under_shoot_limit,
999                                       int *frame_over_shoot_limit) {
1000   // Set-up bounds on acceptable frame size:
1001   if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
1002     *frame_under_shoot_limit = 0;
1003     *frame_over_shoot_limit  = INT_MAX;
1004   } else {
1005     int recode_tolerance =
1006       (cpi->sf.recode_tolerance * this_frame_target) / 100;
1007 
1008     *frame_over_shoot_limit = this_frame_target + recode_tolerance;
1009     *frame_under_shoot_limit = this_frame_target - recode_tolerance;
1010 
1011     // For very small rate targets where the fractional adjustment
1012     // may be tiny make sure there is at least a minimum range.
1013     *frame_over_shoot_limit += 200;
1014     *frame_under_shoot_limit -= 200;
1015     if (*frame_under_shoot_limit < 0)
1016       *frame_under_shoot_limit = 0;
1017 
1018     // Clip to maximum allowed rate for a frame.
1019     if (*frame_over_shoot_limit > cpi->rc.max_frame_bandwidth) {
1020       *frame_over_shoot_limit = cpi->rc.max_frame_bandwidth;
1021     }
1022   }
1023 }
1024 
vp9_rc_set_frame_target(VP9_COMP * cpi,int target)1025 void vp9_rc_set_frame_target(VP9_COMP *cpi, int target) {
1026   const VP9_COMMON *const cm = &cpi->common;
1027   RATE_CONTROL *const rc = &cpi->rc;
1028 
1029   rc->this_frame_target = target;
1030   // Target rate per SB64 (including partial SB64s.
1031   rc->sb64_target_rate = ((int64_t)rc->this_frame_target * 64 * 64) /
1032                              (cm->width * cm->height);
1033 }
1034 
update_alt_ref_frame_stats(VP9_COMP * cpi)1035 static void update_alt_ref_frame_stats(VP9_COMP *cpi) {
1036   // this frame refreshes means next frames don't unless specified by user
1037   cpi->rc.frames_since_golden = 0;
1038 
1039 #if CONFIG_MULTIPLE_ARF
1040   if (!cpi->multi_arf_enabled)
1041 #endif
1042     // Clear the alternate reference update pending flag.
1043     cpi->rc.source_alt_ref_pending = 0;
1044 
1045   // Set the alternate reference frame active flag
1046   cpi->rc.source_alt_ref_active = 1;
1047 }
1048 
update_golden_frame_stats(VP9_COMP * cpi)1049 static void update_golden_frame_stats(VP9_COMP *cpi) {
1050   RATE_CONTROL *const rc = &cpi->rc;
1051 
1052   // Update the Golden frame usage counts.
1053   if (cpi->refresh_golden_frame) {
1054     // this frame refreshes means next frames don't unless specified by user
1055     rc->frames_since_golden = 0;
1056 
1057     if (!rc->source_alt_ref_pending)
1058       rc->source_alt_ref_active = 0;
1059 
1060     // Decrement count down till next gf
1061     if (rc->frames_till_gf_update_due > 0)
1062       rc->frames_till_gf_update_due--;
1063 
1064   } else if (!cpi->refresh_alt_ref_frame) {
1065     // Decrement count down till next gf
1066     if (rc->frames_till_gf_update_due > 0)
1067       rc->frames_till_gf_update_due--;
1068 
1069     rc->frames_since_golden++;
1070   }
1071 }
1072 
vp9_rc_postencode_update(VP9_COMP * cpi,uint64_t bytes_used)1073 void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) {
1074   VP9_COMMON *const cm = &cpi->common;
1075   RATE_CONTROL *const rc = &cpi->rc;
1076 
1077   cm->last_frame_type = cm->frame_type;
1078   // Update rate control heuristics
1079   rc->projected_frame_size = (int)(bytes_used << 3);
1080 
1081   // Post encode loop adjustment of Q prediction.
1082   vp9_rc_update_rate_correction_factors(
1083       cpi, (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF ||
1084             cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) ? 2 : 0);
1085 
1086   // Keep a record of last Q and ambient average Q.
1087   if (cm->frame_type == KEY_FRAME) {
1088     rc->last_q[KEY_FRAME] = cm->base_qindex;
1089     rc->avg_frame_qindex[KEY_FRAME] = ROUND_POWER_OF_TWO(
1090         3 * rc->avg_frame_qindex[KEY_FRAME] + cm->base_qindex, 2);
1091   } else if (!rc->is_src_frame_alt_ref &&
1092       (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame) &&
1093       !(cpi->use_svc && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)) {
1094     rc->last_q[2] = cm->base_qindex;
1095     rc->avg_frame_qindex[2] = ROUND_POWER_OF_TWO(
1096         3 * rc->avg_frame_qindex[2] + cm->base_qindex, 2);
1097   } else {
1098     rc->last_q[INTER_FRAME] = cm->base_qindex;
1099     rc->avg_frame_qindex[INTER_FRAME] = ROUND_POWER_OF_TWO(
1100         3 * rc->avg_frame_qindex[INTER_FRAME] + cm->base_qindex, 2);
1101     rc->ni_frames++;
1102     rc->tot_q += vp9_convert_qindex_to_q(cm->base_qindex);
1103     rc->avg_q = rc->tot_q / (double)rc->ni_frames;
1104 
1105     // Calculate the average Q for normal inter frames (not key or GFU frames).
1106     rc->ni_tot_qi += cm->base_qindex;
1107     rc->ni_av_qi = rc->ni_tot_qi / rc->ni_frames;
1108   }
1109 
1110   // Keep record of last boosted (KF/KF/ARF) Q value.
1111   // If the current frame is coded at a lower Q then we also update it.
1112   // If all mbs in this group are skipped only update if the Q value is
1113   // better than that already stored.
1114   // This is used to help set quality in forced key frames to reduce popping
1115   if ((cm->base_qindex < rc->last_boosted_qindex) ||
1116       ((cpi->static_mb_pct < 100) &&
1117        ((cm->frame_type == KEY_FRAME) || cpi->refresh_alt_ref_frame ||
1118         (cpi->refresh_golden_frame && !rc->is_src_frame_alt_ref)))) {
1119     rc->last_boosted_qindex = cm->base_qindex;
1120   }
1121 
1122   update_buffer_level(cpi, rc->projected_frame_size);
1123 
1124   // Rolling monitors of whether we are over or underspending used to help
1125   // regulate min and Max Q in two pass.
1126   if (cm->frame_type != KEY_FRAME) {
1127     rc->rolling_target_bits = ROUND_POWER_OF_TWO(
1128         rc->rolling_target_bits * 3 + rc->this_frame_target, 2);
1129     rc->rolling_actual_bits = ROUND_POWER_OF_TWO(
1130         rc->rolling_actual_bits * 3 + rc->projected_frame_size, 2);
1131     rc->long_rolling_target_bits = ROUND_POWER_OF_TWO(
1132         rc->long_rolling_target_bits * 31 + rc->this_frame_target, 5);
1133     rc->long_rolling_actual_bits = ROUND_POWER_OF_TWO(
1134         rc->long_rolling_actual_bits * 31 + rc->projected_frame_size, 5);
1135   }
1136 
1137   // Actual bits spent
1138   rc->total_actual_bits += rc->projected_frame_size;
1139   rc->total_target_bits += (cm->show_frame ? rc->av_per_frame_bandwidth : 0);
1140 
1141   rc->total_target_vs_actual = rc->total_actual_bits - rc->total_target_bits;
1142 
1143   if (cpi->oxcf.play_alternate && cpi->refresh_alt_ref_frame &&
1144       (cm->frame_type != KEY_FRAME))
1145     // Update the alternate reference frame stats as appropriate.
1146     update_alt_ref_frame_stats(cpi);
1147   else
1148     // Update the Golden frame stats as appropriate.
1149     update_golden_frame_stats(cpi);
1150 
1151   if (cm->frame_type == KEY_FRAME)
1152     rc->frames_since_key = 0;
1153   if (cm->show_frame) {
1154     rc->frames_since_key++;
1155     rc->frames_to_key--;
1156   }
1157 }
1158 
vp9_rc_postencode_update_drop_frame(VP9_COMP * cpi)1159 void vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) {
1160   // Update buffer level with zero size, update frame counters, and return.
1161   update_buffer_level(cpi, 0);
1162   cpi->common.last_frame_type = cpi->common.frame_type;
1163   cpi->rc.frames_since_key++;
1164   cpi->rc.frames_to_key--;
1165 }
1166 
test_for_kf_one_pass(VP9_COMP * cpi)1167 static int test_for_kf_one_pass(VP9_COMP *cpi) {
1168   // Placeholder function for auto key frame
1169   return 0;
1170 }
1171 // Use this macro to turn on/off use of alt-refs in one-pass mode.
1172 #define USE_ALTREF_FOR_ONE_PASS   1
1173 
calc_pframe_target_size_one_pass_vbr(const VP9_COMP * const cpi)1174 static int calc_pframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) {
1175   static const int af_ratio = 10;
1176   const RATE_CONTROL *const rc = &cpi->rc;
1177   int target;
1178 #if USE_ALTREF_FOR_ONE_PASS
1179   target = (!rc->is_src_frame_alt_ref &&
1180             (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) ?
1181       (rc->av_per_frame_bandwidth * rc->baseline_gf_interval * af_ratio) /
1182       (rc->baseline_gf_interval + af_ratio - 1) :
1183       (rc->av_per_frame_bandwidth * rc->baseline_gf_interval) /
1184       (rc->baseline_gf_interval + af_ratio - 1);
1185 #else
1186   target = rc->av_per_frame_bandwidth;
1187 #endif
1188   return vp9_rc_clamp_pframe_target_size(cpi, target);
1189 }
1190 
calc_iframe_target_size_one_pass_vbr(const VP9_COMP * const cpi)1191 static int calc_iframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) {
1192   static const int kf_ratio = 25;
1193   const RATE_CONTROL *rc = &cpi->rc;
1194   int target = rc->av_per_frame_bandwidth * kf_ratio;
1195   return vp9_rc_clamp_iframe_target_size(cpi, target);
1196 }
1197 
vp9_rc_get_one_pass_vbr_params(VP9_COMP * cpi)1198 void vp9_rc_get_one_pass_vbr_params(VP9_COMP *cpi) {
1199   VP9_COMMON *const cm = &cpi->common;
1200   RATE_CONTROL *const rc = &cpi->rc;
1201   int target;
1202   if (!cpi->refresh_alt_ref_frame &&
1203       (cm->current_video_frame == 0 ||
1204        (cm->frame_flags & FRAMEFLAGS_KEY) ||
1205        rc->frames_to_key == 0 ||
1206        (cpi->oxcf.auto_key && test_for_kf_one_pass(cpi)))) {
1207     cm->frame_type = KEY_FRAME;
1208     rc->this_key_frame_forced = cm->current_video_frame != 0 &&
1209                                 rc->frames_to_key == 0;
1210     rc->frames_to_key = cpi->key_frame_frequency;
1211     rc->kf_boost = DEFAULT_KF_BOOST;
1212     rc->source_alt_ref_active = 0;
1213   } else {
1214     cm->frame_type = INTER_FRAME;
1215   }
1216   if (rc->frames_till_gf_update_due == 0) {
1217     rc->baseline_gf_interval = DEFAULT_GF_INTERVAL;
1218     rc->frames_till_gf_update_due = rc->baseline_gf_interval;
1219     // NOTE: frames_till_gf_update_due must be <= frames_to_key.
1220     if (rc->frames_till_gf_update_due > rc->frames_to_key)
1221       rc->frames_till_gf_update_due = rc->frames_to_key;
1222     cpi->refresh_golden_frame = 1;
1223     rc->source_alt_ref_pending = USE_ALTREF_FOR_ONE_PASS;
1224     rc->gfu_boost = DEFAULT_GF_BOOST;
1225   }
1226   if (cm->frame_type == KEY_FRAME)
1227     target = calc_iframe_target_size_one_pass_vbr(cpi);
1228   else
1229     target = calc_pframe_target_size_one_pass_vbr(cpi);
1230   vp9_rc_set_frame_target(cpi, target);
1231 }
1232 
calc_pframe_target_size_one_pass_cbr(const VP9_COMP * cpi)1233 static int calc_pframe_target_size_one_pass_cbr(const VP9_COMP *cpi) {
1234   const VP9_CONFIG *oxcf = &cpi->oxcf;
1235   const RATE_CONTROL *rc = &cpi->rc;
1236   const int64_t diff = oxcf->optimal_buffer_level - rc->buffer_level;
1237   const int64_t one_pct_bits = 1 + oxcf->optimal_buffer_level / 100;
1238   int min_frame_target = MAX(rc->av_per_frame_bandwidth >> 4,
1239                              FRAME_OVERHEAD_BITS);
1240   int target = rc->av_per_frame_bandwidth;
1241   if (cpi->svc.number_temporal_layers > 1 &&
1242       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1243     // Note that for layers, av_per_frame_bandwidth is the cumulative
1244     // per-frame-bandwidth. For the target size of this frame, use the
1245     // layer average frame size (i.e., non-cumulative per-frame-bw).
1246     int current_temporal_layer = cpi->svc.temporal_layer_id;
1247     const LAYER_CONTEXT *lc = &cpi->svc.layer_context[current_temporal_layer];
1248     target = lc->avg_frame_size;
1249     min_frame_target = MAX(lc->avg_frame_size >> 4, FRAME_OVERHEAD_BITS);
1250   }
1251   if (diff > 0) {
1252     // Lower the target bandwidth for this frame.
1253     const int pct_low = (int)MIN(diff / one_pct_bits, oxcf->under_shoot_pct);
1254     target -= (target * pct_low) / 200;
1255   } else if (diff < 0) {
1256     // Increase the target bandwidth for this frame.
1257     const int pct_high = (int)MIN(-diff / one_pct_bits, oxcf->over_shoot_pct);
1258     target += (target * pct_high) / 200;
1259   }
1260   return MAX(min_frame_target, target);
1261 }
1262 
calc_iframe_target_size_one_pass_cbr(const VP9_COMP * cpi)1263 static int calc_iframe_target_size_one_pass_cbr(const VP9_COMP *cpi) {
1264   const RATE_CONTROL *rc = &cpi->rc;
1265   int target;
1266 
1267   if (cpi->common.current_video_frame == 0) {
1268     target = ((cpi->oxcf.starting_buffer_level / 2) > INT_MAX)
1269       ? INT_MAX : (int)(cpi->oxcf.starting_buffer_level / 2);
1270   } else {
1271     const int initial_boost = 32;
1272     int kf_boost = MAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
1273     if (rc->frames_since_key < cpi->output_framerate / 2) {
1274       kf_boost = (int)(kf_boost * rc->frames_since_key /
1275                        (cpi->output_framerate / 2));
1276     }
1277     target = ((16 + kf_boost) * rc->av_per_frame_bandwidth) >> 4;
1278   }
1279   return vp9_rc_clamp_iframe_target_size(cpi, target);
1280 }
1281 
vp9_rc_get_svc_params(VP9_COMP * cpi)1282 void vp9_rc_get_svc_params(VP9_COMP *cpi) {
1283   VP9_COMMON *const cm = &cpi->common;
1284   RATE_CONTROL *const rc = &cpi->rc;
1285   int target = rc->av_per_frame_bandwidth;
1286   if ((cm->current_video_frame == 0) ||
1287       (cm->frame_flags & FRAMEFLAGS_KEY) ||
1288       (cpi->oxcf.auto_key && (rc->frames_since_key %
1289                               cpi->key_frame_frequency == 0))) {
1290     cm->frame_type = KEY_FRAME;
1291     rc->source_alt_ref_active = 0;
1292     if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1293       target = calc_iframe_target_size_one_pass_cbr(cpi);
1294     }
1295   } else {
1296     cm->frame_type = INTER_FRAME;
1297     if (cpi->pass == 0 && cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1298       target = calc_pframe_target_size_one_pass_cbr(cpi);
1299     }
1300   }
1301   vp9_rc_set_frame_target(cpi, target);
1302   rc->frames_till_gf_update_due = INT_MAX;
1303   rc->baseline_gf_interval = INT_MAX;
1304 }
1305 
vp9_rc_get_one_pass_cbr_params(VP9_COMP * cpi)1306 void vp9_rc_get_one_pass_cbr_params(VP9_COMP *cpi) {
1307   VP9_COMMON *const cm = &cpi->common;
1308   RATE_CONTROL *const rc = &cpi->rc;
1309   int target;
1310   if ((cm->current_video_frame == 0 ||
1311       (cm->frame_flags & FRAMEFLAGS_KEY) ||
1312       rc->frames_to_key == 0 ||
1313       (cpi->oxcf.auto_key && test_for_kf_one_pass(cpi)))) {
1314     cm->frame_type = KEY_FRAME;
1315     rc->this_key_frame_forced = cm->current_video_frame != 0 &&
1316                                 rc->frames_to_key == 0;
1317     rc->frames_to_key = cpi->key_frame_frequency;
1318     rc->kf_boost = DEFAULT_KF_BOOST;
1319     rc->source_alt_ref_active = 0;
1320     target = calc_iframe_target_size_one_pass_cbr(cpi);
1321   } else {
1322     cm->frame_type = INTER_FRAME;
1323     target = calc_pframe_target_size_one_pass_cbr(cpi);
1324   }
1325   vp9_rc_set_frame_target(cpi, target);
1326   // Don't use gf_update by default in CBR mode.
1327   rc->frames_till_gf_update_due = INT_MAX;
1328   rc->baseline_gf_interval = INT_MAX;
1329 }
1330