2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
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.
19 #include "vp8/common/common.h"
21 #include "vp8/common/entropymode.h"
22 #include "vpx_mem/vpx_mem.h"
23 #include "vp8/common/systemdependent.h"
27 #define MIN_BPB_FACTOR 0.01
28 #define MAX_BPB_FACTOR 50
30 extern const MB_PREDICTION_MODE vp8_mode_order
[MAX_MODES
];
31 extern const MV_REFERENCE_FRAME vp8_ref_frame_order
[MAX_MODES
];
36 extern int y_modes
[5];
37 extern int uv_modes
[4];
38 extern int b_modes
[10];
40 extern int inter_y_modes
[10];
41 extern int inter_uv_modes
[4];
42 extern int inter_b_modes
[10];
45 // Bits Per MB at different Q (Multiplied by 512)
46 #define BPER_MB_NORMBITS 9
48 // Work in progress recalibration of baseline rate tables based on
49 // the assumption that bits per mb is inversely proportional to the
51 const int vp8_bits_per_mb
[2][QINDEX_RANGE
] =
53 // Intra case 450000/Qintra
55 1125000,900000, 750000, 642857, 562500, 500000, 450000, 450000,
56 409090, 375000, 346153, 321428, 300000, 281250, 264705, 264705,
57 250000, 236842, 225000, 225000, 214285, 214285, 204545, 204545,
58 195652, 195652, 187500, 180000, 180000, 173076, 166666, 160714,
59 155172, 150000, 145161, 140625, 136363, 132352, 128571, 125000,
60 121621, 121621, 118421, 115384, 112500, 109756, 107142, 104651,
61 102272, 100000, 97826, 97826, 95744, 93750, 91836, 90000,
62 88235, 86538, 84905, 83333, 81818, 80357, 78947, 77586,
63 76271, 75000, 73770, 72580, 71428, 70312, 69230, 68181,
64 67164, 66176, 65217, 64285, 63380, 62500, 61643, 60810,
65 60000, 59210, 59210, 58441, 57692, 56962, 56250, 55555,
66 54878, 54216, 53571, 52941, 52325, 51724, 51136, 50561,
67 49450, 48387, 47368, 46875, 45918, 45000, 44554, 44117,
68 43269, 42452, 41666, 40909, 40178, 39473, 38793, 38135,
69 36885, 36290, 35714, 35156, 34615, 34090, 33582, 33088,
70 32608, 32142, 31468, 31034, 30405, 29801, 29220, 28662,
72 // Inter case 285000/Qinter
74 712500, 570000, 475000, 407142, 356250, 316666, 285000, 259090,
75 237500, 219230, 203571, 190000, 178125, 167647, 158333, 150000,
76 142500, 135714, 129545, 123913, 118750, 114000, 109615, 105555,
77 101785, 98275, 95000, 91935, 89062, 86363, 83823, 81428,
78 79166, 77027, 75000, 73076, 71250, 69512, 67857, 66279,
79 64772, 63333, 61956, 60638, 59375, 58163, 57000, 55882,
80 54807, 53773, 52777, 51818, 50892, 50000, 49137, 47500,
81 45967, 44531, 43181, 41911, 40714, 39583, 38513, 37500,
82 36538, 35625, 34756, 33928, 33139, 32386, 31666, 30978,
83 30319, 29687, 29081, 28500, 27941, 27403, 26886, 26388,
84 25909, 25446, 25000, 24568, 23949, 23360, 22800, 22265,
85 21755, 21268, 20802, 20357, 19930, 19520, 19127, 18750,
86 18387, 18037, 17701, 17378, 17065, 16764, 16473, 16101,
87 15745, 15405, 15079, 14766, 14467, 14179, 13902, 13636,
88 13380, 13133, 12895, 12666, 12445, 12179, 11924, 11632,
89 11445, 11220, 11003, 10795, 10594, 10401, 10215, 10035,
93 static const int kf_boost_qadjustment
[QINDEX_RANGE
] =
95 128, 129, 130, 131, 132, 133, 134, 135,
96 136, 137, 138, 139, 140, 141, 142, 143,
97 144, 145, 146, 147, 148, 149, 150, 151,
98 152, 153, 154, 155, 156, 157, 158, 159,
99 160, 161, 162, 163, 164, 165, 166, 167,
100 168, 169, 170, 171, 172, 173, 174, 175,
101 176, 177, 178, 179, 180, 181, 182, 183,
102 184, 185, 186, 187, 188, 189, 190, 191,
103 192, 193, 194, 195, 196, 197, 198, 199,
104 200, 200, 201, 201, 202, 203, 203, 203,
105 204, 204, 205, 205, 206, 206, 207, 207,
106 208, 208, 209, 209, 210, 210, 211, 211,
107 212, 212, 213, 213, 214, 214, 215, 215,
108 216, 216, 217, 217, 218, 218, 219, 219,
109 220, 220, 220, 220, 220, 220, 220, 220,
110 220, 220, 220, 220, 220, 220, 220, 220,
113 //#define GFQ_ADJUSTMENT (Q+100)
114 #define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
115 const int vp8_gf_boost_qadjustment
[QINDEX_RANGE
] =
117 80, 82, 84, 86, 88, 90, 92, 94,
118 96, 97, 98, 99, 100, 101, 102, 103,
119 104, 105, 106, 107, 108, 109, 110, 111,
120 112, 113, 114, 115, 116, 117, 118, 119,
121 120, 121, 122, 123, 124, 125, 126, 127,
122 128, 129, 130, 131, 132, 133, 134, 135,
123 136, 137, 138, 139, 140, 141, 142, 143,
124 144, 145, 146, 147, 148, 149, 150, 151,
125 152, 153, 154, 155, 156, 157, 158, 159,
126 160, 161, 162, 163, 164, 165, 166, 167,
127 168, 169, 170, 171, 172, 173, 174, 175,
128 176, 177, 178, 179, 180, 181, 182, 183,
129 184, 184, 185, 185, 186, 186, 187, 187,
130 188, 188, 189, 189, 190, 190, 191, 191,
131 192, 192, 193, 193, 194, 194, 194, 194,
132 195, 195, 196, 196, 197, 197, 198, 198
136 const int vp8_gf_boost_qadjustment[QINDEX_RANGE] =
138 100,101,102,103,104,105,105,106,
139 106,107,107,108,109,109,110,111,
140 112,113,114,115,116,117,118,119,
141 120,121,122,123,124,125,126,127,
142 128,129,130,131,132,133,134,135,
143 136,137,138,139,140,141,142,143,
144 144,145,146,147,148,149,150,151,
145 152,153,154,155,156,157,158,159,
146 160,161,162,163,164,165,166,167,
147 168,169,170,170,171,171,172,172,
148 173,173,173,174,174,174,175,175,
149 175,176,176,176,177,177,177,177,
150 178,178,179,179,180,180,181,181,
151 182,182,183,183,184,184,185,185,
152 186,186,187,187,188,188,189,189,
153 190,190,191,191,192,192,193,193,
157 static const int kf_gf_boost_qlimits
[QINDEX_RANGE
] =
159 150, 155, 160, 165, 170, 175, 180, 185,
160 190, 195, 200, 205, 210, 215, 220, 225,
161 230, 235, 240, 245, 250, 255, 260, 265,
162 270, 275, 280, 285, 290, 295, 300, 305,
163 310, 320, 330, 340, 350, 360, 370, 380,
164 390, 400, 410, 420, 430, 440, 450, 460,
165 470, 480, 490, 500, 510, 520, 530, 540,
166 550, 560, 570, 580, 590, 600, 600, 600,
167 600, 600, 600, 600, 600, 600, 600, 600,
168 600, 600, 600, 600, 600, 600, 600, 600,
169 600, 600, 600, 600, 600, 600, 600, 600,
170 600, 600, 600, 600, 600, 600, 600, 600,
171 600, 600, 600, 600, 600, 600, 600, 600,
172 600, 600, 600, 600, 600, 600, 600, 600,
173 600, 600, 600, 600, 600, 600, 600, 600,
174 600, 600, 600, 600, 600, 600, 600, 600,
177 // % adjustment to target kf size based on seperation from previous frame
178 static const int kf_boost_seperation_adjustment
[16] =
180 30, 40, 50, 55, 60, 65, 70, 75,
181 80, 85, 90, 95, 100, 100, 100, 100,
185 static const int gf_adjust_table
[101] =
188 115, 130, 145, 160, 175, 190, 200, 210, 220, 230,
189 240, 260, 270, 280, 290, 300, 310, 320, 330, 340,
190 350, 360, 370, 380, 390, 400, 400, 400, 400, 400,
191 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
192 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
193 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
194 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
195 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
196 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
197 400, 400, 400, 400, 400, 400, 400, 400, 400, 400,
200 static const int gf_intra_usage_adjustment
[20] =
202 125, 120, 115, 110, 105, 100, 95, 85, 80, 75,
203 70, 65, 60, 55, 50, 50, 50, 50, 50, 50,
206 static const int gf_interval_table
[101] =
209 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
210 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
211 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
212 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
213 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
214 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
215 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
216 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
217 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
218 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
221 static const unsigned int prior_key_frame_weight
[KEY_FRAME_CONTEXT
] = { 1, 2, 3, 4, 5 };
224 void vp8_save_coding_context(VP8_COMP
*cpi
)
226 CODING_CONTEXT
*const cc
= & cpi
->coding_context
;
228 // Stores a snapshot of key state variables which can subsequently be
229 // restored with a call to vp8_restore_coding_context. These functions are
230 // intended for use in a re-code loop in vp8_compress_frame where the
231 // quantizer value is adjusted between loop iterations.
233 cc
->frames_since_key
= cpi
->frames_since_key
;
234 cc
->filter_level
= cpi
->common
.filter_level
;
235 cc
->frames_till_gf_update_due
= cpi
->frames_till_gf_update_due
;
236 cc
->frames_since_golden
= cpi
->common
.frames_since_golden
;
238 vp8_copy(cc
->mvc
, cpi
->common
.fc
.mvc
);
239 vp8_copy(cc
->mvcosts
, cpi
->mb
.mvcosts
);
241 vp8_copy(cc
->kf_ymode_prob
, cpi
->common
.kf_ymode_prob
);
242 vp8_copy(cc
->ymode_prob
, cpi
->common
.fc
.ymode_prob
);
243 vp8_copy(cc
->kf_uv_mode_prob
, cpi
->common
.kf_uv_mode_prob
);
244 vp8_copy(cc
->uv_mode_prob
, cpi
->common
.fc
.uv_mode_prob
);
246 vp8_copy(cc
->ymode_count
, cpi
->ymode_count
);
247 vp8_copy(cc
->uv_mode_count
, cpi
->uv_mode_count
);
252 vp8_copy(cc
->y_modes
, y_modes
);
253 vp8_copy(cc
->uv_modes
, uv_modes
);
254 vp8_copy(cc
->b_modes
, b_modes
);
255 vp8_copy(cc
->inter_y_modes
, inter_y_modes
);
256 vp8_copy(cc
->inter_uv_modes
, inter_uv_modes
);
257 vp8_copy(cc
->inter_b_modes
, inter_b_modes
);
260 cc
->this_frame_percent_intra
= cpi
->this_frame_percent_intra
;
264 void vp8_restore_coding_context(VP8_COMP
*cpi
)
266 CODING_CONTEXT
*const cc
= & cpi
->coding_context
;
268 // Restore key state variables to the snapshot state stored in the
269 // previous call to vp8_save_coding_context.
271 cpi
->frames_since_key
= cc
->frames_since_key
;
272 cpi
->common
.filter_level
= cc
->filter_level
;
273 cpi
->frames_till_gf_update_due
= cc
->frames_till_gf_update_due
;
274 cpi
->common
.frames_since_golden
= cc
->frames_since_golden
;
276 vp8_copy(cpi
->common
.fc
.mvc
, cc
->mvc
);
278 vp8_copy(cpi
->mb
.mvcosts
, cc
->mvcosts
);
280 vp8_copy(cpi
->common
.kf_ymode_prob
, cc
->kf_ymode_prob
);
281 vp8_copy(cpi
->common
.fc
.ymode_prob
, cc
->ymode_prob
);
282 vp8_copy(cpi
->common
.kf_uv_mode_prob
, cc
->kf_uv_mode_prob
);
283 vp8_copy(cpi
->common
.fc
.uv_mode_prob
, cc
->uv_mode_prob
);
285 vp8_copy(cpi
->ymode_count
, cc
->ymode_count
);
286 vp8_copy(cpi
->uv_mode_count
, cc
->uv_mode_count
);
290 vp8_copy(y_modes
, cc
->y_modes
);
291 vp8_copy(uv_modes
, cc
->uv_modes
);
292 vp8_copy(b_modes
, cc
->b_modes
);
293 vp8_copy(inter_y_modes
, cc
->inter_y_modes
);
294 vp8_copy(inter_uv_modes
, cc
->inter_uv_modes
);
295 vp8_copy(inter_b_modes
, cc
->inter_b_modes
);
299 cpi
->this_frame_percent_intra
= cc
->this_frame_percent_intra
;
303 void vp8_setup_key_frame(VP8_COMP
*cpi
)
305 // Setup for Key frame:
307 vp8_default_coef_probs(& cpi
->common
);
308 vp8_kf_default_bmode_probs(cpi
->common
.kf_bmode_prob
);
310 vpx_memcpy(cpi
->common
.fc
.mvc
, vp8_default_mv_context
, sizeof(vp8_default_mv_context
));
312 int flag
[2] = {1, 1};
313 vp8_build_component_cost_table(cpi
->mb
.mvcost
, (const MV_CONTEXT
*) cpi
->common
.fc
.mvc
, flag
);
316 vpx_memset(cpi
->common
.fc
.pre_mvc
, 0, sizeof(cpi
->common
.fc
.pre_mvc
)); //initialize pre_mvc to all zero.
318 //cpi->common.filter_level = 0; // Reset every key frame.
319 cpi
->common
.filter_level
= cpi
->common
.base_qindex
* 3 / 8 ;
321 // Provisional interval before next GF
323 //cpi->frames_till_gf_update_due = DEFAULT_GF_INTERVAL;
324 cpi
->frames_till_gf_update_due
= cpi
->baseline_gf_interval
;
326 cpi
->frames_till_gf_update_due
= cpi
->goldfreq
;
328 cpi
->common
.refresh_golden_frame
= TRUE
;
329 cpi
->common
.refresh_alt_ref_frame
= TRUE
;
333 static int estimate_bits_at_q(int frame_kind
, int Q
, int MBs
,
334 double correction_factor
)
336 int Bpm
= (int)(.5 + correction_factor
* vp8_bits_per_mb
[frame_kind
][Q
]);
338 /* Attempt to retain reasonable accuracy without overflow. The cutoff is
339 * chosen such that the maximum product of Bpm and MBs fits 31 bits. The
340 * largest Bpm takes 20 bits.
343 return (Bpm
>> BPER_MB_NORMBITS
) * MBs
;
345 return (Bpm
* MBs
) >> BPER_MB_NORMBITS
;
349 static void calc_iframe_target_size(VP8_COMP
*cpi
)
351 // boost defaults to half second
355 // Clear down mmx registers to allow floating point in what follows
356 vp8_clear_system_state(); //__asm emms;
358 if (cpi
->oxcf
.fixed_q
>= 0)
360 int Q
= cpi
->oxcf
.key_q
;
362 target
= estimate_bits_at_q(INTRA_FRAME
, Q
, cpi
->common
.MBs
,
363 cpi
->key_frame_rate_correction_factor
);
365 else if (cpi
->pass
== 2)
368 target
= cpi
->per_frame_bandwidth
;
370 // First Frame is a special case
371 else if (cpi
->common
.current_video_frame
== 0)
373 /* 1 Pass there is no information on which to base size so use
374 * bandwidth per second * fraction of the initial buffer
377 target
= cpi
->oxcf
.starting_buffer_level
/ 2;
379 if(target
> cpi
->oxcf
.target_bandwidth
* 3 / 2)
380 target
= cpi
->oxcf
.target_bandwidth
* 3 / 2;
384 // if this keyframe was forced, use a more recent Q estimate
385 int Q
= (cpi
->common
.frame_flags
& FRAMEFLAGS_KEY
)
386 ? cpi
->avg_frame_qindex
: cpi
->ni_av_qi
;
388 // Boost depends somewhat on frame rate
389 kf_boost
= (int)(2 * cpi
->output_frame_rate
- 16);
391 // adjustment up based on q
392 kf_boost
= kf_boost
* kf_boost_qadjustment
[Q
] / 100;
394 // frame separation adjustment ( down)
395 if (cpi
->frames_since_key
< cpi
->output_frame_rate
/ 2)
396 kf_boost
= (int)(kf_boost
397 * cpi
->frames_since_key
/ (cpi
->output_frame_rate
/ 2));
402 target
= ((16 + kf_boost
) * cpi
->per_frame_bandwidth
) >> 4;
406 if (cpi
->oxcf
.rc_max_intra_bitrate_pct
)
408 unsigned int max_rate
= cpi
->per_frame_bandwidth
409 * cpi
->oxcf
.rc_max_intra_bitrate_pct
/ 100;
411 if (target
> max_rate
)
415 cpi
->this_frame_target
= target
;
417 // TODO: if we separate rate targeting from Q targetting, move this.
418 // Reset the active worst quality to the baseline value for key frames.
420 cpi
->active_worst_quality
= cpi
->worst_quality
;
426 f
= fopen("kf_boost.stt", "a");
427 //fprintf(f, " %8d %10d %10d %10d %10d %10d %10d\n",
428 // cpi->common.current_video_frame, cpi->target_bandwidth, cpi->frames_to_key, kf_boost_qadjustment[cpi->ni_av_qi], cpi->kf_boost, (cpi->this_frame_target *100 / cpi->per_frame_bandwidth), cpi->this_frame_target );
430 fprintf(f
, " %8u %10d %10d %10d\n",
431 cpi
->common
.current_video_frame
, cpi
->gfu_boost
, cpi
->baseline_gf_interval
, cpi
->source_alt_ref_pending
);
439 // Do the best we can to define the parameteres for the next GF based on what information we have available.
440 static void calc_gf_params(VP8_COMP
*cpi
)
442 int Q
= (cpi
->oxcf
.fixed_q
< 0) ? cpi
->last_q
[INTER_FRAME
] : cpi
->oxcf
.fixed_q
;
445 int gf_frame_useage
= 0; // Golden frame useage since last GF
446 int tot_mbs
= cpi
->recent_ref_frame_usage
[INTRA_FRAME
] +
447 cpi
->recent_ref_frame_usage
[LAST_FRAME
] +
448 cpi
->recent_ref_frame_usage
[GOLDEN_FRAME
] +
449 cpi
->recent_ref_frame_usage
[ALTREF_FRAME
];
451 int pct_gf_active
= (100 * cpi
->gf_active_count
) / (cpi
->common
.mb_rows
* cpi
->common
.mb_cols
);
453 // Reset the last boost indicator
454 //cpi->last_boost = 100;
457 gf_frame_useage
= (cpi
->recent_ref_frame_usage
[GOLDEN_FRAME
] + cpi
->recent_ref_frame_usage
[ALTREF_FRAME
]) * 100 / tot_mbs
;
459 if (pct_gf_active
> gf_frame_useage
)
460 gf_frame_useage
= pct_gf_active
;
465 // Single Pass lagged mode: TBD
470 // Single Pass compression: Has to use current and historical data
475 int index
= cpi
->one_pass_frame_index
;
476 int frames_to_scan
= (cpi
->max_gf_interval
<= MAX_LAG_BUFFERS
) ? cpi
->max_gf_interval
: MAX_LAG_BUFFERS
;
479 // *************** Experimental code - incomplete
480 double decay_val = 1.0;
481 double IIAccumulator = 0.0;
482 double last_iiaccumulator = 0.0;
485 cpi->one_pass_frame_index = cpi->common.current_video_frame%MAX_LAG_BUFFERS;
487 for ( i = 0; i < (frames_to_scan - 1); i++ )
490 index = MAX_LAG_BUFFERS;
493 if ( cpi->one_pass_frame_stats[index].frame_coded_error > 0.0 )
495 IIRatio = cpi->one_pass_frame_stats[index].frame_intra_error / cpi->one_pass_frame_stats[index].frame_coded_error;
497 if ( IIRatio > 30.0 )
503 IIAccumulator += IIRatio * decay_val;
505 decay_val = decay_val * cpi->one_pass_frame_stats[index].frame_pcnt_inter;
507 if ( (i > MIN_GF_INTERVAL) &&
508 ((IIAccumulator - last_iiaccumulator) < 2.0) )
512 last_iiaccumulator = IIAccumulator;
515 Boost = IIAccumulator*100.0/16.0;
516 cpi->baseline_gf_interval = i;
521 /*************************************************************/
524 // Adjust boost based upon ambient Q
525 Boost
= GFQ_ADJUSTMENT
;
527 // Adjust based upon most recently measure intra useage
528 Boost
= Boost
* gf_intra_usage_adjustment
[(cpi
->this_frame_percent_intra
< 15) ? cpi
->this_frame_percent_intra
: 14] / 100;
530 // Adjust gf boost based upon GF usage since last GF
531 Boost
= Boost
* gf_adjust_table
[gf_frame_useage
] / 100;
535 // golden frame boost without recode loop often goes awry. be safe by keeping numbers down.
536 if (!cpi
->sf
.recode_loop
)
538 if (cpi
->compressor_speed
== 2)
542 // Apply an upper limit based on Q for 1 pass encodes
543 if (Boost
> kf_gf_boost_qlimits
[Q
] && (cpi
->pass
== 0))
544 Boost
= kf_gf_boost_qlimits
[Q
];
546 // Apply lower limits to boost.
547 else if (Boost
< 110)
550 // Note the boost used
551 cpi
->last_boost
= Boost
;
555 // Estimate next interval
556 // This is updated once the real frame size/boost is known.
557 if (cpi
->oxcf
.fixed_q
== -1)
559 if (cpi
->pass
== 2) // 2 Pass
561 cpi
->frames_till_gf_update_due
= cpi
->baseline_gf_interval
;
565 cpi
->frames_till_gf_update_due
= cpi
->baseline_gf_interval
;
567 if (cpi
->last_boost
> 750)
568 cpi
->frames_till_gf_update_due
++;
570 if (cpi
->last_boost
> 1000)
571 cpi
->frames_till_gf_update_due
++;
573 if (cpi
->last_boost
> 1250)
574 cpi
->frames_till_gf_update_due
++;
576 if (cpi
->last_boost
>= 1500)
577 cpi
->frames_till_gf_update_due
++;
579 if (gf_interval_table
[gf_frame_useage
] > cpi
->frames_till_gf_update_due
)
580 cpi
->frames_till_gf_update_due
= gf_interval_table
[gf_frame_useage
];
582 if (cpi
->frames_till_gf_update_due
> cpi
->max_gf_interval
)
583 cpi
->frames_till_gf_update_due
= cpi
->max_gf_interval
;
587 cpi
->frames_till_gf_update_due
= cpi
->baseline_gf_interval
;
592 // For now Alt ref is not allowed except in 2 pass modes.
593 cpi
->source_alt_ref_pending
= FALSE
;
595 /*if ( cpi->oxcf.fixed_q == -1)
597 if ( cpi->oxcf.play_alternate && (cpi->last_boost > (100 + (AF_THRESH*cpi->frames_till_gf_update_due)) ) )
598 cpi->source_alt_ref_pending = TRUE;
600 cpi->source_alt_ref_pending = FALSE;
606 static void calc_pframe_target_size(VP8_COMP
*cpi
)
608 int min_frame_target
;
611 min_frame_target
= 0;
615 min_frame_target
= cpi
->min_frame_bandwidth
;
617 if (min_frame_target
< (cpi
->av_per_frame_bandwidth
>> 5))
618 min_frame_target
= cpi
->av_per_frame_bandwidth
>> 5;
620 else if (min_frame_target
< cpi
->per_frame_bandwidth
/ 4)
621 min_frame_target
= cpi
->per_frame_bandwidth
/ 4;
624 // Special alt reference frame case
625 if (cpi
->common
.refresh_alt_ref_frame
)
629 cpi
->per_frame_bandwidth
= cpi
->twopass
.gf_bits
; // Per frame bit target for the alt ref frame
630 cpi
->this_frame_target
= cpi
->per_frame_bandwidth
;
633 /* One Pass ??? TBD */
636 int frames_in_section;
637 int allocation_chunks;
638 int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
642 alt_boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
643 alt_boost += (cpi->frames_till_gf_update_due * 50);
645 // If alt ref is not currently active then we have a pottential double hit with GF and ARF so reduce the boost a bit.
646 // A similar thing is done on GFs that preceed a arf update.
647 if ( !cpi->source_alt_ref_active )
648 alt_boost = alt_boost * 3 / 4;
650 frames_in_section = cpi->frames_till_gf_update_due+1; // Standard frames + GF
651 allocation_chunks = (frames_in_section * 100) + alt_boost;
653 // Normalize Altboost and allocations chunck down to prevent overflow
654 while ( alt_boost > 1000 )
657 allocation_chunks /= 2;
664 if ( cpi->kf_overspend_bits > 0 )
666 Adjustment = (cpi->kf_bitrate_adjustment <= cpi->kf_overspend_bits) ? cpi->kf_bitrate_adjustment : cpi->kf_overspend_bits;
668 if ( Adjustment > (cpi->per_frame_bandwidth - min_frame_target) )
669 Adjustment = (cpi->per_frame_bandwidth - min_frame_target);
671 cpi->kf_overspend_bits -= Adjustment;
673 // Calculate an inter frame bandwidth target for the next few frames designed to recover
674 // any extra bits spent on the key frame.
675 cpi->inter_frame_target = cpi->per_frame_bandwidth - Adjustment;
676 if ( cpi->inter_frame_target < min_frame_target )
677 cpi->inter_frame_target = min_frame_target;
680 cpi->inter_frame_target = cpi->per_frame_bandwidth;
682 bits_in_section = cpi->inter_frame_target * frames_in_section;
684 // Avoid loss of precision but avoid overflow
685 if ( (bits_in_section>>7) > allocation_chunks )
686 cpi->this_frame_target = alt_boost * (bits_in_section / allocation_chunks);
688 cpi->this_frame_target = (alt_boost * bits_in_section) / allocation_chunks;
694 // Normal frames (gf,and inter)
700 cpi
->this_frame_target
= cpi
->per_frame_bandwidth
;
705 // Make rate adjustment to recover bits spent in key frame
706 // Test to see if the key frame inter data rate correction should still be in force
707 if (cpi
->kf_overspend_bits
> 0)
709 Adjustment
= (cpi
->kf_bitrate_adjustment
<= cpi
->kf_overspend_bits
) ? cpi
->kf_bitrate_adjustment
: cpi
->kf_overspend_bits
;
711 if (Adjustment
> (cpi
->per_frame_bandwidth
- min_frame_target
))
712 Adjustment
= (cpi
->per_frame_bandwidth
- min_frame_target
);
714 cpi
->kf_overspend_bits
-= Adjustment
;
716 // Calculate an inter frame bandwidth target for the next few frames designed to recover
717 // any extra bits spent on the key frame.
718 cpi
->this_frame_target
= cpi
->per_frame_bandwidth
- Adjustment
;
720 if (cpi
->this_frame_target
< min_frame_target
)
721 cpi
->this_frame_target
= min_frame_target
;
724 cpi
->this_frame_target
= cpi
->per_frame_bandwidth
;
726 // If appropriate make an adjustment to recover bits spent on a recent GF
727 if ((cpi
->gf_overspend_bits
> 0) && (cpi
->this_frame_target
> min_frame_target
))
729 int Adjustment
= (cpi
->non_gf_bitrate_adjustment
<= cpi
->gf_overspend_bits
) ? cpi
->non_gf_bitrate_adjustment
: cpi
->gf_overspend_bits
;
731 if (Adjustment
> (cpi
->this_frame_target
- min_frame_target
))
732 Adjustment
= (cpi
->this_frame_target
- min_frame_target
);
734 cpi
->gf_overspend_bits
-= Adjustment
;
735 cpi
->this_frame_target
-= Adjustment
;
738 // Apply small + and - boosts for non gf frames
739 if ((cpi
->last_boost
> 150) && (cpi
->frames_till_gf_update_due
> 0) &&
740 (cpi
->current_gf_interval
>= (MIN_GF_INTERVAL
<< 1)))
742 // % Adjustment limited to the range 1% to 10%
743 Adjustment
= (cpi
->last_boost
- 100) >> 5;
747 else if (Adjustment
> 10)
751 Adjustment
= (cpi
->this_frame_target
* Adjustment
) / 100;
753 if (Adjustment
> (cpi
->this_frame_target
- min_frame_target
))
754 Adjustment
= (cpi
->this_frame_target
- min_frame_target
);
756 if (cpi
->common
.frames_since_golden
== (cpi
->current_gf_interval
>> 1))
757 cpi
->this_frame_target
+= ((cpi
->current_gf_interval
- 1) * Adjustment
);
759 cpi
->this_frame_target
-= Adjustment
;
764 // Sanity check that the total sum of adjustments is not above the maximum allowed
765 // That is that having allowed for KF and GF penalties we have not pushed the
766 // current interframe target to low. If the adjustment we apply here is not capable of recovering
767 // all the extra bits we have spent in the KF or GF then the remainder will have to be recovered over
768 // a longer time span via other buffer / rate control mechanisms.
769 if (cpi
->this_frame_target
< min_frame_target
)
770 cpi
->this_frame_target
= min_frame_target
;
772 if (!cpi
->common
.refresh_alt_ref_frame
)
773 // Note the baseline target data rate for this inter frame.
774 cpi
->inter_frame_target
= cpi
->this_frame_target
;
776 // One Pass specific code
779 // Adapt target frame size with respect to any buffering constraints:
780 if (cpi
->buffered_mode
)
782 int one_percent_bits
= 1 + cpi
->oxcf
.optimal_buffer_level
/ 100;
784 if ((cpi
->buffer_level
< cpi
->oxcf
.optimal_buffer_level
) ||
785 (cpi
->bits_off_target
< cpi
->oxcf
.optimal_buffer_level
))
789 // Decide whether or not we need to adjust the frame data rate target.
791 // If we are are below the optimal buffer fullness level and adherence
792 // to buffering contraints is important to the end useage then adjust
793 // the per frame target.
794 if ((cpi
->oxcf
.end_usage
== USAGE_STREAM_FROM_SERVER
) &&
795 (cpi
->buffer_level
< cpi
->oxcf
.optimal_buffer_level
))
798 (cpi
->oxcf
.optimal_buffer_level
- cpi
->buffer_level
) /
801 // Are we overshooting the long term clip data rate...
802 else if (cpi
->bits_off_target
< 0)
804 // Adjust per frame data target downwards to compensate.
805 percent_low
= (int)(100 * -cpi
->bits_off_target
/
806 (cpi
->total_byte_count
* 8));
809 if (percent_low
> cpi
->oxcf
.under_shoot_pct
)
810 percent_low
= cpi
->oxcf
.under_shoot_pct
;
811 else if (percent_low
< 0)
814 // lower the target bandwidth for this frame.
815 cpi
->this_frame_target
-= (cpi
->this_frame_target
* percent_low
)
818 // Are we using allowing control of active_worst_allowed_q
819 // according to buffer level.
820 if (cpi
->auto_worst_q
)
822 int critical_buffer_level
;
824 // For streaming applications the most important factor is
825 // cpi->buffer_level as this takes into account the
826 // specified short term buffering constraints. However,
827 // hitting the long term clip data rate target is also
829 if (cpi
->oxcf
.end_usage
== USAGE_STREAM_FROM_SERVER
)
831 // Take the smaller of cpi->buffer_level and
832 // cpi->bits_off_target
833 critical_buffer_level
=
834 (cpi
->buffer_level
< cpi
->bits_off_target
)
835 ? cpi
->buffer_level
: cpi
->bits_off_target
;
837 // For local file playback short term buffering contraints
838 // are less of an issue
841 // Consider only how we are doing for the clip as a
843 critical_buffer_level
= cpi
->bits_off_target
;
846 // Set the active worst quality based upon the selected
847 // buffer fullness number.
848 if (critical_buffer_level
< cpi
->oxcf
.optimal_buffer_level
)
850 if ( critical_buffer_level
>
851 (cpi
->oxcf
.optimal_buffer_level
>> 2) )
853 int64_t qadjustment_range
=
854 cpi
->worst_quality
- cpi
->ni_av_qi
;
856 (critical_buffer_level
-
857 (cpi
->oxcf
.optimal_buffer_level
>> 2));
859 // Step active worst quality down from
860 // cpi->ni_av_qi when (critical_buffer_level ==
861 // cpi->optimal_buffer_level) to
862 // cpi->worst_quality when
863 // (critical_buffer_level ==
864 // cpi->optimal_buffer_level >> 2)
865 cpi
->active_worst_quality
=
867 ((qadjustment_range
* above_base
) /
868 (cpi
->oxcf
.optimal_buffer_level
*3>>2));
872 cpi
->active_worst_quality
= cpi
->worst_quality
;
877 cpi
->active_worst_quality
= cpi
->ni_av_qi
;
882 cpi
->active_worst_quality
= cpi
->worst_quality
;
887 int percent_high
= 0;
889 if ((cpi
->oxcf
.end_usage
== USAGE_STREAM_FROM_SERVER
)
890 && (cpi
->buffer_level
> cpi
->oxcf
.optimal_buffer_level
))
892 percent_high
= (cpi
->buffer_level
893 - cpi
->oxcf
.optimal_buffer_level
)
896 else if (cpi
->bits_off_target
> cpi
->oxcf
.optimal_buffer_level
)
898 percent_high
= (int)((100 * cpi
->bits_off_target
)
899 / (cpi
->total_byte_count
* 8));
902 if (percent_high
> cpi
->oxcf
.over_shoot_pct
)
903 percent_high
= cpi
->oxcf
.over_shoot_pct
;
904 else if (percent_high
< 0)
907 cpi
->this_frame_target
+= (cpi
->this_frame_target
*
911 // Are we allowing control of active_worst_allowed_q according to bufferl level.
912 if (cpi
->auto_worst_q
)
914 // When using the relaxed buffer model stick to the user specified value
915 cpi
->active_worst_quality
= cpi
->ni_av_qi
;
919 cpi
->active_worst_quality
= cpi
->worst_quality
;
923 // Set active_best_quality to prevent quality rising too high
924 cpi
->active_best_quality
= cpi
->best_quality
;
926 // Worst quality obviously must not be better than best quality
927 if (cpi
->active_worst_quality
<= cpi
->active_best_quality
)
928 cpi
->active_worst_quality
= cpi
->active_best_quality
+ 1;
931 // Unbuffered mode (eg. video conferencing)
934 // Set the active worst quality
935 cpi
->active_worst_quality
= cpi
->worst_quality
;
938 // Special trap for constrained quality mode
939 // "active_worst_quality" may never drop below cq level
940 // for any frame type.
941 if ( cpi
->oxcf
.end_usage
== USAGE_CONSTRAINED_QUALITY
&&
942 cpi
->active_worst_quality
< cpi
->cq_target_quality
)
944 cpi
->active_worst_quality
= cpi
->cq_target_quality
;
948 // Test to see if we have to drop a frame
949 // The auto-drop frame code is only used in buffered mode.
950 // In unbufferd mode (eg vide conferencing) the descision to
951 // code or drop a frame is made outside the codec in response to real
952 // world comms or buffer considerations.
953 if (cpi
->drop_frames_allowed
&& cpi
->buffered_mode
&&
954 (cpi
->oxcf
.end_usage
== USAGE_STREAM_FROM_SERVER
) &&
955 ((cpi
->common
.frame_type
!= KEY_FRAME
))) //|| !cpi->oxcf.allow_spatial_resampling) )
957 // Check for a buffer underun-crisis in which case we have to drop a frame
958 if ((cpi
->buffer_level
< 0))
961 FILE *f
= fopen("dec.stt", "a");
962 fprintf(f
, "%10d %10d %10d %10d ***** BUFFER EMPTY\n",
963 (int) cpi
->common
.current_video_frame
,
964 cpi
->decimation_factor
, cpi
->common
.horiz_scale
,
965 (cpi
->buffer_level
* 100) / cpi
->oxcf
.optimal_buffer_level
);
968 //vpx_log("Decoder: Drop frame due to bandwidth: %d \n",cpi->buffer_level, cpi->av_per_frame_bandwidth);
970 cpi
->drop_frame
= TRUE
;
974 // Check for other drop frame crtieria (Note 2 pass cbr uses decimation on whole KF sections)
975 else if ((cpi
->buffer_level
< cpi
->oxcf
.drop_frames_water_mark
* cpi
->oxcf
.optimal_buffer_level
/ 100) &&
976 (cpi
->drop_count
< cpi
->max_drop_count
) && (cpi
->pass
== 0))
978 cpi
->drop_frame
= TRUE
;
985 // Update the buffer level variable.
986 cpi
->bits_off_target
+= cpi
->av_per_frame_bandwidth
;
987 cpi
->buffer_level
= cpi
->bits_off_target
;
993 // Adjust target frame size for Golden Frames:
994 if (cpi
->oxcf
.error_resilient_mode
== 0 &&
995 (cpi
->frames_till_gf_update_due
== 0) && !cpi
->drop_frame
)
998 int Q
= (cpi
->oxcf
.fixed_q
< 0) ? cpi
->last_q
[INTER_FRAME
] : cpi
->oxcf
.fixed_q
;
1000 int gf_frame_useage
= 0; // Golden frame useage since last GF
1001 int tot_mbs
= cpi
->recent_ref_frame_usage
[INTRA_FRAME
] +
1002 cpi
->recent_ref_frame_usage
[LAST_FRAME
] +
1003 cpi
->recent_ref_frame_usage
[GOLDEN_FRAME
] +
1004 cpi
->recent_ref_frame_usage
[ALTREF_FRAME
];
1006 int pct_gf_active
= (100 * cpi
->gf_active_count
) / (cpi
->common
.mb_rows
* cpi
->common
.mb_cols
);
1008 // Reset the last boost indicator
1009 //cpi->last_boost = 100;
1012 gf_frame_useage
= (cpi
->recent_ref_frame_usage
[GOLDEN_FRAME
] + cpi
->recent_ref_frame_usage
[ALTREF_FRAME
]) * 100 / tot_mbs
;
1014 if (pct_gf_active
> gf_frame_useage
)
1015 gf_frame_useage
= pct_gf_active
;
1017 // Is a fixed manual GF frequency being used
1020 // For one pass throw a GF if recent frame intra useage is low or the GF useage is high
1021 if ((cpi
->pass
== 0) && (cpi
->this_frame_percent_intra
< 15 || gf_frame_useage
>= 5))
1022 cpi
->common
.refresh_golden_frame
= TRUE
;
1024 // Two pass GF descision
1025 else if (cpi
->pass
== 2)
1026 cpi
->common
.refresh_golden_frame
= TRUE
;
1036 f
= fopen("gf_useaget.stt", "a");
1037 fprintf(f
, " %8ld %10ld %10ld %10ld %10ld\n",
1038 cpi
->common
.current_video_frame
, cpi
->gfu_boost
, GFQ_ADJUSTMENT
, cpi
->gfu_boost
, gf_frame_useage
);
1044 if (cpi
->common
.refresh_golden_frame
== TRUE
)
1052 f
= fopen("GFexit.stt", "a");
1053 fprintf(f
, "%8ld GF coded\n", cpi
->common
.current_video_frame
);
1059 if (cpi
->auto_adjust_gold_quantizer
)
1061 calc_gf_params(cpi
);
1064 // If we are using alternate ref instead of gf then do not apply the boost
1065 // It will instead be applied to the altref update
1066 // Jims modified boost
1067 if (!cpi
->source_alt_ref_active
)
1069 if (cpi
->oxcf
.fixed_q
< 0)
1073 cpi
->this_frame_target
= cpi
->per_frame_bandwidth
; // The spend on the GF is defined in the two pass code for two pass encodes
1077 int Boost
= cpi
->last_boost
;
1078 int frames_in_section
= cpi
->frames_till_gf_update_due
+ 1;
1079 int allocation_chunks
= (frames_in_section
* 100) + (Boost
- 100);
1080 int bits_in_section
= cpi
->inter_frame_target
* frames_in_section
;
1082 // Normalize Altboost and allocations chunck down to prevent overflow
1083 while (Boost
> 1000)
1086 allocation_chunks
/= 2;
1089 // Avoid loss of precision but avoid overflow
1090 if ((bits_in_section
>> 7) > allocation_chunks
)
1091 cpi
->this_frame_target
= Boost
* (bits_in_section
/ allocation_chunks
);
1093 cpi
->this_frame_target
= (Boost
* bits_in_section
) / allocation_chunks
;
1097 cpi
->this_frame_target
=
1098 (estimate_bits_at_q(1, Q
, cpi
->common
.MBs
, 1.0)
1099 * cpi
->last_boost
) / 100;
1102 // If there is an active ARF at this location use the minimum
1103 // bits on this frame even if it is a contructed arf.
1104 // The active maximum quantizer insures that an appropriate
1105 // number of bits will be spent if needed for contstructed ARFs.
1108 cpi
->this_frame_target
= 0;
1111 cpi
->current_gf_interval
= cpi
->frames_till_gf_update_due
;
1118 void vp8_update_rate_correction_factors(VP8_COMP
*cpi
, int damp_var
)
1120 int Q
= cpi
->common
.base_qindex
;
1121 int correction_factor
= 100;
1122 double rate_correction_factor
;
1123 double adjustment_limit
;
1125 int projected_size_based_on_q
= 0;
1127 // Clear down mmx registers to allow floating point in what follows
1128 vp8_clear_system_state(); //__asm emms;
1130 if (cpi
->common
.frame_type
== KEY_FRAME
)
1132 rate_correction_factor
= cpi
->key_frame_rate_correction_factor
;
1136 if (cpi
->common
.refresh_alt_ref_frame
|| cpi
->common
.refresh_golden_frame
)
1137 rate_correction_factor
= cpi
->gf_rate_correction_factor
;
1139 rate_correction_factor
= cpi
->rate_correction_factor
;
1142 // Work out how big we would have expected the frame to be at this Q given the current correction factor.
1143 // Stay in double to avoid int overflow when values are large
1144 //projected_size_based_on_q = ((int)(.5 + rate_correction_factor * vp8_bits_per_mb[cpi->common.frame_type][Q]) * cpi->common.MBs) >> BPER_MB_NORMBITS;
1145 projected_size_based_on_q
= (int)(((.5 + rate_correction_factor
* vp8_bits_per_mb
[cpi
->common
.frame_type
][Q
]) * cpi
->common
.MBs
) / (1 << BPER_MB_NORMBITS
));
1147 // Make some allowance for cpi->zbin_over_quant
1148 if (cpi
->zbin_over_quant
> 0)
1150 int Z
= cpi
->zbin_over_quant
;
1151 double Factor
= 0.99;
1152 double factor_adjustment
= 0.01 / 256.0; //(double)ZBIN_OQ_MAX;
1157 projected_size_based_on_q
=
1158 (int)(Factor
* projected_size_based_on_q
);
1159 Factor
+= factor_adjustment
;
1161 if (Factor
>= 0.999)
1166 // Work out a size correction factor.
1167 //if ( cpi->this_frame_target > 0 )
1168 // correction_factor = (100 * cpi->projected_frame_size) / cpi->this_frame_target;
1169 if (projected_size_based_on_q
> 0)
1170 correction_factor
= (100 * cpi
->projected_frame_size
) / projected_size_based_on_q
;
1172 // More heavily damped adjustment used if we have been oscillating either side of target
1176 adjustment_limit
= 0.75;
1179 adjustment_limit
= 0.375;
1183 adjustment_limit
= 0.25;
1187 //if ( (correction_factor > 102) && (Q < cpi->active_worst_quality) )
1188 if (correction_factor
> 102)
1190 // We are not already at the worst allowable quality
1191 correction_factor
= (int)(100.5 + ((correction_factor
- 100) * adjustment_limit
));
1192 rate_correction_factor
= ((rate_correction_factor
* correction_factor
) / 100);
1194 // Keep rate_correction_factor within limits
1195 if (rate_correction_factor
> MAX_BPB_FACTOR
)
1196 rate_correction_factor
= MAX_BPB_FACTOR
;
1198 //else if ( (correction_factor < 99) && (Q > cpi->active_best_quality) )
1199 else if (correction_factor
< 99)
1201 // We are not already at the best allowable quality
1202 correction_factor
= (int)(100.5 - ((100 - correction_factor
) * adjustment_limit
));
1203 rate_correction_factor
= ((rate_correction_factor
* correction_factor
) / 100);
1205 // Keep rate_correction_factor within limits
1206 if (rate_correction_factor
< MIN_BPB_FACTOR
)
1207 rate_correction_factor
= MIN_BPB_FACTOR
;
1210 if (cpi
->common
.frame_type
== KEY_FRAME
)
1211 cpi
->key_frame_rate_correction_factor
= rate_correction_factor
;
1214 if (cpi
->common
.refresh_alt_ref_frame
|| cpi
->common
.refresh_golden_frame
)
1215 cpi
->gf_rate_correction_factor
= rate_correction_factor
;
1217 cpi
->rate_correction_factor
= rate_correction_factor
;
1222 int vp8_regulate_q(VP8_COMP
*cpi
, int target_bits_per_frame
)
1224 int Q
= cpi
->active_worst_quality
;
1226 // Reset Zbin OQ value
1227 cpi
->zbin_over_quant
= 0;
1229 if (cpi
->oxcf
.fixed_q
>= 0)
1231 Q
= cpi
->oxcf
.fixed_q
;
1233 if (cpi
->common
.frame_type
== KEY_FRAME
)
1235 Q
= cpi
->oxcf
.key_q
;
1237 else if (cpi
->common
.refresh_alt_ref_frame
)
1239 Q
= cpi
->oxcf
.alt_q
;
1241 else if (cpi
->common
.refresh_golden_frame
)
1243 Q
= cpi
->oxcf
.gold_q
;
1250 int last_error
= INT_MAX
;
1251 int target_bits_per_mb
;
1252 int bits_per_mb_at_this_q
;
1253 double correction_factor
;
1255 // Select the appropriate correction factor based upon type of frame.
1256 if (cpi
->common
.frame_type
== KEY_FRAME
)
1257 correction_factor
= cpi
->key_frame_rate_correction_factor
;
1260 if (cpi
->common
.refresh_alt_ref_frame
|| cpi
->common
.refresh_golden_frame
)
1261 correction_factor
= cpi
->gf_rate_correction_factor
;
1263 correction_factor
= cpi
->rate_correction_factor
;
1266 // Calculate required scaling factor based on target frame size and size of frame produced using previous Q
1267 if (target_bits_per_frame
>= (INT_MAX
>> BPER_MB_NORMBITS
))
1268 target_bits_per_mb
= (target_bits_per_frame
/ cpi
->common
.MBs
) << BPER_MB_NORMBITS
; // Case where we would overflow int
1270 target_bits_per_mb
= (target_bits_per_frame
<< BPER_MB_NORMBITS
) / cpi
->common
.MBs
;
1272 i
= cpi
->active_best_quality
;
1276 bits_per_mb_at_this_q
= (int)(.5 + correction_factor
* vp8_bits_per_mb
[cpi
->common
.frame_type
][i
]);
1278 if (bits_per_mb_at_this_q
<= target_bits_per_mb
)
1280 if ((target_bits_per_mb
- bits_per_mb_at_this_q
) <= last_error
)
1288 last_error
= bits_per_mb_at_this_q
- target_bits_per_mb
;
1290 while (++i
<= cpi
->active_worst_quality
);
1293 // If we are at MAXQ then enable Q over-run which seeks to claw back additional bits through things like
1294 // the RD multiplier and zero bin size.
1299 double Factor
= 0.99;
1300 double factor_adjustment
= 0.01 / 256.0; //(double)ZBIN_OQ_MAX;
1302 if (cpi
->common
.frame_type
== KEY_FRAME
)
1303 zbin_oqmax
= 0; //ZBIN_OQ_MAX/16
1304 else if (cpi
->common
.refresh_alt_ref_frame
|| (cpi
->common
.refresh_golden_frame
&& !cpi
->source_alt_ref_active
))
1307 zbin_oqmax
= ZBIN_OQ_MAX
;
1310 double Factor = (double)target_bits_per_mb/(double)bits_per_mb_at_this_q;
1313 Factor = Factor/1.2683;
1315 Oq = pow( Factor, (1.0/-0.165) );
1317 if ( Oq > zbin_oqmax )
1320 cpi->zbin_over_quant = (int)Oq;
1323 // Each incrment in the zbin is assumed to have a fixed effect on bitrate. This is not of course true.
1324 // The effect will be highly clip dependent and may well have sudden steps.
1325 // The idea here is to acheive higher effective quantizers than the normal maximum by expanding the zero
1326 // bin and hence decreasing the number of low magnitude non zero coefficients.
1327 while (cpi
->zbin_over_quant
< zbin_oqmax
)
1329 cpi
->zbin_over_quant
++;
1331 if (cpi
->zbin_over_quant
> zbin_oqmax
)
1332 cpi
->zbin_over_quant
= zbin_oqmax
;
1334 // Adjust bits_per_mb_at_this_q estimate
1335 bits_per_mb_at_this_q
= (int)(Factor
* bits_per_mb_at_this_q
);
1336 Factor
+= factor_adjustment
;
1338 if (Factor
>= 0.999)
1341 if (bits_per_mb_at_this_q
<= target_bits_per_mb
) // Break out if we get down to the target rate
1352 static int estimate_keyframe_frequency(VP8_COMP
*cpi
)
1356 // Average key frame frequency
1357 int av_key_frame_frequency
= 0;
1359 /* First key frame at start of sequence is a special case. We have no
1362 if (cpi
->key_frame_count
== 1)
1364 /* Assume a default of 1 kf every 2 seconds, or the max kf interval,
1365 * whichever is smaller.
1367 int key_freq
= cpi
->oxcf
.key_freq
>0 ? cpi
->oxcf
.key_freq
: 1;
1368 av_key_frame_frequency
= (int)cpi
->output_frame_rate
* 2;
1370 if (cpi
->oxcf
.auto_key
&& av_key_frame_frequency
> key_freq
)
1371 av_key_frame_frequency
= cpi
->oxcf
.key_freq
;
1373 cpi
->prior_key_frame_distance
[KEY_FRAME_CONTEXT
- 1]
1374 = av_key_frame_frequency
;
1378 unsigned int total_weight
= 0;
1379 int last_kf_interval
=
1380 (cpi
->frames_since_key
> 0) ? cpi
->frames_since_key
: 1;
1382 /* reset keyframe context and calculate weighted average of last
1383 * KEY_FRAME_CONTEXT keyframes
1385 for (i
= 0; i
< KEY_FRAME_CONTEXT
; i
++)
1387 if (i
< KEY_FRAME_CONTEXT
- 1)
1388 cpi
->prior_key_frame_distance
[i
]
1389 = cpi
->prior_key_frame_distance
[i
+1];
1391 cpi
->prior_key_frame_distance
[i
] = last_kf_interval
;
1393 av_key_frame_frequency
+= prior_key_frame_weight
[i
]
1394 * cpi
->prior_key_frame_distance
[i
];
1395 total_weight
+= prior_key_frame_weight
[i
];
1398 av_key_frame_frequency
/= total_weight
;
1401 return av_key_frame_frequency
;
1405 void vp8_adjust_key_frame_context(VP8_COMP
*cpi
)
1407 // Clear down mmx registers to allow floating point in what follows
1408 vp8_clear_system_state();
1410 // Do we have any key frame overspend to recover?
1411 // Two-pass overspend handled elsewhere.
1412 if ((cpi
->pass
!= 2)
1413 && (cpi
->projected_frame_size
> cpi
->per_frame_bandwidth
))
1417 /* Update the count of key frame overspend to be recovered in
1418 * subsequent frames. A portion of the KF overspend is treated as gf
1419 * overspend (and hence recovered more quickly) as the kf is also a
1420 * gf. Otherwise the few frames following each kf tend to get more
1421 * bits allocated than those following other gfs.
1423 overspend
= (cpi
->projected_frame_size
- cpi
->per_frame_bandwidth
);
1424 cpi
->kf_overspend_bits
+= overspend
* 7 / 8;
1425 cpi
->gf_overspend_bits
+= overspend
* 1 / 8;
1427 /* Work out how much to try and recover per frame. */
1428 cpi
->kf_bitrate_adjustment
= cpi
->kf_overspend_bits
1429 / estimate_keyframe_frequency(cpi
);
1432 cpi
->frames_since_key
= 0;
1433 cpi
->key_frame_count
++;
1437 void vp8_compute_frame_size_bounds(VP8_COMP
*cpi
, int *frame_under_shoot_limit
, int *frame_over_shoot_limit
)
1439 // Set-up bounds on acceptable frame size:
1440 if (cpi
->oxcf
.fixed_q
>= 0)
1442 // Fixed Q scenario: frame size never outranges target (there is no target!)
1443 *frame_under_shoot_limit
= 0;
1444 *frame_over_shoot_limit
= INT_MAX
;
1448 if (cpi
->common
.frame_type
== KEY_FRAME
)
1450 *frame_over_shoot_limit
= cpi
->this_frame_target
* 9 / 8;
1451 *frame_under_shoot_limit
= cpi
->this_frame_target
* 7 / 8;
1455 if (cpi
->common
.refresh_alt_ref_frame
|| cpi
->common
.refresh_golden_frame
)
1457 *frame_over_shoot_limit
= cpi
->this_frame_target
* 9 / 8;
1458 *frame_under_shoot_limit
= cpi
->this_frame_target
* 7 / 8;
1462 // For CBR take buffer fullness into account
1463 if (cpi
->oxcf
.end_usage
== USAGE_STREAM_FROM_SERVER
)
1465 if (cpi
->buffer_level
>= ((cpi
->oxcf
.optimal_buffer_level
+ cpi
->oxcf
.maximum_buffer_size
) >> 1))
1467 // Buffer is too full so relax overshoot and tighten undershoot
1468 *frame_over_shoot_limit
= cpi
->this_frame_target
* 12 / 8;
1469 *frame_under_shoot_limit
= cpi
->this_frame_target
* 6 / 8;
1471 else if (cpi
->buffer_level
<= (cpi
->oxcf
.optimal_buffer_level
>> 1))
1473 // Buffer is too low so relax undershoot and tighten overshoot
1474 *frame_over_shoot_limit
= cpi
->this_frame_target
* 10 / 8;
1475 *frame_under_shoot_limit
= cpi
->this_frame_target
* 4 / 8;
1479 *frame_over_shoot_limit
= cpi
->this_frame_target
* 11 / 8;
1480 *frame_under_shoot_limit
= cpi
->this_frame_target
* 5 / 8;
1484 // Note that tighter restrictions here can help quality but hurt encode speed
1487 // Stron overshoot limit for constrained quality
1488 if (cpi
->oxcf
.end_usage
== USAGE_CONSTRAINED_QUALITY
)
1490 *frame_over_shoot_limit
= cpi
->this_frame_target
* 11 / 8;
1491 *frame_under_shoot_limit
= cpi
->this_frame_target
* 2 / 8;
1495 *frame_over_shoot_limit
= cpi
->this_frame_target
* 11 / 8;
1496 *frame_under_shoot_limit
= cpi
->this_frame_target
* 5 / 8;
1505 // return of 0 means drop frame
1506 int vp8_pick_frame_size(VP8_COMP
*cpi
)
1508 VP8_COMMON
*cm
= &cpi
->common
;
1510 if (cm
->frame_type
== KEY_FRAME
)
1511 calc_iframe_target_size(cpi
);
1514 calc_pframe_target_size(cpi
);
1516 // Check if we're dropping the frame:
1517 if (cpi
->drop_frame
)
1519 cpi
->drop_frame
= FALSE
;