media/libvpx/vp9/encoder/vp9_firstpass.c

changeset 0
6474c204b198
equal deleted inserted replaced
-1:000000000000 0:cf802a3fd841
1 /*
2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <math.h>
12 #include <limits.h>
13 #include <stdio.h>
14 #include "vp9/encoder/vp9_block.h"
15 #include "vp9/encoder/vp9_onyx_int.h"
16 #include "vp9/encoder/vp9_variance.h"
17 #include "vp9/encoder/vp9_encodeintra.h"
18 #include "vp9/encoder/vp9_mcomp.h"
19 #include "vp9/encoder/vp9_firstpass.h"
20 #include "vpx_scale/vpx_scale.h"
21 #include "vp9/encoder/vp9_encodeframe.h"
22 #include "vp9/encoder/vp9_encodemb.h"
23 #include "vp9/common/vp9_extend.h"
24 #include "vp9/common/vp9_systemdependent.h"
25 #include "vpx_mem/vpx_mem.h"
26 #include "vpx_scale/yv12config.h"
27 #include "vp9/encoder/vp9_quantize.h"
28 #include "vp9/encoder/vp9_rdopt.h"
29 #include "vp9/encoder/vp9_ratectrl.h"
30 #include "vp9/common/vp9_quant_common.h"
31 #include "vp9/common/vp9_entropymv.h"
32 #include "vp9/encoder/vp9_encodemv.h"
33 #include "vp9/encoder/vp9_vaq.h"
34 #include "./vpx_scale_rtcd.h"
35 // TODO(jkoleszar): for setup_dst_planes
36 #include "vp9/common/vp9_reconinter.h"
37
38 #define OUTPUT_FPF 0
39
40 #define IIFACTOR 12.5
41 #define IIKFACTOR1 12.5
42 #define IIKFACTOR2 15.0
43 #define RMAX 512.0
44 #define GF_RMAX 96.0
45 #define ERR_DIVISOR 150.0
46 #define MIN_DECAY_FACTOR 0.1
47
48 #define KF_MB_INTRA_MIN 150
49 #define GF_MB_INTRA_MIN 100
50
51 #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001)
52
53 #define POW1 (double)cpi->oxcf.two_pass_vbrbias/100.0
54 #define POW2 (double)cpi->oxcf.two_pass_vbrbias/100.0
55
56 static void swap_yv12(YV12_BUFFER_CONFIG *a, YV12_BUFFER_CONFIG *b) {
57 YV12_BUFFER_CONFIG temp = *a;
58 *a = *b;
59 *b = temp;
60 }
61
62 static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame);
63
64 static int select_cq_level(int qindex) {
65 int ret_val = QINDEX_RANGE - 1;
66 int i;
67
68 double target_q = (vp9_convert_qindex_to_q(qindex) * 0.5847) + 1.0;
69
70 for (i = 0; i < QINDEX_RANGE; i++) {
71 if (target_q <= vp9_convert_qindex_to_q(i)) {
72 ret_val = i;
73 break;
74 }
75 }
76
77 return ret_val;
78 }
79
80
81 // Resets the first pass file to the given position using a relative seek from
82 // the current position.
83 static void reset_fpf_position(VP9_COMP *cpi, FIRSTPASS_STATS *position) {
84 cpi->twopass.stats_in = position;
85 }
86
87 static int lookup_next_frame_stats(VP9_COMP *cpi, FIRSTPASS_STATS *next_frame) {
88 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
89 return EOF;
90
91 *next_frame = *cpi->twopass.stats_in;
92 return 1;
93 }
94
95 // Read frame stats at an offset from the current position
96 static int read_frame_stats(VP9_COMP *cpi,
97 FIRSTPASS_STATS *frame_stats,
98 int offset) {
99 FIRSTPASS_STATS *fps_ptr = cpi->twopass.stats_in;
100
101 // Check legality of offset
102 if (offset >= 0) {
103 if (&fps_ptr[offset] >= cpi->twopass.stats_in_end)
104 return EOF;
105 } else if (offset < 0) {
106 if (&fps_ptr[offset] < cpi->twopass.stats_in_start)
107 return EOF;
108 }
109
110 *frame_stats = fps_ptr[offset];
111 return 1;
112 }
113
114 static int input_stats(VP9_COMP *cpi, FIRSTPASS_STATS *fps) {
115 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end)
116 return EOF;
117
118 *fps = *cpi->twopass.stats_in;
119 cpi->twopass.stats_in =
120 (void *)((char *)cpi->twopass.stats_in + sizeof(FIRSTPASS_STATS));
121 return 1;
122 }
123
124 static void output_stats(const VP9_COMP *cpi,
125 struct vpx_codec_pkt_list *pktlist,
126 FIRSTPASS_STATS *stats) {
127 struct vpx_codec_cx_pkt pkt;
128 pkt.kind = VPX_CODEC_STATS_PKT;
129 pkt.data.twopass_stats.buf = stats;
130 pkt.data.twopass_stats.sz = sizeof(FIRSTPASS_STATS);
131 vpx_codec_pkt_list_add(pktlist, &pkt);
132
133 // TEMP debug code
134 #if OUTPUT_FPF
135
136 {
137 FILE *fpfile;
138 fpfile = fopen("firstpass.stt", "a");
139
140 fprintf(stdout, "%12.0f %12.0f %12.0f %12.0f %12.0f %12.4f %12.4f"
141 "%12.4f %12.4f %12.4f %12.4f %12.4f %12.4f %12.4f"
142 "%12.0f %12.0f %12.4f %12.0f %12.0f %12.4f\n",
143 stats->frame,
144 stats->intra_error,
145 stats->coded_error,
146 stats->sr_coded_error,
147 stats->ssim_weighted_pred_err,
148 stats->pcnt_inter,
149 stats->pcnt_motion,
150 stats->pcnt_second_ref,
151 stats->pcnt_neutral,
152 stats->MVr,
153 stats->mvr_abs,
154 stats->MVc,
155 stats->mvc_abs,
156 stats->MVrv,
157 stats->MVcv,
158 stats->mv_in_out_count,
159 stats->new_mv_count,
160 stats->count,
161 stats->duration);
162 fclose(fpfile);
163 }
164 #endif
165 }
166
167 static void zero_stats(FIRSTPASS_STATS *section) {
168 section->frame = 0.0;
169 section->intra_error = 0.0;
170 section->coded_error = 0.0;
171 section->sr_coded_error = 0.0;
172 section->ssim_weighted_pred_err = 0.0;
173 section->pcnt_inter = 0.0;
174 section->pcnt_motion = 0.0;
175 section->pcnt_second_ref = 0.0;
176 section->pcnt_neutral = 0.0;
177 section->MVr = 0.0;
178 section->mvr_abs = 0.0;
179 section->MVc = 0.0;
180 section->mvc_abs = 0.0;
181 section->MVrv = 0.0;
182 section->MVcv = 0.0;
183 section->mv_in_out_count = 0.0;
184 section->new_mv_count = 0.0;
185 section->count = 0.0;
186 section->duration = 1.0;
187 }
188
189 static void accumulate_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) {
190 section->frame += frame->frame;
191 section->intra_error += frame->intra_error;
192 section->coded_error += frame->coded_error;
193 section->sr_coded_error += frame->sr_coded_error;
194 section->ssim_weighted_pred_err += frame->ssim_weighted_pred_err;
195 section->pcnt_inter += frame->pcnt_inter;
196 section->pcnt_motion += frame->pcnt_motion;
197 section->pcnt_second_ref += frame->pcnt_second_ref;
198 section->pcnt_neutral += frame->pcnt_neutral;
199 section->MVr += frame->MVr;
200 section->mvr_abs += frame->mvr_abs;
201 section->MVc += frame->MVc;
202 section->mvc_abs += frame->mvc_abs;
203 section->MVrv += frame->MVrv;
204 section->MVcv += frame->MVcv;
205 section->mv_in_out_count += frame->mv_in_out_count;
206 section->new_mv_count += frame->new_mv_count;
207 section->count += frame->count;
208 section->duration += frame->duration;
209 }
210
211 static void subtract_stats(FIRSTPASS_STATS *section, FIRSTPASS_STATS *frame) {
212 section->frame -= frame->frame;
213 section->intra_error -= frame->intra_error;
214 section->coded_error -= frame->coded_error;
215 section->sr_coded_error -= frame->sr_coded_error;
216 section->ssim_weighted_pred_err -= frame->ssim_weighted_pred_err;
217 section->pcnt_inter -= frame->pcnt_inter;
218 section->pcnt_motion -= frame->pcnt_motion;
219 section->pcnt_second_ref -= frame->pcnt_second_ref;
220 section->pcnt_neutral -= frame->pcnt_neutral;
221 section->MVr -= frame->MVr;
222 section->mvr_abs -= frame->mvr_abs;
223 section->MVc -= frame->MVc;
224 section->mvc_abs -= frame->mvc_abs;
225 section->MVrv -= frame->MVrv;
226 section->MVcv -= frame->MVcv;
227 section->mv_in_out_count -= frame->mv_in_out_count;
228 section->new_mv_count -= frame->new_mv_count;
229 section->count -= frame->count;
230 section->duration -= frame->duration;
231 }
232
233 static void avg_stats(FIRSTPASS_STATS *section) {
234 if (section->count < 1.0)
235 return;
236
237 section->intra_error /= section->count;
238 section->coded_error /= section->count;
239 section->sr_coded_error /= section->count;
240 section->ssim_weighted_pred_err /= section->count;
241 section->pcnt_inter /= section->count;
242 section->pcnt_second_ref /= section->count;
243 section->pcnt_neutral /= section->count;
244 section->pcnt_motion /= section->count;
245 section->MVr /= section->count;
246 section->mvr_abs /= section->count;
247 section->MVc /= section->count;
248 section->mvc_abs /= section->count;
249 section->MVrv /= section->count;
250 section->MVcv /= section->count;
251 section->mv_in_out_count /= section->count;
252 section->duration /= section->count;
253 }
254
255 // Calculate a modified Error used in distributing bits between easier and
256 // harder frames.
257 static double calculate_modified_err(VP9_COMP *cpi,
258 FIRSTPASS_STATS *this_frame) {
259 const FIRSTPASS_STATS *const stats = &cpi->twopass.total_stats;
260 const double av_err = stats->ssim_weighted_pred_err / stats->count;
261 const double this_err = this_frame->ssim_weighted_pred_err;
262 return av_err * pow(this_err / DOUBLE_DIVIDE_CHECK(av_err),
263 this_err > av_err ? POW1 : POW2);
264 }
265
266 static const double weight_table[256] = {
267 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
268 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
269 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
270 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.020000,
271 0.020000, 0.020000, 0.020000, 0.020000, 0.020000, 0.031250, 0.062500,
272 0.093750, 0.125000, 0.156250, 0.187500, 0.218750, 0.250000, 0.281250,
273 0.312500, 0.343750, 0.375000, 0.406250, 0.437500, 0.468750, 0.500000,
274 0.531250, 0.562500, 0.593750, 0.625000, 0.656250, 0.687500, 0.718750,
275 0.750000, 0.781250, 0.812500, 0.843750, 0.875000, 0.906250, 0.937500,
276 0.968750, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
277 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
278 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
279 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
280 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
281 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
282 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
283 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
284 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
285 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
286 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
287 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
288 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,
290 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,
292 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,
294 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,
296 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,
298 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,
300 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,
302 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000,
303 1.000000, 1.000000, 1.000000, 1.000000
304 };
305
306 static double simple_weight(YV12_BUFFER_CONFIG *source) {
307 int i, j;
308
309 uint8_t *src = source->y_buffer;
310 double sum_weights = 0.0;
311
312 // Loop through the Y plane examining levels and creating a weight for
313 // the image.
314 i = source->y_height;
315 do {
316 j = source->y_width;
317 do {
318 sum_weights += weight_table[ *src];
319 src++;
320 } while (--j);
321 src -= source->y_width;
322 src += source->y_stride;
323 } while (--i);
324
325 sum_weights /= (source->y_height * source->y_width);
326
327 return sum_weights;
328 }
329
330
331 // This function returns the current per frame maximum bitrate target.
332 static int frame_max_bits(VP9_COMP *cpi) {
333 // Max allocation for a single frame based on the max section guidelines
334 // passed in and how many bits are left.
335 // For VBR base this on the bits and frames left plus the
336 // two_pass_vbrmax_section rate passed in by the user.
337 const double max_bits = (1.0 * cpi->twopass.bits_left /
338 (cpi->twopass.total_stats.count - cpi->common.current_video_frame)) *
339 (cpi->oxcf.two_pass_vbrmax_section / 100.0);
340
341 // Trap case where we are out of bits.
342 return MAX((int)max_bits, 0);
343 }
344
345 void vp9_init_first_pass(VP9_COMP *cpi) {
346 zero_stats(&cpi->twopass.total_stats);
347 }
348
349 void vp9_end_first_pass(VP9_COMP *cpi) {
350 output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.total_stats);
351 }
352
353 static void zz_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
354 YV12_BUFFER_CONFIG *recon_buffer,
355 int *best_motion_err, int recon_yoffset) {
356 MACROBLOCKD *const xd = &x->e_mbd;
357
358 // Set up pointers for this macro block recon buffer
359 xd->plane[0].pre[0].buf = recon_buffer->y_buffer + recon_yoffset;
360
361 switch (xd->mi_8x8[0]->mbmi.sb_type) {
362 case BLOCK_8X8:
363 vp9_mse8x8(x->plane[0].src.buf, x->plane[0].src.stride,
364 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride,
365 (unsigned int *)(best_motion_err));
366 break;
367 case BLOCK_16X8:
368 vp9_mse16x8(x->plane[0].src.buf, x->plane[0].src.stride,
369 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride,
370 (unsigned int *)(best_motion_err));
371 break;
372 case BLOCK_8X16:
373 vp9_mse8x16(x->plane[0].src.buf, x->plane[0].src.stride,
374 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride,
375 (unsigned int *)(best_motion_err));
376 break;
377 default:
378 vp9_mse16x16(x->plane[0].src.buf, x->plane[0].src.stride,
379 xd->plane[0].pre[0].buf, xd->plane[0].pre[0].stride,
380 (unsigned int *)(best_motion_err));
381 break;
382 }
383 }
384
385 static void first_pass_motion_search(VP9_COMP *cpi, MACROBLOCK *x,
386 int_mv *ref_mv, MV *best_mv,
387 YV12_BUFFER_CONFIG *recon_buffer,
388 int *best_motion_err, int recon_yoffset) {
389 MACROBLOCKD *const xd = &x->e_mbd;
390 int num00;
391
392 int_mv tmp_mv;
393 int_mv ref_mv_full;
394
395 int tmp_err;
396 int step_param = 3;
397 int further_steps = (MAX_MVSEARCH_STEPS - 1) - step_param;
398 int n;
399 vp9_variance_fn_ptr_t v_fn_ptr =
400 cpi->fn_ptr[xd->mi_8x8[0]->mbmi.sb_type];
401 int new_mv_mode_penalty = 256;
402
403 int sr = 0;
404 int quart_frm = MIN(cpi->common.width, cpi->common.height);
405
406 // refine the motion search range accroding to the frame dimension
407 // for first pass test
408 while ((quart_frm << sr) < MAX_FULL_PEL_VAL)
409 sr++;
410 if (sr)
411 sr--;
412
413 step_param += sr;
414 further_steps -= sr;
415
416 // override the default variance function to use MSE
417 switch (xd->mi_8x8[0]->mbmi.sb_type) {
418 case BLOCK_8X8:
419 v_fn_ptr.vf = vp9_mse8x8;
420 break;
421 case BLOCK_16X8:
422 v_fn_ptr.vf = vp9_mse16x8;
423 break;
424 case BLOCK_8X16:
425 v_fn_ptr.vf = vp9_mse8x16;
426 break;
427 default:
428 v_fn_ptr.vf = vp9_mse16x16;
429 break;
430 }
431
432 // Set up pointers for this macro block recon buffer
433 xd->plane[0].pre[0].buf = recon_buffer->y_buffer + recon_yoffset;
434
435 // Initial step/diamond search centred on best mv
436 tmp_mv.as_int = 0;
437 ref_mv_full.as_mv.col = ref_mv->as_mv.col >> 3;
438 ref_mv_full.as_mv.row = ref_mv->as_mv.row >> 3;
439 tmp_err = cpi->diamond_search_sad(x, &ref_mv_full, &tmp_mv, step_param,
440 x->sadperbit16, &num00, &v_fn_ptr,
441 x->nmvjointcost,
442 x->mvcost, ref_mv);
443 if (tmp_err < INT_MAX - new_mv_mode_penalty)
444 tmp_err += new_mv_mode_penalty;
445
446 if (tmp_err < *best_motion_err) {
447 *best_motion_err = tmp_err;
448 best_mv->row = tmp_mv.as_mv.row;
449 best_mv->col = tmp_mv.as_mv.col;
450 }
451
452 // Further step/diamond searches as necessary
453 n = num00;
454 num00 = 0;
455
456 while (n < further_steps) {
457 n++;
458
459 if (num00) {
460 num00--;
461 } else {
462 tmp_err = cpi->diamond_search_sad(x, &ref_mv_full, &tmp_mv,
463 step_param + n, x->sadperbit16,
464 &num00, &v_fn_ptr,
465 x->nmvjointcost,
466 x->mvcost, ref_mv);
467 if (tmp_err < INT_MAX - new_mv_mode_penalty)
468 tmp_err += new_mv_mode_penalty;
469
470 if (tmp_err < *best_motion_err) {
471 *best_motion_err = tmp_err;
472 best_mv->row = tmp_mv.as_mv.row;
473 best_mv->col = tmp_mv.as_mv.col;
474 }
475 }
476 }
477 }
478
479 void vp9_first_pass(VP9_COMP *cpi) {
480 int mb_row, mb_col;
481 MACROBLOCK *const x = &cpi->mb;
482 VP9_COMMON *const cm = &cpi->common;
483 MACROBLOCKD *const xd = &x->e_mbd;
484 TileInfo tile;
485 struct macroblock_plane *const p = x->plane;
486 struct macroblockd_plane *const pd = xd->plane;
487 PICK_MODE_CONTEXT *ctx = &x->sb64_context;
488 int i;
489
490 int recon_yoffset, recon_uvoffset;
491 const int lst_yv12_idx = cm->ref_frame_map[cpi->lst_fb_idx];
492 const int gld_yv12_idx = cm->ref_frame_map[cpi->gld_fb_idx];
493 YV12_BUFFER_CONFIG *const lst_yv12 = &cm->yv12_fb[lst_yv12_idx];
494 YV12_BUFFER_CONFIG *const gld_yv12 = &cm->yv12_fb[gld_yv12_idx];
495 YV12_BUFFER_CONFIG *const new_yv12 = get_frame_new_buffer(cm);
496 const int recon_y_stride = lst_yv12->y_stride;
497 const int recon_uv_stride = lst_yv12->uv_stride;
498 int64_t intra_error = 0;
499 int64_t coded_error = 0;
500 int64_t sr_coded_error = 0;
501
502 int sum_mvr = 0, sum_mvc = 0;
503 int sum_mvr_abs = 0, sum_mvc_abs = 0;
504 int sum_mvrs = 0, sum_mvcs = 0;
505 int mvcount = 0;
506 int intercount = 0;
507 int second_ref_count = 0;
508 int intrapenalty = 256;
509 int neutral_count = 0;
510 int new_mv_count = 0;
511 int sum_in_vectors = 0;
512 uint32_t lastmv_as_int = 0;
513
514 int_mv zero_ref_mv;
515
516 zero_ref_mv.as_int = 0;
517
518 vp9_clear_system_state(); // __asm emms;
519
520 vp9_setup_src_planes(x, cpi->Source, 0, 0);
521 setup_pre_planes(xd, 0, lst_yv12, 0, 0, NULL);
522 setup_dst_planes(xd, new_yv12, 0, 0);
523
524 xd->mi_8x8 = cm->mi_grid_visible;
525 // required for vp9_frame_init_quantizer
526 xd->mi_8x8[0] = cm->mi;
527
528 setup_block_dptrs(&x->e_mbd, cm->subsampling_x, cm->subsampling_y);
529
530 vp9_frame_init_quantizer(cpi);
531
532 for (i = 0; i < MAX_MB_PLANE; ++i) {
533 p[i].coeff = ctx->coeff_pbuf[i][1];
534 pd[i].qcoeff = ctx->qcoeff_pbuf[i][1];
535 pd[i].dqcoeff = ctx->dqcoeff_pbuf[i][1];
536 pd[i].eobs = ctx->eobs_pbuf[i][1];
537 }
538 x->skip_recode = 0;
539
540
541 // Initialise the MV cost table to the defaults
542 // if( cm->current_video_frame == 0)
543 // if ( 0 )
544 {
545 vp9_init_mv_probs(cm);
546 vp9_initialize_rd_consts(cpi);
547 }
548
549 // tiling is ignored in the first pass
550 vp9_tile_init(&tile, cm, 0, 0);
551
552 // for each macroblock row in image
553 for (mb_row = 0; mb_row < cm->mb_rows; mb_row++) {
554 int_mv best_ref_mv;
555
556 best_ref_mv.as_int = 0;
557
558 // reset above block coeffs
559 xd->up_available = (mb_row != 0);
560 recon_yoffset = (mb_row * recon_y_stride * 16);
561 recon_uvoffset = (mb_row * recon_uv_stride * 8);
562
563 // Set up limit values for motion vectors to prevent them extending
564 // outside the UMV borders
565 x->mv_row_min = -((mb_row * 16) + BORDER_MV_PIXELS_B16);
566 x->mv_row_max = ((cm->mb_rows - 1 - mb_row) * 16)
567 + BORDER_MV_PIXELS_B16;
568
569 // for each macroblock col in image
570 for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) {
571 int this_error;
572 int gf_motion_error = INT_MAX;
573 int use_dc_pred = (mb_col || mb_row) && (!mb_col || !mb_row);
574 double error_weight;
575
576 vp9_clear_system_state(); // __asm emms;
577 error_weight = 1.0; // avoid uninitialized warnings
578
579 xd->plane[0].dst.buf = new_yv12->y_buffer + recon_yoffset;
580 xd->plane[1].dst.buf = new_yv12->u_buffer + recon_uvoffset;
581 xd->plane[2].dst.buf = new_yv12->v_buffer + recon_uvoffset;
582 xd->left_available = (mb_col != 0);
583
584 if (mb_col * 2 + 1 < cm->mi_cols) {
585 if (mb_row * 2 + 1 < cm->mi_rows) {
586 xd->mi_8x8[0]->mbmi.sb_type = BLOCK_16X16;
587 } else {
588 xd->mi_8x8[0]->mbmi.sb_type = BLOCK_16X8;
589 }
590 } else {
591 if (mb_row * 2 + 1 < cm->mi_rows) {
592 xd->mi_8x8[0]->mbmi.sb_type = BLOCK_8X16;
593 } else {
594 xd->mi_8x8[0]->mbmi.sb_type = BLOCK_8X8;
595 }
596 }
597 xd->mi_8x8[0]->mbmi.ref_frame[0] = INTRA_FRAME;
598 set_mi_row_col(xd, &tile,
599 mb_row << 1,
600 num_8x8_blocks_high_lookup[xd->mi_8x8[0]->mbmi.sb_type],
601 mb_col << 1,
602 num_8x8_blocks_wide_lookup[xd->mi_8x8[0]->mbmi.sb_type],
603 cm->mi_rows, cm->mi_cols);
604
605 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
606 int energy = vp9_block_energy(cpi, x, xd->mi_8x8[0]->mbmi.sb_type);
607 error_weight = vp9_vaq_inv_q_ratio(energy);
608 }
609
610 // do intra 16x16 prediction
611 this_error = vp9_encode_intra(x, use_dc_pred);
612 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
613 vp9_clear_system_state(); // __asm emms;
614 this_error *= error_weight;
615 }
616
617 // intrapenalty below deals with situations where the intra and inter
618 // error scores are very low (eg a plain black frame).
619 // We do not have special cases in first pass for 0,0 and nearest etc so
620 // all inter modes carry an overhead cost estimate for the mv.
621 // When the error score is very low this causes us to pick all or lots of
622 // INTRA modes and throw lots of key frames.
623 // This penalty adds a cost matching that of a 0,0 mv to the intra case.
624 this_error += intrapenalty;
625
626 // Cumulative intra error total
627 intra_error += (int64_t)this_error;
628
629 // Set up limit values for motion vectors to prevent them extending
630 // outside the UMV borders.
631 x->mv_col_min = -((mb_col * 16) + BORDER_MV_PIXELS_B16);
632 x->mv_col_max = ((cm->mb_cols - 1 - mb_col) * 16)
633 + BORDER_MV_PIXELS_B16;
634
635 // Other than for the first frame do a motion search
636 if (cm->current_video_frame > 0) {
637 int tmp_err;
638 int motion_error = INT_MAX;
639 int_mv mv, tmp_mv;
640
641 // Simple 0,0 motion with no mv overhead
642 zz_motion_search(cpi, x, lst_yv12, &motion_error, recon_yoffset);
643 mv.as_int = tmp_mv.as_int = 0;
644
645 // Test last reference frame using the previous best mv as the
646 // starting point (best reference) for the search
647 first_pass_motion_search(cpi, x, &best_ref_mv,
648 &mv.as_mv, lst_yv12,
649 &motion_error, recon_yoffset);
650 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
651 vp9_clear_system_state(); // __asm emms;
652 motion_error *= error_weight;
653 }
654
655 // If the current best reference mv is not centered on 0,0 then do a 0,0
656 // based search as well.
657 if (best_ref_mv.as_int) {
658 tmp_err = INT_MAX;
659 first_pass_motion_search(cpi, x, &zero_ref_mv, &tmp_mv.as_mv,
660 lst_yv12, &tmp_err, recon_yoffset);
661 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
662 vp9_clear_system_state(); // __asm emms;
663 tmp_err *= error_weight;
664 }
665
666 if (tmp_err < motion_error) {
667 motion_error = tmp_err;
668 mv.as_int = tmp_mv.as_int;
669 }
670 }
671
672 // Experimental search in an older reference frame
673 if (cm->current_video_frame > 1) {
674 // Simple 0,0 motion with no mv overhead
675 zz_motion_search(cpi, x, gld_yv12,
676 &gf_motion_error, recon_yoffset);
677
678 first_pass_motion_search(cpi, x, &zero_ref_mv,
679 &tmp_mv.as_mv, gld_yv12,
680 &gf_motion_error, recon_yoffset);
681 if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
682 vp9_clear_system_state(); // __asm emms;
683 gf_motion_error *= error_weight;
684 }
685
686 if ((gf_motion_error < motion_error) &&
687 (gf_motion_error < this_error)) {
688 second_ref_count++;
689 }
690
691 // Reset to last frame as reference buffer
692 xd->plane[0].pre[0].buf = lst_yv12->y_buffer + recon_yoffset;
693 xd->plane[1].pre[0].buf = lst_yv12->u_buffer + recon_uvoffset;
694 xd->plane[2].pre[0].buf = lst_yv12->v_buffer + recon_uvoffset;
695
696 // In accumulating a score for the older reference frame
697 // take the best of the motion predicted score and
698 // the intra coded error (just as will be done for)
699 // accumulation of "coded_error" for the last frame.
700 if (gf_motion_error < this_error)
701 sr_coded_error += gf_motion_error;
702 else
703 sr_coded_error += this_error;
704 } else {
705 sr_coded_error += motion_error;
706 }
707 /* Intra assumed best */
708 best_ref_mv.as_int = 0;
709
710 if (motion_error <= this_error) {
711 // Keep a count of cases where the inter and intra were
712 // very close and very low. This helps with scene cut
713 // detection for example in cropped clips with black bars
714 // at the sides or top and bottom.
715 if ((((this_error - intrapenalty) * 9) <=
716 (motion_error * 10)) &&
717 (this_error < (2 * intrapenalty))) {
718 neutral_count++;
719 }
720
721 mv.as_mv.row *= 8;
722 mv.as_mv.col *= 8;
723 this_error = motion_error;
724 vp9_set_mbmode_and_mvs(x, NEWMV, &mv);
725 xd->mi_8x8[0]->mbmi.tx_size = TX_4X4;
726 xd->mi_8x8[0]->mbmi.ref_frame[0] = LAST_FRAME;
727 xd->mi_8x8[0]->mbmi.ref_frame[1] = NONE;
728 vp9_build_inter_predictors_sby(xd, mb_row << 1,
729 mb_col << 1,
730 xd->mi_8x8[0]->mbmi.sb_type);
731 vp9_encode_sby(x, xd->mi_8x8[0]->mbmi.sb_type);
732 sum_mvr += mv.as_mv.row;
733 sum_mvr_abs += abs(mv.as_mv.row);
734 sum_mvc += mv.as_mv.col;
735 sum_mvc_abs += abs(mv.as_mv.col);
736 sum_mvrs += mv.as_mv.row * mv.as_mv.row;
737 sum_mvcs += mv.as_mv.col * mv.as_mv.col;
738 intercount++;
739
740 best_ref_mv.as_int = mv.as_int;
741
742 // Was the vector non-zero
743 if (mv.as_int) {
744 mvcount++;
745
746 // Was it different from the last non zero vector
747 if (mv.as_int != lastmv_as_int)
748 new_mv_count++;
749 lastmv_as_int = mv.as_int;
750
751 // Does the Row vector point inwards or outwards
752 if (mb_row < cm->mb_rows / 2) {
753 if (mv.as_mv.row > 0)
754 sum_in_vectors--;
755 else if (mv.as_mv.row < 0)
756 sum_in_vectors++;
757 } else if (mb_row > cm->mb_rows / 2) {
758 if (mv.as_mv.row > 0)
759 sum_in_vectors++;
760 else if (mv.as_mv.row < 0)
761 sum_in_vectors--;
762 }
763
764 // Does the Row vector point inwards or outwards
765 if (mb_col < cm->mb_cols / 2) {
766 if (mv.as_mv.col > 0)
767 sum_in_vectors--;
768 else if (mv.as_mv.col < 0)
769 sum_in_vectors++;
770 } else if (mb_col > cm->mb_cols / 2) {
771 if (mv.as_mv.col > 0)
772 sum_in_vectors++;
773 else if (mv.as_mv.col < 0)
774 sum_in_vectors--;
775 }
776 }
777 }
778 } else {
779 sr_coded_error += (int64_t)this_error;
780 }
781 coded_error += (int64_t)this_error;
782
783 // adjust to the next column of macroblocks
784 x->plane[0].src.buf += 16;
785 x->plane[1].src.buf += 8;
786 x->plane[2].src.buf += 8;
787
788 recon_yoffset += 16;
789 recon_uvoffset += 8;
790 }
791
792 // adjust to the next row of mbs
793 x->plane[0].src.buf += 16 * x->plane[0].src.stride - 16 * cm->mb_cols;
794 x->plane[1].src.buf += 8 * x->plane[1].src.stride - 8 * cm->mb_cols;
795 x->plane[2].src.buf += 8 * x->plane[1].src.stride - 8 * cm->mb_cols;
796
797 vp9_clear_system_state(); // __asm emms;
798 }
799
800 vp9_clear_system_state(); // __asm emms;
801 {
802 double weight = 0.0;
803
804 FIRSTPASS_STATS fps;
805
806 fps.frame = cm->current_video_frame;
807 fps.intra_error = (double)(intra_error >> 8);
808 fps.coded_error = (double)(coded_error >> 8);
809 fps.sr_coded_error = (double)(sr_coded_error >> 8);
810 weight = simple_weight(cpi->Source);
811
812
813 if (weight < 0.1)
814 weight = 0.1;
815
816 fps.ssim_weighted_pred_err = fps.coded_error * weight;
817
818 fps.pcnt_inter = 0.0;
819 fps.pcnt_motion = 0.0;
820 fps.MVr = 0.0;
821 fps.mvr_abs = 0.0;
822 fps.MVc = 0.0;
823 fps.mvc_abs = 0.0;
824 fps.MVrv = 0.0;
825 fps.MVcv = 0.0;
826 fps.mv_in_out_count = 0.0;
827 fps.new_mv_count = 0.0;
828 fps.count = 1.0;
829
830 fps.pcnt_inter = 1.0 * (double)intercount / cm->MBs;
831 fps.pcnt_second_ref = 1.0 * (double)second_ref_count / cm->MBs;
832 fps.pcnt_neutral = 1.0 * (double)neutral_count / cm->MBs;
833
834 if (mvcount > 0) {
835 fps.MVr = (double)sum_mvr / (double)mvcount;
836 fps.mvr_abs = (double)sum_mvr_abs / (double)mvcount;
837 fps.MVc = (double)sum_mvc / (double)mvcount;
838 fps.mvc_abs = (double)sum_mvc_abs / (double)mvcount;
839 fps.MVrv = ((double)sum_mvrs - (fps.MVr * fps.MVr / (double)mvcount)) /
840 (double)mvcount;
841 fps.MVcv = ((double)sum_mvcs - (fps.MVc * fps.MVc / (double)mvcount)) /
842 (double)mvcount;
843 fps.mv_in_out_count = (double)sum_in_vectors / (double)(mvcount * 2);
844 fps.new_mv_count = new_mv_count;
845
846 fps.pcnt_motion = 1.0 * (double)mvcount / cpi->common.MBs;
847 }
848
849 // TODO(paulwilkins): Handle the case when duration is set to 0, or
850 // something less than the full time between subsequent values of
851 // cpi->source_time_stamp.
852 fps.duration = (double)(cpi->source->ts_end
853 - cpi->source->ts_start);
854
855 // don't want to do output stats with a stack variable!
856 cpi->twopass.this_frame_stats = fps;
857 output_stats(cpi, cpi->output_pkt_list, &cpi->twopass.this_frame_stats);
858 accumulate_stats(&cpi->twopass.total_stats, &fps);
859 }
860
861 // Copy the previous Last Frame back into gf and and arf buffers if
862 // the prediction is good enough... but also dont allow it to lag too far
863 if ((cpi->twopass.sr_update_lag > 3) ||
864 ((cm->current_video_frame > 0) &&
865 (cpi->twopass.this_frame_stats.pcnt_inter > 0.20) &&
866 ((cpi->twopass.this_frame_stats.intra_error /
867 DOUBLE_DIVIDE_CHECK(cpi->twopass.this_frame_stats.coded_error)) >
868 2.0))) {
869 vp8_yv12_copy_frame(lst_yv12, gld_yv12);
870 cpi->twopass.sr_update_lag = 1;
871 } else {
872 cpi->twopass.sr_update_lag++;
873 }
874 // swap frame pointers so last frame refers to the frame we just compressed
875 swap_yv12(lst_yv12, new_yv12);
876
877 vp9_extend_frame_borders(lst_yv12, cm->subsampling_x, cm->subsampling_y);
878
879 // Special case for the first frame. Copy into the GF buffer as a second
880 // reference.
881 if (cm->current_video_frame == 0)
882 vp8_yv12_copy_frame(lst_yv12, gld_yv12);
883
884 // use this to see what the first pass reconstruction looks like
885 if (0) {
886 char filename[512];
887 FILE *recon_file;
888 snprintf(filename, sizeof(filename), "enc%04d.yuv",
889 (int)cm->current_video_frame);
890
891 if (cm->current_video_frame == 0)
892 recon_file = fopen(filename, "wb");
893 else
894 recon_file = fopen(filename, "ab");
895
896 (void)fwrite(lst_yv12->buffer_alloc, lst_yv12->frame_size, 1, recon_file);
897 fclose(recon_file);
898 }
899
900 cm->current_video_frame++;
901 }
902
903 // Estimate a cost per mb attributable to overheads such as the coding of
904 // modes and motion vectors.
905 // Currently simplistic in its assumptions for testing.
906 //
907
908
909 static double bitcost(double prob) {
910 return -(log(prob) / log(2.0));
911 }
912
913 static int64_t estimate_modemvcost(VP9_COMP *cpi,
914 FIRSTPASS_STATS *fpstats) {
915 #if 0
916 int mv_cost;
917 int mode_cost;
918
919 double av_pct_inter = fpstats->pcnt_inter / fpstats->count;
920 double av_pct_motion = fpstats->pcnt_motion / fpstats->count;
921 double av_intra = (1.0 - av_pct_inter);
922
923 double zz_cost;
924 double motion_cost;
925 double intra_cost;
926
927 zz_cost = bitcost(av_pct_inter - av_pct_motion);
928 motion_cost = bitcost(av_pct_motion);
929 intra_cost = bitcost(av_intra);
930
931 // Estimate of extra bits per mv overhead for mbs
932 // << 9 is the normalization to the (bits * 512) used in vp9_bits_per_mb
933 mv_cost = ((int)(fpstats->new_mv_count / fpstats->count) * 8) << 9;
934
935 // Crude estimate of overhead cost from modes
936 // << 9 is the normalization to (bits * 512) used in vp9_bits_per_mb
937 mode_cost =
938 (int)((((av_pct_inter - av_pct_motion) * zz_cost) +
939 (av_pct_motion * motion_cost) +
940 (av_intra * intra_cost)) * cpi->common.MBs) << 9;
941
942 // return mv_cost + mode_cost;
943 // TODO(paulwilkins): Fix overhead costs for extended Q range.
944 #endif
945 return 0;
946 }
947
948 static double calc_correction_factor(double err_per_mb,
949 double err_divisor,
950 double pt_low,
951 double pt_high,
952 int q) {
953 const double error_term = err_per_mb / err_divisor;
954
955 // Adjustment based on actual quantizer to power term.
956 const double power_term = MIN(vp9_convert_qindex_to_q(q) * 0.01 + pt_low,
957 pt_high);
958
959 // Calculate correction factor
960 if (power_term < 1.0)
961 assert(error_term >= 0.0);
962
963 return fclamp(pow(error_term, power_term), 0.05, 5.0);
964 }
965
966 // Given a current maxQ value sets a range for future values.
967 // PGW TODO..
968 // This code removes direct dependency on QIndex to determine the range
969 // (now uses the actual quantizer) but has not been tuned.
970 static void adjust_maxq_qrange(VP9_COMP *cpi) {
971 int i;
972 // Set the max corresponding to cpi->avg_q * 2.0
973 double q = cpi->avg_q * 2.0;
974 cpi->twopass.maxq_max_limit = cpi->worst_quality;
975 for (i = cpi->best_quality; i <= cpi->worst_quality; i++) {
976 cpi->twopass.maxq_max_limit = i;
977 if (vp9_convert_qindex_to_q(i) >= q)
978 break;
979 }
980
981 // Set the min corresponding to cpi->avg_q * 0.5
982 q = cpi->avg_q * 0.5;
983 cpi->twopass.maxq_min_limit = cpi->best_quality;
984 for (i = cpi->worst_quality; i >= cpi->best_quality; i--) {
985 cpi->twopass.maxq_min_limit = i;
986 if (vp9_convert_qindex_to_q(i) <= q)
987 break;
988 }
989 }
990
991 static int estimate_max_q(VP9_COMP *cpi,
992 FIRSTPASS_STATS *fpstats,
993 int section_target_bandwitdh) {
994 int q;
995 int num_mbs = cpi->common.MBs;
996 int target_norm_bits_per_mb;
997
998 double section_err = fpstats->coded_error / fpstats->count;
999 double sr_correction;
1000 double err_per_mb = section_err / num_mbs;
1001 double err_correction_factor;
1002 double speed_correction = 1.0;
1003
1004 if (section_target_bandwitdh <= 0)
1005 return cpi->twopass.maxq_max_limit; // Highest value allowed
1006
1007 target_norm_bits_per_mb = section_target_bandwitdh < (1 << 20)
1008 ? (512 * section_target_bandwitdh) / num_mbs
1009 : 512 * (section_target_bandwitdh / num_mbs);
1010
1011 // Look at the drop in prediction quality between the last frame
1012 // and the GF buffer (which contained an older frame).
1013 if (fpstats->sr_coded_error > fpstats->coded_error) {
1014 double sr_err_diff = (fpstats->sr_coded_error - fpstats->coded_error) /
1015 (fpstats->count * cpi->common.MBs);
1016 sr_correction = fclamp(pow(sr_err_diff / 32.0, 0.25), 0.75, 1.25);
1017 } else {
1018 sr_correction = 0.75;
1019 }
1020
1021 // Calculate a corrective factor based on a rolling ratio of bits spent
1022 // vs target bits
1023 if (cpi->rolling_target_bits > 0 &&
1024 cpi->active_worst_quality < cpi->worst_quality) {
1025 double rolling_ratio = (double)cpi->rolling_actual_bits /
1026 (double)cpi->rolling_target_bits;
1027
1028 if (rolling_ratio < 0.95)
1029 cpi->twopass.est_max_qcorrection_factor -= 0.005;
1030 else if (rolling_ratio > 1.05)
1031 cpi->twopass.est_max_qcorrection_factor += 0.005;
1032
1033 cpi->twopass.est_max_qcorrection_factor = fclamp(
1034 cpi->twopass.est_max_qcorrection_factor, 0.1, 10.0);
1035 }
1036
1037 // Corrections for higher compression speed settings
1038 // (reduced compression expected)
1039 // FIXME(jimbankoski): Once we settle on vp9 speed features we need to
1040 // change this code.
1041 if (cpi->compressor_speed == 1)
1042 speed_correction = cpi->oxcf.cpu_used <= 5 ?
1043 1.04 + (/*cpi->oxcf.cpu_used*/0 * 0.04) :
1044 1.25;
1045
1046 // Try and pick a max Q that will be high enough to encode the
1047 // content at the given rate.
1048 for (q = cpi->twopass.maxq_min_limit; q < cpi->twopass.maxq_max_limit; q++) {
1049 int bits_per_mb_at_this_q;
1050
1051 err_correction_factor = calc_correction_factor(err_per_mb,
1052 ERR_DIVISOR, 0.4, 0.90, q) *
1053 sr_correction * speed_correction *
1054 cpi->twopass.est_max_qcorrection_factor;
1055
1056 bits_per_mb_at_this_q = vp9_bits_per_mb(INTER_FRAME, q,
1057 err_correction_factor);
1058
1059 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
1060 break;
1061 }
1062
1063 // Restriction on active max q for constrained quality mode.
1064 if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY &&
1065 q < cpi->cq_target_quality)
1066 q = cpi->cq_target_quality;
1067
1068 // Adjust maxq_min_limit and maxq_max_limit limits based on
1069 // average q observed in clip for non kf/gf/arf frames
1070 // Give average a chance to settle though.
1071 // PGW TODO.. This code is broken for the extended Q range
1072 if (cpi->ni_frames > ((int)cpi->twopass.total_stats.count >> 8) &&
1073 cpi->ni_frames > 25)
1074 adjust_maxq_qrange(cpi);
1075
1076 return q;
1077 }
1078
1079 // For cq mode estimate a cq level that matches the observed
1080 // complexity and data rate.
1081 static int estimate_cq(VP9_COMP *cpi,
1082 FIRSTPASS_STATS *fpstats,
1083 int section_target_bandwitdh) {
1084 int q;
1085 int num_mbs = cpi->common.MBs;
1086 int target_norm_bits_per_mb;
1087
1088 double section_err = (fpstats->coded_error / fpstats->count);
1089 double err_per_mb = section_err / num_mbs;
1090 double err_correction_factor;
1091 double sr_err_diff;
1092 double sr_correction;
1093 double speed_correction = 1.0;
1094 double clip_iiratio;
1095 double clip_iifactor;
1096
1097 target_norm_bits_per_mb = (section_target_bandwitdh < (1 << 20))
1098 ? (512 * section_target_bandwitdh) / num_mbs
1099 : 512 * (section_target_bandwitdh / num_mbs);
1100
1101
1102 // Corrections for higher compression speed settings
1103 // (reduced compression expected)
1104 if (cpi->compressor_speed == 1) {
1105 if (cpi->oxcf.cpu_used <= 5)
1106 speed_correction = 1.04 + (/*cpi->oxcf.cpu_used*/ 0 * 0.04);
1107 else
1108 speed_correction = 1.25;
1109 }
1110
1111 // Look at the drop in prediction quality between the last frame
1112 // and the GF buffer (which contained an older frame).
1113 if (fpstats->sr_coded_error > fpstats->coded_error) {
1114 sr_err_diff =
1115 (fpstats->sr_coded_error - fpstats->coded_error) /
1116 (fpstats->count * cpi->common.MBs);
1117 sr_correction = (sr_err_diff / 32.0);
1118 sr_correction = pow(sr_correction, 0.25);
1119 if (sr_correction < 0.75)
1120 sr_correction = 0.75;
1121 else if (sr_correction > 1.25)
1122 sr_correction = 1.25;
1123 } else {
1124 sr_correction = 0.75;
1125 }
1126
1127 // II ratio correction factor for clip as a whole
1128 clip_iiratio = cpi->twopass.total_stats.intra_error /
1129 DOUBLE_DIVIDE_CHECK(cpi->twopass.total_stats.coded_error);
1130 clip_iifactor = 1.0 - ((clip_iiratio - 10.0) * 0.025);
1131 if (clip_iifactor < 0.80)
1132 clip_iifactor = 0.80;
1133
1134 // Try and pick a Q that can encode the content at the given rate.
1135 for (q = 0; q < MAXQ; q++) {
1136 int bits_per_mb_at_this_q;
1137
1138 // Error per MB based correction factor
1139 err_correction_factor =
1140 calc_correction_factor(err_per_mb, 100.0, 0.4, 0.90, q) *
1141 sr_correction * speed_correction * clip_iifactor;
1142
1143 bits_per_mb_at_this_q =
1144 vp9_bits_per_mb(INTER_FRAME, q, err_correction_factor);
1145
1146 if (bits_per_mb_at_this_q <= target_norm_bits_per_mb)
1147 break;
1148 }
1149
1150 // Clip value to range "best allowed to (worst allowed - 1)"
1151 q = select_cq_level(q);
1152 if (q >= cpi->worst_quality)
1153 q = cpi->worst_quality - 1;
1154 if (q < cpi->best_quality)
1155 q = cpi->best_quality;
1156
1157 return q;
1158 }
1159
1160 extern void vp9_new_framerate(VP9_COMP *cpi, double framerate);
1161
1162 void vp9_init_second_pass(VP9_COMP *cpi) {
1163 FIRSTPASS_STATS this_frame;
1164 FIRSTPASS_STATS *start_pos;
1165
1166 double lower_bounds_min_rate = FRAME_OVERHEAD_BITS * cpi->oxcf.framerate;
1167 double two_pass_min_rate = (double)(cpi->oxcf.target_bandwidth *
1168 cpi->oxcf.two_pass_vbrmin_section / 100);
1169
1170 if (two_pass_min_rate < lower_bounds_min_rate)
1171 two_pass_min_rate = lower_bounds_min_rate;
1172
1173 zero_stats(&cpi->twopass.total_stats);
1174 zero_stats(&cpi->twopass.total_left_stats);
1175
1176 if (!cpi->twopass.stats_in_end)
1177 return;
1178
1179 cpi->twopass.total_stats = *cpi->twopass.stats_in_end;
1180 cpi->twopass.total_left_stats = cpi->twopass.total_stats;
1181
1182 // each frame can have a different duration, as the frame rate in the source
1183 // isn't guaranteed to be constant. The frame rate prior to the first frame
1184 // encoded in the second pass is a guess. However the sum duration is not.
1185 // Its calculated based on the actual durations of all frames from the first
1186 // pass.
1187 vp9_new_framerate(cpi, 10000000.0 * cpi->twopass.total_stats.count /
1188 cpi->twopass.total_stats.duration);
1189
1190 cpi->output_framerate = cpi->oxcf.framerate;
1191 cpi->twopass.bits_left = (int64_t)(cpi->twopass.total_stats.duration *
1192 cpi->oxcf.target_bandwidth / 10000000.0);
1193 cpi->twopass.bits_left -= (int64_t)(cpi->twopass.total_stats.duration *
1194 two_pass_min_rate / 10000000.0);
1195
1196 // Calculate a minimum intra value to be used in determining the IIratio
1197 // scores used in the second pass. We have this minimum to make sure
1198 // that clips that are static but "low complexity" in the intra domain
1199 // are still boosted appropriately for KF/GF/ARF
1200 cpi->twopass.kf_intra_err_min = KF_MB_INTRA_MIN * cpi->common.MBs;
1201 cpi->twopass.gf_intra_err_min = GF_MB_INTRA_MIN * cpi->common.MBs;
1202
1203 // This variable monitors how far behind the second ref update is lagging
1204 cpi->twopass.sr_update_lag = 1;
1205
1206 // Scan the first pass file and calculate an average Intra / Inter error score
1207 // ratio for the sequence.
1208 {
1209 double sum_iiratio = 0.0;
1210 double IIRatio;
1211
1212 start_pos = cpi->twopass.stats_in; // Note the starting "file" position.
1213
1214 while (input_stats(cpi, &this_frame) != EOF) {
1215 IIRatio = this_frame.intra_error
1216 / DOUBLE_DIVIDE_CHECK(this_frame.coded_error);
1217 IIRatio = (IIRatio < 1.0) ? 1.0 : (IIRatio > 20.0) ? 20.0 : IIRatio;
1218 sum_iiratio += IIRatio;
1219 }
1220
1221 cpi->twopass.avg_iiratio = sum_iiratio /
1222 DOUBLE_DIVIDE_CHECK((double)cpi->twopass.total_stats.count);
1223
1224 // Reset file position
1225 reset_fpf_position(cpi, start_pos);
1226 }
1227
1228 // Scan the first pass file and calculate a modified total error based upon
1229 // the bias/power function used to allocate bits.
1230 {
1231 start_pos = cpi->twopass.stats_in; // Note starting "file" position
1232
1233 cpi->twopass.modified_error_total = 0.0;
1234 cpi->twopass.modified_error_used = 0.0;
1235
1236 while (input_stats(cpi, &this_frame) != EOF) {
1237 cpi->twopass.modified_error_total +=
1238 calculate_modified_err(cpi, &this_frame);
1239 }
1240 cpi->twopass.modified_error_left = cpi->twopass.modified_error_total;
1241
1242 reset_fpf_position(cpi, start_pos); // Reset file position
1243 }
1244 }
1245
1246 void vp9_end_second_pass(VP9_COMP *cpi) {
1247 }
1248
1249 // This function gives and estimate of how badly we believe
1250 // the prediction quality is decaying from frame to frame.
1251 static double get_prediction_decay_rate(VP9_COMP *cpi,
1252 FIRSTPASS_STATS *next_frame) {
1253 double prediction_decay_rate;
1254 double second_ref_decay;
1255 double mb_sr_err_diff;
1256
1257 // Initial basis is the % mbs inter coded
1258 prediction_decay_rate = next_frame->pcnt_inter;
1259
1260 // Look at the observed drop in prediction quality between the last frame
1261 // and the GF buffer (which contains an older frame).
1262 mb_sr_err_diff = (next_frame->sr_coded_error - next_frame->coded_error) /
1263 cpi->common.MBs;
1264 if (mb_sr_err_diff <= 512.0) {
1265 second_ref_decay = 1.0 - (mb_sr_err_diff / 512.0);
1266 second_ref_decay = pow(second_ref_decay, 0.5);
1267 if (second_ref_decay < 0.85)
1268 second_ref_decay = 0.85;
1269 else if (second_ref_decay > 1.0)
1270 second_ref_decay = 1.0;
1271 } else {
1272 second_ref_decay = 0.85;
1273 }
1274
1275 if (second_ref_decay < prediction_decay_rate)
1276 prediction_decay_rate = second_ref_decay;
1277
1278 return prediction_decay_rate;
1279 }
1280
1281 // Function to test for a condition where a complex transition is followed
1282 // by a static section. For example in slide shows where there is a fade
1283 // between slides. This is to help with more optimal kf and gf positioning.
1284 static int detect_transition_to_still(
1285 VP9_COMP *cpi,
1286 int frame_interval,
1287 int still_interval,
1288 double loop_decay_rate,
1289 double last_decay_rate) {
1290 int trans_to_still = 0;
1291
1292 // Break clause to detect very still sections after motion
1293 // For example a static image after a fade or other transition
1294 // instead of a clean scene cut.
1295 if (frame_interval > MIN_GF_INTERVAL &&
1296 loop_decay_rate >= 0.999 &&
1297 last_decay_rate < 0.9) {
1298 int j;
1299 FIRSTPASS_STATS *position = cpi->twopass.stats_in;
1300 FIRSTPASS_STATS tmp_next_frame;
1301 double zz_inter;
1302
1303 // Look ahead a few frames to see if static condition
1304 // persists...
1305 for (j = 0; j < still_interval; j++) {
1306 if (EOF == input_stats(cpi, &tmp_next_frame))
1307 break;
1308
1309 zz_inter =
1310 (tmp_next_frame.pcnt_inter - tmp_next_frame.pcnt_motion);
1311 if (zz_inter < 0.999)
1312 break;
1313 }
1314 // Reset file position
1315 reset_fpf_position(cpi, position);
1316
1317 // Only if it does do we signal a transition to still
1318 if (j == still_interval)
1319 trans_to_still = 1;
1320 }
1321
1322 return trans_to_still;
1323 }
1324
1325 // This function detects a flash through the high relative pcnt_second_ref
1326 // score in the frame following a flash frame. The offset passed in should
1327 // reflect this
1328 static int detect_flash(VP9_COMP *cpi, int offset) {
1329 FIRSTPASS_STATS next_frame;
1330
1331 int flash_detected = 0;
1332
1333 // Read the frame data.
1334 // The return is FALSE (no flash detected) if not a valid frame
1335 if (read_frame_stats(cpi, &next_frame, offset) != EOF) {
1336 // What we are looking for here is a situation where there is a
1337 // brief break in prediction (such as a flash) but subsequent frames
1338 // are reasonably well predicted by an earlier (pre flash) frame.
1339 // The recovery after a flash is indicated by a high pcnt_second_ref
1340 // comapred to pcnt_inter.
1341 if (next_frame.pcnt_second_ref > next_frame.pcnt_inter &&
1342 next_frame.pcnt_second_ref >= 0.5)
1343 flash_detected = 1;
1344 }
1345
1346 return flash_detected;
1347 }
1348
1349 // Update the motion related elements to the GF arf boost calculation
1350 static void accumulate_frame_motion_stats(
1351 FIRSTPASS_STATS *this_frame,
1352 double *this_frame_mv_in_out,
1353 double *mv_in_out_accumulator,
1354 double *abs_mv_in_out_accumulator,
1355 double *mv_ratio_accumulator) {
1356 // double this_frame_mv_in_out;
1357 double this_frame_mvr_ratio;
1358 double this_frame_mvc_ratio;
1359 double motion_pct;
1360
1361 // Accumulate motion stats.
1362 motion_pct = this_frame->pcnt_motion;
1363
1364 // Accumulate Motion In/Out of frame stats
1365 *this_frame_mv_in_out = this_frame->mv_in_out_count * motion_pct;
1366 *mv_in_out_accumulator += this_frame->mv_in_out_count * motion_pct;
1367 *abs_mv_in_out_accumulator +=
1368 fabs(this_frame->mv_in_out_count * motion_pct);
1369
1370 // Accumulate a measure of how uniform (or conversely how random)
1371 // the motion field is. (A ratio of absmv / mv)
1372 if (motion_pct > 0.05) {
1373 this_frame_mvr_ratio = fabs(this_frame->mvr_abs) /
1374 DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVr));
1375
1376 this_frame_mvc_ratio = fabs(this_frame->mvc_abs) /
1377 DOUBLE_DIVIDE_CHECK(fabs(this_frame->MVc));
1378
1379 *mv_ratio_accumulator +=
1380 (this_frame_mvr_ratio < this_frame->mvr_abs)
1381 ? (this_frame_mvr_ratio * motion_pct)
1382 : this_frame->mvr_abs * motion_pct;
1383
1384 *mv_ratio_accumulator +=
1385 (this_frame_mvc_ratio < this_frame->mvc_abs)
1386 ? (this_frame_mvc_ratio * motion_pct)
1387 : this_frame->mvc_abs * motion_pct;
1388 }
1389 }
1390
1391 // Calculate a baseline boost number for the current frame.
1392 static double calc_frame_boost(
1393 VP9_COMP *cpi,
1394 FIRSTPASS_STATS *this_frame,
1395 double this_frame_mv_in_out) {
1396 double frame_boost;
1397
1398 // Underlying boost factor is based on inter intra error ratio
1399 if (this_frame->intra_error > cpi->twopass.gf_intra_err_min)
1400 frame_boost = (IIFACTOR * this_frame->intra_error /
1401 DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
1402 else
1403 frame_boost = (IIFACTOR * cpi->twopass.gf_intra_err_min /
1404 DOUBLE_DIVIDE_CHECK(this_frame->coded_error));
1405
1406 // Increase boost for frames where new data coming into frame
1407 // (eg zoom out). Slightly reduce boost if there is a net balance
1408 // of motion out of the frame (zoom in).
1409 // The range for this_frame_mv_in_out is -1.0 to +1.0
1410 if (this_frame_mv_in_out > 0.0)
1411 frame_boost += frame_boost * (this_frame_mv_in_out * 2.0);
1412 // In extreme case boost is halved
1413 else
1414 frame_boost += frame_boost * (this_frame_mv_in_out / 2.0);
1415
1416 // Clip to maximum
1417 if (frame_boost > GF_RMAX)
1418 frame_boost = GF_RMAX;
1419
1420 return frame_boost;
1421 }
1422
1423 static int calc_arf_boost(VP9_COMP *cpi, int offset,
1424 int f_frames, int b_frames,
1425 int *f_boost, int *b_boost) {
1426 FIRSTPASS_STATS this_frame;
1427
1428 int i;
1429 double boost_score = 0.0;
1430 double mv_ratio_accumulator = 0.0;
1431 double decay_accumulator = 1.0;
1432 double this_frame_mv_in_out = 0.0;
1433 double mv_in_out_accumulator = 0.0;
1434 double abs_mv_in_out_accumulator = 0.0;
1435 int arf_boost;
1436 int flash_detected = 0;
1437
1438 // Search forward from the proposed arf/next gf position
1439 for (i = 0; i < f_frames; i++) {
1440 if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF)
1441 break;
1442
1443 // Update the motion related elements to the boost calculation
1444 accumulate_frame_motion_stats(&this_frame,
1445 &this_frame_mv_in_out, &mv_in_out_accumulator,
1446 &abs_mv_in_out_accumulator,
1447 &mv_ratio_accumulator);
1448
1449 // We want to discount the flash frame itself and the recovery
1450 // frame that follows as both will have poor scores.
1451 flash_detected = detect_flash(cpi, (i + offset)) ||
1452 detect_flash(cpi, (i + offset + 1));
1453
1454 // Cumulative effect of prediction quality decay
1455 if (!flash_detected) {
1456 decay_accumulator *= get_prediction_decay_rate(cpi, &this_frame);
1457 decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR
1458 ? MIN_DECAY_FACTOR : decay_accumulator;
1459 }
1460
1461 boost_score += (decay_accumulator *
1462 calc_frame_boost(cpi, &this_frame, this_frame_mv_in_out));
1463 }
1464
1465 *f_boost = (int)boost_score;
1466
1467 // Reset for backward looking loop
1468 boost_score = 0.0;
1469 mv_ratio_accumulator = 0.0;
1470 decay_accumulator = 1.0;
1471 this_frame_mv_in_out = 0.0;
1472 mv_in_out_accumulator = 0.0;
1473 abs_mv_in_out_accumulator = 0.0;
1474
1475 // Search backward towards last gf position
1476 for (i = -1; i >= -b_frames; i--) {
1477 if (read_frame_stats(cpi, &this_frame, (i + offset)) == EOF)
1478 break;
1479
1480 // Update the motion related elements to the boost calculation
1481 accumulate_frame_motion_stats(&this_frame,
1482 &this_frame_mv_in_out, &mv_in_out_accumulator,
1483 &abs_mv_in_out_accumulator,
1484 &mv_ratio_accumulator);
1485
1486 // We want to discount the the flash frame itself and the recovery
1487 // frame that follows as both will have poor scores.
1488 flash_detected = detect_flash(cpi, (i + offset)) ||
1489 detect_flash(cpi, (i + offset + 1));
1490
1491 // Cumulative effect of prediction quality decay
1492 if (!flash_detected) {
1493 decay_accumulator *= get_prediction_decay_rate(cpi, &this_frame);
1494 decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR
1495 ? MIN_DECAY_FACTOR : decay_accumulator;
1496 }
1497
1498 boost_score += (decay_accumulator *
1499 calc_frame_boost(cpi, &this_frame, this_frame_mv_in_out));
1500 }
1501 *b_boost = (int)boost_score;
1502
1503 arf_boost = (*f_boost + *b_boost);
1504 if (arf_boost < ((b_frames + f_frames) * 20))
1505 arf_boost = ((b_frames + f_frames) * 20);
1506
1507 return arf_boost;
1508 }
1509
1510 #if CONFIG_MULTIPLE_ARF
1511 // Work out the frame coding order for a GF or an ARF group.
1512 // The current implementation codes frames in their natural order for a
1513 // GF group, and inserts additional ARFs into an ARF group using a
1514 // binary split approach.
1515 // NOTE: this function is currently implemented recursively.
1516 static void schedule_frames(VP9_COMP *cpi, const int start, const int end,
1517 const int arf_idx, const int gf_or_arf_group,
1518 const int level) {
1519 int i, abs_end, half_range;
1520 int *cfo = cpi->frame_coding_order;
1521 int idx = cpi->new_frame_coding_order_period;
1522
1523 // If (end < 0) an ARF should be coded at position (-end).
1524 assert(start >= 0);
1525
1526 // printf("start:%d end:%d\n", start, end);
1527
1528 // GF Group: code frames in logical order.
1529 if (gf_or_arf_group == 0) {
1530 assert(end >= start);
1531 for (i = start; i <= end; ++i) {
1532 cfo[idx] = i;
1533 cpi->arf_buffer_idx[idx] = arf_idx;
1534 cpi->arf_weight[idx] = -1;
1535 ++idx;
1536 }
1537 cpi->new_frame_coding_order_period = idx;
1538 return;
1539 }
1540
1541 // ARF Group: work out the ARF schedule.
1542 // Mark ARF frames as negative.
1543 if (end < 0) {
1544 // printf("start:%d end:%d\n", -end, -end);
1545 // ARF frame is at the end of the range.
1546 cfo[idx] = end;
1547 // What ARF buffer does this ARF use as predictor.
1548 cpi->arf_buffer_idx[idx] = (arf_idx > 2) ? (arf_idx - 1) : 2;
1549 cpi->arf_weight[idx] = level;
1550 ++idx;
1551 abs_end = -end;
1552 } else {
1553 abs_end = end;
1554 }
1555
1556 half_range = (abs_end - start) >> 1;
1557
1558 // ARFs may not be adjacent, they must be separated by at least
1559 // MIN_GF_INTERVAL non-ARF frames.
1560 if ((start + MIN_GF_INTERVAL) >= (abs_end - MIN_GF_INTERVAL)) {
1561 // printf("start:%d end:%d\n", start, abs_end);
1562 // Update the coding order and active ARF.
1563 for (i = start; i <= abs_end; ++i) {
1564 cfo[idx] = i;
1565 cpi->arf_buffer_idx[idx] = arf_idx;
1566 cpi->arf_weight[idx] = -1;
1567 ++idx;
1568 }
1569 cpi->new_frame_coding_order_period = idx;
1570 } else {
1571 // Place a new ARF at the mid-point of the range.
1572 cpi->new_frame_coding_order_period = idx;
1573 schedule_frames(cpi, start, -(start + half_range), arf_idx + 1,
1574 gf_or_arf_group, level + 1);
1575 schedule_frames(cpi, start + half_range + 1, abs_end, arf_idx,
1576 gf_or_arf_group, level + 1);
1577 }
1578 }
1579
1580 #define FIXED_ARF_GROUP_SIZE 16
1581
1582 void define_fixed_arf_period(VP9_COMP *cpi) {
1583 int i;
1584 int max_level = INT_MIN;
1585
1586 assert(cpi->multi_arf_enabled);
1587 assert(cpi->oxcf.lag_in_frames >= FIXED_ARF_GROUP_SIZE);
1588
1589 // Save the weight of the last frame in the sequence before next
1590 // sequence pattern overwrites it.
1591 cpi->this_frame_weight = cpi->arf_weight[cpi->sequence_number];
1592 assert(cpi->this_frame_weight >= 0);
1593
1594 // Initialize frame coding order variables.
1595 cpi->new_frame_coding_order_period = 0;
1596 cpi->next_frame_in_order = 0;
1597 cpi->arf_buffered = 0;
1598 vp9_zero(cpi->frame_coding_order);
1599 vp9_zero(cpi->arf_buffer_idx);
1600 vpx_memset(cpi->arf_weight, -1, sizeof(cpi->arf_weight));
1601
1602 if (cpi->twopass.frames_to_key <= (FIXED_ARF_GROUP_SIZE + 8)) {
1603 // Setup a GF group close to the keyframe.
1604 cpi->source_alt_ref_pending = 0;
1605 cpi->baseline_gf_interval = cpi->twopass.frames_to_key;
1606 schedule_frames(cpi, 0, (cpi->baseline_gf_interval - 1), 2, 0, 0);
1607 } else {
1608 // Setup a fixed period ARF group.
1609 cpi->source_alt_ref_pending = 1;
1610 cpi->baseline_gf_interval = FIXED_ARF_GROUP_SIZE;
1611 schedule_frames(cpi, 0, -(cpi->baseline_gf_interval - 1), 2, 1, 0);
1612 }
1613
1614 // Replace level indicator of -1 with correct level.
1615 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1616 if (cpi->arf_weight[i] > max_level) {
1617 max_level = cpi->arf_weight[i];
1618 }
1619 }
1620 ++max_level;
1621 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1622 if (cpi->arf_weight[i] == -1) {
1623 cpi->arf_weight[i] = max_level;
1624 }
1625 }
1626 cpi->max_arf_level = max_level;
1627 #if 0
1628 printf("\nSchedule: ");
1629 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1630 printf("%4d ", cpi->frame_coding_order[i]);
1631 }
1632 printf("\n");
1633 printf("ARFref: ");
1634 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1635 printf("%4d ", cpi->arf_buffer_idx[i]);
1636 }
1637 printf("\n");
1638 printf("Weight: ");
1639 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1640 printf("%4d ", cpi->arf_weight[i]);
1641 }
1642 printf("\n");
1643 #endif
1644 }
1645 #endif
1646
1647 // Analyse and define a gf/arf group.
1648 static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
1649 FIRSTPASS_STATS next_frame = { 0 };
1650 FIRSTPASS_STATS *start_pos;
1651 int i;
1652 double boost_score = 0.0;
1653 double old_boost_score = 0.0;
1654 double gf_group_err = 0.0;
1655 double gf_first_frame_err = 0.0;
1656 double mod_frame_err = 0.0;
1657
1658 double mv_ratio_accumulator = 0.0;
1659 double decay_accumulator = 1.0;
1660 double zero_motion_accumulator = 1.0;
1661
1662 double loop_decay_rate = 1.00; // Starting decay rate
1663 double last_loop_decay_rate = 1.00;
1664
1665 double this_frame_mv_in_out = 0.0;
1666 double mv_in_out_accumulator = 0.0;
1667 double abs_mv_in_out_accumulator = 0.0;
1668 double mv_ratio_accumulator_thresh;
1669 int max_bits = frame_max_bits(cpi); // Max for a single frame
1670
1671 unsigned int allow_alt_ref =
1672 cpi->oxcf.play_alternate && cpi->oxcf.lag_in_frames;
1673
1674 int f_boost = 0;
1675 int b_boost = 0;
1676 int flash_detected;
1677 int active_max_gf_interval;
1678
1679 cpi->twopass.gf_group_bits = 0;
1680
1681 vp9_clear_system_state(); // __asm emms;
1682
1683 start_pos = cpi->twopass.stats_in;
1684
1685 // Load stats for the current frame.
1686 mod_frame_err = calculate_modified_err(cpi, this_frame);
1687
1688 // Note the error of the frame at the start of the group (this will be
1689 // the GF frame error if we code a normal gf
1690 gf_first_frame_err = mod_frame_err;
1691
1692 // Special treatment if the current frame is a key frame (which is also
1693 // a gf). If it is then its error score (and hence bit allocation) need
1694 // to be subtracted out from the calculation for the GF group
1695 if (cpi->common.frame_type == KEY_FRAME)
1696 gf_group_err -= gf_first_frame_err;
1697
1698 // Motion breakout threshold for loop below depends on image size.
1699 mv_ratio_accumulator_thresh = (cpi->common.width + cpi->common.height) / 10.0;
1700
1701 // Work out a maximum interval for the GF.
1702 // If the image appears completely static we can extend beyond this.
1703 // The value chosen depends on the active Q range. At low Q we have
1704 // bits to spare and are better with a smaller interval and smaller boost.
1705 // At high Q when there are few bits to spare we are better with a longer
1706 // interval to spread the cost of the GF.
1707 active_max_gf_interval =
1708 12 + ((int)vp9_convert_qindex_to_q(cpi->active_worst_quality) >> 5);
1709
1710 if (active_max_gf_interval > cpi->max_gf_interval)
1711 active_max_gf_interval = cpi->max_gf_interval;
1712
1713 i = 0;
1714 while (((i < cpi->twopass.static_scene_max_gf_interval) ||
1715 ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL)) &&
1716 (i < cpi->twopass.frames_to_key)) {
1717 i++; // Increment the loop counter
1718
1719 // Accumulate error score of frames in this gf group
1720 mod_frame_err = calculate_modified_err(cpi, this_frame);
1721 gf_group_err += mod_frame_err;
1722
1723 if (EOF == input_stats(cpi, &next_frame))
1724 break;
1725
1726 // Test for the case where there is a brief flash but the prediction
1727 // quality back to an earlier frame is then restored.
1728 flash_detected = detect_flash(cpi, 0);
1729
1730 // Update the motion related elements to the boost calculation
1731 accumulate_frame_motion_stats(&next_frame,
1732 &this_frame_mv_in_out, &mv_in_out_accumulator,
1733 &abs_mv_in_out_accumulator,
1734 &mv_ratio_accumulator);
1735
1736 // Cumulative effect of prediction quality decay
1737 if (!flash_detected) {
1738 last_loop_decay_rate = loop_decay_rate;
1739 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
1740 decay_accumulator = decay_accumulator * loop_decay_rate;
1741
1742 // Monitor for static sections.
1743 if ((next_frame.pcnt_inter - next_frame.pcnt_motion) <
1744 zero_motion_accumulator) {
1745 zero_motion_accumulator =
1746 (next_frame.pcnt_inter - next_frame.pcnt_motion);
1747 }
1748
1749 // Break clause to detect very still sections after motion
1750 // (for example a static image after a fade or other transition).
1751 if (detect_transition_to_still(cpi, i, 5, loop_decay_rate,
1752 last_loop_decay_rate)) {
1753 allow_alt_ref = 0;
1754 break;
1755 }
1756 }
1757
1758 // Calculate a boost number for this frame
1759 boost_score +=
1760 (decay_accumulator *
1761 calc_frame_boost(cpi, &next_frame, this_frame_mv_in_out));
1762
1763 // Break out conditions.
1764 if (
1765 // Break at cpi->max_gf_interval unless almost totally static
1766 (i >= active_max_gf_interval && (zero_motion_accumulator < 0.995)) ||
1767 (
1768 // Don't break out with a very short interval
1769 (i > MIN_GF_INTERVAL) &&
1770 // Don't break out very close to a key frame
1771 ((cpi->twopass.frames_to_key - i) >= MIN_GF_INTERVAL) &&
1772 ((boost_score > 125.0) || (next_frame.pcnt_inter < 0.75)) &&
1773 (!flash_detected) &&
1774 ((mv_ratio_accumulator > mv_ratio_accumulator_thresh) ||
1775 (abs_mv_in_out_accumulator > 3.0) ||
1776 (mv_in_out_accumulator < -2.0) ||
1777 ((boost_score - old_boost_score) < IIFACTOR)))) {
1778 boost_score = old_boost_score;
1779 break;
1780 }
1781
1782 *this_frame = next_frame;
1783
1784 old_boost_score = boost_score;
1785 }
1786
1787 cpi->gf_zeromotion_pct = (int)(zero_motion_accumulator * 1000.0);
1788
1789 // Don't allow a gf too near the next kf
1790 if ((cpi->twopass.frames_to_key - i) < MIN_GF_INTERVAL) {
1791 while (i < cpi->twopass.frames_to_key) {
1792 i++;
1793
1794 if (EOF == input_stats(cpi, this_frame))
1795 break;
1796
1797 if (i < cpi->twopass.frames_to_key) {
1798 mod_frame_err = calculate_modified_err(cpi, this_frame);
1799 gf_group_err += mod_frame_err;
1800 }
1801 }
1802 }
1803
1804 // Set the interval until the next gf or arf.
1805 cpi->baseline_gf_interval = i;
1806
1807 #if CONFIG_MULTIPLE_ARF
1808 if (cpi->multi_arf_enabled) {
1809 // Initialize frame coding order variables.
1810 cpi->new_frame_coding_order_period = 0;
1811 cpi->next_frame_in_order = 0;
1812 cpi->arf_buffered = 0;
1813 vp9_zero(cpi->frame_coding_order);
1814 vp9_zero(cpi->arf_buffer_idx);
1815 vpx_memset(cpi->arf_weight, -1, sizeof(cpi->arf_weight));
1816 }
1817 #endif
1818
1819 // Should we use the alternate reference frame
1820 if (allow_alt_ref &&
1821 (i < cpi->oxcf.lag_in_frames) &&
1822 (i >= MIN_GF_INTERVAL) &&
1823 // dont use ARF very near next kf
1824 (i <= (cpi->twopass.frames_to_key - MIN_GF_INTERVAL)) &&
1825 ((next_frame.pcnt_inter > 0.75) ||
1826 (next_frame.pcnt_second_ref > 0.5)) &&
1827 ((mv_in_out_accumulator / (double)i > -0.2) ||
1828 (mv_in_out_accumulator > -2.0)) &&
1829 (boost_score > 100)) {
1830 // Alternative boost calculation for alt ref
1831 cpi->gfu_boost = calc_arf_boost(cpi, 0, (i - 1), (i - 1), &f_boost,
1832 &b_boost);
1833 cpi->source_alt_ref_pending = 1;
1834
1835 #if CONFIG_MULTIPLE_ARF
1836 // Set the ARF schedule.
1837 if (cpi->multi_arf_enabled) {
1838 schedule_frames(cpi, 0, -(cpi->baseline_gf_interval - 1), 2, 1, 0);
1839 }
1840 #endif
1841 } else {
1842 cpi->gfu_boost = (int)boost_score;
1843 cpi->source_alt_ref_pending = 0;
1844 #if CONFIG_MULTIPLE_ARF
1845 // Set the GF schedule.
1846 if (cpi->multi_arf_enabled) {
1847 schedule_frames(cpi, 0, cpi->baseline_gf_interval - 1, 2, 0, 0);
1848 assert(cpi->new_frame_coding_order_period == cpi->baseline_gf_interval);
1849 }
1850 #endif
1851 }
1852
1853 #if CONFIG_MULTIPLE_ARF
1854 if (cpi->multi_arf_enabled && (cpi->common.frame_type != KEY_FRAME)) {
1855 int max_level = INT_MIN;
1856 // Replace level indicator of -1 with correct level.
1857 for (i = 0; i < cpi->frame_coding_order_period; ++i) {
1858 if (cpi->arf_weight[i] > max_level) {
1859 max_level = cpi->arf_weight[i];
1860 }
1861 }
1862 ++max_level;
1863 for (i = 0; i < cpi->frame_coding_order_period; ++i) {
1864 if (cpi->arf_weight[i] == -1) {
1865 cpi->arf_weight[i] = max_level;
1866 }
1867 }
1868 cpi->max_arf_level = max_level;
1869 }
1870 #if 0
1871 if (cpi->multi_arf_enabled) {
1872 printf("\nSchedule: ");
1873 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1874 printf("%4d ", cpi->frame_coding_order[i]);
1875 }
1876 printf("\n");
1877 printf("ARFref: ");
1878 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1879 printf("%4d ", cpi->arf_buffer_idx[i]);
1880 }
1881 printf("\n");
1882 printf("Weight: ");
1883 for (i = 0; i < cpi->new_frame_coding_order_period; ++i) {
1884 printf("%4d ", cpi->arf_weight[i]);
1885 }
1886 printf("\n");
1887 }
1888 #endif
1889 #endif
1890
1891 // Now decide how many bits should be allocated to the GF group as a
1892 // proportion of those remaining in the kf group.
1893 // The final key frame group in the clip is treated as a special case
1894 // where cpi->twopass.kf_group_bits is tied to cpi->twopass.bits_left.
1895 // This is also important for short clips where there may only be one
1896 // key frame.
1897 if (cpi->twopass.frames_to_key >= (int)(cpi->twopass.total_stats.count -
1898 cpi->common.current_video_frame)) {
1899 cpi->twopass.kf_group_bits =
1900 (cpi->twopass.bits_left > 0) ? cpi->twopass.bits_left : 0;
1901 }
1902
1903 // Calculate the bits to be allocated to the group as a whole
1904 if ((cpi->twopass.kf_group_bits > 0) &&
1905 (cpi->twopass.kf_group_error_left > 0)) {
1906 cpi->twopass.gf_group_bits =
1907 (int64_t)(cpi->twopass.kf_group_bits *
1908 (gf_group_err / cpi->twopass.kf_group_error_left));
1909 } else {
1910 cpi->twopass.gf_group_bits = 0;
1911 }
1912 cpi->twopass.gf_group_bits =
1913 (cpi->twopass.gf_group_bits < 0)
1914 ? 0
1915 : (cpi->twopass.gf_group_bits > cpi->twopass.kf_group_bits)
1916 ? cpi->twopass.kf_group_bits : cpi->twopass.gf_group_bits;
1917
1918 // Clip cpi->twopass.gf_group_bits based on user supplied data rate
1919 // variability limit (cpi->oxcf.two_pass_vbrmax_section)
1920 if (cpi->twopass.gf_group_bits >
1921 (int64_t)max_bits * cpi->baseline_gf_interval)
1922 cpi->twopass.gf_group_bits = (int64_t)max_bits * cpi->baseline_gf_interval;
1923
1924 // Reset the file position
1925 reset_fpf_position(cpi, start_pos);
1926
1927 // Update the record of error used so far (only done once per gf group)
1928 cpi->twopass.modified_error_used += gf_group_err;
1929
1930 // Assign bits to the arf or gf.
1931 for (i = 0;
1932 i <= (cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME);
1933 ++i) {
1934 int allocation_chunks;
1935 int q = cpi->oxcf.fixed_q < 0 ? cpi->last_q[INTER_FRAME]
1936 : cpi->oxcf.fixed_q;
1937 int gf_bits;
1938
1939 int boost = (cpi->gfu_boost * vp9_gfboost_qadjust(q)) / 100;
1940
1941 // Set max and minimum boost and hence minimum allocation
1942 boost = clamp(boost, 125, (cpi->baseline_gf_interval + 1) * 200);
1943
1944 if (cpi->source_alt_ref_pending && i == 0)
1945 allocation_chunks = ((cpi->baseline_gf_interval + 1) * 100) + boost;
1946 else
1947 allocation_chunks = (cpi->baseline_gf_interval * 100) + (boost - 100);
1948
1949 // Prevent overflow
1950 if (boost > 1023) {
1951 int divisor = boost >> 10;
1952 boost /= divisor;
1953 allocation_chunks /= divisor;
1954 }
1955
1956 // Calculate the number of bits to be spent on the gf or arf based on
1957 // the boost number
1958 gf_bits = (int)((double)boost * (cpi->twopass.gf_group_bits /
1959 (double)allocation_chunks));
1960
1961 // If the frame that is to be boosted is simpler than the average for
1962 // the gf/arf group then use an alternative calculation
1963 // based on the error score of the frame itself
1964 if (mod_frame_err < gf_group_err / (double)cpi->baseline_gf_interval) {
1965 double alt_gf_grp_bits =
1966 (double)cpi->twopass.kf_group_bits *
1967 (mod_frame_err * (double)cpi->baseline_gf_interval) /
1968 DOUBLE_DIVIDE_CHECK(cpi->twopass.kf_group_error_left);
1969
1970 int alt_gf_bits = (int)((double)boost * (alt_gf_grp_bits /
1971 (double)allocation_chunks));
1972
1973 if (gf_bits > alt_gf_bits)
1974 gf_bits = alt_gf_bits;
1975 } else {
1976 // If it is harder than other frames in the group make sure it at
1977 // least receives an allocation in keeping with its relative error
1978 // score, otherwise it may be worse off than an "un-boosted" frame.
1979 int alt_gf_bits = (int)((double)cpi->twopass.kf_group_bits *
1980 mod_frame_err /
1981 DOUBLE_DIVIDE_CHECK(cpi->twopass.kf_group_error_left));
1982
1983 if (alt_gf_bits > gf_bits)
1984 gf_bits = alt_gf_bits;
1985 }
1986
1987 // Dont allow a negative value for gf_bits
1988 if (gf_bits < 0)
1989 gf_bits = 0;
1990
1991 // Add in minimum for a frame
1992 gf_bits += cpi->min_frame_bandwidth;
1993
1994 if (i == 0) {
1995 cpi->twopass.gf_bits = gf_bits;
1996 }
1997 if (i == 1 || (!cpi->source_alt_ref_pending
1998 && (cpi->common.frame_type != KEY_FRAME))) {
1999 // Per frame bit target for this frame
2000 cpi->per_frame_bandwidth = gf_bits;
2001 }
2002 }
2003
2004 {
2005 // Adjust KF group bits and error remaining
2006 cpi->twopass.kf_group_error_left -= (int64_t)gf_group_err;
2007 cpi->twopass.kf_group_bits -= cpi->twopass.gf_group_bits;
2008
2009 if (cpi->twopass.kf_group_bits < 0)
2010 cpi->twopass.kf_group_bits = 0;
2011
2012 // Note the error score left in the remaining frames of the group.
2013 // For normal GFs we want to remove the error score for the first frame
2014 // of the group (except in Key frame case where this has already
2015 // happened)
2016 if (!cpi->source_alt_ref_pending && cpi->common.frame_type != KEY_FRAME)
2017 cpi->twopass.gf_group_error_left = (int64_t)(gf_group_err
2018 - gf_first_frame_err);
2019 else
2020 cpi->twopass.gf_group_error_left = (int64_t)gf_group_err;
2021
2022 cpi->twopass.gf_group_bits -= cpi->twopass.gf_bits
2023 - cpi->min_frame_bandwidth;
2024
2025 if (cpi->twopass.gf_group_bits < 0)
2026 cpi->twopass.gf_group_bits = 0;
2027
2028 // This condition could fail if there are two kfs very close together
2029 // despite (MIN_GF_INTERVAL) and would cause a divide by 0 in the
2030 // calculation of alt_extra_bits.
2031 if (cpi->baseline_gf_interval >= 3) {
2032 const int boost = cpi->source_alt_ref_pending ? b_boost : cpi->gfu_boost;
2033
2034 if (boost >= 150) {
2035 int alt_extra_bits;
2036 int pct_extra = (boost - 100) / 50;
2037 pct_extra = (pct_extra > 20) ? 20 : pct_extra;
2038
2039 alt_extra_bits = (int)((cpi->twopass.gf_group_bits * pct_extra) / 100);
2040 cpi->twopass.gf_group_bits -= alt_extra_bits;
2041 }
2042 }
2043 }
2044
2045 if (cpi->common.frame_type != KEY_FRAME) {
2046 FIRSTPASS_STATS sectionstats;
2047
2048 zero_stats(&sectionstats);
2049 reset_fpf_position(cpi, start_pos);
2050
2051 for (i = 0; i < cpi->baseline_gf_interval; i++) {
2052 input_stats(cpi, &next_frame);
2053 accumulate_stats(&sectionstats, &next_frame);
2054 }
2055
2056 avg_stats(&sectionstats);
2057
2058 cpi->twopass.section_intra_rating = (int)
2059 (sectionstats.intra_error /
2060 DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
2061
2062 reset_fpf_position(cpi, start_pos);
2063 }
2064 }
2065
2066 // Allocate bits to a normal frame that is neither a gf an arf or a key frame.
2067 static void assign_std_frame_bits(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
2068 int target_frame_size;
2069
2070 double modified_err;
2071 double err_fraction;
2072
2073 // Max for a single frame.
2074 int max_bits = frame_max_bits(cpi);
2075
2076 // Calculate modified prediction error used in bit allocation.
2077 modified_err = calculate_modified_err(cpi, this_frame);
2078
2079 if (cpi->twopass.gf_group_error_left > 0)
2080 // What portion of the remaining GF group error is used by this frame.
2081 err_fraction = modified_err / cpi->twopass.gf_group_error_left;
2082 else
2083 err_fraction = 0.0;
2084
2085 // How many of those bits available for allocation should we give it?
2086 target_frame_size = (int)((double)cpi->twopass.gf_group_bits * err_fraction);
2087
2088 // Clip target size to 0 - max_bits (or cpi->twopass.gf_group_bits) at
2089 // the top end.
2090 if (target_frame_size < 0) {
2091 target_frame_size = 0;
2092 } else {
2093 if (target_frame_size > max_bits)
2094 target_frame_size = max_bits;
2095
2096 if (target_frame_size > cpi->twopass.gf_group_bits)
2097 target_frame_size = (int)cpi->twopass.gf_group_bits;
2098 }
2099
2100 // Adjust error and bits remaining.
2101 cpi->twopass.gf_group_error_left -= (int64_t)modified_err;
2102 cpi->twopass.gf_group_bits -= target_frame_size;
2103
2104 if (cpi->twopass.gf_group_bits < 0)
2105 cpi->twopass.gf_group_bits = 0;
2106
2107 // Add in the minimum number of bits that is set aside for every frame.
2108 target_frame_size += cpi->min_frame_bandwidth;
2109
2110 // Per frame bit target for this frame.
2111 cpi->per_frame_bandwidth = target_frame_size;
2112 }
2113
2114 // Make a damped adjustment to the active max q.
2115 static int adjust_active_maxq(int old_maxqi, int new_maxqi) {
2116 int i;
2117 const double old_q = vp9_convert_qindex_to_q(old_maxqi);
2118 const double new_q = vp9_convert_qindex_to_q(new_maxqi);
2119 const double target_q = ((old_q * 7.0) + new_q) / 8.0;
2120
2121 if (target_q > old_q) {
2122 for (i = old_maxqi; i <= new_maxqi; i++)
2123 if (vp9_convert_qindex_to_q(i) >= target_q)
2124 return i;
2125 } else {
2126 for (i = old_maxqi; i >= new_maxqi; i--)
2127 if (vp9_convert_qindex_to_q(i) <= target_q)
2128 return i;
2129 }
2130
2131 return new_maxqi;
2132 }
2133
2134 void vp9_second_pass(VP9_COMP *cpi) {
2135 int tmp_q;
2136 int frames_left = (int)(cpi->twopass.total_stats.count -
2137 cpi->common.current_video_frame);
2138
2139 FIRSTPASS_STATS this_frame;
2140 FIRSTPASS_STATS this_frame_copy;
2141
2142 double this_frame_intra_error;
2143 double this_frame_coded_error;
2144
2145 if (!cpi->twopass.stats_in)
2146 return;
2147
2148 vp9_clear_system_state();
2149
2150 if (cpi->oxcf.end_usage == USAGE_CONSTANT_QUALITY) {
2151 cpi->active_worst_quality = cpi->oxcf.cq_level;
2152 } else {
2153 // Special case code for first frame.
2154 if (cpi->common.current_video_frame == 0) {
2155 int section_target_bandwidth =
2156 (int)(cpi->twopass.bits_left / frames_left);
2157 cpi->twopass.est_max_qcorrection_factor = 1.0;
2158
2159 // Set a cq_level in constrained quality mode.
2160 // Commenting this code out for now since it does not seem to be
2161 // working well.
2162 /*
2163 if (cpi->oxcf.end_usage == USAGE_CONSTRAINED_QUALITY) {
2164 int est_cq = estimate_cq(cpi, &cpi->twopass.total_left_stats,
2165 section_target_bandwidth);
2166
2167 if (est_cq > cpi->cq_target_quality)
2168 cpi->cq_target_quality = est_cq;
2169 else
2170 cpi->cq_target_quality = cpi->oxcf.cq_level;
2171 }
2172 */
2173
2174 // guess at maxq needed in 2nd pass
2175 cpi->twopass.maxq_max_limit = cpi->worst_quality;
2176 cpi->twopass.maxq_min_limit = cpi->best_quality;
2177
2178 tmp_q = estimate_max_q(cpi, &cpi->twopass.total_left_stats,
2179 section_target_bandwidth);
2180
2181 cpi->active_worst_quality = tmp_q;
2182 cpi->ni_av_qi = tmp_q;
2183 cpi->avg_q = vp9_convert_qindex_to_q(tmp_q);
2184
2185 // Limit the maxq value returned subsequently.
2186 // This increases the risk of overspend or underspend if the initial
2187 // estimate for the clip is bad, but helps prevent excessive
2188 // variation in Q, especially near the end of a clip
2189 // where for example a small overspend may cause Q to crash
2190 adjust_maxq_qrange(cpi);
2191 }
2192
2193 // The last few frames of a clip almost always have to few or too many
2194 // bits and for the sake of over exact rate control we dont want to make
2195 // radical adjustments to the allowed quantizer range just to use up a
2196 // few surplus bits or get beneath the target rate.
2197 else if ((cpi->common.current_video_frame <
2198 (((unsigned int)cpi->twopass.total_stats.count * 255) >> 8)) &&
2199 ((cpi->common.current_video_frame + cpi->baseline_gf_interval) <
2200 (unsigned int)cpi->twopass.total_stats.count)) {
2201 int section_target_bandwidth =
2202 (int)(cpi->twopass.bits_left / frames_left);
2203 if (frames_left < 1)
2204 frames_left = 1;
2205
2206 tmp_q = estimate_max_q(
2207 cpi,
2208 &cpi->twopass.total_left_stats,
2209 section_target_bandwidth);
2210
2211 // Make a damped adjustment to active max Q
2212 cpi->active_worst_quality =
2213 adjust_active_maxq(cpi->active_worst_quality, tmp_q);
2214 }
2215 }
2216 vp9_zero(this_frame);
2217 if (EOF == input_stats(cpi, &this_frame))
2218 return;
2219
2220 this_frame_intra_error = this_frame.intra_error;
2221 this_frame_coded_error = this_frame.coded_error;
2222
2223 // keyframe and section processing !
2224 if (cpi->twopass.frames_to_key == 0) {
2225 // Define next KF group and assign bits to it
2226 this_frame_copy = this_frame;
2227 find_next_key_frame(cpi, &this_frame_copy);
2228 }
2229
2230 // Is this a GF / ARF (Note that a KF is always also a GF)
2231 if (cpi->frames_till_gf_update_due == 0) {
2232 // Define next gf group and assign bits to it
2233 this_frame_copy = this_frame;
2234
2235 cpi->gf_zeromotion_pct = 0;
2236
2237 #if CONFIG_MULTIPLE_ARF
2238 if (cpi->multi_arf_enabled) {
2239 define_fixed_arf_period(cpi);
2240 } else {
2241 #endif
2242 define_gf_group(cpi, &this_frame_copy);
2243 #if CONFIG_MULTIPLE_ARF
2244 }
2245 #endif
2246
2247 if (cpi->gf_zeromotion_pct > 995) {
2248 // As long as max_thresh for encode breakout is small enough, it is ok
2249 // to enable it for no-show frame, i.e. set enable_encode_breakout to 2.
2250 if (!cpi->common.show_frame)
2251 cpi->enable_encode_breakout = 0;
2252 else
2253 cpi->enable_encode_breakout = 2;
2254 }
2255
2256 // If we are going to code an altref frame at the end of the group
2257 // and the current frame is not a key frame....
2258 // If the previous group used an arf this frame has already benefited
2259 // from that arf boost and it should not be given extra bits
2260 // If the previous group was NOT coded using arf we may want to apply
2261 // some boost to this GF as well
2262 if (cpi->source_alt_ref_pending && (cpi->common.frame_type != KEY_FRAME)) {
2263 // Assign a standard frames worth of bits from those allocated
2264 // to the GF group
2265 int bak = cpi->per_frame_bandwidth;
2266 this_frame_copy = this_frame;
2267 assign_std_frame_bits(cpi, &this_frame_copy);
2268 cpi->per_frame_bandwidth = bak;
2269 }
2270 } else {
2271 // Otherwise this is an ordinary frame
2272 // Assign bits from those allocated to the GF group
2273 this_frame_copy = this_frame;
2274 assign_std_frame_bits(cpi, &this_frame_copy);
2275 }
2276
2277 // Keep a globally available copy of this and the next frame's iiratio.
2278 cpi->twopass.this_iiratio = (int)(this_frame_intra_error /
2279 DOUBLE_DIVIDE_CHECK(this_frame_coded_error));
2280 {
2281 FIRSTPASS_STATS next_frame;
2282 if (lookup_next_frame_stats(cpi, &next_frame) != EOF) {
2283 cpi->twopass.next_iiratio = (int)(next_frame.intra_error /
2284 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
2285 }
2286 }
2287
2288 // Set nominal per second bandwidth for this frame
2289 cpi->target_bandwidth = (int)(cpi->per_frame_bandwidth
2290 * cpi->output_framerate);
2291 if (cpi->target_bandwidth < 0)
2292 cpi->target_bandwidth = 0;
2293
2294 cpi->twopass.frames_to_key--;
2295
2296 // Update the total stats remaining structure
2297 subtract_stats(&cpi->twopass.total_left_stats, &this_frame);
2298 }
2299
2300 static int test_candidate_kf(VP9_COMP *cpi,
2301 FIRSTPASS_STATS *last_frame,
2302 FIRSTPASS_STATS *this_frame,
2303 FIRSTPASS_STATS *next_frame) {
2304 int is_viable_kf = 0;
2305
2306 // Does the frame satisfy the primary criteria of a key frame
2307 // If so, then examine how well it predicts subsequent frames
2308 if ((this_frame->pcnt_second_ref < 0.10) &&
2309 (next_frame->pcnt_second_ref < 0.10) &&
2310 ((this_frame->pcnt_inter < 0.05) ||
2311 (((this_frame->pcnt_inter - this_frame->pcnt_neutral) < .35) &&
2312 ((this_frame->intra_error /
2313 DOUBLE_DIVIDE_CHECK(this_frame->coded_error)) < 2.5) &&
2314 ((fabs(last_frame->coded_error - this_frame->coded_error) /
2315 DOUBLE_DIVIDE_CHECK(this_frame->coded_error) >
2316 .40) ||
2317 (fabs(last_frame->intra_error - this_frame->intra_error) /
2318 DOUBLE_DIVIDE_CHECK(this_frame->intra_error) >
2319 .40) ||
2320 ((next_frame->intra_error /
2321 DOUBLE_DIVIDE_CHECK(next_frame->coded_error)) > 3.5))))) {
2322 int i;
2323 FIRSTPASS_STATS *start_pos;
2324
2325 FIRSTPASS_STATS local_next_frame;
2326
2327 double boost_score = 0.0;
2328 double old_boost_score = 0.0;
2329 double decay_accumulator = 1.0;
2330 double next_iiratio;
2331
2332 local_next_frame = *next_frame;
2333
2334 // Note the starting file position so we can reset to it
2335 start_pos = cpi->twopass.stats_in;
2336
2337 // Examine how well the key frame predicts subsequent frames
2338 for (i = 0; i < 16; i++) {
2339 next_iiratio = (IIKFACTOR1 * local_next_frame.intra_error /
2340 DOUBLE_DIVIDE_CHECK(local_next_frame.coded_error));
2341
2342 if (next_iiratio > RMAX)
2343 next_iiratio = RMAX;
2344
2345 // Cumulative effect of decay in prediction quality
2346 if (local_next_frame.pcnt_inter > 0.85)
2347 decay_accumulator = decay_accumulator * local_next_frame.pcnt_inter;
2348 else
2349 decay_accumulator =
2350 decay_accumulator * ((0.85 + local_next_frame.pcnt_inter) / 2.0);
2351
2352 // decay_accumulator = decay_accumulator * local_next_frame.pcnt_inter;
2353
2354 // Keep a running total
2355 boost_score += (decay_accumulator * next_iiratio);
2356
2357 // Test various breakout clauses
2358 if ((local_next_frame.pcnt_inter < 0.05) ||
2359 (next_iiratio < 1.5) ||
2360 (((local_next_frame.pcnt_inter -
2361 local_next_frame.pcnt_neutral) < 0.20) &&
2362 (next_iiratio < 3.0)) ||
2363 ((boost_score - old_boost_score) < 3.0) ||
2364 (local_next_frame.intra_error < 200)
2365 ) {
2366 break;
2367 }
2368
2369 old_boost_score = boost_score;
2370
2371 // Get the next frame details
2372 if (EOF == input_stats(cpi, &local_next_frame))
2373 break;
2374 }
2375
2376 // If there is tolerable prediction for at least the next 3 frames then
2377 // break out else discard this potential key frame and move on
2378 if (boost_score > 30.0 && (i > 3)) {
2379 is_viable_kf = 1;
2380 } else {
2381 // Reset the file position
2382 reset_fpf_position(cpi, start_pos);
2383
2384 is_viable_kf = 0;
2385 }
2386 }
2387
2388 return is_viable_kf;
2389 }
2390 static void find_next_key_frame(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) {
2391 int i, j;
2392 FIRSTPASS_STATS last_frame;
2393 FIRSTPASS_STATS first_frame;
2394 FIRSTPASS_STATS next_frame;
2395 FIRSTPASS_STATS *start_position;
2396
2397 double decay_accumulator = 1.0;
2398 double zero_motion_accumulator = 1.0;
2399 double boost_score = 0;
2400 double loop_decay_rate;
2401
2402 double kf_mod_err = 0.0;
2403 double kf_group_err = 0.0;
2404 double kf_group_intra_err = 0.0;
2405 double kf_group_coded_err = 0.0;
2406 double recent_loop_decay[8] = {1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0};
2407
2408 vp9_zero(next_frame);
2409
2410 vp9_clear_system_state(); // __asm emms;
2411 start_position = cpi->twopass.stats_in;
2412
2413 cpi->common.frame_type = KEY_FRAME;
2414
2415 // is this a forced key frame by interval
2416 cpi->this_key_frame_forced = cpi->next_key_frame_forced;
2417
2418 // Clear the alt ref active flag as this can never be active on a key frame
2419 cpi->source_alt_ref_active = 0;
2420
2421 // Kf is always a gf so clear frames till next gf counter
2422 cpi->frames_till_gf_update_due = 0;
2423
2424 cpi->twopass.frames_to_key = 1;
2425
2426 // Take a copy of the initial frame details
2427 first_frame = *this_frame;
2428
2429 cpi->twopass.kf_group_bits = 0; // Total bits available to kf group
2430 cpi->twopass.kf_group_error_left = 0; // Group modified error score.
2431
2432 kf_mod_err = calculate_modified_err(cpi, this_frame);
2433
2434 // find the next keyframe
2435 i = 0;
2436 while (cpi->twopass.stats_in < cpi->twopass.stats_in_end) {
2437 // Accumulate kf group error
2438 kf_group_err += calculate_modified_err(cpi, this_frame);
2439
2440 // These figures keep intra and coded error counts for all frames including
2441 // key frames in the group. The effect of the key frame itself can be
2442 // subtracted out using the first_frame data collected above.
2443 kf_group_intra_err += this_frame->intra_error;
2444 kf_group_coded_err += this_frame->coded_error;
2445
2446 // load a the next frame's stats
2447 last_frame = *this_frame;
2448 input_stats(cpi, this_frame);
2449
2450 // Provided that we are not at the end of the file...
2451 if (cpi->oxcf.auto_key
2452 && lookup_next_frame_stats(cpi, &next_frame) != EOF) {
2453 // Normal scene cut check
2454 if (test_candidate_kf(cpi, &last_frame, this_frame, &next_frame))
2455 break;
2456
2457
2458 // How fast is prediction quality decaying
2459 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
2460
2461 // We want to know something about the recent past... rather than
2462 // as used elsewhere where we are concened with decay in prediction
2463 // quality since the last GF or KF.
2464 recent_loop_decay[i % 8] = loop_decay_rate;
2465 decay_accumulator = 1.0;
2466 for (j = 0; j < 8; j++)
2467 decay_accumulator *= recent_loop_decay[j];
2468
2469 // Special check for transition or high motion followed by a
2470 // to a static scene.
2471 if (detect_transition_to_still(cpi, i, cpi->key_frame_frequency - i,
2472 loop_decay_rate, decay_accumulator))
2473 break;
2474
2475 // Step on to the next frame
2476 cpi->twopass.frames_to_key++;
2477
2478 // If we don't have a real key frame within the next two
2479 // forcekeyframeevery intervals then break out of the loop.
2480 if (cpi->twopass.frames_to_key >= 2 * (int)cpi->key_frame_frequency)
2481 break;
2482 } else {
2483 cpi->twopass.frames_to_key++;
2484 }
2485 i++;
2486 }
2487
2488 // If there is a max kf interval set by the user we must obey it.
2489 // We already breakout of the loop above at 2x max.
2490 // This code centers the extra kf if the actual natural
2491 // interval is between 1x and 2x
2492 if (cpi->oxcf.auto_key
2493 && cpi->twopass.frames_to_key > (int)cpi->key_frame_frequency) {
2494 FIRSTPASS_STATS *current_pos = cpi->twopass.stats_in;
2495 FIRSTPASS_STATS tmp_frame;
2496
2497 cpi->twopass.frames_to_key /= 2;
2498
2499 // Copy first frame details
2500 tmp_frame = first_frame;
2501
2502 // Reset to the start of the group
2503 reset_fpf_position(cpi, start_position);
2504
2505 kf_group_err = 0;
2506 kf_group_intra_err = 0;
2507 kf_group_coded_err = 0;
2508
2509 // Rescan to get the correct error data for the forced kf group
2510 for (i = 0; i < cpi->twopass.frames_to_key; i++) {
2511 // Accumulate kf group errors
2512 kf_group_err += calculate_modified_err(cpi, &tmp_frame);
2513 kf_group_intra_err += tmp_frame.intra_error;
2514 kf_group_coded_err += tmp_frame.coded_error;
2515
2516 // Load a the next frame's stats
2517 input_stats(cpi, &tmp_frame);
2518 }
2519
2520 // Reset to the start of the group
2521 reset_fpf_position(cpi, current_pos);
2522
2523 cpi->next_key_frame_forced = 1;
2524 } else {
2525 cpi->next_key_frame_forced = 0;
2526 }
2527 // Special case for the last frame of the file
2528 if (cpi->twopass.stats_in >= cpi->twopass.stats_in_end) {
2529 // Accumulate kf group error
2530 kf_group_err += calculate_modified_err(cpi, this_frame);
2531
2532 // These figures keep intra and coded error counts for all frames including
2533 // key frames in the group. The effect of the key frame itself can be
2534 // subtracted out using the first_frame data collected above.
2535 kf_group_intra_err += this_frame->intra_error;
2536 kf_group_coded_err += this_frame->coded_error;
2537 }
2538
2539 // Calculate the number of bits that should be assigned to the kf group.
2540 if ((cpi->twopass.bits_left > 0) &&
2541 (cpi->twopass.modified_error_left > 0.0)) {
2542 // Max for a single normal frame (not key frame)
2543 int max_bits = frame_max_bits(cpi);
2544
2545 // Maximum bits for the kf group
2546 int64_t max_grp_bits;
2547
2548 // Default allocation based on bits left and relative
2549 // complexity of the section
2550 cpi->twopass.kf_group_bits = (int64_t)(cpi->twopass.bits_left *
2551 (kf_group_err /
2552 cpi->twopass.modified_error_left));
2553
2554 // Clip based on maximum per frame rate defined by the user.
2555 max_grp_bits = (int64_t)max_bits * (int64_t)cpi->twopass.frames_to_key;
2556 if (cpi->twopass.kf_group_bits > max_grp_bits)
2557 cpi->twopass.kf_group_bits = max_grp_bits;
2558 } else {
2559 cpi->twopass.kf_group_bits = 0;
2560 }
2561 // Reset the first pass file position
2562 reset_fpf_position(cpi, start_position);
2563
2564 // Determine how big to make this keyframe based on how well the subsequent
2565 // frames use inter blocks.
2566 decay_accumulator = 1.0;
2567 boost_score = 0.0;
2568 loop_decay_rate = 1.00; // Starting decay rate
2569
2570 // Scan through the kf group collating various stats.
2571 for (i = 0; i < cpi->twopass.frames_to_key; i++) {
2572 double r;
2573
2574 if (EOF == input_stats(cpi, &next_frame))
2575 break;
2576
2577 // Monitor for static sections.
2578 if ((next_frame.pcnt_inter - next_frame.pcnt_motion) <
2579 zero_motion_accumulator) {
2580 zero_motion_accumulator =
2581 (next_frame.pcnt_inter - next_frame.pcnt_motion);
2582 }
2583
2584 // For the first few frames collect data to decide kf boost.
2585 if (i <= (cpi->max_gf_interval * 2)) {
2586 if (next_frame.intra_error > cpi->twopass.kf_intra_err_min)
2587 r = (IIKFACTOR2 * next_frame.intra_error /
2588 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
2589 else
2590 r = (IIKFACTOR2 * cpi->twopass.kf_intra_err_min /
2591 DOUBLE_DIVIDE_CHECK(next_frame.coded_error));
2592
2593 if (r > RMAX)
2594 r = RMAX;
2595
2596 // How fast is prediction quality decaying
2597 if (!detect_flash(cpi, 0)) {
2598 loop_decay_rate = get_prediction_decay_rate(cpi, &next_frame);
2599 decay_accumulator = decay_accumulator * loop_decay_rate;
2600 decay_accumulator = decay_accumulator < MIN_DECAY_FACTOR
2601 ? MIN_DECAY_FACTOR : decay_accumulator;
2602 }
2603
2604 boost_score += (decay_accumulator * r);
2605 }
2606 }
2607
2608 {
2609 FIRSTPASS_STATS sectionstats;
2610
2611 zero_stats(&sectionstats);
2612 reset_fpf_position(cpi, start_position);
2613
2614 for (i = 0; i < cpi->twopass.frames_to_key; i++) {
2615 input_stats(cpi, &next_frame);
2616 accumulate_stats(&sectionstats, &next_frame);
2617 }
2618
2619 avg_stats(&sectionstats);
2620
2621 cpi->twopass.section_intra_rating = (int)
2622 (sectionstats.intra_error
2623 / DOUBLE_DIVIDE_CHECK(sectionstats.coded_error));
2624 }
2625
2626 // Reset the first pass file position
2627 reset_fpf_position(cpi, start_position);
2628
2629 // Work out how many bits to allocate for the key frame itself
2630 if (1) {
2631 int kf_boost = (int)boost_score;
2632 int allocation_chunks;
2633 int alt_kf_bits;
2634
2635 if (kf_boost < (cpi->twopass.frames_to_key * 3))
2636 kf_boost = (cpi->twopass.frames_to_key * 3);
2637
2638 if (kf_boost < 300) // Min KF boost
2639 kf_boost = 300;
2640
2641 // Make a note of baseline boost and the zero motion
2642 // accumulator value for use elsewhere.
2643 cpi->kf_boost = kf_boost;
2644 cpi->kf_zeromotion_pct = (int)(zero_motion_accumulator * 100.0);
2645
2646 // We do three calculations for kf size.
2647 // The first is based on the error score for the whole kf group.
2648 // The second (optionaly) on the key frames own error if this is
2649 // smaller than the average for the group.
2650 // The final one insures that the frame receives at least the
2651 // allocation it would have received based on its own error score vs
2652 // the error score remaining
2653 // Special case if the sequence appears almost totaly static
2654 // In this case we want to spend almost all of the bits on the
2655 // key frame.
2656 // cpi->twopass.frames_to_key-1 because key frame itself is taken
2657 // care of by kf_boost.
2658 if (zero_motion_accumulator >= 0.99) {
2659 allocation_chunks =
2660 ((cpi->twopass.frames_to_key - 1) * 10) + kf_boost;
2661 } else {
2662 allocation_chunks =
2663 ((cpi->twopass.frames_to_key - 1) * 100) + kf_boost;
2664 }
2665
2666 // Prevent overflow
2667 if (kf_boost > 1028) {
2668 int divisor = kf_boost >> 10;
2669 kf_boost /= divisor;
2670 allocation_chunks /= divisor;
2671 }
2672
2673 cpi->twopass.kf_group_bits =
2674 (cpi->twopass.kf_group_bits < 0) ? 0 : cpi->twopass.kf_group_bits;
2675
2676 // Calculate the number of bits to be spent on the key frame
2677 cpi->twopass.kf_bits =
2678 (int)((double)kf_boost *
2679 ((double)cpi->twopass.kf_group_bits / (double)allocation_chunks));
2680
2681 // If the key frame is actually easier than the average for the
2682 // kf group (which does sometimes happen... eg a blank intro frame)
2683 // Then use an alternate calculation based on the kf error score
2684 // which should give a smaller key frame.
2685 if (kf_mod_err < kf_group_err / cpi->twopass.frames_to_key) {
2686 double alt_kf_grp_bits =
2687 ((double)cpi->twopass.bits_left *
2688 (kf_mod_err * (double)cpi->twopass.frames_to_key) /
2689 DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left));
2690
2691 alt_kf_bits = (int)((double)kf_boost *
2692 (alt_kf_grp_bits / (double)allocation_chunks));
2693
2694 if (cpi->twopass.kf_bits > alt_kf_bits) {
2695 cpi->twopass.kf_bits = alt_kf_bits;
2696 }
2697 } else {
2698 // Else if it is much harder than other frames in the group make sure
2699 // it at least receives an allocation in keeping with its relative
2700 // error score
2701 alt_kf_bits =
2702 (int)((double)cpi->twopass.bits_left *
2703 (kf_mod_err /
2704 DOUBLE_DIVIDE_CHECK(cpi->twopass.modified_error_left)));
2705
2706 if (alt_kf_bits > cpi->twopass.kf_bits) {
2707 cpi->twopass.kf_bits = alt_kf_bits;
2708 }
2709 }
2710
2711 cpi->twopass.kf_group_bits -= cpi->twopass.kf_bits;
2712 // Add in the minimum frame allowance
2713 cpi->twopass.kf_bits += cpi->min_frame_bandwidth;
2714
2715 // Peer frame bit target for this frame
2716 cpi->per_frame_bandwidth = cpi->twopass.kf_bits;
2717 // Convert to a per second bitrate
2718 cpi->target_bandwidth = (int)(cpi->twopass.kf_bits *
2719 cpi->output_framerate);
2720 }
2721
2722 // Note the total error score of the kf group minus the key frame itself
2723 cpi->twopass.kf_group_error_left = (int)(kf_group_err - kf_mod_err);
2724
2725 // Adjust the count of total modified error left.
2726 // The count of bits left is adjusted elsewhere based on real coded frame
2727 // sizes.
2728 cpi->twopass.modified_error_left -= kf_group_err;
2729 }

mercurial