Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
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 */
11 #include <math.h>
12 #include <limits.h>
13 #include <stdio.h>
15 #include "./vpx_scale_rtcd.h"
16 #include "block.h"
17 #include "onyx_int.h"
18 #include "vp8/common/variance.h"
19 #include "encodeintra.h"
20 #include "vp8/common/setupintrarecon.h"
21 #include "vp8/common/systemdependent.h"
22 #include "mcomp.h"
23 #include "firstpass.h"
24 #include "vpx_scale/vpx_scale.h"
25 #include "encodemb.h"
26 #include "vp8/common/extend.h"
27 #include "vpx_mem/vpx_mem.h"
28 #include "vp8/common/swapyv12buffer.h"
29 #include "rdopt.h"
30 #include "vp8/common/quant_common.h"
31 #include "encodemv.h"
32 #include "encodeframe.h"
34 /* #define OUTPUT_FPF 1 */
36 extern void vp8cx_frame_init_quantizer(VP8_COMP *cpi);
37 extern void vp8_set_mbmode_and_mvs(MACROBLOCK *x, MB_PREDICTION_MODE mb, int_mv *mv);
38 extern void vp8_alloc_compressor_data(VP8_COMP *cpi);
40 #define GFQ_ADJUSTMENT vp8_gf_boost_qadjustment[Q]
41 extern int vp8_kf_boost_qadjustment[QINDEX_RANGE];
43 extern const int vp8_gf_boost_qadjustment[QINDEX_RANGE];
45 #define IIFACTOR 1.5
46 #define IIKFACTOR1 1.40
47 #define IIKFACTOR2 1.5
48 #define RMAX 14.0
49 #define GF_RMAX 48.0
51 #define KF_MB_INTRA_MIN 300
52 #define GF_MB_INTRA_MIN 200
54 #define DOUBLE_DIVIDE_CHECK(X) ((X)<0?(X)-.000001:(X)+.000001)
56 #define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0
57 #define POW2 (double)cpi->oxcf.two_pass_vbrbias/100.0
59 #define NEW_BOOST 1
61 static int vscale_lookup[7] = {0, 1, 1, 2, 2, 3, 3};
62 static int hscale_lookup[7] = {0, 0, 1, 1, 2, 2, 3};
65 static const int cq_level[QINDEX_RANGE] =
66 {
67 0,0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,
68 9,10,11,11,12,13,13,14,15,15,16,17,17,18,19,20,
69 20,21,22,22,23,24,24,25,26,27,27,28,29,30,30,31,
70 32,33,33,34,35,36,36,37,38,39,39,40,41,42,42,43,
71 44,45,46,46,47,48,49,50,50,51,52,53,54,55,55,56,
72 57,58,59,60,60,61,62,63,64,65,66,67,67,68,69,70,
73 71,72,73,74,75,75,76,77,78,79,80,81,82,83,84,85,
74 86,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100
75 };
77 static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame);
79 /* Resets the first pass file to the given position using a relative seek
80 * from the current position
81 */
82 static void reset_fpf_position(VP8_COMP *cpi, FIRSTPASS_STATS *Position)
83 {
84 cpi->twopass.stats_in = Position;
85 }
87 static int lookup_next_frame_stats(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame)
88 {
89 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
90 return EOF;
92 *next_frame = *cpi->twopass.stats_in;
93 return 1;
94 }
96 /* Read frame stats at an offset from the current position */
97 static int read_frame_stats( VP8_COMP *cpi,
98 FIRSTPASS_STATS *frame_stats,
99 int offset )
100 {
101 FIRSTPASS_STATS * fps_ptr = cpi->twopass.stats_in;
103 /* Check legality of offset */
104 if ( offset >= 0 )
105 {
106 if ( &fps_ptr[offset] >= cpi->twopass.stats_in_end )
107 return EOF;
108 }
109 else if ( offset < 0 )
110 {
111 if ( &fps_ptr[offset] < cpi->twopass.stats_in_start )
112 return EOF;
113 }
115 *frame_stats = fps_ptr[offset];
116 return 1;
117 }
119 static int input_stats(VP8_COMP *cpi, FIRSTPASS_STATS *fps)
120 {
121 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
122 return EOF;
124 *fps = *cpi->twopass.stats_in;
125 cpi->twopass.stats_in =
126 (void*)((char *)cpi->twopass.stats_in + sizeof(FIRSTPASS_STATS));
127 return 1;
128 }
130 static void output_stats(const VP8_COMP *cpi,
131 struct vpx_codec_pkt_list *pktlist,
132 FIRSTPASS_STATS *stats)
133 {
134 struct vpx_codec_cx_pkt pkt;
135 pkt.kind = VPX_CODEC_STATS_PKT;
136 pkt.data.twopass_stats.buf = stats;
137 pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS);
138 vpx_codec_pkt_list_add(pktlist, &pkt);
140 /* TEMP debug code */
141 #if OUTPUT_FPF
143 {
144 FILE *fpfile;
145 fpfile = fopen("firstpass.stt", "a");
147 fprintf(fpfile, "%12.0f %12.0f %12.0f %12.4f %12.4f %12.4f %12.4f"
148 " %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f"
149 " %12.0f %12.0f %12.4f\n",
150 stats->frame,
151 stats->intra_error,
152 stats->coded_error,
153 stats->ssim_weighted_pred_err,
154 stats->pcnt_inter,
155 stats->pcnt_motion,
156 stats->pcnt_second_ref,
157 stats->pcnt_neutral,
158 stats->MVr,
159 stats->mvr_abs,
160 stats->MVc,
161 stats->mvc_abs,
162 stats->MVrv,
163 stats->MVcv,
164 stats->mv_in_out_count,
165 stats->new_mv_count,
166 stats->count,
167 stats->duration);
168 fclose(fpfile);
169 }
170 #endif
171 }
173 static void zero_stats(FIRSTPASS_STATS *section)
174 {
175 section->frame = 0.0;
176 section->intra_error = 0.0;
177 section->coded_error = 0.0;
178 section->ssim_weighted_pred_err = 0.0;
179 section->pcnt_inter = 0.0;
180 section->pcnt_motion = 0.0;
181 section->pcnt_second_ref = 0.0;
182 section->pcnt_neutral = 0.0;
183 section->MVr = 0.0;
184 section->mvr_abs = 0.0;
185 section->MVc = 0.0;
186 section->mvc_abs = 0.0;
187 section->MVrv = 0.0;
188 section->MVcv = 0.0;
189 section->mv_in_out_count = 0.0;
190 section->new_mv_count = 0.0;
191 section->count = 0.0;
192 section->duration = 1.0;
193 }
195 static void accumulate_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame)
196 {
197 section->frame += frame->frame;
198 section->intra_error += frame->intra_error;
199 section->coded_error += frame->coded_error;
200 section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err;
201 section->pcnt_inter += frame->pcnt_inter;
202 section->pcnt_motion += frame->pcnt_motion;
203 section->pcnt_second_ref += frame->pcnt_second_ref;
204 section->pcnt_neutral += frame->pcnt_neutral;
205 section->MVr += frame->MVr;
206 section->mvr_abs += frame->mvr_abs;
207 section->MVc += frame->MVc;
208 section->mvc_abs += frame->mvc_abs;
209 section->MVrv += frame->MVrv;
210 section->MVcv += frame->MVcv;
211 section->mv_in_out_count += frame->mv_in_out_count;
212 section->new_mv_count += frame->new_mv_count;
213 section->count += frame->count;
214 section->duration += frame->duration;
215 }
217 static void subtract_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame)
218 {
219 section->frame -= frame->frame;
220 section->intra_error -= frame->intra_error;
221 section->coded_error -= frame->coded_error;
222 section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err;
223 section->pcnt_inter -= frame->pcnt_inter;
224 section->pcnt_motion -= frame->pcnt_motion;
225 section->pcnt_second_ref -= frame->pcnt_second_ref;
226 section->pcnt_neutral -= frame->pcnt_neutral;
227 section->MVr -= frame->MVr;
228 section->mvr_abs -= frame->mvr_abs;
229 section->MVc -= frame->MVc;
230 section->mvc_abs -= frame->mvc_abs;
231 section->MVrv -= frame->MVrv;
232 section->MVcv -= frame->MVcv;
233 section->mv_in_out_count -= frame->mv_in_out_count;
234 section->new_mv_count -= frame->new_mv_count;
235 section->count -= frame->count;
236 section->duration -= frame->duration;
237 }
239 static void avg_stats(FIRSTPASS_STATS *section)
240 {
241 if (section->count < 1.0)
242 return;
244 section->intra_error /= section->count;
245 section->coded_error /= section->count;
246 section->ssim_weighted_pred_err /= section->count;
247 section->pcnt_inter /= section->count;
248 section->pcnt_second_ref /= section->count;
249 section->pcnt_neutral /= section->count;
250 section->pcnt_motion /= section->count;
251 section->MVr /= section->count;
252 section->mvr_abs /= section->count;
253 section->MVc /= section->count;
254 section->mvc_abs /= section->count;
255 section->MVrv /= section->count;
256 section->MVcv /= section->count;
257 section->mv_in_out_count /= section->count;
258 section->duration /= section->count;
259 }
261 /* Calculate a modified Error used in distributing bits between easier
262 * and harder frames
263 */
264 static double calculate_modified_err(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
265 {
266 double av_err = ( cpi->twopass.total_stats.ssim_weighted_pred_err /
267 cpi->twopass.total_stats.count );
268 double this_err = this_frame->ssim_weighted_pred_err;
269 double modified_err;
271 if (this_err > av_err)
272 modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW1);
273 else
274 modified_err = av_err * pow((this_err / DOUBLE_DIVIDE_CHECK(av_err)), POW2);
276 return modified_err;
277 }
279 static const double weight_table[256] = {
280 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
281 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
282 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
283 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
284 0.020000, 0.031250, 0.062500, 0.093750, 0.125000, 0.156250, 0.187500, 0.218750,
285 0.250000, 0.281250, 0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750,
286 0.500000, 0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750,
287 0.750000, 0.781250, 0.812500, 0.843750, 0.875000, 0.906250, 0.937500, 0.968750,
288 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
289 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
290 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
291 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
292 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
293 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
294 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
295 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
296 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
297 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
298 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
299 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
300 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
301 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
302 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
303 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
304 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
305 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
306 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
307 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
308 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
309 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
310 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
311 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000
312 };
314 static double simple_weight(YV12_BUFFER_CONFIG *source)
315 {
316 int i, j;
318 unsigned char *src = source->y_buffer;
319 double sum_weights = 0.0;
321 /* Loop throught the Y plane raw examining levels and creating a weight
322 * for the image
323 */
324 i = source->y_height;
325 do
326 {
327 j = source->y_width;
328 do
329 {
330 sum_weights += weight_table[ *src];
331 src++;
332 }while(--j);
333 src -= source->y_width;
334 src += source->y_stride;
335 }while(--i);
337 sum_weights /= (source->y_height * source->y_width);
339 return sum_weights;
340 }
343 /* This function returns the current per frame maximum bitrate target */
344 static int frame_max_bits(VP8_COMP *cpi)
345 {
346 /* Max allocation for a single frame based on the max section guidelines
347 * passed in and how many bits are left
348 */
349 int max_bits;
351 /* For CBR we need to also consider buffer fullness.
352 * If we are running below the optimal level then we need to gradually
353 * tighten up on max_bits.
354 */
355 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
356 {
357 double buffer_fullness_ratio = (double)cpi->buffer_level / DOUBLE_DIVIDE_CHECK((double)cpi->oxcf.optimal_buffer_level);
359 /* For CBR base this on the target average bits per frame plus the
360 * maximum sedction rate passed in by the user
361 */
362 max_bits = (int)(cpi->av_per_frame_bandwidth * ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0));
364 /* If our buffer is below the optimum level */
365 if (buffer_fullness_ratio < 1.0)
366 {
367 /* The lower of max_bits / 4 or cpi->av_per_frame_bandwidth / 4. */
368 int min_max_bits = ((cpi->av_per_frame_bandwidth >> 2) < (max_bits >> 2)) ? cpi->av_per_frame_bandwidth >> 2 : max_bits >> 2;
370 max_bits = (int)(max_bits * buffer_fullness_ratio);
372 /* Lowest value we will set ... which should allow the buffer to
373 * refill.
374 */
375 if (max_bits < min_max_bits)
376 max_bits = min_max_bits;
377 }
378 }
379 /* VBR */
380 else
381 {
382 /* For VBR base this on the bits and frames left plus the
383 * two_pass_vbrmax_section rate passed in by the user
384 */
385 max_bits = (int)(((double)cpi->twopass.bits_left / (cpi->twopass.total_stats.count - (double)cpi->common.current_video_frame)) * ((double)cpi->oxcf.two_pass_vbrmax_section / 100.0));
386 }
388 /* Trap case where we are out of bits */
389 if (max_bits < 0)
390 max_bits = 0;
392 return max_bits;
393 }
395 void vp8_init_first_pass(VP8_COMP *cpi)
396 {
397 zero_stats(&cpi->twopass.total_stats);
398 }
400 void vp8_end_first_pass(VP8_COMP *cpi)
401 {
402 output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats);
403 }
405 static void zz_motion_search( VP8_COMP *cpi, MACROBLOCK * x,
406 YV12_BUFFER_CONFIG * raw_buffer,
407 int * raw_motion_err,
408 YV12_BUFFER_CONFIG * recon_buffer,
409 int * best_motion_err, int recon_yoffset)
410 {
411 MACROBLOCKD * const xd = & x->e_mbd;
412 BLOCK *b = &x->block[0];
413 BLOCKD *d = &x->e_mbd.block[0];
415 unsigned char *src_ptr = (*(b->base_src) + b->src);
416 int src_stride = b->src_stride;
417 unsigned char *raw_ptr;
418 int raw_stride = raw_buffer->y_stride;
419 unsigned char *ref_ptr;
420 int ref_stride = x->e_mbd.pre.y_stride;
422 /* Set up pointers for this macro block raw buffer */
423 raw_ptr = (unsigned char *)(raw_buffer->y_buffer + recon_yoffset
424 + d->offset);
425 vp8_mse16x16 ( src_ptr, src_stride, raw_ptr, raw_stride,
426 (unsigned int *)(raw_motion_err));
428 /* Set up pointers for this macro block recon buffer */
429 xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
430 ref_ptr = (unsigned char *)(xd->pre.y_buffer + d->offset );
431 vp8_mse16x16 ( src_ptr, src_stride, ref_ptr, ref_stride,
432 (unsigned int *)(best_motion_err));
433 }
435 static void first_pass_motion_search(VP8_COMP *cpi, MACROBLOCK *x,
436 int_mv *ref_mv, MV *best_mv,
437 YV12_BUFFER_CONFIG *recon_buffer,
438 int *best_motion_err, int recon_yoffset )
439 {
440 MACROBLOCKD *const xd = & x->e_mbd;
441 BLOCK *b = &x->block[0];
442 BLOCKD *d = &x->e_mbd.block[0];
443 int num00;
445 int_mv tmp_mv;
446 int_mv ref_mv_full;
448 int tmp_err;
449 int step_param = 3; /* Dont search over full range for first pass */
450 int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
451 int n;
452 vp8_variance_fn_ptr_t v_fn_ptr = cpi->fn_ptr[BLOCK_16X16];
453 int new_mv_mode_penalty = 256;
455 /* override the default variance function to use MSE */
456 v_fn_ptr.vf = vp8_mse16x16;
458 /* Set up pointers for this macro block recon buffer */
459 xd->pre.y_buffer = recon_buffer->y_buffer + recon_yoffset;
461 /* Initial step/diamond search centred on best mv */
462 tmp_mv.as_int = 0;
463 ref_mv_full.as_mv.col = ref_mv->as_mv.col>>3;
464 ref_mv_full.as_mv.row = ref_mv->as_mv.row>>3;
465 tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv, step_param,
466 x->sadperbit16, &num00, &v_fn_ptr,
467 x->mvcost, ref_mv);
468 if ( tmp_err < INT_MAX-new_mv_mode_penalty )
469 tmp_err += new_mv_mode_penalty;
471 if (tmp_err < *best_motion_err)
472 {
473 *best_motion_err = tmp_err;
474 best_mv->row = tmp_mv.as_mv.row;
475 best_mv->col = tmp_mv.as_mv.col;
476 }
478 /* Further step/diamond searches as necessary */
479 n = num00;
480 num00 = 0;
482 while (n < further_steps)
483 {
484 n++;
486 if (num00)
487 num00--;
488 else
489 {
490 tmp_err = cpi->diamond_search_sad(x, b, d, &ref_mv_full, &tmp_mv,
491 step_param + n, x->sadperbit16,
492 &num00, &v_fn_ptr, x->mvcost,
493 ref_mv);
494 if ( tmp_err < INT_MAX-new_mv_mode_penalty )
495 tmp_err += new_mv_mode_penalty;
497 if (tmp_err < *best_motion_err)
498 {
499 *best_motion_err = tmp_err;
500 best_mv->row = tmp_mv.as_mv.row;
501 best_mv->col = tmp_mv.as_mv.col;
502 }
503 }
504 }
505 }
507 void vp8_first_pass(VP8_COMP *cpi)
508 {
509 int mb_row, mb_col;
510 MACROBLOCK *const x = & cpi->mb;
511 VP8_COMMON *const cm = & cpi->common;
512 MACROBLOCKD *const xd = & x->e_mbd;
514 int recon_yoffset, recon_uvoffset;
515 YV12_BUFFER_CONFIG *lst_yv12 = &cm->yv12_fb[cm->lst_fb_idx];
516 YV12_BUFFER_CONFIG *new_yv12 = &cm->yv12_fb[cm->new_fb_idx];
517 YV12_BUFFER_CONFIG *gld_yv12 = &cm->yv12_fb[cm->gld_fb_idx];
518 int recon_y_stride = lst_yv12->y_stride;
519 int recon_uv_stride = lst_yv12->uv_stride;
520 int64_t intra_error = 0;
521 int64_t coded_error = 0;
523 int sum_mvr = 0, sum_mvc = 0;
524 int sum_mvr_abs = 0, sum_mvc_abs = 0;
525 int sum_mvrs = 0, sum_mvcs = 0;
526 int mvcount = 0;
527 int intercount = 0;
528 int second_ref_count = 0;
529 int intrapenalty = 256;
530 int neutral_count = 0;
531 int new_mv_count = 0;
532 int sum_in_vectors = 0;
533 uint32_t lastmv_as_int = 0;
535 int_mv zero_ref_mv;
537 zero_ref_mv.as_int = 0;
539 vp8_clear_system_state();
541 x->src = * cpi->Source;
542 xd->pre = *lst_yv12;
543 xd->dst = *new_yv12;
545 x->partition_info = x->pi;
547 xd->mode_info_context = cm->mi;
549 if(!cm->use_bilinear_mc_filter)
550 {
551 xd->subpixel_predict = vp8_sixtap_predict4x4;
552 xd->subpixel_predict8x4 = vp8_sixtap_predict8x4;
553 xd->subpixel_predict8x8 = vp8_sixtap_predict8x8;
554 xd->subpixel_predict16x16 = vp8_sixtap_predict16x16;
555 }
556 else
557 {
558 xd->subpixel_predict = vp8_bilinear_predict4x4;
559 xd->subpixel_predict8x4 = vp8_bilinear_predict8x4;
560 xd->subpixel_predict8x8 = vp8_bilinear_predict8x8;
561 xd->subpixel_predict16x16 = vp8_bilinear_predict16x16;
562 }
564 vp8_build_block_offsets(x);
566 /* set up frame new frame for intra coded blocks */
567 vp8_setup_intra_recon(new_yv12);
568 vp8cx_frame_init_quantizer(cpi);
570 /* Initialise the MV cost table to the defaults */
571 {
572 int flag[2] = {1, 1};
573 vp8_initialize_rd_consts(cpi, x, vp8_dc_quant(cm->base_qindex, cm->y1dc_delta_q));
574 vpx_memcpy(cm->fc.mvc, vp8_default_mv_context, sizeof(vp8_default_mv_context));
575 vp8_build_component_cost_table(cpi->mb.mvcost, (const MV_CONTEXT *) cm->fc.mvc, flag);
576 }
578 /* for each macroblock row in image */
579 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++)
580 {
581 int_mv best_ref_mv;
583 best_ref_mv.as_int = 0;
585 /* reset above block coeffs */
586 xd->up_available = (mb_row != 0);
587 recon_yoffset = (mb_row * recon_y_stride * 16);
588 recon_uvoffset = (mb_row * recon_uv_stride * 8);
590 /* Set up limit values for motion vectors to prevent them extending
591 * outside the UMV borders
592 */
593 x->mv_row_min = -((mb_row * 16) + (VP8BORDERINPIXELS - 16));
594 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16) + (VP8BORDERINPIXELS - 16);
597 /* for each macroblock col in image */
598 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++)
599 {
600 int this_error;
601 int gf_motion_error = INT_MAX;
602 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
604 xd->dst.y_buffer = new_yv12->y_buffer + recon_yoffset;
605 xd->dst.u_buffer = new_yv12->u_buffer + recon_uvoffset;
606 xd->dst.v_buffer = new_yv12->v_buffer + recon_uvoffset;
607 xd->left_available = (mb_col != 0);
609 /* Copy current mb to a buffer */
610 vp8_copy_mem16x16(x->src.y_buffer, x->src.y_stride, x->thismb, 16);
612 /* do intra 16x16 prediction */
613 this_error = vp8_encode_intra(cpi, x, use_dc_pred);
615 /* "intrapenalty" below deals with situations where the intra
616 * and inter error scores are very low (eg a plain black frame)
617 * We do not have special cases in first pass for 0,0 and
618 * nearest etc so all inter modes carry an overhead cost
619 * estimate fot the mv. When the error score is very low this
620 * causes us to pick all or lots of INTRA modes and throw lots
621 * of key frames. This penalty adds a cost matching that of a
622 * 0,0 mv to the intra case.
623 */
624 this_error += intrapenalty;
626 /* Cumulative intra error total */
627 intra_error += (int64_t)this_error;
629 /* Set up limit values for motion vectors to prevent them
630 * extending outside the UMV borders
631 */
632 x->mv_col_min = -((mb_col * 16) + (VP8BORDERINPIXELS - 16));
633 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16) + (VP8BORDERINPIXELS - 16);
635 /* Other than for the first frame do a motion search */
636 if (cm->current_video_frame > 0)
637 {
638 BLOCKD *d = &x->e_mbd.block[0];
639 MV tmp_mv = {0, 0};
640 int tmp_err;
641 int motion_error = INT_MAX;
642 int raw_motion_error = INT_MAX;
644 /* Simple 0,0 motion with no mv overhead */
645 zz_motion_search( cpi, x, cpi->last_frame_unscaled_source,
646 &raw_motion_error, lst_yv12, &motion_error,
647 recon_yoffset );
648 d->bmi.mv.as_mv.row = 0;
649 d->bmi.mv.as_mv.col = 0;
651 if (raw_motion_error < cpi->oxcf.encode_breakout)
652 goto skip_motion_search;
654 /* Test last reference frame using the previous best mv as the
655 * starting point (best reference) for the search
656 */
657 first_pass_motion_search(cpi, x, &best_ref_mv,
658 &d->bmi.mv.as_mv, lst_yv12,
659 &motion_error, recon_yoffset);
661 /* If the current best reference mv is not centred on 0,0
662 * then do a 0,0 based search as well
663 */
664 if (best_ref_mv.as_int)
665 {
666 tmp_err = INT_MAX;
667 first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv,
668 lst_yv12, &tmp_err, recon_yoffset);
670 if ( tmp_err < motion_error )
671 {
672 motion_error = tmp_err;
673 d->bmi.mv.as_mv.row = tmp_mv.row;
674 d->bmi.mv.as_mv.col = tmp_mv.col;
675 }
676 }
678 /* Experimental search in a second reference frame ((0,0)
679 * based only)
680 */
681 if (cm->current_video_frame > 1)
682 {
683 first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv, gld_yv12, &gf_motion_error, recon_yoffset);
685 if ((gf_motion_error < motion_error) && (gf_motion_error < this_error))
686 {
687 second_ref_count++;
688 }
690 /* Reset to last frame as reference buffer */
691 xd->pre.y_buffer = lst_yv12->y_buffer + recon_yoffset;
692 xd->pre.u_buffer = lst_yv12->u_buffer + recon_uvoffset;
693 xd->pre.v_buffer = lst_yv12->v_buffer + recon_uvoffset;
694 }
696 skip_motion_search:
697 /* Intra assumed best */
698 best_ref_mv.as_int = 0;
700 if (motion_error <= this_error)
701 {
702 /* Keep a count of cases where the inter and intra were
703 * very close and very low. This helps with scene cut
704 * detection for example in cropped clips with black bars
705 * at the sides or top and bottom.
706 */
707 if( (((this_error-intrapenalty) * 9) <=
708 (motion_error*10)) &&
709 (this_error < (2*intrapenalty)) )
710 {
711 neutral_count++;
712 }
714 d->bmi.mv.as_mv.row *= 8;
715 d->bmi.mv.as_mv.col *= 8;
716 this_error = motion_error;
717 vp8_set_mbmode_and_mvs(x, NEWMV, &d->bmi.mv);
718 vp8_encode_inter16x16y(x);
719 sum_mvr += d->bmi.mv.as_mv.row;
720 sum_mvr_abs += abs(d->bmi.mv.as_mv.row);
721 sum_mvc += d->bmi.mv.as_mv.col;
722 sum_mvc_abs += abs(d->bmi.mv.as_mv.col);
723 sum_mvrs += d->bmi.mv.as_mv.row * d->bmi.mv.as_mv.row;
724 sum_mvcs += d->bmi.mv.as_mv.col * d->bmi.mv.as_mv.col;
725 intercount++;
727 best_ref_mv.as_int = d->bmi.mv.as_int;
729 /* Was the vector non-zero */
730 if (d->bmi.mv.as_int)
731 {
732 mvcount++;
734 /* Was it different from the last non zero vector */
735 if ( d->bmi.mv.as_int != lastmv_as_int )
736 new_mv_count++;
737 lastmv_as_int = d->bmi.mv.as_int;
739 /* Does the Row vector point inwards or outwards */
740 if (mb_row < cm->mb_rows / 2)
741 {
742 if (d->bmi.mv.as_mv.row > 0)
743 sum_in_vectors--;
744 else if (d->bmi.mv.as_mv.row < 0)
745 sum_in_vectors++;
746 }
747 else if (mb_row > cm->mb_rows / 2)
748 {
749 if (d->bmi.mv.as_mv.row > 0)
750 sum_in_vectors++;
751 else if (d->bmi.mv.as_mv.row < 0)
752 sum_in_vectors--;
753 }
755 /* Does the Row vector point inwards or outwards */
756 if (mb_col < cm->mb_cols / 2)
757 {
758 if (d->bmi.mv.as_mv.col > 0)
759 sum_in_vectors--;
760 else if (d->bmi.mv.as_mv.col < 0)
761 sum_in_vectors++;
762 }
763 else if (mb_col > cm->mb_cols / 2)
764 {
765 if (d->bmi.mv.as_mv.col > 0)
766 sum_in_vectors++;
767 else if (d->bmi.mv.as_mv.col < 0)
768 sum_in_vectors--;
769 }
770 }
771 }
772 }
774 coded_error += (int64_t)this_error;
776 /* adjust to the next column of macroblocks */
777 x->src.y_buffer += 16;
778 x->src.u_buffer += 8;
779 x->src.v_buffer += 8;
781 recon_yoffset += 16;
782 recon_uvoffset += 8;
783 }
785 /* adjust to the next row of mbs */
786 x->src.y_buffer += 16 * x->src.y_stride - 16 * cm->mb_cols;
787 x->src.u_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
788 x->src.v_buffer += 8 * x->src.uv_stride - 8 * cm->mb_cols;
790 /* extend the recon for intra prediction */
791 vp8_extend_mb_row(new_yv12, xd->dst.y_buffer + 16, xd->dst.u_buffer + 8, xd->dst.v_buffer + 8);
792 vp8_clear_system_state();
793 }
795 vp8_clear_system_state();
796 {
797 double weight = 0.0;
799 FIRSTPASS_STATS fps;
801 fps.frame = cm->current_video_frame ;
802 fps.intra_error = (double)(intra_error >> 8);
803 fps.coded_error = (double)(coded_error >> 8);
804 weight = simple_weight(cpi->Source);
807 if (weight < 0.1)
808 weight = 0.1;
810 fps.ssim_weighted_pred_err = fps.coded_error * weight;
812 fps.pcnt_inter = 0.0;
813 fps.pcnt_motion = 0.0;
814 fps.MVr = 0.0;
815 fps.mvr_abs = 0.0;
816 fps.MVc = 0.0;
817 fps.mvc_abs = 0.0;
818 fps.MVrv = 0.0;
819 fps.MVcv = 0.0;
820 fps.mv_in_out_count = 0.0;
821 fps.new_mv_count = 0.0;
822 fps.count = 1.0;
824 fps.pcnt_inter = 1.0 * (double)intercount / cm->MBs;
825 fps.pcnt_second_ref = 1.0 * (double)second_ref_count / cm->MBs;
826 fps.pcnt_neutral = 1.0 * (double)neutral_count / cm->MBs;
828 if (mvcount > 0)
829 {
830 fps.MVr = (double)sum_mvr / (double)mvcount;
831 fps.mvr_abs = (double)sum_mvr_abs / (double)mvcount;
832 fps.MVc = (double)sum_mvc / (double)mvcount;
833 fps.mvc_abs = (double)sum_mvc_abs / (double)mvcount;
834 fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / (double)mvcount)) / (double)mvcount;
835 fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / (double)mvcount)) / (double)mvcount;
836 fps.mv_in_out_count = (double)sum_in_vectors / (double)(mvcount * 2);
837 fps.new_mv_count = new_mv_count;
839 fps.pcnt_motion = 1.0 * (double)mvcount / cpi->common.MBs;
840 }
842 /* TODO: handle the case when duration is set to 0, or something less
843 * than the full time between subsequent cpi->source_time_stamps
844 */
845 fps.duration = (double)(cpi->source->ts_end
846 - cpi->source->ts_start);
848 /* don't want to do output stats with a stack variable! */
849 memcpy(&cpi->twopass.this_frame_stats,
850 &fps,
851 sizeof(FIRSTPASS_STATS));
852 output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.this_frame_stats);
853 accumulate_stats(&cpi->twopass.total_stats, &fps);
854 }
856 /* Copy the previous Last Frame into the GF buffer if specific
857 * conditions for doing so are met
858 */
859 if ((cm->current_video_frame > 0) &&
860 (cpi->twopass.this_frame_stats.pcnt_inter > 0.20) &&
861 ((cpi->twopass.this_frame_stats.intra_error /
862 DOUBLE_DIVIDE_CHECK(cpi->twopass.this_frame_stats.coded_error)) >
863 2.0))
864 {
865 vp8_yv12_copy_frame(lst_yv12, gld_yv12);
866 }
868 /* swap frame pointers so last frame refers to the frame we just
869 * compressed
870 */
871 vp8_swap_yv12_buffer(lst_yv12, new_yv12);
872 vp8_yv12_extend_frame_borders(lst_yv12);
874 /* Special case for the first frame. Copy into the GF buffer as a
875 * second reference.
876 */
877 if (cm->current_video_frame == 0)
878 {
879 vp8_yv12_copy_frame(lst_yv12, gld_yv12);
880 }
883 /* use this to see what the first pass reconstruction looks like */
884 if (0)
885 {
886 char filename[512];
887 FILE *recon_file;
888 sprintf(filename, "enc%04d.yuv", (int) cm->current_video_frame);
890 if (cm->current_video_frame == 0)
891 recon_file = fopen(filename, "wb");
892 else
893 recon_file = fopen(filename, "ab");
895 (void) fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1,
896 recon_file);
897 fclose(recon_file);
898 }
900 cm->current_video_frame++;
902 }
903 extern const int vp8_bits_per_mb[2][QINDEX_RANGE];
905 /* Estimate a cost per mb attributable to overheads such as the coding of
906 * modes and motion vectors.
907 * Currently simplistic in its assumptions for testing.
908 */
910 static double bitcost( double prob )
911 {
912 if (prob > 0.000122)
913 return -log(prob) / log(2.0);
914 else
915 return 13.0;
916 }
917 static int64_t estimate_modemvcost(VP8_COMP *cpi,
918 FIRSTPASS_STATS * fpstats)
919 {
920 int mv_cost;
921 int64_t mode_cost;
923 double av_pct_inter = fpstats->pcnt_inter / fpstats->count;
924 double av_pct_motion = fpstats->pcnt_motion / fpstats->count;
925 double av_intra = (1.0 - av_pct_inter);
927 double zz_cost;
928 double motion_cost;
929 double intra_cost;
931 zz_cost = bitcost(av_pct_inter - av_pct_motion);
932 motion_cost = bitcost(av_pct_motion);
933 intra_cost = bitcost(av_intra);
935 /* Estimate of extra bits per mv overhead for mbs
936 * << 9 is the normalization to the (bits * 512) used in vp8_bits_per_mb
937 */
938 mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9;
940 /* Crude estimate of overhead cost from modes
941 * << 9 is the normalization to (bits * 512) used in vp8_bits_per_mb
942 */
943 mode_cost =((((av_pct_inter - av_pct_motion) * zz_cost) +
944 (av_pct_motion * motion_cost) +
945 (av_intra * intra_cost)) * cpi->common.MBs) * 512;
947 return mv_cost + mode_cost;
948 }
950 static double calc_correction_factor( double err_per_mb,
951 double err_devisor,
952 double pt_low,
953 double pt_high,
954 int Q )
955 {
956 double power_term;
957 double error_term = err_per_mb / err_devisor;
958 double correction_factor;
960 /* Adjustment based on Q to power term. */
961 power_term = pt_low + (Q * 0.01);
962 power_term = (power_term > pt_high) ? pt_high : power_term;
964 /* Adjustments to error term */
965 /* TBD */
967 /* Calculate correction factor */
968 correction_factor = pow(error_term, power_term);
970 /* Clip range */
971 correction_factor =
972 (correction_factor < 0.05)
973 ? 0.05 : (correction_factor > 5.0) ? 5.0 : correction_factor;
975 return correction_factor;
976 }
978 static int estimate_max_q(VP8_COMP *cpi,
979 FIRSTPASS_STATS * fpstats,
980 int section_target_bandwitdh,
981 int overhead_bits )
982 {
983 int Q;
984 int num_mbs = cpi->common.MBs;
985 int target_norm_bits_per_mb;
987 double section_err = (fpstats->coded_error / fpstats->count);
988 double err_per_mb = section_err / num_mbs;
989 double err_correction_factor;
990 double speed_correction = 1.0;
991 int overhead_bits_per_mb;
993 if (section_target_bandwitdh <= 0)
994 return cpi->twopass.maxq_max_limit; /* Highest value allowed */
996 target_norm_bits_per_mb =
997 (section_target_bandwitdh < (1 << 20))
998 ? (512 * section_target_bandwitdh) / num_mbs
999 : 512 * (section_target_bandwitdh / num_mbs);
1001 /* Calculate a corrective factor based on a rolling ratio of bits spent
1002 * vs target bits
1003 */
1004 if ((cpi->rolling_target_bits > 0) &&
1005 (cpi->active_worst_quality < cpi->worst_quality))
1006 {
1007 double rolling_ratio;
1009 rolling_ratio = (double)cpi->rolling_actual_bits /
1010 (double)cpi->rolling_target_bits;
1012 if (rolling_ratio < 0.95)
1013 cpi->twopass.est_max_qcorrection_factor -= 0.005;
1014 else if (rolling_ratio > 1.05)
1015 cpi->twopass.est_max_qcorrection_factor += 0.005;
1017 cpi->twopass.est_max_qcorrection_factor =
1018 (cpi->twopass.est_max_qcorrection_factor < 0.1)
1019 ? 0.1
1020 : (cpi->twopass.est_max_qcorrection_factor > 10.0)
1021 ? 10.0 : cpi->twopass.est_max_qcorrection_factor;
1022 }
1024 /* Corrections for higher compression speed settings
1025 * (reduced compression expected)
1026 */
1027 if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
1028 {
1029 if (cpi->oxcf.cpu_used <= 5)
1030 speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
1031 else
1032 speed_correction = 1.25;
1033 }
1035 /* Estimate of overhead bits per mb */
1036 /* Correction to overhead bits for min allowed Q. */
1037 overhead_bits_per_mb = overhead_bits / num_mbs;
1038 overhead_bits_per_mb = (int)(overhead_bits_per_mb *
1039 pow( 0.98, (double)cpi->twopass.maxq_min_limit ));
1041 /* Try and pick a max Q that will be high enough to encode the
1042 * content at the given rate.
1043 */
1044 for (Q = cpi->twopass.maxq_min_limit; Q < cpi->twopass.maxq_max_limit; Q++)
1045 {
1046 int bits_per_mb_at_this_q;
1048 /* Error per MB based correction factor */
1049 err_correction_factor =
1050 calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q);
1052 bits_per_mb_at_this_q =
1053 vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb;
1055 bits_per_mb_at_this_q = (int)(.5 + err_correction_factor
1056 * speed_correction * cpi->twopass.est_max_qcorrection_factor
1057 * cpi->twopass.section_max_qfactor
1058 * (double)bits_per_mb_at_this_q);
1060 /* Mode and motion overhead */
1061 /* As Q rises in real encode loop rd code will force overhead down
1062 * We make a crude adjustment for this here as *.98 per Q step.
1063 */
1064 overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98);
1066 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
1067 break;
1068 }
1070 /* Restriction on active max q for constrained quality mode. */
1071 if ( (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) &&
1072 (Q < cpi->cq_target_quality) )
1073 {
1074 Q = cpi->cq_target_quality;
1075 }
1077 /* Adjust maxq_min_limit and maxq_max_limit limits based on
1078 * average q observed in clip for non kf/gf.arf frames
1079 * Give average a chance to settle though.
1080 */
1081 if ( (cpi->ni_frames >
1082 ((int)cpi->twopass.total_stats.count >> 8)) &&
1083 (cpi->ni_frames > 150) )
1084 {
1085 cpi->twopass.maxq_max_limit = ((cpi->ni_av_qi + 32) < cpi->worst_quality)
1086 ? (cpi->ni_av_qi + 32) : cpi->worst_quality;
1087 cpi->twopass.maxq_min_limit = ((cpi->ni_av_qi - 32) > cpi->best_quality)
1088 ? (cpi->ni_av_qi - 32) : cpi->best_quality;
1089 }
1091 return Q;
1092 }
1094 /* For cq mode estimate a cq level that matches the observed
1095 * complexity and data rate.
1096 */
1097 static int estimate_cq( VP8_COMP *cpi,
1098 FIRSTPASS_STATS * fpstats,
1099 int section_target_bandwitdh,
1100 int overhead_bits )
1101 {
1102 int Q;
1103 int num_mbs = cpi->common.MBs;
1104 int target_norm_bits_per_mb;
1106 double section_err = (fpstats->coded_error / fpstats->count);
1107 double err_per_mb = section_err / num_mbs;
1108 double err_correction_factor;
1109 double speed_correction = 1.0;
1110 double clip_iiratio;
1111 double clip_iifactor;
1112 int overhead_bits_per_mb;
1114 if (0)
1115 {
1116 FILE *f = fopen("epmp.stt", "a");
1117 fprintf(f, "%10.2f\n", err_per_mb );
1118 fclose(f);
1119 }
1121 target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20))
1122 ? (512 * section_target_bandwitdh) / num_mbs
1123 : 512 * (section_target_bandwitdh / num_mbs);
1125 /* Estimate of overhead bits per mb */
1126 overhead_bits_per_mb = overhead_bits / num_mbs;
1128 /* Corrections for higher compression speed settings
1129 * (reduced compression expected)
1130 */
1131 if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
1132 {
1133 if (cpi->oxcf.cpu_used <= 5)
1134 speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
1135 else
1136 speed_correction = 1.25;
1137 }
1139 /* II ratio correction factor for clip as a whole */
1140 clip_iiratio = cpi->twopass.total_stats.intra_error /
1141 DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.coded_error);
1142 clip_iifactor = 1.0 - ((clip_iiratio - 10.0) * 0.025);
1143 if (clip_iifactor < 0.80)
1144 clip_iifactor = 0.80;
1146 /* Try and pick a Q that can encode the content at the given rate. */
1147 for (Q = 0; Q < MAXQ; Q++)
1148 {
1149 int bits_per_mb_at_this_q;
1151 /* Error per MB based correction factor */
1152 err_correction_factor =
1153 calc_correction_factor(err_per_mb, 100.0, 0.40, 0.90, Q);
1155 bits_per_mb_at_this_q =
1156 vp8_bits_per_mb[INTER_FRAME][Q] + overhead_bits_per_mb;
1158 bits_per_mb_at_this_q =
1159 (int)( .5 + err_correction_factor *
1160 speed_correction *
1161 clip_iifactor *
1162 (double)bits_per_mb_at_this_q);
1164 /* Mode and motion overhead */
1165 /* As Q rises in real encode loop rd code will force overhead down
1166 * We make a crude adjustment for this here as *.98 per Q step.
1167 */
1168 overhead_bits_per_mb = (int)((double)overhead_bits_per_mb * 0.98);
1170 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
1171 break;
1172 }
1174 /* Clip value to range "best allowed to (worst allowed - 1)" */
1175 Q = cq_level[Q];
1176 if ( Q >= cpi->worst_quality )
1177 Q = cpi->worst_quality - 1;
1178 if ( Q < cpi->best_quality )
1179 Q = cpi->best_quality;
1181 return Q;
1182 }
1184 static int estimate_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh)
1185 {
1186 int Q;
1187 int num_mbs = cpi->common.MBs;
1188 int target_norm_bits_per_mb;
1190 double err_per_mb = section_err / num_mbs;
1191 double err_correction_factor;
1192 double speed_correction = 1.0;
1194 target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20)) ? (512 * section_target_bandwitdh) / num_mbs : 512 * (section_target_bandwitdh / num_mbs);
1196 /* Corrections for higher compression speed settings
1197 * (reduced compression expected)
1198 */
1199 if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
1200 {
1201 if (cpi->oxcf.cpu_used <= 5)
1202 speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
1203 else
1204 speed_correction = 1.25;
1205 }
1207 /* Try and pick a Q that can encode the content at the given rate. */
1208 for (Q = 0; Q < MAXQ; Q++)
1209 {
1210 int bits_per_mb_at_this_q;
1212 /* Error per MB based correction factor */
1213 err_correction_factor =
1214 calc_correction_factor(err_per_mb, 150.0, 0.40, 0.90, Q);
1216 bits_per_mb_at_this_q =
1217 (int)( .5 + ( err_correction_factor *
1218 speed_correction *
1219 cpi->twopass.est_max_qcorrection_factor *
1220 (double)vp8_bits_per_mb[INTER_FRAME][Q] / 1.0 ) );
1222 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
1223 break;
1224 }
1226 return Q;
1227 }
1229 /* Estimate a worst case Q for a KF group */
1230 static int estimate_kf_group_q(VP8_COMP *cpi, double section_err, int section_target_bandwitdh, double group_iiratio)
1231 {
1232 int Q;
1233 int num_mbs = cpi->common.MBs;
1234 int target_norm_bits_per_mb = (512 * section_target_bandwitdh) / num_mbs;
1235 int bits_per_mb_at_this_q;
1237 double err_per_mb = section_err / num_mbs;
1238 double err_correction_factor;
1239 double speed_correction = 1.0;
1240 double current_spend_ratio = 1.0;
1242 double pow_highq = (POW1 < 0.6) ? POW1 + 0.3 : 0.90;
1243 double pow_lowq = (POW1 < 0.7) ? POW1 + 0.1 : 0.80;
1245 double iiratio_correction_factor = 1.0;
1247 double combined_correction_factor;
1249 /* Trap special case where the target is <= 0 */
1250 if (target_norm_bits_per_mb <= 0)
1251 return MAXQ * 2;
1253 /* Calculate a corrective factor based on a rolling ratio of bits spent
1254 * vs target bits
1255 * This is clamped to the range 0.1 to 10.0
1256 */
1257 if (cpi->long_rolling_target_bits <= 0)
1258 current_spend_ratio = 10.0;
1259 else
1260 {
1261 current_spend_ratio = (double)cpi->long_rolling_actual_bits / (double)cpi->long_rolling_target_bits;
1262 current_spend_ratio = (current_spend_ratio > 10.0) ? 10.0 : (current_spend_ratio < 0.1) ? 0.1 : current_spend_ratio;
1263 }
1265 /* Calculate a correction factor based on the quality of prediction in
1266 * the sequence as indicated by intra_inter error score ratio (IIRatio)
1267 * The idea here is to favour subsampling in the hardest sections vs
1268 * the easyest.
1269 */
1270 iiratio_correction_factor = 1.0 - ((group_iiratio - 6.0) * 0.1);
1272 if (iiratio_correction_factor < 0.5)
1273 iiratio_correction_factor = 0.5;
1275 /* Corrections for higher compression speed settings
1276 * (reduced compression expected)
1277 */
1278 if ((cpi->compressor_speed == 3) || (cpi->compressor_speed == 1))
1279 {
1280 if (cpi->oxcf.cpu_used <= 5)
1281 speed_correction = 1.04 + (cpi->oxcf.cpu_used * 0.04);
1282 else
1283 speed_correction = 1.25;
1284 }
1286 /* Combine the various factors calculated above */
1287 combined_correction_factor = speed_correction * iiratio_correction_factor * current_spend_ratio;
1289 /* Try and pick a Q that should be high enough to encode the content at
1290 * the given rate.
1291 */
1292 for (Q = 0; Q < MAXQ; Q++)
1293 {
1294 /* Error per MB based correction factor */
1295 err_correction_factor =
1296 calc_correction_factor(err_per_mb, 150.0, pow_lowq, pow_highq, Q);
1298 bits_per_mb_at_this_q =
1299 (int)(.5 + ( err_correction_factor *
1300 combined_correction_factor *
1301 (double)vp8_bits_per_mb[INTER_FRAME][Q]) );
1303 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
1304 break;
1305 }
1307 /* If we could not hit the target even at Max Q then estimate what Q
1308 * would have been required
1309 */
1310 while ((bits_per_mb_at_this_q > target_norm_bits_per_mb) && (Q < (MAXQ * 2)))
1311 {
1313 bits_per_mb_at_this_q = (int)(0.96 * bits_per_mb_at_this_q);
1314 Q++;
1315 }
1317 if (0)
1318 {
1319 FILE *f = fopen("estkf_q.stt", "a");
1320 fprintf(f, "%8d %8d %8d %8.2f %8.3f %8.2f %8.3f %8.3f %8.3f %8d\n", cpi->common.current_video_frame, bits_per_mb_at_this_q,
1321 target_norm_bits_per_mb, err_per_mb, err_correction_factor,
1322 current_spend_ratio, group_iiratio, iiratio_correction_factor,
1323 (double)cpi->buffer_level / (double)cpi->oxcf.optimal_buffer_level, Q);
1324 fclose(f);
1325 }
1327 return Q;
1328 }
1330 extern void vp8_new_framerate(VP8_COMP *cpi, double framerate);
1332 void vp8_init_second_pass(VP8_COMP *cpi)
1333 {
1334 FIRSTPASS_STATS this_frame;
1335 FIRSTPASS_STATS *start_pos;
1337 double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
1339 zero_stats(&cpi->twopass.total_stats);
1340 zero_stats(&cpi->twopass.total_left_stats);
1342 if (!cpi->twopass.stats_in_end)
1343 return;
1345 cpi->twopass.total_stats = *cpi->twopass.stats_in_end;
1346 cpi->twopass.total_left_stats = cpi->twopass.total_stats;
1348 /* each frame can have a different duration, as the frame rate in the
1349 * source isn't guaranteed to be constant. The frame rate prior to
1350 * the first frame encoded in the second pass is a guess. However the
1351 * sum duration is not. Its calculated based on the actual durations of
1352 * all frames from the first pass.
1353 */
1354 vp8_new_framerate(cpi, 10000000.0 * cpi->twopass.total_stats.count / cpi->twopass.total_stats.duration);
1356 cpi->output_framerate = cpi->framerate;
1357 cpi->twopass.bits_left = (int64_t)(cpi->twopass.total_stats.duration * cpi->oxcf.target_bandwidth / 10000000.0) ;
1358 cpi->twopass.bits_left -= (int64_t)(cpi->twopass.total_stats.duration * two_pass_min_rate / 10000000.0);
1360 /* Calculate a minimum intra value to be used in determining the IIratio
1361 * scores used in the second pass. We have this minimum to make sure
1362 * that clips that are static but "low complexity" in the intra domain
1363 * are still boosted appropriately for KF/GF/ARF
1364 */
1365 cpi->twopass.kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs;
1366 cpi->twopass.gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs;
1368 /* Scan the first pass file and calculate an average Intra / Inter error
1369 * score ratio for the sequence
1370 */
1371 {
1372 double sum_iiratio = 0.0;
1373 double IIRatio;
1375 start_pos = cpi->twopass.stats_in; /* Note starting "file" position */
1377 while (input_stats(cpi, &this_frame) != EOF)
1378 {
1379 IIRatio = this_frame.intra_error / DOUBLE_DIVIDE_CHECK(this_frame.coded_error);
1380 IIRatio = (IIRatio < 1.0) ? 1.0 : (IIRatio > 20.0) ? 20.0 : IIRatio;
1381 sum_iiratio += IIRatio;
1382 }
1384 cpi->twopass.avg_iiratio = sum_iiratio / DOUBLE_DIVIDE_CHECK((double)cpi->twopass.total_stats.count);
1386 /* Reset file position */
1387 reset_fpf_position(cpi, start_pos);
1388 }
1390 /* Scan the first pass file and calculate a modified total error based
1391 * upon the bias/power function used to allocate bits
1392 */
1393 {
1394 start_pos = cpi->twopass.stats_in; /* Note starting "file" position */
1396 cpi->twopass.modified_error_total = 0.0;
1397 cpi->twopass.modified_error_used = 0.0;
1399 while (input_stats(cpi, &this_frame) != EOF)
1400 {
1401 cpi->twopass.modified_error_total += calculate_modified_err(cpi, &this_frame);
1402 }
1403 cpi->twopass.modified_error_left = cpi->twopass.modified_error_total;
1405 reset_fpf_position(cpi, start_pos); /* Reset file position */
1407 }
1408 }
1410 void vp8_end_second_pass(VP8_COMP *cpi)
1411 {
1412 }
1414 /* This function gives and estimate of how badly we believe the prediction
1415 * quality is decaying from frame to frame.
1416 */
1417 static double get_prediction_decay_rate(VP8_COMP *cpi, FIRSTPASS_STATS *next_frame)
1418 {
1419 double prediction_decay_rate;
1420 double motion_decay;
1421 double motion_pct = next_frame->pcnt_motion;
1423 /* Initial basis is the % mbs inter coded */
1424 prediction_decay_rate = next_frame->pcnt_inter;
1426 /* High % motion -> somewhat higher decay rate */
1427 motion_decay = (1.0 - (motion_pct / 20.0));
1428 if (motion_decay < prediction_decay_rate)
1429 prediction_decay_rate = motion_decay;
1431 /* Adjustment to decay rate based on speed of motion */
1432 {
1433 double this_mv_rabs;
1434 double this_mv_cabs;
1435 double distance_factor;
1437 this_mv_rabs = fabs(next_frame->mvr_abs * motion_pct);
1438 this_mv_cabs = fabs(next_frame->mvc_abs * motion_pct);
1440 distance_factor = sqrt((this_mv_rabs * this_mv_rabs) +
1441 (this_mv_cabs * this_mv_cabs)) / 250.0;
1442 distance_factor = ((distance_factor > 1.0)
1443 ? 0.0 : (1.0 - distance_factor));
1444 if (distance_factor < prediction_decay_rate)
1445 prediction_decay_rate = distance_factor;
1446 }
1448 return prediction_decay_rate;
1449 }
1451 /* Function to test for a condition where a complex transition is followed
1452 * by a static section. For example in slide shows where there is a fade
1453 * between slides. This is to help with more optimal kf and gf positioning.
1454 */
1455 static int detect_transition_to_still(
1456 VP8_COMP *cpi,
1457 int frame_interval,
1458 int still_interval,
1459 double loop_decay_rate,
1460 double decay_accumulator )
1461 {
1462 int trans_to_still = 0;
1464 /* Break clause to detect very still sections after motion
1465 * For example a static image after a fade or other transition
1466 * instead of a clean scene cut.
1467 */
1468 if ( (frame_interval > MIN_GF_INTERVAL) &&
1469 (loop_decay_rate >= 0.999) &&
1470 (decay_accumulator < 0.9) )
1471 {
1472 int j;
1473 FIRSTPASS_STATS * position = cpi->twopass.stats_in;
1474 FIRSTPASS_STATS tmp_next_frame;
1475 double decay_rate;
1477 /* Look ahead a few frames to see if static condition persists... */
1478 for ( j = 0; j < still_interval; j++ )
1479 {
1480 if (EOF == input_stats(cpi, &tmp_next_frame))
1481 break;
1483 decay_rate = get_prediction_decay_rate(cpi, &tmp_next_frame);
1484 if ( decay_rate < 0.999 )
1485 break;
1486 }
1487 /* Reset file position */
1488 reset_fpf_position(cpi, position);
1490 /* Only if it does do we signal a transition to still */
1491 if ( j == still_interval )
1492 trans_to_still = 1;
1493 }
1495 return trans_to_still;
1496 }
1498 /* This function detects a flash through the high relative pcnt_second_ref
1499 * score in the frame following a flash frame. The offset passed in should
1500 * reflect this
1501 */
1502 static int detect_flash( VP8_COMP *cpi, int offset )
1503 {
1504 FIRSTPASS_STATS next_frame;
1506 int flash_detected = 0;
1508 /* Read the frame data. */
1509 /* The return is 0 (no flash detected) if not a valid frame */
1510 if ( read_frame_stats(cpi, &next_frame, offset) != EOF )
1511 {
1512 /* What we are looking for here is a situation where there is a
1513 * brief break in prediction (such as a flash) but subsequent frames
1514 * are reasonably well predicted by an earlier (pre flash) frame.
1515 * The recovery after a flash is indicated by a high pcnt_second_ref
1516 * comapred to pcnt_inter.
1517 */
1518 if ( (next_frame.pcnt_second_ref > next_frame.pcnt_inter) &&
1519 (next_frame.pcnt_second_ref >= 0.5 ) )
1520 {
1521 flash_detected = 1;
1523 /*if (1)
1524 {
1525 FILE *f = fopen("flash.stt", "a");
1526 fprintf(f, "%8.0f %6.2f %6.2f\n",
1527 next_frame.frame,
1528 next_frame.pcnt_inter,
1529 next_frame.pcnt_second_ref);
1530 fclose(f);
1531 }*/
1532 }
1533 }
1535 return flash_detected;
1536 }
1538 /* Update the motion related elements to the GF arf boost calculation */
1539 static void accumulate_frame_motion_stats(
1540 VP8_COMP *cpi,
1541 FIRSTPASS_STATS * this_frame,
1542 double * this_frame_mv_in_out,
1543 double * mv_in_out_accumulator,
1544 double * abs_mv_in_out_accumulator,
1545 double * mv_ratio_accumulator )
1546 {
1547 double this_frame_mvr_ratio;
1548 double this_frame_mvc_ratio;
1549 double motion_pct;
1551 /* Accumulate motion stats. */
1552 motion_pct = this_frame->pcnt_motion;
1554 /* Accumulate Motion In/Out of frame stats */
1555 *this_frame_mv_in_out = this_frame->mv_in_out_count * motion_pct;
1556 *mv_in_out_accumulator += this_frame->mv_in_out_count * motion_pct;
1557 *abs_mv_in_out_accumulator +=
1558 fabs(this_frame->mv_in_out_count * motion_pct);
1560 /* Accumulate a measure of how uniform (or conversely how random)
1561 * the motion field is. (A ratio of absmv / mv)
1562 */
1563 if (motion_pct > 0.05)
1564 {
1565 this_frame_mvr_ratio = fabs(this_frame->mvr_abs) /
1566 DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVr));
1568 this_frame_mvc_ratio = fabs(this_frame->mvc_abs) /
1569 DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVc));
1571 *mv_ratio_accumulator +=
1572 (this_frame_mvr_ratio < this_frame->mvr_abs)
1573 ? (this_frame_mvr_ratio * motion_pct)
1574 : this_frame->mvr_abs * motion_pct;
1576 *mv_ratio_accumulator +=
1577 (this_frame_mvc_ratio < this_frame->mvc_abs)
1578 ? (this_frame_mvc_ratio * motion_pct)
1579 : this_frame->mvc_abs * motion_pct;
1581 }
1582 }
1584 /* Calculate a baseline boost number for the current frame. */
1585 static double calc_frame_boost(
1586 VP8_COMP *cpi,
1587 FIRSTPASS_STATS * this_frame,
1588 double this_frame_mv_in_out )
1589 {
1590 double frame_boost;
1592 /* Underlying boost factor is based on inter intra error ratio */
1593 if (this_frame->intra_error > cpi->twopass.gf_intra_err_min)
1594 frame_boost = (IIFACTOR * this_frame->intra_error /
1595 DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
1596 else
1597 frame_boost = (IIFACTOR * cpi->twopass.gf_intra_err_min /
1598 DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
1600 /* Increase boost for frames where new data coming into frame
1601 * (eg zoom out). Slightly reduce boost if there is a net balance
1602 * of motion out of the frame (zoom in).
1603 * The range for this_frame_mv_in_out is -1.0 to +1.0
1604 */
1605 if (this_frame_mv_in_out > 0.0)
1606 frame_boost += frame_boost * (this_frame_mv_in_out * 2.0);
1607 /* In extreme case boost is halved */
1608 else
1609 frame_boost += frame_boost * (this_frame_mv_in_out / 2.0);
1611 /* Clip to maximum */
1612 if (frame_boost > GF_RMAX)
1613 frame_boost = GF_RMAX;
1615 return frame_boost;
1616 }
1618 #if NEW_BOOST
1619 static int calc_arf_boost(
1620 VP8_COMP *cpi,
1621 int offset,
1622 int f_frames,
1623 int b_frames,
1624 int *f_boost,
1625 int *b_boost )
1626 {
1627 FIRSTPASS_STATS this_frame;
1629 int i;
1630 double boost_score = 0.0;
1631 double mv_ratio_accumulator = 0.0;
1632 double decay_accumulator = 1.0;
1633 double this_frame_mv_in_out = 0.0;
1634 double mv_in_out_accumulator = 0.0;
1635 double abs_mv_in_out_accumulator = 0.0;
1636 double r;
1637 int flash_detected = 0;
1639 /* Search forward from the proposed arf/next gf position */
1640 for ( i = 0; i < f_frames; i++ )
1641 {
1642 if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF )
1643 break;
1645 /* Update the motion related elements to the boost calculation */
1646 accumulate_frame_motion_stats( cpi, &this_frame,
1647 &this_frame_mv_in_out, &mv_in_out_accumulator,
1648 &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
1650 /* Calculate the baseline boost number for this frame */
1651 r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out );
1653 /* We want to discount the the flash frame itself and the recovery
1654 * frame that follows as both will have poor scores.
1655 */
1656 flash_detected = detect_flash(cpi, (i+offset)) ||
1657 detect_flash(cpi, (i+offset+1));
1659 /* Cumulative effect of prediction quality decay */
1660 if ( !flash_detected )
1661 {
1662 decay_accumulator =
1663 decay_accumulator *
1664 get_prediction_decay_rate(cpi, &this_frame);
1665 decay_accumulator =
1666 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
1667 }
1668 boost_score += (decay_accumulator * r);
1670 /* Break out conditions. */
1671 if ( (!flash_detected) &&
1672 ((mv_ratio_accumulator > 100.0) ||
1673 (abs_mv_in_out_accumulator > 3.0) ||
1674 (mv_in_out_accumulator < -2.0) ) )
1675 {
1676 break;
1677 }
1678 }
1680 *f_boost = (int)(boost_score * 100.0) >> 4;
1682 /* Reset for backward looking loop */
1683 boost_score = 0.0;
1684 mv_ratio_accumulator = 0.0;
1685 decay_accumulator = 1.0;
1686 this_frame_mv_in_out = 0.0;
1687 mv_in_out_accumulator = 0.0;
1688 abs_mv_in_out_accumulator = 0.0;
1690 /* Search forward from the proposed arf/next gf position */
1691 for ( i = -1; i >= -b_frames; i-- )
1692 {
1693 if ( read_frame_stats(cpi, &this_frame, (i+offset)) == EOF )
1694 break;
1696 /* Update the motion related elements to the boost calculation */
1697 accumulate_frame_motion_stats( cpi, &this_frame,
1698 &this_frame_mv_in_out, &mv_in_out_accumulator,
1699 &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
1701 /* Calculate the baseline boost number for this frame */
1702 r = calc_frame_boost( cpi, &this_frame, this_frame_mv_in_out );
1704 /* We want to discount the the flash frame itself and the recovery
1705 * frame that follows as both will have poor scores.
1706 */
1707 flash_detected = detect_flash(cpi, (i+offset)) ||
1708 detect_flash(cpi, (i+offset+1));
1710 /* Cumulative effect of prediction quality decay */
1711 if ( !flash_detected )
1712 {
1713 decay_accumulator =
1714 decay_accumulator *
1715 get_prediction_decay_rate(cpi, &this_frame);
1716 decay_accumulator =
1717 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
1718 }
1720 boost_score += (decay_accumulator * r);
1722 /* Break out conditions. */
1723 if ( (!flash_detected) &&
1724 ((mv_ratio_accumulator > 100.0) ||
1725 (abs_mv_in_out_accumulator > 3.0) ||
1726 (mv_in_out_accumulator < -2.0) ) )
1727 {
1728 break;
1729 }
1730 }
1731 *b_boost = (int)(boost_score * 100.0) >> 4;
1733 return (*f_boost + *b_boost);
1734 }
1735 #endif
1737 /* Analyse and define a gf/arf group . */
1738 static void define_gf_group(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
1739 {
1740 FIRSTPASS_STATS next_frame;
1741 FIRSTPASS_STATS *start_pos;
1742 int i;
1743 double r;
1744 double boost_score = 0.0;
1745 double old_boost_score = 0.0;
1746 double gf_group_err = 0.0;
1747 double gf_first_frame_err = 0.0;
1748 double mod_frame_err = 0.0;
1750 double mv_ratio_accumulator = 0.0;
1751 double decay_accumulator = 1.0;
1753 double loop_decay_rate = 1.00; /* Starting decay rate */
1755 double this_frame_mv_in_out = 0.0;
1756 double mv_in_out_accumulator = 0.0;
1757 double abs_mv_in_out_accumulator = 0.0;
1758 double mod_err_per_mb_accumulator = 0.0;
1760 int max_bits = frame_max_bits(cpi); /* Max for a single frame */
1762 unsigned int allow_alt_ref =
1763 cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames;
1765 int alt_boost = 0;
1766 int f_boost = 0;
1767 int b_boost = 0;
1768 int flash_detected;
1770 cpi->twopass.gf_group_bits = 0;
1771 cpi->twopass.gf_decay_rate = 0;
1773 vp8_clear_system_state();
1775 start_pos = cpi->twopass.stats_in;
1777 vpx_memset(&next_frame, 0, sizeof(next_frame)); /* assure clean */
1779 /* Load stats for the current frame. */
1780 mod_frame_err = calculate_modified_err(cpi, this_frame);
1782 /* Note the error of the frame at the start of the group (this will be
1783 * the GF frame error if we code a normal gf
1784 */
1785 gf_first_frame_err = mod_frame_err;
1787 /* Special treatment if the current frame is a key frame (which is also
1788 * a gf). If it is then its error score (and hence bit allocation) need
1789 * to be subtracted out from the calculation for the GF group
1790 */
1791 if (cpi->common.frame_type == KEY_FRAME)
1792 gf_group_err -= gf_first_frame_err;
1794 /* Scan forward to try and work out how many frames the next gf group
1795 * should contain and what level of boost is appropriate for the GF
1796 * or ARF that will be coded with the group
1797 */
1798 i = 0;
1800 while (((i < cpi->twopass.static_scene_max_gf_interval) ||
1801 ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)) &&
1802 (i < cpi->twopass.frames_to_key))
1803 {
1804 i++;
1806 /* Accumulate error score of frames in this gf group */
1807 mod_frame_err = calculate_modified_err(cpi, this_frame);
1809 gf_group_err += mod_frame_err;
1811 mod_err_per_mb_accumulator +=
1812 mod_frame_err / DOUBLE_DIVIDE_CHECK((double)cpi->common.MBs);
1814 if (EOF == input_stats(cpi, &next_frame))
1815 break;
1817 /* Test for the case where there is a brief flash but the prediction
1818 * quality back to an earlier frame is then restored.
1819 */
1820 flash_detected = detect_flash(cpi, 0);
1822 /* Update the motion related elements to the boost calculation */
1823 accumulate_frame_motion_stats( cpi, &next_frame,
1824 &this_frame_mv_in_out, &mv_in_out_accumulator,
1825 &abs_mv_in_out_accumulator, &mv_ratio_accumulator );
1827 /* Calculate a baseline boost number for this frame */
1828 r = calc_frame_boost( cpi, &next_frame, this_frame_mv_in_out );
1830 /* Cumulative effect of prediction quality decay */
1831 if ( !flash_detected )
1832 {
1833 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
1834 decay_accumulator = decay_accumulator * loop_decay_rate;
1835 decay_accumulator =
1836 decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
1837 }
1838 boost_score += (decay_accumulator * r);
1840 /* Break clause to detect very still sections after motion
1841 * For example a staic image after a fade or other transition.
1842 */
1843 if ( detect_transition_to_still( cpi, i, 5,
1844 loop_decay_rate,
1845 decay_accumulator ) )
1846 {
1847 allow_alt_ref = 0;
1848 boost_score = old_boost_score;
1849 break;
1850 }
1852 /* Break out conditions. */
1853 if (
1854 /* Break at cpi->max_gf_interval unless almost totally static */
1855 (i >= cpi->max_gf_interval && (decay_accumulator < 0.995)) ||
1856 (
1857 /* Dont break out with a very short interval */
1858 (i > MIN_GF_INTERVAL) &&
1859 /* Dont break out very close to a key frame */
1860 ((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) &&
1861 ((boost_score > 20.0) || (next_frame.pcnt_inter < 0.75)) &&
1862 (!flash_detected) &&
1863 ((mv_ratio_accumulator > 100.0) ||
1864 (abs_mv_in_out_accumulator > 3.0) ||
1865 (mv_in_out_accumulator < -2.0) ||
1866 ((boost_score - old_boost_score) < 2.0))
1867 ) )
1868 {
1869 boost_score = old_boost_score;
1870 break;
1871 }
1873 vpx_memcpy(this_frame, &next_frame, sizeof(*this_frame));
1875 old_boost_score = boost_score;
1876 }
1878 cpi->twopass.gf_decay_rate =
1879 (i > 0) ? (int)(100.0 * (1.0 - decay_accumulator)) / i : 0;
1881 /* When using CBR apply additional buffer related upper limits */
1882 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
1883 {
1884 double max_boost;
1886 /* For cbr apply buffer related limits */
1887 if (cpi->drop_frames_allowed)
1888 {
1889 int64_t df_buffer_level = cpi->oxcf.drop_frames_water_mark *
1890 (cpi->oxcf.optimal_buffer_level / 100);
1892 if (cpi->buffer_level > df_buffer_level)
1893 max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
1894 else
1895 max_boost = 0.0;
1896 }
1897 else if (cpi->buffer_level > 0)
1898 {
1899 max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
1900 }
1901 else
1902 {
1903 max_boost = 0.0;
1904 }
1906 if (boost_score > max_boost)
1907 boost_score = max_boost;
1908 }
1910 /* Dont allow conventional gf too near the next kf */
1911 if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)
1912 {
1913 while (i < cpi->twopass.frames_to_key)
1914 {
1915 i++;
1917 if (EOF == input_stats(cpi, this_frame))
1918 break;
1920 if (i < cpi->twopass.frames_to_key)
1921 {
1922 mod_frame_err = calculate_modified_err(cpi, this_frame);
1923 gf_group_err += mod_frame_err;
1924 }
1925 }
1926 }
1928 cpi->gfu_boost = (int)(boost_score * 100.0) >> 4;
1930 #if NEW_BOOST
1931 /* Alterrnative boost calculation for alt ref */
1932 alt_boost = calc_arf_boost( cpi, 0, (i-1), (i-1), &f_boost, &b_boost );
1933 #endif
1935 /* Should we use the alternate refernce frame */
1936 if (allow_alt_ref &&
1937 (i >= MIN_GF_INTERVAL) &&
1938 /* dont use ARF very near next kf */
1939 (i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) &&
1940 #if NEW_BOOST
1941 ((next_frame.pcnt_inter > 0.75) ||
1942 (next_frame.pcnt_second_ref > 0.5)) &&
1943 ((mv_in_out_accumulator / (double)i > -0.2) ||
1944 (mv_in_out_accumulator > -2.0)) &&
1945 (b_boost > 100) &&
1946 (f_boost > 100) )
1947 #else
1948 (next_frame.pcnt_inter > 0.75) &&
1949 ((mv_in_out_accumulator / (double)i > -0.2) ||
1950 (mv_in_out_accumulator > -2.0)) &&
1951 (cpi->gfu_boost > 100) &&
1952 (cpi->twopass.gf_decay_rate <=
1953 (ARF_DECAY_THRESH + (cpi->gfu_boost / 200))) )
1954 #endif
1955 {
1956 int Boost;
1957 int allocation_chunks;
1958 int Q = (cpi->oxcf.fixed_q < 0)
1959 ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
1960 int tmp_q;
1961 int arf_frame_bits = 0;
1962 int group_bits;
1964 #if NEW_BOOST
1965 cpi->gfu_boost = alt_boost;
1966 #endif
1968 /* Estimate the bits to be allocated to the group as a whole */
1969 if ((cpi->twopass.kf_group_bits > 0) &&
1970 (cpi->twopass.kf_group_error_left > 0))
1971 {
1972 group_bits = (int)((double)cpi->twopass.kf_group_bits *
1973 (gf_group_err / (double)cpi->twopass.kf_group_error_left));
1974 }
1975 else
1976 group_bits = 0;
1978 /* Boost for arf frame */
1979 #if NEW_BOOST
1980 Boost = (alt_boost * GFQ_ADJUSTMENT) / 100;
1981 #else
1982 Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
1983 #endif
1984 Boost += (i * 50);
1986 /* Set max and minimum boost and hence minimum allocation */
1987 if (Boost > ((cpi->baseline_gf_interval + 1) * 200))
1988 Boost = ((cpi->baseline_gf_interval + 1) * 200);
1989 else if (Boost < 125)
1990 Boost = 125;
1992 allocation_chunks = (i * 100) + Boost;
1994 /* Normalize Altboost and allocations chunck down to prevent overflow */
1995 while (Boost > 1000)
1996 {
1997 Boost /= 2;
1998 allocation_chunks /= 2;
1999 }
2001 /* Calculate the number of bits to be spent on the arf based on the
2002 * boost number
2003 */
2004 arf_frame_bits = (int)((double)Boost * (group_bits /
2005 (double)allocation_chunks));
2007 /* Estimate if there are enough bits available to make worthwhile use
2008 * of an arf.
2009 */
2010 tmp_q = estimate_q(cpi, mod_frame_err, (int)arf_frame_bits);
2012 /* Only use an arf if it is likely we will be able to code
2013 * it at a lower Q than the surrounding frames.
2014 */
2015 if (tmp_q < cpi->worst_quality)
2016 {
2017 int half_gf_int;
2018 int frames_after_arf;
2019 int frames_bwd = cpi->oxcf.arnr_max_frames - 1;
2020 int frames_fwd = cpi->oxcf.arnr_max_frames - 1;
2022 cpi->source_alt_ref_pending = 1;
2024 /*
2025 * For alt ref frames the error score for the end frame of the
2026 * group (the alt ref frame) should not contribute to the group
2027 * total and hence the number of bit allocated to the group.
2028 * Rather it forms part of the next group (it is the GF at the
2029 * start of the next group)
2030 * gf_group_err -= mod_frame_err;
2031 *
2032 * For alt ref frames alt ref frame is technically part of the
2033 * GF frame for the next group but we always base the error
2034 * calculation and bit allocation on the current group of frames.
2035 *
2036 * Set the interval till the next gf or arf.
2037 * For ARFs this is the number of frames to be coded before the
2038 * future frame that is coded as an ARF.
2039 * The future frame itself is part of the next group
2040 */
2041 cpi->baseline_gf_interval = i;
2043 /*
2044 * Define the arnr filter width for this group of frames:
2045 * We only filter frames that lie within a distance of half
2046 * the GF interval from the ARF frame. We also have to trap
2047 * cases where the filter extends beyond the end of clip.
2048 * Note: this_frame->frame has been updated in the loop
2049 * so it now points at the ARF frame.
2050 */
2051 half_gf_int = cpi->baseline_gf_interval >> 1;
2052 frames_after_arf = (int)(cpi->twopass.total_stats.count -
2053 this_frame->frame - 1);
2055 switch (cpi->oxcf.arnr_type)
2056 {
2057 case 1: /* Backward filter */
2058 frames_fwd = 0;
2059 if (frames_bwd > half_gf_int)
2060 frames_bwd = half_gf_int;
2061 break;
2063 case 2: /* Forward filter */
2064 if (frames_fwd > half_gf_int)
2065 frames_fwd = half_gf_int;
2066 if (frames_fwd > frames_after_arf)
2067 frames_fwd = frames_after_arf;
2068 frames_bwd = 0;
2069 break;
2071 case 3: /* Centered filter */
2072 default:
2073 frames_fwd >>= 1;
2074 if (frames_fwd > frames_after_arf)
2075 frames_fwd = frames_after_arf;
2076 if (frames_fwd > half_gf_int)
2077 frames_fwd = half_gf_int;
2079 frames_bwd = frames_fwd;
2081 /* For even length filter there is one more frame backward
2082 * than forward: e.g. len=6 ==> bbbAff, len=7 ==> bbbAfff.
2083 */
2084 if (frames_bwd < half_gf_int)
2085 frames_bwd += (cpi->oxcf.arnr_max_frames+1) & 0x1;
2086 break;
2087 }
2089 cpi->active_arnr_frames = frames_bwd + 1 + frames_fwd;
2090 }
2091 else
2092 {
2093 cpi->source_alt_ref_pending = 0;
2094 cpi->baseline_gf_interval = i;
2095 }
2096 }
2097 else
2098 {
2099 cpi->source_alt_ref_pending = 0;
2100 cpi->baseline_gf_interval = i;
2101 }
2103 /*
2104 * Now decide how many bits should be allocated to the GF group as a
2105 * proportion of those remaining in the kf group.
2106 * The final key frame group in the clip is treated as a special case
2107 * where cpi->twopass.kf_group_bits is tied to cpi->twopass.bits_left.
2108 * This is also important for short clips where there may only be one
2109 * key frame.
2110 */
2111 if (cpi->twopass.frames_to_key >= (int)(cpi->twopass.total_stats.count -
2112 cpi->common.current_video_frame))
2113 {
2114 cpi->twopass.kf_group_bits =
2115 (cpi->twopass.bits_left > 0) ? cpi->twopass.bits_left : 0;
2116 }
2118 /* Calculate the bits to be allocated to the group as a whole */
2119 if ((cpi->twopass.kf_group_bits > 0) &&
2120 (cpi->twopass.kf_group_error_left > 0))
2121 {
2122 cpi->twopass.gf_group_bits =
2123 (int64_t)(cpi->twopass.kf_group_bits *
2124 (gf_group_err / cpi->twopass.kf_group_error_left));
2125 }
2126 else
2127 cpi->twopass.gf_group_bits = 0;
2129 cpi->twopass.gf_group_bits =
2130 (cpi->twopass.gf_group_bits < 0)
2131 ? 0
2132 : (cpi->twopass.gf_group_bits > cpi->twopass.kf_group_bits)
2133 ? cpi->twopass.kf_group_bits : cpi->twopass.gf_group_bits;
2135 /* Clip cpi->twopass.gf_group_bits based on user supplied data rate
2136 * variability limit (cpi->oxcf.two_pass_vbrmax_section)
2137 */
2138 if (cpi->twopass.gf_group_bits >
2139 (int64_t)max_bits * cpi->baseline_gf_interval)
2140 cpi->twopass.gf_group_bits =
2141 (int64_t)max_bits * cpi->baseline_gf_interval;
2143 /* Reset the file position */
2144 reset_fpf_position(cpi, start_pos);
2146 /* Update the record of error used so far (only done once per gf group) */
2147 cpi->twopass.modified_error_used += gf_group_err;
2149 /* Assign bits to the arf or gf. */
2150 for (i = 0; i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME); i++) {
2151 int Boost;
2152 int allocation_chunks;
2153 int Q = (cpi->oxcf.fixed_q < 0) ? cpi->last_q[INTER_FRAME] : cpi->oxcf.fixed_q;
2154 int gf_bits;
2156 /* For ARF frames */
2157 if (cpi->source_alt_ref_pending && i == 0)
2158 {
2159 #if NEW_BOOST
2160 Boost = (alt_boost * GFQ_ADJUSTMENT) / 100;
2161 #else
2162 Boost = (cpi->gfu_boost * 3 * GFQ_ADJUSTMENT) / (2 * 100);
2163 #endif
2164 Boost += (cpi->baseline_gf_interval * 50);
2166 /* Set max and minimum boost and hence minimum allocation */
2167 if (Boost > ((cpi->baseline_gf_interval + 1) * 200))
2168 Boost = ((cpi->baseline_gf_interval + 1) * 200);
2169 else if (Boost < 125)
2170 Boost = 125;
2172 allocation_chunks =
2173 ((cpi->baseline_gf_interval + 1) * 100) + Boost;
2174 }
2175 /* Else for standard golden frames */
2176 else
2177 {
2178 /* boost based on inter / intra ratio of subsequent frames */
2179 Boost = (cpi->gfu_boost * GFQ_ADJUSTMENT) / 100;
2181 /* Set max and minimum boost and hence minimum allocation */
2182 if (Boost > (cpi->baseline_gf_interval * 150))
2183 Boost = (cpi->baseline_gf_interval * 150);
2184 else if (Boost < 125)
2185 Boost = 125;
2187 allocation_chunks =
2188 (cpi->baseline_gf_interval * 100) + (Boost - 100);
2189 }
2191 /* Normalize Altboost and allocations chunck down to prevent overflow */
2192 while (Boost > 1000)
2193 {
2194 Boost /= 2;
2195 allocation_chunks /= 2;
2196 }
2198 /* Calculate the number of bits to be spent on the gf or arf based on
2199 * the boost number
2200 */
2201 gf_bits = (int)((double)Boost *
2202 (cpi->twopass.gf_group_bits /
2203 (double)allocation_chunks));
2205 /* If the frame that is to be boosted is simpler than the average for
2206 * the gf/arf group then use an alternative calculation
2207 * based on the error score of the frame itself
2208 */
2209 if (mod_frame_err < gf_group_err / (double)cpi->baseline_gf_interval)
2210 {
2211 double alt_gf_grp_bits;
2212 int alt_gf_bits;
2214 alt_gf_grp_bits =
2215 (double)cpi->twopass.kf_group_bits *
2216 (mod_frame_err * (double)cpi->baseline_gf_interval) /
2217 DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left);
2219 alt_gf_bits = (int)((double)Boost * (alt_gf_grp_bits /
2220 (double)allocation_chunks));
2222 if (gf_bits > alt_gf_bits)
2223 {
2224 gf_bits = alt_gf_bits;
2225 }
2226 }
2227 /* Else if it is harder than other frames in the group make sure it at
2228 * least receives an allocation in keeping with its relative error
2229 * score, otherwise it may be worse off than an "un-boosted" frame
2230 */
2231 else
2232 {
2233 int alt_gf_bits =
2234 (int)((double)cpi->twopass.kf_group_bits *
2235 mod_frame_err /
2236 DOUBLE_DIVIDE_CHECK((double)cpi->twopass.kf_group_error_left));
2238 if (alt_gf_bits > gf_bits)
2239 {
2240 gf_bits = alt_gf_bits;
2241 }
2242 }
2244 /* Apply an additional limit for CBR */
2245 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
2246 {
2247 if (cpi->twopass.gf_bits > (int)(cpi->buffer_level >> 1))
2248 cpi->twopass.gf_bits = (int)(cpi->buffer_level >> 1);
2249 }
2251 /* Dont allow a negative value for gf_bits */
2252 if (gf_bits < 0)
2253 gf_bits = 0;
2255 /* Add in minimum for a frame */
2256 gf_bits += cpi->min_frame_bandwidth;
2258 if (i == 0)
2259 {
2260 cpi->twopass.gf_bits = gf_bits;
2261 }
2262 if (i == 1 || (!cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)))
2263 {
2264 /* Per frame bit target for this frame */
2265 cpi->per_frame_bandwidth = gf_bits;
2266 }
2267 }
2269 {
2270 /* Adjust KF group bits and error remainin */
2271 cpi->twopass.kf_group_error_left -= (int64_t)gf_group_err;
2272 cpi->twopass.kf_group_bits -= cpi->twopass.gf_group_bits;
2274 if (cpi->twopass.kf_group_bits < 0)
2275 cpi->twopass.kf_group_bits = 0;
2277 /* Note the error score left in the remaining frames of the group.
2278 * For normal GFs we want to remove the error score for the first
2279 * frame of the group (except in Key frame case where this has
2280 * already happened)
2281 */
2282 if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME)
2283 cpi->twopass.gf_group_error_left = (int)(gf_group_err -
2284 gf_first_frame_err);
2285 else
2286 cpi->twopass.gf_group_error_left = (int) gf_group_err;
2288 cpi->twopass.gf_group_bits -= cpi->twopass.gf_bits - cpi->min_frame_bandwidth;
2290 if (cpi->twopass.gf_group_bits < 0)
2291 cpi->twopass.gf_group_bits = 0;
2293 /* This condition could fail if there are two kfs very close together
2294 * despite (MIN_GF_INTERVAL) and would cause a devide by 0 in the
2295 * calculation of cpi->twopass.alt_extra_bits.
2296 */
2297 if ( cpi->baseline_gf_interval >= 3 )
2298 {
2299 #if NEW_BOOST
2300 int boost = (cpi->source_alt_ref_pending)
2301 ? b_boost : cpi->gfu_boost;
2302 #else
2303 int boost = cpi->gfu_boost;
2304 #endif
2305 if ( boost >= 150 )
2306 {
2307 int pct_extra;
2309 pct_extra = (boost - 100) / 50;
2310 pct_extra = (pct_extra > 20) ? 20 : pct_extra;
2312 cpi->twopass.alt_extra_bits =
2313 (cpi->twopass.gf_group_bits * pct_extra) / 100;
2314 cpi->twopass.gf_group_bits -= cpi->twopass.alt_extra_bits;
2315 cpi->twopass.alt_extra_bits /=
2316 ((cpi->baseline_gf_interval-1)>>1);
2317 }
2318 else
2319 cpi->twopass.alt_extra_bits = 0;
2320 }
2321 else
2322 cpi->twopass.alt_extra_bits = 0;
2323 }
2325 /* Adjustments based on a measure of complexity of the section */
2326 if (cpi->common.frame_type != KEY_FRAME)
2327 {
2328 FIRSTPASS_STATS sectionstats;
2329 double Ratio;
2331 zero_stats(§ionstats);
2332 reset_fpf_position(cpi, start_pos);
2334 for (i = 0 ; i < cpi->baseline_gf_interval ; i++)
2335 {
2336 input_stats(cpi, &next_frame);
2337 accumulate_stats(§ionstats, &next_frame);
2338 }
2340 avg_stats(§ionstats);
2342 cpi->twopass.section_intra_rating = (unsigned int)
2343 (sectionstats.intra_error /
2344 DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
2346 Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
2347 cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
2349 if (cpi->twopass.section_max_qfactor < 0.80)
2350 cpi->twopass.section_max_qfactor = 0.80;
2352 reset_fpf_position(cpi, start_pos);
2353 }
2354 }
2356 /* Allocate bits to a normal frame that is neither a gf an arf or a key frame. */
2357 static void assign_std_frame_bits(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
2358 {
2359 int target_frame_size;
2361 double modified_err;
2362 double err_fraction;
2364 int max_bits = frame_max_bits(cpi); /* Max for a single frame */
2366 /* Calculate modified prediction error used in bit allocation */
2367 modified_err = calculate_modified_err(cpi, this_frame);
2369 /* What portion of the remaining GF group error is used by this frame */
2370 if (cpi->twopass.gf_group_error_left > 0)
2371 err_fraction = modified_err / cpi->twopass.gf_group_error_left;
2372 else
2373 err_fraction = 0.0;
2375 /* How many of those bits available for allocation should we give it? */
2376 target_frame_size = (int)((double)cpi->twopass.gf_group_bits * err_fraction);
2378 /* Clip to target size to 0 - max_bits (or cpi->twopass.gf_group_bits)
2379 * at the top end.
2380 */
2381 if (target_frame_size < 0)
2382 target_frame_size = 0;
2383 else
2384 {
2385 if (target_frame_size > max_bits)
2386 target_frame_size = max_bits;
2388 if (target_frame_size > cpi->twopass.gf_group_bits)
2389 target_frame_size = cpi->twopass.gf_group_bits;
2390 }
2392 /* Adjust error and bits remaining */
2393 cpi->twopass.gf_group_error_left -= (int)modified_err;
2394 cpi->twopass.gf_group_bits -= target_frame_size;
2396 if (cpi->twopass.gf_group_bits < 0)
2397 cpi->twopass.gf_group_bits = 0;
2399 /* Add in the minimum number of bits that is set aside for every frame. */
2400 target_frame_size += cpi->min_frame_bandwidth;
2402 /* Every other frame gets a few extra bits */
2403 if ( (cpi->frames_since_golden & 0x01) &&
2404 (cpi->frames_till_gf_update_due > 0) )
2405 {
2406 target_frame_size += cpi->twopass.alt_extra_bits;
2407 }
2409 /* Per frame bit target for this frame */
2410 cpi->per_frame_bandwidth = target_frame_size;
2411 }
2413 void vp8_second_pass(VP8_COMP *cpi)
2414 {
2415 int tmp_q;
2416 int frames_left = (int)(cpi->twopass.total_stats.count - cpi->common.current_video_frame);
2418 FIRSTPASS_STATS this_frame = {0};
2419 FIRSTPASS_STATS this_frame_copy;
2421 double this_frame_intra_error;
2422 double this_frame_coded_error;
2424 int overhead_bits;
2426 if (!cpi->twopass.stats_in)
2427 {
2428 return ;
2429 }
2431 vp8_clear_system_state();
2433 if (EOF == input_stats(cpi, &this_frame))
2434 return;
2436 this_frame_intra_error = this_frame.intra_error;
2437 this_frame_coded_error = this_frame.coded_error;
2439 /* keyframe and section processing ! */
2440 if (cpi->twopass.frames_to_key == 0)
2441 {
2442 /* Define next KF group and assign bits to it */
2443 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
2444 find_next_key_frame(cpi, &this_frame_copy);
2446 /* Special case: Error error_resilient_mode mode does not make much
2447 * sense for two pass but with its current meaning but this code is
2448 * designed to stop outlandish behaviour if someone does set it when
2449 * using two pass. It effectively disables GF groups. This is
2450 * temporary code till we decide what should really happen in this
2451 * case.
2452 */
2453 if (cpi->oxcf.error_resilient_mode)
2454 {
2455 cpi->twopass.gf_group_bits = cpi->twopass.kf_group_bits;
2456 cpi->twopass.gf_group_error_left =
2457 (int)cpi->twopass.kf_group_error_left;
2458 cpi->baseline_gf_interval = cpi->twopass.frames_to_key;
2459 cpi->frames_till_gf_update_due = cpi->baseline_gf_interval;
2460 cpi->source_alt_ref_pending = 0;
2461 }
2463 }
2465 /* Is this a GF / ARF (Note that a KF is always also a GF) */
2466 if (cpi->frames_till_gf_update_due == 0)
2467 {
2468 /* Define next gf group and assign bits to it */
2469 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
2470 define_gf_group(cpi, &this_frame_copy);
2472 /* If we are going to code an altref frame at the end of the group
2473 * and the current frame is not a key frame.... If the previous
2474 * group used an arf this frame has already benefited from that arf
2475 * boost and it should not be given extra bits If the previous
2476 * group was NOT coded using arf we may want to apply some boost to
2477 * this GF as well
2478 */
2479 if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME))
2480 {
2481 /* Assign a standard frames worth of bits from those allocated
2482 * to the GF group
2483 */
2484 int bak = cpi->per_frame_bandwidth;
2485 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
2486 assign_std_frame_bits(cpi, &this_frame_copy);
2487 cpi->per_frame_bandwidth = bak;
2488 }
2489 }
2491 /* Otherwise this is an ordinary frame */
2492 else
2493 {
2494 /* Special case: Error error_resilient_mode mode does not make much
2495 * sense for two pass but with its current meaning but this code is
2496 * designed to stop outlandish behaviour if someone does set it
2497 * when using two pass. It effectively disables GF groups. This is
2498 * temporary code till we decide what should really happen in this
2499 * case.
2500 */
2501 if (cpi->oxcf.error_resilient_mode)
2502 {
2503 cpi->frames_till_gf_update_due = cpi->twopass.frames_to_key;
2505 if (cpi->common.frame_type != KEY_FRAME)
2506 {
2507 /* Assign bits from those allocated to the GF group */
2508 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
2509 assign_std_frame_bits(cpi, &this_frame_copy);
2510 }
2511 }
2512 else
2513 {
2514 /* Assign bits from those allocated to the GF group */
2515 vpx_memcpy(&this_frame_copy, &this_frame, sizeof(this_frame));
2516 assign_std_frame_bits(cpi, &this_frame_copy);
2517 }
2518 }
2520 /* Keep a globally available copy of this and the next frame's iiratio. */
2521 cpi->twopass.this_iiratio = (unsigned int)(this_frame_intra_error /
2522 DOUBLE_DIVIDE_CHECK(this_frame_coded_error));
2523 {
2524 FIRSTPASS_STATS next_frame;
2525 if ( lookup_next_frame_stats(cpi, &next_frame) != EOF )
2526 {
2527 cpi->twopass.next_iiratio = (unsigned int)(next_frame.intra_error /
2528 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
2529 }
2530 }
2532 /* Set nominal per second bandwidth for this frame */
2533 cpi->target_bandwidth = (int)
2534 (cpi->per_frame_bandwidth * cpi->output_framerate);
2535 if (cpi->target_bandwidth < 0)
2536 cpi->target_bandwidth = 0;
2539 /* Account for mv, mode and other overheads. */
2540 overhead_bits = (int)estimate_modemvcost(
2541 cpi, &cpi->twopass.total_left_stats );
2543 /* Special case code for first frame. */
2544 if (cpi->common.current_video_frame == 0)
2545 {
2546 cpi->twopass.est_max_qcorrection_factor = 1.0;
2548 /* Set a cq_level in constrained quality mode. */
2549 if ( cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY )
2550 {
2551 int est_cq;
2553 est_cq =
2554 estimate_cq( cpi,
2555 &cpi->twopass.total_left_stats,
2556 (int)(cpi->twopass.bits_left / frames_left),
2557 overhead_bits );
2559 cpi->cq_target_quality = cpi->oxcf.cq_level;
2560 if ( est_cq > cpi->cq_target_quality )
2561 cpi->cq_target_quality = est_cq;
2562 }
2564 /* guess at maxq needed in 2nd pass */
2565 cpi->twopass.maxq_max_limit = cpi->worst_quality;
2566 cpi->twopass.maxq_min_limit = cpi->best_quality;
2568 tmp_q = estimate_max_q(
2569 cpi,
2570 &cpi->twopass.total_left_stats,
2571 (int)(cpi->twopass.bits_left / frames_left),
2572 overhead_bits );
2574 /* Limit the maxq value returned subsequently.
2575 * This increases the risk of overspend or underspend if the initial
2576 * estimate for the clip is bad, but helps prevent excessive
2577 * variation in Q, especially near the end of a clip
2578 * where for example a small overspend may cause Q to crash
2579 */
2580 cpi->twopass.maxq_max_limit = ((tmp_q + 32) < cpi->worst_quality)
2581 ? (tmp_q + 32) : cpi->worst_quality;
2582 cpi->twopass.maxq_min_limit = ((tmp_q - 32) > cpi->best_quality)
2583 ? (tmp_q - 32) : cpi->best_quality;
2585 cpi->active_worst_quality = tmp_q;
2586 cpi->ni_av_qi = tmp_q;
2587 }
2589 /* The last few frames of a clip almost always have to few or too many
2590 * bits and for the sake of over exact rate control we dont want to make
2591 * radical adjustments to the allowed quantizer range just to use up a
2592 * few surplus bits or get beneath the target rate.
2593 */
2594 else if ( (cpi->common.current_video_frame <
2595 (((unsigned int)cpi->twopass.total_stats.count * 255)>>8)) &&
2596 ((cpi->common.current_video_frame + cpi->baseline_gf_interval) <
2597 (unsigned int)cpi->twopass.total_stats.count) )
2598 {
2599 if (frames_left < 1)
2600 frames_left = 1;
2602 tmp_q = estimate_max_q(
2603 cpi,
2604 &cpi->twopass.total_left_stats,
2605 (int)(cpi->twopass.bits_left / frames_left),
2606 overhead_bits );
2608 /* Move active_worst_quality but in a damped way */
2609 if (tmp_q > cpi->active_worst_quality)
2610 cpi->active_worst_quality ++;
2611 else if (tmp_q < cpi->active_worst_quality)
2612 cpi->active_worst_quality --;
2614 cpi->active_worst_quality =
2615 ((cpi->active_worst_quality * 3) + tmp_q + 2) / 4;
2616 }
2618 cpi->twopass.frames_to_key --;
2620 /* Update the total stats remaining sturcture */
2621 subtract_stats(&cpi->twopass.total_left_stats, &this_frame );
2622 }
2625 static int test_candidate_kf(VP8_COMP *cpi, FIRSTPASS_STATS *last_frame, FIRSTPASS_STATS *this_frame, FIRSTPASS_STATS *next_frame)
2626 {
2627 int is_viable_kf = 0;
2629 /* Does the frame satisfy the primary criteria of a key frame
2630 * If so, then examine how well it predicts subsequent frames
2631 */
2632 if ((this_frame->pcnt_second_ref < 0.10) &&
2633 (next_frame->pcnt_second_ref < 0.10) &&
2634 ((this_frame->pcnt_inter < 0.05) ||
2635 (
2636 ((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .25) &&
2637 ((this_frame->intra_error / DOUBLE_DIVIDE_CHECK(this_frame->coded_error)) < 2.5) &&
2638 ((fabs(last_frame->coded_error - this_frame->coded_error) / DOUBLE_DIVIDE_CHECK(this_frame->coded_error) > .40) ||
2639 (fabs(last_frame->intra_error - this_frame->intra_error) / DOUBLE_DIVIDE_CHECK(this_frame->intra_error) > .40) ||
2640 ((next_frame->intra_error / DOUBLE_DIVIDE_CHECK(next_frame->coded_error)) > 3.5)
2641 )
2642 )
2643 )
2644 )
2645 {
2646 int i;
2647 FIRSTPASS_STATS *start_pos;
2649 FIRSTPASS_STATS local_next_frame;
2651 double boost_score = 0.0;
2652 double old_boost_score = 0.0;
2653 double decay_accumulator = 1.0;
2654 double next_iiratio;
2656 vpx_memcpy(&local_next_frame, next_frame, sizeof(*next_frame));
2658 /* Note the starting file position so we can reset to it */
2659 start_pos = cpi->twopass.stats_in;
2661 /* Examine how well the key frame predicts subsequent frames */
2662 for (i = 0 ; i < 16; i++)
2663 {
2664 next_iiratio = (IIKFACTOR1 * local_next_frame.intra_error / DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error)) ;
2666 if (next_iiratio > RMAX)
2667 next_iiratio = RMAX;
2669 /* Cumulative effect of decay in prediction quality */
2670 if (local_next_frame.pcnt_inter > 0.85)
2671 decay_accumulator = decay_accumulator * local_next_frame.pcnt_inter;
2672 else
2673 decay_accumulator = decay_accumulator * ((0.85 + local_next_frame.pcnt_inter) / 2.0);
2675 /* Keep a running total */
2676 boost_score += (decay_accumulator * next_iiratio);
2678 /* Test various breakout clauses */
2679 if ((local_next_frame.pcnt_inter < 0.05) ||
2680 (next_iiratio < 1.5) ||
2681 (((local_next_frame.pcnt_inter -
2682 local_next_frame.pcnt_neutral) < 0.20) &&
2683 (next_iiratio < 3.0)) ||
2684 ((boost_score - old_boost_score) < 0.5) ||
2685 (local_next_frame.intra_error < 200)
2686 )
2687 {
2688 break;
2689 }
2691 old_boost_score = boost_score;
2693 /* Get the next frame details */
2694 if (EOF == input_stats(cpi, &local_next_frame))
2695 break;
2696 }
2698 /* If there is tolerable prediction for at least the next 3 frames
2699 * then break out else discard this pottential key frame and move on
2700 */
2701 if (boost_score > 5.0 && (i > 3))
2702 is_viable_kf = 1;
2703 else
2704 {
2705 /* Reset the file position */
2706 reset_fpf_position(cpi, start_pos);
2708 is_viable_kf = 0;
2709 }
2710 }
2712 return is_viable_kf;
2713 }
2714 static void find_next_key_frame(VP8_COMP *cpi, FIRSTPASS_STATS *this_frame)
2715 {
2716 int i,j;
2717 FIRSTPASS_STATS last_frame;
2718 FIRSTPASS_STATS first_frame;
2719 FIRSTPASS_STATS next_frame;
2720 FIRSTPASS_STATS *start_position;
2722 double decay_accumulator = 1.0;
2723 double boost_score = 0;
2724 double old_boost_score = 0.0;
2725 double loop_decay_rate;
2727 double kf_mod_err = 0.0;
2728 double kf_group_err = 0.0;
2729 double kf_group_intra_err = 0.0;
2730 double kf_group_coded_err = 0.0;
2731 double recent_loop_decay[8] = {1.0,1.0,1.0,1.0,1.0,1.0,1.0,1.0};
2733 vpx_memset(&next_frame, 0, sizeof(next_frame));
2735 vp8_clear_system_state();
2736 start_position = cpi->twopass.stats_in;
2738 cpi->common.frame_type = KEY_FRAME;
2740 /* is this a forced key frame by interval */
2741 cpi->this_key_frame_forced = cpi->next_key_frame_forced;
2743 /* Clear the alt ref active flag as this can never be active on a key
2744 * frame
2745 */
2746 cpi->source_alt_ref_active = 0;
2748 /* Kf is always a gf so clear frames till next gf counter */
2749 cpi->frames_till_gf_update_due = 0;
2751 cpi->twopass.frames_to_key = 1;
2753 /* Take a copy of the initial frame details */
2754 vpx_memcpy(&first_frame, this_frame, sizeof(*this_frame));
2756 cpi->twopass.kf_group_bits = 0;
2757 cpi->twopass.kf_group_error_left = 0;
2759 kf_mod_err = calculate_modified_err(cpi, this_frame);
2761 /* find the next keyframe */
2762 i = 0;
2763 while (cpi->twopass.stats_in < cpi->twopass.stats_in_end)
2764 {
2765 /* Accumulate kf group error */
2766 kf_group_err += calculate_modified_err(cpi, this_frame);
2768 /* These figures keep intra and coded error counts for all frames
2769 * including key frames in the group. The effect of the key frame
2770 * itself can be subtracted out using the first_frame data
2771 * collected above
2772 */
2773 kf_group_intra_err += this_frame->intra_error;
2774 kf_group_coded_err += this_frame->coded_error;
2776 /* load a the next frame's stats */
2777 vpx_memcpy(&last_frame, this_frame, sizeof(*this_frame));
2778 input_stats(cpi, this_frame);
2780 /* Provided that we are not at the end of the file... */
2781 if (cpi->oxcf.auto_key
2782 && lookup_next_frame_stats(cpi, &next_frame) != EOF)
2783 {
2784 /* Normal scene cut check */
2785 if ( ( i >= MIN_GF_INTERVAL ) &&
2786 test_candidate_kf(cpi, &last_frame, this_frame, &next_frame) )
2787 {
2788 break;
2789 }
2791 /* How fast is prediction quality decaying */
2792 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
2794 /* We want to know something about the recent past... rather than
2795 * as used elsewhere where we are concened with decay in prediction
2796 * quality since the last GF or KF.
2797 */
2798 recent_loop_decay[i%8] = loop_decay_rate;
2799 decay_accumulator = 1.0;
2800 for (j = 0; j < 8; j++)
2801 {
2802 decay_accumulator = decay_accumulator * recent_loop_decay[j];
2803 }
2805 /* Special check for transition or high motion followed by a
2806 * static scene.
2807 */
2808 if ( detect_transition_to_still( cpi, i,
2809 (cpi->key_frame_frequency-i),
2810 loop_decay_rate,
2811 decay_accumulator ) )
2812 {
2813 break;
2814 }
2817 /* Step on to the next frame */
2818 cpi->twopass.frames_to_key ++;
2820 /* If we don't have a real key frame within the next two
2821 * forcekeyframeevery intervals then break out of the loop.
2822 */
2823 if (cpi->twopass.frames_to_key >= 2 *(int)cpi->key_frame_frequency)
2824 break;
2825 } else
2826 cpi->twopass.frames_to_key ++;
2828 i++;
2829 }
2831 /* If there is a max kf interval set by the user we must obey it.
2832 * We already breakout of the loop above at 2x max.
2833 * This code centers the extra kf if the actual natural
2834 * interval is between 1x and 2x
2835 */
2836 if (cpi->oxcf.auto_key
2837 && cpi->twopass.frames_to_key > (int)cpi->key_frame_frequency )
2838 {
2839 FIRSTPASS_STATS *current_pos = cpi->twopass.stats_in;
2840 FIRSTPASS_STATS tmp_frame;
2842 cpi->twopass.frames_to_key /= 2;
2844 /* Copy first frame details */
2845 vpx_memcpy(&tmp_frame, &first_frame, sizeof(first_frame));
2847 /* Reset to the start of the group */
2848 reset_fpf_position(cpi, start_position);
2850 kf_group_err = 0;
2851 kf_group_intra_err = 0;
2852 kf_group_coded_err = 0;
2854 /* Rescan to get the correct error data for the forced kf group */
2855 for( i = 0; i < cpi->twopass.frames_to_key; i++ )
2856 {
2857 /* Accumulate kf group errors */
2858 kf_group_err += calculate_modified_err(cpi, &tmp_frame);
2859 kf_group_intra_err += tmp_frame.intra_error;
2860 kf_group_coded_err += tmp_frame.coded_error;
2862 /* Load a the next frame's stats */
2863 input_stats(cpi, &tmp_frame);
2864 }
2866 /* Reset to the start of the group */
2867 reset_fpf_position(cpi, current_pos);
2869 cpi->next_key_frame_forced = 1;
2870 }
2871 else
2872 cpi->next_key_frame_forced = 0;
2874 /* Special case for the last frame of the file */
2875 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
2876 {
2877 /* Accumulate kf group error */
2878 kf_group_err += calculate_modified_err(cpi, this_frame);
2880 /* These figures keep intra and coded error counts for all frames
2881 * including key frames in the group. The effect of the key frame
2882 * itself can be subtracted out using the first_frame data
2883 * collected above
2884 */
2885 kf_group_intra_err += this_frame->intra_error;
2886 kf_group_coded_err += this_frame->coded_error;
2887 }
2889 /* Calculate the number of bits that should be assigned to the kf group. */
2890 if ((cpi->twopass.bits_left > 0) && (cpi->twopass.modified_error_left > 0.0))
2891 {
2892 /* Max for a single normal frame (not key frame) */
2893 int max_bits = frame_max_bits(cpi);
2895 /* Maximum bits for the kf group */
2896 int64_t max_grp_bits;
2898 /* Default allocation based on bits left and relative
2899 * complexity of the section
2900 */
2901 cpi->twopass.kf_group_bits = (int64_t)( cpi->twopass.bits_left *
2902 ( kf_group_err /
2903 cpi->twopass.modified_error_left ));
2905 /* Clip based on maximum per frame rate defined by the user. */
2906 max_grp_bits = (int64_t)max_bits * (int64_t)cpi->twopass.frames_to_key;
2907 if (cpi->twopass.kf_group_bits > max_grp_bits)
2908 cpi->twopass.kf_group_bits = max_grp_bits;
2910 /* Additional special case for CBR if buffer is getting full. */
2911 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
2912 {
2913 int64_t opt_buffer_lvl = cpi->oxcf.optimal_buffer_level;
2914 int64_t buffer_lvl = cpi->buffer_level;
2916 /* If the buffer is near or above the optimal and this kf group is
2917 * not being allocated much then increase the allocation a bit.
2918 */
2919 if (buffer_lvl >= opt_buffer_lvl)
2920 {
2921 int64_t high_water_mark = (opt_buffer_lvl +
2922 cpi->oxcf.maximum_buffer_size) >> 1;
2924 int64_t av_group_bits;
2926 /* Av bits per frame * number of frames */
2927 av_group_bits = (int64_t)cpi->av_per_frame_bandwidth *
2928 (int64_t)cpi->twopass.frames_to_key;
2930 /* We are at or above the maximum. */
2931 if (cpi->buffer_level >= high_water_mark)
2932 {
2933 int64_t min_group_bits;
2935 min_group_bits = av_group_bits +
2936 (int64_t)(buffer_lvl -
2937 high_water_mark);
2939 if (cpi->twopass.kf_group_bits < min_group_bits)
2940 cpi->twopass.kf_group_bits = min_group_bits;
2941 }
2942 /* We are above optimal but below the maximum */
2943 else if (cpi->twopass.kf_group_bits < av_group_bits)
2944 {
2945 int64_t bits_below_av = av_group_bits -
2946 cpi->twopass.kf_group_bits;
2948 cpi->twopass.kf_group_bits +=
2949 (int64_t)((double)bits_below_av *
2950 (double)(buffer_lvl - opt_buffer_lvl) /
2951 (double)(high_water_mark - opt_buffer_lvl));
2952 }
2953 }
2954 }
2955 }
2956 else
2957 cpi->twopass.kf_group_bits = 0;
2959 /* Reset the first pass file position */
2960 reset_fpf_position(cpi, start_position);
2962 /* determine how big to make this keyframe based on how well the
2963 * subsequent frames use inter blocks
2964 */
2965 decay_accumulator = 1.0;
2966 boost_score = 0.0;
2967 loop_decay_rate = 1.00; /* Starting decay rate */
2969 for (i = 0 ; i < cpi->twopass.frames_to_key ; i++)
2970 {
2971 double r;
2973 if (EOF == input_stats(cpi, &next_frame))
2974 break;
2976 if (next_frame.intra_error > cpi->twopass.kf_intra_err_min)
2977 r = (IIKFACTOR2 * next_frame.intra_error /
2978 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
2979 else
2980 r = (IIKFACTOR2 * cpi->twopass.kf_intra_err_min /
2981 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
2983 if (r > RMAX)
2984 r = RMAX;
2986 /* How fast is prediction quality decaying */
2987 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
2989 decay_accumulator = decay_accumulator * loop_decay_rate;
2990 decay_accumulator = decay_accumulator < 0.1 ? 0.1 : decay_accumulator;
2992 boost_score += (decay_accumulator * r);
2994 if ((i > MIN_GF_INTERVAL) &&
2995 ((boost_score - old_boost_score) < 1.0))
2996 {
2997 break;
2998 }
3000 old_boost_score = boost_score;
3001 }
3003 if (1)
3004 {
3005 FIRSTPASS_STATS sectionstats;
3006 double Ratio;
3008 zero_stats(§ionstats);
3009 reset_fpf_position(cpi, start_position);
3011 for (i = 0 ; i < cpi->twopass.frames_to_key ; i++)
3012 {
3013 input_stats(cpi, &next_frame);
3014 accumulate_stats(§ionstats, &next_frame);
3015 }
3017 avg_stats(§ionstats);
3019 cpi->twopass.section_intra_rating = (unsigned int)
3020 (sectionstats.intra_error
3021 / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
3023 Ratio = sectionstats.intra_error / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error);
3024 cpi->twopass.section_max_qfactor = 1.0 - ((Ratio - 10.0) * 0.025);
3026 if (cpi->twopass.section_max_qfactor < 0.80)
3027 cpi->twopass.section_max_qfactor = 0.80;
3028 }
3030 /* When using CBR apply additional buffer fullness related upper limits */
3031 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3032 {
3033 double max_boost;
3035 if (cpi->drop_frames_allowed)
3036 {
3037 int df_buffer_level = (int)(cpi->oxcf.drop_frames_water_mark
3038 * (cpi->oxcf.optimal_buffer_level / 100));
3040 if (cpi->buffer_level > df_buffer_level)
3041 max_boost = ((double)((cpi->buffer_level - df_buffer_level) * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
3042 else
3043 max_boost = 0.0;
3044 }
3045 else if (cpi->buffer_level > 0)
3046 {
3047 max_boost = ((double)(cpi->buffer_level * 2 / 3) * 16.0) / DOUBLE_DIVIDE_CHECK((double)cpi->av_per_frame_bandwidth);
3048 }
3049 else
3050 {
3051 max_boost = 0.0;
3052 }
3054 if (boost_score > max_boost)
3055 boost_score = max_boost;
3056 }
3058 /* Reset the first pass file position */
3059 reset_fpf_position(cpi, start_position);
3061 /* Work out how many bits to allocate for the key frame itself */
3062 if (1)
3063 {
3064 int kf_boost = (int)boost_score;
3065 int allocation_chunks;
3066 int Counter = cpi->twopass.frames_to_key;
3067 int alt_kf_bits;
3068 YV12_BUFFER_CONFIG *lst_yv12 = &cpi->common.yv12_fb[cpi->common.lst_fb_idx];
3069 /* Min boost based on kf interval */
3070 #if 0
3072 while ((kf_boost < 48) && (Counter > 0))
3073 {
3074 Counter -= 2;
3075 kf_boost ++;
3076 }
3078 #endif
3080 if (kf_boost < 48)
3081 {
3082 kf_boost += ((Counter + 1) >> 1);
3084 if (kf_boost > 48) kf_boost = 48;
3085 }
3087 /* bigger frame sizes need larger kf boosts, smaller frames smaller
3088 * boosts...
3089 */
3090 if ((lst_yv12->y_width * lst_yv12->y_height) > (320 * 240))
3091 kf_boost += 2 * (lst_yv12->y_width * lst_yv12->y_height) / (320 * 240);
3092 else if ((lst_yv12->y_width * lst_yv12->y_height) < (320 * 240))
3093 kf_boost -= 4 * (320 * 240) / (lst_yv12->y_width * lst_yv12->y_height);
3095 /* Min KF boost */
3096 kf_boost = (int)((double)kf_boost * 100.0) >> 4; /* Scale 16 to 100 */
3097 if (kf_boost < 250)
3098 kf_boost = 250;
3100 /*
3101 * We do three calculations for kf size.
3102 * The first is based on the error score for the whole kf group.
3103 * The second (optionaly) on the key frames own error if this is
3104 * smaller than the average for the group.
3105 * The final one insures that the frame receives at least the
3106 * allocation it would have received based on its own error score vs
3107 * the error score remaining
3108 * Special case if the sequence appears almost totaly static
3109 * as measured by the decay accumulator. In this case we want to
3110 * spend almost all of the bits on the key frame.
3111 * cpi->twopass.frames_to_key-1 because key frame itself is taken
3112 * care of by kf_boost.
3113 */
3114 if ( decay_accumulator >= 0.99 )
3115 {
3116 allocation_chunks =
3117 ((cpi->twopass.frames_to_key - 1) * 10) + kf_boost;
3118 }
3119 else
3120 {
3121 allocation_chunks =
3122 ((cpi->twopass.frames_to_key - 1) * 100) + kf_boost;
3123 }
3125 /* Normalize Altboost and allocations chunck down to prevent overflow */
3126 while (kf_boost > 1000)
3127 {
3128 kf_boost /= 2;
3129 allocation_chunks /= 2;
3130 }
3132 cpi->twopass.kf_group_bits = (cpi->twopass.kf_group_bits < 0) ? 0 : cpi->twopass.kf_group_bits;
3134 /* Calculate the number of bits to be spent on the key frame */
3135 cpi->twopass.kf_bits = (int)((double)kf_boost * ((double)cpi->twopass.kf_group_bits / (double)allocation_chunks));
3137 /* Apply an additional limit for CBR */
3138 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3139 {
3140 if (cpi->twopass.kf_bits > (int)((3 * cpi->buffer_level) >> 2))
3141 cpi->twopass.kf_bits = (int)((3 * cpi->buffer_level) >> 2);
3142 }
3144 /* If the key frame is actually easier than the average for the
3145 * kf group (which does sometimes happen... eg a blank intro frame)
3146 * Then use an alternate calculation based on the kf error score
3147 * which should give a smaller key frame.
3148 */
3149 if (kf_mod_err < kf_group_err / cpi->twopass.frames_to_key)
3150 {
3151 double alt_kf_grp_bits =
3152 ((double)cpi->twopass.bits_left *
3153 (kf_mod_err * (double)cpi->twopass.frames_to_key) /
3154 DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left));
3156 alt_kf_bits = (int)((double)kf_boost *
3157 (alt_kf_grp_bits / (double)allocation_chunks));
3159 if (cpi->twopass.kf_bits > alt_kf_bits)
3160 {
3161 cpi->twopass.kf_bits = alt_kf_bits;
3162 }
3163 }
3164 /* Else if it is much harder than other frames in the group make sure
3165 * it at least receives an allocation in keeping with its relative
3166 * error score
3167 */
3168 else
3169 {
3170 alt_kf_bits =
3171 (int)((double)cpi->twopass.bits_left *
3172 (kf_mod_err /
3173 DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left)));
3175 if (alt_kf_bits > cpi->twopass.kf_bits)
3176 {
3177 cpi->twopass.kf_bits = alt_kf_bits;
3178 }
3179 }
3181 cpi->twopass.kf_group_bits -= cpi->twopass.kf_bits;
3182 /* Add in the minimum frame allowance */
3183 cpi->twopass.kf_bits += cpi->min_frame_bandwidth;
3185 /* Peer frame bit target for this frame */
3186 cpi->per_frame_bandwidth = cpi->twopass.kf_bits;
3188 /* Convert to a per second bitrate */
3189 cpi->target_bandwidth = (int)(cpi->twopass.kf_bits *
3190 cpi->output_framerate);
3191 }
3193 /* Note the total error score of the kf group minus the key frame itself */
3194 cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err);
3196 /* Adjust the count of total modified error left. The count of bits left
3197 * is adjusted elsewhere based on real coded frame sizes
3198 */
3199 cpi->twopass.modified_error_left -= kf_group_err;
3201 if (cpi->oxcf.allow_spatial_resampling)
3202 {
3203 int resample_trigger = 0;
3204 int last_kf_resampled = 0;
3205 int kf_q;
3206 int scale_val = 0;
3207 int hr, hs, vr, vs;
3208 int new_width = cpi->oxcf.Width;
3209 int new_height = cpi->oxcf.Height;
3211 int projected_buffer_level = (int)cpi->buffer_level;
3212 int tmp_q;
3214 double projected_bits_perframe;
3215 double group_iiratio = (kf_group_intra_err - first_frame.intra_error) / (kf_group_coded_err - first_frame.coded_error);
3216 double err_per_frame = kf_group_err / cpi->twopass.frames_to_key;
3217 double bits_per_frame;
3218 double av_bits_per_frame;
3219 double effective_size_ratio;
3221 if ((cpi->common.Width != cpi->oxcf.Width) || (cpi->common.Height != cpi->oxcf.Height))
3222 last_kf_resampled = 1;
3224 /* Set back to unscaled by defaults */
3225 cpi->common.horiz_scale = NORMAL;
3226 cpi->common.vert_scale = NORMAL;
3228 /* Calculate Average bits per frame. */
3229 av_bits_per_frame = cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate);
3231 /* CBR... Use the clip average as the target for deciding resample */
3232 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3233 {
3234 bits_per_frame = av_bits_per_frame;
3235 }
3237 /* In VBR we want to avoid downsampling in easy section unless we
3238 * are under extreme pressure So use the larger of target bitrate
3239 * for this section or average bitrate for sequence
3240 */
3241 else
3242 {
3243 /* This accounts for how hard the section is... */
3244 bits_per_frame = (double)
3245 (cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key);
3247 /* Dont turn to resampling in easy sections just because they
3248 * have been assigned a small number of bits
3249 */
3250 if (bits_per_frame < av_bits_per_frame)
3251 bits_per_frame = av_bits_per_frame;
3252 }
3254 /* bits_per_frame should comply with our minimum */
3255 if (bits_per_frame < (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100))
3256 bits_per_frame = (cpi->oxcf.target_bandwidth * cpi->oxcf.two_pass_vbrmin_section / 100);
3258 /* Work out if spatial resampling is necessary */
3259 kf_q = estimate_kf_group_q(cpi, err_per_frame,
3260 (int)bits_per_frame, group_iiratio);
3262 /* If we project a required Q higher than the maximum allowed Q then
3263 * make a guess at the actual size of frames in this section
3264 */
3265 projected_bits_perframe = bits_per_frame;
3266 tmp_q = kf_q;
3268 while (tmp_q > cpi->worst_quality)
3269 {
3270 projected_bits_perframe *= 1.04;
3271 tmp_q--;
3272 }
3274 /* Guess at buffer level at the end of the section */
3275 projected_buffer_level = (int)
3276 (cpi->buffer_level - (int)
3277 ((projected_bits_perframe - av_bits_per_frame) *
3278 cpi->twopass.frames_to_key));
3280 if (0)
3281 {
3282 FILE *f = fopen("Subsamle.stt", "a");
3283 fprintf(f, " %8d %8d %8d %8d %12.0f %8d %8d %8d\n", cpi->common.current_video_frame, kf_q, cpi->common.horiz_scale, cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key, (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key), new_height, new_width);
3284 fclose(f);
3285 }
3287 /* The trigger for spatial resampling depends on the various
3288 * parameters such as whether we are streaming (CBR) or VBR.
3289 */
3290 if (cpi->oxcf.end_usage == USAGE_STREAM_FROM_SERVER)
3291 {
3292 /* Trigger resample if we are projected to fall below down
3293 * sample level or resampled last time and are projected to
3294 * remain below the up sample level
3295 */
3296 if ((projected_buffer_level < (cpi->oxcf.resample_down_water_mark * cpi->oxcf.optimal_buffer_level / 100)) ||
3297 (last_kf_resampled && (projected_buffer_level < (cpi->oxcf.resample_up_water_mark * cpi->oxcf.optimal_buffer_level / 100))))
3298 resample_trigger = 1;
3299 else
3300 resample_trigger = 0;
3301 }
3302 else
3303 {
3304 int64_t clip_bits = (int64_t)(cpi->twopass.total_stats.count * cpi->oxcf.target_bandwidth / DOUBLE_DIVIDE_CHECK((double)cpi->framerate));
3305 int64_t over_spend = cpi->oxcf.starting_buffer_level - cpi->buffer_level;
3307 /* If triggered last time the threshold for triggering again is
3308 * reduced:
3309 *
3310 * Projected Q higher than allowed and Overspend > 5% of total
3311 * bits
3312 */
3313 if ((last_kf_resampled && (kf_q > cpi->worst_quality)) ||
3314 ((kf_q > cpi->worst_quality) &&
3315 (over_spend > clip_bits / 20)))
3316 resample_trigger = 1;
3317 else
3318 resample_trigger = 0;
3320 }
3322 if (resample_trigger)
3323 {
3324 while ((kf_q >= cpi->worst_quality) && (scale_val < 6))
3325 {
3326 scale_val ++;
3328 cpi->common.vert_scale = vscale_lookup[scale_val];
3329 cpi->common.horiz_scale = hscale_lookup[scale_val];
3331 Scale2Ratio(cpi->common.horiz_scale, &hr, &hs);
3332 Scale2Ratio(cpi->common.vert_scale, &vr, &vs);
3334 new_width = ((hs - 1) + (cpi->oxcf.Width * hr)) / hs;
3335 new_height = ((vs - 1) + (cpi->oxcf.Height * vr)) / vs;
3337 /* Reducing the area to 1/4 does not reduce the complexity
3338 * (err_per_frame) to 1/4... effective_sizeratio attempts
3339 * to provide a crude correction for this
3340 */
3341 effective_size_ratio = (double)(new_width * new_height) / (double)(cpi->oxcf.Width * cpi->oxcf.Height);
3342 effective_size_ratio = (1.0 + (3.0 * effective_size_ratio)) / 4.0;
3344 /* Now try again and see what Q we get with the smaller
3345 * image size
3346 */
3347 kf_q = estimate_kf_group_q(cpi,
3348 err_per_frame * effective_size_ratio,
3349 (int)bits_per_frame, group_iiratio);
3351 if (0)
3352 {
3353 FILE *f = fopen("Subsamle.stt", "a");
3354 fprintf(f, "******** %8d %8d %8d %12.0f %8d %8d %8d\n", kf_q, cpi->common.horiz_scale, cpi->common.vert_scale, kf_group_err / cpi->twopass.frames_to_key, (int)(cpi->twopass.kf_group_bits / cpi->twopass.frames_to_key), new_height, new_width);
3355 fclose(f);
3356 }
3357 }
3358 }
3360 if ((cpi->common.Width != new_width) || (cpi->common.Height != new_height))
3361 {
3362 cpi->common.Width = new_width;
3363 cpi->common.Height = new_height;
3364 vp8_alloc_compressor_data(cpi);
3365 }
3366 }
3367 }