• 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 <stdlib.h>
12 #include <stdio.h>
13 #include <string.h>
14 #include <limits.h>
15 #include <assert.h>
16 
17 #include "math.h"
18 #include "vp8/common/common.h"
19 #include "ratectrl.h"
20 #include "vp8/common/entropymode.h"
21 #include "vpx_mem/vpx_mem.h"
22 #include "vp8/common/systemdependent.h"
23 #include "encodemv.h"
24 #include "vpx_dsp/vpx_dsp_common.h"
25 #include "vpx_ports/system_state.h"
26 
27 #define MIN_BPB_FACTOR 0.01
28 #define MAX_BPB_FACTOR 50
29 
30 extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES];
31 
32 #ifdef MODE_STATS
33 extern int y_modes[5];
34 extern int uv_modes[4];
35 extern int b_modes[10];
36 
37 extern int inter_y_modes[10];
38 extern int inter_uv_modes[4];
39 extern int inter_b_modes[10];
40 #endif
41 
42 /* Bits Per MB at different Q (Multiplied by 512) */
43 #define BPER_MB_NORMBITS 9
44 
45 /* Work in progress recalibration of baseline rate tables based on
46  * the assumption that bits per mb is inversely proportional to the
47  * quantizer value.
48  */
49 const int vp8_bits_per_mb[2][QINDEX_RANGE] = {
50   /* Intra case 450000/Qintra */
51   {
52       1125000, 900000, 750000, 642857, 562500, 500000, 450000, 450000, 409090,
53       375000,  346153, 321428, 300000, 281250, 264705, 264705, 250000, 236842,
54       225000,  225000, 214285, 214285, 204545, 204545, 195652, 195652, 187500,
55       180000,  180000, 173076, 166666, 160714, 155172, 150000, 145161, 140625,
56       136363,  132352, 128571, 125000, 121621, 121621, 118421, 115384, 112500,
57       109756,  107142, 104651, 102272, 100000, 97826,  97826,  95744,  93750,
58       91836,   90000,  88235,  86538,  84905,  83333,  81818,  80357,  78947,
59       77586,   76271,  75000,  73770,  72580,  71428,  70312,  69230,  68181,
60       67164,   66176,  65217,  64285,  63380,  62500,  61643,  60810,  60000,
61       59210,   59210,  58441,  57692,  56962,  56250,  55555,  54878,  54216,
62       53571,   52941,  52325,  51724,  51136,  50561,  49450,  48387,  47368,
63       46875,   45918,  45000,  44554,  44117,  43269,  42452,  41666,  40909,
64       40178,   39473,  38793,  38135,  36885,  36290,  35714,  35156,  34615,
65       34090,   33582,  33088,  32608,  32142,  31468,  31034,  30405,  29801,
66       29220,   28662,
67   },
68   /* Inter case 285000/Qinter */
69   {
70       712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090, 237500,
71       219230, 203571, 190000, 178125, 167647, 158333, 150000, 142500, 135714,
72       129545, 123913, 118750, 114000, 109615, 105555, 101785, 98275,  95000,
73       91935,  89062,  86363,  83823,  81428,  79166,  77027,  75000,  73076,
74       71250,  69512,  67857,  66279,  64772,  63333,  61956,  60638,  59375,
75       58163,  57000,  55882,  54807,  53773,  52777,  51818,  50892,  50000,
76       49137,  47500,  45967,  44531,  43181,  41911,  40714,  39583,  38513,
77       37500,  36538,  35625,  34756,  33928,  33139,  32386,  31666,  30978,
78       30319,  29687,  29081,  28500,  27941,  27403,  26886,  26388,  25909,
79       25446,  25000,  24568,  23949,  23360,  22800,  22265,  21755,  21268,
80       20802,  20357,  19930,  19520,  19127,  18750,  18387,  18037,  17701,
81       17378,  17065,  16764,  16473,  16101,  15745,  15405,  15079,  14766,
82       14467,  14179,  13902,  13636,  13380,  13133,  12895,  12666,  12445,
83       12179,  11924,  11632,  11445,  11220,  11003,  10795,  10594,  10401,
84       10215,  10035,
85   }
86 };
87 
88 static const int kf_boost_qadjustment[QINDEX_RANGE] = {
89   128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142,
90   143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157,
91   158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172,
92   173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187,
93   188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 200, 201,
94   201, 202, 203, 203, 203, 204, 204, 205, 205, 206, 206, 207, 207, 208, 208,
95   209, 209, 210, 210, 211, 211, 212, 212, 213, 213, 214, 214, 215, 215, 216,
96   216, 217, 217, 218, 218, 219, 219, 220, 220, 220, 220, 220, 220, 220, 220,
97   220, 220, 220, 220, 220, 220, 220, 220,
98 };
99 
100 /* #define GFQ_ADJUSTMENT (Q+100) */
101 #define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
102 const int vp8_gf_boost_qadjustment[QINDEX_RANGE] = {
103   80,  82,  84,  86,  88,  90,  92,  94,  96,  97,  98,  99,  100, 101, 102,
104   103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
105   118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132,
106   133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147,
107   148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162,
108   163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177,
109   178, 179, 180, 181, 182, 183, 184, 184, 185, 185, 186, 186, 187, 187, 188,
110   188, 189, 189, 190, 190, 191, 191, 192, 192, 193, 193, 194, 194, 194, 194,
111   195, 195, 196, 196, 197, 197, 198, 198
112 };
113 
114 /*
115 const int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
116 {
117     100,101,102,103,104,105,105,106,
118     106,107,107,108,109,109,110,111,
119     112,113,114,115,116,117,118,119,
120     120,121,122,123,124,125,126,127,
121     128,129,130,131,132,133,134,135,
122     136,137,138,139,140,141,142,143,
123     144,145,146,147,148,149,150,151,
124     152,153,154,155,156,157,158,159,
125     160,161,162,163,164,165,166,167,
126     168,169,170,170,171,171,172,172,
127     173,173,173,174,174,174,175,175,
128     175,176,176,176,177,177,177,177,
129     178,178,179,179,180,180,181,181,
130     182,182,183,183,184,184,185,185,
131     186,186,187,187,188,188,189,189,
132     190,190,191,191,192,192,193,193,
133 };
134 */
135 
136 static const int kf_gf_boost_qlimits[QINDEX_RANGE] = {
137   150, 155, 160, 165, 170, 175, 180, 185, 190, 195, 200, 205, 210, 215, 220,
138   225, 230, 235, 240, 245, 250, 255, 260, 265, 270, 275, 280, 285, 290, 295,
139   300, 305, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430,
140   440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580,
141   590, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
142   600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
143   600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
144   600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600, 600,
145   600, 600, 600, 600, 600, 600, 600, 600,
146 };
147 
148 static const int gf_adjust_table[101] = {
149   100, 115, 130, 145, 160, 175, 190, 200, 210, 220, 230, 240, 260, 270, 280,
150   290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 400, 400, 400,
151   400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
152   400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
153   400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
154   400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
155   400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
156 };
157 
158 static const int gf_intra_usage_adjustment[20] = {
159   125, 120, 115, 110, 105, 100, 95, 85, 80, 75,
160   70,  65,  60,  55,  50,  50,  50, 50, 50, 50,
161 };
162 
163 static const int gf_interval_table[101] = {
164   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,
165   7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,
166   8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,  8,
167   9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,  9,
168   9,  9,  9,  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
169   10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
170 };
171 
172 static const unsigned int prior_key_frame_weight[KEY_FRAME_CONTEXT] = { 1, 2, 3,
173                                                                         4, 5 };
174 
vp8_save_coding_context(VP8_COMP * cpi)175 void vp8_save_coding_context(VP8_COMP *cpi) {
176   CODING_CONTEXT *const cc = &cpi->coding_context;
177 
178   /* Stores a snapshot of key state variables which can subsequently be
179    * restored with a call to vp8_restore_coding_context. These functions are
180    * intended for use in a re-code loop in vp8_compress_frame where the
181    * quantizer value is adjusted between loop iterations.
182    */
183 
184   cc->frames_since_key = cpi->frames_since_key;
185   cc->filter_level = cpi->common.filter_level;
186   cc->frames_till_gf_update_due = cpi->frames_till_gf_update_due;
187   cc->frames_since_golden = cpi->frames_since_golden;
188 
189   vp8_copy(cc->mvc, cpi->common.fc.mvc);
190   vp8_copy(cc->mvcosts, cpi->rd_costs.mvcosts);
191 
192   vp8_copy(cc->ymode_prob, cpi->common.fc.ymode_prob);
193   vp8_copy(cc->uv_mode_prob, cpi->common.fc.uv_mode_prob);
194 
195   vp8_copy(cc->ymode_count, cpi->mb.ymode_count);
196   vp8_copy(cc->uv_mode_count, cpi->mb.uv_mode_count);
197 
198 /* Stats */
199 #ifdef MODE_STATS
200   vp8_copy(cc->y_modes, y_modes);
201   vp8_copy(cc->uv_modes, uv_modes);
202   vp8_copy(cc->b_modes, b_modes);
203   vp8_copy(cc->inter_y_modes, inter_y_modes);
204   vp8_copy(cc->inter_uv_modes, inter_uv_modes);
205   vp8_copy(cc->inter_b_modes, inter_b_modes);
206 #endif
207 
208   cc->this_frame_percent_intra = cpi->this_frame_percent_intra;
209 }
210 
vp8_restore_coding_context(VP8_COMP * cpi)211 void vp8_restore_coding_context(VP8_COMP *cpi) {
212   CODING_CONTEXT *const cc = &cpi->coding_context;
213 
214   /* Restore key state variables to the snapshot state stored in the
215    * previous call to vp8_save_coding_context.
216    */
217 
218   cpi->frames_since_key = cc->frames_since_key;
219   cpi->common.filter_level = cc->filter_level;
220   cpi->frames_till_gf_update_due = cc->frames_till_gf_update_due;
221   cpi->frames_since_golden = cc->frames_since_golden;
222 
223   vp8_copy(cpi->common.fc.mvc, cc->mvc);
224 
225   vp8_copy(cpi->rd_costs.mvcosts, cc->mvcosts);
226 
227   vp8_copy(cpi->common.fc.ymode_prob, cc->ymode_prob);
228   vp8_copy(cpi->common.fc.uv_mode_prob, cc->uv_mode_prob);
229 
230   vp8_copy(cpi->mb.ymode_count, cc->ymode_count);
231   vp8_copy(cpi->mb.uv_mode_count, cc->uv_mode_count);
232 
233 /* Stats */
234 #ifdef MODE_STATS
235   vp8_copy(y_modes, cc->y_modes);
236   vp8_copy(uv_modes, cc->uv_modes);
237   vp8_copy(b_modes, cc->b_modes);
238   vp8_copy(inter_y_modes, cc->inter_y_modes);
239   vp8_copy(inter_uv_modes, cc->inter_uv_modes);
240   vp8_copy(inter_b_modes, cc->inter_b_modes);
241 #endif
242 
243   cpi->this_frame_percent_intra = cc->this_frame_percent_intra;
244 }
245 
vp8_setup_key_frame(VP8_COMP * cpi)246 void vp8_setup_key_frame(VP8_COMP *cpi) {
247   /* Setup for Key frame: */
248 
249   vp8_default_coef_probs(&cpi->common);
250 
251   memcpy(cpi->common.fc.mvc, vp8_default_mv_context,
252          sizeof(vp8_default_mv_context));
253   {
254     int flag[2] = { 1, 1 };
255     vp8_build_component_cost_table(
256         cpi->mb.mvcost, (const MV_CONTEXT *)cpi->common.fc.mvc, flag);
257   }
258 
259   /* Make sure we initialize separate contexts for altref,gold, and normal.
260    * TODO shouldn't need 3 different copies of structure to do this!
261    */
262   memcpy(&cpi->lfc_a, &cpi->common.fc, sizeof(cpi->common.fc));
263   memcpy(&cpi->lfc_g, &cpi->common.fc, sizeof(cpi->common.fc));
264   memcpy(&cpi->lfc_n, &cpi->common.fc, sizeof(cpi->common.fc));
265 
266   cpi->common.filter_level = cpi->common.base_qindex * 3 / 8;
267 
268   /* Provisional interval before next GF */
269   if (cpi->auto_gold) {
270     cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
271   } else {
272     cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
273   }
274 
275   cpi->common.refresh_golden_frame = 1;
276   cpi->common.refresh_alt_ref_frame = 1;
277 }
278 
estimate_bits_at_q(int frame_kind,int Q,int MBs,double correction_factor)279 static int estimate_bits_at_q(int frame_kind, int Q, int MBs,
280                               double correction_factor) {
281   int Bpm = (int)(.5 + correction_factor * vp8_bits_per_mb[frame_kind][Q]);
282 
283   /* Attempt to retain reasonable accuracy without overflow. The cutoff is
284    * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
285    * largest Bpm takes 20 bits.
286    */
287   if (MBs > (1 << 11)) {
288     return (Bpm >> BPER_MB_NORMBITS) * MBs;
289   } else {
290     return (Bpm * MBs) >> BPER_MB_NORMBITS;
291   }
292 }
293 
calc_iframe_target_size(VP8_COMP * cpi)294 static void calc_iframe_target_size(VP8_COMP *cpi) {
295   /* boost defaults to half second */
296   int kf_boost;
297   uint64_t target;
298 
299   /* Clear down mmx registers to allow floating point in what follows */
300   vpx_clear_system_state();
301 
302   if (cpi->oxcf.fixed_q >= 0) {
303     int Q = cpi->oxcf.key_q;
304 
305     target = estimate_bits_at_q(INTRA_FRAME, Q, cpi->common.MBs,
306                                 cpi->key_frame_rate_correction_factor);
307   } else if (cpi->pass == 2) {
308     /* New Two pass RC */
309     target = cpi->per_frame_bandwidth;
310   }
311   /* First Frame is a special case */
312   else if (cpi->common.current_video_frame == 0) {
313     /* 1 Pass there is no information on which to base size so use
314      * bandwidth per second * fraction of the initial buffer
315      * level
316      */
317     target = cpi->oxcf.starting_buffer_level / 2;
318 
319     if (target > cpi->oxcf.target_bandwidth * 3 / 2) {
320       target = cpi->oxcf.target_bandwidth * 3 / 2;
321     }
322   } else {
323     /* if this keyframe was forced, use a more recent Q estimate */
324     int Q = (cpi->common.frame_flags & FRAMEFLAGS_KEY) ? cpi->avg_frame_qindex
325                                                        : cpi->ni_av_qi;
326 
327     int initial_boost = 32; /* |3.0 * per_frame_bandwidth| */
328     /* Boost depends somewhat on frame rate: only used for 1 layer case. */
329     if (cpi->oxcf.number_of_layers == 1) {
330       kf_boost = VPXMAX(initial_boost, (int)(2 * cpi->output_framerate - 16));
331     } else {
332       /* Initial factor: set target size to: |3.0 * per_frame_bandwidth|. */
333       kf_boost = initial_boost;
334     }
335 
336     /* adjustment up based on q: this factor ranges from ~1.2 to 2.2. */
337     kf_boost = kf_boost * kf_boost_qadjustment[Q] / 100;
338 
339     /* frame separation adjustment ( down) */
340     if (cpi->frames_since_key < cpi->output_framerate / 2) {
341       kf_boost =
342           (int)(kf_boost * cpi->frames_since_key / (cpi->output_framerate / 2));
343     }
344 
345     /* Minimal target size is |2* per_frame_bandwidth|. */
346     if (kf_boost < 16) kf_boost = 16;
347 
348     target = ((16 + kf_boost) * cpi->per_frame_bandwidth) >> 4;
349   }
350 
351   if (cpi->oxcf.rc_max_intra_bitrate_pct) {
352     unsigned int max_rate;
353     // This product may overflow unsigned int
354     uint64_t product = cpi->per_frame_bandwidth;
355     product *= cpi->oxcf.rc_max_intra_bitrate_pct;
356     product /= 100;
357     max_rate = (unsigned int)VPXMIN(INT_MAX, product);
358 
359     if (target > max_rate) target = max_rate;
360   }
361 
362   cpi->this_frame_target = (int)target;
363 
364   /* TODO: if we separate rate targeting from Q targetting, move this.
365    * Reset the active worst quality to the baseline value for key frames.
366    */
367   if (cpi->pass != 2) cpi->active_worst_quality = cpi->worst_quality;
368 
369 #if 0
370     {
371         FILE *f;
372 
373         f = fopen("kf_boost.stt", "a");
374         fprintf(f, " %8u %10d %10d %10d\n",
375                 cpi->common.current_video_frame,  cpi->gfu_boost, cpi->baseline_gf_interval, cpi->source_alt_ref_pending);
376 
377         fclose(f);
378     }
379 #endif
380 }
381 
382 /* Do the best we can to define the parameters for the next GF based on what
383  * information we have available.
384  */
calc_gf_params(VP8_COMP * cpi)385 static void calc_gf_params(VP8_COMP *cpi) {
386   int Q =
387       (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
388   int Boost = 0;
389 
390   int gf_frame_useage = 0; /* Golden frame useage since last GF */
391   int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
392                 cpi->recent_ref_frame_usage[LAST_FRAME] +
393                 cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
394                 cpi->recent_ref_frame_usage[ALTREF_FRAME];
395 
396   int pct_gf_active = (100 * cpi->gf_active_count) /
397                       (cpi->common.mb_rows * cpi->common.mb_cols);
398 
399   if (tot_mbs) {
400     gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
401                        cpi->recent_ref_frame_usage[ALTREF_FRAME]) *
402                       100 / tot_mbs;
403   }
404 
405   if (pct_gf_active > gf_frame_useage) gf_frame_useage = pct_gf_active;
406 
407   /* Not two pass */
408   if (cpi->pass != 2) {
409     /* Single Pass lagged mode: TBD */
410     if (0) {
411     }
412 
413     /* Single Pass compression: Has to use current and historical data */
414     else {
415 #if 0
416             /* Experimental code */
417             int index = cpi->one_pass_frame_index;
418             int frames_to_scan = (cpi->max_gf_interval <= MAX_LAG_BUFFERS) ? cpi->max_gf_interval : MAX_LAG_BUFFERS;
419 
420             /* ************** Experimental code - incomplete */
421             /*
422             double decay_val = 1.0;
423             double IIAccumulator = 0.0;
424             double last_iiaccumulator = 0.0;
425             double IIRatio;
426 
427             cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
428 
429             for ( i = 0; i < (frames_to_scan - 1); i++ )
430             {
431                 if ( index < 0 )
432                     index = MAX_LAG_BUFFERS;
433                 index --;
434 
435                 if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
436                 {
437                     IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
438 
439                     if ( IIRatio > 30.0 )
440                         IIRatio = 30.0;
441                 }
442                 else
443                     IIRatio = 30.0;
444 
445                 IIAccumulator += IIRatio * decay_val;
446 
447                 decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
448 
449                 if (    (i > MIN_GF_INTERVAL) &&
450                         ((IIAccumulator - last_iiaccumulator) < 2.0) )
451                 {
452                     break;
453                 }
454                 last_iiaccumulator = IIAccumulator;
455             }
456 
457             Boost = IIAccumulator*100.0/16.0;
458             cpi->baseline_gf_interval = i;
459 
460             */
461 #else
462 
463       /*************************************************************/
464       /* OLD code */
465 
466       /* Adjust boost based upon ambient Q */
467       Boost = GFQ_ADJUSTMENT;
468 
469       /* Adjust based upon most recently measure intra useage */
470       Boost = Boost *
471               gf_intra_usage_adjustment[(cpi->this_frame_percent_intra < 15)
472                                             ? cpi->this_frame_percent_intra
473                                             : 14] /
474               100;
475 
476       /* Adjust gf boost based upon GF usage since last GF */
477       Boost = Boost * gf_adjust_table[gf_frame_useage] / 100;
478 #endif
479     }
480 
481     /* golden frame boost without recode loop often goes awry.  be
482      * safe by keeping numbers down.
483      */
484     if (!cpi->sf.recode_loop) {
485       if (cpi->compressor_speed == 2) Boost = Boost / 2;
486     }
487 
488     /* Apply an upper limit based on Q for 1 pass encodes */
489     if (Boost > kf_gf_boost_qlimits[Q] && (cpi->pass == 0)) {
490       Boost = kf_gf_boost_qlimits[Q];
491 
492       /* Apply lower limits to boost. */
493     } else if (Boost < 110) {
494       Boost = 110;
495     }
496 
497     /* Note the boost used */
498     cpi->last_boost = Boost;
499   }
500 
501   /* Estimate next interval
502    * This is updated once the real frame size/boost is known.
503    */
504   if (cpi->oxcf.fixed_q == -1) {
505     if (cpi->pass == 2) { /* 2 Pass */
506       cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
507     } else { /* 1 Pass */
508       cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
509 
510       if (cpi->last_boost > 750) cpi->frames_till_gf_update_due++;
511 
512       if (cpi->last_boost > 1000) cpi->frames_till_gf_update_due++;
513 
514       if (cpi->last_boost > 1250) cpi->frames_till_gf_update_due++;
515 
516       if (cpi->last_boost >= 1500) cpi->frames_till_gf_update_due++;
517 
518       if (gf_interval_table[gf_frame_useage] > cpi->frames_till_gf_update_due) {
519         cpi->frames_till_gf_update_due = gf_interval_table[gf_frame_useage];
520       }
521 
522       if (cpi->frames_till_gf_update_due > cpi->max_gf_interval) {
523         cpi->frames_till_gf_update_due = cpi->max_gf_interval;
524       }
525     }
526   } else {
527     cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
528   }
529 
530   /* ARF on or off */
531   if (cpi->pass != 2) {
532     /* For now Alt ref is not allowed except in 2 pass modes. */
533     cpi->source_alt_ref_pending = 0;
534 
535     /*if ( cpi->oxcf.fixed_q == -1)
536     {
537         if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 +
538     (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
539             cpi->source_alt_ref_pending = 1;
540         else
541             cpi->source_alt_ref_pending = 0;
542     }*/
543   }
544 }
545 
calc_pframe_target_size(VP8_COMP * cpi)546 static void calc_pframe_target_size(VP8_COMP *cpi) {
547   int min_frame_target;
548   int old_per_frame_bandwidth = cpi->per_frame_bandwidth;
549 
550   if (cpi->current_layer > 0) {
551     cpi->per_frame_bandwidth =
552         cpi->layer_context[cpi->current_layer].avg_frame_size_for_layer;
553   }
554 
555   min_frame_target = 0;
556 
557   if (cpi->pass == 2) {
558     min_frame_target = cpi->min_frame_bandwidth;
559 
560     if (min_frame_target < (cpi->av_per_frame_bandwidth >> 5)) {
561       min_frame_target = cpi->av_per_frame_bandwidth >> 5;
562     }
563   } else if (min_frame_target < cpi->per_frame_bandwidth / 4) {
564     min_frame_target = cpi->per_frame_bandwidth / 4;
565   }
566 
567   /* Special alt reference frame case */
568   if ((cpi->common.refresh_alt_ref_frame) &&
569       (cpi->oxcf.number_of_layers == 1)) {
570     if (cpi->pass == 2) {
571       /* Per frame bit target for the alt ref frame */
572       cpi->per_frame_bandwidth = cpi->twopass.gf_bits;
573       cpi->this_frame_target = cpi->per_frame_bandwidth;
574     }
575 
576     /* One Pass ??? TBD */
577   }
578 
579   /* Normal frames (gf,and inter) */
580   else {
581     /* 2 pass */
582     if (cpi->pass == 2) {
583       cpi->this_frame_target = cpi->per_frame_bandwidth;
584     }
585     /* 1 pass */
586     else {
587       int Adjustment;
588       /* Make rate adjustment to recover bits spent in key frame
589        * Test to see if the key frame inter data rate correction
590        * should still be in force
591        */
592       if (cpi->kf_overspend_bits > 0) {
593         Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits)
594                          ? cpi->kf_bitrate_adjustment
595                          : cpi->kf_overspend_bits;
596 
597         if (Adjustment > (cpi->per_frame_bandwidth - min_frame_target)) {
598           Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
599         }
600 
601         cpi->kf_overspend_bits -= Adjustment;
602 
603         /* Calculate an inter frame bandwidth target for the next
604          * few frames designed to recover any extra bits spent on
605          * the key frame.
606          */
607         cpi->this_frame_target = cpi->per_frame_bandwidth - Adjustment;
608 
609         if (cpi->this_frame_target < min_frame_target) {
610           cpi->this_frame_target = min_frame_target;
611         }
612       } else {
613         cpi->this_frame_target = cpi->per_frame_bandwidth;
614       }
615 
616       /* If appropriate make an adjustment to recover bits spent on a
617        * recent GF
618        */
619       if ((cpi->gf_overspend_bits > 0) &&
620           (cpi->this_frame_target > min_frame_target)) {
621         Adjustment = (cpi->non_gf_bitrate_adjustment <= cpi->gf_overspend_bits)
622                          ? cpi->non_gf_bitrate_adjustment
623                          : cpi->gf_overspend_bits;
624 
625         if (Adjustment > (cpi->this_frame_target - min_frame_target)) {
626           Adjustment = (cpi->this_frame_target - min_frame_target);
627         }
628 
629         cpi->gf_overspend_bits -= Adjustment;
630         cpi->this_frame_target -= Adjustment;
631       }
632 
633       /* Apply small + and - boosts for non gf frames */
634       if ((cpi->last_boost > 150) && (cpi->frames_till_gf_update_due > 0) &&
635           (cpi->current_gf_interval >= (MIN_GF_INTERVAL << 1))) {
636         /* % Adjustment limited to the range 1% to 10% */
637         Adjustment = (cpi->last_boost - 100) >> 5;
638 
639         if (Adjustment < 1) {
640           Adjustment = 1;
641         } else if (Adjustment > 10) {
642           Adjustment = 10;
643         }
644 
645         /* Convert to bits */
646         Adjustment = (cpi->this_frame_target * Adjustment) / 100;
647 
648         if (Adjustment > (cpi->this_frame_target - min_frame_target)) {
649           Adjustment = (cpi->this_frame_target - min_frame_target);
650         }
651 
652         if (cpi->frames_since_golden == (cpi->current_gf_interval >> 1)) {
653           Adjustment = (cpi->current_gf_interval - 1) * Adjustment;
654           // Limit adjustment to 10% of current target.
655           if (Adjustment > (10 * cpi->this_frame_target) / 100) {
656             Adjustment = (10 * cpi->this_frame_target) / 100;
657           }
658           cpi->this_frame_target += Adjustment;
659         } else {
660           cpi->this_frame_target -= Adjustment;
661         }
662       }
663     }
664   }
665 
666   /* Sanity check that the total sum of adjustments is not above the
667    * maximum allowed That is that having allowed for KF and GF penalties
668    * we have not pushed the current interframe target to low. If the
669    * adjustment we apply here is not capable of recovering all the extra
670    * bits we have spent in the KF or GF then the remainder will have to
671    * be recovered over a longer time span via other buffer / rate control
672    * mechanisms.
673    */
674   if (cpi->this_frame_target < min_frame_target) {
675     cpi->this_frame_target = min_frame_target;
676   }
677 
678   if (!cpi->common.refresh_alt_ref_frame) {
679     /* Note the baseline target data rate for this inter frame. */
680     cpi->inter_frame_target = cpi->this_frame_target;
681   }
682 
683   /* One Pass specific code */
684   if (cpi->pass == 0) {
685     /* Adapt target frame size with respect to any buffering constraints: */
686     if (cpi->buffered_mode) {
687       int one_percent_bits = (int)(1 + cpi->oxcf.optimal_buffer_level / 100);
688 
689       if ((cpi->buffer_level < cpi->oxcf.optimal_buffer_level) ||
690           (cpi->bits_off_target < cpi->oxcf.optimal_buffer_level)) {
691         int percent_low = 0;
692 
693         /* Decide whether or not we need to adjust the frame data
694          * rate target.
695          *
696          * If we are are below the optimal buffer fullness level
697          * and adherence to buffering constraints is important to
698          * the end usage then adjust the per frame target.
699          */
700         if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
701             (cpi->buffer_level < cpi->oxcf.optimal_buffer_level)) {
702           percent_low =
703               (int)((cpi->oxcf.optimal_buffer_level - cpi->buffer_level) /
704                     one_percent_bits);
705         }
706         /* Are we overshooting the long term clip data rate... */
707         else if (cpi->bits_off_target < 0) {
708           /* Adjust per frame data target downwards to compensate. */
709           percent_low =
710               (int)(100 * -cpi->bits_off_target / (cpi->total_byte_count * 8));
711         }
712 
713         if (percent_low > cpi->oxcf.under_shoot_pct) {
714           percent_low = cpi->oxcf.under_shoot_pct;
715         } else if (percent_low < 0) {
716           percent_low = 0;
717         }
718 
719         /* lower the target bandwidth for this frame. */
720         cpi->this_frame_target -= (cpi->this_frame_target * percent_low) / 200;
721 
722         /* Are we using allowing control of active_worst_allowed_q
723          * according to buffer level.
724          */
725         if (cpi->auto_worst_q && cpi->ni_frames > 150) {
726           int64_t critical_buffer_level;
727 
728           /* For streaming applications the most important factor is
729            * cpi->buffer_level as this takes into account the
730            * specified short term buffering constraints. However,
731            * hitting the long term clip data rate target is also
732            * important.
733            */
734           if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
735             /* Take the smaller of cpi->buffer_level and
736              * cpi->bits_off_target
737              */
738             critical_buffer_level = (cpi->buffer_level < cpi->bits_off_target)
739                                         ? cpi->buffer_level
740                                         : cpi->bits_off_target;
741           }
742           /* For local file playback short term buffering constraints
743            * are less of an issue
744            */
745           else {
746             /* Consider only how we are doing for the clip as a
747              * whole
748              */
749             critical_buffer_level = cpi->bits_off_target;
750           }
751 
752           /* Set the active worst quality based upon the selected
753            * buffer fullness number.
754            */
755           if (critical_buffer_level < cpi->oxcf.optimal_buffer_level) {
756             if (critical_buffer_level > (cpi->oxcf.optimal_buffer_level >> 2)) {
757               int64_t qadjustment_range = cpi->worst_quality - cpi->ni_av_qi;
758               int64_t above_base = (critical_buffer_level -
759                                     (cpi->oxcf.optimal_buffer_level >> 2));
760 
761               /* Step active worst quality down from
762                * cpi->ni_av_qi when (critical_buffer_level ==
763                * cpi->optimal_buffer_level) to
764                * cpi->worst_quality when
765                * (critical_buffer_level ==
766                *     cpi->optimal_buffer_level >> 2)
767                */
768               cpi->active_worst_quality =
769                   cpi->worst_quality -
770                   (int)((qadjustment_range * above_base) /
771                         (cpi->oxcf.optimal_buffer_level * 3 >> 2));
772             } else {
773               cpi->active_worst_quality = cpi->worst_quality;
774             }
775           } else {
776             cpi->active_worst_quality = cpi->ni_av_qi;
777           }
778         } else {
779           cpi->active_worst_quality = cpi->worst_quality;
780         }
781       } else {
782         int percent_high = 0;
783 
784         if ((cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
785             (cpi->buffer_level > cpi->oxcf.optimal_buffer_level)) {
786           percent_high =
787               (int)((cpi->buffer_level - cpi->oxcf.optimal_buffer_level) /
788                     one_percent_bits);
789         } else if (cpi->bits_off_target > cpi->oxcf.optimal_buffer_level) {
790           percent_high =
791               (int)((100 * cpi->bits_off_target) / (cpi->total_byte_count * 8));
792         }
793 
794         if (percent_high > cpi->oxcf.over_shoot_pct) {
795           percent_high = cpi->oxcf.over_shoot_pct;
796         } else if (percent_high < 0) {
797           percent_high = 0;
798         }
799 
800         cpi->this_frame_target += (cpi->this_frame_target * percent_high) / 200;
801 
802         /* Are we allowing control of active_worst_allowed_q according
803          * to buffer level.
804          */
805         if (cpi->auto_worst_q && cpi->ni_frames > 150) {
806           /* When using the relaxed buffer model stick to the
807            * user specified value
808            */
809           cpi->active_worst_quality = cpi->ni_av_qi;
810         } else {
811           cpi->active_worst_quality = cpi->worst_quality;
812         }
813       }
814 
815       /* Set active_best_quality to prevent quality rising too high */
816       cpi->active_best_quality = cpi->best_quality;
817 
818       /* Worst quality obviously must not be better than best quality */
819       if (cpi->active_worst_quality <= cpi->active_best_quality) {
820         cpi->active_worst_quality = cpi->active_best_quality + 1;
821       }
822 
823       if (cpi->active_worst_quality > 127) cpi->active_worst_quality = 127;
824     }
825     /* Unbuffered mode (eg. video conferencing) */
826     else {
827       /* Set the active worst quality */
828       cpi->active_worst_quality = cpi->worst_quality;
829     }
830 
831     /* Special trap for constrained quality mode
832      * "active_worst_quality" may never drop below cq level
833      * for any frame type.
834      */
835     if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
836         cpi->active_worst_quality < cpi->cq_target_quality) {
837       cpi->active_worst_quality = cpi->cq_target_quality;
838     }
839   }
840 
841   /* Test to see if we have to drop a frame
842    * The auto-drop frame code is only used in buffered mode.
843    * In unbufferd mode (eg vide conferencing) the descision to
844    * code or drop a frame is made outside the codec in response to real
845    * world comms or buffer considerations.
846    */
847   if (cpi->drop_frames_allowed &&
848       (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) &&
849       ((cpi->common.frame_type != KEY_FRAME))) {
850     /* Check for a buffer underun-crisis in which case we have to drop
851      * a frame
852      */
853     if ((cpi->buffer_level < 0)) {
854 #if 0
855             FILE *f = fopen("dec.stt", "a");
856             fprintf(f, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
857                     (int) cpi->common.current_video_frame,
858                     cpi->decimation_factor, cpi->common.horiz_scale,
859                     (cpi->buffer_level * 100) / cpi->oxcf.optimal_buffer_level);
860             fclose(f);
861 #endif
862       cpi->drop_frame = 1;
863 
864       /* Update the buffer level variable. */
865       cpi->bits_off_target += cpi->av_per_frame_bandwidth;
866       if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size) {
867         cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
868       }
869       cpi->buffer_level = cpi->bits_off_target;
870 
871       if (cpi->oxcf.number_of_layers > 1) {
872         unsigned int i;
873 
874         // Propagate bits saved by dropping the frame to higher layers.
875         for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers; ++i) {
876           LAYER_CONTEXT *lc = &cpi->layer_context[i];
877           lc->bits_off_target += (int)(lc->target_bandwidth / lc->framerate);
878           if (lc->bits_off_target > lc->maximum_buffer_size) {
879             lc->bits_off_target = lc->maximum_buffer_size;
880           }
881           lc->buffer_level = lc->bits_off_target;
882         }
883       }
884     }
885   }
886 
887   /* Adjust target frame size for Golden Frames: */
888   if (cpi->oxcf.error_resilient_mode == 0 &&
889       (cpi->frames_till_gf_update_due == 0) && !cpi->drop_frame) {
890     if (!cpi->gf_update_onepass_cbr) {
891       int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME]
892                                       : cpi->oxcf.fixed_q;
893 
894       int gf_frame_useage = 0; /* Golden frame useage since last GF */
895       int tot_mbs = cpi->recent_ref_frame_usage[INTRA_FRAME] +
896                     cpi->recent_ref_frame_usage[LAST_FRAME] +
897                     cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
898                     cpi->recent_ref_frame_usage[ALTREF_FRAME];
899 
900       int pct_gf_active = (100 * cpi->gf_active_count) /
901                           (cpi->common.mb_rows * cpi->common.mb_cols);
902 
903       if (tot_mbs) {
904         gf_frame_useage = (cpi->recent_ref_frame_usage[GOLDEN_FRAME] +
905                            cpi->recent_ref_frame_usage[ALTREF_FRAME]) *
906                           100 / tot_mbs;
907       }
908 
909       if (pct_gf_active > gf_frame_useage) gf_frame_useage = pct_gf_active;
910 
911       /* Is a fixed manual GF frequency being used */
912       if (cpi->auto_gold) {
913         /* For one pass throw a GF if recent frame intra useage is
914          * low or the GF useage is high
915          */
916         if ((cpi->pass == 0) &&
917             (cpi->this_frame_percent_intra < 15 || gf_frame_useage >= 5)) {
918           cpi->common.refresh_golden_frame = 1;
919 
920           /* Two pass GF descision */
921         } else if (cpi->pass == 2) {
922           cpi->common.refresh_golden_frame = 1;
923         }
924       }
925 
926 #if 0
927 
928           /* Debug stats */
929           if (0) {
930               FILE *f;
931 
932               f = fopen("gf_useaget.stt", "a");
933               fprintf(f, " %8ld %10ld %10ld %10ld %10ld\n",
934                       cpi->common.current_video_frame,  cpi->gfu_boost,
935                       GFQ_ADJUSTMENT, cpi->gfu_boost, gf_frame_useage);
936               fclose(f);
937           }
938 
939 #endif
940 
941       if (cpi->common.refresh_golden_frame == 1) {
942 #if 0
943 
944             if (0) {
945                 FILE *f;
946 
947                 f = fopen("GFexit.stt", "a");
948                 fprintf(f, "%8ld GF coded\n", cpi->common.current_video_frame);
949                 fclose(f);
950             }
951 
952 #endif
953 
954         if (cpi->auto_adjust_gold_quantizer) {
955           calc_gf_params(cpi);
956         }
957 
958         /* If we are using alternate ref instead of gf then do not apply the
959          * boost It will instead be applied to the altref update Jims
960          * modified boost
961          */
962         if (!cpi->source_alt_ref_active) {
963           if (cpi->oxcf.fixed_q < 0) {
964             if (cpi->pass == 2) {
965               /* The spend on the GF is defined in the two pass
966                * code for two pass encodes
967                */
968               cpi->this_frame_target = cpi->per_frame_bandwidth;
969             } else {
970               int Boost = cpi->last_boost;
971               int frames_in_section = cpi->frames_till_gf_update_due + 1;
972               int allocation_chunks = (frames_in_section * 100) + (Boost - 100);
973               int bits_in_section = cpi->inter_frame_target * frames_in_section;
974 
975               /* Normalize Altboost and allocations chunck down to
976                * prevent overflow
977                */
978               while (Boost > 1000) {
979                 Boost /= 2;
980                 allocation_chunks /= 2;
981               }
982 
983               /* Avoid loss of precision but avoid overflow */
984               if ((bits_in_section >> 7) > allocation_chunks) {
985                 cpi->this_frame_target =
986                     Boost * (bits_in_section / allocation_chunks);
987               } else {
988                 cpi->this_frame_target =
989                     (Boost * bits_in_section) / allocation_chunks;
990               }
991             }
992           } else {
993             cpi->this_frame_target =
994                 (estimate_bits_at_q(1, Q, cpi->common.MBs, 1.0) *
995                  cpi->last_boost) /
996                 100;
997           }
998         } else {
999           /* If there is an active ARF at this location use the minimum
1000            * bits on this frame even if it is a contructed arf.
1001            * The active maximum quantizer insures that an appropriate
1002            * number of bits will be spent if needed for contstructed ARFs.
1003            */
1004           cpi->this_frame_target = 0;
1005         }
1006 
1007         cpi->current_gf_interval = cpi->frames_till_gf_update_due;
1008       }
1009     } else {
1010       // Special case for 1 pass CBR: fixed gf period.
1011       // TODO(marpan): Adjust this boost/interval logic.
1012       // If gf_cbr_boost_pct is small (below threshold) set the flag
1013       // gf_noboost_onepass_cbr = 1, which forces the gf to use the same
1014       // rate correction factor as last.
1015       cpi->gf_noboost_onepass_cbr = (cpi->oxcf.gf_cbr_boost_pct <= 100);
1016       cpi->baseline_gf_interval = cpi->gf_interval_onepass_cbr;
1017       // Skip this update if the zero_mvcount is low.
1018       if (cpi->zeromv_count > (cpi->common.MBs >> 1)) {
1019         cpi->common.refresh_golden_frame = 1;
1020         cpi->this_frame_target =
1021             (cpi->this_frame_target * (100 + cpi->oxcf.gf_cbr_boost_pct)) / 100;
1022       }
1023       cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
1024       cpi->current_gf_interval = cpi->frames_till_gf_update_due;
1025     }
1026   }
1027 
1028   cpi->per_frame_bandwidth = old_per_frame_bandwidth;
1029 }
1030 
vp8_update_rate_correction_factors(VP8_COMP * cpi,int damp_var)1031 void vp8_update_rate_correction_factors(VP8_COMP *cpi, int damp_var) {
1032   int Q = cpi->common.base_qindex;
1033   int correction_factor = 100;
1034   double rate_correction_factor;
1035   double adjustment_limit;
1036 
1037   int projected_size_based_on_q = 0;
1038 
1039   /* Clear down mmx registers to allow floating point in what follows */
1040   vpx_clear_system_state();
1041 
1042   if (cpi->common.frame_type == KEY_FRAME) {
1043     rate_correction_factor = cpi->key_frame_rate_correction_factor;
1044   } else {
1045     if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1046         (cpi->common.refresh_alt_ref_frame ||
1047          cpi->common.refresh_golden_frame)) {
1048       rate_correction_factor = cpi->gf_rate_correction_factor;
1049     } else {
1050       rate_correction_factor = cpi->rate_correction_factor;
1051     }
1052   }
1053 
1054   /* Work out how big we would have expected the frame to be at this Q
1055    * given the current correction factor. Stay in double to avoid int
1056    * overflow when values are large
1057    */
1058   projected_size_based_on_q =
1059       (int)(((.5 + rate_correction_factor *
1060                        vp8_bits_per_mb[cpi->common.frame_type][Q]) *
1061              cpi->common.MBs) /
1062             (1 << BPER_MB_NORMBITS));
1063 
1064   /* Make some allowance for cpi->zbin_over_quant */
1065   if (cpi->mb.zbin_over_quant > 0) {
1066     int Z = cpi->mb.zbin_over_quant;
1067     double Factor = 0.99;
1068     double factor_adjustment = 0.01 / 256.0;
1069 
1070     while (Z > 0) {
1071       Z--;
1072       projected_size_based_on_q = (int)(Factor * projected_size_based_on_q);
1073       Factor += factor_adjustment;
1074 
1075       if (Factor >= 0.999) Factor = 0.999;
1076     }
1077   }
1078 
1079   /* Work out a size correction factor. */
1080   if (projected_size_based_on_q > 0) {
1081     correction_factor =
1082         (100 * cpi->projected_frame_size) / projected_size_based_on_q;
1083   }
1084 
1085   /* More heavily damped adjustment used if we have been oscillating
1086    * either side of target
1087    */
1088   switch (damp_var) {
1089     case 0: adjustment_limit = 0.75; break;
1090     case 1: adjustment_limit = 0.375; break;
1091     case 2:
1092     default: adjustment_limit = 0.25; break;
1093   }
1094 
1095   if (correction_factor > 102) {
1096     /* We are not already at the worst allowable quality */
1097     correction_factor =
1098         (int)(100.5 + ((correction_factor - 100) * adjustment_limit));
1099     rate_correction_factor =
1100         ((rate_correction_factor * correction_factor) / 100);
1101 
1102     /* Keep rate_correction_factor within limits */
1103     if (rate_correction_factor > MAX_BPB_FACTOR) {
1104       rate_correction_factor = MAX_BPB_FACTOR;
1105     }
1106   } else if (correction_factor < 99) {
1107     /* We are not already at the best allowable quality */
1108     correction_factor =
1109         (int)(100.5 - ((100 - correction_factor) * adjustment_limit));
1110     rate_correction_factor =
1111         ((rate_correction_factor * correction_factor) / 100);
1112 
1113     /* Keep rate_correction_factor within limits */
1114     if (rate_correction_factor < MIN_BPB_FACTOR) {
1115       rate_correction_factor = MIN_BPB_FACTOR;
1116     }
1117   }
1118 
1119   if (cpi->common.frame_type == KEY_FRAME) {
1120     cpi->key_frame_rate_correction_factor = rate_correction_factor;
1121   } else {
1122     if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1123         (cpi->common.refresh_alt_ref_frame ||
1124          cpi->common.refresh_golden_frame)) {
1125       cpi->gf_rate_correction_factor = rate_correction_factor;
1126     } else {
1127       cpi->rate_correction_factor = rate_correction_factor;
1128     }
1129   }
1130 }
1131 
limit_q_cbr_inter(int last_q,int current_q)1132 static int limit_q_cbr_inter(int last_q, int current_q) {
1133   int limit_down = 12;
1134   if (last_q - current_q > limit_down)
1135     return (last_q - limit_down);
1136   else
1137     return current_q;
1138 }
1139 
vp8_regulate_q(VP8_COMP * cpi,int target_bits_per_frame)1140 int vp8_regulate_q(VP8_COMP *cpi, int target_bits_per_frame) {
1141   int Q = cpi->active_worst_quality;
1142 
1143   if (cpi->force_maxqp == 1) {
1144     cpi->active_worst_quality = cpi->worst_quality;
1145     return cpi->worst_quality;
1146   }
1147   /* Reset Zbin OQ value */
1148   cpi->mb.zbin_over_quant = 0;
1149 
1150   if (cpi->oxcf.fixed_q >= 0) {
1151     Q = cpi->oxcf.fixed_q;
1152 
1153     if (cpi->common.frame_type == KEY_FRAME) {
1154       Q = cpi->oxcf.key_q;
1155     } else if (cpi->oxcf.number_of_layers == 1 &&
1156                cpi->common.refresh_alt_ref_frame &&
1157                !cpi->gf_noboost_onepass_cbr) {
1158       Q = cpi->oxcf.alt_q;
1159     } else if (cpi->oxcf.number_of_layers == 1 &&
1160                cpi->common.refresh_golden_frame &&
1161                !cpi->gf_noboost_onepass_cbr) {
1162       Q = cpi->oxcf.gold_q;
1163     }
1164   } else {
1165     int i;
1166     int last_error = INT_MAX;
1167     int target_bits_per_mb;
1168     int bits_per_mb_at_this_q;
1169     double correction_factor;
1170 
1171     /* Select the appropriate correction factor based upon type of frame. */
1172     if (cpi->common.frame_type == KEY_FRAME) {
1173       correction_factor = cpi->key_frame_rate_correction_factor;
1174     } else {
1175       if (cpi->oxcf.number_of_layers == 1 && !cpi->gf_noboost_onepass_cbr &&
1176           (cpi->common.refresh_alt_ref_frame ||
1177            cpi->common.refresh_golden_frame)) {
1178         correction_factor = cpi->gf_rate_correction_factor;
1179       } else {
1180         correction_factor = cpi->rate_correction_factor;
1181       }
1182     }
1183 
1184     /* Calculate required scaling factor based on target frame size and
1185      * size of frame produced using previous Q
1186      */
1187     if (target_bits_per_frame >= (INT_MAX >> BPER_MB_NORMBITS)) {
1188       /* Case where we would overflow int */
1189       target_bits_per_mb = (target_bits_per_frame / cpi->common.MBs)
1190                            << BPER_MB_NORMBITS;
1191     } else {
1192       target_bits_per_mb =
1193           (target_bits_per_frame << BPER_MB_NORMBITS) / cpi->common.MBs;
1194     }
1195 
1196     i = cpi->active_best_quality;
1197 
1198     do {
1199       bits_per_mb_at_this_q =
1200           (int)(.5 +
1201                 correction_factor * vp8_bits_per_mb[cpi->common.frame_type][i]);
1202 
1203       if (bits_per_mb_at_this_q <= target_bits_per_mb) {
1204         if ((target_bits_per_mb - bits_per_mb_at_this_q) <= last_error) {
1205           Q = i;
1206         } else {
1207           Q = i - 1;
1208         }
1209 
1210         break;
1211       } else {
1212         last_error = bits_per_mb_at_this_q - target_bits_per_mb;
1213       }
1214     } while (++i <= cpi->active_worst_quality);
1215 
1216     /* If we are at MAXQ then enable Q over-run which seeks to claw
1217      * back additional bits through things like the RD multiplier
1218      * and zero bin size.
1219      */
1220     if (Q >= MAXQ) {
1221       int zbin_oqmax;
1222 
1223       double Factor = 0.99;
1224       double factor_adjustment = 0.01 / 256.0;
1225 
1226       if (cpi->common.frame_type == KEY_FRAME) {
1227         zbin_oqmax = 0;
1228       } else if (cpi->oxcf.number_of_layers == 1 &&
1229                  !cpi->gf_noboost_onepass_cbr &&
1230                  (cpi->common.refresh_alt_ref_frame ||
1231                   (cpi->common.refresh_golden_frame &&
1232                    !cpi->source_alt_ref_active))) {
1233         zbin_oqmax = 16;
1234       } else {
1235         zbin_oqmax = ZBIN_OQ_MAX;
1236       }
1237 
1238       /*{
1239           double Factor =
1240       (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
1241           double Oq;
1242 
1243           Factor = Factor/1.2683;
1244 
1245           Oq = pow( Factor, (1.0/-0.165) );
1246 
1247           if ( Oq > zbin_oqmax )
1248               Oq = zbin_oqmax;
1249 
1250           cpi->zbin_over_quant = (int)Oq;
1251       }*/
1252 
1253       /* Each incrment in the zbin is assumed to have a fixed effect
1254        * on bitrate. This is not of course true. The effect will be
1255        * highly clip dependent and may well have sudden steps. The
1256        * idea here is to acheive higher effective quantizers than the
1257        * normal maximum by expanding the zero bin and hence
1258        * decreasing the number of low magnitude non zero coefficients.
1259        */
1260       while (cpi->mb.zbin_over_quant < zbin_oqmax) {
1261         cpi->mb.zbin_over_quant++;
1262 
1263         if (cpi->mb.zbin_over_quant > zbin_oqmax) {
1264           cpi->mb.zbin_over_quant = zbin_oqmax;
1265         }
1266 
1267         /* Adjust bits_per_mb_at_this_q estimate */
1268         bits_per_mb_at_this_q = (int)(Factor * bits_per_mb_at_this_q);
1269         Factor += factor_adjustment;
1270 
1271         if (Factor >= 0.999) Factor = 0.999;
1272 
1273         /* Break out if we get down to the target rate */
1274         if (bits_per_mb_at_this_q <= target_bits_per_mb) break;
1275       }
1276     }
1277   }
1278 
1279   // Limit decrease in Q for 1 pass CBR screen content mode.
1280   if (cpi->common.frame_type != KEY_FRAME && cpi->pass == 0 &&
1281       cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER &&
1282       cpi->oxcf.screen_content_mode)
1283     Q = limit_q_cbr_inter(cpi->last_q[1], Q);
1284 
1285   return Q;
1286 }
1287 
estimate_keyframe_frequency(VP8_COMP * cpi)1288 static int estimate_keyframe_frequency(VP8_COMP *cpi) {
1289   int i;
1290 
1291   /* Average key frame frequency */
1292   int av_key_frame_frequency = 0;
1293 
1294   /* First key frame at start of sequence is a special case. We have no
1295    * frequency data.
1296    */
1297   if (cpi->key_frame_count == 1) {
1298     /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
1299      * whichever is smaller.
1300      */
1301     int key_freq = cpi->oxcf.key_freq > 0 ? cpi->oxcf.key_freq : 1;
1302     av_key_frame_frequency = 1 + (int)cpi->output_framerate * 2;
1303 
1304     if (cpi->oxcf.auto_key && av_key_frame_frequency > key_freq) {
1305       av_key_frame_frequency = key_freq;
1306     }
1307 
1308     cpi->prior_key_frame_distance[KEY_FRAME_CONTEXT - 1] =
1309         av_key_frame_frequency;
1310   } else {
1311     unsigned int total_weight = 0;
1312     int last_kf_interval =
1313         (cpi->frames_since_key > 0) ? cpi->frames_since_key : 1;
1314 
1315     /* reset keyframe context and calculate weighted average of last
1316      * KEY_FRAME_CONTEXT keyframes
1317      */
1318     for (i = 0; i < KEY_FRAME_CONTEXT; ++i) {
1319       if (i < KEY_FRAME_CONTEXT - 1) {
1320         cpi->prior_key_frame_distance[i] = cpi->prior_key_frame_distance[i + 1];
1321       } else {
1322         cpi->prior_key_frame_distance[i] = last_kf_interval;
1323       }
1324 
1325       av_key_frame_frequency +=
1326           prior_key_frame_weight[i] * cpi->prior_key_frame_distance[i];
1327       total_weight += prior_key_frame_weight[i];
1328     }
1329 
1330     av_key_frame_frequency /= total_weight;
1331   }
1332   // TODO (marpan): Given the checks above, |av_key_frame_frequency|
1333   // should always be above 0. But for now we keep the sanity check in.
1334   if (av_key_frame_frequency == 0) av_key_frame_frequency = 1;
1335   return av_key_frame_frequency;
1336 }
1337 
vp8_adjust_key_frame_context(VP8_COMP * cpi)1338 void vp8_adjust_key_frame_context(VP8_COMP *cpi) {
1339   /* Clear down mmx registers to allow floating point in what follows */
1340   vpx_clear_system_state();
1341 
1342   /* Do we have any key frame overspend to recover? */
1343   /* Two-pass overspend handled elsewhere. */
1344   if ((cpi->pass != 2) &&
1345       (cpi->projected_frame_size > cpi->per_frame_bandwidth)) {
1346     int overspend;
1347 
1348     /* Update the count of key frame overspend to be recovered in
1349      * subsequent frames. A portion of the KF overspend is treated as gf
1350      * overspend (and hence recovered more quickly) as the kf is also a
1351      * gf. Otherwise the few frames following each kf tend to get more
1352      * bits allocated than those following other gfs.
1353      */
1354     overspend = (cpi->projected_frame_size - cpi->per_frame_bandwidth);
1355 
1356     if (cpi->oxcf.number_of_layers > 1) {
1357       cpi->kf_overspend_bits += overspend;
1358     } else {
1359       cpi->kf_overspend_bits += overspend * 7 / 8;
1360       cpi->gf_overspend_bits += overspend * 1 / 8;
1361     }
1362 
1363     /* Work out how much to try and recover per frame. */
1364     cpi->kf_bitrate_adjustment =
1365         cpi->kf_overspend_bits / estimate_keyframe_frequency(cpi);
1366   }
1367 
1368   cpi->frames_since_key = 0;
1369   cpi->key_frame_count++;
1370 }
1371 
vp8_compute_frame_size_bounds(VP8_COMP * cpi,int * frame_under_shoot_limit,int * frame_over_shoot_limit)1372 void vp8_compute_frame_size_bounds(VP8_COMP *cpi, int *frame_under_shoot_limit,
1373                                    int *frame_over_shoot_limit) {
1374   /* Set-up bounds on acceptable frame size: */
1375   if (cpi->oxcf.fixed_q >= 0) {
1376     /* Fixed Q scenario: frame size never outranges target
1377      * (there is no target!)
1378      */
1379     *frame_under_shoot_limit = 0;
1380     *frame_over_shoot_limit = INT_MAX;
1381   } else {
1382     const int64_t this_frame_target = cpi->this_frame_target;
1383     int64_t over_shoot_limit, under_shoot_limit;
1384 
1385     if (cpi->common.frame_type == KEY_FRAME) {
1386       over_shoot_limit = this_frame_target * 9 / 8;
1387       under_shoot_limit = this_frame_target * 7 / 8;
1388     } else {
1389       if (cpi->oxcf.number_of_layers > 1 || cpi->common.refresh_alt_ref_frame ||
1390           cpi->common.refresh_golden_frame) {
1391         over_shoot_limit = this_frame_target * 9 / 8;
1392         under_shoot_limit = this_frame_target * 7 / 8;
1393       } else {
1394         /* For CBR take buffer fullness into account */
1395         if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER) {
1396           if (cpi->buffer_level >= ((cpi->oxcf.optimal_buffer_level +
1397                                      cpi->oxcf.maximum_buffer_size) >>
1398                                     1)) {
1399             /* Buffer is too full so relax overshoot and tighten
1400              * undershoot
1401              */
1402             over_shoot_limit = this_frame_target * 12 / 8;
1403             under_shoot_limit = this_frame_target * 6 / 8;
1404           } else if (cpi->buffer_level <=
1405                      (cpi->oxcf.optimal_buffer_level >> 1)) {
1406             /* Buffer is too low so relax undershoot and tighten
1407              * overshoot
1408              */
1409             over_shoot_limit = this_frame_target * 10 / 8;
1410             under_shoot_limit = this_frame_target * 4 / 8;
1411           } else {
1412             over_shoot_limit = this_frame_target * 11 / 8;
1413             under_shoot_limit = this_frame_target * 5 / 8;
1414           }
1415         }
1416         /* VBR and CQ mode */
1417         /* Note that tighter restrictions here can help quality
1418          * but hurt encode speed
1419          */
1420         else {
1421           /* Stron overshoot limit for constrained quality */
1422           if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
1423             over_shoot_limit = this_frame_target * 11 / 8;
1424             under_shoot_limit = this_frame_target * 2 / 8;
1425           } else {
1426             over_shoot_limit = this_frame_target * 11 / 8;
1427             under_shoot_limit = this_frame_target * 5 / 8;
1428           }
1429         }
1430       }
1431     }
1432 
1433     /* For very small rate targets where the fractional adjustment
1434      * (eg * 7/8) may be tiny make sure there is at least a minimum
1435      * range.
1436      */
1437     over_shoot_limit += 200;
1438     under_shoot_limit -= 200;
1439     if (under_shoot_limit < 0) under_shoot_limit = 0;
1440     if (under_shoot_limit > INT_MAX) under_shoot_limit = INT_MAX;
1441     if (over_shoot_limit > INT_MAX) over_shoot_limit = INT_MAX;
1442     *frame_under_shoot_limit = (int)under_shoot_limit;
1443     *frame_over_shoot_limit = (int)over_shoot_limit;
1444   }
1445 }
1446 
1447 /* return of 0 means drop frame */
vp8_pick_frame_size(VP8_COMP * cpi)1448 int vp8_pick_frame_size(VP8_COMP *cpi) {
1449   VP8_COMMON *cm = &cpi->common;
1450 
1451   if (cm->frame_type == KEY_FRAME) {
1452     calc_iframe_target_size(cpi);
1453   } else {
1454     calc_pframe_target_size(cpi);
1455 
1456     /* Check if we're dropping the frame: */
1457     if (cpi->drop_frame) {
1458       cpi->drop_frame = 0;
1459       return 0;
1460     }
1461   }
1462   return 1;
1463 }
1464 // If this just encoded frame (mcomp/transform/quant, but before loopfilter and
1465 // pack_bitstream) has large overshoot, and was not being encoded close to the
1466 // max QP, then drop this frame and force next frame to be encoded at max QP.
1467 // Allow this for screen_content_mode = 2, or if drop frames is allowed.
1468 // TODO(marpan): Should do this exit condition during the encode_frame
1469 // (i.e., halfway during the encoding of the frame) to save cycles.
vp8_drop_encodedframe_overshoot(VP8_COMP * cpi,int Q)1470 int vp8_drop_encodedframe_overshoot(VP8_COMP *cpi, int Q) {
1471   int force_drop_overshoot = 0;
1472 #if CONFIG_MULTI_RES_ENCODING
1473   // Only check for dropping due to overshoot on the lowest stream.
1474   // If the lowest stream of the multi-res encoding was dropped due to
1475   // overshoot, then force dropping on all upper layer streams
1476   // (mr_encoder_id > 0).
1477   LOWER_RES_FRAME_INFO *low_res_frame_info =
1478       (LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
1479   if (cpi->oxcf.mr_total_resolutions > 1 && cpi->oxcf.mr_encoder_id > 0) {
1480     force_drop_overshoot = low_res_frame_info->is_frame_dropped_overshoot_maxqp;
1481     if (!force_drop_overshoot) {
1482       cpi->force_maxqp = 0;
1483       cpi->frames_since_last_drop_overshoot++;
1484       return 0;
1485     }
1486   }
1487 #endif
1488   if (cpi->common.frame_type != KEY_FRAME &&
1489       (cpi->oxcf.screen_content_mode == 2 ||
1490        (cpi->drop_frames_allowed &&
1491         (force_drop_overshoot ||
1492          (cpi->rate_correction_factor < (8.0f * MIN_BPB_FACTOR) &&
1493           cpi->frames_since_last_drop_overshoot > (int)cpi->framerate))))) {
1494     // Note: the "projected_frame_size" from encode_frame() only gives estimate
1495     // of mode/motion vector rate (in non-rd mode): so below we only require
1496     // that projected_frame_size is somewhat greater than per-frame-bandwidth,
1497     // but add additional condition with high threshold on prediction residual.
1498 
1499     // QP threshold: only allow dropping if we are not close to qp_max.
1500     int thresh_qp = 3 * cpi->worst_quality >> 2;
1501     // Rate threshold, in bytes.
1502     int thresh_rate = 2 * (cpi->av_per_frame_bandwidth >> 3);
1503     // Threshold for the average (over all macroblocks) of the pixel-sum
1504     // residual error over 16x16 block.
1505     int thresh_pred_err_mb = (200 << 4);
1506     int pred_err_mb = (int)(cpi->mb.prediction_error / cpi->common.MBs);
1507     // Reduce/ignore thresh_rate if pred_err_mb much larger than its threshold,
1508     // give more weight to pred_err metric for overshoot detection.
1509     if (cpi->drop_frames_allowed && pred_err_mb > (thresh_pred_err_mb << 4))
1510       thresh_rate = thresh_rate >> 3;
1511     if ((Q < thresh_qp && cpi->projected_frame_size > thresh_rate &&
1512          pred_err_mb > thresh_pred_err_mb &&
1513          pred_err_mb > 2 * cpi->last_pred_err_mb) ||
1514         force_drop_overshoot) {
1515       unsigned int i;
1516       double new_correction_factor;
1517       int target_bits_per_mb;
1518       const int target_size = cpi->av_per_frame_bandwidth;
1519       // Flag to indicate we will force next frame to be encoded at max QP.
1520       cpi->force_maxqp = 1;
1521       // Reset the buffer levels.
1522       cpi->buffer_level = cpi->oxcf.optimal_buffer_level;
1523       cpi->bits_off_target = cpi->oxcf.optimal_buffer_level;
1524       // Compute a new rate correction factor, corresponding to the current
1525       // target frame size and max_QP, and adjust the rate correction factor
1526       // upwards, if needed.
1527       // This is to prevent a bad state where the re-encoded frame at max_QP
1528       // undershoots significantly, and then we end up dropping every other
1529       // frame because the QP/rate_correction_factor may have been too low
1530       // before the drop and then takes too long to come up.
1531       if (target_size >= (INT_MAX >> BPER_MB_NORMBITS)) {
1532         target_bits_per_mb = (target_size / cpi->common.MBs)
1533                              << BPER_MB_NORMBITS;
1534       } else {
1535         target_bits_per_mb =
1536             (target_size << BPER_MB_NORMBITS) / cpi->common.MBs;
1537       }
1538       // Rate correction factor based on target_size_per_mb and max_QP.
1539       new_correction_factor =
1540           (double)target_bits_per_mb /
1541           (double)vp8_bits_per_mb[INTER_FRAME][cpi->worst_quality];
1542       if (new_correction_factor > cpi->rate_correction_factor) {
1543         cpi->rate_correction_factor =
1544             VPXMIN(2.0 * cpi->rate_correction_factor, new_correction_factor);
1545       }
1546       if (cpi->rate_correction_factor > MAX_BPB_FACTOR) {
1547         cpi->rate_correction_factor = MAX_BPB_FACTOR;
1548       }
1549       // Drop this frame: update frame counters.
1550       cpi->common.current_video_frame++;
1551       cpi->frames_since_key++;
1552       cpi->temporal_pattern_counter++;
1553       cpi->frames_since_last_drop_overshoot = 0;
1554       if (cpi->oxcf.number_of_layers > 1) {
1555         // Set max_qp and rate correction for all temporal layers if overshoot
1556         // is detected.
1557         for (i = 0; i < cpi->oxcf.number_of_layers; ++i) {
1558           LAYER_CONTEXT *lc = &cpi->layer_context[i];
1559           lc->force_maxqp = 1;
1560           lc->frames_since_last_drop_overshoot = 0;
1561           lc->rate_correction_factor = cpi->rate_correction_factor;
1562         }
1563       }
1564 #if CONFIG_MULTI_RES_ENCODING
1565       if (cpi->oxcf.mr_total_resolutions > 1)
1566         low_res_frame_info->is_frame_dropped_overshoot_maxqp = 1;
1567 #endif
1568       return 1;
1569     }
1570     cpi->force_maxqp = 0;
1571     cpi->frames_since_last_drop_overshoot++;
1572 #if CONFIG_MULTI_RES_ENCODING
1573     if (cpi->oxcf.mr_total_resolutions > 1)
1574       low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0;
1575 #endif
1576     return 0;
1577   }
1578   cpi->force_maxqp = 0;
1579   cpi->frames_since_last_drop_overshoot++;
1580 #if CONFIG_MULTI_RES_ENCODING
1581   if (cpi->oxcf.mr_total_resolutions > 1)
1582     low_res_frame_info->is_frame_dropped_overshoot_maxqp = 0;
1583 #endif
1584   return 0;
1585 }
1586