Coverage Report

Created: 2024-09-06 07:53

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