Coverage Report

Created: 2026-07-30 06:32

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libvpx/vp9/encoder/vp9_encoder.c
Line
Count
Source
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 <limits.h>
12
#include <math.h>
13
#include <stdint.h>
14
#include <stdio.h>
15
#include <stdlib.h>
16
#include <string.h>
17
18
#include "./vp9_rtcd.h"
19
#include "./vpx_config.h"
20
#include "./vpx_dsp_rtcd.h"
21
#include "./vpx_scale_rtcd.h"
22
#include "vpx/vpx_codec.h"
23
#include "vpx/vpx_ext_ratectrl.h"
24
#include "vpx_dsp/psnr.h"
25
#include "vpx_dsp/vpx_dsp_common.h"
26
#include "vpx_dsp/vpx_filter.h"
27
#if CONFIG_INTERNAL_STATS
28
#include "vpx_dsp/ssim.h"
29
#endif
30
#include "vpx_mem/vpx_mem.h"
31
#include "vpx_ports/mem.h"
32
#include "vpx_ports/system_state.h"
33
#include "vpx_ports/vpx_once.h"
34
#include "vpx_ports/vpx_timer.h"
35
#include "vpx_util/vpx_pthread.h"
36
#if CONFIG_BITSTREAM_DEBUG || CONFIG_MISMATCH_DEBUG
37
#include "vpx_util/vpx_debug_util.h"
38
#endif  // CONFIG_BITSTREAM_DEBUG || CONFIG_MISMATCH_DEBUG
39
40
#include "vp9/common/vp9_alloccommon.h"
41
#include "vp9/common/vp9_blockd.h"
42
#include "vp9/common/vp9_enums.h"
43
#include "vp9/common/vp9_filter.h"
44
#include "vp9/common/vp9_idct.h"
45
#if CONFIG_VP9_POSTPROC
46
#include "vp9/common/vp9_postproc.h"
47
#endif
48
#include "vp9/common/vp9_reconinter.h"
49
#include "vp9/common/vp9_reconintra.h"
50
#include "vp9/common/vp9_scale.h"
51
#include "vp9/common/vp9_tile_common.h"
52
53
#if !CONFIG_REALTIME_ONLY
54
#include "vp9/encoder/vp9_alt_ref_aq.h"
55
#include "vp9/encoder/vp9_aq_360.h"
56
#include "vp9/encoder/vp9_aq_complexity.h"
57
#endif
58
#include "vp9/encoder/vp9_aq_cyclicrefresh.h"
59
#if !CONFIG_REALTIME_ONLY
60
#include "vp9/encoder/vp9_aq_variance.h"
61
#endif
62
#include "vp9/encoder/vp9_bitstream.h"
63
#if CONFIG_INTERNAL_STATS
64
#include "vp9/encoder/vp9_blockiness.h"
65
#endif
66
#include "vp9/encoder/vp9_context_tree.h"
67
#include "vp9/encoder/vp9_encodeframe.h"
68
#include "vp9/encoder/vp9_encodemb.h"
69
#include "vp9/encoder/vp9_encodemv.h"
70
#include "vp9/encoder/vp9_encoder.h"
71
#include "vp9/encoder/vp9_ethread.h"
72
#include "vp9/encoder/vp9_extend.h"
73
#include "vp9/encoder/vp9_firstpass.h"
74
#include "vp9/encoder/vp9_mbgraph.h"
75
#if CONFIG_NON_GREEDY_MV
76
#include "vp9/encoder/vp9_mcomp.h"
77
#endif
78
#include "vp9/encoder/vp9_multi_thread.h"
79
#include "vp9/encoder/vp9_noise_estimate.h"
80
#include "vp9/encoder/vp9_picklpf.h"
81
#include "vp9/encoder/vp9_quantize.h"
82
#include "vp9/encoder/vp9_ratectrl.h"
83
#include "vp9/encoder/vp9_rd.h"
84
#include "vp9/encoder/vp9_resize.h"
85
#include "vp9/encoder/vp9_segmentation.h"
86
#include "vp9/encoder/vp9_skin_detection.h"
87
#include "vp9/encoder/vp9_speed_features.h"
88
#include "vp9/encoder/vp9_svc_layercontext.h"
89
#include "vp9/encoder/vp9_temporal_filter.h"
90
#include "vp9/encoder/vp9_tpl_model.h"
91
#include "vp9/vp9_cx_iface.h"
92
93
55.8k
#define AM_SEGMENT_ID_INACTIVE 7
94
0
#define AM_SEGMENT_ID_ACTIVE 0
95
96
// Whether to use high precision mv for altref computation.
97
918k
#define ALTREF_HIGH_PRECISION_MV 1
98
99
// Q threshold for high precision mv. Choose a very high value for now so that
100
// HIGH_PRECISION is always chosen.
101
426k
#define HIGH_PRECISION_MV_QTHRESH 200
102
103
0
#define FRAME_SIZE_FACTOR 128  // empirical params for context model threshold
104
0
#define FRAME_RATE_FACTOR 8
105
106
#ifdef OUTPUT_YUV_DENOISED
107
FILE *yuv_denoised_file = NULL;
108
#endif
109
#ifdef OUTPUT_YUV_SKINMAP
110
static FILE *yuv_skinmap_file = NULL;
111
#endif
112
#ifdef OUTPUT_YUV_REC
113
FILE *yuv_rec_file;
114
#endif
115
#ifdef OUTPUT_YUV_SVC_SRC
116
FILE *yuv_svc_src[3] = { NULL, NULL, NULL };
117
#endif
118
119
#if 0
120
FILE *framepsnr;
121
FILE *kf_list;
122
FILE *keyfile;
123
#endif
124
125
#ifdef ENABLE_KF_DENOISE
126
// Test condition for spatial denoise of source.
127
static int is_spatial_denoise_enabled(VP9_COMP *cpi) {
128
  VP9_COMMON *const cm = &cpi->common;
129
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
130
131
  return (oxcf->pass != 1) && !is_lossless_requested(&cpi->oxcf) &&
132
         frame_is_intra_only(cm);
133
}
134
#endif
135
136
#if !CONFIG_REALTIME_ONLY
137
// compute adaptive threshold for skip recoding
138
0
static int compute_context_model_thresh(const VP9_COMP *const cpi) {
139
0
  const VP9_COMMON *const cm = &cpi->common;
140
0
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
141
0
  const int frame_size = (cm->width * cm->height) >> 10;
142
0
  const int bitrate = (int)(oxcf->target_bandwidth >> 10);
143
0
  const int qindex_factor = cm->base_qindex + (MAXQ >> 1);
144
145
  // This equation makes the threshold adaptive to frame size.
146
  // Coding gain obtained by recoding comes from alternate frames of large
147
  // content change. We skip recoding if the difference of previous and current
148
  // frame context probability model is less than a certain threshold.
149
  // The first component is the most critical part to guarantee adaptivity.
150
  // Other parameters are estimated based on normal setting of hd resolution
151
  // parameters. e.g. frame_size = 1920x1080, bitrate = 8000, qindex_factor < 50
152
0
  const int thresh =
153
0
      ((FRAME_SIZE_FACTOR * frame_size - FRAME_RATE_FACTOR * bitrate) *
154
0
       qindex_factor) >>
155
0
      9;
156
157
0
  return thresh;
158
0
}
159
160
// compute the total cost difference between current
161
// and previous frame context prob model.
162
0
static int compute_context_model_diff(const VP9_COMMON *const cm) {
163
0
  const FRAME_CONTEXT *const pre_fc =
164
0
      &cm->frame_contexts[cm->frame_context_idx];
165
0
  const FRAME_CONTEXT *const cur_fc = cm->fc;
166
0
  const FRAME_COUNTS *counts = &cm->counts;
167
0
  vpx_prob pre_last_prob, cur_last_prob;
168
0
  int diff = 0;
169
0
  int i, j, k, l, m, n;
170
171
  // y_mode_prob
172
0
  for (i = 0; i < BLOCK_SIZE_GROUPS; ++i) {
173
0
    for (j = 0; j < INTRA_MODES - 1; ++j) {
174
0
      diff += (int)counts->y_mode[i][j] *
175
0
              (pre_fc->y_mode_prob[i][j] - cur_fc->y_mode_prob[i][j]);
176
0
    }
177
0
    pre_last_prob = MAX_PROB - pre_fc->y_mode_prob[i][INTRA_MODES - 2];
178
0
    cur_last_prob = MAX_PROB - cur_fc->y_mode_prob[i][INTRA_MODES - 2];
179
180
0
    diff += (int)counts->y_mode[i][INTRA_MODES - 1] *
181
0
            (pre_last_prob - cur_last_prob);
182
0
  }
183
184
  // uv_mode_prob
185
0
  for (i = 0; i < INTRA_MODES; ++i) {
186
0
    for (j = 0; j < INTRA_MODES - 1; ++j) {
187
0
      diff += (int)counts->uv_mode[i][j] *
188
0
              (pre_fc->uv_mode_prob[i][j] - cur_fc->uv_mode_prob[i][j]);
189
0
    }
190
0
    pre_last_prob = MAX_PROB - pre_fc->uv_mode_prob[i][INTRA_MODES - 2];
191
0
    cur_last_prob = MAX_PROB - cur_fc->uv_mode_prob[i][INTRA_MODES - 2];
192
193
0
    diff += (int)counts->uv_mode[i][INTRA_MODES - 1] *
194
0
            (pre_last_prob - cur_last_prob);
195
0
  }
196
197
  // partition_prob
198
0
  for (i = 0; i < PARTITION_CONTEXTS; ++i) {
199
0
    for (j = 0; j < PARTITION_TYPES - 1; ++j) {
200
0
      diff += (int)counts->partition[i][j] *
201
0
              (pre_fc->partition_prob[i][j] - cur_fc->partition_prob[i][j]);
202
0
    }
203
0
    pre_last_prob = MAX_PROB - pre_fc->partition_prob[i][PARTITION_TYPES - 2];
204
0
    cur_last_prob = MAX_PROB - cur_fc->partition_prob[i][PARTITION_TYPES - 2];
205
206
0
    diff += (int)counts->partition[i][PARTITION_TYPES - 1] *
207
0
            (pre_last_prob - cur_last_prob);
208
0
  }
209
210
  // coef_probs
211
0
  for (i = 0; i < TX_SIZES; ++i) {
212
0
    for (j = 0; j < PLANE_TYPES; ++j) {
213
0
      for (k = 0; k < REF_TYPES; ++k) {
214
0
        for (l = 0; l < COEF_BANDS; ++l) {
215
0
          for (m = 0; m < BAND_COEFF_CONTEXTS(l); ++m) {
216
0
            for (n = 0; n < UNCONSTRAINED_NODES; ++n) {
217
0
              diff += (int)counts->coef[i][j][k][l][m][n] *
218
0
                      (pre_fc->coef_probs[i][j][k][l][m][n] -
219
0
                       cur_fc->coef_probs[i][j][k][l][m][n]);
220
0
            }
221
222
0
            pre_last_prob =
223
0
                MAX_PROB -
224
0
                pre_fc->coef_probs[i][j][k][l][m][UNCONSTRAINED_NODES - 1];
225
0
            cur_last_prob =
226
0
                MAX_PROB -
227
0
                cur_fc->coef_probs[i][j][k][l][m][UNCONSTRAINED_NODES - 1];
228
229
0
            diff += (int)counts->coef[i][j][k][l][m][UNCONSTRAINED_NODES] *
230
0
                    (pre_last_prob - cur_last_prob);
231
0
          }
232
0
        }
233
0
      }
234
0
    }
235
0
  }
236
237
  // switchable_interp_prob
238
0
  for (i = 0; i < SWITCHABLE_FILTER_CONTEXTS; ++i) {
239
0
    for (j = 0; j < SWITCHABLE_FILTERS - 1; ++j) {
240
0
      diff += (int)counts->switchable_interp[i][j] *
241
0
              (pre_fc->switchable_interp_prob[i][j] -
242
0
               cur_fc->switchable_interp_prob[i][j]);
243
0
    }
244
0
    pre_last_prob =
245
0
        MAX_PROB - pre_fc->switchable_interp_prob[i][SWITCHABLE_FILTERS - 2];
246
0
    cur_last_prob =
247
0
        MAX_PROB - cur_fc->switchable_interp_prob[i][SWITCHABLE_FILTERS - 2];
248
249
0
    diff += (int)counts->switchable_interp[i][SWITCHABLE_FILTERS - 1] *
250
0
            (pre_last_prob - cur_last_prob);
251
0
  }
252
253
  // inter_mode_probs
254
0
  for (i = 0; i < INTER_MODE_CONTEXTS; ++i) {
255
0
    for (j = 0; j < INTER_MODES - 1; ++j) {
256
0
      diff += (int)counts->inter_mode[i][j] *
257
0
              (pre_fc->inter_mode_probs[i][j] - cur_fc->inter_mode_probs[i][j]);
258
0
    }
259
0
    pre_last_prob = MAX_PROB - pre_fc->inter_mode_probs[i][INTER_MODES - 2];
260
0
    cur_last_prob = MAX_PROB - cur_fc->inter_mode_probs[i][INTER_MODES - 2];
261
262
0
    diff += (int)counts->inter_mode[i][INTER_MODES - 1] *
263
0
            (pre_last_prob - cur_last_prob);
264
0
  }
265
266
  // intra_inter_prob
267
0
  for (i = 0; i < INTRA_INTER_CONTEXTS; ++i) {
268
0
    diff += (int)counts->intra_inter[i][0] *
269
0
            (pre_fc->intra_inter_prob[i] - cur_fc->intra_inter_prob[i]);
270
271
0
    pre_last_prob = MAX_PROB - pre_fc->intra_inter_prob[i];
272
0
    cur_last_prob = MAX_PROB - cur_fc->intra_inter_prob[i];
273
274
0
    diff += (int)counts->intra_inter[i][1] * (pre_last_prob - cur_last_prob);
275
0
  }
276
277
  // comp_inter_prob
278
0
  for (i = 0; i < COMP_INTER_CONTEXTS; ++i) {
279
0
    diff += (int)counts->comp_inter[i][0] *
280
0
            (pre_fc->comp_inter_prob[i] - cur_fc->comp_inter_prob[i]);
281
282
0
    pre_last_prob = MAX_PROB - pre_fc->comp_inter_prob[i];
283
0
    cur_last_prob = MAX_PROB - cur_fc->comp_inter_prob[i];
284
285
0
    diff += (int)counts->comp_inter[i][1] * (pre_last_prob - cur_last_prob);
286
0
  }
287
288
  // single_ref_prob
289
0
  for (i = 0; i < REF_CONTEXTS; ++i) {
290
0
    for (j = 0; j < 2; ++j) {
291
0
      diff += (int)counts->single_ref[i][j][0] *
292
0
              (pre_fc->single_ref_prob[i][j] - cur_fc->single_ref_prob[i][j]);
293
294
0
      pre_last_prob = MAX_PROB - pre_fc->single_ref_prob[i][j];
295
0
      cur_last_prob = MAX_PROB - cur_fc->single_ref_prob[i][j];
296
297
0
      diff +=
298
0
          (int)counts->single_ref[i][j][1] * (pre_last_prob - cur_last_prob);
299
0
    }
300
0
  }
301
302
  // comp_ref_prob
303
0
  for (i = 0; i < REF_CONTEXTS; ++i) {
304
0
    diff += (int)counts->comp_ref[i][0] *
305
0
            (pre_fc->comp_ref_prob[i] - cur_fc->comp_ref_prob[i]);
306
307
0
    pre_last_prob = MAX_PROB - pre_fc->comp_ref_prob[i];
308
0
    cur_last_prob = MAX_PROB - cur_fc->comp_ref_prob[i];
309
310
0
    diff += (int)counts->comp_ref[i][1] * (pre_last_prob - cur_last_prob);
311
0
  }
312
313
  // tx_probs
314
0
  for (i = 0; i < TX_SIZE_CONTEXTS; ++i) {
315
    // p32x32
316
0
    for (j = 0; j < TX_SIZES - 1; ++j) {
317
0
      diff += (int)counts->tx.p32x32[i][j] *
318
0
              (pre_fc->tx_probs.p32x32[i][j] - cur_fc->tx_probs.p32x32[i][j]);
319
0
    }
320
0
    pre_last_prob = MAX_PROB - pre_fc->tx_probs.p32x32[i][TX_SIZES - 2];
321
0
    cur_last_prob = MAX_PROB - cur_fc->tx_probs.p32x32[i][TX_SIZES - 2];
322
323
0
    diff += (int)counts->tx.p32x32[i][TX_SIZES - 1] *
324
0
            (pre_last_prob - cur_last_prob);
325
326
    // p16x16
327
0
    for (j = 0; j < TX_SIZES - 2; ++j) {
328
0
      diff += (int)counts->tx.p16x16[i][j] *
329
0
              (pre_fc->tx_probs.p16x16[i][j] - cur_fc->tx_probs.p16x16[i][j]);
330
0
    }
331
0
    pre_last_prob = MAX_PROB - pre_fc->tx_probs.p16x16[i][TX_SIZES - 3];
332
0
    cur_last_prob = MAX_PROB - cur_fc->tx_probs.p16x16[i][TX_SIZES - 3];
333
334
0
    diff += (int)counts->tx.p16x16[i][TX_SIZES - 2] *
335
0
            (pre_last_prob - cur_last_prob);
336
337
    // p8x8
338
0
    for (j = 0; j < TX_SIZES - 3; ++j) {
339
0
      diff += (int)counts->tx.p8x8[i][j] *
340
0
              (pre_fc->tx_probs.p8x8[i][j] - cur_fc->tx_probs.p8x8[i][j]);
341
0
    }
342
0
    pre_last_prob = MAX_PROB - pre_fc->tx_probs.p8x8[i][TX_SIZES - 4];
343
0
    cur_last_prob = MAX_PROB - cur_fc->tx_probs.p8x8[i][TX_SIZES - 4];
344
345
0
    diff +=
346
0
        (int)counts->tx.p8x8[i][TX_SIZES - 3] * (pre_last_prob - cur_last_prob);
347
0
  }
348
349
  // skip_probs
350
0
  for (i = 0; i < SKIP_CONTEXTS; ++i) {
351
0
    diff += (int)counts->skip[i][0] *
352
0
            (pre_fc->skip_probs[i] - cur_fc->skip_probs[i]);
353
354
0
    pre_last_prob = MAX_PROB - pre_fc->skip_probs[i];
355
0
    cur_last_prob = MAX_PROB - cur_fc->skip_probs[i];
356
357
0
    diff += (int)counts->skip[i][1] * (pre_last_prob - cur_last_prob);
358
0
  }
359
360
  // mv
361
0
  for (i = 0; i < MV_JOINTS - 1; ++i) {
362
0
    diff += (int)counts->mv.joints[i] *
363
0
            (pre_fc->nmvc.joints[i] - cur_fc->nmvc.joints[i]);
364
0
  }
365
0
  pre_last_prob = MAX_PROB - pre_fc->nmvc.joints[MV_JOINTS - 2];
366
0
  cur_last_prob = MAX_PROB - cur_fc->nmvc.joints[MV_JOINTS - 2];
367
368
0
  diff +=
369
0
      (int)counts->mv.joints[MV_JOINTS - 1] * (pre_last_prob - cur_last_prob);
370
371
0
  for (i = 0; i < 2; ++i) {
372
0
    const nmv_component_counts *nmv_count = &counts->mv.comps[i];
373
0
    const nmv_component *pre_nmv_prob = &pre_fc->nmvc.comps[i];
374
0
    const nmv_component *cur_nmv_prob = &cur_fc->nmvc.comps[i];
375
376
    // sign
377
0
    diff += (int)nmv_count->sign[0] * (pre_nmv_prob->sign - cur_nmv_prob->sign);
378
379
0
    pre_last_prob = MAX_PROB - pre_nmv_prob->sign;
380
0
    cur_last_prob = MAX_PROB - cur_nmv_prob->sign;
381
382
0
    diff += (int)nmv_count->sign[1] * (pre_last_prob - cur_last_prob);
383
384
    // classes
385
0
    for (j = 0; j < MV_CLASSES - 1; ++j) {
386
0
      diff += (int)nmv_count->classes[j] *
387
0
              (pre_nmv_prob->classes[j] - cur_nmv_prob->classes[j]);
388
0
    }
389
0
    pre_last_prob = MAX_PROB - pre_nmv_prob->classes[MV_CLASSES - 2];
390
0
    cur_last_prob = MAX_PROB - cur_nmv_prob->classes[MV_CLASSES - 2];
391
392
0
    diff += (int)nmv_count->classes[MV_CLASSES - 1] *
393
0
            (pre_last_prob - cur_last_prob);
394
395
    // class0
396
0
    for (j = 0; j < CLASS0_SIZE - 1; ++j) {
397
0
      diff += (int)nmv_count->class0[j] *
398
0
              (pre_nmv_prob->class0[j] - cur_nmv_prob->class0[j]);
399
0
    }
400
0
    pre_last_prob = MAX_PROB - pre_nmv_prob->class0[CLASS0_SIZE - 2];
401
0
    cur_last_prob = MAX_PROB - cur_nmv_prob->class0[CLASS0_SIZE - 2];
402
403
0
    diff += (int)nmv_count->class0[CLASS0_SIZE - 1] *
404
0
            (pre_last_prob - cur_last_prob);
405
406
    // bits
407
0
    for (j = 0; j < MV_OFFSET_BITS; ++j) {
408
0
      diff += (int)nmv_count->bits[j][0] *
409
0
              (pre_nmv_prob->bits[j] - cur_nmv_prob->bits[j]);
410
411
0
      pre_last_prob = MAX_PROB - pre_nmv_prob->bits[j];
412
0
      cur_last_prob = MAX_PROB - cur_nmv_prob->bits[j];
413
414
0
      diff += (int)nmv_count->bits[j][1] * (pre_last_prob - cur_last_prob);
415
0
    }
416
417
    // class0_fp
418
0
    for (j = 0; j < CLASS0_SIZE; ++j) {
419
0
      for (k = 0; k < MV_FP_SIZE - 1; ++k) {
420
0
        diff += (int)nmv_count->class0_fp[j][k] *
421
0
                (pre_nmv_prob->class0_fp[j][k] - cur_nmv_prob->class0_fp[j][k]);
422
0
      }
423
0
      pre_last_prob = MAX_PROB - pre_nmv_prob->class0_fp[j][MV_FP_SIZE - 2];
424
0
      cur_last_prob = MAX_PROB - cur_nmv_prob->class0_fp[j][MV_FP_SIZE - 2];
425
426
0
      diff += (int)nmv_count->class0_fp[j][MV_FP_SIZE - 1] *
427
0
              (pre_last_prob - cur_last_prob);
428
0
    }
429
430
    // fp
431
0
    for (j = 0; j < MV_FP_SIZE - 1; ++j) {
432
0
      diff +=
433
0
          (int)nmv_count->fp[j] * (pre_nmv_prob->fp[j] - cur_nmv_prob->fp[j]);
434
0
    }
435
0
    pre_last_prob = MAX_PROB - pre_nmv_prob->fp[MV_FP_SIZE - 2];
436
0
    cur_last_prob = MAX_PROB - cur_nmv_prob->fp[MV_FP_SIZE - 2];
437
438
0
    diff +=
439
0
        (int)nmv_count->fp[MV_FP_SIZE - 1] * (pre_last_prob - cur_last_prob);
440
441
    // class0_hp
442
0
    diff += (int)nmv_count->class0_hp[0] *
443
0
            (pre_nmv_prob->class0_hp - cur_nmv_prob->class0_hp);
444
445
0
    pre_last_prob = MAX_PROB - pre_nmv_prob->class0_hp;
446
0
    cur_last_prob = MAX_PROB - cur_nmv_prob->class0_hp;
447
448
0
    diff += (int)nmv_count->class0_hp[1] * (pre_last_prob - cur_last_prob);
449
450
    // hp
451
0
    diff += (int)nmv_count->hp[0] * (pre_nmv_prob->hp - cur_nmv_prob->hp);
452
453
0
    pre_last_prob = MAX_PROB - pre_nmv_prob->hp;
454
0
    cur_last_prob = MAX_PROB - cur_nmv_prob->hp;
455
456
0
    diff += (int)nmv_count->hp[1] * (pre_last_prob - cur_last_prob);
457
0
  }
458
459
0
  return -diff;
460
0
}
461
#endif  // !CONFIG_REALTIME_ONLY
462
463
// Test for whether to calculate metrics for the frame.
464
908k
static int is_psnr_calc_enabled(const VP9_COMP *cpi) {
465
908k
  const VP9_COMMON *const cm = &cpi->common;
466
908k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
467
468
908k
  return cpi->b_calculate_psnr && (oxcf->pass != 1) && cm->show_frame;
469
908k
}
470
471
/* clang-format off */
472
const Vp9LevelSpec vp9_level_defs[VP9_LEVELS] = {
473
  //         sample rate    size   breadth  bitrate  cpb
474
  { LEVEL_1,   829440,      36864,    512,   200,    400,    2, 1,  4,  8 },
475
  { LEVEL_1_1, 2764800,     73728,    768,   800,    1000,   2, 1,  4,  8 },
476
  { LEVEL_2,   4608000,     122880,   960,   1800,   1500,   2, 1,  4,  8 },
477
  { LEVEL_2_1, 9216000,     245760,   1344,  3600,   2800,   2, 2,  4,  8 },
478
  { LEVEL_3,   20736000,    552960,   2048,  7200,   6000,   2, 4,  4,  8 },
479
  { LEVEL_3_1, 36864000,    983040,   2752,  12000,  10000,  2, 4,  4,  8 },
480
  { LEVEL_4,   83558400,    2228224,  4160,  18000,  16000,  4, 4,  4,  8 },
481
  { LEVEL_4_1, 160432128,   2228224,  4160,  30000,  18000,  4, 4,  5,  6 },
482
  { LEVEL_5,   311951360,   8912896,  8384,  60000,  36000,  6, 8,  6,  4 },
483
  { LEVEL_5_1, 588251136,   8912896,  8384,  120000, 46000,  8, 8,  10, 4 },
484
  // TODO(huisu): update max_cpb_size for level 5_2 ~ 6_2 when
485
  // they are finalized (currently tentative).
486
  { LEVEL_5_2, 1176502272,  8912896,  8384,  180000, 90000,  8, 8,  10, 4 },
487
  { LEVEL_6,   1176502272,  35651584, 16832, 180000, 90000,  8, 16, 10, 4 },
488
  { LEVEL_6_1, 2353004544u, 35651584, 16832, 240000, 180000, 8, 16, 10, 4 },
489
  { LEVEL_6_2, 4706009088u, 35651584, 16832, 480000, 360000, 8, 16, 10, 4 },
490
};
491
/* clang-format on */
492
493
static const char *level_fail_messages[TARGET_LEVEL_FAIL_IDS] = {
494
  "The average bit-rate is too high.",
495
  "The picture size is too large.",
496
  "The picture width/height is too large.",
497
  "The luma sample rate is too large.",
498
  "The CPB size is too large.",
499
  "The compression ratio is too small",
500
  "Too many column tiles are used.",
501
  "The alt-ref distance is too small.",
502
  "Too many reference buffers are used."
503
};
504
505
0
static INLINE void Scale2Ratio(VPX_SCALING_MODE mode, int *hr, int *hs) {
506
0
  switch (mode) {
507
0
    case VP8E_NORMAL:
508
0
      *hr = 1;
509
0
      *hs = 1;
510
0
      break;
511
0
    case VP8E_FOURFIVE:
512
0
      *hr = 4;
513
0
      *hs = 5;
514
0
      break;
515
0
    case VP8E_THREEFIVE:
516
0
      *hr = 3;
517
0
      *hs = 5;
518
0
      break;
519
0
    default:
520
0
      assert(mode == VP8E_ONETWO);
521
0
      *hr = 1;
522
0
      *hs = 2;
523
0
      break;
524
0
  }
525
0
}
526
527
// Mark all inactive blocks as active. Other segmentation features may be set
528
// so memset cannot be used, instead only inactive blocks should be reset.
529
454k
static void suppress_active_map(VP9_COMP *cpi) {
530
454k
  unsigned char *const seg_map = cpi->segmentation_map;
531
532
454k
  if (cpi->active_map.enabled || cpi->active_map.update) {
533
0
    const int rows = cpi->common.mi_rows;
534
0
    const int cols = cpi->common.mi_cols;
535
0
    int i;
536
537
0
    for (i = 0; i < rows * cols; ++i)
538
0
      if (seg_map[i] == AM_SEGMENT_ID_INACTIVE)
539
0
        seg_map[i] = AM_SEGMENT_ID_ACTIVE;
540
0
  }
541
454k
}
542
543
454k
static void apply_active_map(VP9_COMP *cpi) {
544
454k
  struct segmentation *const seg = &cpi->common.seg;
545
454k
  unsigned char *const seg_map = cpi->segmentation_map;
546
454k
  const unsigned char *const active_map = cpi->active_map.map;
547
454k
  int i;
548
549
454k
  assert(AM_SEGMENT_ID_ACTIVE == CR_SEGMENT_ID_BASE);
550
551
454k
  if (frame_is_intra_only(&cpi->common)) {
552
27.9k
    cpi->active_map.enabled = 0;
553
27.9k
    cpi->active_map.update = 1;
554
27.9k
  }
555
556
454k
  if (cpi->active_map.update) {
557
27.9k
    if (cpi->active_map.enabled) {
558
0
      for (i = 0; i < cpi->common.mi_rows * cpi->common.mi_cols; ++i)
559
0
        if (seg_map[i] == AM_SEGMENT_ID_ACTIVE) seg_map[i] = active_map[i];
560
0
      vp9_enable_segmentation(seg);
561
0
      vp9_enable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_SKIP);
562
0
      vp9_enable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_ALT_LF);
563
      // Setting the data to -MAX_LOOP_FILTER will result in the computed loop
564
      // filter level being zero regardless of the value of seg->abs_delta.
565
0
      vp9_set_segdata(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_ALT_LF,
566
0
                      -MAX_LOOP_FILTER);
567
27.9k
    } else {
568
27.9k
      vp9_disable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_SKIP);
569
27.9k
      vp9_disable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_ALT_LF);
570
27.9k
      if (seg->enabled) {
571
0
        seg->update_data = 1;
572
0
        seg->update_map = 1;
573
0
      }
574
27.9k
    }
575
27.9k
    cpi->active_map.update = 0;
576
27.9k
  }
577
454k
}
578
579
0
static void apply_roi_map(VP9_COMP *cpi) {
580
0
  VP9_COMMON *cm = &cpi->common;
581
0
  struct segmentation *const seg = &cm->seg;
582
0
  vpx_roi_map_t *roi = &cpi->roi;
583
0
  const int *delta_q = roi->delta_q;
584
0
  const int *delta_lf = roi->delta_lf;
585
0
  const int *skip = roi->skip;
586
0
  int ref_frame[8];
587
0
  int internal_delta_q[MAX_SEGMENTS];
588
0
  int i;
589
590
  // TODO(jianj): Investigate why ROI not working in speed < 5 or in non
591
  // realtime mode.
592
0
  if (cpi->oxcf.mode != REALTIME || cpi->oxcf.speed < 5) return;
593
0
  if (!roi->enabled) return;
594
595
0
  memcpy(&ref_frame, roi->ref_frame, sizeof(ref_frame));
596
597
0
  vp9_enable_segmentation(seg);
598
0
  vp9_clearall_segfeatures(seg);
599
  // Select delta coding method;
600
0
  seg->abs_delta = SEGMENT_DELTADATA;
601
602
0
  memcpy(cpi->segmentation_map, roi->roi_map, (cm->mi_rows * cm->mi_cols));
603
604
0
  for (i = 0; i < MAX_SEGMENTS; ++i) {
605
    // Translate the external delta q values to internal values.
606
0
    internal_delta_q[i] = vp9_quantizer_to_qindex(abs(delta_q[i]));
607
0
    if (delta_q[i] < 0) internal_delta_q[i] = -internal_delta_q[i];
608
0
    vp9_disable_segfeature(seg, i, SEG_LVL_ALT_Q);
609
0
    vp9_disable_segfeature(seg, i, SEG_LVL_ALT_LF);
610
0
    if (internal_delta_q[i] != 0) {
611
0
      vp9_enable_segfeature(seg, i, SEG_LVL_ALT_Q);
612
0
      vp9_set_segdata(seg, i, SEG_LVL_ALT_Q, internal_delta_q[i]);
613
0
    }
614
0
    if (delta_lf[i] != 0) {
615
0
      vp9_enable_segfeature(seg, i, SEG_LVL_ALT_LF);
616
0
      vp9_set_segdata(seg, i, SEG_LVL_ALT_LF, delta_lf[i]);
617
0
    }
618
0
    if (skip[i] != 0) {
619
0
      vp9_enable_segfeature(seg, i, SEG_LVL_SKIP);
620
0
      vp9_set_segdata(seg, i, SEG_LVL_SKIP, 0);
621
0
    }
622
0
    if (ref_frame[i] >= 0) {
623
0
      int valid_ref = 1;
624
      // ALTREF is not used as reference for nonrd_pickmode with 0 lag.
625
0
      if (ref_frame[i] == ALTREF_FRAME && cpi->sf.use_nonrd_pick_mode)
626
0
        valid_ref = 0;
627
      // If GOLDEN is selected, make sure it's set as reference.
628
0
      if (ref_frame[i] == GOLDEN_FRAME &&
629
0
          !(cpi->ref_frame_flags & ref_frame_to_flag(ref_frame[i]))) {
630
0
        valid_ref = 0;
631
0
      }
632
      // GOLDEN was updated in previous encoded frame, so GOLDEN and LAST are
633
      // same reference.
634
0
      if (ref_frame[i] == GOLDEN_FRAME && cpi->rc.frames_since_golden == 0)
635
0
        ref_frame[i] = LAST_FRAME;
636
0
      if (valid_ref) {
637
0
        vp9_enable_segfeature(seg, i, SEG_LVL_REF_FRAME);
638
0
        vp9_set_segdata(seg, i, SEG_LVL_REF_FRAME, ref_frame[i]);
639
0
      }
640
0
    }
641
0
  }
642
0
  roi->enabled = 1;
643
0
}
644
645
10.9k
static void init_level_info(Vp9LevelInfo *level_info) {
646
10.9k
  Vp9LevelStats *const level_stats = &level_info->level_stats;
647
10.9k
  Vp9LevelSpec *const level_spec = &level_info->level_spec;
648
649
10.9k
  memset(level_stats, 0, sizeof(*level_stats));
650
10.9k
  memset(level_spec, 0, sizeof(*level_spec));
651
10.9k
  level_spec->level = LEVEL_UNKNOWN;
652
10.9k
  level_spec->min_altref_distance = INT_MAX;
653
10.9k
}
654
655
0
static int check_seg_range(int seg_data[8], int range) {
656
0
  int i;
657
0
  for (i = 0; i < 8; ++i) {
658
    // Note abs() alone can't be used as the behavior of abs(INT_MIN) is
659
    // undefined.
660
0
    if (seg_data[i] > range || seg_data[i] < -range) {
661
0
      return 0;
662
0
    }
663
0
  }
664
0
  return 1;
665
0
}
666
667
0
VP9_LEVEL vp9_get_level(const Vp9LevelSpec *const level_spec) {
668
0
  int i;
669
0
  const Vp9LevelSpec *this_level;
670
671
0
  vpx_clear_system_state();
672
673
0
  for (i = 0; i < VP9_LEVELS; ++i) {
674
0
    this_level = &vp9_level_defs[i];
675
0
    if ((double)level_spec->max_luma_sample_rate >
676
0
            (double)this_level->max_luma_sample_rate *
677
0
                (1 + SAMPLE_RATE_GRACE_P) ||
678
0
        level_spec->max_luma_picture_size > this_level->max_luma_picture_size ||
679
0
        level_spec->max_luma_picture_breadth >
680
0
            this_level->max_luma_picture_breadth ||
681
0
        level_spec->average_bitrate > this_level->average_bitrate ||
682
0
        level_spec->max_cpb_size > this_level->max_cpb_size ||
683
0
        level_spec->compression_ratio < this_level->compression_ratio ||
684
0
        level_spec->max_col_tiles > this_level->max_col_tiles ||
685
0
        level_spec->min_altref_distance < this_level->min_altref_distance ||
686
0
        level_spec->max_ref_frame_buffers > this_level->max_ref_frame_buffers)
687
0
      continue;
688
0
    break;
689
0
  }
690
0
  return (i == VP9_LEVELS) ? LEVEL_UNKNOWN : vp9_level_defs[i].level;
691
0
}
692
693
vpx_codec_err_t vp9_set_roi_map(VP9_COMP *cpi, unsigned char *map,
694
                                unsigned int rows, unsigned int cols,
695
                                int delta_q[8], int delta_lf[8], int skip[8],
696
0
                                int ref_frame[8]) {
697
0
  VP9_COMMON *cm = &cpi->common;
698
0
  vpx_roi_map_t *roi = &cpi->roi;
699
0
  const int range = 63;
700
0
  const int ref_frame_range = 3;  // Alt-ref
701
0
  const int skip_range = 1;
702
0
  const int frame_rows = cpi->common.mi_rows;
703
0
  const int frame_cols = cpi->common.mi_cols;
704
705
  // Check number of rows and columns match
706
0
  if (frame_rows != (int)rows || frame_cols != (int)cols) {
707
0
    return VPX_CODEC_INVALID_PARAM;
708
0
  }
709
710
0
  if (!check_seg_range(delta_q, range) || !check_seg_range(delta_lf, range) ||
711
0
      !check_seg_range(ref_frame, ref_frame_range) ||
712
0
      !check_seg_range(skip, skip_range))
713
0
    return VPX_CODEC_INVALID_PARAM;
714
715
  // Also disable segmentation if no deltas are specified.
716
0
  if (!map ||
717
0
      (!(delta_q[0] | delta_q[1] | delta_q[2] | delta_q[3] | delta_q[4] |
718
0
         delta_q[5] | delta_q[6] | delta_q[7] | delta_lf[0] | delta_lf[1] |
719
0
         delta_lf[2] | delta_lf[3] | delta_lf[4] | delta_lf[5] | delta_lf[6] |
720
0
         delta_lf[7] | skip[0] | skip[1] | skip[2] | skip[3] | skip[4] |
721
0
         skip[5] | skip[6] | skip[7]) &&
722
0
       (ref_frame[0] == -1 && ref_frame[1] == -1 && ref_frame[2] == -1 &&
723
0
        ref_frame[3] == -1 && ref_frame[4] == -1 && ref_frame[5] == -1 &&
724
0
        ref_frame[6] == -1 && ref_frame[7] == -1))) {
725
0
    vp9_disable_segmentation(&cm->seg);
726
0
    cpi->roi.enabled = 0;
727
0
    return VPX_CODEC_OK;
728
0
  }
729
730
0
  if (roi->roi_map) {
731
0
    vpx_free(roi->roi_map);
732
0
    roi->roi_map = NULL;
733
0
  }
734
0
  roi->roi_map = vpx_malloc(rows * cols);
735
0
  if (!roi->roi_map) return VPX_CODEC_MEM_ERROR;
736
737
  // Copy to ROI structure in the compressor.
738
0
  memcpy(roi->roi_map, map, rows * cols);
739
0
  memcpy(&roi->delta_q, delta_q, MAX_SEGMENTS * sizeof(delta_q[0]));
740
0
  memcpy(&roi->delta_lf, delta_lf, MAX_SEGMENTS * sizeof(delta_lf[0]));
741
0
  memcpy(&roi->skip, skip, MAX_SEGMENTS * sizeof(skip[0]));
742
0
  memcpy(&roi->ref_frame, ref_frame, MAX_SEGMENTS * sizeof(ref_frame[0]));
743
0
  roi->enabled = 1;
744
0
  roi->rows = rows;
745
0
  roi->cols = cols;
746
747
0
  return VPX_CODEC_OK;
748
0
}
749
750
int vp9_set_active_map(VP9_COMP *cpi, unsigned char *new_map_16x16, int rows,
751
0
                       int cols) {
752
0
  if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols) {
753
0
    unsigned char *const active_map_8x8 = cpi->active_map.map;
754
0
    const int mi_rows = cpi->common.mi_rows;
755
0
    const int mi_cols = cpi->common.mi_cols;
756
0
    cpi->active_map.update = 1;
757
0
    if (new_map_16x16) {
758
0
      int r, c;
759
0
      for (r = 0; r < mi_rows; ++r) {
760
0
        for (c = 0; c < mi_cols; ++c) {
761
0
          active_map_8x8[r * mi_cols + c] =
762
0
              new_map_16x16[(r >> 1) * cols + (c >> 1)]
763
0
                  ? AM_SEGMENT_ID_ACTIVE
764
0
                  : AM_SEGMENT_ID_INACTIVE;
765
0
        }
766
0
      }
767
0
      cpi->active_map.enabled = 1;
768
0
    } else {
769
0
      cpi->active_map.enabled = 0;
770
0
    }
771
0
    return 0;
772
0
  } else {
773
0
    return -1;
774
0
  }
775
0
}
776
777
int vp9_get_active_map(VP9_COMP *cpi, unsigned char *new_map_16x16, int rows,
778
0
                       int cols) {
779
0
  if (rows == cpi->common.mb_rows && cols == cpi->common.mb_cols &&
780
0
      new_map_16x16) {
781
0
    unsigned char *const seg_map_8x8 = cpi->segmentation_map;
782
0
    const int mi_rows = cpi->common.mi_rows;
783
0
    const int mi_cols = cpi->common.mi_cols;
784
0
    memset(new_map_16x16, !cpi->active_map.enabled, rows * cols);
785
0
    if (cpi->active_map.enabled) {
786
0
      int r, c;
787
0
      for (r = 0; r < mi_rows; ++r) {
788
0
        for (c = 0; c < mi_cols; ++c) {
789
          // Cyclic refresh segments are considered active despite not having
790
          // AM_SEGMENT_ID_ACTIVE
791
0
          new_map_16x16[(r >> 1) * cols + (c >> 1)] |=
792
0
              seg_map_8x8[r * mi_cols + c] != AM_SEGMENT_ID_INACTIVE;
793
0
        }
794
0
      }
795
0
    }
796
0
    return 0;
797
0
  } else {
798
0
    return -1;
799
0
  }
800
0
}
801
802
1.36M
void vp9_set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
803
1.36M
  MACROBLOCK *const mb = &cpi->td.mb;
804
1.36M
  cpi->common.allow_high_precision_mv = allow_high_precision_mv;
805
1.36M
  if (cpi->common.allow_high_precision_mv) {
806
1.28M
    mb->mvcost = mb->nmvcost_hp;
807
1.28M
    mb->mvsadcost = mb->nmvsadcost_hp;
808
1.28M
  } else {
809
74.6k
    mb->mvcost = mb->nmvcost;
810
74.6k
    mb->mvsadcost = mb->nmvsadcost;
811
74.6k
  }
812
1.36M
}
813
814
454k
static void setup_frame(VP9_COMP *cpi) {
815
454k
  VP9_COMMON *const cm = &cpi->common;
816
  // Set up entropy context depending on frame type. The decoder mandates
817
  // the use of the default context, index 0, for keyframes and inter
818
  // frames where the error_resilient_mode or intra_only flag is set. For
819
  // other inter-frames the encoder currently uses only two contexts;
820
  // context 1 for ALTREF frames and context 0 for the others.
821
454k
  if (frame_is_intra_only(cm) || cm->error_resilient_mode) {
822
454k
    vp9_setup_past_independence(cm);
823
454k
  } else {
824
0
    if (!cpi->use_svc) cm->frame_context_idx = cpi->refresh_alt_ref_frame;
825
0
  }
826
827
  // TODO(jingning): Overwrite the frame_context_idx index in multi-layer ARF
828
  // case. Need some further investigation on if we could apply this to single
829
  // layer ARF case as well.
830
454k
  if (cpi->multi_layer_arf && !cpi->use_svc) {
831
0
    GF_GROUP *const gf_group = &cpi->twopass.gf_group;
832
0
    const int gf_group_index = gf_group->index;
833
0
    const int boost_frame =
834
0
        !cpi->rc.is_src_frame_alt_ref &&
835
0
        (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
836
837
    // frame_context_idx           Frame Type
838
    //        0              Intra only frame, base layer ARF
839
    //        1              ARFs with layer depth = 2,3
840
    //        2              ARFs with layer depth > 3
841
    //        3              Non-boosted frames
842
0
    if (frame_is_intra_only(cm)) {
843
0
      cm->frame_context_idx = 0;
844
0
    } else if (boost_frame) {
845
0
      if (gf_group->rf_level[gf_group_index] == GF_ARF_STD)
846
0
        cm->frame_context_idx = 0;
847
0
      else if (gf_group->layer_depth[gf_group_index] <= 3)
848
0
        cm->frame_context_idx = 1;
849
0
      else
850
0
        cm->frame_context_idx = 2;
851
0
    } else {
852
0
      cm->frame_context_idx = 3;
853
0
    }
854
0
  }
855
856
454k
  if (cm->frame_type == KEY_FRAME) {
857
27.9k
    cpi->refresh_golden_frame = 1;
858
27.9k
    cpi->refresh_alt_ref_frame = 1;
859
27.9k
    vp9_zero(cpi->interp_filter_selected);
860
426k
  } else {
861
426k
    *cm->fc = cm->frame_contexts[cm->frame_context_idx];
862
426k
    vp9_zero(cpi->interp_filter_selected[0]);
863
426k
  }
864
454k
}
865
866
18.2k
static void vp9_enc_setup_mi(VP9_COMMON *cm) {
867
18.2k
  int i;
868
18.2k
  cm->mi = cm->mip + cm->mi_stride + 1;
869
18.2k
  memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip));
870
18.2k
  cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
871
  // Clear top border row
872
18.2k
  memset(cm->prev_mip, 0, sizeof(*cm->prev_mip) * cm->mi_stride);
873
  // Clear left border column
874
94.6k
  for (i = 1; i < cm->mi_rows + 1; ++i)
875
76.4k
    memset(&cm->prev_mip[i * cm->mi_stride], 0, sizeof(*cm->prev_mip));
876
877
18.2k
  cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
878
18.2k
  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
879
880
18.2k
  memset(cm->mi_grid_base, 0,
881
18.2k
         cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mi_grid_base));
882
18.2k
}
883
884
10.9k
static int vp9_enc_alloc_mi(VP9_COMMON *cm, int mi_size) {
885
10.9k
  cm->mip = vpx_calloc(mi_size, sizeof(*cm->mip));
886
10.9k
  if (!cm->mip) return 1;
887
10.9k
  cm->prev_mip = vpx_calloc(mi_size, sizeof(*cm->prev_mip));
888
10.9k
  if (!cm->prev_mip) return 1;
889
10.9k
  cm->mi_alloc_size = mi_size;
890
891
10.9k
  cm->mi_grid_base =
892
10.9k
      (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
893
10.9k
  if (!cm->mi_grid_base) return 1;
894
10.9k
  cm->prev_mi_grid_base =
895
10.9k
      (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base));
896
10.9k
  if (!cm->prev_mi_grid_base) return 1;
897
898
10.9k
  return 0;
899
10.9k
}
900
901
32.7k
static void vp9_enc_free_mi(VP9_COMMON *cm) {
902
32.7k
  vpx_free(cm->mip);
903
32.7k
  cm->mip = NULL;
904
32.7k
  vpx_free(cm->prev_mip);
905
32.7k
  cm->prev_mip = NULL;
906
32.7k
  vpx_free(cm->mi_grid_base);
907
32.7k
  cm->mi_grid_base = NULL;
908
32.7k
  vpx_free(cm->prev_mi_grid_base);
909
32.7k
  cm->prev_mi_grid_base = NULL;
910
32.7k
  cm->mi_alloc_size = 0;
911
32.7k
}
912
913
443k
static void vp9_swap_mi_and_prev_mi(VP9_COMMON *cm) {
914
  // Current mip will be the prev_mip for the next frame.
915
443k
  MODE_INFO **temp_base = cm->prev_mi_grid_base;
916
443k
  MODE_INFO *temp = cm->prev_mip;
917
918
  // Skip update prev_mi frame in show_existing_frame mode.
919
443k
  if (cm->show_existing_frame) return;
920
921
443k
  cm->prev_mip = cm->mip;
922
443k
  cm->mip = temp;
923
924
  // Update the upper left visible macroblock ptrs.
925
443k
  cm->mi = cm->mip + cm->mi_stride + 1;
926
443k
  cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
927
928
443k
  cm->prev_mi_grid_base = cm->mi_grid_base;
929
443k
  cm->mi_grid_base = temp_base;
930
443k
  cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
931
443k
  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
932
443k
}
933
934
2
static void initialize_enc(void) {
935
2
  vp9_rtcd();
936
2
  vpx_dsp_rtcd();
937
2
  vpx_scale_rtcd();
938
2
  vp9_init_intra_predictors();
939
2
  vp9_init_me_luts();
940
2
  vp9_rc_init_minq_luts();
941
2
  vp9_entropy_mv_init();
942
2
#if !CONFIG_REALTIME_ONLY
943
2
  vp9_temporal_filter_init();
944
2
#endif
945
2
}
946
947
10.9k
void vp9_initialize_enc(void) { once(initialize_enc); }
948
949
10.9k
static void dealloc_compressor_data(VP9_COMP *cpi) {
950
10.9k
  VP9_COMMON *const cm = &cpi->common;
951
10.9k
  int i;
952
953
10.9k
  vpx_free(cpi->mbmi_ext_base);
954
10.9k
  cpi->mbmi_ext_base = NULL;
955
956
10.9k
  vpx_free(cpi->tile_data);
957
10.9k
  cpi->tile_data = NULL;
958
959
10.9k
  vpx_free(cpi->segmentation_map);
960
10.9k
  cpi->segmentation_map = NULL;
961
10.9k
  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
962
10.9k
  cpi->coding_context.last_frame_seg_map_copy = NULL;
963
964
10.9k
  vpx_free(cpi->nmvcosts[0]);
965
10.9k
  vpx_free(cpi->nmvcosts[1]);
966
10.9k
  cpi->nmvcosts[0] = NULL;
967
10.9k
  cpi->nmvcosts[1] = NULL;
968
969
10.9k
  vpx_free(cpi->nmvcosts_hp[0]);
970
10.9k
  vpx_free(cpi->nmvcosts_hp[1]);
971
10.9k
  cpi->nmvcosts_hp[0] = NULL;
972
10.9k
  cpi->nmvcosts_hp[1] = NULL;
973
974
10.9k
  vpx_free(cpi->nmvsadcosts[0]);
975
10.9k
  vpx_free(cpi->nmvsadcosts[1]);
976
10.9k
  cpi->nmvsadcosts[0] = NULL;
977
10.9k
  cpi->nmvsadcosts[1] = NULL;
978
979
10.9k
  vpx_free(cpi->nmvsadcosts_hp[0]);
980
10.9k
  vpx_free(cpi->nmvsadcosts_hp[1]);
981
10.9k
  cpi->nmvsadcosts_hp[0] = NULL;
982
10.9k
  cpi->nmvsadcosts_hp[1] = NULL;
983
984
10.9k
  vpx_free(cpi->skin_map);
985
10.9k
  cpi->skin_map = NULL;
986
987
10.9k
  vpx_free(cpi->prev_partition);
988
10.9k
  cpi->prev_partition = NULL;
989
990
10.9k
  vpx_free(cpi->svc.prev_partition_svc);
991
10.9k
  cpi->svc.prev_partition_svc = NULL;
992
993
10.9k
  vpx_free(cpi->prev_segment_id);
994
10.9k
  cpi->prev_segment_id = NULL;
995
996
10.9k
  vpx_free(cpi->prev_variance_low);
997
10.9k
  cpi->prev_variance_low = NULL;
998
999
10.9k
  vpx_free(cpi->copied_frame_cnt);
1000
10.9k
  cpi->copied_frame_cnt = NULL;
1001
1002
10.9k
  vpx_free(cpi->content_state_sb_fd);
1003
10.9k
  cpi->content_state_sb_fd = NULL;
1004
1005
10.9k
  vpx_free(cpi->count_arf_frame_usage);
1006
10.9k
  cpi->count_arf_frame_usage = NULL;
1007
10.9k
  vpx_free(cpi->count_lastgolden_frame_usage);
1008
10.9k
  cpi->count_lastgolden_frame_usage = NULL;
1009
1010
10.9k
  vp9_cyclic_refresh_free(cpi->cyclic_refresh);
1011
10.9k
  cpi->cyclic_refresh = NULL;
1012
1013
10.9k
  vpx_free(cpi->active_map.map);
1014
10.9k
  cpi->active_map.map = NULL;
1015
1016
10.9k
  vpx_free(cpi->roi.roi_map);
1017
10.9k
  cpi->roi.roi_map = NULL;
1018
1019
10.9k
  vpx_free(cpi->consec_zero_mv);
1020
10.9k
  cpi->consec_zero_mv = NULL;
1021
1022
10.9k
  vpx_free(cpi->mb_wiener_variance);
1023
10.9k
  cpi->mb_wiener_variance = NULL;
1024
1025
10.9k
  vpx_free(cpi->sb_mul_scale);
1026
10.9k
  cpi->sb_mul_scale = NULL;
1027
1028
10.9k
  vpx_free(cpi->mi_ssim_rdmult_scaling_factors);
1029
10.9k
  cpi->mi_ssim_rdmult_scaling_factors = NULL;
1030
1031
10.9k
  vp9_free_ref_frame_buffers(cm->buffer_pool);
1032
#if CONFIG_VP9_POSTPROC
1033
  vp9_free_postproc_buffers(cm);
1034
#endif
1035
10.9k
  vp9_free_context_buffers(cm);
1036
1037
10.9k
  vpx_free_frame_buffer(&cpi->last_frame_uf);
1038
10.9k
  vpx_free_frame_buffer(&cpi->scaled_source);
1039
10.9k
  vpx_free_frame_buffer(&cpi->scaled_last_source);
1040
10.9k
  vpx_free_frame_buffer(&cpi->tf_buffer);
1041
#ifdef ENABLE_KF_DENOISE
1042
  vpx_free_frame_buffer(&cpi->raw_unscaled_source);
1043
  vpx_free_frame_buffer(&cpi->raw_scaled_source);
1044
#endif
1045
1046
10.9k
  vp9_lookahead_destroy(cpi->lookahead);
1047
1048
10.9k
  vpx_free(cpi->tile_tok[0][0]);
1049
10.9k
  cpi->tile_tok[0][0] = 0;
1050
1051
10.9k
  vpx_free(cpi->tplist[0][0]);
1052
10.9k
  cpi->tplist[0][0] = NULL;
1053
1054
10.9k
  vp9_free_pc_tree(&cpi->td);
1055
1056
21.8k
  for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
1057
10.9k
    LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i];
1058
10.9k
    vpx_free(lc->rc_twopass_stats_in.buf);
1059
10.9k
    lc->rc_twopass_stats_in.buf = NULL;
1060
10.9k
    lc->rc_twopass_stats_in.sz = 0;
1061
10.9k
  }
1062
1063
284k
  for (i = 0; i < MAX_LAG_BUFFERS; ++i) {
1064
273k
    vpx_free_frame_buffer(&cpi->svc.scaled_frames[i]);
1065
273k
  }
1066
10.9k
  memset(&cpi->svc.scaled_frames[0], 0,
1067
10.9k
         MAX_LAG_BUFFERS * sizeof(cpi->svc.scaled_frames[0]));
1068
1069
10.9k
  vpx_free_frame_buffer(&cpi->svc.scaled_temp);
1070
10.9k
  memset(&cpi->svc.scaled_temp, 0, sizeof(cpi->svc.scaled_temp));
1071
1072
10.9k
  vpx_free_frame_buffer(&cpi->svc.empty_frame.img);
1073
10.9k
  memset(&cpi->svc.empty_frame, 0, sizeof(cpi->svc.empty_frame));
1074
1075
10.9k
  vp9_free_svc_cyclic_refresh(cpi);
1076
10.9k
}
1077
1078
0
static void save_coding_context(VP9_COMP *cpi) {
1079
0
  CODING_CONTEXT *const cc = &cpi->coding_context;
1080
0
  VP9_COMMON *cm = &cpi->common;
1081
1082
  // Stores a snapshot of key state variables which can subsequently be
1083
  // restored with a call to vp9_restore_coding_context. These functions are
1084
  // intended for use in a re-code loop in vp9_compress_frame where the
1085
  // quantizer value is adjusted between loop iterations.
1086
0
  vp9_copy(cc->nmvjointcost, cpi->td.mb.nmvjointcost);
1087
1088
0
  memcpy(cc->nmvcosts[0], cpi->nmvcosts[0],
1089
0
         MV_VALS * sizeof(*cpi->nmvcosts[0]));
1090
0
  memcpy(cc->nmvcosts[1], cpi->nmvcosts[1],
1091
0
         MV_VALS * sizeof(*cpi->nmvcosts[1]));
1092
0
  memcpy(cc->nmvcosts_hp[0], cpi->nmvcosts_hp[0],
1093
0
         MV_VALS * sizeof(*cpi->nmvcosts_hp[0]));
1094
0
  memcpy(cc->nmvcosts_hp[1], cpi->nmvcosts_hp[1],
1095
0
         MV_VALS * sizeof(*cpi->nmvcosts_hp[1]));
1096
1097
0
  vp9_copy(cc->segment_pred_probs, cm->seg.pred_probs);
1098
1099
0
  memcpy(cpi->coding_context.last_frame_seg_map_copy, cm->last_frame_seg_map,
1100
0
         (cm->mi_rows * cm->mi_cols));
1101
1102
0
  vp9_copy(cc->last_ref_lf_deltas, cm->lf.last_ref_deltas);
1103
0
  vp9_copy(cc->last_mode_lf_deltas, cm->lf.last_mode_deltas);
1104
1105
0
  cc->fc = *cm->fc;
1106
0
}
1107
1108
0
static void restore_coding_context(VP9_COMP *cpi) {
1109
0
  CODING_CONTEXT *const cc = &cpi->coding_context;
1110
0
  VP9_COMMON *cm = &cpi->common;
1111
1112
  // Restore key state variables to the snapshot state stored in the
1113
  // previous call to vp9_save_coding_context.
1114
0
  vp9_copy(cpi->td.mb.nmvjointcost, cc->nmvjointcost);
1115
1116
0
  memcpy(cpi->nmvcosts[0], cc->nmvcosts[0], MV_VALS * sizeof(*cc->nmvcosts[0]));
1117
0
  memcpy(cpi->nmvcosts[1], cc->nmvcosts[1], MV_VALS * sizeof(*cc->nmvcosts[1]));
1118
0
  memcpy(cpi->nmvcosts_hp[0], cc->nmvcosts_hp[0],
1119
0
         MV_VALS * sizeof(*cc->nmvcosts_hp[0]));
1120
0
  memcpy(cpi->nmvcosts_hp[1], cc->nmvcosts_hp[1],
1121
0
         MV_VALS * sizeof(*cc->nmvcosts_hp[1]));
1122
1123
0
  vp9_copy(cm->seg.pred_probs, cc->segment_pred_probs);
1124
1125
0
  memcpy(cm->last_frame_seg_map, cpi->coding_context.last_frame_seg_map_copy,
1126
0
         (cm->mi_rows * cm->mi_cols));
1127
1128
0
  vp9_copy(cm->lf.last_ref_deltas, cc->last_ref_lf_deltas);
1129
0
  vp9_copy(cm->lf.last_mode_deltas, cc->last_mode_lf_deltas);
1130
1131
0
  *cm->fc = cc->fc;
1132
0
}
1133
1134
#if !CONFIG_REALTIME_ONLY
1135
0
static void configure_static_seg_features(VP9_COMP *cpi) {
1136
0
  VP9_COMMON *const cm = &cpi->common;
1137
0
  const RATE_CONTROL *const rc = &cpi->rc;
1138
0
  struct segmentation *const seg = &cm->seg;
1139
1140
0
  int high_q = (int)(rc->avg_q > 48.0);
1141
0
  int qi_delta;
1142
1143
  // Disable and clear down for KF
1144
0
  if (cm->frame_type == KEY_FRAME) {
1145
    // Clear down the global segmentation map
1146
0
    memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
1147
0
    seg->update_map = 0;
1148
0
    seg->update_data = 0;
1149
0
    cpi->static_mb_pct = 0;
1150
1151
    // Disable segmentation
1152
0
    vp9_disable_segmentation(seg);
1153
1154
    // Clear down the segment features.
1155
0
    vp9_clearall_segfeatures(seg);
1156
0
  } else if (cpi->refresh_alt_ref_frame) {
1157
    // If this is an alt ref frame
1158
    // Clear down the global segmentation map
1159
0
    memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
1160
0
    seg->update_map = 0;
1161
0
    seg->update_data = 0;
1162
0
    cpi->static_mb_pct = 0;
1163
1164
    // Disable segmentation and individual segment features by default
1165
0
    vp9_disable_segmentation(seg);
1166
0
    vp9_clearall_segfeatures(seg);
1167
1168
    // Scan frames from current to arf frame.
1169
    // This function re-enables segmentation if appropriate.
1170
0
    vp9_update_mbgraph_stats(cpi);
1171
1172
    // If segmentation was enabled set those features needed for the
1173
    // arf itself.
1174
0
    if (seg->enabled) {
1175
0
      seg->update_map = 1;
1176
0
      seg->update_data = 1;
1177
1178
0
      qi_delta =
1179
0
          vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 0.875, cm->bit_depth);
1180
0
      vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta - 2);
1181
0
      vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
1182
1183
0
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
1184
0
      vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
1185
1186
      // Where relevant assume segment data is delta data
1187
0
      seg->abs_delta = SEGMENT_DELTADATA;
1188
0
    }
1189
0
  } else if (seg->enabled) {
1190
    // All other frames if segmentation has been enabled
1191
1192
    // First normal frame in a valid gf or alt ref group
1193
0
    if (rc->frames_since_golden == 0) {
1194
      // Set up segment features for normal frames in an arf group
1195
0
      if (rc->source_alt_ref_active) {
1196
0
        seg->update_map = 0;
1197
0
        seg->update_data = 1;
1198
0
        seg->abs_delta = SEGMENT_DELTADATA;
1199
1200
0
        qi_delta =
1201
0
            vp9_compute_qdelta(rc, rc->avg_q, rc->avg_q * 1.125, cm->bit_depth);
1202
0
        vp9_set_segdata(seg, 1, SEG_LVL_ALT_Q, qi_delta + 2);
1203
0
        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_Q);
1204
1205
0
        vp9_set_segdata(seg, 1, SEG_LVL_ALT_LF, -2);
1206
0
        vp9_enable_segfeature(seg, 1, SEG_LVL_ALT_LF);
1207
1208
        // Segment coding disabled for compred testing
1209
0
        if (high_q || (cpi->static_mb_pct == 100)) {
1210
0
          vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
1211
0
          vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
1212
0
          vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
1213
0
        }
1214
0
      } else {
1215
        // Disable segmentation and clear down features if alt ref
1216
        // is not active for this group
1217
1218
0
        vp9_disable_segmentation(seg);
1219
1220
0
        memset(cpi->segmentation_map, 0, cm->mi_rows * cm->mi_cols);
1221
1222
0
        seg->update_map = 0;
1223
0
        seg->update_data = 0;
1224
1225
0
        vp9_clearall_segfeatures(seg);
1226
0
      }
1227
0
    } else if (rc->is_src_frame_alt_ref) {
1228
      // Special case where we are coding over the top of a previous
1229
      // alt ref frame.
1230
      // Segment coding disabled for compred testing
1231
1232
      // Enable ref frame features for segment 0 as well
1233
0
      vp9_enable_segfeature(seg, 0, SEG_LVL_REF_FRAME);
1234
0
      vp9_enable_segfeature(seg, 1, SEG_LVL_REF_FRAME);
1235
1236
      // All mbs should use ALTREF_FRAME
1237
0
      vp9_clear_segdata(seg, 0, SEG_LVL_REF_FRAME);
1238
0
      vp9_set_segdata(seg, 0, SEG_LVL_REF_FRAME, ALTREF_FRAME);
1239
0
      vp9_clear_segdata(seg, 1, SEG_LVL_REF_FRAME);
1240
0
      vp9_set_segdata(seg, 1, SEG_LVL_REF_FRAME, ALTREF_FRAME);
1241
1242
      // Skip all MBs if high Q (0,0 mv and skip coeffs)
1243
0
      if (high_q) {
1244
0
        vp9_enable_segfeature(seg, 0, SEG_LVL_SKIP);
1245
0
        vp9_enable_segfeature(seg, 1, SEG_LVL_SKIP);
1246
0
      }
1247
      // Enable data update
1248
0
      seg->update_data = 1;
1249
0
    } else {
1250
      // All other frames.
1251
1252
      // No updates.. leave things as they are.
1253
0
      seg->update_map = 0;
1254
0
      seg->update_data = 0;
1255
0
    }
1256
0
  }
1257
0
}
1258
#endif  // !CONFIG_REALTIME_ONLY
1259
1260
0
static void update_reference_segmentation_map(VP9_COMP *cpi) {
1261
0
  VP9_COMMON *const cm = &cpi->common;
1262
0
  MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible;
1263
0
  uint8_t *cache_ptr = cm->last_frame_seg_map;
1264
0
  int row, col;
1265
1266
0
  for (row = 0; row < cm->mi_rows; row++) {
1267
0
    MODE_INFO **mi_8x8 = mi_8x8_ptr;
1268
0
    uint8_t *cache = cache_ptr;
1269
0
    for (col = 0; col < cm->mi_cols; col++, mi_8x8++, cache++)
1270
0
      cache[0] = mi_8x8[0]->segment_id;
1271
0
    mi_8x8_ptr += cm->mi_stride;
1272
0
    cache_ptr += cm->mi_cols;
1273
0
  }
1274
0
}
1275
1276
446k
static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
1277
446k
  VP9_COMMON *cm = &cpi->common;
1278
446k
  const VP9EncoderConfig *oxcf = &cpi->oxcf;
1279
1280
446k
  if (!cpi->lookahead)
1281
10.9k
    cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height,
1282
10.9k
                                        cm->subsampling_x, cm->subsampling_y,
1283
10.9k
#if CONFIG_VP9_HIGHBITDEPTH
1284
10.9k
                                        cm->use_highbitdepth,
1285
10.9k
#endif
1286
10.9k
                                        oxcf->lag_in_frames);
1287
446k
  if (!cpi->lookahead)
1288
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1289
0
                       "Failed to allocate lag buffers");
1290
1291
  // TODO(agrange) Check if ARF is enabled and skip allocation if not.
1292
446k
  if (vpx_realloc_frame_buffer(&cpi->tf_buffer, oxcf->width, oxcf->height,
1293
446k
                               cm->subsampling_x, cm->subsampling_y,
1294
446k
#if CONFIG_VP9_HIGHBITDEPTH
1295
446k
                               cm->use_highbitdepth,
1296
446k
#endif
1297
446k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1298
446k
                               NULL, NULL, NULL))
1299
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1300
0
                       "Failed to allocate temporal filter buffer");
1301
446k
}
1302
1303
465k
static void alloc_util_frame_buffers(VP9_COMP *cpi) {
1304
465k
  VP9_COMMON *const cm = &cpi->common;
1305
465k
  if (vpx_realloc_frame_buffer(&cpi->last_frame_uf, cm->width, cm->height,
1306
465k
                               cm->subsampling_x, cm->subsampling_y,
1307
465k
#if CONFIG_VP9_HIGHBITDEPTH
1308
465k
                               cm->use_highbitdepth,
1309
465k
#endif
1310
465k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1311
465k
                               NULL, NULL, NULL))
1312
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1313
0
                       "Failed to allocate last frame buffer");
1314
1315
465k
  if (vpx_realloc_frame_buffer(&cpi->scaled_source, cm->width, cm->height,
1316
465k
                               cm->subsampling_x, cm->subsampling_y,
1317
465k
#if CONFIG_VP9_HIGHBITDEPTH
1318
465k
                               cm->use_highbitdepth,
1319
465k
#endif
1320
465k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1321
465k
                               NULL, NULL, NULL))
1322
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1323
0
                       "Failed to allocate scaled source buffer");
1324
1325
  // For 1 pass cbr: allocate scaled_frame that may be used as an intermediate
1326
  // buffer for a 2 stage down-sampling: two stages of 1:2 down-sampling for a
1327
  // target of 1/4x1/4. number_spatial_layers must be greater than 2.
1328
465k
  if (is_one_pass_svc(cpi) && !cpi->svc.scaled_temp_is_alloc &&
1329
0
      cpi->svc.number_spatial_layers > 2) {
1330
0
    cpi->svc.scaled_temp_is_alloc = 1;
1331
0
    if (vpx_realloc_frame_buffer(
1332
0
            &cpi->svc.scaled_temp, cm->width >> 1, cm->height >> 1,
1333
0
            cm->subsampling_x, cm->subsampling_y,
1334
0
#if CONFIG_VP9_HIGHBITDEPTH
1335
0
            cm->use_highbitdepth,
1336
0
#endif
1337
0
            VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment, NULL, NULL, NULL))
1338
0
      vpx_internal_error(&cpi->common.error, VPX_CODEC_MEM_ERROR,
1339
0
                         "Failed to allocate scaled_frame for svc ");
1340
0
  }
1341
1342
465k
  if (vpx_realloc_frame_buffer(&cpi->scaled_last_source, cm->width, cm->height,
1343
465k
                               cm->subsampling_x, cm->subsampling_y,
1344
465k
#if CONFIG_VP9_HIGHBITDEPTH
1345
465k
                               cm->use_highbitdepth,
1346
465k
#endif
1347
465k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1348
465k
                               NULL, NULL, NULL))
1349
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1350
0
                       "Failed to allocate scaled last source buffer");
1351
#ifdef ENABLE_KF_DENOISE
1352
  if (vpx_realloc_frame_buffer(&cpi->raw_unscaled_source, cm->width, cm->height,
1353
                               cm->subsampling_x, cm->subsampling_y,
1354
#if CONFIG_VP9_HIGHBITDEPTH
1355
                               cm->use_highbitdepth,
1356
#endif
1357
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1358
                               NULL, NULL, NULL))
1359
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1360
                       "Failed to allocate unscaled raw source frame buffer");
1361
1362
  if (vpx_realloc_frame_buffer(&cpi->raw_scaled_source, cm->width, cm->height,
1363
                               cm->subsampling_x, cm->subsampling_y,
1364
#if CONFIG_VP9_HIGHBITDEPTH
1365
                               cm->use_highbitdepth,
1366
#endif
1367
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1368
                               NULL, NULL, NULL))
1369
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1370
                       "Failed to allocate scaled raw source frame buffer");
1371
#endif
1372
465k
}
1373
1374
10.9k
static void alloc_context_buffers_ext(VP9_COMP *cpi) {
1375
10.9k
  VP9_COMMON *cm = &cpi->common;
1376
10.9k
  int mi_size = cm->mi_cols * cm->mi_rows;
1377
1378
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->mbmi_ext_base,
1379
10.9k
                  vpx_calloc(mi_size, sizeof(*cpi->mbmi_ext_base)));
1380
10.9k
}
1381
1382
10.9k
static void alloc_compressor_data(VP9_COMP *cpi) {
1383
10.9k
  VP9_COMMON *cm = &cpi->common;
1384
10.9k
  int sb_rows;
1385
1386
10.9k
  if (vp9_alloc_context_buffers(cm, cm->width, cm->height)) {
1387
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1388
0
                       "Failed to allocate context buffers");
1389
0
  }
1390
1391
10.9k
  alloc_context_buffers_ext(cpi);
1392
1393
10.9k
  vpx_free(cpi->tile_tok[0][0]);
1394
1395
10.9k
  {
1396
10.9k
    int64_t tokens = get_token_alloc(cm->mb_rows, cm->mb_cols);
1397
#if INT64_MAX > SIZE_MAX
1398
    if ((uint64_t)tokens > SIZE_MAX) {
1399
      vpx_internal_error(
1400
          &cm->error, VPX_CODEC_MEM_ERROR,
1401
          "Size of cpi->tile_tok[0][0] can't be represented in size_t");
1402
    }
1403
#endif
1404
10.9k
    CHECK_MEM_ERROR(&cm->error, cpi->tile_tok[0][0],
1405
10.9k
                    vpx_calloc((size_t)tokens, sizeof(*cpi->tile_tok[0][0])));
1406
10.9k
  }
1407
1408
10.9k
  sb_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> MI_BLOCK_SIZE_LOG2;
1409
10.9k
  vpx_free(cpi->tplist[0][0]);
1410
10.9k
  CHECK_MEM_ERROR(
1411
10.9k
      &cm->error, cpi->tplist[0][0],
1412
10.9k
      vpx_calloc(sb_rows * 4 * (1 << 6), sizeof(*cpi->tplist[0][0])));
1413
1414
10.9k
  vp9_setup_pc_tree(&cpi->common, &cpi->td);
1415
1416
10.9k
  if (cpi->kmeans_data_arr_alloc) {
1417
0
#if CONFIG_MULTITHREAD
1418
0
    pthread_mutex_destroy(&cpi->kmeans_mutex);
1419
0
#endif
1420
0
    vpx_free(cpi->kmeans_data_arr);
1421
0
    cpi->kmeans_data_arr = NULL;
1422
0
    cpi->kmeans_data_arr_alloc = 0;
1423
0
  }
1424
10.9k
}
1425
1426
461k
void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
1427
461k
  cpi->framerate = framerate < 0.1 ? 30 : framerate;
1428
461k
  vp9_rc_update_framerate(cpi);
1429
461k
}
1430
1431
36.5k
static void set_tile_limits(VP9_COMP *cpi) {
1432
36.5k
  VP9_COMMON *const cm = &cpi->common;
1433
1434
36.5k
  int min_log2_tile_cols, max_log2_tile_cols;
1435
36.5k
  vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
1436
1437
36.5k
  cm->log2_tile_cols =
1438
36.5k
      clamp(cpi->oxcf.tile_columns, min_log2_tile_cols, max_log2_tile_cols);
1439
1440
  // Max allowed number of tile_rows is 4 (so log2_tile_rows = 2), and each
1441
  // tile_row contains a multiple of superblocks.
1442
36.5k
  const int sb64_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> 3;
1443
36.5k
  const int max_log2_tile_rows = (sb64_rows >= 4)   ? 2
1444
36.5k
                                 : (sb64_rows >= 2) ? 1
1445
36.5k
                                                    : 0;
1446
36.5k
  cm->log2_tile_rows = VPXMIN(cpi->oxcf.tile_rows, max_log2_tile_rows);
1447
1448
36.5k
  if (cpi->oxcf.target_level == LEVEL_AUTO) {
1449
0
    const int level_tile_cols =
1450
0
        log_tile_cols_from_picsize_level(cpi->common.width, cpi->common.height);
1451
0
    if (cm->log2_tile_cols > level_tile_cols) {
1452
0
      cm->log2_tile_cols = VPXMAX(level_tile_cols, min_log2_tile_cols);
1453
0
    }
1454
0
  }
1455
36.5k
}
1456
1457
18.2k
static void update_frame_size(VP9_COMP *cpi) {
1458
18.2k
  VP9_COMMON *const cm = &cpi->common;
1459
18.2k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
1460
1461
18.2k
  vp9_set_mb_mi(cm, cm->width, cm->height);
1462
18.2k
  vp9_init_context_buffers(cm);
1463
18.2k
  vp9_init_macroblockd(cm, xd, NULL);
1464
18.2k
  cpi->td.mb.mbmi_ext_base = cpi->mbmi_ext_base;
1465
18.2k
  memset(cpi->mbmi_ext_base, 0,
1466
18.2k
         cm->mi_rows * cm->mi_cols * sizeof(*cpi->mbmi_ext_base));
1467
1468
18.2k
  set_tile_limits(cpi);
1469
18.2k
}
1470
1471
10.9k
static void init_buffer_indices(VP9_COMP *cpi) {
1472
10.9k
  int ref_frame;
1473
1474
98.3k
  for (ref_frame = 0; ref_frame < REF_FRAMES; ++ref_frame)
1475
87.4k
    cpi->ref_fb_idx[ref_frame] = ref_frame;
1476
1477
10.9k
  cpi->lst_fb_idx = cpi->ref_fb_idx[LAST_FRAME - 1];
1478
10.9k
  cpi->gld_fb_idx = cpi->ref_fb_idx[GOLDEN_FRAME - 1];
1479
10.9k
  cpi->alt_fb_idx = cpi->ref_fb_idx[ALTREF_FRAME - 1];
1480
10.9k
}
1481
1482
10.9k
static void init_level_constraint(LevelConstraint *lc) {
1483
10.9k
  lc->level_index = -1;
1484
10.9k
  lc->max_cpb_size = INT_MAX;
1485
10.9k
  lc->max_frame_size = INT_MAX;
1486
10.9k
  lc->fail_flag = 0;
1487
10.9k
}
1488
1489
29.1k
static void set_level_constraint(LevelConstraint *ls, int8_t level_index) {
1490
29.1k
  vpx_clear_system_state();
1491
29.1k
  ls->level_index = level_index;
1492
29.1k
  if (level_index >= 0) {
1493
0
    ls->max_cpb_size = vp9_level_defs[level_index].max_cpb_size * (double)1000;
1494
0
  }
1495
29.1k
}
1496
1497
10.9k
static void init_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
1498
10.9k
  VP9_COMMON *const cm = &cpi->common;
1499
1500
10.9k
  cpi->oxcf = *oxcf;
1501
10.9k
  cpi->framerate = oxcf->init_framerate;
1502
10.9k
  cm->profile = oxcf->profile;
1503
10.9k
  cm->bit_depth = oxcf->bit_depth;
1504
10.9k
#if CONFIG_VP9_HIGHBITDEPTH
1505
10.9k
  cm->use_highbitdepth = oxcf->use_highbitdepth;
1506
10.9k
#endif
1507
10.9k
  cm->color_space = oxcf->color_space;
1508
10.9k
  cm->color_range = oxcf->color_range;
1509
1510
10.9k
  cpi->target_level = oxcf->target_level;
1511
10.9k
  cpi->keep_level_stats = oxcf->target_level != LEVEL_MAX;
1512
10.9k
  set_level_constraint(&cpi->level_constraint,
1513
10.9k
                       get_level_index(cpi->target_level));
1514
1515
10.9k
  cm->width = oxcf->width;
1516
10.9k
  cm->height = oxcf->height;
1517
10.9k
  alloc_compressor_data(cpi);
1518
1519
10.9k
  cpi->svc.temporal_layering_mode = oxcf->temporal_layering_mode;
1520
1521
  // Single thread case: use counts in common.
1522
10.9k
  cpi->td.counts = &cm->counts;
1523
1524
  // Spatial scalability.
1525
10.9k
  cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
1526
  // Temporal scalability.
1527
10.9k
  cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
1528
1529
10.9k
  if (cpi->svc.number_temporal_layers > 1 ||
1530
10.9k
      cpi->svc.number_spatial_layers > 1) {
1531
0
    vp9_init_layer_context(cpi);
1532
0
  }
1533
1534
  // change includes all joint functionality
1535
10.9k
  vp9_change_config(cpi, oxcf);
1536
1537
10.9k
  cpi->static_mb_pct = 0;
1538
10.9k
  cpi->ref_frame_flags = 0;
1539
1540
10.9k
  init_buffer_indices(cpi);
1541
1542
10.9k
  vp9_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
1543
10.9k
  cpi->fixed_qp_onepass = 0;
1544
10.9k
}
1545
1546
18.2k
void vp9_check_reset_rc_flag(VP9_COMP *cpi) {
1547
18.2k
  RATE_CONTROL *rc = &cpi->rc;
1548
1549
18.2k
  if (cpi->common.current_video_frame >
1550
18.2k
      (unsigned int)cpi->svc.number_spatial_layers) {
1551
0
    if (cpi->use_svc) {
1552
0
      vp9_svc_check_reset_layer_rc_flag(cpi);
1553
0
    } else {
1554
0
      if (rc->avg_frame_bandwidth / 3 > (rc->last_avg_frame_bandwidth >> 1) ||
1555
0
          rc->avg_frame_bandwidth < (rc->last_avg_frame_bandwidth >> 1)) {
1556
0
        rc->rc_1_frame = 0;
1557
0
        rc->rc_2_frame = 0;
1558
0
        rc->bits_off_target = rc->optimal_buffer_level;
1559
0
        rc->buffer_level = rc->optimal_buffer_level;
1560
0
      }
1561
0
    }
1562
0
  }
1563
18.2k
}
1564
1565
18.2k
void vp9_set_rc_buffer_sizes(VP9_COMP *cpi) {
1566
18.2k
  RATE_CONTROL *rc = &cpi->rc;
1567
18.2k
  const VP9EncoderConfig *oxcf = &cpi->oxcf;
1568
1569
18.2k
  const int64_t bandwidth = oxcf->target_bandwidth;
1570
18.2k
  const int64_t starting = oxcf->starting_buffer_level_ms;
1571
18.2k
  const int64_t optimal = oxcf->optimal_buffer_level_ms;
1572
18.2k
  const int64_t maximum = oxcf->maximum_buffer_size_ms;
1573
1574
18.2k
  rc->starting_buffer_level = starting * bandwidth / 1000;
1575
18.2k
  rc->optimal_buffer_level =
1576
18.2k
      (optimal == 0) ? bandwidth / 8 : optimal * bandwidth / 1000;
1577
18.2k
  rc->maximum_buffer_size =
1578
18.2k
      (maximum == 0) ? bandwidth / 8 : maximum * bandwidth / 1000;
1579
1580
  // Under a configuration change, where maximum_buffer_size may change,
1581
  // keep buffer level clipped to the maximum allowed buffer size.
1582
18.2k
  rc->bits_off_target = VPXMIN(rc->bits_off_target, rc->maximum_buffer_size);
1583
18.2k
  rc->buffer_level = VPXMIN(rc->buffer_level, rc->maximum_buffer_size);
1584
18.2k
}
1585
1586
#if CONFIG_VP9_HIGHBITDEPTH
1587
#define HIGHBD_BFP(BT, SDF, SDSF, SDAF, VF, SVF, SVAF, SDX4DF, SDSX4DF) \
1588
0
  cpi->fn_ptr[BT].sdf = SDF;                                            \
1589
0
  cpi->fn_ptr[BT].sdsf = SDSF;                                          \
1590
0
  cpi->fn_ptr[BT].sdaf = SDAF;                                          \
1591
0
  cpi->fn_ptr[BT].vf = VF;                                              \
1592
0
  cpi->fn_ptr[BT].svf = SVF;                                            \
1593
0
  cpi->fn_ptr[BT].svaf = SVAF;                                          \
1594
0
  cpi->fn_ptr[BT].sdx4df = SDX4DF;                                      \
1595
0
  cpi->fn_ptr[BT].sdsx4df = SDSX4DF;
1596
1597
#define MAKE_BFP_SAD_WRAPPER(fnname)                                           \
1598
  static unsigned int fnname##_bits8(const uint8_t *src_ptr,                   \
1599
                                     int source_stride,                        \
1600
0
                                     const uint8_t *ref_ptr, int ref_stride) { \
1601
0
    return fnname(src_ptr, source_stride, ref_ptr, ref_stride);                \
1602
0
  }                                                                            \
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x16_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x32_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x32_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x64_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x32_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x64_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x16_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x8_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x16_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x8_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x4_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x8_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x4_bits8
1603
  static unsigned int fnname##_bits10(                                         \
1604
      const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
1605
0
      int ref_stride) {                                                        \
1606
0
    return fnname(src_ptr, source_stride, ref_ptr, ref_stride) >> 2;           \
1607
0
  }                                                                            \
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x16_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x32_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x32_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x64_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x32_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x64_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x16_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x8_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x16_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x8_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x4_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x8_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x4_bits10
1608
  static unsigned int fnname##_bits12(                                         \
1609
      const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
1610
0
      int ref_stride) {                                                        \
1611
0
    return fnname(src_ptr, source_stride, ref_ptr, ref_stride) >> 4;           \
1612
0
  }
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x16_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x32_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x32_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x64_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x32_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x64_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x16_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x8_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x16_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x8_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x4_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x8_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x4_bits12
1613
1614
#define MAKE_BFP_SADAVG_WRAPPER(fnname)                                        \
1615
  static unsigned int fnname##_bits8(                                          \
1616
      const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
1617
0
      int ref_stride, const uint8_t *second_pred) {                            \
1618
0
    return fnname(src_ptr, source_stride, ref_ptr, ref_stride, second_pred);   \
1619
0
  }                                                                            \
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8_avg_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4_avg_bits8
1620
  static unsigned int fnname##_bits10(                                         \
1621
      const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
1622
0
      int ref_stride, const uint8_t *second_pred) {                            \
1623
0
    return fnname(src_ptr, source_stride, ref_ptr, ref_stride, second_pred) >> \
1624
0
           2;                                                                  \
1625
0
  }                                                                            \
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8_avg_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4_avg_bits10
1626
  static unsigned int fnname##_bits12(                                         \
1627
      const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr,       \
1628
0
      int ref_stride, const uint8_t *second_pred) {                            \
1629
0
    return fnname(src_ptr, source_stride, ref_ptr, ref_stride, second_pred) >> \
1630
0
           4;                                                                  \
1631
0
  }
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8_avg_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4_avg_bits12
1632
1633
#define MAKE_BFP_SAD4D_WRAPPER(fnname)                                        \
1634
  static void fnname##_bits8(const uint8_t *src_ptr, int source_stride,       \
1635
                             const uint8_t *const ref_ptr[], int ref_stride,  \
1636
0
                             unsigned int *sad_array) {                       \
1637
0
    fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array);           \
1638
0
  }                                                                           \
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x16x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x32x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x32x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x64x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x32x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x64x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x16x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x8x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x16x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x8x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x4x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x8x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4x4d_bits8
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x4x4d_bits8
1639
  static void fnname##_bits10(const uint8_t *src_ptr, int source_stride,      \
1640
                              const uint8_t *const ref_ptr[], int ref_stride, \
1641
0
                              unsigned int *sad_array) {                      \
1642
0
    int i;                                                                    \
1643
0
    fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array);           \
1644
0
    for (i = 0; i < 4; i++) sad_array[i] >>= 2;                               \
1645
0
  }                                                                           \
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x16x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x32x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x32x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x64x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x32x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x64x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x16x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x8x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x16x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x8x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x4x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x8x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4x4d_bits10
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x4x4d_bits10
1646
  static void fnname##_bits12(const uint8_t *src_ptr, int source_stride,      \
1647
                              const uint8_t *const ref_ptr[], int ref_stride, \
1648
0
                              unsigned int *sad_array) {                      \
1649
0
    int i;                                                                    \
1650
0
    fnname(src_ptr, source_stride, ref_ptr, ref_stride, sad_array);           \
1651
0
    for (i = 0; i < 4; i++) sad_array[i] >>= 4;                               \
1652
0
  }
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x16x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x16x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x32x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x32x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x32x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x32x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x64x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x64x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad32x32x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_32x32x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad64x64x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_64x64x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x16x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x16x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad16x8x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_16x8x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x16x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x16x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x8x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x8x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad8x4x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_8x4x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x8x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x8x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad4x4x4d_bits12
Unexecuted instantiation: vp9_encoder.c:vpx_highbd_sad_skip_4x4x4d_bits12
1653
1654
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad32x16)
1655
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_32x16)
1656
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad32x16_avg)
1657
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad32x16x4d)
1658
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_32x16x4d)
1659
1660
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad16x32)
1661
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_16x32)
1662
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad16x32_avg)
1663
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad16x32x4d)
1664
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_16x32x4d)
1665
1666
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad64x32)
1667
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_64x32)
1668
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad64x32_avg)
1669
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad64x32x4d)
1670
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_64x32x4d)
1671
1672
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad32x64)
1673
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_32x64)
1674
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad32x64_avg)
1675
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad32x64x4d)
1676
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_32x64x4d)
1677
1678
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad32x32)
1679
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_32x32)
1680
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad32x32_avg)
1681
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad32x32x4d)
1682
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_32x32x4d)
1683
1684
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad64x64)
1685
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_64x64)
1686
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad64x64_avg)
1687
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad64x64x4d)
1688
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_64x64x4d)
1689
1690
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad16x16)
1691
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_16x16)
1692
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad16x16_avg)
1693
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad16x16x4d)
1694
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_16x16x4d)
1695
1696
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad16x8)
1697
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_16x8)
1698
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad16x8_avg)
1699
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad16x8x4d)
1700
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_16x8x4d)
1701
1702
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad8x16)
1703
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_8x16)
1704
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad8x16_avg)
1705
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad8x16x4d)
1706
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_8x16x4d)
1707
1708
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad8x8)
1709
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_8x8)
1710
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad8x8_avg)
1711
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad8x8x4d)
1712
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_8x8x4d)
1713
1714
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad8x4)
1715
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_8x4)
1716
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad8x4_avg)
1717
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad8x4x4d)
1718
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_8x4x4d)
1719
1720
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad4x8)
1721
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_4x8)
1722
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad4x8_avg)
1723
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad4x8x4d)
1724
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_4x8x4d)
1725
1726
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad4x4)
1727
MAKE_BFP_SAD_WRAPPER(vpx_highbd_sad_skip_4x4)
1728
MAKE_BFP_SADAVG_WRAPPER(vpx_highbd_sad4x4_avg)
1729
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad4x4x4d)
1730
MAKE_BFP_SAD4D_WRAPPER(vpx_highbd_sad_skip_4x4x4d)
1731
1732
29.1k
static void highbd_set_var_fns(VP9_COMP *const cpi) {
1733
29.1k
  VP9_COMMON *const cm = &cpi->common;
1734
29.1k
  if (cm->use_highbitdepth) {
1735
0
    switch (cm->bit_depth) {
1736
0
      case VPX_BITS_8:
1737
0
        HIGHBD_BFP(
1738
0
            BLOCK_32X16, vpx_highbd_sad32x16_bits8,
1739
0
            vpx_highbd_sad_skip_32x16_bits8, vpx_highbd_sad32x16_avg_bits8,
1740
0
            vpx_highbd_8_variance32x16, vpx_highbd_8_sub_pixel_variance32x16,
1741
0
            vpx_highbd_8_sub_pixel_avg_variance32x16,
1742
0
            vpx_highbd_sad32x16x4d_bits8, vpx_highbd_sad_skip_32x16x4d_bits8)
1743
1744
0
        HIGHBD_BFP(
1745
0
            BLOCK_16X32, vpx_highbd_sad16x32_bits8,
1746
0
            vpx_highbd_sad_skip_16x32_bits8, vpx_highbd_sad16x32_avg_bits8,
1747
0
            vpx_highbd_8_variance16x32, vpx_highbd_8_sub_pixel_variance16x32,
1748
0
            vpx_highbd_8_sub_pixel_avg_variance16x32,
1749
0
            vpx_highbd_sad16x32x4d_bits8, vpx_highbd_sad_skip_16x32x4d_bits8)
1750
1751
0
        HIGHBD_BFP(
1752
0
            BLOCK_64X32, vpx_highbd_sad64x32_bits8,
1753
0
            vpx_highbd_sad_skip_64x32_bits8, vpx_highbd_sad64x32_avg_bits8,
1754
0
            vpx_highbd_8_variance64x32, vpx_highbd_8_sub_pixel_variance64x32,
1755
0
            vpx_highbd_8_sub_pixel_avg_variance64x32,
1756
0
            vpx_highbd_sad64x32x4d_bits8, vpx_highbd_sad_skip_64x32x4d_bits8)
1757
1758
0
        HIGHBD_BFP(
1759
0
            BLOCK_32X64, vpx_highbd_sad32x64_bits8,
1760
0
            vpx_highbd_sad_skip_32x64_bits8, vpx_highbd_sad32x64_avg_bits8,
1761
0
            vpx_highbd_8_variance32x64, vpx_highbd_8_sub_pixel_variance32x64,
1762
0
            vpx_highbd_8_sub_pixel_avg_variance32x64,
1763
0
            vpx_highbd_sad32x64x4d_bits8, vpx_highbd_sad_skip_32x64x4d_bits8)
1764
1765
0
        HIGHBD_BFP(
1766
0
            BLOCK_32X32, vpx_highbd_sad32x32_bits8,
1767
0
            vpx_highbd_sad_skip_32x32_bits8, vpx_highbd_sad32x32_avg_bits8,
1768
0
            vpx_highbd_8_variance32x32, vpx_highbd_8_sub_pixel_variance32x32,
1769
0
            vpx_highbd_8_sub_pixel_avg_variance32x32,
1770
0
            vpx_highbd_sad32x32x4d_bits8, vpx_highbd_sad_skip_32x32x4d_bits8)
1771
1772
0
        HIGHBD_BFP(
1773
0
            BLOCK_64X64, vpx_highbd_sad64x64_bits8,
1774
0
            vpx_highbd_sad_skip_64x64_bits8, vpx_highbd_sad64x64_avg_bits8,
1775
0
            vpx_highbd_8_variance64x64, vpx_highbd_8_sub_pixel_variance64x64,
1776
0
            vpx_highbd_8_sub_pixel_avg_variance64x64,
1777
0
            vpx_highbd_sad64x64x4d_bits8, vpx_highbd_sad_skip_64x64x4d_bits8)
1778
1779
0
        HIGHBD_BFP(
1780
0
            BLOCK_16X16, vpx_highbd_sad16x16_bits8,
1781
0
            vpx_highbd_sad_skip_16x16_bits8, vpx_highbd_sad16x16_avg_bits8,
1782
0
            vpx_highbd_8_variance16x16, vpx_highbd_8_sub_pixel_variance16x16,
1783
0
            vpx_highbd_8_sub_pixel_avg_variance16x16,
1784
0
            vpx_highbd_sad16x16x4d_bits8, vpx_highbd_sad_skip_16x16x4d_bits8)
1785
1786
0
        HIGHBD_BFP(
1787
0
            BLOCK_16X8, vpx_highbd_sad16x8_bits8,
1788
0
            vpx_highbd_sad_skip_16x8_bits8, vpx_highbd_sad16x8_avg_bits8,
1789
0
            vpx_highbd_8_variance16x8, vpx_highbd_8_sub_pixel_variance16x8,
1790
0
            vpx_highbd_8_sub_pixel_avg_variance16x8,
1791
0
            vpx_highbd_sad16x8x4d_bits8, vpx_highbd_sad_skip_16x8x4d_bits8)
1792
1793
0
        HIGHBD_BFP(
1794
0
            BLOCK_8X16, vpx_highbd_sad8x16_bits8,
1795
0
            vpx_highbd_sad_skip_8x16_bits8, vpx_highbd_sad8x16_avg_bits8,
1796
0
            vpx_highbd_8_variance8x16, vpx_highbd_8_sub_pixel_variance8x16,
1797
0
            vpx_highbd_8_sub_pixel_avg_variance8x16,
1798
0
            vpx_highbd_sad8x16x4d_bits8, vpx_highbd_sad_skip_8x16x4d_bits8)
1799
1800
0
        HIGHBD_BFP(BLOCK_8X8, vpx_highbd_sad8x8_bits8,
1801
0
                   vpx_highbd_sad_skip_8x8_bits8, vpx_highbd_sad8x8_avg_bits8,
1802
0
                   vpx_highbd_8_variance8x8, vpx_highbd_8_sub_pixel_variance8x8,
1803
0
                   vpx_highbd_8_sub_pixel_avg_variance8x8,
1804
0
                   vpx_highbd_sad8x8x4d_bits8, vpx_highbd_sad_skip_8x8x4d_bits8)
1805
1806
0
        HIGHBD_BFP(BLOCK_8X4, vpx_highbd_sad8x4_bits8,
1807
0
                   vpx_highbd_sad_skip_8x4_bits8, vpx_highbd_sad8x4_avg_bits8,
1808
0
                   vpx_highbd_8_variance8x4, vpx_highbd_8_sub_pixel_variance8x4,
1809
0
                   vpx_highbd_8_sub_pixel_avg_variance8x4,
1810
0
                   vpx_highbd_sad8x4x4d_bits8, vpx_highbd_sad_skip_8x4x4d_bits8)
1811
1812
0
        HIGHBD_BFP(BLOCK_4X8, vpx_highbd_sad4x8_bits8,
1813
0
                   vpx_highbd_sad_skip_4x8_bits8, vpx_highbd_sad4x8_avg_bits8,
1814
0
                   vpx_highbd_8_variance4x8, vpx_highbd_8_sub_pixel_variance4x8,
1815
0
                   vpx_highbd_8_sub_pixel_avg_variance4x8,
1816
0
                   vpx_highbd_sad4x8x4d_bits8, vpx_highbd_sad_skip_4x8x4d_bits8)
1817
1818
0
        HIGHBD_BFP(BLOCK_4X4, vpx_highbd_sad4x4_bits8,
1819
0
                   vpx_highbd_sad_skip_4x4_bits8, vpx_highbd_sad4x4_avg_bits8,
1820
0
                   vpx_highbd_8_variance4x4, vpx_highbd_8_sub_pixel_variance4x4,
1821
0
                   vpx_highbd_8_sub_pixel_avg_variance4x4,
1822
0
                   vpx_highbd_sad4x4x4d_bits8, vpx_highbd_sad_skip_4x4x4d_bits8)
1823
0
        break;
1824
1825
0
      case VPX_BITS_10:
1826
0
        HIGHBD_BFP(
1827
0
            BLOCK_32X16, vpx_highbd_sad32x16_bits10,
1828
0
            vpx_highbd_sad_skip_32x16_bits10, vpx_highbd_sad32x16_avg_bits10,
1829
0
            vpx_highbd_10_variance32x16, vpx_highbd_10_sub_pixel_variance32x16,
1830
0
            vpx_highbd_10_sub_pixel_avg_variance32x16,
1831
0
            vpx_highbd_sad32x16x4d_bits10, vpx_highbd_sad_skip_32x16x4d_bits10)
1832
1833
0
        HIGHBD_BFP(
1834
0
            BLOCK_16X32, vpx_highbd_sad16x32_bits10,
1835
0
            vpx_highbd_sad_skip_16x32_bits10, vpx_highbd_sad16x32_avg_bits10,
1836
0
            vpx_highbd_10_variance16x32, vpx_highbd_10_sub_pixel_variance16x32,
1837
0
            vpx_highbd_10_sub_pixel_avg_variance16x32,
1838
0
            vpx_highbd_sad16x32x4d_bits10, vpx_highbd_sad_skip_16x32x4d_bits10)
1839
1840
0
        HIGHBD_BFP(
1841
0
            BLOCK_64X32, vpx_highbd_sad64x32_bits10,
1842
0
            vpx_highbd_sad_skip_64x32_bits10, vpx_highbd_sad64x32_avg_bits10,
1843
0
            vpx_highbd_10_variance64x32, vpx_highbd_10_sub_pixel_variance64x32,
1844
0
            vpx_highbd_10_sub_pixel_avg_variance64x32,
1845
0
            vpx_highbd_sad64x32x4d_bits10, vpx_highbd_sad_skip_64x32x4d_bits10)
1846
1847
0
        HIGHBD_BFP(
1848
0
            BLOCK_32X64, vpx_highbd_sad32x64_bits10,
1849
0
            vpx_highbd_sad_skip_32x64_bits10, vpx_highbd_sad32x64_avg_bits10,
1850
0
            vpx_highbd_10_variance32x64, vpx_highbd_10_sub_pixel_variance32x64,
1851
0
            vpx_highbd_10_sub_pixel_avg_variance32x64,
1852
0
            vpx_highbd_sad32x64x4d_bits10, vpx_highbd_sad_skip_32x64x4d_bits10)
1853
1854
0
        HIGHBD_BFP(
1855
0
            BLOCK_32X32, vpx_highbd_sad32x32_bits10,
1856
0
            vpx_highbd_sad_skip_32x32_bits10, vpx_highbd_sad32x32_avg_bits10,
1857
0
            vpx_highbd_10_variance32x32, vpx_highbd_10_sub_pixel_variance32x32,
1858
0
            vpx_highbd_10_sub_pixel_avg_variance32x32,
1859
0
            vpx_highbd_sad32x32x4d_bits10, vpx_highbd_sad_skip_32x32x4d_bits10)
1860
1861
0
        HIGHBD_BFP(
1862
0
            BLOCK_64X64, vpx_highbd_sad64x64_bits10,
1863
0
            vpx_highbd_sad_skip_64x64_bits10, vpx_highbd_sad64x64_avg_bits10,
1864
0
            vpx_highbd_10_variance64x64, vpx_highbd_10_sub_pixel_variance64x64,
1865
0
            vpx_highbd_10_sub_pixel_avg_variance64x64,
1866
0
            vpx_highbd_sad64x64x4d_bits10, vpx_highbd_sad_skip_64x64x4d_bits10)
1867
1868
0
        HIGHBD_BFP(
1869
0
            BLOCK_16X16, vpx_highbd_sad16x16_bits10,
1870
0
            vpx_highbd_sad_skip_16x16_bits10, vpx_highbd_sad16x16_avg_bits10,
1871
0
            vpx_highbd_10_variance16x16, vpx_highbd_10_sub_pixel_variance16x16,
1872
0
            vpx_highbd_10_sub_pixel_avg_variance16x16,
1873
0
            vpx_highbd_sad16x16x4d_bits10, vpx_highbd_sad_skip_16x16x4d_bits10)
1874
1875
0
        HIGHBD_BFP(
1876
0
            BLOCK_16X8, vpx_highbd_sad16x8_bits10,
1877
0
            vpx_highbd_sad_skip_16x8_bits10, vpx_highbd_sad16x8_avg_bits10,
1878
0
            vpx_highbd_10_variance16x8, vpx_highbd_10_sub_pixel_variance16x8,
1879
0
            vpx_highbd_10_sub_pixel_avg_variance16x8,
1880
0
            vpx_highbd_sad16x8x4d_bits10, vpx_highbd_sad_skip_16x8x4d_bits10)
1881
1882
0
        HIGHBD_BFP(
1883
0
            BLOCK_8X16, vpx_highbd_sad8x16_bits10,
1884
0
            vpx_highbd_sad_skip_8x16_bits10, vpx_highbd_sad8x16_avg_bits10,
1885
0
            vpx_highbd_10_variance8x16, vpx_highbd_10_sub_pixel_variance8x16,
1886
0
            vpx_highbd_10_sub_pixel_avg_variance8x16,
1887
0
            vpx_highbd_sad8x16x4d_bits10, vpx_highbd_sad_skip_8x16x4d_bits10)
1888
1889
0
        HIGHBD_BFP(
1890
0
            BLOCK_8X8, vpx_highbd_sad8x8_bits10, vpx_highbd_sad_skip_8x8_bits10,
1891
0
            vpx_highbd_sad8x8_avg_bits10, vpx_highbd_10_variance8x8,
1892
0
            vpx_highbd_10_sub_pixel_variance8x8,
1893
0
            vpx_highbd_10_sub_pixel_avg_variance8x8,
1894
0
            vpx_highbd_sad8x8x4d_bits10, vpx_highbd_sad_skip_8x8x4d_bits10)
1895
1896
0
        HIGHBD_BFP(
1897
0
            BLOCK_8X4, vpx_highbd_sad8x4_bits10, vpx_highbd_sad_skip_8x4_bits10,
1898
0
            vpx_highbd_sad8x4_avg_bits10, vpx_highbd_10_variance8x4,
1899
0
            vpx_highbd_10_sub_pixel_variance8x4,
1900
0
            vpx_highbd_10_sub_pixel_avg_variance8x4,
1901
0
            vpx_highbd_sad8x4x4d_bits10, vpx_highbd_sad_skip_8x4x4d_bits10)
1902
1903
0
        HIGHBD_BFP(
1904
0
            BLOCK_4X8, vpx_highbd_sad4x8_bits10, vpx_highbd_sad_skip_4x8_bits10,
1905
0
            vpx_highbd_sad4x8_avg_bits10, vpx_highbd_10_variance4x8,
1906
0
            vpx_highbd_10_sub_pixel_variance4x8,
1907
0
            vpx_highbd_10_sub_pixel_avg_variance4x8,
1908
0
            vpx_highbd_sad4x8x4d_bits10, vpx_highbd_sad_skip_4x8x4d_bits10)
1909
1910
0
        HIGHBD_BFP(
1911
0
            BLOCK_4X4, vpx_highbd_sad4x4_bits10, vpx_highbd_sad_skip_4x4_bits10,
1912
0
            vpx_highbd_sad4x4_avg_bits10, vpx_highbd_10_variance4x4,
1913
0
            vpx_highbd_10_sub_pixel_variance4x4,
1914
0
            vpx_highbd_10_sub_pixel_avg_variance4x4,
1915
0
            vpx_highbd_sad4x4x4d_bits10, vpx_highbd_sad_skip_4x4x4d_bits10)
1916
0
        break;
1917
1918
0
      default:
1919
0
        assert(cm->bit_depth == VPX_BITS_12);
1920
0
        HIGHBD_BFP(
1921
0
            BLOCK_32X16, vpx_highbd_sad32x16_bits12,
1922
0
            vpx_highbd_sad_skip_32x16_bits12, vpx_highbd_sad32x16_avg_bits12,
1923
0
            vpx_highbd_12_variance32x16, vpx_highbd_12_sub_pixel_variance32x16,
1924
0
            vpx_highbd_12_sub_pixel_avg_variance32x16,
1925
0
            vpx_highbd_sad32x16x4d_bits12, vpx_highbd_sad_skip_32x16x4d_bits12)
1926
1927
0
        HIGHBD_BFP(
1928
0
            BLOCK_16X32, vpx_highbd_sad16x32_bits12,
1929
0
            vpx_highbd_sad_skip_16x32_bits12, vpx_highbd_sad16x32_avg_bits12,
1930
0
            vpx_highbd_12_variance16x32, vpx_highbd_12_sub_pixel_variance16x32,
1931
0
            vpx_highbd_12_sub_pixel_avg_variance16x32,
1932
0
            vpx_highbd_sad16x32x4d_bits12, vpx_highbd_sad_skip_16x32x4d_bits12)
1933
1934
0
        HIGHBD_BFP(
1935
0
            BLOCK_64X32, vpx_highbd_sad64x32_bits12,
1936
0
            vpx_highbd_sad_skip_64x32_bits12, vpx_highbd_sad64x32_avg_bits12,
1937
0
            vpx_highbd_12_variance64x32, vpx_highbd_12_sub_pixel_variance64x32,
1938
0
            vpx_highbd_12_sub_pixel_avg_variance64x32,
1939
0
            vpx_highbd_sad64x32x4d_bits12, vpx_highbd_sad_skip_64x32x4d_bits12)
1940
1941
0
        HIGHBD_BFP(
1942
0
            BLOCK_32X64, vpx_highbd_sad32x64_bits12,
1943
0
            vpx_highbd_sad_skip_32x64_bits12, vpx_highbd_sad32x64_avg_bits12,
1944
0
            vpx_highbd_12_variance32x64, vpx_highbd_12_sub_pixel_variance32x64,
1945
0
            vpx_highbd_12_sub_pixel_avg_variance32x64,
1946
0
            vpx_highbd_sad32x64x4d_bits12, vpx_highbd_sad_skip_32x64x4d_bits12)
1947
1948
0
        HIGHBD_BFP(
1949
0
            BLOCK_32X32, vpx_highbd_sad32x32_bits12,
1950
0
            vpx_highbd_sad_skip_32x32_bits12, vpx_highbd_sad32x32_avg_bits12,
1951
0
            vpx_highbd_12_variance32x32, vpx_highbd_12_sub_pixel_variance32x32,
1952
0
            vpx_highbd_12_sub_pixel_avg_variance32x32,
1953
0
            vpx_highbd_sad32x32x4d_bits12, vpx_highbd_sad_skip_32x32x4d_bits12)
1954
1955
0
        HIGHBD_BFP(
1956
0
            BLOCK_64X64, vpx_highbd_sad64x64_bits12,
1957
0
            vpx_highbd_sad_skip_64x64_bits12, vpx_highbd_sad64x64_avg_bits12,
1958
0
            vpx_highbd_12_variance64x64, vpx_highbd_12_sub_pixel_variance64x64,
1959
0
            vpx_highbd_12_sub_pixel_avg_variance64x64,
1960
0
            vpx_highbd_sad64x64x4d_bits12, vpx_highbd_sad_skip_64x64x4d_bits12)
1961
1962
0
        HIGHBD_BFP(
1963
0
            BLOCK_16X16, vpx_highbd_sad16x16_bits12,
1964
0
            vpx_highbd_sad_skip_16x16_bits12, vpx_highbd_sad16x16_avg_bits12,
1965
0
            vpx_highbd_12_variance16x16, vpx_highbd_12_sub_pixel_variance16x16,
1966
0
            vpx_highbd_12_sub_pixel_avg_variance16x16,
1967
0
            vpx_highbd_sad16x16x4d_bits12, vpx_highbd_sad_skip_16x16x4d_bits12)
1968
1969
0
        HIGHBD_BFP(
1970
0
            BLOCK_16X8, vpx_highbd_sad16x8_bits12,
1971
0
            vpx_highbd_sad_skip_16x8_bits12, vpx_highbd_sad16x8_avg_bits12,
1972
0
            vpx_highbd_12_variance16x8, vpx_highbd_12_sub_pixel_variance16x8,
1973
0
            vpx_highbd_12_sub_pixel_avg_variance16x8,
1974
0
            vpx_highbd_sad16x8x4d_bits12, vpx_highbd_sad_skip_16x8x4d_bits12)
1975
1976
0
        HIGHBD_BFP(
1977
0
            BLOCK_8X16, vpx_highbd_sad8x16_bits12,
1978
0
            vpx_highbd_sad_skip_8x16_bits12, vpx_highbd_sad8x16_avg_bits12,
1979
0
            vpx_highbd_12_variance8x16, vpx_highbd_12_sub_pixel_variance8x16,
1980
0
            vpx_highbd_12_sub_pixel_avg_variance8x16,
1981
0
            vpx_highbd_sad8x16x4d_bits12, vpx_highbd_sad_skip_8x16x4d_bits12)
1982
1983
0
        HIGHBD_BFP(
1984
0
            BLOCK_8X8, vpx_highbd_sad8x8_bits12, vpx_highbd_sad_skip_8x8_bits12,
1985
0
            vpx_highbd_sad8x8_avg_bits12, vpx_highbd_12_variance8x8,
1986
0
            vpx_highbd_12_sub_pixel_variance8x8,
1987
0
            vpx_highbd_12_sub_pixel_avg_variance8x8,
1988
0
            vpx_highbd_sad8x8x4d_bits12, vpx_highbd_sad_skip_8x8x4d_bits12)
1989
1990
0
        HIGHBD_BFP(
1991
0
            BLOCK_8X4, vpx_highbd_sad8x4_bits12, vpx_highbd_sad_skip_8x4_bits12,
1992
0
            vpx_highbd_sad8x4_avg_bits12, vpx_highbd_12_variance8x4,
1993
0
            vpx_highbd_12_sub_pixel_variance8x4,
1994
0
            vpx_highbd_12_sub_pixel_avg_variance8x4,
1995
0
            vpx_highbd_sad8x4x4d_bits12, vpx_highbd_sad_skip_8x4x4d_bits12)
1996
1997
0
        HIGHBD_BFP(
1998
0
            BLOCK_4X8, vpx_highbd_sad4x8_bits12, vpx_highbd_sad_skip_4x8_bits12,
1999
0
            vpx_highbd_sad4x8_avg_bits12, vpx_highbd_12_variance4x8,
2000
0
            vpx_highbd_12_sub_pixel_variance4x8,
2001
0
            vpx_highbd_12_sub_pixel_avg_variance4x8,
2002
0
            vpx_highbd_sad4x8x4d_bits12, vpx_highbd_sad_skip_4x8x4d_bits12)
2003
2004
0
        HIGHBD_BFP(
2005
0
            BLOCK_4X4, vpx_highbd_sad4x4_bits12, vpx_highbd_sad_skip_4x4_bits12,
2006
0
            vpx_highbd_sad4x4_avg_bits12, vpx_highbd_12_variance4x4,
2007
0
            vpx_highbd_12_sub_pixel_variance4x4,
2008
0
            vpx_highbd_12_sub_pixel_avg_variance4x4,
2009
0
            vpx_highbd_sad4x4x4d_bits12, vpx_highbd_sad_skip_4x4x4d_bits12)
2010
0
        break;
2011
0
    }
2012
0
  }
2013
29.1k
}
2014
#endif  // CONFIG_VP9_HIGHBITDEPTH
2015
2016
10.9k
static void realloc_segmentation_maps(VP9_COMP *cpi) {
2017
10.9k
  VP9_COMMON *const cm = &cpi->common;
2018
2019
  // Create the encoder segmentation map and set all entries to 0
2020
10.9k
  vpx_free(cpi->segmentation_map);
2021
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->segmentation_map,
2022
10.9k
                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
2023
2024
  // Create a map used for cyclic background refresh.
2025
10.9k
  if (cpi->cyclic_refresh) vp9_cyclic_refresh_free(cpi->cyclic_refresh);
2026
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->cyclic_refresh,
2027
10.9k
                  vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols));
2028
2029
  // Create a map used to mark inactive areas.
2030
10.9k
  vpx_free(cpi->active_map.map);
2031
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->active_map.map,
2032
10.9k
                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
2033
2034
  // And a place holder structure is the coding context
2035
  // for use if we want to save and restore it
2036
10.9k
  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
2037
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->coding_context.last_frame_seg_map_copy,
2038
10.9k
                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
2039
10.9k
}
2040
2041
0
static void alloc_copy_partition_data(VP9_COMP *cpi) {
2042
0
  VP9_COMMON *const cm = &cpi->common;
2043
0
  if (cpi->prev_partition == NULL) {
2044
0
    CHECK_MEM_ERROR(&cm->error, cpi->prev_partition,
2045
0
                    (BLOCK_SIZE *)vpx_calloc(cm->mi_stride * cm->mi_rows,
2046
0
                                             sizeof(*cpi->prev_partition)));
2047
0
  }
2048
0
  if (cpi->prev_segment_id == NULL) {
2049
0
    CHECK_MEM_ERROR(
2050
0
        &cm->error, cpi->prev_segment_id,
2051
0
        (int8_t *)vpx_calloc((cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1),
2052
0
                             sizeof(*cpi->prev_segment_id)));
2053
0
  }
2054
0
  if (cpi->prev_variance_low == NULL) {
2055
0
    CHECK_MEM_ERROR(&cm->error, cpi->prev_variance_low,
2056
0
                    (uint8_t *)vpx_calloc(
2057
0
                        (cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1) * 25,
2058
0
                        sizeof(*cpi->prev_variance_low)));
2059
0
  }
2060
0
  if (cpi->copied_frame_cnt == NULL) {
2061
0
    CHECK_MEM_ERROR(
2062
0
        &cm->error, cpi->copied_frame_cnt,
2063
0
        (uint8_t *)vpx_calloc((cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1),
2064
0
                              sizeof(*cpi->copied_frame_cnt)));
2065
0
  }
2066
0
}
2067
2068
0
static void free_copy_partition_data(VP9_COMP *cpi) {
2069
0
  vpx_free(cpi->prev_partition);
2070
0
  cpi->prev_partition = NULL;
2071
0
  vpx_free(cpi->prev_segment_id);
2072
0
  cpi->prev_segment_id = NULL;
2073
0
  vpx_free(cpi->prev_variance_low);
2074
0
  cpi->prev_variance_low = NULL;
2075
0
  vpx_free(cpi->copied_frame_cnt);
2076
0
  cpi->copied_frame_cnt = NULL;
2077
0
}
2078
2079
#if CONFIG_VP9_TEMPORAL_DENOISING
2080
static void setup_denoiser_buffer(VP9_COMP *cpi) {
2081
  VP9_COMMON *const cm = &cpi->common;
2082
  if (cpi->oxcf.noise_sensitivity > 0 &&
2083
      !cpi->denoiser.frame_buffer_initialized) {
2084
    if (vp9_denoiser_alloc(cm, &cpi->svc, &cpi->denoiser, cpi->use_svc,
2085
                           cpi->oxcf.noise_sensitivity, cm->width, cm->height,
2086
                           cm->subsampling_x, cm->subsampling_y,
2087
#if CONFIG_VP9_HIGHBITDEPTH
2088
                           cm->use_highbitdepth,
2089
#endif
2090
                           VP9_ENC_BORDER_IN_PIXELS))
2091
      vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
2092
                         "Failed to allocate denoiser");
2093
  }
2094
}
2095
#endif
2096
2097
18.2k
void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
2098
18.2k
  VP9_COMMON *const cm = &cpi->common;
2099
18.2k
  RATE_CONTROL *const rc = &cpi->rc;
2100
18.2k
  int last_w = cpi->oxcf.width;
2101
18.2k
  int last_h = cpi->oxcf.height;
2102
2103
18.2k
  vp9_init_quantizer(cpi);
2104
18.2k
  if (cm->profile != oxcf->profile) cm->profile = oxcf->profile;
2105
18.2k
  cm->bit_depth = oxcf->bit_depth;
2106
18.2k
  cm->color_space = oxcf->color_space;
2107
18.2k
  cm->color_range = oxcf->color_range;
2108
2109
18.2k
  cpi->target_level = oxcf->target_level;
2110
18.2k
  cpi->keep_level_stats = oxcf->target_level != LEVEL_MAX;
2111
18.2k
  set_level_constraint(&cpi->level_constraint,
2112
18.2k
                       get_level_index(cpi->target_level));
2113
2114
18.2k
  if (cm->profile <= PROFILE_1)
2115
18.2k
    assert(cm->bit_depth == VPX_BITS_8);
2116
0
  else
2117
18.2k
    assert(cm->bit_depth > VPX_BITS_8);
2118
2119
18.2k
  cpi->oxcf = *oxcf;
2120
18.2k
#if CONFIG_VP9_HIGHBITDEPTH
2121
18.2k
  cpi->td.mb.e_mbd.bd = (int)cm->bit_depth;
2122
18.2k
#endif  // CONFIG_VP9_HIGHBITDEPTH
2123
2124
18.2k
  if ((oxcf->pass == 0) && (oxcf->rc_mode == VPX_Q)) {
2125
0
    rc->baseline_gf_interval = FIXED_GF_INTERVAL;
2126
18.2k
  } else {
2127
18.2k
    rc->baseline_gf_interval = (MIN_GF_INTERVAL + MAX_GF_INTERVAL) / 2;
2128
18.2k
  }
2129
2130
18.2k
  cpi->refresh_golden_frame = 0;
2131
18.2k
  cpi->refresh_last_frame = 1;
2132
18.2k
  cm->refresh_frame_context = 1;
2133
18.2k
  cm->reset_frame_context = 0;
2134
2135
18.2k
  vp9_reset_segment_features(&cm->seg);
2136
18.2k
  vp9_set_high_precision_mv(cpi, 0);
2137
2138
18.2k
  {
2139
18.2k
    int i;
2140
2141
164k
    for (i = 0; i < MAX_SEGMENTS; i++)
2142
146k
      cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
2143
18.2k
  }
2144
18.2k
  cpi->encode_breakout = cpi->oxcf.encode_breakout;
2145
2146
18.2k
  vp9_set_rc_buffer_sizes(cpi);
2147
2148
  // Set up frame rate and related parameters rate control values.
2149
18.2k
  vp9_new_framerate(cpi, cpi->framerate);
2150
2151
  // Set absolute upper and lower quality limits
2152
18.2k
  rc->worst_quality = cpi->oxcf.worst_allowed_q;
2153
18.2k
  rc->best_quality = cpi->oxcf.best_allowed_q;
2154
2155
18.2k
  cm->interp_filter = cpi->sf.default_interp_filter;
2156
2157
18.2k
  if (cpi->oxcf.render_width > 0 && cpi->oxcf.render_height > 0) {
2158
0
    cm->render_width = cpi->oxcf.render_width;
2159
0
    cm->render_height = cpi->oxcf.render_height;
2160
18.2k
  } else {
2161
18.2k
    cm->render_width = cpi->oxcf.width;
2162
18.2k
    cm->render_height = cpi->oxcf.height;
2163
18.2k
  }
2164
18.2k
  if (last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) {
2165
0
    cm->width = cpi->oxcf.width;
2166
0
    cm->height = cpi->oxcf.height;
2167
0
    cpi->external_resize = 1;
2168
0
  }
2169
2170
18.2k
  if (cpi->initial_width && cpi->initial_height &&
2171
7.32k
      (cm->width > cpi->initial_width || cm->height > cpi->initial_height)) {
2172
0
    vp9_free_context_buffers(cm);
2173
0
    vp9_free_pc_tree(&cpi->td);
2174
0
    vpx_free(cpi->mbmi_ext_base);
2175
0
    alloc_compressor_data(cpi);
2176
0
    realloc_segmentation_maps(cpi);
2177
0
    cpi->initial_width = cm->width;
2178
0
    cpi->initial_height = cm->height;
2179
0
    cpi->external_resize = 0;
2180
0
  }
2181
2182
18.2k
  if (cm->current_video_frame == 0 || last_w != cpi->oxcf.width ||
2183
0
      last_h != cpi->oxcf.height)
2184
18.2k
    update_frame_size(cpi);
2185
2186
18.2k
  if (last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) {
2187
0
    int svc_alloc_mi_area = cm->mi_rows * cm->mi_cols;
2188
0
    if (cpi->svc.number_spatial_layers > 1 && cpi->initial_width &&
2189
0
        cpi->initial_height) {
2190
0
      int init_mi_rows, init_mi_cols, init_mi_stride;
2191
0
      vp9_set_mi_size(&init_mi_rows, &init_mi_cols, &init_mi_stride,
2192
0
                      cpi->initial_width, cpi->initial_height);
2193
0
      svc_alloc_mi_area =
2194
0
          VPXMAX(svc_alloc_mi_area, init_mi_rows * init_mi_cols);
2195
0
    }
2196
0
    vpx_free(cpi->consec_zero_mv);
2197
0
    CHECK_MEM_ERROR(
2198
0
        &cm->error, cpi->consec_zero_mv,
2199
0
        vpx_calloc(svc_alloc_mi_area, sizeof(*cpi->consec_zero_mv)));
2200
2201
0
    vpx_free(cpi->skin_map);
2202
0
    CHECK_MEM_ERROR(&cm->error, cpi->skin_map,
2203
0
                    vpx_calloc(svc_alloc_mi_area, sizeof(*cpi->skin_map)));
2204
2205
0
    if (cpi->svc.number_spatial_layers > 1) {
2206
#if CONFIG_VP9_TEMPORAL_DENOISING
2207
      // Reset the denoiser for svc on the resize change.
2208
      if (cpi->oxcf.noise_sensitivity > 0) {
2209
        vp9_denoiser_free(&cpi->denoiser);
2210
        setup_denoiser_buffer(cpi);
2211
      }
2212
#endif
2213
0
      for (int sl = 0; sl < cpi->svc.number_spatial_layers; ++sl) {
2214
0
        const int layer =
2215
0
            LAYER_IDS_TO_IDX(sl, 0, cpi->svc.number_temporal_layers);
2216
0
        LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer];
2217
0
        lc->sb_index = 0;
2218
0
        lc->actual_num_seg1_blocks = 0;
2219
0
        lc->actual_num_seg2_blocks = 0;
2220
0
        lc->counter_encode_maxq_scene_change = 0;
2221
0
        vpx_free(lc->map);
2222
0
        CHECK_MEM_ERROR(&cm->error, lc->map,
2223
0
                        vpx_calloc(svc_alloc_mi_area, sizeof(*lc->map)));
2224
0
        vpx_free(lc->last_coded_q_map);
2225
0
        CHECK_MEM_ERROR(
2226
0
            &cm->error, lc->last_coded_q_map,
2227
0
            vpx_malloc(svc_alloc_mi_area * sizeof(*lc->last_coded_q_map)));
2228
0
        memset(lc->last_coded_q_map, MAXQ, svc_alloc_mi_area);
2229
0
        vpx_free(lc->consec_zero_mv);
2230
0
        CHECK_MEM_ERROR(
2231
0
            &cm->error, lc->consec_zero_mv,
2232
0
            vpx_calloc(svc_alloc_mi_area, sizeof(*lc->consec_zero_mv)));
2233
0
      }
2234
0
      if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
2235
0
        cpi->refresh_golden_frame = 1;
2236
0
        cpi->refresh_alt_ref_frame = 1;
2237
0
      }
2238
0
    }
2239
2240
0
    free_copy_partition_data(cpi);
2241
0
    alloc_copy_partition_data(cpi);
2242
0
    if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ &&
2243
0
        cpi->svc.number_spatial_layers == 1)
2244
0
      vp9_cyclic_refresh_reset_resize(cpi);
2245
0
    vpx_free(cpi->count_arf_frame_usage);
2246
0
    cpi->count_arf_frame_usage = NULL;
2247
0
    vpx_free(cpi->count_lastgolden_frame_usage);
2248
0
    cpi->count_lastgolden_frame_usage = NULL;
2249
0
    rc->rc_1_frame = 0;
2250
0
    rc->rc_2_frame = 0;
2251
0
  }
2252
2253
18.2k
  if ((cpi->svc.number_temporal_layers > 1) ||
2254
18.2k
      ((cpi->svc.number_temporal_layers > 1 ||
2255
18.2k
        cpi->svc.number_spatial_layers > 1) &&
2256
0
       cpi->oxcf.pass != 1)) {
2257
0
    vp9_update_layer_context_change_config(cpi,
2258
0
                                           (int)cpi->oxcf.target_bandwidth);
2259
0
  }
2260
2261
18.2k
  vp9_check_reset_rc_flag(cpi);
2262
2263
18.2k
  cpi->alt_ref_source = NULL;
2264
18.2k
  rc->is_src_frame_alt_ref = 0;
2265
2266
#if 0
2267
  // Experimental RD Code
2268
  cpi->frame_distortion = 0;
2269
  cpi->last_frame_distortion = 0;
2270
#endif
2271
2272
18.2k
  set_tile_limits(cpi);
2273
2274
18.2k
  cpi->ext_refresh_frame_flags_pending = 0;
2275
18.2k
  cpi->ext_refresh_frame_context_pending = 0;
2276
2277
18.2k
#if CONFIG_VP9_HIGHBITDEPTH
2278
18.2k
  highbd_set_var_fns(cpi);
2279
18.2k
#endif
2280
2281
18.2k
  vp9_set_row_mt(cpi);
2282
18.2k
}
2283
2284
/***********************************************************************
2285
 * Read before modifying 'cal_nmvjointsadcost' or 'cal_nmvsadcosts'    *
2286
 ***********************************************************************
2287
 * The following 2 functions ('cal_nmvjointsadcost' and                *
2288
 * 'cal_nmvsadcosts') are used to calculate cost lookup tables         *
2289
 * used by 'vp9_diamond_search_sad'. The C implementation of the       *
2290
 * function is generic, but the NEON intrinsics optimised version      *
2291
 * relies on the following properties of the computed tables:          *
2292
 * For cal_nmvjointsadcost:                                            *
2293
 *   - mvjointsadcost[1] == mvjointsadcost[2] == mvjointsadcost[3]     *
2294
 * For cal_nmvsadcosts:                                                *
2295
 *   - For all i: mvsadcost[0][i] == mvsadcost[1][i]                   *
2296
 *         (Equal costs for both components)                           *
2297
 *   - For all i: mvsadcost[0][i] == mvsadcost[0][-i]                  *
2298
 *         (Cost function is even)                                     *
2299
 * If these do not hold, then the NEON optimised version of the        *
2300
 * 'vp9_diamond_search_sad' function cannot be used as it is, in which *
2301
 * case you can revert to using the C function instead.                *
2302
 ***********************************************************************/
2303
2304
10.9k
static void cal_nmvjointsadcost(int *mvjointsadcost) {
2305
  /*********************************************************************
2306
   * Warning: Read the comments above before modifying this function   *
2307
   *********************************************************************/
2308
10.9k
  mvjointsadcost[0] = 600;
2309
10.9k
  mvjointsadcost[1] = 300;
2310
10.9k
  mvjointsadcost[2] = 300;
2311
10.9k
  mvjointsadcost[3] = 300;
2312
10.9k
}
2313
2314
10.9k
static void cal_nmvsadcosts(int *mvsadcost[2]) {
2315
  /*********************************************************************
2316
   * Warning: Read the comments above before modifying this function   *
2317
   *********************************************************************/
2318
10.9k
  int i = 1;
2319
2320
10.9k
  mvsadcost[0][0] = 0;
2321
10.9k
  mvsadcost[1][0] = 0;
2322
2323
178M
  do {
2324
178M
    double z = 256 * (2 * (log2f(8 * i) + .6));
2325
178M
    mvsadcost[0][i] = (int)z;
2326
178M
    mvsadcost[1][i] = (int)z;
2327
178M
    mvsadcost[0][-i] = (int)z;
2328
178M
    mvsadcost[1][-i] = (int)z;
2329
178M
  } while (++i <= MV_MAX);
2330
10.9k
}
2331
2332
10.9k
static void cal_nmvsadcosts_hp(int *mvsadcost[2]) {
2333
10.9k
  int i = 1;
2334
2335
10.9k
  mvsadcost[0][0] = 0;
2336
10.9k
  mvsadcost[1][0] = 0;
2337
2338
178M
  do {
2339
178M
    double z = 256 * (2 * (log2f(8 * i) + .6));
2340
178M
    mvsadcost[0][i] = (int)z;
2341
178M
    mvsadcost[1][i] = (int)z;
2342
178M
    mvsadcost[0][-i] = (int)z;
2343
178M
    mvsadcost[1][-i] = (int)z;
2344
178M
  } while (++i <= MV_MAX);
2345
10.9k
}
2346
2347
10.9k
static void init_ref_frame_bufs(VP9_COMMON *cm) {
2348
10.9k
  int i;
2349
10.9k
  BufferPool *const pool = cm->buffer_pool;
2350
10.9k
  cm->new_fb_idx = INVALID_IDX;
2351
98.3k
  for (i = 0; i < REF_FRAMES; ++i) {
2352
87.4k
    cm->ref_frame_map[i] = INVALID_IDX;
2353
87.4k
  }
2354
142k
  for (i = 0; i < FRAME_BUFFERS; ++i) {
2355
131k
    pool->frame_bufs[i].ref_count = 0;
2356
131k
  }
2357
10.9k
}
2358
2359
static void update_initial_width(VP9_COMP *cpi, int use_highbitdepth,
2360
446k
                                 int subsampling_x, int subsampling_y) {
2361
446k
  VP9_COMMON *const cm = &cpi->common;
2362
#if !CONFIG_VP9_HIGHBITDEPTH
2363
  (void)use_highbitdepth;
2364
  assert(use_highbitdepth == 0);
2365
#endif
2366
2367
446k
  if (!cpi->initial_width ||
2368
446k
#if CONFIG_VP9_HIGHBITDEPTH
2369
446k
      cm->use_highbitdepth != use_highbitdepth ||
2370
446k
#endif
2371
446k
      cm->subsampling_x != subsampling_x ||
2372
435k
      cm->subsampling_y != subsampling_y) {
2373
10.9k
    cm->subsampling_x = subsampling_x;
2374
10.9k
    cm->subsampling_y = subsampling_y;
2375
10.9k
#if CONFIG_VP9_HIGHBITDEPTH
2376
10.9k
    cm->use_highbitdepth = use_highbitdepth;
2377
10.9k
#endif
2378
10.9k
    alloc_util_frame_buffers(cpi);
2379
    // The initial_width/height is used to clamp the encoding width/height in
2380
    // vp9_set_size_literal(). The check below is added to avoid setting the
2381
    // initial_width/height to a smaller resolution than the one configured.
2382
    // This can happen when the user passes in a lower resolution on the very
2383
    // first frame (after creating the encoder with a larger resolution). For
2384
    // spatial layers this will prevent user from going back up in resolution
2385
    // (i.e., the top layer will get stuck at the lower resolution).
2386
10.9k
    if (cm->width > cpi->initial_width || cm->height > cpi->initial_height) {
2387
0
      cpi->initial_width = cm->width;
2388
0
      cpi->initial_height = cm->height;
2389
0
    }
2390
10.9k
    cpi->initial_mbs = cm->MBs;
2391
10.9k
  }
2392
446k
}
2393
2394
VP9_COMP *vp9_create_compressor(const VP9EncoderConfig *oxcf,
2395
10.9k
                                BufferPool *const pool) {
2396
10.9k
  unsigned int i;
2397
10.9k
  VP9_COMP *volatile const cpi = vpx_memalign(32, sizeof(*cpi));
2398
10.9k
  VP9_COMMON *volatile const cm = cpi != NULL ? &cpi->common : NULL;
2399
2400
10.9k
  if (!cm) return NULL;
2401
2402
10.9k
  vp9_zero(*cpi);
2403
2404
10.9k
  if (setjmp(cm->error.jmp)) {
2405
0
    cm->error.setjmp = 0;
2406
0
    vp9_remove_compressor(cpi);
2407
0
    return 0;
2408
0
  }
2409
2410
10.9k
  cm->error.setjmp = 1;
2411
10.9k
  cm->alloc_mi = vp9_enc_alloc_mi;
2412
10.9k
  cm->free_mi = vp9_enc_free_mi;
2413
10.9k
  cm->setup_mi = vp9_enc_setup_mi;
2414
2415
10.9k
  CHECK_MEM_ERROR(&cm->error, cm->fc,
2416
10.9k
                  (FRAME_CONTEXT *)vpx_calloc(1, sizeof(*cm->fc)));
2417
10.9k
  CHECK_MEM_ERROR(
2418
10.9k
      &cm->error, cm->frame_contexts,
2419
10.9k
      (FRAME_CONTEXT *)vpx_calloc(FRAME_CONTEXTS, sizeof(*cm->frame_contexts)));
2420
2421
10.9k
  cpi->compute_frame_low_motion_onepass = 1;
2422
10.9k
  cpi->use_svc = 0;
2423
10.9k
  cpi->resize_state = ORIG;
2424
10.9k
  cpi->external_resize = 0;
2425
10.9k
  cpi->resize_avg_qp = 0;
2426
10.9k
  cpi->resize_buffer_underflow = 0;
2427
10.9k
  cpi->use_skin_detection = 0;
2428
10.9k
  cpi->common.buffer_pool = pool;
2429
10.9k
  init_ref_frame_bufs(cm);
2430
2431
10.9k
  cpi->force_update_segmentation = 0;
2432
2433
10.9k
  init_config(cpi, oxcf);
2434
10.9k
  cpi->frame_info = vp9_get_frame_info(oxcf);
2435
2436
10.9k
  vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc);
2437
10.9k
  vp9_init_rd_parameters(cpi);
2438
2439
10.9k
  init_frame_indexes(cm);
2440
10.9k
  cpi->initial_width = cpi->oxcf.width;
2441
10.9k
  cpi->initial_height = cpi->oxcf.height;
2442
10.9k
  cpi->tile_data = NULL;
2443
2444
10.9k
  realloc_segmentation_maps(cpi);
2445
2446
10.9k
  CHECK_MEM_ERROR(
2447
10.9k
      &cm->error, cpi->skin_map,
2448
10.9k
      vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->skin_map)));
2449
2450
10.9k
#if !CONFIG_REALTIME_ONLY
2451
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->alt_ref_aq, vp9_alt_ref_aq_create());
2452
10.9k
#endif
2453
2454
10.9k
  CHECK_MEM_ERROR(
2455
10.9k
      &cm->error, cpi->consec_zero_mv,
2456
10.9k
      vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->consec_zero_mv)));
2457
2458
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts[0],
2459
10.9k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[0])));
2460
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts[1],
2461
10.9k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[1])));
2462
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts_hp[0],
2463
10.9k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[0])));
2464
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts_hp[1],
2465
10.9k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[1])));
2466
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts[0],
2467
10.9k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[0])));
2468
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts[1],
2469
10.9k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[1])));
2470
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts_hp[0],
2471
10.9k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[0])));
2472
10.9k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts_hp[1],
2473
10.9k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[1])));
2474
2475
284k
  for (i = 0; i < (sizeof(cpi->mbgraph_stats) / sizeof(cpi->mbgraph_stats[0]));
2476
273k
       i++) {
2477
273k
    CHECK_MEM_ERROR(
2478
273k
        &cm->error, cpi->mbgraph_stats[i].mb_stats,
2479
273k
        vpx_calloc(cm->MBs * sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
2480
273k
  }
2481
2482
10.9k
  cpi->refresh_alt_ref_frame = 0;
2483
10.9k
  cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
2484
2485
10.9k
  init_level_info(&cpi->level_info);
2486
10.9k
  init_level_constraint(&cpi->level_constraint);
2487
2488
#if CONFIG_INTERNAL_STATS
2489
  cpi->b_calculate_blockiness = 1;
2490
  cpi->b_calculate_consistency = 1;
2491
  cpi->total_inconsistency = 0;
2492
  cpi->psnr.worst = 100.0;
2493
  cpi->worst_ssim = 100.0;
2494
2495
  cpi->count = 0;
2496
  cpi->bytes = 0;
2497
2498
  if (cpi->b_calculate_psnr) {
2499
    cpi->total_sq_error = 0;
2500
    cpi->total_samples = 0;
2501
2502
    cpi->totalp_sq_error = 0;
2503
    cpi->totalp_samples = 0;
2504
2505
    cpi->tot_recode_hits = 0;
2506
    cpi->summed_quality = 0;
2507
    cpi->summed_weights = 0;
2508
    cpi->summedp_quality = 0;
2509
    cpi->summedp_weights = 0;
2510
  }
2511
2512
  cpi->fastssim.worst = 100.0;
2513
2514
  cpi->psnrhvs.worst = 100.0;
2515
2516
  if (cpi->b_calculate_blockiness) {
2517
    cpi->total_blockiness = 0;
2518
    cpi->worst_blockiness = 0.0;
2519
  }
2520
2521
  if (cpi->b_calculate_consistency) {
2522
    CHECK_MEM_ERROR(&cm->error, cpi->ssim_vars,
2523
                    vpx_calloc(cpi->common.mi_rows * cpi->common.mi_cols,
2524
                               sizeof(*cpi->ssim_vars) * 4));
2525
    cpi->worst_consistency = 100.0;
2526
  } else {
2527
    cpi->ssim_vars = NULL;
2528
  }
2529
2530
#endif
2531
2532
10.9k
  cpi->first_time_stamp_ever = INT64_MAX;
2533
2534
  /*********************************************************************
2535
   * Warning: Read the comments around 'cal_nmvjointsadcost' and       *
2536
   * 'cal_nmvsadcosts' before modifying how these tables are computed. *
2537
   *********************************************************************/
2538
10.9k
  cal_nmvjointsadcost(cpi->td.mb.nmvjointsadcost);
2539
10.9k
  cpi->td.mb.nmvcost[0] = &cpi->nmvcosts[0][MV_MAX];
2540
10.9k
  cpi->td.mb.nmvcost[1] = &cpi->nmvcosts[1][MV_MAX];
2541
10.9k
  cpi->td.mb.nmvsadcost[0] = &cpi->nmvsadcosts[0][MV_MAX];
2542
10.9k
  cpi->td.mb.nmvsadcost[1] = &cpi->nmvsadcosts[1][MV_MAX];
2543
10.9k
  cal_nmvsadcosts(cpi->td.mb.nmvsadcost);
2544
2545
10.9k
  cpi->td.mb.nmvcost_hp[0] = &cpi->nmvcosts_hp[0][MV_MAX];
2546
10.9k
  cpi->td.mb.nmvcost_hp[1] = &cpi->nmvcosts_hp[1][MV_MAX];
2547
10.9k
  cpi->td.mb.nmvsadcost_hp[0] = &cpi->nmvsadcosts_hp[0][MV_MAX];
2548
10.9k
  cpi->td.mb.nmvsadcost_hp[1] = &cpi->nmvsadcosts_hp[1][MV_MAX];
2549
10.9k
  cal_nmvsadcosts_hp(cpi->td.mb.nmvsadcost_hp);
2550
2551
#if CONFIG_VP9_TEMPORAL_DENOISING
2552
#ifdef OUTPUT_YUV_DENOISED
2553
  yuv_denoised_file = fopen("denoised.yuv", "ab");
2554
#endif
2555
#endif
2556
#ifdef OUTPUT_YUV_SKINMAP
2557
  yuv_skinmap_file = fopen("skinmap.yuv", "wb");
2558
#endif
2559
#ifdef OUTPUT_YUV_REC
2560
  yuv_rec_file = fopen("rec.yuv", "wb");
2561
#endif
2562
#ifdef OUTPUT_YUV_SVC_SRC
2563
  yuv_svc_src[0] = fopen("svc_src_0.yuv", "wb");
2564
  yuv_svc_src[1] = fopen("svc_src_1.yuv", "wb");
2565
  yuv_svc_src[2] = fopen("svc_src_2.yuv", "wb");
2566
#endif
2567
2568
#if 0
2569
  framepsnr = fopen("framepsnr.stt", "a");
2570
  kf_list = fopen("kf_list.stt", "w");
2571
#endif
2572
2573
10.9k
  cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
2574
2575
10.9k
  {
2576
10.9k
    vpx_codec_err_t codec_status = vp9_extrc_init(&cpi->ext_ratectrl);
2577
10.9k
    if (codec_status != VPX_CODEC_OK) {
2578
0
      vpx_internal_error(&cm->error, codec_status, "vp9_extrc_init() failed");
2579
0
    }
2580
10.9k
  }
2581
2582
10.9k
#if !CONFIG_REALTIME_ONLY
2583
10.9k
  if (oxcf->pass == 1) {
2584
0
    vp9_init_first_pass(cpi);
2585
10.9k
  } else if (oxcf->pass == 2) {
2586
0
    const size_t packet_sz = sizeof(FIRSTPASS_STATS);
2587
0
    const int packets = (int)(oxcf->two_pass_stats_in.sz / packet_sz);
2588
2589
0
    if (cpi->svc.number_spatial_layers > 1 ||
2590
0
        cpi->svc.number_temporal_layers > 1) {
2591
0
      FIRSTPASS_STATS *const stats = oxcf->two_pass_stats_in.buf;
2592
0
      FIRSTPASS_STATS *stats_copy[VPX_SS_MAX_LAYERS] = { 0 };
2593
0
      int n;
2594
2595
0
      for (n = 0; n < oxcf->ss_number_layers; ++n) {
2596
0
        FIRSTPASS_STATS *const last_packet_for_layer =
2597
0
            &stats[packets - oxcf->ss_number_layers + n];
2598
0
        const int layer_id = (int)last_packet_for_layer->spatial_layer_id;
2599
0
        const int packets_in_layer = (int)last_packet_for_layer->count + 1;
2600
0
        if (layer_id >= 0 && layer_id < oxcf->ss_number_layers) {
2601
0
          int num_frames;
2602
0
          LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer_id];
2603
2604
0
          vpx_free(lc->rc_twopass_stats_in.buf);
2605
2606
0
          lc->rc_twopass_stats_in.sz = packets_in_layer * packet_sz;
2607
0
          CHECK_MEM_ERROR(&cm->error, lc->rc_twopass_stats_in.buf,
2608
0
                          vpx_malloc(lc->rc_twopass_stats_in.sz));
2609
0
          lc->twopass.stats_in_start = lc->rc_twopass_stats_in.buf;
2610
0
          lc->twopass.stats_in = lc->twopass.stats_in_start;
2611
0
          lc->twopass.stats_in_end =
2612
0
              lc->twopass.stats_in_start + packets_in_layer - 1;
2613
          // Note the last packet is cumulative first pass stats.
2614
          // So the number of frames is packet number minus one
2615
0
          num_frames = packets_in_layer - 1;
2616
0
          fps_init_first_pass_info(&lc->twopass.first_pass_info,
2617
0
                                   lc->rc_twopass_stats_in.buf, num_frames);
2618
0
          stats_copy[layer_id] = lc->rc_twopass_stats_in.buf;
2619
0
        }
2620
0
      }
2621
2622
0
      for (n = 0; n < packets; ++n) {
2623
0
        const int layer_id = (int)stats[n].spatial_layer_id;
2624
0
        if (layer_id >= 0 && layer_id < oxcf->ss_number_layers &&
2625
0
            stats_copy[layer_id] != NULL) {
2626
0
          *stats_copy[layer_id] = stats[n];
2627
0
          ++stats_copy[layer_id];
2628
0
        }
2629
0
      }
2630
2631
0
      vp9_init_second_pass_spatial_svc(cpi);
2632
0
    } else {
2633
0
      int num_frames;
2634
2635
0
      cpi->twopass.stats_in_start = oxcf->two_pass_stats_in.buf;
2636
0
      cpi->twopass.stats_in = cpi->twopass.stats_in_start;
2637
0
      cpi->twopass.stats_in_end = &cpi->twopass.stats_in[packets - 1];
2638
      // Note the last packet is cumulative first pass stats.
2639
      // So the number of frames is packet number minus one
2640
0
      num_frames = packets - 1;
2641
0
      fps_init_first_pass_info(&cpi->twopass.first_pass_info,
2642
0
                               oxcf->two_pass_stats_in.buf, num_frames);
2643
2644
0
      vp9_init_second_pass(cpi);
2645
0
    }
2646
0
  }
2647
10.9k
#endif  // !CONFIG_REALTIME_ONLY
2648
2649
10.9k
  cpi->mb_wiener_var_cols = 0;
2650
10.9k
  cpi->mb_wiener_var_rows = 0;
2651
10.9k
  cpi->mb_wiener_variance = NULL;
2652
10.9k
  cpi->mi_ssim_rdmult_scaling_factors = NULL;
2653
10.9k
  cpi->mi_ssim_rdmult_scaling_factors_rows = 0;
2654
10.9k
  cpi->mi_ssim_rdmult_scaling_factors_cols = 0;
2655
2656
10.9k
  vp9_set_speed_features_framesize_independent(cpi, oxcf->speed);
2657
10.9k
  vp9_set_speed_features_framesize_dependent(cpi, oxcf->speed);
2658
2659
10.9k
  cpi->kmeans_data_arr_alloc = 0;
2660
#if CONFIG_NON_GREEDY_MV
2661
  cpi->tpl_ready = 0;
2662
#endif  // CONFIG_NON_GREEDY_MV
2663
557k
  for (i = 0; i < MAX_ARF_GOP_SIZE; ++i) {
2664
546k
    cpi->tpl_stats[i].tpl_stats_ptr = NULL;
2665
546k
  }
2666
2667
10.9k
#define BFP(BT, SDF, SDSF, SDAF, VF, SVF, SVAF, SDX4DF, SDSX4DF) \
2668
142k
  cpi->fn_ptr[BT].sdf = SDF;                                     \
2669
142k
  cpi->fn_ptr[BT].sdsf = SDSF;                                   \
2670
142k
  cpi->fn_ptr[BT].sdaf = SDAF;                                   \
2671
142k
  cpi->fn_ptr[BT].vf = VF;                                       \
2672
142k
  cpi->fn_ptr[BT].svf = SVF;                                     \
2673
142k
  cpi->fn_ptr[BT].svaf = SVAF;                                   \
2674
142k
  cpi->fn_ptr[BT].sdx4df = SDX4DF;                               \
2675
142k
  cpi->fn_ptr[BT].sdsx4df = SDSX4DF;
2676
2677
10.9k
  BFP(BLOCK_32X16, vpx_sad32x16, vpx_sad_skip_32x16, vpx_sad32x16_avg,
2678
10.9k
      vpx_variance32x16, vpx_sub_pixel_variance32x16,
2679
10.9k
      vpx_sub_pixel_avg_variance32x16, vpx_sad32x16x4d, vpx_sad_skip_32x16x4d)
2680
2681
10.9k
  BFP(BLOCK_16X32, vpx_sad16x32, vpx_sad_skip_16x32, vpx_sad16x32_avg,
2682
10.9k
      vpx_variance16x32, vpx_sub_pixel_variance16x32,
2683
10.9k
      vpx_sub_pixel_avg_variance16x32, vpx_sad16x32x4d, vpx_sad_skip_16x32x4d)
2684
2685
10.9k
  BFP(BLOCK_64X32, vpx_sad64x32, vpx_sad_skip_64x32, vpx_sad64x32_avg,
2686
10.9k
      vpx_variance64x32, vpx_sub_pixel_variance64x32,
2687
10.9k
      vpx_sub_pixel_avg_variance64x32, vpx_sad64x32x4d, vpx_sad_skip_64x32x4d)
2688
2689
10.9k
  BFP(BLOCK_32X64, vpx_sad32x64, vpx_sad_skip_32x64, vpx_sad32x64_avg,
2690
10.9k
      vpx_variance32x64, vpx_sub_pixel_variance32x64,
2691
10.9k
      vpx_sub_pixel_avg_variance32x64, vpx_sad32x64x4d, vpx_sad_skip_32x64x4d)
2692
2693
10.9k
  BFP(BLOCK_32X32, vpx_sad32x32, vpx_sad_skip_32x32, vpx_sad32x32_avg,
2694
10.9k
      vpx_variance32x32, vpx_sub_pixel_variance32x32,
2695
10.9k
      vpx_sub_pixel_avg_variance32x32, vpx_sad32x32x4d, vpx_sad_skip_32x32x4d)
2696
2697
10.9k
  BFP(BLOCK_64X64, vpx_sad64x64, vpx_sad_skip_64x64, vpx_sad64x64_avg,
2698
10.9k
      vpx_variance64x64, vpx_sub_pixel_variance64x64,
2699
10.9k
      vpx_sub_pixel_avg_variance64x64, vpx_sad64x64x4d, vpx_sad_skip_64x64x4d)
2700
2701
10.9k
  BFP(BLOCK_16X16, vpx_sad16x16, vpx_sad_skip_16x16, vpx_sad16x16_avg,
2702
10.9k
      vpx_variance16x16, vpx_sub_pixel_variance16x16,
2703
10.9k
      vpx_sub_pixel_avg_variance16x16, vpx_sad16x16x4d, vpx_sad_skip_16x16x4d)
2704
2705
10.9k
  BFP(BLOCK_16X8, vpx_sad16x8, vpx_sad_skip_16x8, vpx_sad16x8_avg,
2706
10.9k
      vpx_variance16x8, vpx_sub_pixel_variance16x8,
2707
10.9k
      vpx_sub_pixel_avg_variance16x8, vpx_sad16x8x4d, vpx_sad_skip_16x8x4d)
2708
2709
10.9k
  BFP(BLOCK_8X16, vpx_sad8x16, vpx_sad_skip_8x16, vpx_sad8x16_avg,
2710
10.9k
      vpx_variance8x16, vpx_sub_pixel_variance8x16,
2711
10.9k
      vpx_sub_pixel_avg_variance8x16, vpx_sad8x16x4d, vpx_sad_skip_8x16x4d)
2712
2713
10.9k
  BFP(BLOCK_8X8, vpx_sad8x8, vpx_sad_skip_8x8, vpx_sad8x8_avg, vpx_variance8x8,
2714
10.9k
      vpx_sub_pixel_variance8x8, vpx_sub_pixel_avg_variance8x8, vpx_sad8x8x4d,
2715
10.9k
      vpx_sad_skip_8x8x4d)
2716
2717
10.9k
  BFP(BLOCK_8X4, vpx_sad8x4, vpx_sad_skip_8x4, vpx_sad8x4_avg, vpx_variance8x4,
2718
10.9k
      vpx_sub_pixel_variance8x4, vpx_sub_pixel_avg_variance8x4, vpx_sad8x4x4d,
2719
10.9k
      vpx_sad_skip_8x4x4d)
2720
2721
10.9k
  BFP(BLOCK_4X8, vpx_sad4x8, vpx_sad_skip_4x8, vpx_sad4x8_avg, vpx_variance4x8,
2722
10.9k
      vpx_sub_pixel_variance4x8, vpx_sub_pixel_avg_variance4x8, vpx_sad4x8x4d,
2723
10.9k
      vpx_sad_skip_4x8x4d)
2724
2725
10.9k
  BFP(BLOCK_4X4, vpx_sad4x4, vpx_sad_skip_4x4, vpx_sad4x4_avg, vpx_variance4x4,
2726
10.9k
      vpx_sub_pixel_variance4x4, vpx_sub_pixel_avg_variance4x4, vpx_sad4x4x4d,
2727
10.9k
      vpx_sad_skip_4x4x4d)
2728
2729
10.9k
#if CONFIG_VP9_HIGHBITDEPTH
2730
10.9k
  highbd_set_var_fns(cpi);
2731
10.9k
#endif
2732
2733
  /* vp9_init_quantizer() is first called here. Add check in
2734
   * vp9_frame_init_quantizer() so that vp9_init_quantizer is only
2735
   * called later when needed. This will avoid unnecessary calls of
2736
   * vp9_init_quantizer() for every frame.
2737
   */
2738
10.9k
  vp9_init_quantizer(cpi);
2739
2740
10.9k
  vp9_loop_filter_init(cm);
2741
2742
  // Set up the unit scaling factor used during motion search.
2743
10.9k
#if CONFIG_VP9_HIGHBITDEPTH
2744
10.9k
  vp9_setup_scale_factors_for_frame(&cpi->me_sf, cm->width, cm->height,
2745
10.9k
                                    cm->width, cm->height,
2746
10.9k
                                    cm->use_highbitdepth);
2747
#else
2748
  vp9_setup_scale_factors_for_frame(&cpi->me_sf, cm->width, cm->height,
2749
                                    cm->width, cm->height);
2750
#endif  // CONFIG_VP9_HIGHBITDEPTH
2751
10.9k
  cpi->td.mb.me_sf = &cpi->me_sf;
2752
2753
10.9k
  cm->error.setjmp = 0;
2754
2755
10.9k
  return cpi;
2756
10.9k
}
2757
2758
#if CONFIG_INTERNAL_STATS
2759
#define SNPRINT(H, T) snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T))
2760
2761
#define SNPRINT2(H, T, V) \
2762
  snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T), (V))
2763
#endif  // CONFIG_INTERNAL_STATS
2764
2765
10.9k
void vp9_remove_compressor(VP9_COMP *cpi) {
2766
10.9k
  VP9_COMMON *cm;
2767
10.9k
  unsigned int i;
2768
2769
10.9k
  if (!cpi) return;
2770
2771
#if CONFIG_INTERNAL_STATS
2772
  vpx_free(cpi->ssim_vars);
2773
#endif
2774
2775
10.9k
  cm = &cpi->common;
2776
10.9k
  if (cm->current_video_frame > 0) {
2777
#if CONFIG_INTERNAL_STATS
2778
    vpx_clear_system_state();
2779
2780
    if (cpi->oxcf.pass != 1) {
2781
      char headings[512] = { 0 };
2782
      char results[512] = { 0 };
2783
      FILE *f = fopen("opsnr.stt", "a");
2784
      double time_encoded =
2785
          (cpi->last_end_time_stamp_seen - cpi->first_time_stamp_ever) /
2786
          10000000.000;
2787
      double total_encode_time =
2788
          (cpi->time_receive_data + cpi->time_compress_data) / 1000.000;
2789
      const double dr =
2790
          (double)cpi->bytes * (double)8 / (double)1000 / time_encoded;
2791
      const double peak = (double)((1 << cpi->oxcf.input_bit_depth) - 1);
2792
      const double target_rate = (double)cpi->oxcf.target_bandwidth / 1000;
2793
      const double rate_err = ((100.0 * (dr - target_rate)) / target_rate);
2794
2795
      if (cpi->b_calculate_psnr) {
2796
        const double total_psnr = vpx_sse_to_psnr(
2797
            (double)cpi->total_samples, peak, (double)cpi->total_sq_error);
2798
        const double totalp_psnr = vpx_sse_to_psnr(
2799
            (double)cpi->totalp_samples, peak, (double)cpi->totalp_sq_error);
2800
        const double total_ssim =
2801
            100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
2802
        const double totalp_ssim =
2803
            100 * pow(cpi->summedp_quality / cpi->summedp_weights, 8.0);
2804
2805
        snprintf(headings, sizeof(headings),
2806
                 "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
2807
                 "VPXSSIM\tVPSSIMP\tFASTSIM\tPSNRHVS\t"
2808
                 "WstPsnr\tWstSsim\tWstFast\tWstHVS\t"
2809
                 "AVPsnrY\tAPsnrCb\tAPsnrCr");
2810
        snprintf(results, sizeof(results),
2811
                 "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2812
                 "%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2813
                 "%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
2814
                 "%7.3f\t%7.3f\t%7.3f",
2815
                 dr, cpi->psnr.stat[ALL] / cpi->count, total_psnr,
2816
                 cpi->psnrp.stat[ALL] / cpi->count, totalp_psnr, total_ssim,
2817
                 totalp_ssim, cpi->fastssim.stat[ALL] / cpi->count,
2818
                 cpi->psnrhvs.stat[ALL] / cpi->count, cpi->psnr.worst,
2819
                 cpi->worst_ssim, cpi->fastssim.worst, cpi->psnrhvs.worst,
2820
                 cpi->psnr.stat[Y] / cpi->count, cpi->psnr.stat[U] / cpi->count,
2821
                 cpi->psnr.stat[V] / cpi->count);
2822
2823
        if (cpi->b_calculate_blockiness) {
2824
          SNPRINT(headings, "\t  Block\tWstBlck");
2825
          SNPRINT2(results, "\t%7.3f", cpi->total_blockiness / cpi->count);
2826
          SNPRINT2(results, "\t%7.3f", cpi->worst_blockiness);
2827
        }
2828
2829
        if (cpi->b_calculate_consistency) {
2830
          double consistency =
2831
              vpx_sse_to_psnr((double)cpi->totalp_samples, peak,
2832
                              (double)cpi->total_inconsistency);
2833
2834
          SNPRINT(headings, "\tConsist\tWstCons");
2835
          SNPRINT2(results, "\t%7.3f", consistency);
2836
          SNPRINT2(results, "\t%7.3f", cpi->worst_consistency);
2837
        }
2838
2839
        SNPRINT(headings, "\t    Time\tRcErr\tAbsErr");
2840
        SNPRINT2(results, "\t%8.0f", total_encode_time);
2841
        SNPRINT2(results, "\t%7.2f", rate_err);
2842
        SNPRINT2(results, "\t%7.2f", fabs(rate_err));
2843
2844
        fprintf(f, "%s\tAPsnr611\n", headings);
2845
        fprintf(
2846
            f, "%s\t%7.3f\n", results,
2847
            (6 * cpi->psnr.stat[Y] + cpi->psnr.stat[U] + cpi->psnr.stat[V]) /
2848
                (cpi->count * 8));
2849
      }
2850
2851
      fclose(f);
2852
    }
2853
#endif
2854
2855
#if 0
2856
    {
2857
      printf("\n_pick_loop_filter_level:%d\n", cpi->time_pick_lpf / 1000);
2858
      printf("\n_frames receive_data encod_mb_row compress_frame  Total\n");
2859
      printf("%6d %10ld %10ld %10ld %10ld\n", cpi->common.current_video_frame,
2860
             cpi->time_receive_data / 1000, cpi->time_encode_sb_row / 1000,
2861
             cpi->time_compress_data / 1000,
2862
             (cpi->time_receive_data + cpi->time_compress_data) / 1000);
2863
    }
2864
#endif
2865
10.9k
  }
2866
2867
#if CONFIG_VP9_TEMPORAL_DENOISING
2868
  vp9_denoiser_free(&(cpi->denoiser));
2869
#endif
2870
2871
10.9k
  if (cpi->kmeans_data_arr_alloc) {
2872
10.9k
#if CONFIG_MULTITHREAD
2873
10.9k
    pthread_mutex_destroy(&cpi->kmeans_mutex);
2874
10.9k
#endif
2875
10.9k
    vpx_free(cpi->kmeans_data_arr);
2876
10.9k
  }
2877
2878
10.9k
  vp9_free_tpl_buffer(cpi);
2879
2880
10.9k
  vp9_loop_filter_dealloc(&cpi->lf_row_sync);
2881
10.9k
  vp9_bitstream_encode_tiles_buffer_dealloc(cpi);
2882
10.9k
  vp9_row_mt_mem_dealloc(cpi);
2883
10.9k
  vp9_encode_free_mt_data(cpi);
2884
2885
10.9k
#if !CONFIG_REALTIME_ONLY
2886
10.9k
  vp9_alt_ref_aq_destroy(cpi->alt_ref_aq);
2887
10.9k
#endif
2888
2889
10.9k
  dealloc_compressor_data(cpi);
2890
2891
284k
  for (i = 0; i < sizeof(cpi->mbgraph_stats) / sizeof(cpi->mbgraph_stats[0]);
2892
273k
       ++i) {
2893
273k
    vpx_free(cpi->mbgraph_stats[i].mb_stats);
2894
273k
  }
2895
2896
10.9k
  vp9_extrc_delete(&cpi->ext_ratectrl);
2897
2898
  // Help detect use after free of the error detail string.
2899
10.9k
  memset(cm->error.detail, 'A', sizeof(cm->error.detail) - 1);
2900
10.9k
  cm->error.detail[sizeof(cm->error.detail) - 1] = '\0';
2901
2902
10.9k
  vp9_remove_common(cm);
2903
10.9k
  vp9_free_ref_frame_buffers(cm->buffer_pool);
2904
#if CONFIG_VP9_POSTPROC
2905
  vp9_free_postproc_buffers(cm);
2906
#endif
2907
10.9k
  vpx_free(cpi);
2908
2909
#if CONFIG_VP9_TEMPORAL_DENOISING
2910
#ifdef OUTPUT_YUV_DENOISED
2911
  fclose(yuv_denoised_file);
2912
#endif
2913
#endif
2914
#ifdef OUTPUT_YUV_SKINMAP
2915
  fclose(yuv_skinmap_file);
2916
#endif
2917
#ifdef OUTPUT_YUV_REC
2918
  fclose(yuv_rec_file);
2919
#endif
2920
#ifdef OUTPUT_YUV_SVC_SRC
2921
  fclose(yuv_svc_src[0]);
2922
  fclose(yuv_svc_src[1]);
2923
  fclose(yuv_svc_src[2]);
2924
#endif
2925
2926
#if 0
2927
2928
  if (keyfile)
2929
    fclose(keyfile);
2930
2931
  if (framepsnr)
2932
    fclose(framepsnr);
2933
2934
  if (kf_list)
2935
    fclose(kf_list);
2936
2937
#endif
2938
10.9k
}
2939
2940
453k
int vp9_get_psnr(const VP9_COMP *cpi, PSNR_STATS *psnr) {
2941
453k
  if (is_psnr_calc_enabled(cpi)) {
2942
0
#if CONFIG_VP9_HIGHBITDEPTH
2943
0
    vpx_calc_highbd_psnr(cpi->raw_source_frame, cpi->common.frame_to_show, psnr,
2944
0
                         cpi->td.mb.e_mbd.bd, cpi->oxcf.input_bit_depth,
2945
0
                         cpi->svc.spatial_layer_id);
2946
#else
2947
    vpx_calc_psnr(cpi->raw_source_frame, cpi->common.frame_to_show, psnr,
2948
                  cpi->svc.spatial_layer_id);
2949
#endif
2950
0
    return 1;
2951
453k
  } else {
2952
453k
    vp9_zero(*psnr);
2953
453k
    return 0;
2954
453k
  }
2955
453k
}
2956
2957
0
int vp9_use_as_reference(VP9_COMP *cpi, int ref_frame_flags) {
2958
0
  if (ref_frame_flags > 7) return -1;
2959
2960
0
  cpi->ref_frame_flags = ref_frame_flags;
2961
0
  return 0;
2962
0
}
2963
2964
0
void vp9_update_reference(VP9_COMP *cpi, int ref_frame_flags) {
2965
0
  cpi->ext_refresh_golden_frame = (ref_frame_flags & VP9_GOLD_FLAG) != 0;
2966
0
  cpi->ext_refresh_alt_ref_frame = (ref_frame_flags & VP9_ALT_FLAG) != 0;
2967
0
  cpi->ext_refresh_last_frame = (ref_frame_flags & VP9_LAST_FLAG) != 0;
2968
0
  cpi->ext_refresh_frame_flags_pending = 1;
2969
0
}
2970
2971
static YV12_BUFFER_CONFIG *get_vp9_ref_frame_buffer(
2972
0
    VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag) {
2973
0
  MV_REFERENCE_FRAME ref_frame = NO_REF_FRAME;
2974
0
  if (ref_frame_flag == VP9_LAST_FLAG)
2975
0
    ref_frame = LAST_FRAME;
2976
0
  else if (ref_frame_flag == VP9_GOLD_FLAG)
2977
0
    ref_frame = GOLDEN_FRAME;
2978
0
  else if (ref_frame_flag == VP9_ALT_FLAG)
2979
0
    ref_frame = ALTREF_FRAME;
2980
2981
0
  return ref_frame == NO_REF_FRAME ? NULL
2982
0
                                   : get_ref_frame_buffer(cpi, ref_frame);
2983
0
}
2984
2985
int vp9_copy_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
2986
0
                           YV12_BUFFER_CONFIG *sd) {
2987
0
  YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
2988
0
  if (cfg) {
2989
0
    vpx_yv12_copy_frame(cfg, sd);
2990
0
    return 0;
2991
0
  } else {
2992
0
    return -1;
2993
0
  }
2994
0
}
2995
2996
int vp9_set_reference_enc(VP9_COMP *cpi, VP9_REFFRAME ref_frame_flag,
2997
0
                          YV12_BUFFER_CONFIG *sd) {
2998
0
  YV12_BUFFER_CONFIG *cfg = get_vp9_ref_frame_buffer(cpi, ref_frame_flag);
2999
0
  if (cfg) {
3000
0
    vpx_yv12_copy_frame(sd, cfg);
3001
0
    return 0;
3002
0
  } else {
3003
0
    return -1;
3004
0
  }
3005
0
}
3006
3007
0
int vp9_update_entropy(VP9_COMP *cpi, int update) {
3008
0
  cpi->ext_refresh_frame_context = update;
3009
0
  cpi->ext_refresh_frame_context_pending = 1;
3010
0
  return 0;
3011
0
}
3012
3013
#ifdef OUTPUT_YUV_REC
3014
void vp9_write_yuv_rec_frame(VP9_COMMON *cm) {
3015
  YV12_BUFFER_CONFIG *s = cm->frame_to_show;
3016
  uint8_t *src = s->y_buffer;
3017
  int h = cm->height;
3018
3019
#if CONFIG_VP9_HIGHBITDEPTH
3020
  if (s->flags & YV12_FLAG_HIGHBITDEPTH) {
3021
    uint16_t *src16 = CONVERT_TO_SHORTPTR(s->y_buffer);
3022
3023
    do {
3024
      fwrite(src16, s->y_width, 2, yuv_rec_file);
3025
      src16 += s->y_stride;
3026
    } while (--h);
3027
3028
    src16 = CONVERT_TO_SHORTPTR(s->u_buffer);
3029
    h = s->uv_height;
3030
3031
    do {
3032
      fwrite(src16, s->uv_width, 2, yuv_rec_file);
3033
      src16 += s->uv_stride;
3034
    } while (--h);
3035
3036
    src16 = CONVERT_TO_SHORTPTR(s->v_buffer);
3037
    h = s->uv_height;
3038
3039
    do {
3040
      fwrite(src16, s->uv_width, 2, yuv_rec_file);
3041
      src16 += s->uv_stride;
3042
    } while (--h);
3043
3044
    fflush(yuv_rec_file);
3045
    return;
3046
  }
3047
#endif  // CONFIG_VP9_HIGHBITDEPTH
3048
3049
  do {
3050
    fwrite(src, s->y_width, 1, yuv_rec_file);
3051
    src += s->y_stride;
3052
  } while (--h);
3053
3054
  src = s->u_buffer;
3055
  h = s->uv_height;
3056
3057
  do {
3058
    fwrite(src, s->uv_width, 1, yuv_rec_file);
3059
    src += s->uv_stride;
3060
  } while (--h);
3061
3062
  src = s->v_buffer;
3063
  h = s->uv_height;
3064
3065
  do {
3066
    fwrite(src, s->uv_width, 1, yuv_rec_file);
3067
    src += s->uv_stride;
3068
  } while (--h);
3069
3070
  fflush(yuv_rec_file);
3071
}
3072
#endif
3073
3074
#if CONFIG_VP9_HIGHBITDEPTH
3075
void vp9_scale_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src,
3076
0
                                             YV12_BUFFER_CONFIG *dst, int bd) {
3077
#else
3078
void vp9_scale_and_extend_frame_nonnormative(const YV12_BUFFER_CONFIG *src,
3079
                                             YV12_BUFFER_CONFIG *dst) {
3080
#endif  // CONFIG_VP9_HIGHBITDEPTH
3081
  // TODO(dkovalev): replace YV12_BUFFER_CONFIG with vpx_image_t
3082
0
  int i;
3083
0
  const uint8_t *const srcs[3] = { src->y_buffer, src->u_buffer,
3084
0
                                   src->v_buffer };
3085
0
  const int src_strides[3] = { src->y_stride, src->uv_stride, src->uv_stride };
3086
0
  const int src_widths[3] = { src->y_crop_width, src->uv_crop_width,
3087
0
                              src->uv_crop_width };
3088
0
  const int src_heights[3] = { src->y_crop_height, src->uv_crop_height,
3089
0
                               src->uv_crop_height };
3090
0
  uint8_t *const dsts[3] = { dst->y_buffer, dst->u_buffer, dst->v_buffer };
3091
0
  const int dst_strides[3] = { dst->y_stride, dst->uv_stride, dst->uv_stride };
3092
0
  const int dst_widths[3] = { dst->y_crop_width, dst->uv_crop_width,
3093
0
                              dst->uv_crop_width };
3094
0
  const int dst_heights[3] = { dst->y_crop_height, dst->uv_crop_height,
3095
0
                               dst->uv_crop_height };
3096
3097
0
  for (i = 0; i < MAX_MB_PLANE; ++i) {
3098
0
#if CONFIG_VP9_HIGHBITDEPTH
3099
0
    if (src->flags & YV12_FLAG_HIGHBITDEPTH) {
3100
0
      vp9_highbd_resize_plane(srcs[i], src_heights[i], src_widths[i],
3101
0
                              src_strides[i], dsts[i], dst_heights[i],
3102
0
                              dst_widths[i], dst_strides[i], bd);
3103
0
    } else {
3104
0
      vp9_resize_plane(srcs[i], src_heights[i], src_widths[i], src_strides[i],
3105
0
                       dsts[i], dst_heights[i], dst_widths[i], dst_strides[i]);
3106
0
    }
3107
#else
3108
    vp9_resize_plane(srcs[i], src_heights[i], src_widths[i], src_strides[i],
3109
                     dsts[i], dst_heights[i], dst_widths[i], dst_strides[i]);
3110
#endif  // CONFIG_VP9_HIGHBITDEPTH
3111
0
  }
3112
0
  vpx_extend_frame_borders(dst);
3113
0
}
3114
3115
#if CONFIG_VP9_HIGHBITDEPTH
3116
static void scale_and_extend_frame(const YV12_BUFFER_CONFIG *src,
3117
                                   YV12_BUFFER_CONFIG *dst, int bd,
3118
                                   INTERP_FILTER filter_type,
3119
0
                                   int phase_scaler) {
3120
0
  const int src_w = src->y_crop_width;
3121
0
  const int src_h = src->y_crop_height;
3122
0
  const int dst_w = dst->y_crop_width;
3123
0
  const int dst_h = dst->y_crop_height;
3124
3125
  // The issue b/311394513 reveals a corner case bug.
3126
  // For bd = 8, vpx_scaled_2d() requires both x_step_q4 and y_step_q4 are less
3127
  // than or equal to 64. For bd >= 10, vpx_highbd_convolve8() requires both
3128
  // x_step_q4 and y_step_q4 are less than or equal to 32. If this condition
3129
  // isn't met, it needs to call vp9_scale_and_extend_frame_nonnormative() that
3130
  // supports arbitrary scaling.
3131
0
  const int x_step_q4 = 16 * src_w / dst_w;
3132
0
  const int y_step_q4 = 16 * src_h / dst_h;
3133
0
  const int is_arbitrary_scaling =
3134
0
      (bd == 8 && (x_step_q4 > 64 || y_step_q4 > 64)) ||
3135
0
      (bd >= 10 && (x_step_q4 > 32 || y_step_q4 > 32));
3136
0
  if (is_arbitrary_scaling) {
3137
0
    vp9_scale_and_extend_frame_nonnormative(src, dst, bd);
3138
0
    return;
3139
0
  }
3140
3141
0
  const uint8_t *const srcs[3] = { src->y_buffer, src->u_buffer,
3142
0
                                   src->v_buffer };
3143
0
  const int src_strides[3] = { src->y_stride, src->uv_stride, src->uv_stride };
3144
0
  uint8_t *const dsts[3] = { dst->y_buffer, dst->u_buffer, dst->v_buffer };
3145
0
  const int dst_strides[3] = { dst->y_stride, dst->uv_stride, dst->uv_stride };
3146
0
  const InterpKernel *const kernel = vp9_filter_kernels[filter_type];
3147
0
  int x, y, i;
3148
3149
0
  for (i = 0; i < MAX_MB_PLANE; ++i) {
3150
0
    const int factor = (i == 0 || i == 3 ? 1 : 2);
3151
0
    const int src_stride = src_strides[i];
3152
0
    const int dst_stride = dst_strides[i];
3153
0
    for (y = 0; y < dst_h; y += 16) {
3154
0
      const int y_q4 = y * (16 / factor) * src_h / dst_h + phase_scaler;
3155
0
      for (x = 0; x < dst_w; x += 16) {
3156
0
        const int x_q4 = x * (16 / factor) * src_w / dst_w + phase_scaler;
3157
0
        const uint8_t *src_ptr = srcs[i] +
3158
0
                                 (y / factor) * src_h / dst_h * src_stride +
3159
0
                                 (x / factor) * src_w / dst_w;
3160
0
        uint8_t *dst_ptr = dsts[i] + (y / factor) * dst_stride + (x / factor);
3161
3162
0
        if (src->flags & YV12_FLAG_HIGHBITDEPTH) {
3163
0
          vpx_highbd_convolve8(CONVERT_TO_SHORTPTR(src_ptr), src_stride,
3164
0
                               CONVERT_TO_SHORTPTR(dst_ptr), dst_stride, kernel,
3165
0
                               x_q4 & 0xf, 16 * src_w / dst_w, y_q4 & 0xf,
3166
0
                               16 * src_h / dst_h, 16 / factor, 16 / factor,
3167
0
                               bd);
3168
0
        } else {
3169
0
          vpx_scaled_2d(src_ptr, src_stride, dst_ptr, dst_stride, kernel,
3170
0
                        x_q4 & 0xf, 16 * src_w / dst_w, y_q4 & 0xf,
3171
0
                        16 * src_h / dst_h, 16 / factor, 16 / factor);
3172
0
        }
3173
0
      }
3174
0
    }
3175
0
  }
3176
3177
0
  vpx_extend_frame_borders(dst);
3178
0
}
3179
#endif  // CONFIG_VP9_HIGHBITDEPTH
3180
3181
#if !CONFIG_REALTIME_ONLY
3182
0
static int scale_down(VP9_COMP *cpi, int q) {
3183
0
  RATE_CONTROL *const rc = &cpi->rc;
3184
0
  GF_GROUP *const gf_group = &cpi->twopass.gf_group;
3185
0
  int scale = 0;
3186
0
  assert(frame_is_kf_gf_arf(cpi));
3187
3188
0
  if (rc->frame_size_selector == UNSCALED &&
3189
0
      q >= rc->rf_level_maxq[gf_group->rf_level[gf_group->index]]) {
3190
0
    const int max_size_thresh =
3191
0
        (int)(rate_thresh_mult[SCALE_STEP1] *
3192
0
              VPXMAX(rc->this_frame_target, rc->avg_frame_bandwidth));
3193
0
    scale = rc->projected_frame_size > max_size_thresh ? 1 : 0;
3194
0
  }
3195
0
  return scale;
3196
0
}
3197
3198
0
static int big_rate_miss_high_threshold(VP9_COMP *cpi) {
3199
0
  const RATE_CONTROL *const rc = &cpi->rc;
3200
0
  int big_miss_high;
3201
3202
0
  if (frame_is_kf_gf_arf(cpi))
3203
0
    big_miss_high = rc->this_frame_target * 3 / 2;
3204
0
  else
3205
0
    big_miss_high = rc->this_frame_target * 2;
3206
3207
0
  return big_miss_high;
3208
0
}
3209
3210
0
static int big_rate_miss(VP9_COMP *cpi) {
3211
0
  const RATE_CONTROL *const rc = &cpi->rc;
3212
0
  int big_miss_high;
3213
0
  int big_miss_low;
3214
3215
  // Ignore for overlay frames
3216
0
  if (rc->is_src_frame_alt_ref) {
3217
0
    return 0;
3218
0
  } else {
3219
0
    big_miss_low = (rc->this_frame_target / 2);
3220
0
    big_miss_high = big_rate_miss_high_threshold(cpi);
3221
3222
0
    return (rc->projected_frame_size > big_miss_high) ||
3223
0
           (rc->projected_frame_size < big_miss_low);
3224
0
  }
3225
0
}
3226
3227
// test in two pass for the first
3228
0
static int two_pass_first_group_inter(VP9_COMP *cpi) {
3229
0
  if (cpi->oxcf.pass == 2) {
3230
0
    TWO_PASS *const twopass = &cpi->twopass;
3231
0
    GF_GROUP *const gf_group = &twopass->gf_group;
3232
0
    const int gfg_index = gf_group->index;
3233
3234
0
    if (gfg_index == 0) return gf_group->update_type[gfg_index] == LF_UPDATE;
3235
0
    return gf_group->update_type[gfg_index - 1] != LF_UPDATE &&
3236
0
           gf_group->update_type[gfg_index] == LF_UPDATE;
3237
0
  } else {
3238
0
    return 0;
3239
0
  }
3240
0
}
3241
3242
// Function to test for conditions that indicate we should loop
3243
// back and recode a frame.
3244
static int recode_loop_test(VP9_COMP *cpi, int high_limit, int low_limit, int q,
3245
0
                            int maxq, int minq) {
3246
0
  const RATE_CONTROL *const rc = &cpi->rc;
3247
0
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
3248
0
  const int frame_is_kfgfarf = frame_is_kf_gf_arf(cpi);
3249
0
  int force_recode = 0;
3250
3251
0
  if ((rc->projected_frame_size >= rc->max_frame_bandwidth) ||
3252
0
      big_rate_miss(cpi) || (cpi->sf.recode_loop == ALLOW_RECODE) ||
3253
0
      (two_pass_first_group_inter(cpi) &&
3254
0
       (cpi->sf.recode_loop == ALLOW_RECODE_FIRST)) ||
3255
0
      (frame_is_kfgfarf && (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF))) {
3256
0
    if (frame_is_kfgfarf && (oxcf->resize_mode == RESIZE_DYNAMIC) &&
3257
0
        scale_down(cpi, q)) {
3258
      // Code this group at a lower resolution.
3259
0
      cpi->resize_pending = 1;
3260
0
      return 1;
3261
0
    }
3262
3263
    // Force recode for extreme overshoot.
3264
0
    if ((rc->projected_frame_size >= rc->max_frame_bandwidth) ||
3265
0
        (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF &&
3266
0
         rc->projected_frame_size >= big_rate_miss_high_threshold(cpi))) {
3267
0
      return 1;
3268
0
    }
3269
3270
    // TODO(agrange) high_limit could be greater than the scale-down threshold.
3271
0
    if ((rc->projected_frame_size > high_limit && q < maxq) ||
3272
0
        (rc->projected_frame_size < low_limit && q > minq)) {
3273
0
      force_recode = 1;
3274
0
    } else if (cpi->oxcf.rc_mode == VPX_CQ) {
3275
      // Deal with frame undershoot and whether or not we are
3276
      // below the automatically set cq level.
3277
0
      if (q > oxcf->cq_level &&
3278
0
          rc->projected_frame_size < ((rc->this_frame_target * 7) >> 3)) {
3279
0
        force_recode = 1;
3280
0
      }
3281
0
    }
3282
0
  }
3283
0
  return force_recode;
3284
0
}
3285
#endif  // !CONFIG_REALTIME_ONLY
3286
3287
453k
static void update_ref_frames(VP9_COMP *cpi) {
3288
453k
  VP9_COMMON *const cm = &cpi->common;
3289
453k
  BufferPool *const pool = cm->buffer_pool;
3290
453k
  GF_GROUP *const gf_group = &cpi->twopass.gf_group;
3291
3292
453k
  if (cpi->ext_ratectrl.ready &&
3293
0
      (cpi->ext_ratectrl.funcs.rc_type & VPX_RC_GOP) != 0 &&
3294
0
      cpi->ext_ratectrl.funcs.get_gop_decision != NULL) {
3295
0
    const int this_gf_index = gf_group->index;
3296
0
    const int update_ref_idx = gf_group->update_ref_idx[this_gf_index];
3297
0
    if (gf_group->update_type[this_gf_index] == KF_UPDATE) {
3298
0
      ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[0], cm->new_fb_idx);
3299
0
      ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[1], cm->new_fb_idx);
3300
0
      ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[2], cm->new_fb_idx);
3301
0
    } else if (update_ref_idx != INVALID_IDX) {
3302
0
      ref_cnt_fb(pool->frame_bufs,
3303
0
                 &cm->ref_frame_map[gf_group->update_ref_idx[this_gf_index]],
3304
0
                 cm->new_fb_idx);
3305
0
    }
3306
3307
0
    const int next_gf_index = gf_group->index + 1;
3308
3309
    // Overlay frame should ideally look at the colocated ref frame from rc lib.
3310
    // Here temporarily just don't update the indices.
3311
0
    if (next_gf_index < gf_group->gf_group_size) {
3312
0
      cpi->lst_fb_idx = gf_group->ext_rc_ref[next_gf_index].last_index;
3313
0
      cpi->gld_fb_idx = gf_group->ext_rc_ref[next_gf_index].golden_index;
3314
0
      cpi->alt_fb_idx = gf_group->ext_rc_ref[next_gf_index].altref_index;
3315
0
    }
3316
3317
0
    return;
3318
0
  }
3319
3320
453k
  if (cpi->rc.show_arf_as_gld) {
3321
0
    int tmp = cpi->alt_fb_idx;
3322
0
    cpi->alt_fb_idx = cpi->gld_fb_idx;
3323
0
    cpi->gld_fb_idx = tmp;
3324
453k
  } else if (cm->show_existing_frame) {
3325
    // Pop ARF.
3326
0
    cpi->lst_fb_idx = cpi->alt_fb_idx;
3327
0
    cpi->alt_fb_idx =
3328
0
        stack_pop(gf_group->arf_index_stack, gf_group->stack_size);
3329
0
    --gf_group->stack_size;
3330
0
  }
3331
3332
  // At this point the new frame has been encoded.
3333
  // If any buffer copy / swapping is signaled it should be done here.
3334
453k
  if (cm->frame_type == KEY_FRAME) {
3335
27.7k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
3336
27.7k
               cm->new_fb_idx);
3337
27.7k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->alt_fb_idx],
3338
27.7k
               cm->new_fb_idx);
3339
425k
  } else if (vp9_preserve_existing_gf(cpi)) {
3340
    // We have decided to preserve the previously existing golden frame as our
3341
    // new ARF frame. However, in the short term in function
3342
    // vp9_get_refresh_mask() we left it in the GF slot and, if
3343
    // we're updating the GF with the current decoded frame, we save it to the
3344
    // ARF slot instead.
3345
    // We now have to update the ARF with the current frame and swap gld_fb_idx
3346
    // and alt_fb_idx so that, overall, we've stored the old GF in the new ARF
3347
    // slot and, if we're updating the GF, the current frame becomes the new GF.
3348
10.3k
    int tmp;
3349
3350
10.3k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->alt_fb_idx],
3351
10.3k
               cm->new_fb_idx);
3352
3353
10.3k
    tmp = cpi->alt_fb_idx;
3354
10.3k
    cpi->alt_fb_idx = cpi->gld_fb_idx;
3355
10.3k
    cpi->gld_fb_idx = tmp;
3356
415k
  } else { /* For non key/golden frames */
3357
415k
    if (cpi->refresh_alt_ref_frame) {
3358
10.6k
      int arf_idx = gf_group->top_arf_idx;
3359
3360
      // Push new ARF into stack.
3361
10.6k
      stack_push(gf_group->arf_index_stack, cpi->alt_fb_idx,
3362
10.6k
                 gf_group->stack_size);
3363
10.6k
      ++gf_group->stack_size;
3364
3365
10.6k
      assert(arf_idx < REF_FRAMES);
3366
3367
10.6k
      ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[arf_idx], cm->new_fb_idx);
3368
10.6k
      memcpy(cpi->interp_filter_selected[ALTREF_FRAME],
3369
10.6k
             cpi->interp_filter_selected[0],
3370
10.6k
             sizeof(cpi->interp_filter_selected[0]));
3371
3372
10.6k
      cpi->alt_fb_idx = arf_idx;
3373
10.6k
    }
3374
3375
415k
    if (cpi->refresh_golden_frame) {
3376
26.3k
      ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
3377
26.3k
                 cm->new_fb_idx);
3378
26.3k
      if (!cpi->rc.is_src_frame_alt_ref)
3379
26.3k
        memcpy(cpi->interp_filter_selected[GOLDEN_FRAME],
3380
26.3k
               cpi->interp_filter_selected[0],
3381
26.3k
               sizeof(cpi->interp_filter_selected[0]));
3382
0
      else
3383
0
        memcpy(cpi->interp_filter_selected[GOLDEN_FRAME],
3384
0
               cpi->interp_filter_selected[ALTREF_FRAME],
3385
0
               sizeof(cpi->interp_filter_selected[ALTREF_FRAME]));
3386
26.3k
    }
3387
415k
  }
3388
3389
453k
  if (cpi->refresh_last_frame) {
3390
432k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->lst_fb_idx],
3391
432k
               cm->new_fb_idx);
3392
432k
    if (!cpi->rc.is_src_frame_alt_ref)
3393
432k
      memcpy(cpi->interp_filter_selected[LAST_FRAME],
3394
432k
             cpi->interp_filter_selected[0],
3395
432k
             sizeof(cpi->interp_filter_selected[0]));
3396
432k
  }
3397
3398
453k
  if (gf_group->update_type[gf_group->index] == MID_OVERLAY_UPDATE) {
3399
0
    cpi->alt_fb_idx =
3400
0
        stack_pop(gf_group->arf_index_stack, gf_group->stack_size);
3401
0
    --gf_group->stack_size;
3402
0
  }
3403
453k
}
3404
3405
453k
void vp9_update_reference_frames(VP9_COMP *cpi) {
3406
453k
  update_ref_frames(cpi);
3407
3408
#if CONFIG_VP9_TEMPORAL_DENOISING
3409
  vp9_denoiser_update_ref_frame(cpi);
3410
#endif
3411
3412
453k
  if (is_one_pass_svc(cpi)) vp9_svc_update_ref_frame(cpi);
3413
453k
}
3414
3415
454k
static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
3416
454k
  MACROBLOCKD *xd = &cpi->td.mb.e_mbd;
3417
454k
  struct loopfilter *lf = &cm->lf;
3418
454k
  int is_reference_frame =
3419
454k
      (cm->frame_type == KEY_FRAME || cpi->refresh_last_frame ||
3420
21.1k
       cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
3421
454k
  if (cpi->use_svc &&
3422
0
      cpi->svc.temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS)
3423
0
    is_reference_frame = !cpi->svc.non_reference_frame;
3424
3425
  // Skip loop filter in show_existing_frame mode.
3426
454k
  if (cm->show_existing_frame) {
3427
0
    lf->filter_level = 0;
3428
0
    return;
3429
0
  }
3430
3431
454k
  if (cpi->loopfilter_ctrl == NO_LOOPFILTER ||
3432
454k
      (!is_reference_frame && cpi->loopfilter_ctrl == LOOPFILTER_REFERENCE)) {
3433
0
    lf->filter_level = 0;
3434
0
    vpx_extend_frame_inner_borders(cm->frame_to_show);
3435
0
    return;
3436
0
  }
3437
3438
454k
  if (xd->lossless) {
3439
39.1k
    lf->filter_level = 0;
3440
39.1k
    lf->last_filt_level = 0;
3441
415k
  } else {
3442
#if CONFIG_INTERNAL_STATS
3443
    struct vpx_usec_timer timer;
3444
#endif
3445
3446
415k
    vpx_clear_system_state();
3447
3448
#if CONFIG_INTERNAL_STATS
3449
    vpx_usec_timer_start(&timer);
3450
#endif
3451
3452
415k
    if (!cpi->rc.is_src_frame_alt_ref) {
3453
404k
      if ((cpi->common.frame_type == KEY_FRAME) &&
3454
24.3k
          (!cpi->rc.this_key_frame_forced)) {
3455
23.8k
        lf->last_filt_level = 0;
3456
23.8k
      }
3457
404k
      vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
3458
404k
      lf->last_filt_level = lf->filter_level;
3459
404k
    } else {
3460
10.3k
      lf->filter_level = 0;
3461
10.3k
    }
3462
3463
#if CONFIG_INTERNAL_STATS
3464
    vpx_usec_timer_mark(&timer);
3465
    cpi->time_pick_lpf += vpx_usec_timer_elapsed(&timer);
3466
#endif
3467
415k
  }
3468
3469
454k
  if (lf->filter_level > 0 && is_reference_frame) {
3470
288k
    vp9_build_mask_frame(cm, lf->filter_level, 0);
3471
3472
288k
    if (cpi->num_workers > 1)
3473
0
      vp9_loop_filter_frame_mt(cm->frame_to_show, cm, xd->plane,
3474
0
                               lf->filter_level, 0, 0, cpi->workers,
3475
0
                               cpi->num_workers, &cpi->lf_row_sync);
3476
288k
    else
3477
288k
      vp9_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0);
3478
288k
  }
3479
3480
454k
  vpx_extend_frame_inner_borders(cm->frame_to_show);
3481
454k
}
3482
3483
426k
void vp9_scale_references(VP9_COMP *cpi) {
3484
426k
  VP9_COMMON *cm = &cpi->common;
3485
426k
  MV_REFERENCE_FRAME ref_frame;
3486
426k
  const VP9_REFFRAME ref_mask[3] = { VP9_LAST_FLAG, VP9_GOLD_FLAG,
3487
426k
                                     VP9_ALT_FLAG };
3488
3489
1.70M
  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
3490
    // Need to convert from VP9_REFFRAME to index into ref_mask (subtract 1).
3491
1.27M
    if (cpi->ref_frame_flags & ref_mask[ref_frame - 1]) {
3492
1.09M
      BufferPool *const pool = cm->buffer_pool;
3493
1.09M
      const YV12_BUFFER_CONFIG *const ref =
3494
1.09M
          get_ref_frame_buffer(cpi, ref_frame);
3495
3496
1.09M
      if (ref == NULL) {
3497
0
        cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
3498
0
        continue;
3499
0
      }
3500
3501
1.09M
      if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height) {
3502
0
        RefCntBuffer *new_fb_ptr = NULL;
3503
0
        int force_scaling = 0;
3504
0
        int new_fb = cpi->scaled_ref_idx[ref_frame - 1];
3505
0
        if (new_fb == INVALID_IDX) {
3506
0
          new_fb = get_free_fb(cm);
3507
0
          if (new_fb == INVALID_IDX) {
3508
0
            assert(cm->error.setjmp);
3509
0
            vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
3510
0
                               "Unable to find free frame buffer");
3511
0
          }
3512
0
          force_scaling = 1;
3513
0
        }
3514
0
        new_fb_ptr = &pool->frame_bufs[new_fb];
3515
0
        if (force_scaling || new_fb_ptr->buf.y_crop_width != cm->width ||
3516
0
            new_fb_ptr->buf.y_crop_height != cm->height) {
3517
0
#if CONFIG_VP9_HIGHBITDEPTH
3518
0
          if (vpx_realloc_frame_buffer(&new_fb_ptr->buf, cm->width, cm->height,
3519
0
                                       cm->subsampling_x, cm->subsampling_y,
3520
0
                                       cm->use_highbitdepth,
3521
0
                                       VP9_ENC_BORDER_IN_PIXELS,
3522
0
                                       cm->byte_alignment, NULL, NULL, NULL))
3523
0
            vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
3524
0
                               "Failed to allocate frame buffer");
3525
0
          scale_and_extend_frame(ref, &new_fb_ptr->buf, (int)cm->bit_depth,
3526
0
                                 EIGHTTAP, 0);
3527
#else
3528
          if (vpx_realloc_frame_buffer(&new_fb_ptr->buf, cm->width, cm->height,
3529
                                       cm->subsampling_x, cm->subsampling_y,
3530
                                       VP9_ENC_BORDER_IN_PIXELS,
3531
                                       cm->byte_alignment, NULL, NULL, NULL))
3532
            vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
3533
                               "Failed to allocate frame buffer");
3534
          vp9_scale_and_extend_frame(ref, &new_fb_ptr->buf, EIGHTTAP, 0);
3535
#endif  // CONFIG_VP9_HIGHBITDEPTH
3536
0
          cpi->scaled_ref_idx[ref_frame - 1] = new_fb;
3537
0
          alloc_frame_mvs(cm, new_fb);
3538
0
        }
3539
1.09M
      } else {
3540
1.09M
        int buf_idx;
3541
1.09M
        RefCntBuffer *buf = NULL;
3542
1.09M
        if (cpi->oxcf.pass == 0 && !cpi->use_svc) {
3543
          // Check for release of scaled reference.
3544
1.09M
          buf_idx = cpi->scaled_ref_idx[ref_frame - 1];
3545
1.09M
          if (buf_idx != INVALID_IDX) {
3546
566
            buf = &pool->frame_bufs[buf_idx];
3547
566
            --buf->ref_count;
3548
566
            cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
3549
566
          }
3550
1.09M
        }
3551
1.09M
        buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
3552
1.09M
        buf = &pool->frame_bufs[buf_idx];
3553
1.09M
        buf->buf.y_crop_width = ref->y_crop_width;
3554
1.09M
        buf->buf.y_crop_height = ref->y_crop_height;
3555
1.09M
        cpi->scaled_ref_idx[ref_frame - 1] = buf_idx;
3556
1.09M
        ++buf->ref_count;
3557
1.09M
      }
3558
1.09M
    } else {
3559
187k
      if (cpi->oxcf.pass != 0 || cpi->use_svc)
3560
0
        cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
3561
187k
    }
3562
1.27M
  }
3563
426k
}
3564
3565
425k
static void release_scaled_references(VP9_COMP *cpi) {
3566
425k
  VP9_COMMON *cm = &cpi->common;
3567
425k
  int i;
3568
425k
  if (cpi->oxcf.pass == 0 && !cpi->use_svc) {
3569
    // Only release scaled references under certain conditions:
3570
    // if reference will be updated, or if scaled reference has same resolution.
3571
425k
    int refresh[3];
3572
425k
    refresh[0] = (cpi->refresh_last_frame) ? 1 : 0;
3573
425k
    refresh[1] = (cpi->refresh_golden_frame) ? 1 : 0;
3574
425k
    refresh[2] = (cpi->refresh_alt_ref_frame) ? 1 : 0;
3575
1.70M
    for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) {
3576
1.27M
      const int idx = cpi->scaled_ref_idx[i - 1];
3577
1.27M
      if (idx != INVALID_IDX) {
3578
1.09M
        RefCntBuffer *const buf = &cm->buffer_pool->frame_bufs[idx];
3579
1.09M
        const YV12_BUFFER_CONFIG *const ref = get_ref_frame_buffer(cpi, i);
3580
1.09M
        if (refresh[i - 1] || (buf->buf.y_crop_width == ref->y_crop_width &&
3581
1.09M
                               buf->buf.y_crop_height == ref->y_crop_height)) {
3582
1.09M
          --buf->ref_count;
3583
1.09M
          cpi->scaled_ref_idx[i - 1] = INVALID_IDX;
3584
1.09M
        }
3585
1.09M
      }
3586
1.27M
    }
3587
425k
  } else {
3588
0
    for (i = 0; i < REFS_PER_FRAME; ++i) {
3589
0
      const int idx = cpi->scaled_ref_idx[i];
3590
0
      if (idx != INVALID_IDX) {
3591
0
        RefCntBuffer *const buf = &cm->buffer_pool->frame_bufs[idx];
3592
0
        --buf->ref_count;
3593
0
        cpi->scaled_ref_idx[i] = INVALID_IDX;
3594
0
      }
3595
0
    }
3596
0
  }
3597
425k
}
3598
3599
static void full_to_model_count(unsigned int *model_count,
3600
239M
                                unsigned int *full_count) {
3601
239M
  int n;
3602
239M
  model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
3603
239M
  model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
3604
239M
  model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
3605
2.15G
  for (n = THREE_TOKEN; n < EOB_TOKEN; ++n)
3606
1.91G
    model_count[TWO_TOKEN] += full_count[n];
3607
239M
  model_count[EOB_MODEL_TOKEN] = full_count[EOB_TOKEN];
3608
239M
}
3609
3610
static void full_to_model_counts(vp9_coeff_count_model *model_count,
3611
1.81M
                                 vp9_coeff_count *full_count) {
3612
1.81M
  int i, j, k, l;
3613
3614
5.44M
  for (i = 0; i < PLANE_TYPES; ++i)
3615
10.8M
    for (j = 0; j < REF_TYPES; ++j)
3616
50.8M
      for (k = 0; k < COEF_BANDS; ++k)
3617
283M
        for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l)
3618
239M
          full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]);
3619
1.81M
}
3620
3621
#if 0 && CONFIG_INTERNAL_STATS
3622
static void output_frame_level_debug_stats(VP9_COMP *cpi) {
3623
  VP9_COMMON *const cm = &cpi->common;
3624
  FILE *const f = fopen("tmp.stt", cm->current_video_frame ? "a" : "w");
3625
  int64_t recon_err;
3626
3627
  vpx_clear_system_state();
3628
3629
#if CONFIG_VP9_HIGHBITDEPTH
3630
  if (cm->use_highbitdepth) {
3631
    recon_err = vpx_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
3632
  } else {
3633
    recon_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
3634
  }
3635
#else
3636
  recon_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
3637
#endif  // CONFIG_VP9_HIGHBITDEPTH
3638
3639
3640
  if (cpi->twopass.total_left_stats.coded_error != 0.0) {
3641
    double dc_quant_devisor;
3642
#if CONFIG_VP9_HIGHBITDEPTH
3643
    switch (cm->bit_depth) {
3644
      case VPX_BITS_8:
3645
        dc_quant_devisor = 4.0;
3646
        break;
3647
      case VPX_BITS_10:
3648
        dc_quant_devisor = 16.0;
3649
        break;
3650
      default:
3651
        assert(cm->bit_depth == VPX_BITS_12);
3652
        dc_quant_devisor = 64.0;
3653
        break;
3654
    }
3655
#else
3656
    dc_quant_devisor = 4.0;
3657
#endif
3658
3659
    if (!cm->current_video_frame) {
3660
      fprintf(f, "frame, width, height, last ts, last end ts, "
3661
          "source_alt_ref_pending, source_alt_ref_active, "
3662
          "this_frame_target, projected_frame_size, "
3663
          "projected_frame_size / MBs, "
3664
          "projected_frame_size - this_frame_target, "
3665
          "vbr_bits_off_target, vbr_bits_off_target_fast, "
3666
          "twopass.extend_minq, twopass.extend_minq_fast, "
3667
          "total_target_vs_actual, "
3668
          "starting_buffer_level - bits_off_target, "
3669
          "total_actual_bits, base_qindex, q for base_qindex, "
3670
          "dc quant, q for active_worst_quality, avg_q, q for oxcf.cq_level, "
3671
          "refresh_last_frame, refresh_golden_frame, refresh_alt_ref_frame, "
3672
          "frame_type, gfu_boost, "
3673
          "twopass.bits_left, "
3674
          "twopass.total_left_stats.coded_error, "
3675
          "twopass.bits_left / (1 + twopass.total_left_stats.coded_error), "
3676
          "tot_recode_hits, recon_err, kf_boost, "
3677
          "twopass.kf_zeromotion_pct, twopass.fr_content_type, "
3678
          "filter_level, seg.aq_av_offset\n");
3679
    }
3680
3681
    fprintf(f, "%10u, %d, %d, %10"PRId64", %10"PRId64", %d, %d, %10d, %10d, "
3682
        "%10d, %10d, %10"PRId64", %10"PRId64", %5d, %5d, %10"PRId64", "
3683
        "%10"PRId64", %10"PRId64", %10d, %7.2lf, %7.2lf, %7.2lf, %7.2lf, "
3684
        "%7.2lf, %6d, %6d, %5d, %5d, %5d, %10"PRId64", %10.3lf, %10lf, %8u, "
3685
        "%10"PRId64", %10d, %10d, %10d, %10d, %10d\n",
3686
        cpi->common.current_video_frame,
3687
        cm->width, cm->height,
3688
        cpi->last_time_stamp_seen,
3689
        cpi->last_end_time_stamp_seen,
3690
        cpi->rc.source_alt_ref_pending,
3691
        cpi->rc.source_alt_ref_active,
3692
        cpi->rc.this_frame_target,
3693
        cpi->rc.projected_frame_size,
3694
        cpi->rc.projected_frame_size / cpi->common.MBs,
3695
        (cpi->rc.projected_frame_size - cpi->rc.this_frame_target),
3696
        cpi->rc.vbr_bits_off_target,
3697
        cpi->rc.vbr_bits_off_target_fast,
3698
        cpi->twopass.extend_minq,
3699
        cpi->twopass.extend_minq_fast,
3700
        cpi->rc.total_target_vs_actual,
3701
        (cpi->rc.starting_buffer_level - cpi->rc.bits_off_target),
3702
        cpi->rc.total_actual_bits, cm->base_qindex,
3703
        vp9_convert_qindex_to_q(cm->base_qindex, cm->bit_depth),
3704
        (double)vp9_dc_quant(cm->base_qindex, 0, cm->bit_depth) /
3705
            dc_quant_devisor,
3706
        vp9_convert_qindex_to_q(cpi->twopass.active_worst_quality,
3707
                                cm->bit_depth),
3708
        cpi->rc.avg_q,
3709
        vp9_convert_qindex_to_q(cpi->oxcf.cq_level, cm->bit_depth),
3710
        cpi->refresh_last_frame, cpi->refresh_golden_frame,
3711
        cpi->refresh_alt_ref_frame, cm->frame_type, cpi->rc.gfu_boost,
3712
        cpi->twopass.bits_left,
3713
        cpi->twopass.total_left_stats.coded_error,
3714
        cpi->twopass.bits_left /
3715
            (1 + cpi->twopass.total_left_stats.coded_error),
3716
        cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost,
3717
        cpi->twopass.kf_zeromotion_pct,
3718
        cpi->twopass.fr_content_type,
3719
        cm->lf.filter_level,
3720
        cm->seg.aq_av_offset);
3721
  }
3722
  fclose(f);
3723
3724
  if (0) {
3725
    FILE *const fmodes = fopen("Modes.stt", "a");
3726
    int i;
3727
3728
    fprintf(fmodes, "%6d:%1d:%1d:%1d ", cpi->common.current_video_frame,
3729
            cm->frame_type, cpi->refresh_golden_frame,
3730
            cpi->refresh_alt_ref_frame);
3731
3732
    for (i = 0; i < MAX_MODES; ++i)
3733
      fprintf(fmodes, "%5d ", cpi->mode_chosen_counts[i]);
3734
3735
    fprintf(fmodes, "\n");
3736
3737
    fclose(fmodes);
3738
  }
3739
}
3740
#endif
3741
3742
0
static void set_mv_search_params(VP9_COMP *cpi) {
3743
0
  const VP9_COMMON *const cm = &cpi->common;
3744
0
  const unsigned int max_mv_def = VPXMIN(cm->width, cm->height);
3745
3746
  // Default based on max resolution.
3747
0
  cpi->mv_step_param = vp9_init_search_range(max_mv_def);
3748
3749
0
  if (cpi->sf.mv.auto_mv_step_size) {
3750
0
    if (frame_is_intra_only(cm)) {
3751
      // Initialize max_mv_magnitude for use in the first INTER frame
3752
      // after a key/intra-only frame.
3753
0
      cpi->max_mv_magnitude = max_mv_def;
3754
0
    } else {
3755
0
      if (cm->show_frame) {
3756
        // Allow mv_steps to correspond to twice the max mv magnitude found
3757
        // in the previous frame, capped by the default max_mv_magnitude based
3758
        // on resolution.
3759
0
        cpi->mv_step_param = vp9_init_search_range(
3760
0
            VPXMIN(max_mv_def, 2 * cpi->max_mv_magnitude));
3761
0
      }
3762
0
      cpi->max_mv_magnitude = 0;
3763
0
    }
3764
0
  }
3765
0
}
3766
3767
454k
static void set_size_independent_vars(VP9_COMP *cpi) {
3768
454k
  vp9_set_speed_features_framesize_independent(cpi, cpi->oxcf.speed);
3769
454k
  vp9_set_rd_speed_thresholds(cpi);
3770
454k
  vp9_set_rd_speed_thresholds_sub8x8(cpi);
3771
454k
  cpi->common.interp_filter = cpi->sf.default_interp_filter;
3772
454k
}
3773
3774
static void set_size_dependent_vars(VP9_COMP *cpi, int *q, int *bottom_index,
3775
454k
                                    int *top_index) {
3776
454k
  VP9_COMMON *const cm = &cpi->common;
3777
3778
  // Setup variables that depend on the dimensions of the frame.
3779
454k
  vp9_set_speed_features_framesize_dependent(cpi, cpi->oxcf.speed);
3780
3781
  // Decide q and q bounds.
3782
454k
  *q = vp9_rc_pick_q_and_bounds(cpi, bottom_index, top_index);
3783
3784
454k
  if (cpi->oxcf.rc_mode == VPX_CBR && cpi->rc.force_max_q) {
3785
0
    *q = cpi->rc.worst_quality;
3786
0
    cpi->rc.force_max_q = 0;
3787
0
  }
3788
3789
454k
  if (cpi->use_svc) {
3790
0
    cpi->svc.base_qindex[cpi->svc.spatial_layer_id] = *q;
3791
0
  }
3792
3793
454k
  if (!frame_is_intra_only(cm)) {
3794
426k
    vp9_set_high_precision_mv(cpi, (*q) < HIGH_PRECISION_MV_QTHRESH);
3795
426k
  }
3796
3797
454k
#if !CONFIG_REALTIME_ONLY
3798
  // Configure experimental use of segmentation for enhanced coding of
3799
  // static regions if indicated.
3800
  // Only allowed in the second pass of a two pass encode, as it requires
3801
  // lagged coding, and if the relevant speed feature flag is set.
3802
454k
  if (cpi->oxcf.pass == 2 && cpi->sf.static_segmentation)
3803
0
    configure_static_seg_features(cpi);
3804
454k
#endif  // !CONFIG_REALTIME_ONLY
3805
3806
#if CONFIG_VP9_POSTPROC && !(CONFIG_VP9_TEMPORAL_DENOISING)
3807
  if (cpi->oxcf.noise_sensitivity > 0) {
3808
    int l = 0;
3809
    switch (cpi->oxcf.noise_sensitivity) {
3810
      case 1: l = 20; break;
3811
      case 2: l = 40; break;
3812
      case 3: l = 60; break;
3813
      case 4:
3814
      case 5: l = 100; break;
3815
      case 6: l = 150; break;
3816
    }
3817
    if (!cpi->common.postproc_state.limits ||
3818
        cpi->common.postproc_state.limits_size <
3819
            cpi->un_scaled_source->y_width) {
3820
      if (cpi->common.postproc_state.limits)
3821
        vpx_free(cpi->common.postproc_state.limits);
3822
      CHECK_MEM_ERROR(&cm->error, cpi->common.postproc_state.limits,
3823
                      vpx_calloc(cpi->un_scaled_source->y_width,
3824
                                 sizeof(*cpi->common.postproc_state.limits)));
3825
      cpi->common.postproc_state.limits_size = cpi->un_scaled_source->y_width;
3826
    }
3827
    vp9_denoise(&cpi->common, cpi->Source, cpi->Source, l,
3828
                cpi->common.postproc_state.limits);
3829
  }
3830
#endif  // CONFIG_VP9_POSTPROC
3831
454k
}
3832
3833
908k
static void init_motion_estimation(VP9_COMP *cpi) {
3834
908k
  int y_stride = cpi->scaled_source.y_stride;
3835
3836
908k
  if (cpi->sf.mv.search_method == NSTEP) {
3837
908k
    vp9_init3smotion_compensation(&cpi->ss_cfg, y_stride);
3838
908k
  } else if (cpi->sf.mv.search_method == DIAMOND) {
3839
0
    vp9_init_dsmotion_compensation(&cpi->ss_cfg, y_stride);
3840
0
  }
3841
908k
}
3842
3843
454k
static void set_frame_size(VP9_COMP *cpi) {
3844
454k
  int ref_frame;
3845
454k
  VP9_COMMON *const cm = &cpi->common;
3846
454k
  VP9EncoderConfig *const oxcf = &cpi->oxcf;
3847
454k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
3848
3849
454k
#if !CONFIG_REALTIME_ONLY
3850
454k
  if (oxcf->pass == 2 && oxcf->rc_mode == VPX_VBR &&
3851
0
      ((oxcf->resize_mode == RESIZE_FIXED && cm->current_video_frame == 0) ||
3852
0
       (oxcf->resize_mode == RESIZE_DYNAMIC && cpi->resize_pending))) {
3853
0
    calculate_coded_size(cpi, &oxcf->scaled_frame_width,
3854
0
                         &oxcf->scaled_frame_height);
3855
3856
    // There has been a change in frame size.
3857
0
    vp9_set_size_literal(cpi, oxcf->scaled_frame_width,
3858
0
                         oxcf->scaled_frame_height);
3859
0
  }
3860
454k
#endif  // !CONFIG_REALTIME_ONLY
3861
3862
454k
  if (oxcf->pass == 0 && oxcf->rc_mode == VPX_CBR &&
3863
0
      oxcf->resize_mode == RESIZE_DYNAMIC && cpi->resize_pending != 0) {
3864
    // For SVC scaled width/height will have been set (svc->resize_set=1)
3865
    // in get_svc_params based on the layer width/height.
3866
0
    if (!cpi->use_svc || !cpi->svc.resize_set) {
3867
0
      oxcf->scaled_frame_width =
3868
0
          (oxcf->width * cpi->resize_scale_num) / cpi->resize_scale_den;
3869
0
      oxcf->scaled_frame_height =
3870
0
          (oxcf->height * cpi->resize_scale_num) / cpi->resize_scale_den;
3871
      // There has been a change in frame size.
3872
0
      vp9_set_size_literal(cpi, oxcf->scaled_frame_width,
3873
0
                           oxcf->scaled_frame_height);
3874
0
    }
3875
3876
    // TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed.
3877
0
    set_mv_search_params(cpi);
3878
3879
0
    vp9_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
3880
#if CONFIG_VP9_TEMPORAL_DENOISING
3881
    // Reset the denoiser on the resized frame.
3882
    if (cpi->oxcf.noise_sensitivity > 0) {
3883
      vp9_denoiser_free(&(cpi->denoiser));
3884
      setup_denoiser_buffer(cpi);
3885
      // Dynamic resize is only triggered for non-SVC, so we can force
3886
      // golden frame update here as temporary fix to denoiser.
3887
      cpi->refresh_golden_frame = 1;
3888
    }
3889
#endif
3890
0
  }
3891
3892
454k
  if ((oxcf->pass == 2) && !cpi->use_svc) {
3893
0
    vp9_set_target_rate(cpi);
3894
0
  }
3895
3896
454k
  alloc_frame_mvs(cm, cm->new_fb_idx);
3897
3898
  // Reset the frame pointers to the current frame size.
3899
454k
  if (vpx_realloc_frame_buffer(get_frame_new_buffer(cm), cm->width, cm->height,
3900
454k
                               cm->subsampling_x, cm->subsampling_y,
3901
454k
#if CONFIG_VP9_HIGHBITDEPTH
3902
454k
                               cm->use_highbitdepth,
3903
454k
#endif
3904
454k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
3905
454k
                               NULL, NULL, NULL))
3906
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
3907
0
                       "Failed to allocate frame buffer");
3908
3909
454k
  alloc_util_frame_buffers(cpi);
3910
454k
  init_motion_estimation(cpi);
3911
3912
454k
  int has_valid_ref_frame = 0;
3913
1.81M
  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
3914
1.36M
    RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
3915
1.36M
    const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
3916
3917
1.36M
    ref_buf->idx = buf_idx;
3918
3919
1.36M
    if (buf_idx != INVALID_IDX) {
3920
1.33M
      YV12_BUFFER_CONFIG *const buf = &cm->buffer_pool->frame_bufs[buf_idx].buf;
3921
1.33M
      ref_buf->buf = buf;
3922
1.33M
#if CONFIG_VP9_HIGHBITDEPTH
3923
1.33M
      vp9_setup_scale_factors_for_frame(
3924
1.33M
          &ref_buf->sf, buf->y_crop_width, buf->y_crop_height, cm->width,
3925
1.33M
          cm->height, (buf->flags & YV12_FLAG_HIGHBITDEPTH) ? 1 : 0);
3926
#else
3927
      vp9_setup_scale_factors_for_frame(&ref_buf->sf, buf->y_crop_width,
3928
                                        buf->y_crop_height, cm->width,
3929
                                        cm->height);
3930
#endif  // CONFIG_VP9_HIGHBITDEPTH
3931
1.33M
      has_valid_ref_frame |= vp9_is_valid_scale(&ref_buf->sf);
3932
1.33M
      if (vp9_is_scaled(&ref_buf->sf)) vpx_extend_frame_borders(buf);
3933
1.33M
    } else {
3934
32.7k
      ref_buf->buf = NULL;
3935
32.7k
    }
3936
1.36M
  }
3937
454k
  if (!frame_is_intra_only(cm) && !has_valid_ref_frame) {
3938
0
    vpx_internal_error(
3939
0
        &cm->error, VPX_CODEC_ERROR,
3940
0
        "Can't find at least one reference frame with valid size");
3941
0
  }
3942
3943
454k
  set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
3944
454k
}
3945
3946
454k
static void save_encode_params(VP9_COMP *cpi) {
3947
454k
  int tile_idx;
3948
454k
  int i, j;
3949
454k
  TileDataEnc *tile_data;
3950
454k
  RD_OPT *rd_opt = &cpi->rd;
3951
2.27M
  for (i = 0; i < MAX_REF_FRAMES; i++) {
3952
7.26M
    for (j = 0; j < REFERENCE_MODES; j++)
3953
5.45M
      rd_opt->prediction_type_threshes_prev[i][j] =
3954
5.45M
          rd_opt->prediction_type_threshes[i][j];
3955
3956
9.08M
    for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; j++)
3957
7.26M
      rd_opt->filter_threshes_prev[i][j] = rd_opt->filter_threshes[i][j];
3958
1.81M
  }
3959
3960
897k
  for (tile_idx = 0; tile_idx < cpi->allocated_tiles; tile_idx++) {
3961
443k
    assert(cpi->tile_data);
3962
443k
    tile_data = &cpi->tile_data[tile_idx];
3963
443k
    vp9_copy(tile_data->thresh_freq_fact_prev, tile_data->thresh_freq_fact);
3964
443k
  }
3965
454k
}
3966
3967
0
static INLINE void set_raw_source_frame(VP9_COMP *cpi) {
3968
#ifdef ENABLE_KF_DENOISE
3969
  if (is_spatial_denoise_enabled(cpi)) {
3970
    cpi->raw_source_frame = vp9_scale_if_required(
3971
        cm, &cpi->raw_unscaled_source, &cpi->raw_scaled_source,
3972
        (oxcf->pass == 0), EIGHTTAP, 0);
3973
  } else {
3974
    cpi->raw_source_frame = cpi->Source;
3975
  }
3976
#else
3977
0
  cpi->raw_source_frame = cpi->Source;
3978
0
#endif
3979
0
}
3980
3981
static YV12_BUFFER_CONFIG *svc_twostage_scale(
3982
    VP9_COMMON *cm, YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled,
3983
    YV12_BUFFER_CONFIG *scaled_temp, INTERP_FILTER filter_type,
3984
0
    int phase_scaler, INTERP_FILTER filter_type2, int phase_scaler2) {
3985
0
  if (cm->mi_cols * MI_SIZE != unscaled->y_width ||
3986
0
      cm->mi_rows * MI_SIZE != unscaled->y_height) {
3987
0
#if CONFIG_VP9_HIGHBITDEPTH
3988
0
    if (cm->bit_depth == VPX_BITS_8) {
3989
0
      vp9_scale_and_extend_frame(unscaled, scaled_temp, filter_type2,
3990
0
                                 phase_scaler2);
3991
0
      vp9_scale_and_extend_frame(scaled_temp, scaled, filter_type,
3992
0
                                 phase_scaler);
3993
0
    } else {
3994
0
      scale_and_extend_frame(unscaled, scaled_temp, (int)cm->bit_depth,
3995
0
                             filter_type2, phase_scaler2);
3996
0
      scale_and_extend_frame(scaled_temp, scaled, (int)cm->bit_depth,
3997
0
                             filter_type, phase_scaler);
3998
0
    }
3999
#else
4000
    vp9_scale_and_extend_frame(unscaled, scaled_temp, filter_type2,
4001
                               phase_scaler2);
4002
    vp9_scale_and_extend_frame(scaled_temp, scaled, filter_type, phase_scaler);
4003
#endif  // CONFIG_VP9_HIGHBITDEPTH
4004
0
    return scaled;
4005
0
  } else {
4006
0
    return unscaled;
4007
0
  }
4008
0
}
4009
4010
static int encode_without_recode_loop(VP9_COMP *cpi, size_t *size,
4011
454k
                                      uint8_t *dest, size_t dest_size) {
4012
454k
  VP9_COMMON *const cm = &cpi->common;
4013
454k
  SVC *const svc = &cpi->svc;
4014
454k
  int q = 0, bottom_index = 0, top_index = 0;
4015
454k
  int no_drop_scene_change = 0;
4016
454k
  const INTERP_FILTER filter_scaler =
4017
454k
      (is_one_pass_svc(cpi))
4018
454k
          ? svc->downsample_filter_type[svc->spatial_layer_id]
4019
454k
          : EIGHTTAP;
4020
454k
  const int phase_scaler =
4021
454k
      (is_one_pass_svc(cpi))
4022
454k
          ? svc->downsample_filter_phase[svc->spatial_layer_id]
4023
454k
          : 0;
4024
4025
454k
  if (cm->show_existing_frame) {
4026
0
    cpi->rc.this_frame_target = 0;
4027
0
    if (is_psnr_calc_enabled(cpi)) set_raw_source_frame(cpi);
4028
0
    return 1;
4029
0
  }
4030
4031
454k
  svc->time_stamp_prev[svc->spatial_layer_id] = svc->time_stamp_superframe;
4032
4033
  // Flag to check if its valid to compute the source sad (used for
4034
  // scene detection and for superblock content state in CBR mode).
4035
  // The flag may get reset below based on SVC or resizing state.
4036
454k
  cpi->compute_source_sad_onepass = cpi->oxcf.mode == REALTIME;
4037
4038
454k
  vpx_clear_system_state();
4039
4040
454k
  set_frame_size(cpi);
4041
4042
454k
  if (is_one_pass_svc(cpi) &&
4043
0
      cpi->un_scaled_source->y_width == cm->width << 2 &&
4044
0
      cpi->un_scaled_source->y_height == cm->height << 2 &&
4045
0
      svc->scaled_temp.y_width == cm->width << 1 &&
4046
0
      svc->scaled_temp.y_height == cm->height << 1) {
4047
    // For svc, if it is a 1/4x1/4 downscaling, do a two-stage scaling to take
4048
    // advantage of the 1:2 optimized scaler. In the process, the 1/2x1/2
4049
    // result will be saved in scaled_temp and might be used later.
4050
0
    const INTERP_FILTER filter_scaler2 = svc->downsample_filter_type[1];
4051
0
    const int phase_scaler2 = svc->downsample_filter_phase[1];
4052
0
    cpi->Source = svc_twostage_scale(
4053
0
        cm, cpi->un_scaled_source, &cpi->scaled_source, &svc->scaled_temp,
4054
0
        filter_scaler, phase_scaler, filter_scaler2, phase_scaler2);
4055
0
    svc->scaled_one_half = 1;
4056
454k
  } else if (is_one_pass_svc(cpi) &&
4057
0
             cpi->un_scaled_source->y_width == cm->width << 1 &&
4058
0
             cpi->un_scaled_source->y_height == cm->height << 1 &&
4059
0
             svc->scaled_one_half) {
4060
    // If the spatial layer is 1/2x1/2 and the scaling is already done in the
4061
    // two-stage scaling, use the result directly.
4062
0
    cpi->Source = &svc->scaled_temp;
4063
0
    svc->scaled_one_half = 0;
4064
454k
  } else {
4065
454k
    cpi->Source = vp9_scale_if_required(
4066
454k
        cm, cpi->un_scaled_source, &cpi->scaled_source, (cpi->oxcf.pass == 0),
4067
454k
        filter_scaler, phase_scaler);
4068
454k
  }
4069
#ifdef OUTPUT_YUV_SVC_SRC
4070
  // Write out at most 3 spatial layers.
4071
  if (is_one_pass_svc(cpi) && svc->spatial_layer_id < 3) {
4072
    vpx_write_yuv_frame(yuv_svc_src[svc->spatial_layer_id], cpi->Source);
4073
  }
4074
#endif
4075
  // Unfiltered raw source used in metrics calculation if the source
4076
  // has been filtered.
4077
454k
  if (is_psnr_calc_enabled(cpi)) {
4078
#ifdef ENABLE_KF_DENOISE
4079
    if (is_spatial_denoise_enabled(cpi)) {
4080
      cpi->raw_source_frame = vp9_scale_if_required(
4081
          cm, &cpi->raw_unscaled_source, &cpi->raw_scaled_source,
4082
          (cpi->oxcf.pass == 0), EIGHTTAP, phase_scaler);
4083
    } else {
4084
      cpi->raw_source_frame = cpi->Source;
4085
    }
4086
#else
4087
0
    cpi->raw_source_frame = cpi->Source;
4088
0
#endif
4089
0
  }
4090
4091
454k
  if ((cpi->use_svc &&
4092
0
       (svc->spatial_layer_id < svc->number_spatial_layers - 1 ||
4093
0
        svc->temporal_layer_id < svc->number_temporal_layers - 1 ||
4094
0
        svc->current_superframe < 1)) ||
4095
454k
      cpi->resize_pending || cpi->resize_state || cpi->external_resize ||
4096
454k
      cpi->resize_state != ORIG) {
4097
0
    cpi->compute_source_sad_onepass = 0;
4098
0
    if (cpi->content_state_sb_fd != NULL)
4099
0
      memset(cpi->content_state_sb_fd, 0,
4100
0
             (cm->mi_stride >> 3) * ((cm->mi_rows >> 3) + 1) *
4101
0
                 sizeof(*cpi->content_state_sb_fd));
4102
0
  }
4103
4104
  // Avoid scaling last_source unless its needed.
4105
  // Last source is needed if avg_source_sad() is used, or if noise estimation
4106
  // is enabled.
4107
454k
  if (cpi->unscaled_last_source != NULL &&
4108
432k
      (cpi->oxcf.content == VP9E_CONTENT_SCREEN ||
4109
432k
       (cpi->oxcf.pass == 0 && cpi->oxcf.rc_mode == VPX_VBR &&
4110
432k
        cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5) ||
4111
193k
       (cpi->noise_estimate.enabled && !cpi->oxcf.noise_sensitivity) ||
4112
193k
       cpi->compute_source_sad_onepass))
4113
239k
    cpi->Last_Source = vp9_scale_if_required(
4114
239k
        cm, cpi->unscaled_last_source, &cpi->scaled_last_source,
4115
239k
        (cpi->oxcf.pass == 0), EIGHTTAP, 0);
4116
4117
454k
  if (cpi->Last_Source == NULL ||
4118
250k
      cpi->Last_Source->y_width != cpi->Source->y_width ||
4119
250k
      cpi->Last_Source->y_height != cpi->Source->y_height)
4120
204k
    cpi->compute_source_sad_onepass = 0;
4121
4122
454k
  if (frame_is_intra_only(cm) || cpi->resize_pending != 0) {
4123
27.9k
    memset(cpi->consec_zero_mv, 0,
4124
27.9k
           cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv));
4125
27.9k
  }
4126
4127
#if CONFIG_VP9_TEMPORAL_DENOISING
4128
  if (cpi->oxcf.noise_sensitivity > 0 && cpi->use_svc)
4129
    vp9_denoiser_reset_on_first_frame(cpi);
4130
#endif
4131
4132
  // Scene detection is always used for VBR mode or screen-content case.
4133
  // For other cases (e.g., CBR mode) use it for 5 <= speed.
4134
454k
  cpi->rc.high_source_sad = 0;
4135
454k
  cpi->rc.hybrid_intra_scene_change = 0;
4136
454k
  cpi->rc.re_encode_maxq_scene_change = 0;
4137
454k
  if (cm->show_frame && cpi->oxcf.mode == REALTIME &&
4138
243k
      !cpi->disable_scene_detection_rtc_ratectrl &&
4139
243k
      (cpi->oxcf.rc_mode == VPX_VBR ||
4140
0
       cpi->oxcf.content == VP9E_CONTENT_SCREEN || cpi->oxcf.speed >= 5))
4141
243k
    vp9_scene_detection_onepass(cpi);
4142
4143
454k
  if (svc->spatial_layer_id == svc->first_spatial_layer_to_encode) {
4144
454k
    svc->high_source_sad_superframe = cpi->rc.high_source_sad;
4145
454k
    svc->high_num_blocks_with_motion = cpi->rc.high_num_blocks_with_motion;
4146
    // On scene change reset temporal layer pattern to TL0.
4147
    // Note that if the base/lower spatial layers are skipped: instead of
4148
    // inserting base layer here, we force max-q for the next superframe
4149
    // with lower spatial layers: this is done in vp9_encodedframe_overshoot()
4150
    // when max-q is decided for the current layer.
4151
    // Only do this reset for bypass/flexible mode.
4152
454k
    if (svc->high_source_sad_superframe && svc->temporal_layer_id > 0 &&
4153
0
        svc->temporal_layering_mode == VP9E_TEMPORAL_LAYERING_MODE_BYPASS) {
4154
      // rc->high_source_sad will get reset so copy it to restore it.
4155
0
      int tmp_high_source_sad = cpi->rc.high_source_sad;
4156
0
      vp9_svc_reset_temporal_layers(cpi, cm->frame_type == KEY_FRAME);
4157
0
      cpi->rc.high_source_sad = tmp_high_source_sad;
4158
0
    }
4159
454k
  }
4160
4161
454k
  vp9_update_noise_estimate(cpi);
4162
4163
  // For 1 pass CBR, check if we are dropping this frame.
4164
  // Never drop on key frame, if base layer is key for svc,
4165
  // on scene change, or if superframe has layer sync.
4166
454k
  if ((cpi->rc.high_source_sad || svc->high_source_sad_superframe) &&
4167
0
      !(cpi->rc.use_post_encode_drop && svc->last_layer_dropped[0]))
4168
0
    no_drop_scene_change = 1;
4169
454k
  if (cpi->oxcf.pass == 0 && cpi->oxcf.rc_mode == VPX_CBR &&
4170
0
      !frame_is_intra_only(cm) && !no_drop_scene_change &&
4171
0
      !svc->superframe_has_layer_sync &&
4172
0
      (!cpi->use_svc ||
4173
0
       !svc->layer_context[svc->temporal_layer_id].is_key_frame)) {
4174
0
    if (vp9_rc_drop_frame(cpi)) return 0;
4175
0
  }
4176
4177
  // For 1 pass SVC wth use_nonrd_pick_mode, only ZEROMV is allowed for
4178
  // spatial reference frame when svc->force_zero_mode_spatial_ref = 1.
4179
  // Under those conditions we can avoid this frame-level upsampling
4180
  // (for non intra_only frames).
4181
  // For SVC single_layer mode, dynamic resize is allowed and we need to
4182
  // scale references for this case.
4183
454k
  if (frame_is_intra_only(cm) == 0 &&
4184
426k
      ((svc->single_layer_svc && cpi->oxcf.resize_mode == RESIZE_DYNAMIC) ||
4185
426k
       !(is_one_pass_svc(cpi) && svc->force_zero_mode_spatial_ref &&
4186
426k
         cpi->sf.use_nonrd_pick_mode))) {
4187
426k
    vp9_scale_references(cpi);
4188
426k
  }
4189
4190
454k
  set_size_independent_vars(cpi);
4191
454k
  set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
4192
4193
  // search method and step parameter might be changed in speed settings.
4194
454k
  init_motion_estimation(cpi);
4195
4196
454k
  if (cpi->sf.copy_partition_flag) alloc_copy_partition_data(cpi);
4197
4198
454k
  if (cpi->sf.svc_use_lowres_part &&
4199
0
      svc->spatial_layer_id == svc->number_spatial_layers - 2) {
4200
0
    if (svc->prev_partition_svc == NULL) {
4201
0
      CHECK_MEM_ERROR(
4202
0
          &cm->error, svc->prev_partition_svc,
4203
0
          (BLOCK_SIZE *)vpx_calloc(cm->mi_stride * cm->mi_rows,
4204
0
                                   sizeof(*svc->prev_partition_svc)));
4205
0
    }
4206
0
  }
4207
4208
  // TODO(jianj): Look into issue of skin detection with high bitdepth.
4209
454k
  if (cm->bit_depth == 8 && cpi->oxcf.speed >= 5 && cpi->oxcf.pass == 0 &&
4210
254k
      cpi->oxcf.rc_mode == VPX_CBR &&
4211
0
      cpi->oxcf.content != VP9E_CONTENT_SCREEN &&
4212
0
      cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
4213
0
    cpi->use_skin_detection = 1;
4214
0
  }
4215
4216
  // Enable post encode frame dropping for CBR on non key frame, when
4217
  // ext_use_post_encode_drop is specified by user.
4218
454k
  cpi->rc.use_post_encode_drop = cpi->rc.ext_use_post_encode_drop &&
4219
0
                                 cpi->oxcf.rc_mode == VPX_CBR &&
4220
0
                                 cm->frame_type != KEY_FRAME;
4221
4222
454k
  vp9_set_quantizer(cpi, q, 0);
4223
454k
  vp9_set_variance_partition_thresholds(cpi, q, 0);
4224
4225
454k
  setup_frame(cpi);
4226
4227
454k
  suppress_active_map(cpi);
4228
4229
454k
  if (cpi->use_svc) {
4230
    // On non-zero spatial layer, check for disabling inter-layer
4231
    // prediction.
4232
0
    if (svc->spatial_layer_id > 0) vp9_svc_constrain_inter_layer_pred(cpi);
4233
0
    vp9_svc_assert_constraints_pattern(cpi);
4234
0
  }
4235
4236
454k
  if (cpi->rc.last_post_encode_dropped_scene_change) {
4237
0
    cpi->rc.high_source_sad = 1;
4238
0
    svc->high_source_sad_superframe = 1;
4239
    // For now disable use_source_sad since Last_Source will not be the previous
4240
    // encoded but the dropped one.
4241
0
    cpi->sf.use_source_sad = 0;
4242
0
    cpi->rc.last_post_encode_dropped_scene_change = 0;
4243
0
  }
4244
  // Check if this high_source_sad (scene/slide change) frame should be
4245
  // encoded at high/max QP, and if so, set the q and adjust some rate
4246
  // control parameters.
4247
454k
  if (cpi->sf.overshoot_detection_cbr_rt == FAST_DETECTION_MAXQ &&
4248
0
      (cpi->rc.high_source_sad ||
4249
0
       (cpi->use_svc && svc->high_source_sad_superframe))) {
4250
0
    if (vp9_encodedframe_overshoot(cpi, -1, &q)) {
4251
0
      vp9_set_quantizer(cpi, q, 0);
4252
0
      vp9_set_variance_partition_thresholds(cpi, q, 0);
4253
0
    }
4254
0
  }
4255
4256
454k
#if !CONFIG_REALTIME_ONLY
4257
  // Variance adaptive and in frame q adjustment experiments are mutually
4258
  // exclusive.
4259
454k
  if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
4260
0
    vp9_vaq_frame_setup(cpi);
4261
454k
  } else if (cpi->oxcf.aq_mode == EQUATOR360_AQ) {
4262
0
    vp9_360aq_frame_setup(cpi);
4263
454k
  } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
4264
0
    vp9_setup_in_frame_q_adj(cpi);
4265
454k
  } else if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ) {
4266
    // it may be pretty bad for rate-control,
4267
    // and I should handle it somehow
4268
0
    vp9_alt_ref_aq_setup_map(cpi->alt_ref_aq, cpi);
4269
454k
  } else {
4270
454k
#endif
4271
    // If ROI is enabled and skip feature is used for segmentation, apply cyclic
4272
    // refresh but not apply ROI for skip for the first 20 frames (defined by
4273
    // FRAMES_NO_SKIPPING_AFTER_KEY) after key frame to improve quality.
4274
454k
    if (cpi->roi.enabled && !frame_is_intra_only(cm)) {
4275
0
      if (cpi->roi.skip[BACKGROUND_SEG_SKIP_ID]) {
4276
0
        if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ)
4277
0
          vp9_cyclic_refresh_setup(cpi);
4278
0
        if (cpi->rc.frames_since_key > FRAMES_NO_SKIPPING_AFTER_KEY)
4279
0
          apply_roi_map(cpi);
4280
0
      } else {
4281
0
        apply_roi_map(cpi);
4282
0
      }
4283
454k
    } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
4284
0
      vp9_cyclic_refresh_setup(cpi);
4285
0
    }
4286
4287
454k
#if !CONFIG_REALTIME_ONLY
4288
454k
  }
4289
454k
#endif
4290
4291
454k
  apply_active_map(cpi);
4292
4293
454k
  vp9_encode_frame(cpi);
4294
4295
  // Check if we should re-encode this frame at high Q because of high
4296
  // overshoot based on the encoded frame size. Only for frames where
4297
  // high temporal-source SAD is detected.
4298
  // For SVC: all spatial layers are checked for re-encoding.
4299
454k
  if (cpi->sf.overshoot_detection_cbr_rt == RE_ENCODE_MAXQ &&
4300
0
      (cpi->rc.high_source_sad ||
4301
0
       (cpi->use_svc && svc->high_source_sad_superframe))) {
4302
0
    int frame_size = 0;
4303
    // Get an estimate of the encoded frame size.
4304
0
    save_coding_context(cpi);
4305
0
    vp9_pack_bitstream(cpi, dest, dest_size, size);
4306
0
    restore_coding_context(cpi);
4307
0
    frame_size = (int)(*size) << 3;
4308
    // Check if encoded frame will overshoot too much, and if so, set the q and
4309
    // adjust some rate control parameters, and return to re-encode the frame.
4310
0
    if (vp9_encodedframe_overshoot(cpi, frame_size, &q)) {
4311
0
      vpx_clear_system_state();
4312
0
      vp9_set_quantizer(cpi, q, 0);
4313
0
      vp9_set_variance_partition_thresholds(cpi, q, 0);
4314
0
      suppress_active_map(cpi);
4315
      // Turn-off cyclic refresh for re-encoded frame.
4316
0
      if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
4317
0
        CYCLIC_REFRESH *const cr = cpi->cyclic_refresh;
4318
0
        unsigned char *const seg_map = cpi->segmentation_map;
4319
0
        memset(seg_map, 0, cm->mi_rows * cm->mi_cols);
4320
0
        memset(cr->last_coded_q_map, MAXQ,
4321
0
               cm->mi_rows * cm->mi_cols * sizeof(*cr->last_coded_q_map));
4322
0
        cr->sb_index = 0;
4323
0
        vp9_disable_segmentation(&cm->seg);
4324
0
      }
4325
0
      apply_active_map(cpi);
4326
0
      vp9_encode_frame(cpi);
4327
0
    }
4328
0
  }
4329
4330
  // Update some stats from cyclic refresh, and check for golden frame update.
4331
454k
  if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled &&
4332
0
      !frame_is_intra_only(cm) && cpi->cyclic_refresh->content_mode)
4333
0
    vp9_cyclic_refresh_postencode(cpi);
4334
4335
  // Update the skip mb flag probabilities based on the distribution
4336
  // seen in the last encoder iteration.
4337
  // update_base_skip_probs(cpi);
4338
454k
  vpx_clear_system_state();
4339
454k
  return 1;
4340
454k
}
4341
4342
453k
static int get_ref_frame_flags(const VP9_COMP *cpi) {
4343
453k
  const int *const map = cpi->common.ref_frame_map;
4344
453k
  const int gold_is_last = map[cpi->gld_fb_idx] == map[cpi->lst_fb_idx];
4345
453k
  const int alt_is_last = map[cpi->alt_fb_idx] == map[cpi->lst_fb_idx];
4346
453k
  const int gold_is_alt = map[cpi->gld_fb_idx] == map[cpi->alt_fb_idx];
4347
453k
  int flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
4348
4349
453k
  if (gold_is_last) flags &= ~VP9_GOLD_FLAG;
4350
4351
453k
  if (cpi->rc.frames_till_gf_update_due == INT_MAX &&
4352
0
      (cpi->svc.number_temporal_layers == 1 &&
4353
0
       cpi->svc.number_spatial_layers == 1))
4354
0
    flags &= ~VP9_GOLD_FLAG;
4355
4356
453k
  if (alt_is_last) flags &= ~VP9_ALT_FLAG;
4357
4358
453k
  if (gold_is_alt) flags &= ~VP9_ALT_FLAG;
4359
4360
453k
  return flags;
4361
453k
}
4362
4363
#if !CONFIG_REALTIME_ONLY
4364
#define MAX_QSTEP_ADJ 4
4365
0
static int get_qstep_adj(int rate_excess, int rate_limit) {
4366
0
  int qstep =
4367
0
      rate_limit ? ((rate_excess + rate_limit / 2) / rate_limit) : INT_MAX;
4368
0
  return VPXMIN(qstep, MAX_QSTEP_ADJ);
4369
0
}
4370
4371
static void encode_with_recode_loop(VP9_COMP *cpi, size_t *size, uint8_t *dest,
4372
0
                                    size_t dest_size) {
4373
0
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
4374
0
  VP9_COMMON *const cm = &cpi->common;
4375
0
  RATE_CONTROL *const rc = &cpi->rc;
4376
0
  int bottom_index, top_index;
4377
0
  int loop_count = 0;
4378
0
  int loop_at_this_size = 0;
4379
0
  int loop = 0;
4380
0
  int overshoot_seen = 0;
4381
0
  int undershoot_seen = 0;
4382
0
  int frame_over_shoot_limit;
4383
0
  int frame_under_shoot_limit;
4384
0
  int q = 0, q_low = 0, q_high = 0;
4385
0
  int enable_acl;
4386
#ifdef AGGRESSIVE_VBR
4387
  int qrange_adj = 1;
4388
#endif
4389
4390
0
  const int orig_rc_max_frame_bandwidth = rc->max_frame_bandwidth;
4391
4392
0
  if (cm->show_existing_frame) {
4393
0
    rc->this_frame_target = 0;
4394
0
    if (is_psnr_calc_enabled(cpi)) set_raw_source_frame(cpi);
4395
0
    return;
4396
0
  }
4397
4398
0
  set_size_independent_vars(cpi);
4399
4400
0
  enable_acl = cpi->sf.allow_acl ? (cm->frame_type == KEY_FRAME) ||
4401
0
                                       (cpi->twopass.gf_group.index == 1)
4402
0
                                 : 0;
4403
4404
#if CONFIG_COLLECT_COMPONENT_TIMING
4405
  printf("\n Encoding a frame: \n");
4406
#endif
4407
0
  do {
4408
0
    vpx_clear_system_state();
4409
4410
0
    set_frame_size(cpi);
4411
4412
0
    if (loop_count == 0 || cpi->resize_pending != 0) {
4413
0
      set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
4414
4415
#ifdef AGGRESSIVE_VBR
4416
      if (two_pass_first_group_inter(cpi)) {
4417
        // Adjustment limits for min and max q
4418
        qrange_adj = VPXMAX(1, (top_index - bottom_index) / 2);
4419
4420
        bottom_index =
4421
            VPXMAX(bottom_index - qrange_adj / 2, oxcf->best_allowed_q);
4422
        top_index = VPXMIN(oxcf->worst_allowed_q, top_index + qrange_adj / 2);
4423
      }
4424
#endif
4425
      // TODO(agrange) Scale cpi->max_mv_magnitude if frame-size has changed.
4426
0
      set_mv_search_params(cpi);
4427
4428
      // Reset the loop state for new frame size.
4429
0
      overshoot_seen = 0;
4430
0
      undershoot_seen = 0;
4431
4432
      // Reconfiguration for change in frame size has concluded.
4433
0
      cpi->resize_pending = 0;
4434
4435
0
      q_low = bottom_index;
4436
0
      q_high = top_index;
4437
4438
0
      loop_at_this_size = 0;
4439
0
    }
4440
4441
    // Decide frame size bounds first time through.
4442
0
    if (loop_count == 0) {
4443
0
      vp9_rc_compute_frame_size_bounds(cpi, rc->this_frame_target,
4444
0
                                       &frame_under_shoot_limit,
4445
0
                                       &frame_over_shoot_limit);
4446
0
    }
4447
4448
0
    cpi->Source =
4449
0
        vp9_scale_if_required(cm, cpi->un_scaled_source, &cpi->scaled_source,
4450
0
                              (oxcf->pass == 0), EIGHTTAP, 0);
4451
4452
    // Unfiltered raw source used in metrics calculation if the source
4453
    // has been filtered.
4454
0
    if (is_psnr_calc_enabled(cpi)) {
4455
#ifdef ENABLE_KF_DENOISE
4456
      if (is_spatial_denoise_enabled(cpi)) {
4457
        cpi->raw_source_frame = vp9_scale_if_required(
4458
            cm, &cpi->raw_unscaled_source, &cpi->raw_scaled_source,
4459
            (oxcf->pass == 0), EIGHTTAP, 0);
4460
      } else {
4461
        cpi->raw_source_frame = cpi->Source;
4462
      }
4463
#else
4464
0
      cpi->raw_source_frame = cpi->Source;
4465
0
#endif
4466
0
    }
4467
4468
0
    if (cpi->unscaled_last_source != NULL)
4469
0
      cpi->Last_Source = vp9_scale_if_required(cm, cpi->unscaled_last_source,
4470
0
                                               &cpi->scaled_last_source,
4471
0
                                               (oxcf->pass == 0), EIGHTTAP, 0);
4472
4473
0
    if (frame_is_intra_only(cm) == 0) {
4474
0
      if (loop_count > 0) {
4475
0
        release_scaled_references(cpi);
4476
0
      }
4477
0
      vp9_scale_references(cpi);
4478
0
    }
4479
4480
0
    const GF_GROUP *gf_group = &cpi->twopass.gf_group;
4481
0
    int ext_rc_delta_q_uv = 0;
4482
0
    if (cpi->ext_ratectrl.ready &&
4483
0
        (cpi->ext_ratectrl.funcs.rc_type & VPX_RC_QP) != 0 &&
4484
0
        cpi->ext_ratectrl.funcs.get_encodeframe_decision != NULL) {
4485
0
      vpx_codec_err_t codec_status;
4486
0
      vpx_rc_encodeframe_decision_t encode_frame_decision;
4487
0
      int sb_size = num_8x8_blocks_wide_lookup[BLOCK_64X64] * MI_SIZE;
4488
0
      int frame_height_sb = (cm->height + sb_size - 1) / sb_size;
4489
0
      int frame_width_sb = (cm->width + sb_size - 1) / sb_size;
4490
0
      CHECK_MEM_ERROR(&cm->error, encode_frame_decision.sb_params_list,
4491
0
                      (sb_params *)vpx_calloc(
4492
0
                          frame_height_sb * frame_width_sb,
4493
0
                          sizeof(*encode_frame_decision.sb_params_list)));
4494
0
      codec_status = vp9_extrc_get_encodeframe_decision(
4495
0
          &cpi->ext_ratectrl, gf_group->index, &encode_frame_decision);
4496
0
      if (codec_status != VPX_CODEC_OK) {
4497
0
        vpx_internal_error(&cm->error, codec_status,
4498
0
                           "vp9_extrc_get_encodeframe_decision() failed");
4499
0
      }
4500
0
      for (int idx = 0; idx < frame_height_sb * frame_width_sb; ++idx) {
4501
0
        cpi->sb_mul_scale[idx] =
4502
0
            (((int64_t)encode_frame_decision.sb_params_list[idx].rdmult * 256) /
4503
0
             (encode_frame_decision.rdmult + 1));
4504
0
      }
4505
0
      vpx_free(encode_frame_decision.sb_params_list);
4506
      // If the external model recommends a reserved value, we use
4507
      // libvpx's default q.
4508
0
      if (encode_frame_decision.q_index != VPX_DEFAULT_Q) {
4509
0
        q = encode_frame_decision.q_index;
4510
0
      }
4511
0
      ext_rc_delta_q_uv = encode_frame_decision.delta_q_uv;
4512
0
    }
4513
4514
0
    if (cpi->ext_ratectrl.ready && cpi->ext_ratectrl.log_file) {
4515
0
      fprintf(cpi->ext_ratectrl.log_file,
4516
0
              "ENCODE_FRAME_INFO gop_index %d update_type %d q %d\n",
4517
0
              gf_group->index, gf_group->update_type[gf_group->index], q);
4518
0
    }
4519
4520
0
    vp9_set_quantizer(cpi, q, ext_rc_delta_q_uv);
4521
4522
0
    if (loop_count == 0) setup_frame(cpi);
4523
4524
    // Variance adaptive and in frame q adjustment experiments are mutually
4525
    // exclusive.
4526
0
    if (oxcf->aq_mode == VARIANCE_AQ) {
4527
0
      vp9_vaq_frame_setup(cpi);
4528
0
    } else if (oxcf->aq_mode == EQUATOR360_AQ) {
4529
0
      vp9_360aq_frame_setup(cpi);
4530
0
    } else if (oxcf->aq_mode == COMPLEXITY_AQ) {
4531
0
      vp9_setup_in_frame_q_adj(cpi);
4532
0
    } else if (oxcf->aq_mode == LOOKAHEAD_AQ) {
4533
0
      vp9_alt_ref_aq_setup_map(cpi->alt_ref_aq, cpi);
4534
0
    } else if (oxcf->aq_mode == PSNR_AQ) {
4535
0
      vp9_psnr_aq_mode_setup(&cm->seg);
4536
0
    }
4537
4538
0
    vp9_encode_frame(cpi);
4539
4540
    // Update the skip mb flag probabilities based on the distribution
4541
    // seen in the last encoder iteration.
4542
    // update_base_skip_probs(cpi);
4543
4544
0
    vpx_clear_system_state();
4545
4546
    // Dummy pack of the bitstream using up to date stats to get an
4547
    // accurate estimate of output frame size to determine if we need
4548
    // to recode.
4549
0
    if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) {
4550
0
      save_coding_context(cpi);
4551
0
      if (!cpi->sf.use_nonrd_pick_mode)
4552
0
        vp9_pack_bitstream(cpi, dest, dest_size, size);
4553
4554
0
      rc->projected_frame_size = (int)(*size) << 3;
4555
4556
0
      if (frame_over_shoot_limit == 0) frame_over_shoot_limit = 1;
4557
0
    }
4558
4559
0
    if (cpi->ext_ratectrl.ready &&
4560
0
        (cpi->ext_ratectrl.funcs.rc_type & VPX_RC_QP) != 0) {
4561
0
      break;
4562
0
    }
4563
4564
0
    if (oxcf->rc_mode == VPX_Q) {
4565
0
      loop = 0;
4566
0
    } else {
4567
0
      if ((cm->frame_type == KEY_FRAME) && rc->this_key_frame_forced &&
4568
0
          (rc->projected_frame_size < rc->max_frame_bandwidth)) {
4569
0
        int last_q = q;
4570
0
        int64_t kf_err;
4571
4572
0
        int64_t high_err_target = cpi->ambient_err;
4573
0
        int64_t low_err_target = cpi->ambient_err >> 1;
4574
4575
0
#if CONFIG_VP9_HIGHBITDEPTH
4576
0
        if (cm->use_highbitdepth) {
4577
0
          kf_err = vpx_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
4578
0
        } else {
4579
0
          kf_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
4580
0
        }
4581
#else
4582
        kf_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
4583
#endif  // CONFIG_VP9_HIGHBITDEPTH
4584
4585
        // Prevent possible divide by zero error below for perfect KF
4586
0
        kf_err += !kf_err;
4587
4588
        // The key frame is not good enough or we can afford
4589
        // to make it better without undue risk of popping.
4590
0
        if ((kf_err > high_err_target &&
4591
0
             rc->projected_frame_size <= frame_over_shoot_limit) ||
4592
0
            (kf_err > low_err_target &&
4593
0
             rc->projected_frame_size <= frame_under_shoot_limit)) {
4594
          // Lower q_high
4595
0
          q_high = q > q_low ? q - 1 : q_low;
4596
4597
          // Adjust Q
4598
0
          q = (int)((q * high_err_target) / kf_err);
4599
0
          q = VPXMIN(q, (q_high + q_low) >> 1);
4600
0
        } else if (kf_err < low_err_target &&
4601
0
                   rc->projected_frame_size >= frame_under_shoot_limit) {
4602
          // The key frame is much better than the previous frame
4603
          // Raise q_low
4604
0
          q_low = q < q_high ? q + 1 : q_high;
4605
4606
          // Adjust Q
4607
0
          q = (int)((q * low_err_target) / kf_err);
4608
0
          q = VPXMIN(q, (q_high + q_low + 1) >> 1);
4609
0
        }
4610
4611
        // Clamp Q to upper and lower limits:
4612
0
        q = clamp(q, q_low, q_high);
4613
4614
0
        loop = q != last_q;
4615
0
      } else if (recode_loop_test(cpi, frame_over_shoot_limit,
4616
0
                                  frame_under_shoot_limit, q,
4617
0
                                  VPXMAX(q_high, top_index), bottom_index)) {
4618
        // Is the projected frame size out of range and are we allowed
4619
        // to attempt to recode.
4620
0
        int last_q = q;
4621
0
        int retries = 0;
4622
0
        int qstep;
4623
4624
0
        if (cpi->resize_pending == 1) {
4625
          // Change in frame size so go back around the recode loop.
4626
0
          cpi->rc.frame_size_selector =
4627
0
              SCALE_STEP1 - cpi->rc.frame_size_selector;
4628
0
          cpi->rc.next_frame_size_selector = cpi->rc.frame_size_selector;
4629
4630
#if CONFIG_INTERNAL_STATS
4631
          ++cpi->tot_recode_hits;
4632
#endif
4633
0
          ++loop_count;
4634
0
          loop = 1;
4635
0
          continue;
4636
0
        }
4637
4638
        // Frame size out of permitted range:
4639
        // Update correction factor & compute new Q to try...
4640
4641
        // Frame is too large
4642
0
        if (rc->projected_frame_size > rc->this_frame_target) {
4643
          // Special case if the projected size is > the max allowed.
4644
0
          if ((q == q_high) &&
4645
0
              ((rc->projected_frame_size >= rc->max_frame_bandwidth) ||
4646
0
               (!rc->is_src_frame_alt_ref &&
4647
0
                (rc->projected_frame_size >=
4648
0
                 big_rate_miss_high_threshold(cpi))))) {
4649
0
            int max_rate = VPXMAX(1, VPXMIN(rc->max_frame_bandwidth,
4650
0
                                            big_rate_miss_high_threshold(cpi)));
4651
0
            double q_val_high;
4652
0
            q_val_high = vp9_convert_qindex_to_q(q_high, cm->bit_depth);
4653
0
            q_val_high =
4654
0
                q_val_high * ((double)rc->projected_frame_size / max_rate);
4655
0
            q_high = vp9_convert_q_to_qindex(q_val_high, cm->bit_depth);
4656
0
            q_high = clamp(q_high, rc->best_quality, rc->worst_quality);
4657
0
          }
4658
4659
          // Raise Qlow as to at least the current value
4660
0
          qstep =
4661
0
              get_qstep_adj(rc->projected_frame_size, rc->this_frame_target);
4662
0
          q_low = VPXMIN(q + qstep, q_high);
4663
4664
0
          if (undershoot_seen || loop_at_this_size > 1) {
4665
            // Update rate_correction_factor unless
4666
0
            vp9_rc_update_rate_correction_factors(cpi);
4667
4668
0
            q = (q_high + q_low + 1) / 2;
4669
0
          } else {
4670
            // Update rate_correction_factor unless
4671
0
            vp9_rc_update_rate_correction_factors(cpi);
4672
4673
0
            q = vp9_rc_regulate_q(cpi, rc->this_frame_target, bottom_index,
4674
0
                                  VPXMAX(q_high, top_index));
4675
4676
0
            while (q < q_low && retries < 10) {
4677
0
              vp9_rc_update_rate_correction_factors(cpi);
4678
0
              q = vp9_rc_regulate_q(cpi, rc->this_frame_target, bottom_index,
4679
0
                                    VPXMAX(q_high, top_index));
4680
0
              retries++;
4681
0
            }
4682
0
          }
4683
4684
0
          overshoot_seen = 1;
4685
0
        } else {
4686
          // Frame is too small
4687
0
          qstep =
4688
0
              get_qstep_adj(rc->this_frame_target, rc->projected_frame_size);
4689
0
          q_high = VPXMAX(q - qstep, q_low);
4690
4691
0
          if (overshoot_seen || loop_at_this_size > 1) {
4692
0
            vp9_rc_update_rate_correction_factors(cpi);
4693
0
            q = (q_high + q_low) / 2;
4694
0
          } else {
4695
0
            vp9_rc_update_rate_correction_factors(cpi);
4696
0
            q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
4697
0
                                  VPXMIN(q_low, bottom_index), top_index);
4698
            // Special case reset for qlow for constrained quality.
4699
            // This should only trigger where there is very substantial
4700
            // undershoot on a frame and the auto cq level is above
4701
            // the user passed in value.
4702
0
            if (oxcf->rc_mode == VPX_CQ && q < q_low) {
4703
0
              q_low = q;
4704
0
            }
4705
4706
0
            while (q > q_high && retries < 10) {
4707
0
              vp9_rc_update_rate_correction_factors(cpi);
4708
0
              q = vp9_rc_regulate_q(cpi, rc->this_frame_target,
4709
0
                                    VPXMIN(q_low, bottom_index), top_index);
4710
0
              retries++;
4711
0
            }
4712
0
          }
4713
0
          undershoot_seen = 1;
4714
0
        }
4715
4716
        // Clamp Q to upper and lower limits:
4717
0
        q = clamp(q, q_low, q_high);
4718
4719
0
        loop = (q != last_q);
4720
0
      } else {
4721
0
        loop = 0;
4722
0
      }
4723
0
    }
4724
4725
    // Special case for overlay frame.
4726
0
    if (rc->is_src_frame_alt_ref &&
4727
0
        rc->projected_frame_size < rc->max_frame_bandwidth)
4728
0
      loop = 0;
4729
4730
0
    if (loop) {
4731
0
      ++loop_count;
4732
0
      ++loop_at_this_size;
4733
4734
#if CONFIG_INTERNAL_STATS
4735
      ++cpi->tot_recode_hits;
4736
#endif
4737
0
    }
4738
4739
0
    if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF)
4740
0
      if (loop) restore_coding_context(cpi);
4741
#if CONFIG_COLLECT_COMPONENT_TIMING
4742
    if (loop) printf("\n Recoding:");
4743
#endif
4744
0
  } while (loop);
4745
4746
0
  rc->max_frame_bandwidth = orig_rc_max_frame_bandwidth;
4747
4748
#ifdef AGGRESSIVE_VBR
4749
  if (two_pass_first_group_inter(cpi)) {
4750
    cpi->twopass.active_worst_quality =
4751
        VPXMIN(q + qrange_adj, oxcf->worst_allowed_q);
4752
  } else if (!frame_is_kf_gf_arf(cpi)) {
4753
#else
4754
0
  if (!frame_is_kf_gf_arf(cpi)) {
4755
0
#endif
4756
    // Have we been forced to adapt Q outside the expected range by an extreme
4757
    // rate miss. If so adjust the active maxQ for the subsequent frames.
4758
0
    if (!rc->is_src_frame_alt_ref && (q > cpi->twopass.active_worst_quality)) {
4759
0
      cpi->twopass.active_worst_quality = q;
4760
0
    } else if (oxcf->vbr_corpus_complexity && q == q_low &&
4761
0
               rc->projected_frame_size < rc->this_frame_target) {
4762
0
      cpi->twopass.active_worst_quality =
4763
0
          VPXMAX(q, cpi->twopass.active_worst_quality - 1);
4764
0
    }
4765
0
  }
4766
4767
0
  if (enable_acl) {
4768
    // Skip recoding, if model diff is below threshold
4769
0
    const int thresh = compute_context_model_thresh(cpi);
4770
0
    const int diff = compute_context_model_diff(cm);
4771
0
    if (diff >= thresh) {
4772
0
      vp9_encode_frame(cpi);
4773
0
    }
4774
0
  }
4775
0
  if (cpi->sf.recode_loop >= ALLOW_RECODE_KFARFGF) {
4776
0
    vpx_clear_system_state();
4777
0
    restore_coding_context(cpi);
4778
0
  }
4779
0
}
4780
#endif  // !CONFIG_REALTIME_ONLY
4781
4782
454k
static void set_ext_overrides(VP9_COMP *cpi) {
4783
  // Overrides the defaults with the externally supplied values with
4784
  // vp9_update_reference() and vp9_update_entropy() calls
4785
  // Note: The overrides are valid only for the next frame passed
4786
  // to encode_frame_to_data_rate() function
4787
454k
  if (cpi->ext_refresh_frame_context_pending) {
4788
0
    cpi->common.refresh_frame_context = cpi->ext_refresh_frame_context;
4789
0
    cpi->ext_refresh_frame_context_pending = 0;
4790
0
  }
4791
454k
  if (cpi->ext_refresh_frame_flags_pending) {
4792
0
    cpi->refresh_last_frame = cpi->ext_refresh_last_frame;
4793
0
    cpi->refresh_golden_frame = cpi->ext_refresh_golden_frame;
4794
0
    cpi->refresh_alt_ref_frame = cpi->ext_refresh_alt_ref_frame;
4795
0
  }
4796
454k
}
4797
4798
YV12_BUFFER_CONFIG *vp9_scale_if_required(
4799
    VP9_COMMON *cm, YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled,
4800
693k
    int use_normative_scaler, INTERP_FILTER filter_type, int phase_scaler) {
4801
693k
  if (cm->mi_cols * MI_SIZE != unscaled->y_width ||
4802
693k
      cm->mi_rows * MI_SIZE != unscaled->y_height) {
4803
0
#if CONFIG_VP9_HIGHBITDEPTH
4804
0
    if (use_normative_scaler && unscaled->y_width <= (scaled->y_width << 1) &&
4805
0
        unscaled->y_height <= (scaled->y_height << 1))
4806
0
      if (cm->bit_depth == VPX_BITS_8)
4807
0
        vp9_scale_and_extend_frame(unscaled, scaled, filter_type, phase_scaler);
4808
0
      else
4809
0
        scale_and_extend_frame(unscaled, scaled, (int)cm->bit_depth,
4810
0
                               filter_type, phase_scaler);
4811
0
    else
4812
0
      vp9_scale_and_extend_frame_nonnormative(unscaled, scaled,
4813
0
                                              (int)cm->bit_depth);
4814
#else
4815
    if (use_normative_scaler && unscaled->y_width <= (scaled->y_width << 1) &&
4816
        unscaled->y_height <= (scaled->y_height << 1))
4817
      vp9_scale_and_extend_frame(unscaled, scaled, filter_type, phase_scaler);
4818
    else
4819
      vp9_scale_and_extend_frame_nonnormative(unscaled, scaled);
4820
#endif  // CONFIG_VP9_HIGHBITDEPTH
4821
0
    return scaled;
4822
693k
  } else {
4823
693k
    return unscaled;
4824
693k
  }
4825
693k
}
4826
4827
454k
static void set_ref_sign_bias(VP9_COMP *cpi) {
4828
454k
  VP9_COMMON *const cm = &cpi->common;
4829
454k
  RefCntBuffer *const ref_buffer = get_ref_cnt_buffer(cm, cm->new_fb_idx);
4830
454k
  const int cur_frame_index = ref_buffer->frame_index;
4831
454k
  MV_REFERENCE_FRAME ref_frame;
4832
4833
1.81M
  for (ref_frame = LAST_FRAME; ref_frame < MAX_REF_FRAMES; ++ref_frame) {
4834
1.36M
    const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
4835
1.36M
    const RefCntBuffer *const ref_cnt_buf =
4836
1.36M
        get_ref_cnt_buffer(&cpi->common, buf_idx);
4837
1.36M
    if (ref_cnt_buf) {
4838
1.33M
      cm->ref_frame_sign_bias[ref_frame] =
4839
1.33M
          cur_frame_index < ref_cnt_buf->frame_index;
4840
1.33M
    }
4841
1.36M
  }
4842
454k
}
4843
4844
0
static int setup_interp_filter_search_mask(VP9_COMP *cpi) {
4845
0
  INTERP_FILTER ifilter;
4846
0
  int ref_total[MAX_REF_FRAMES] = { 0 };
4847
0
  MV_REFERENCE_FRAME ref;
4848
0
  int mask = 0;
4849
0
  if (cpi->common.last_frame_type == KEY_FRAME || cpi->refresh_alt_ref_frame)
4850
0
    return mask;
4851
0
  for (ref = LAST_FRAME; ref <= ALTREF_FRAME; ++ref)
4852
0
    for (ifilter = EIGHTTAP; ifilter <= EIGHTTAP_SHARP; ++ifilter)
4853
0
      ref_total[ref] += cpi->interp_filter_selected[ref][ifilter];
4854
4855
0
  for (ifilter = EIGHTTAP; ifilter <= EIGHTTAP_SHARP; ++ifilter) {
4856
0
    if ((ref_total[LAST_FRAME] &&
4857
0
         cpi->interp_filter_selected[LAST_FRAME][ifilter] == 0) &&
4858
0
        (ref_total[GOLDEN_FRAME] == 0 ||
4859
0
         cpi->interp_filter_selected[GOLDEN_FRAME][ifilter] * 50 <
4860
0
             ref_total[GOLDEN_FRAME]) &&
4861
0
        (ref_total[ALTREF_FRAME] == 0 ||
4862
0
         cpi->interp_filter_selected[ALTREF_FRAME][ifilter] * 50 <
4863
0
             ref_total[ALTREF_FRAME]))
4864
0
      mask |= 1 << ifilter;
4865
0
  }
4866
0
  return mask;
4867
0
}
4868
4869
#ifdef ENABLE_KF_DENOISE
4870
// Baseline kernel weights for denoise
4871
static uint8_t dn_kernel_3[9] = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
4872
static uint8_t dn_kernel_5[25] = { 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 4,
4873
                                   2, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1 };
4874
4875
static INLINE void add_denoise_point(int centre_val, int data_val, int thresh,
4876
                                     uint8_t point_weight, int *sum_val,
4877
                                     int *sum_weight) {
4878
  if (abs(centre_val - data_val) <= thresh) {
4879
    *sum_weight += point_weight;
4880
    *sum_val += (int)data_val * (int)point_weight;
4881
  }
4882
}
4883
4884
static void spatial_denoise_point(uint8_t *src_ptr, const int stride,
4885
                                  const int strength) {
4886
  int sum_weight = 0;
4887
  int sum_val = 0;
4888
  int thresh = strength;
4889
  int kernel_size = 5;
4890
  int half_k_size = 2;
4891
  int i, j;
4892
  int max_diff = 0;
4893
  uint8_t *tmp_ptr;
4894
  uint8_t *kernel_ptr;
4895
4896
  // Find the maximum deviation from the source point in the locale.
4897
  tmp_ptr = src_ptr - (stride * (half_k_size + 1)) - (half_k_size + 1);
4898
  for (i = 0; i < kernel_size + 2; ++i) {
4899
    for (j = 0; j < kernel_size + 2; ++j) {
4900
      max_diff = VPXMAX(max_diff, abs((int)*src_ptr - (int)tmp_ptr[j]));
4901
    }
4902
    tmp_ptr += stride;
4903
  }
4904
4905
  // Select the kernel size.
4906
  if (max_diff > (strength + (strength >> 1))) {
4907
    kernel_size = 3;
4908
    half_k_size = 1;
4909
    thresh = thresh >> 1;
4910
  }
4911
  kernel_ptr = (kernel_size == 3) ? dn_kernel_3 : dn_kernel_5;
4912
4913
  // Apply the kernel
4914
  tmp_ptr = src_ptr - (stride * half_k_size) - half_k_size;
4915
  for (i = 0; i < kernel_size; ++i) {
4916
    for (j = 0; j < kernel_size; ++j) {
4917
      add_denoise_point((int)*src_ptr, (int)tmp_ptr[j], thresh, *kernel_ptr,
4918
                        &sum_val, &sum_weight);
4919
      ++kernel_ptr;
4920
    }
4921
    tmp_ptr += stride;
4922
  }
4923
4924
  // Update the source value with the new filtered value
4925
  *src_ptr = (uint8_t)((sum_val + (sum_weight >> 1)) / sum_weight);
4926
}
4927
4928
#if CONFIG_VP9_HIGHBITDEPTH
4929
static void highbd_spatial_denoise_point(uint16_t *src_ptr, const int stride,
4930
                                         const int strength) {
4931
  int sum_weight = 0;
4932
  int sum_val = 0;
4933
  int thresh = strength;
4934
  int kernel_size = 5;
4935
  int half_k_size = 2;
4936
  int i, j;
4937
  int max_diff = 0;
4938
  uint16_t *tmp_ptr;
4939
  uint8_t *kernel_ptr;
4940
4941
  // Find the maximum deviation from the source point in the locale.
4942
  tmp_ptr = src_ptr - (stride * (half_k_size + 1)) - (half_k_size + 1);
4943
  for (i = 0; i < kernel_size + 2; ++i) {
4944
    for (j = 0; j < kernel_size + 2; ++j) {
4945
      max_diff = VPXMAX(max_diff, abs((int)src_ptr - (int)tmp_ptr[j]));
4946
    }
4947
    tmp_ptr += stride;
4948
  }
4949
4950
  // Select the kernel size.
4951
  if (max_diff > (strength + (strength >> 1))) {
4952
    kernel_size = 3;
4953
    half_k_size = 1;
4954
    thresh = thresh >> 1;
4955
  }
4956
  kernel_ptr = (kernel_size == 3) ? dn_kernel_3 : dn_kernel_5;
4957
4958
  // Apply the kernel
4959
  tmp_ptr = src_ptr - (stride * half_k_size) - half_k_size;
4960
  for (i = 0; i < kernel_size; ++i) {
4961
    for (j = 0; j < kernel_size; ++j) {
4962
      add_denoise_point((int)*src_ptr, (int)tmp_ptr[j], thresh, *kernel_ptr,
4963
                        &sum_val, &sum_weight);
4964
      ++kernel_ptr;
4965
    }
4966
    tmp_ptr += stride;
4967
  }
4968
4969
  // Update the source value with the new filtered value
4970
  *src_ptr = (uint16_t)((sum_val + (sum_weight >> 1)) / sum_weight);
4971
}
4972
#endif  // CONFIG_VP9_HIGHBITDEPTH
4973
4974
// Apply thresholded spatial noise suppression to a given buffer.
4975
static void spatial_denoise_buffer(VP9_COMP *cpi, uint8_t *buffer,
4976
                                   const int stride, const int width,
4977
                                   const int height, const int strength) {
4978
  VP9_COMMON *const cm = &cpi->common;
4979
  uint8_t *src_ptr = buffer;
4980
  int row;
4981
  int col;
4982
4983
  for (row = 0; row < height; ++row) {
4984
    for (col = 0; col < width; ++col) {
4985
#if CONFIG_VP9_HIGHBITDEPTH
4986
      if (cm->use_highbitdepth)
4987
        highbd_spatial_denoise_point(CONVERT_TO_SHORTPTR(&src_ptr[col]), stride,
4988
                                     strength);
4989
      else
4990
        spatial_denoise_point(&src_ptr[col], stride, strength);
4991
#else
4992
      spatial_denoise_point(&src_ptr[col], stride, strength);
4993
#endif  // CONFIG_VP9_HIGHBITDEPTH
4994
    }
4995
    src_ptr += stride;
4996
  }
4997
}
4998
4999
// Apply thresholded spatial noise suppression to source.
5000
static void spatial_denoise_frame(VP9_COMP *cpi) {
5001
  YV12_BUFFER_CONFIG *src = cpi->Source;
5002
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
5003
  TWO_PASS *const twopass = &cpi->twopass;
5004
  VP9_COMMON *const cm = &cpi->common;
5005
5006
  // Base the filter strength on the current active max Q.
5007
  const int q = (int)(vp9_convert_qindex_to_q(twopass->active_worst_quality,
5008
                                              cm->bit_depth));
5009
  int strength = clamp(q >> 4, oxcf->arnr_strength >> 2, oxcf->arnr_strength);
5010
5011
  // Denoise each of Y,U and V buffers.
5012
  spatial_denoise_buffer(cpi, src->y_buffer, src->y_stride, src->y_width,
5013
                         src->y_height, strength);
5014
5015
  strength += (strength >> 1);
5016
  spatial_denoise_buffer(cpi, src->u_buffer, src->uv_stride, src->uv_width,
5017
                         src->uv_height, strength << 1);
5018
5019
  spatial_denoise_buffer(cpi, src->v_buffer, src->uv_stride, src->uv_width,
5020
                         src->uv_height, strength << 1);
5021
}
5022
#endif  // ENABLE_KF_DENOISE
5023
5024
#if !CONFIG_REALTIME_ONLY
5025
static void vp9_try_disable_lookahead_aq(VP9_COMP *cpi, size_t *size,
5026
0
                                         uint8_t *dest, size_t dest_size) {
5027
0
  if (cpi->common.seg.enabled)
5028
0
    if (ALT_REF_AQ_PROTECT_GAIN) {
5029
0
      size_t nsize = *size;
5030
0
      int overhead;
5031
5032
      // TODO(yuryg): optimize this, as
5033
      // we don't really need to repack
5034
5035
0
      save_coding_context(cpi);
5036
0
      vp9_disable_segmentation(&cpi->common.seg);
5037
0
      vp9_pack_bitstream(cpi, dest, dest_size, &nsize);
5038
0
      restore_coding_context(cpi);
5039
5040
0
      overhead = (int)*size - (int)nsize;
5041
5042
0
      if (vp9_alt_ref_aq_disable_if(cpi->alt_ref_aq, overhead, (int)*size))
5043
0
        vp9_encode_frame(cpi);
5044
0
      else
5045
0
        vp9_enable_segmentation(&cpi->common.seg);
5046
0
    }
5047
0
}
5048
#endif
5049
5050
454k
static void set_frame_index(VP9_COMP *cpi, VP9_COMMON *cm) {
5051
454k
  RefCntBuffer *const ref_buffer = get_ref_cnt_buffer(cm, cm->new_fb_idx);
5052
5053
454k
  if (ref_buffer) {
5054
454k
    const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
5055
454k
    ref_buffer->frame_index =
5056
454k
        cm->current_video_frame + gf_group->arf_src_offset[gf_group->index];
5057
454k
    ref_buffer->frame_coding_index = cm->current_frame_coding_index;
5058
454k
  }
5059
454k
}
5060
5061
0
static void init_mb_ssim_rdmult_scaling_buffer(VP9_COMP *cpi) {
5062
0
  VP9_COMMON *cm = &cpi->common;
5063
5064
0
  if (cpi->mi_ssim_rdmult_scaling_factors &&
5065
0
      cpi->mi_ssim_rdmult_scaling_factors_rows >= cm->mb_rows &&
5066
0
      cpi->mi_ssim_rdmult_scaling_factors_cols >= cm->mb_cols)
5067
0
    return;
5068
5069
0
  vpx_free(cpi->mi_ssim_rdmult_scaling_factors);
5070
0
  cpi->mi_ssim_rdmult_scaling_factors = NULL;
5071
5072
0
  CHECK_MEM_ERROR(&cm->error, cpi->mi_ssim_rdmult_scaling_factors,
5073
0
                  vpx_calloc(cm->mb_rows * cm->mb_cols,
5074
0
                             sizeof(*cpi->mi_ssim_rdmult_scaling_factors)));
5075
0
  cpi->mi_ssim_rdmult_scaling_factors_rows = cm->mb_rows;
5076
0
  cpi->mi_ssim_rdmult_scaling_factors_cols = cm->mb_cols;
5077
0
}
5078
5079
0
static void set_mb_ssim_rdmult_scaling(VP9_COMP *cpi) {
5080
0
  VP9_COMMON *cm = &cpi->common;
5081
0
  ThreadData *td = &cpi->td;
5082
0
  MACROBLOCK *x = &td->mb;
5083
0
  MACROBLOCKD *xd = &x->e_mbd;
5084
0
  uint8_t *y_buffer = cpi->Source->y_buffer;
5085
0
  const int y_stride = cpi->Source->y_stride;
5086
0
  const int block_size = BLOCK_16X16;
5087
5088
0
  const int num_8x8_w = num_8x8_blocks_wide_lookup[block_size];
5089
0
  const int num_8x8_h = num_8x8_blocks_high_lookup[block_size];
5090
0
  const int num_cols = (cm->mi_cols + num_8x8_w - 1) / num_8x8_w;
5091
0
  const int num_rows = (cm->mi_rows + num_8x8_h - 1) / num_8x8_h;
5092
0
  double log_sum = 0.0;
5093
0
  int row, col;
5094
5095
  // Loop through each 64x64 block.
5096
0
  for (row = 0; row < num_rows; ++row) {
5097
0
    for (col = 0; col < num_cols; ++col) {
5098
0
      int mi_row, mi_col;
5099
0
      double var = 0.0, num_of_var = 0.0;
5100
0
      const int index = row * num_cols + col;
5101
5102
0
      for (mi_row = row * num_8x8_h;
5103
0
           mi_row < cm->mi_rows && mi_row < (row + 1) * num_8x8_h; ++mi_row) {
5104
0
        for (mi_col = col * num_8x8_w;
5105
0
             mi_col < cm->mi_cols && mi_col < (col + 1) * num_8x8_w; ++mi_col) {
5106
0
          struct buf_2d buf;
5107
0
          const int row_offset_y = mi_row << 3;
5108
0
          const int col_offset_y = mi_col << 3;
5109
5110
0
          buf.buf = y_buffer + row_offset_y * y_stride + col_offset_y;
5111
0
          buf.stride = y_stride;
5112
5113
          // In order to make SSIM_VAR_SCALE in a same scale for both 8 bit
5114
          // and high bit videos, the variance needs to be divided by 2.0 or
5115
          // 64.0 separately.
5116
          // TODO(sdeng): need to tune for 12bit videos.
5117
0
#if CONFIG_VP9_HIGHBITDEPTH
5118
0
          if (cpi->Source->flags & YV12_FLAG_HIGHBITDEPTH)
5119
0
            var += vp9_high_get_sby_variance(cpi, &buf, BLOCK_8X8, xd->bd);
5120
0
          else
5121
0
#endif
5122
0
            var += vp9_get_sby_variance(cpi, &buf, BLOCK_8X8);
5123
5124
0
          num_of_var += 1.0;
5125
0
        }
5126
0
      }
5127
0
      var = var / num_of_var / 64.0;
5128
5129
      // Curve fitting with an exponential model on all 16x16 blocks from the
5130
      // Midres dataset.
5131
0
      var = 67.035434 * (1 - exp(-0.0021489 * var)) + 17.492222;
5132
0
      cpi->mi_ssim_rdmult_scaling_factors[index] = var;
5133
0
      log_sum += log(var);
5134
0
    }
5135
0
  }
5136
0
  log_sum = exp(log_sum / (double)(num_rows * num_cols));
5137
5138
0
  for (row = 0; row < num_rows; ++row) {
5139
0
    for (col = 0; col < num_cols; ++col) {
5140
0
      const int index = row * num_cols + col;
5141
0
      cpi->mi_ssim_rdmult_scaling_factors[index] /= log_sum;
5142
0
    }
5143
0
  }
5144
5145
0
  (void)xd;
5146
0
}
5147
5148
// Process the wiener variance in 16x16 block basis.
5149
0
static int qsort_comp(const void *elem1, const void *elem2) {
5150
0
  int a = *((const tran_low_t *)elem1);
5151
0
  int b = *((const tran_low_t *)elem2);
5152
0
  if (a > b) return 1;
5153
0
  if (a < b) return -1;
5154
0
  return 0;
5155
0
}
5156
5157
0
static void init_mb_wiener_var_buffer(VP9_COMP *cpi) {
5158
0
  VP9_COMMON *cm = &cpi->common;
5159
5160
0
  if (cpi->mb_wiener_variance && cpi->mb_wiener_var_rows >= cm->mb_rows &&
5161
0
      cpi->mb_wiener_var_cols >= cm->mb_cols)
5162
0
    return;
5163
5164
0
  vpx_free(cpi->mb_wiener_variance);
5165
0
  cpi->mb_wiener_variance = NULL;
5166
5167
0
  CHECK_MEM_ERROR(
5168
0
      &cm->error, cpi->mb_wiener_variance,
5169
0
      vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->mb_wiener_variance)));
5170
0
  cpi->mb_wiener_var_rows = cm->mb_rows;
5171
0
  cpi->mb_wiener_var_cols = cm->mb_cols;
5172
0
}
5173
5174
454k
static void init_sb_mul_scale_buffer(VP9_COMP *cpi) {
5175
454k
  VP9_COMMON *cm = &cpi->common;
5176
5177
454k
  if (cpi->mb_wiener_var_rows >= cm->mb_rows &&
5178
443k
      cpi->mb_wiener_var_cols >= cm->mb_cols)
5179
443k
    return;
5180
5181
10.9k
  vpx_free(cpi->sb_mul_scale);
5182
10.9k
  cpi->sb_mul_scale = NULL;
5183
5184
10.9k
  CHECK_MEM_ERROR(
5185
10.9k
      &cm->error, cpi->sb_mul_scale,
5186
10.9k
      vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->sb_mul_scale)));
5187
10.9k
  cpi->mb_wiener_var_rows = cm->mb_rows;
5188
10.9k
  cpi->mb_wiener_var_cols = cm->mb_cols;
5189
10.9k
}
5190
5191
0
static void set_mb_wiener_variance(VP9_COMP *cpi) {
5192
0
  VP9_COMMON *cm = &cpi->common;
5193
0
  uint8_t *buffer = cpi->Source->y_buffer;
5194
0
  int buf_stride = cpi->Source->y_stride;
5195
5196
0
#if CONFIG_VP9_HIGHBITDEPTH
5197
0
  ThreadData *td = &cpi->td;
5198
0
  MACROBLOCK *x = &td->mb;
5199
0
  MACROBLOCKD *xd = &x->e_mbd;
5200
0
  DECLARE_ALIGNED(16, uint16_t, zero_pred16[32 * 32]);
5201
0
  DECLARE_ALIGNED(16, uint8_t, zero_pred8[32 * 32]);
5202
0
  uint8_t *zero_pred;
5203
#else
5204
  DECLARE_ALIGNED(16, uint8_t, zero_pred[32 * 32]);
5205
#endif
5206
5207
0
  DECLARE_ALIGNED(16, int16_t, src_diff[32 * 32]);
5208
0
  DECLARE_ALIGNED(16, tran_low_t, coeff[32 * 32]);
5209
5210
0
  int mb_row, mb_col, count = 0;
5211
  // Hard coded operating block size
5212
0
  const int block_size = 16;
5213
0
  const int coeff_count = block_size * block_size;
5214
0
  const TX_SIZE tx_size = TX_16X16;
5215
5216
0
#if CONFIG_VP9_HIGHBITDEPTH
5217
0
  xd->cur_buf = cpi->Source;
5218
0
  if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
5219
0
    zero_pred = CONVERT_TO_BYTEPTR(zero_pred16);
5220
0
    memset(zero_pred16, 0, sizeof(*zero_pred16) * coeff_count);
5221
0
  } else {
5222
0
    zero_pred = zero_pred8;
5223
0
    memset(zero_pred8, 0, sizeof(*zero_pred8) * coeff_count);
5224
0
  }
5225
#else
5226
  memset(zero_pred, 0, sizeof(*zero_pred) * coeff_count);
5227
#endif
5228
5229
0
  cpi->norm_wiener_variance = 0;
5230
5231
0
  for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
5232
0
    for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
5233
0
      int idx;
5234
0
      int16_t median_val = 0;
5235
0
      uint8_t *mb_buffer =
5236
0
          buffer + mb_row * block_size * buf_stride + mb_col * block_size;
5237
0
      int64_t wiener_variance = 0;
5238
5239
0
#if CONFIG_VP9_HIGHBITDEPTH
5240
0
      if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
5241
0
        vpx_highbd_subtract_block(block_size, block_size, src_diff, block_size,
5242
0
                                  mb_buffer, buf_stride, zero_pred, block_size,
5243
0
                                  xd->bd);
5244
0
        vp9_highbd_wht_fwd_txfm(src_diff, block_size, coeff, tx_size);
5245
0
      } else {
5246
0
        vpx_subtract_block(block_size, block_size, src_diff, block_size,
5247
0
                           mb_buffer, buf_stride, zero_pred, block_size);
5248
0
        vp9_wht_fwd_txfm(src_diff, block_size, coeff, tx_size);
5249
0
      }
5250
#else
5251
      vpx_subtract_block(block_size, block_size, src_diff, block_size,
5252
                         mb_buffer, buf_stride, zero_pred, block_size);
5253
      vp9_wht_fwd_txfm(src_diff, block_size, coeff, tx_size);
5254
#endif  // CONFIG_VP9_HIGHBITDEPTH
5255
5256
0
      coeff[0] = 0;
5257
0
      for (idx = 1; idx < coeff_count; ++idx) coeff[idx] = abs(coeff[idx]);
5258
5259
0
      qsort(coeff, coeff_count, sizeof(*coeff), qsort_comp);
5260
5261
      // Noise level estimation
5262
0
      median_val = coeff[coeff_count / 2];
5263
5264
      // Wiener filter
5265
0
      for (idx = 1; idx < coeff_count; ++idx) {
5266
0
        int64_t sqr_coeff = (int64_t)coeff[idx] * coeff[idx];
5267
0
        int64_t tmp_coeff = (int64_t)coeff[idx];
5268
0
        if (median_val) {
5269
0
          tmp_coeff = (sqr_coeff * coeff[idx]) /
5270
0
                      (sqr_coeff + (int64_t)median_val * median_val);
5271
0
        }
5272
0
        wiener_variance += tmp_coeff * tmp_coeff;
5273
0
      }
5274
0
      cpi->mb_wiener_variance[mb_row * cm->mb_cols + mb_col] =
5275
0
          wiener_variance / coeff_count;
5276
0
      cpi->norm_wiener_variance +=
5277
0
          cpi->mb_wiener_variance[mb_row * cm->mb_cols + mb_col];
5278
0
      ++count;
5279
0
    }
5280
0
  }
5281
5282
0
  if (count) cpi->norm_wiener_variance /= count;
5283
0
  cpi->norm_wiener_variance = VPXMAX(1, cpi->norm_wiener_variance);
5284
0
}
5285
5286
#if !CONFIG_REALTIME_ONLY
5287
static PSNR_STATS compute_psnr_stats(const YV12_BUFFER_CONFIG *source_frame,
5288
                                     const YV12_BUFFER_CONFIG *coded_frame,
5289
                                     uint32_t bit_depth,
5290
                                     uint32_t input_bit_depth,
5291
0
                                     int spatial_layer_id) {
5292
0
  PSNR_STATS psnr;
5293
0
#if CONFIG_VP9_HIGHBITDEPTH
5294
0
  vpx_calc_highbd_psnr(source_frame, coded_frame, &psnr, bit_depth,
5295
0
                       input_bit_depth, spatial_layer_id);
5296
#else   // CONFIG_VP9_HIGHBITDEPTH
5297
  (void)bit_depth;
5298
  (void)input_bit_depth;
5299
  vpx_calc_psnr(source_frame, coded_frame, &psnr, spatial_layer_id);
5300
#endif  // CONFIG_VP9_HIGHBITDEPTH
5301
0
  return psnr;
5302
0
}
5303
5304
static void update_encode_frame_result_basic(
5305
    FRAME_UPDATE_TYPE update_type, int show_idx, int quantize_index,
5306
0
    ENCODE_FRAME_RESULT *encode_frame_result) {
5307
0
  encode_frame_result->show_idx = show_idx;
5308
0
  encode_frame_result->update_type = update_type;
5309
0
  encode_frame_result->quantize_index = quantize_index;
5310
0
}
5311
#endif  // !CONFIG_REALTIME_ONLY
5312
5313
static void encode_frame_to_data_rate(
5314
    VP9_COMP *cpi, size_t *size, uint8_t *dest, size_t dest_size,
5315
454k
    unsigned int *frame_flags, ENCODE_FRAME_RESULT *encode_frame_result) {
5316
454k
  VP9_COMMON *const cm = &cpi->common;
5317
454k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
5318
454k
  struct segmentation *const seg = &cm->seg;
5319
454k
  TX_SIZE t;
5320
5321
454k
  if (vp9_svc_check_skip_enhancement_layer(cpi)) return;
5322
5323
454k
  set_ext_overrides(cpi);
5324
454k
  vpx_clear_system_state();
5325
5326
#ifdef ENABLE_KF_DENOISE
5327
  // Spatial denoise of key frame.
5328
  if (is_spatial_denoise_enabled(cpi)) spatial_denoise_frame(cpi);
5329
#endif
5330
5331
454k
  if (cm->show_existing_frame == 0) {
5332
    // Update frame index
5333
454k
    set_frame_index(cpi, cm);
5334
5335
    // Set the arf sign bias for this frame.
5336
454k
    set_ref_sign_bias(cpi);
5337
454k
  }
5338
5339
  // On the very first frame set the deadline_mode_previous_frame to
5340
  // the current mode.
5341
454k
  if (cpi->common.current_video_frame == 0)
5342
10.9k
    cpi->deadline_mode_previous_frame = cpi->oxcf.mode;
5343
5344
  // Set default state for segment based loop filter update flags.
5345
454k
  cm->lf.mode_ref_delta_update = 0;
5346
5347
454k
  if (cpi->oxcf.pass == 2 && cpi->sf.adaptive_interp_filter_search)
5348
0
    cpi->sf.interp_filter_search_mask = setup_interp_filter_search_mask(cpi);
5349
5350
  // Set various flags etc to special state if it is a key frame.
5351
454k
  if (frame_is_intra_only(cm)) {
5352
    // Reset the loop filter deltas and segmentation map.
5353
27.9k
    vp9_reset_segment_features(&cm->seg);
5354
5355
    // If segmentation is enabled force a map update for key frames.
5356
27.9k
    if (seg->enabled) {
5357
0
      seg->update_map = 1;
5358
0
      seg->update_data = 1;
5359
0
    }
5360
5361
    // The alternate reference frame cannot be active for a key frame.
5362
27.9k
    cpi->rc.source_alt_ref_active = 0;
5363
5364
27.9k
    cm->error_resilient_mode = oxcf->error_resilient_mode;
5365
27.9k
    cm->frame_parallel_decoding_mode = oxcf->frame_parallel_decoding_mode;
5366
5367
    // By default, encoder assumes decoder can use prev_mi.
5368
27.9k
    if (cm->error_resilient_mode) {
5369
27.9k
      cm->frame_parallel_decoding_mode = 1;
5370
27.9k
      cm->reset_frame_context = 0;
5371
27.9k
      cm->refresh_frame_context = 0;
5372
27.9k
    } else if (cm->intra_only) {
5373
      // Only reset the current context.
5374
0
      cm->reset_frame_context = 2;
5375
0
    }
5376
27.9k
  }
5377
5378
454k
  if (oxcf->tuning == VP8_TUNE_SSIM) {
5379
0
    init_mb_ssim_rdmult_scaling_buffer(cpi);
5380
0
    set_mb_ssim_rdmult_scaling(cpi);
5381
0
  }
5382
5383
454k
  if (oxcf->aq_mode == PERCEPTUAL_AQ) {
5384
0
    init_mb_wiener_var_buffer(cpi);
5385
0
    set_mb_wiener_variance(cpi);
5386
0
  }
5387
5388
454k
  init_sb_mul_scale_buffer(cpi);
5389
5390
454k
  vpx_clear_system_state();
5391
5392
#if CONFIG_INTERNAL_STATS
5393
  memset(cpi->mode_chosen_counts, 0,
5394
         MAX_MODES * sizeof(*cpi->mode_chosen_counts));
5395
#endif
5396
  // Backup to ensure consistency between recodes
5397
454k
  save_encode_params(cpi);
5398
454k
  if (cpi->ext_ratectrl.ready &&
5399
0
      (cpi->ext_ratectrl.funcs.rc_type & VPX_RC_RDMULT) != 0 &&
5400
0
      cpi->ext_ratectrl.funcs.get_frame_rdmult != NULL) {
5401
0
    vpx_codec_err_t codec_status;
5402
0
    const GF_GROUP *gf_group = &cpi->twopass.gf_group;
5403
0
    FRAME_UPDATE_TYPE update_type = gf_group->update_type[gf_group->index];
5404
0
    const int ref_frame_flags = get_ref_frame_flags(cpi);
5405
0
    RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES];
5406
0
    const RefCntBuffer *curr_frame_buf = get_ref_cnt_buffer(cm, cm->new_fb_idx);
5407
    // index 0 of a gf group is always KEY/OVERLAY/GOLDEN.
5408
    // index 1 refers to the first encoding frame in a gf group.
5409
    // Therefore if it is ARF_UPDATE, it means this gf group uses alt ref.
5410
    // See function define_gf_group_structure().
5411
0
    const int use_alt_ref = gf_group->update_type[1] == ARF_UPDATE;
5412
0
    int ext_rdmult = VPX_DEFAULT_RDMULT;
5413
0
    get_ref_frame_bufs(cpi, ref_frame_bufs);
5414
0
    codec_status = vp9_extrc_get_frame_rdmult(
5415
0
        &cpi->ext_ratectrl, curr_frame_buf->frame_index,
5416
0
        cm->current_frame_coding_index, gf_group->index, update_type,
5417
0
        gf_group->gf_group_size, use_alt_ref, ref_frame_bufs, ref_frame_flags,
5418
0
        &ext_rdmult);
5419
0
    if (codec_status != VPX_CODEC_OK) {
5420
0
      vpx_internal_error(&cm->error, codec_status,
5421
0
                         "vp9_extrc_get_frame_rdmult() failed");
5422
0
    }
5423
0
    cpi->ext_ratectrl.ext_rdmult = ext_rdmult;
5424
0
  }
5425
5426
454k
  if (cpi->sf.recode_loop == DISALLOW_RECODE) {
5427
454k
    if (!encode_without_recode_loop(cpi, size, dest, dest_size)) return;
5428
454k
  } else {
5429
0
#if !CONFIG_REALTIME_ONLY
5430
#if CONFIG_COLLECT_COMPONENT_TIMING
5431
    start_timing(cpi, encode_with_recode_loop_time);
5432
#endif
5433
0
    encode_with_recode_loop(cpi, size, dest, dest_size);
5434
#if CONFIG_COLLECT_COMPONENT_TIMING
5435
    end_timing(cpi, encode_with_recode_loop_time);
5436
#endif
5437
0
#endif  // !CONFIG_REALTIME_ONLY
5438
0
  }
5439
5440
  // TODO(jingning): When using show existing frame mode, we assume that the
5441
  // current ARF will be directly used as the final reconstructed frame. This is
5442
  // an encoder control scheme. One could in principle explore other
5443
  // possibilities to arrange the reference frame buffer and their coding order.
5444
454k
  if (cm->show_existing_frame) {
5445
0
    ref_cnt_fb(cm->buffer_pool->frame_bufs, &cm->new_fb_idx,
5446
0
               cm->ref_frame_map[cpi->alt_fb_idx]);
5447
0
  }
5448
5449
454k
#if !CONFIG_REALTIME_ONLY
5450
  // Disable segmentation if it decrease rate/distortion ratio
5451
454k
  if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ)
5452
0
    vp9_try_disable_lookahead_aq(cpi, size, dest, dest_size);
5453
454k
#endif
5454
5455
#if CONFIG_VP9_TEMPORAL_DENOISING
5456
#ifdef OUTPUT_YUV_DENOISED
5457
  if (oxcf->noise_sensitivity > 0 && denoise_svc(cpi)) {
5458
    vpx_write_yuv_frame(yuv_denoised_file,
5459
                        &cpi->denoiser.running_avg_y[INTRA_FRAME]);
5460
  }
5461
#endif
5462
#endif
5463
#ifdef OUTPUT_YUV_SKINMAP
5464
  if (cpi->common.current_video_frame > 1) {
5465
    vp9_output_skin_map(cpi, yuv_skinmap_file);
5466
  }
5467
#endif
5468
5469
  // Special case code to reduce pulsing when key frames are forced at a
5470
  // fixed interval. Note the reconstruction error if it is the frame before
5471
  // the force key frame
5472
454k
  if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
5473
0
#if CONFIG_VP9_HIGHBITDEPTH
5474
0
    if (cm->use_highbitdepth) {
5475
0
      cpi->ambient_err =
5476
0
          vpx_highbd_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
5477
0
    } else {
5478
0
      cpi->ambient_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
5479
0
    }
5480
#else
5481
    cpi->ambient_err = vpx_get_y_sse(cpi->Source, get_frame_new_buffer(cm));
5482
#endif  // CONFIG_VP9_HIGHBITDEPTH
5483
0
  }
5484
5485
  // If the encoder forced a KEY_FRAME decision
5486
454k
  if (cm->frame_type == KEY_FRAME) cpi->refresh_last_frame = 1;
5487
5488
454k
  cm->frame_to_show = get_frame_new_buffer(cm);
5489
454k
  cm->frame_to_show->color_space = cm->color_space;
5490
454k
  cm->frame_to_show->color_range = cm->color_range;
5491
454k
  cm->frame_to_show->render_width = cm->render_width;
5492
454k
  cm->frame_to_show->render_height = cm->render_height;
5493
5494
#if CONFIG_COLLECT_COMPONENT_TIMING
5495
  start_timing(cpi, loopfilter_frame_time);
5496
#endif
5497
  // Pick the loop filter level for the frame.
5498
454k
  loopfilter_frame(cpi, cm);
5499
#if CONFIG_COLLECT_COMPONENT_TIMING
5500
  end_timing(cpi, loopfilter_frame_time);
5501
#endif
5502
5503
454k
  if (cpi->rc.use_post_encode_drop) save_coding_context(cpi);
5504
5505
#if CONFIG_COLLECT_COMPONENT_TIMING
5506
  start_timing(cpi, vp9_pack_bitstream_time);
5507
#endif
5508
  // build the bitstream
5509
454k
  vp9_pack_bitstream(cpi, dest, dest_size, size);
5510
#if CONFIG_COLLECT_COMPONENT_TIMING
5511
  end_timing(cpi, vp9_pack_bitstream_time);
5512
#endif
5513
5514
454k
  if (cpi->ext_ratectrl.ready &&
5515
0
      cpi->ext_ratectrl.funcs.update_encodeframe_result != NULL) {
5516
0
    vpx_codec_err_t codec_status = vp9_extrc_update_encodeframe_result(
5517
0
        &cpi->ext_ratectrl, (*size) << 3, cm->base_qindex);
5518
0
    if (codec_status != VPX_CODEC_OK) {
5519
0
      vpx_internal_error(&cm->error, codec_status,
5520
0
                         "vp9_extrc_update_encodeframe_result() failed");
5521
0
    }
5522
0
  }
5523
#if CONFIG_REALTIME_ONLY
5524
  (void)encode_frame_result;
5525
  assert(encode_frame_result == NULL);
5526
#else   // CONFIG_REALTIME_ONLY
5527
454k
  if (encode_frame_result != NULL) {
5528
0
    const RefCntBuffer *coded_frame_buf =
5529
0
        get_ref_cnt_buffer(cm, cm->new_fb_idx);
5530
0
    RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES];
5531
0
    FRAME_UPDATE_TYPE update_type =
5532
0
        cpi->twopass.gf_group.update_type[cpi->twopass.gf_group.index];
5533
0
    int quantize_index = vp9_get_quantizer(cpi);
5534
0
    get_ref_frame_bufs(cpi, ref_frame_bufs);
5535
    // update_encode_frame_result() depends on twopass.gf_group.index and
5536
    // cm->new_fb_idx, cpi->Source, cpi->lst_fb_idx, cpi->gld_fb_idx and
5537
    // cpi->alt_fb_idx are updated for current frame and have
5538
    // not been updated for the next frame yet.
5539
    // The update locations are as follows.
5540
    // 1) twopass.gf_group.index is initialized at define_gf_group by vp9_zero()
5541
    // for the first frame in the gf_group and is updated for the next frame at
5542
    // vp9_twopass_postencode_update().
5543
    // 2) cpi->Source is updated at the beginning of vp9_get_compressed_data()
5544
    // 3) cm->new_fb_idx is updated at the beginning of
5545
    // vp9_get_compressed_data() by get_free_fb(cm).
5546
    // 4) cpi->lst_fb_idx/gld_fb_idx/alt_fb_idx will be updated for the next
5547
    // frame at vp9_update_reference_frames().
5548
    // This function needs to be called before vp9_update_reference_frames().
5549
    // TODO(angiebird): Improve the codebase to make the update of frame
5550
    // dependent variables more robust.
5551
5552
0
    update_encode_frame_result_basic(update_type, coded_frame_buf->frame_index,
5553
0
                                     quantize_index, encode_frame_result);
5554
0
    if (cpi->ext_ratectrl.ready && cpi->ext_ratectrl.log_file) {
5555
0
      PSNR_STATS psnr = compute_psnr_stats(
5556
0
          cpi->Source, &coded_frame_buf->buf, cm->bit_depth,
5557
0
          cpi->oxcf.input_bit_depth, cpi->svc.spatial_layer_id);
5558
0
      fprintf(cpi->ext_ratectrl.log_file,
5559
0
              "ENCODE_FRAME_RESULT gop_index %d psnr %f bits %zu\n",
5560
0
              cpi->twopass.gf_group.index, psnr.psnr[0], (*size) << 3);
5561
0
    }
5562
0
  }
5563
454k
#endif  // CONFIG_REALTIME_ONLY
5564
5565
454k
  if (cpi->rc.use_post_encode_drop && cm->base_qindex < cpi->rc.worst_quality &&
5566
0
      cpi->svc.spatial_layer_id == 0 && post_encode_drop_cbr(cpi, size)) {
5567
0
    restore_coding_context(cpi);
5568
0
    return;
5569
0
  }
5570
5571
454k
  cpi->last_frame_dropped = 0;
5572
454k
  cpi->svc.last_layer_dropped[cpi->svc.spatial_layer_id] = 0;
5573
454k
  if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
5574
453k
    cpi->svc.num_encoded_top_layer++;
5575
5576
  // Keep track of the frame buffer index updated/refreshed for the
5577
  // current encoded TL0 superframe.
5578
454k
  if (cpi->svc.temporal_layer_id == 0) {
5579
453k
    if (cpi->refresh_last_frame)
5580
432k
      cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->lst_fb_idx;
5581
21.0k
    else if (cpi->refresh_golden_frame)
5582
10.3k
      cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->gld_fb_idx;
5583
10.6k
    else if (cpi->refresh_alt_ref_frame)
5584
10.6k
      cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->alt_fb_idx;
5585
453k
  }
5586
5587
454k
  if (cm->seg.update_map) update_reference_segmentation_map(cpi);
5588
5589
454k
  if (frame_is_intra_only(cm) == 0) {
5590
425k
    release_scaled_references(cpi);
5591
425k
  }
5592
454k
  vp9_update_reference_frames(cpi);
5593
5594
454k
  if (!cm->show_existing_frame) {
5595
2.26M
    for (t = TX_4X4; t <= TX_32X32; ++t) {
5596
1.81M
      full_to_model_counts(cpi->td.counts->coef[t],
5597
1.81M
                           cpi->td.rd_counts.coef_counts[t]);
5598
1.81M
    }
5599
5600
453k
    if (!cm->error_resilient_mode && !cm->frame_parallel_decoding_mode) {
5601
0
      if (!frame_is_intra_only(cm)) {
5602
0
        vp9_adapt_mode_probs(cm);
5603
0
        vp9_adapt_mv_probs(cm, cm->allow_high_precision_mv);
5604
0
      }
5605
0
      vp9_adapt_coef_probs(cm);
5606
0
    }
5607
453k
  }
5608
5609
454k
  cpi->ext_refresh_frame_flags_pending = 0;
5610
5611
454k
  if (cpi->refresh_golden_frame == 1)
5612
64.5k
    cpi->frame_flags |= FRAMEFLAGS_GOLDEN;
5613
389k
  else
5614
389k
    cpi->frame_flags &= ~FRAMEFLAGS_GOLDEN;
5615
5616
454k
  if (cpi->refresh_alt_ref_frame == 1)
5617
38.4k
    cpi->frame_flags |= FRAMEFLAGS_ALTREF;
5618
415k
  else
5619
415k
    cpi->frame_flags &= ~FRAMEFLAGS_ALTREF;
5620
5621
454k
  cpi->ref_frame_flags = get_ref_frame_flags(cpi);
5622
5623
454k
  cm->last_frame_type = cm->frame_type;
5624
5625
454k
  vp9_rc_postencode_update(cpi, *size);
5626
5627
454k
  if (cpi->compute_frame_low_motion_onepass && oxcf->pass == 0 &&
5628
453k
      !frame_is_intra_only(cm) &&
5629
425k
      (!cpi->use_svc ||
5630
0
       (cpi->use_svc &&
5631
0
        !cpi->svc.layer_context[cpi->svc.temporal_layer_id].is_key_frame &&
5632
425k
        cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1))) {
5633
425k
    vp9_compute_frame_low_motion(cpi);
5634
425k
  }
5635
5636
454k
  *size = VPXMAX(1, *size);
5637
5638
#if 0
5639
  output_frame_level_debug_stats(cpi);
5640
#endif
5641
5642
454k
  if (cm->frame_type == KEY_FRAME) {
5643
    // Tell the caller that the frame was coded as a key frame
5644
27.7k
    *frame_flags = cpi->frame_flags | FRAMEFLAGS_KEY;
5645
426k
  } else {
5646
426k
    *frame_flags = cpi->frame_flags & ~FRAMEFLAGS_KEY;
5647
426k
  }
5648
5649
  // Clear the one shot update flags for segmentation map and mode/ref loop
5650
  // filter deltas.
5651
454k
  cm->seg.update_map = 0;
5652
454k
  cm->seg.update_data = 0;
5653
454k
  cm->lf.mode_ref_delta_update = 0;
5654
5655
  // keep track of the last coded dimensions
5656
454k
  cm->last_width = cm->width;
5657
454k
  cm->last_height = cm->height;
5658
5659
  // reset to normal state now that we are done.
5660
454k
  if (!cm->show_existing_frame) {
5661
453k
    cm->last_show_frame = cm->show_frame;
5662
453k
    cm->prev_frame = cm->cur_frame;
5663
453k
  }
5664
5665
454k
  if (cm->show_frame) {
5666
443k
    vp9_swap_mi_and_prev_mi(cm);
5667
443k
    if (cpi->use_svc) vp9_inc_frame_in_layer(cpi);
5668
443k
  }
5669
454k
  update_frame_indexes(cm, cm->show_frame);
5670
5671
454k
  if (cpi->use_svc) {
5672
0
    cpi->svc
5673
0
        .layer_context[cpi->svc.spatial_layer_id *
5674
0
                           cpi->svc.number_temporal_layers +
5675
0
                       cpi->svc.temporal_layer_id]
5676
0
        .last_frame_type = cm->frame_type;
5677
    // Reset layer_sync back to 0 for next frame.
5678
0
    cpi->svc.spatial_layer_sync[cpi->svc.spatial_layer_id] = 0;
5679
0
  }
5680
5681
454k
  cpi->force_update_segmentation = 0;
5682
5683
454k
#if !CONFIG_REALTIME_ONLY
5684
454k
  if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ)
5685
0
    vp9_alt_ref_aq_unset_all(cpi->alt_ref_aq, cpi);
5686
454k
#endif
5687
5688
454k
  cpi->svc.previous_frame_is_intra_only = cm->intra_only;
5689
454k
  cpi->svc.set_intra_only_frame = 0;
5690
454k
}
5691
5692
static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
5693
0
                      size_t dest_size, unsigned int *frame_flags) {
5694
0
  vp9_rc_get_svc_params(cpi);
5695
0
  encode_frame_to_data_rate(cpi, size, dest, dest_size, frame_flags,
5696
0
                            /*encode_frame_result = */ NULL);
5697
0
}
5698
5699
static void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
5700
454k
                        size_t dest_size, unsigned int *frame_flags) {
5701
454k
  if (cpi->oxcf.rc_mode == VPX_CBR) {
5702
0
    vp9_rc_get_one_pass_cbr_params(cpi);
5703
454k
  } else {
5704
454k
    vp9_rc_get_one_pass_vbr_params(cpi);
5705
454k
  }
5706
454k
  encode_frame_to_data_rate(cpi, size, dest, dest_size, frame_flags,
5707
454k
                            /*encode_frame_result = */ NULL);
5708
454k
}
5709
5710
#if !CONFIG_REALTIME_ONLY
5711
static void Pass2Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
5712
                        size_t dest_size, unsigned int *frame_flags,
5713
0
                        ENCODE_FRAME_RESULT *encode_frame_result) {
5714
0
  cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
5715
#if CONFIG_MISMATCH_DEBUG
5716
  mismatch_move_frame_idx_w();
5717
#endif
5718
0
  encode_frame_to_data_rate(cpi, size, dest, dest_size, frame_flags,
5719
0
                            encode_frame_result);
5720
0
}
5721
#endif  // !CONFIG_REALTIME_ONLY
5722
5723
int vp9_receive_raw_frame(VP9_COMP *cpi, vpx_enc_frame_flags_t frame_flags,
5724
                          YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
5725
446k
                          int64_t end_time) {
5726
446k
  VP9_COMMON *const cm = &cpi->common;
5727
#if CONFIG_INTERNAL_STATS
5728
  struct vpx_usec_timer timer;
5729
#endif
5730
446k
  int res = 0;
5731
446k
  const int subsampling_x = sd->subsampling_x;
5732
446k
  const int subsampling_y = sd->subsampling_y;
5733
446k
#if CONFIG_VP9_HIGHBITDEPTH
5734
446k
  const int use_highbitdepth = (sd->flags & YV12_FLAG_HIGHBITDEPTH) != 0;
5735
#else
5736
  const int use_highbitdepth = 0;
5737
#endif
5738
5739
446k
  if ((cm->profile == PROFILE_0 || cm->profile == PROFILE_2) &&
5740
446k
      (subsampling_x != 1 || subsampling_y != 1)) {
5741
0
    vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
5742
0
                       "Non-4:2:0 color format requires profile 1 or 3");
5743
0
    return -1;
5744
0
  }
5745
446k
  if ((cm->profile == PROFILE_1 || cm->profile == PROFILE_3) &&
5746
0
      (subsampling_x == 1 && subsampling_y == 1)) {
5747
0
    vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
5748
0
                       "4:2:0 color format requires profile 0 or 2");
5749
0
    return -1;
5750
0
  }
5751
446k
  if (cm->color_space == VPX_CS_SRGB) {
5752
0
    if (cm->profile == PROFILE_0 || cm->profile == PROFILE_2) {
5753
0
      vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
5754
0
                         "SRGB color space requires profile 1 or 3");
5755
0
      return -1;
5756
0
    }
5757
0
    if (subsampling_x != 0 || subsampling_y != 0) {
5758
0
      vpx_internal_error(&cm->error, VPX_CODEC_INVALID_PARAM,
5759
0
                         "SRGB color space requires 4:4:4");
5760
0
      return -1;
5761
0
    }
5762
0
  }
5763
5764
446k
  update_initial_width(cpi, use_highbitdepth, subsampling_x, subsampling_y);
5765
#if CONFIG_VP9_TEMPORAL_DENOISING
5766
  setup_denoiser_buffer(cpi);
5767
#endif
5768
5769
446k
  alloc_raw_frame_buffers(cpi);
5770
5771
#if CONFIG_INTERNAL_STATS
5772
  vpx_usec_timer_start(&timer);
5773
#endif
5774
5775
446k
  if (vp9_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
5776
446k
                         use_highbitdepth, frame_flags))
5777
672
    res = -1;
5778
#if CONFIG_INTERNAL_STATS
5779
  vpx_usec_timer_mark(&timer);
5780
  cpi->time_receive_data += vpx_usec_timer_elapsed(&timer);
5781
#endif
5782
5783
446k
  return res;
5784
446k
}
5785
5786
453k
static int frame_is_reference(const VP9_COMP *cpi) {
5787
453k
  const VP9_COMMON *cm = &cpi->common;
5788
5789
453k
  return cm->frame_type == KEY_FRAME || cpi->refresh_last_frame ||
5790
21.0k
         cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame ||
5791
51
         cm->refresh_frame_context || cm->lf.mode_ref_delta_update ||
5792
0
         cm->seg.update_map || cm->seg.update_data;
5793
453k
}
5794
5795
static void adjust_frame_rate(VP9_COMP *cpi,
5796
443k
                              const struct lookahead_entry *source) {
5797
443k
  int64_t this_duration;
5798
443k
  int step = 0;
5799
5800
443k
  if (source->ts_start == cpi->first_time_stamp_ever) {
5801
10.9k
    this_duration = source->ts_end - source->ts_start;
5802
10.9k
    step = 1;
5803
432k
  } else {
5804
432k
    int64_t last_duration =
5805
432k
        cpi->last_end_time_stamp_seen - cpi->last_time_stamp_seen;
5806
5807
432k
    this_duration = source->ts_end - cpi->last_end_time_stamp_seen;
5808
5809
    // do a step update if the duration changes by 10%
5810
432k
    if (last_duration)
5811
432k
      step = (int)((this_duration - last_duration) * 10 / last_duration);
5812
432k
  }
5813
5814
443k
  if (this_duration) {
5815
443k
    if (step) {
5816
10.9k
      vp9_new_framerate(cpi, 10000000.0 / this_duration);
5817
432k
    } else {
5818
      // Average this frame's rate into the last second's average
5819
      // frame rate. If we haven't seen 1 second yet, then average
5820
      // over the whole interval seen.
5821
432k
      const double interval = VPXMIN(
5822
432k
          (double)(source->ts_end - cpi->first_time_stamp_ever), 10000000.0);
5823
432k
      double avg_duration = 10000000.0 / cpi->framerate;
5824
432k
      avg_duration *= (interval - avg_duration + this_duration);
5825
432k
      avg_duration /= interval;
5826
5827
432k
      vp9_new_framerate(cpi, 10000000.0 / avg_duration);
5828
432k
    }
5829
443k
  }
5830
443k
  cpi->last_time_stamp_seen = source->ts_start;
5831
443k
  cpi->last_end_time_stamp_seen = source->ts_end;
5832
443k
}
5833
5834
// Returns 0 if this is not an alt ref else the offset of the source frame
5835
// used as the arf midpoint.
5836
918k
static int get_arf_src_index(VP9_COMP *cpi) {
5837
918k
  RATE_CONTROL *const rc = &cpi->rc;
5838
918k
  int arf_src_index = 0;
5839
918k
  if (is_altref_enabled(cpi)) {
5840
918k
    if (cpi->oxcf.pass == 2) {
5841
0
      const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
5842
0
      if (gf_group->update_type[gf_group->index] == ARF_UPDATE) {
5843
0
        arf_src_index = gf_group->arf_src_offset[gf_group->index];
5844
0
      }
5845
918k
    } else if (rc->source_alt_ref_pending) {
5846
64.4k
      arf_src_index = rc->frames_till_gf_update_due;
5847
64.4k
    }
5848
918k
  }
5849
918k
  return arf_src_index;
5850
918k
}
5851
5852
static void check_src_altref(VP9_COMP *cpi,
5853
443k
                             const struct lookahead_entry *source) {
5854
443k
  RATE_CONTROL *const rc = &cpi->rc;
5855
5856
443k
  if (cpi->oxcf.pass == 2) {
5857
0
    const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
5858
0
    rc->is_src_frame_alt_ref =
5859
0
        (gf_group->update_type[gf_group->index] == OVERLAY_UPDATE);
5860
443k
  } else {
5861
443k
    rc->is_src_frame_alt_ref =
5862
443k
        cpi->alt_ref_source && (source == cpi->alt_ref_source);
5863
443k
  }
5864
5865
443k
  if (rc->is_src_frame_alt_ref) {
5866
    // Current frame is an ARF overlay frame.
5867
10.5k
    cpi->alt_ref_source = NULL;
5868
5869
    // Don't refresh the last buffer for an ARF overlay frame. It will
5870
    // become the GF so preserve last as an alternative prediction option.
5871
10.5k
    cpi->refresh_last_frame = 0;
5872
10.5k
  }
5873
443k
}
5874
5875
#if CONFIG_INTERNAL_STATS
5876
static void adjust_image_stat(double y, double u, double v, double all,
5877
                              ImageStat *s) {
5878
  s->stat[Y] += y;
5879
  s->stat[U] += u;
5880
  s->stat[V] += v;
5881
  s->stat[ALL] += all;
5882
  s->worst = VPXMIN(s->worst, all);
5883
}
5884
#endif  // CONFIG_INTERNAL_STATS
5885
5886
// Adjust the maximum allowable frame size for the target level.
5887
0
static void level_rc_framerate(VP9_COMP *cpi, int arf_src_index) {
5888
0
  RATE_CONTROL *const rc = &cpi->rc;
5889
0
  LevelConstraint *const ls = &cpi->level_constraint;
5890
0
  VP9_COMMON *const cm = &cpi->common;
5891
0
  const double max_cpb_size = ls->max_cpb_size;
5892
0
  vpx_clear_system_state();
5893
0
  rc->max_frame_bandwidth = VPXMIN(rc->max_frame_bandwidth, ls->max_frame_size);
5894
0
  if (frame_is_intra_only(cm)) {
5895
0
    rc->max_frame_bandwidth =
5896
0
        VPXMIN(rc->max_frame_bandwidth, (int)(max_cpb_size * 0.5));
5897
0
  } else if (arf_src_index > 0) {
5898
0
    rc->max_frame_bandwidth =
5899
0
        VPXMIN(rc->max_frame_bandwidth, (int)(max_cpb_size * 0.4));
5900
0
  } else {
5901
0
    rc->max_frame_bandwidth =
5902
0
        VPXMIN(rc->max_frame_bandwidth, (int)(max_cpb_size * 0.2));
5903
0
  }
5904
0
}
5905
5906
0
static void update_level_info(VP9_COMP *cpi, size_t size, int arf_src_index) {
5907
0
  VP9_COMMON *const cm = &cpi->common;
5908
0
  Vp9LevelInfo *const level_info = &cpi->level_info;
5909
0
  Vp9LevelSpec *const level_spec = &level_info->level_spec;
5910
0
  Vp9LevelStats *const level_stats = &level_info->level_stats;
5911
0
  int i, idx;
5912
0
  uint64_t luma_samples, dur_end;
5913
0
  const uint32_t luma_pic_size = cm->width * cm->height;
5914
0
  const uint32_t luma_pic_breadth = VPXMAX(cm->width, cm->height);
5915
0
  LevelConstraint *const level_constraint = &cpi->level_constraint;
5916
0
  const int8_t level_index = level_constraint->level_index;
5917
0
  double cpb_data_size;
5918
5919
0
  vpx_clear_system_state();
5920
5921
  // update level_stats
5922
0
  level_stats->total_compressed_size += size;
5923
0
  if (cm->show_frame) {
5924
0
    level_stats->total_uncompressed_size +=
5925
0
        luma_pic_size +
5926
0
        2 * (luma_pic_size >> (cm->subsampling_x + cm->subsampling_y));
5927
0
    level_stats->time_encoded =
5928
0
        (cpi->last_end_time_stamp_seen - cpi->first_time_stamp_ever) /
5929
0
        (double)TICKS_PER_SEC;
5930
0
  }
5931
5932
0
  if (arf_src_index > 0) {
5933
0
    if (!level_stats->seen_first_altref) {
5934
0
      level_stats->seen_first_altref = 1;
5935
0
    } else if (level_stats->frames_since_last_altref <
5936
0
               level_spec->min_altref_distance) {
5937
0
      level_spec->min_altref_distance = level_stats->frames_since_last_altref;
5938
0
    }
5939
0
    level_stats->frames_since_last_altref = 0;
5940
0
  } else {
5941
0
    ++level_stats->frames_since_last_altref;
5942
0
  }
5943
5944
0
  if (level_stats->frame_window_buffer.len < FRAME_WINDOW_SIZE - 1) {
5945
0
    idx = (level_stats->frame_window_buffer.start +
5946
0
           level_stats->frame_window_buffer.len++) %
5947
0
          FRAME_WINDOW_SIZE;
5948
0
  } else {
5949
0
    idx = level_stats->frame_window_buffer.start;
5950
0
    level_stats->frame_window_buffer.start = (idx + 1) % FRAME_WINDOW_SIZE;
5951
0
  }
5952
0
  level_stats->frame_window_buffer.buf[idx].ts = cpi->last_time_stamp_seen;
5953
0
  level_stats->frame_window_buffer.buf[idx].size = (uint32_t)size;
5954
0
  level_stats->frame_window_buffer.buf[idx].luma_samples = luma_pic_size;
5955
5956
0
  if (cm->frame_type == KEY_FRAME) {
5957
0
    level_stats->ref_refresh_map = 0;
5958
0
  } else {
5959
0
    int count = 0;
5960
0
    level_stats->ref_refresh_map |= vp9_get_refresh_mask(cpi);
5961
    // Also need to consider the case where the encoder refers to a buffer
5962
    // that has been implicitly refreshed after encoding a keyframe.
5963
0
    if (!cm->intra_only) {
5964
0
      level_stats->ref_refresh_map |= (1 << cpi->lst_fb_idx);
5965
0
      level_stats->ref_refresh_map |= (1 << cpi->gld_fb_idx);
5966
0
      level_stats->ref_refresh_map |= (1 << cpi->alt_fb_idx);
5967
0
    }
5968
0
    for (i = 0; i < REF_FRAMES; ++i) {
5969
0
      count += (level_stats->ref_refresh_map >> i) & 1;
5970
0
    }
5971
0
    if (count > level_spec->max_ref_frame_buffers) {
5972
0
      level_spec->max_ref_frame_buffers = count;
5973
0
    }
5974
0
  }
5975
5976
  // update average_bitrate
5977
0
  level_spec->average_bitrate = (double)level_stats->total_compressed_size /
5978
0
                                125.0 / level_stats->time_encoded;
5979
5980
  // update max_luma_sample_rate
5981
0
  luma_samples = 0;
5982
0
  for (i = 0; i < level_stats->frame_window_buffer.len; ++i) {
5983
0
    idx = (level_stats->frame_window_buffer.start +
5984
0
           level_stats->frame_window_buffer.len - 1 - i) %
5985
0
          FRAME_WINDOW_SIZE;
5986
0
    if (i == 0) {
5987
0
      dur_end = level_stats->frame_window_buffer.buf[idx].ts;
5988
0
    }
5989
0
    if (dur_end - level_stats->frame_window_buffer.buf[idx].ts >=
5990
0
        TICKS_PER_SEC) {
5991
0
      break;
5992
0
    }
5993
0
    luma_samples += level_stats->frame_window_buffer.buf[idx].luma_samples;
5994
0
  }
5995
0
  if (luma_samples > level_spec->max_luma_sample_rate) {
5996
0
    level_spec->max_luma_sample_rate = luma_samples;
5997
0
  }
5998
5999
  // update max_cpb_size
6000
0
  cpb_data_size = 0;
6001
0
  for (i = 0; i < CPB_WINDOW_SIZE; ++i) {
6002
0
    if (i >= level_stats->frame_window_buffer.len) break;
6003
0
    idx = (level_stats->frame_window_buffer.start +
6004
0
           level_stats->frame_window_buffer.len - 1 - i) %
6005
0
          FRAME_WINDOW_SIZE;
6006
0
    cpb_data_size += level_stats->frame_window_buffer.buf[idx].size;
6007
0
  }
6008
0
  cpb_data_size = cpb_data_size / 125.0;
6009
0
  if (cpb_data_size > level_spec->max_cpb_size) {
6010
0
    level_spec->max_cpb_size = cpb_data_size;
6011
0
  }
6012
6013
  // update max_luma_picture_size
6014
0
  if (luma_pic_size > level_spec->max_luma_picture_size) {
6015
0
    level_spec->max_luma_picture_size = luma_pic_size;
6016
0
  }
6017
6018
  // update max_luma_picture_breadth
6019
0
  if (luma_pic_breadth > level_spec->max_luma_picture_breadth) {
6020
0
    level_spec->max_luma_picture_breadth = luma_pic_breadth;
6021
0
  }
6022
6023
  // update compression_ratio
6024
0
  level_spec->compression_ratio = (double)level_stats->total_uncompressed_size *
6025
0
                                  cm->bit_depth /
6026
0
                                  level_stats->total_compressed_size / 8.0;
6027
6028
  // update max_col_tiles
6029
0
  if (level_spec->max_col_tiles < (1 << cm->log2_tile_cols)) {
6030
0
    level_spec->max_col_tiles = (1 << cm->log2_tile_cols);
6031
0
  }
6032
6033
0
  if (level_index >= 0 && level_constraint->fail_flag == 0) {
6034
0
    if (level_spec->max_luma_picture_size >
6035
0
        vp9_level_defs[level_index].max_luma_picture_size) {
6036
0
      level_constraint->fail_flag |= (1 << LUMA_PIC_SIZE_TOO_LARGE);
6037
0
      vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
6038
0
                         "Failed to encode to the target level %d. %s",
6039
0
                         vp9_level_defs[level_index].level,
6040
0
                         level_fail_messages[LUMA_PIC_SIZE_TOO_LARGE]);
6041
0
    }
6042
6043
0
    if (level_spec->max_luma_picture_breadth >
6044
0
        vp9_level_defs[level_index].max_luma_picture_breadth) {
6045
0
      level_constraint->fail_flag |= (1 << LUMA_PIC_BREADTH_TOO_LARGE);
6046
0
      vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
6047
0
                         "Failed to encode to the target level %d. %s",
6048
0
                         vp9_level_defs[level_index].level,
6049
0
                         level_fail_messages[LUMA_PIC_BREADTH_TOO_LARGE]);
6050
0
    }
6051
6052
0
    if ((double)level_spec->max_luma_sample_rate >
6053
0
        (double)vp9_level_defs[level_index].max_luma_sample_rate *
6054
0
            (1 + SAMPLE_RATE_GRACE_P)) {
6055
0
      level_constraint->fail_flag |= (1 << LUMA_SAMPLE_RATE_TOO_LARGE);
6056
0
      vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
6057
0
                         "Failed to encode to the target level %d. %s",
6058
0
                         vp9_level_defs[level_index].level,
6059
0
                         level_fail_messages[LUMA_SAMPLE_RATE_TOO_LARGE]);
6060
0
    }
6061
6062
0
    if (level_spec->max_col_tiles > vp9_level_defs[level_index].max_col_tiles) {
6063
0
      level_constraint->fail_flag |= (1 << TOO_MANY_COLUMN_TILE);
6064
0
      vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
6065
0
                         "Failed to encode to the target level %d. %s",
6066
0
                         vp9_level_defs[level_index].level,
6067
0
                         level_fail_messages[TOO_MANY_COLUMN_TILE]);
6068
0
    }
6069
6070
0
    if (level_spec->min_altref_distance <
6071
0
        vp9_level_defs[level_index].min_altref_distance) {
6072
0
      level_constraint->fail_flag |= (1 << ALTREF_DIST_TOO_SMALL);
6073
0
      vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
6074
0
                         "Failed to encode to the target level %d. %s",
6075
0
                         vp9_level_defs[level_index].level,
6076
0
                         level_fail_messages[ALTREF_DIST_TOO_SMALL]);
6077
0
    }
6078
6079
0
    if (level_spec->max_ref_frame_buffers >
6080
0
        vp9_level_defs[level_index].max_ref_frame_buffers) {
6081
0
      level_constraint->fail_flag |= (1 << TOO_MANY_REF_BUFFER);
6082
0
      vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
6083
0
                         "Failed to encode to the target level %d. %s",
6084
0
                         vp9_level_defs[level_index].level,
6085
0
                         level_fail_messages[TOO_MANY_REF_BUFFER]);
6086
0
    }
6087
6088
0
    if (level_spec->max_cpb_size > vp9_level_defs[level_index].max_cpb_size) {
6089
0
      level_constraint->fail_flag |= (1 << CPB_TOO_LARGE);
6090
0
      vpx_internal_error(&cm->error, VPX_CODEC_ERROR,
6091
0
                         "Failed to encode to the target level %d. %s",
6092
0
                         vp9_level_defs[level_index].level,
6093
0
                         level_fail_messages[CPB_TOO_LARGE]);
6094
0
    }
6095
6096
    // Set an upper bound for the next frame size. It will be used in
6097
    // level_rc_framerate() before encoding the next frame.
6098
0
    cpb_data_size = 0;
6099
0
    for (i = 0; i < CPB_WINDOW_SIZE - 1; ++i) {
6100
0
      if (i >= level_stats->frame_window_buffer.len) break;
6101
0
      idx = (level_stats->frame_window_buffer.start +
6102
0
             level_stats->frame_window_buffer.len - 1 - i) %
6103
0
            FRAME_WINDOW_SIZE;
6104
0
      cpb_data_size += level_stats->frame_window_buffer.buf[idx].size;
6105
0
    }
6106
0
    cpb_data_size = cpb_data_size / 125.0;
6107
0
    level_constraint->max_frame_size =
6108
0
        (int)((vp9_level_defs[level_index].max_cpb_size - cpb_data_size) *
6109
0
              1000.0);
6110
0
    if (level_stats->frame_window_buffer.len < CPB_WINDOW_SIZE - 1)
6111
0
      level_constraint->max_frame_size >>= 1;
6112
0
  }
6113
0
}
6114
6115
void vp9_get_ref_frame_info(FRAME_UPDATE_TYPE update_type, int ref_frame_flags,
6116
                            RefCntBuffer *ref_frame_bufs[MAX_INTER_REF_FRAMES],
6117
                            int *ref_frame_coding_indexes,
6118
0
                            int *ref_frame_valid_list) {
6119
0
  if (update_type != KF_UPDATE) {
6120
0
    const VP9_REFFRAME inter_ref_flags[MAX_INTER_REF_FRAMES] = { VP9_LAST_FLAG,
6121
0
                                                                 VP9_GOLD_FLAG,
6122
0
                                                                 VP9_ALT_FLAG };
6123
0
    int i;
6124
0
    for (i = 0; i < MAX_INTER_REF_FRAMES; ++i) {
6125
0
      assert(ref_frame_bufs[i] != NULL);
6126
0
      ref_frame_coding_indexes[i] = ref_frame_bufs[i]->frame_coding_index;
6127
0
      ref_frame_valid_list[i] = (ref_frame_flags & inter_ref_flags[i]) != 0;
6128
0
    }
6129
0
  } else {
6130
    // No reference frame is available when this is a key frame.
6131
0
    int i;
6132
0
    for (i = 0; i < MAX_INTER_REF_FRAMES; ++i) {
6133
0
      ref_frame_coding_indexes[i] = -1;
6134
0
      ref_frame_valid_list[i] = 0;
6135
0
    }
6136
0
  }
6137
0
}
6138
6139
472k
void vp9_init_encode_frame_result(ENCODE_FRAME_RESULT *encode_frame_result) {
6140
472k
  encode_frame_result->show_idx = -1;  // Actual encoding doesn't happen.
6141
472k
}
6142
6143
// Returns if TPL stats need to be calculated.
6144
454k
static INLINE int should_run_tpl(VP9_COMP *cpi, int gf_group_index) {
6145
454k
  RATE_CONTROL *const rc = &cpi->rc;
6146
454k
  if (!cpi->sf.enable_tpl_model) return 0;
6147
  // If there is an ARF for this GOP, TPL stats is always calculated.
6148
204k
  if (gf_group_index == 1 &&
6149
0
      cpi->twopass.gf_group.update_type[gf_group_index] == ARF_UPDATE)
6150
0
    return 1;
6151
  // If this GOP doesn't have an ARF, TPL stats is still calculated, only when
6152
  // external rate control is used.
6153
204k
  if (cpi->ext_ratectrl.ready &&
6154
0
      cpi->ext_ratectrl.funcs.send_tpl_gop_stats != NULL &&
6155
0
      rc->frames_till_gf_update_due == rc->baseline_gf_interval &&
6156
0
      cpi->twopass.gf_group.update_type[1] != ARF_UPDATE) {
6157
0
    return 1;
6158
0
  }
6159
204k
  return 0;
6160
204k
}
6161
6162
int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
6163
                            size_t *size, uint8_t *dest, size_t dest_size,
6164
                            int64_t *time_stamp, int64_t *time_end, int flush,
6165
918k
                            ENCODE_FRAME_RESULT *encode_frame_result) {
6166
918k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
6167
918k
  VP9_COMMON *const cm = &cpi->common;
6168
918k
  BufferPool *const pool = cm->buffer_pool;
6169
918k
  RATE_CONTROL *const rc = &cpi->rc;
6170
#if CONFIG_INTERNAL_STATS
6171
  struct vpx_usec_timer cmptimer;
6172
#endif
6173
918k
  YV12_BUFFER_CONFIG *force_src_buffer = NULL;
6174
918k
  struct lookahead_entry *last_source = NULL;
6175
918k
  struct lookahead_entry *source = NULL;
6176
918k
  int arf_src_index;
6177
918k
  const int gf_group_index = cpi->twopass.gf_group.index;
6178
918k
  int i;
6179
6180
#if CONFIG_COLLECT_COMPONENT_TIMING
6181
  if (oxcf->pass == 2) start_timing(cpi, vp9_get_compressed_data_time);
6182
#endif
6183
6184
918k
  if (is_one_pass_svc(cpi)) {
6185
0
    vp9_one_pass_svc_start_layer(cpi);
6186
0
  }
6187
6188
#if CONFIG_INTERNAL_STATS
6189
  vpx_usec_timer_start(&cmptimer);
6190
#endif
6191
6192
918k
  vp9_set_high_precision_mv(cpi, ALTREF_HIGH_PRECISION_MV);
6193
6194
  // Is multi-arf enabled.
6195
  // Note that at the moment multi_arf is only configured for 2 pass VBR and
6196
  // will not work properly with svc.
6197
  // Enable the Jingning's new "multi_layer_arf" code if "enable_auto_arf"
6198
  // is greater than or equal to 2.
6199
918k
  if ((oxcf->pass == 2) && !cpi->use_svc && (cpi->oxcf.enable_auto_arf >= 2))
6200
0
    cpi->multi_layer_arf = 1;
6201
918k
  else
6202
918k
    cpi->multi_layer_arf = 0;
6203
6204
  // Normal defaults
6205
918k
  cm->reset_frame_context = 0;
6206
918k
  cm->refresh_frame_context = 1;
6207
918k
  if (!is_one_pass_svc(cpi)) {
6208
918k
    cpi->refresh_last_frame = 1;
6209
918k
    cpi->refresh_golden_frame = 0;
6210
918k
    cpi->refresh_alt_ref_frame = 0;
6211
918k
  }
6212
6213
  // Should we encode an arf frame.
6214
918k
  arf_src_index = get_arf_src_index(cpi);
6215
6216
918k
  if (arf_src_index) {
6217
255k
    for (i = 0; i <= arf_src_index; ++i) {
6218
244k
      struct lookahead_entry *e = vp9_lookahead_peek(cpi->lookahead, i);
6219
      // Avoid creating an alt-ref if there's a forced keyframe pending.
6220
244k
      if (e == NULL) {
6221
1.47k
        break;
6222
243k
      } else if (e->flags == VPX_EFLAG_FORCE_KF) {
6223
38.0k
        arf_src_index = 0;
6224
38.0k
        flush = 1;
6225
38.0k
        break;
6226
38.0k
      }
6227
244k
    }
6228
50.2k
  }
6229
6230
  // Clear arf index stack before group of pictures processing starts.
6231
918k
  if (gf_group_index == 1) {
6232
0
    stack_init(cpi->twopass.gf_group.arf_index_stack, MAX_LAG_BUFFERS * 2);
6233
0
    cpi->twopass.gf_group.stack_size = 0;
6234
0
  }
6235
6236
918k
  if (arf_src_index) {
6237
12.1k
    if (!(cpi->ext_ratectrl.ready &&
6238
0
          (cpi->ext_ratectrl.funcs.rc_type & VPX_RC_GOP) != 0 &&
6239
12.1k
          cpi->ext_ratectrl.funcs.get_gop_decision != NULL)) {
6240
      // This assert only makes sense when not using external RC.
6241
12.1k
      assert(arf_src_index <= rc->frames_to_key);
6242
12.1k
    }
6243
12.1k
    if ((source = vp9_lookahead_peek(cpi->lookahead, arf_src_index)) != NULL) {
6244
10.6k
      cpi->alt_ref_source = source;
6245
6246
10.6k
#if !CONFIG_REALTIME_ONLY
6247
10.6k
      if ((oxcf->mode != REALTIME) && (oxcf->arnr_max_frames > 0) &&
6248
0
          (oxcf->arnr_strength > 0)) {
6249
0
        int bitrate = cpi->rc.avg_frame_bandwidth / 40;
6250
0
        int not_low_bitrate = bitrate > ALT_REF_AQ_LOW_BITRATE_BOUNDARY;
6251
6252
0
        int not_last_frame = (cpi->lookahead->sz - arf_src_index > 1);
6253
0
        not_last_frame |= ALT_REF_AQ_APPLY_TO_LAST_FRAME;
6254
6255
#if CONFIG_COLLECT_COMPONENT_TIMING
6256
        start_timing(cpi, vp9_temporal_filter_time);
6257
#endif
6258
        // Produce the filtered ARF frame.
6259
0
        vp9_temporal_filter(cpi, arf_src_index);
6260
0
        vpx_extend_frame_borders(&cpi->tf_buffer);
6261
#if CONFIG_COLLECT_COMPONENT_TIMING
6262
        end_timing(cpi, vp9_temporal_filter_time);
6263
#endif
6264
6265
        // for small bitrates segmentation overhead usually
6266
        // eats all bitrate gain from enabling delta quantizers
6267
0
        if (cpi->oxcf.alt_ref_aq != 0 && not_low_bitrate && not_last_frame)
6268
0
          vp9_alt_ref_aq_setup_mode(cpi->alt_ref_aq, cpi);
6269
6270
0
        force_src_buffer = &cpi->tf_buffer;
6271
0
      }
6272
10.6k
#endif
6273
10.6k
      cm->show_frame = 0;
6274
10.6k
      cm->intra_only = 0;
6275
10.6k
      cpi->refresh_alt_ref_frame = 1;
6276
10.6k
      cpi->refresh_golden_frame = 0;
6277
10.6k
      cpi->refresh_last_frame = 0;
6278
10.6k
      rc->is_src_frame_alt_ref = 0;
6279
10.6k
      rc->source_alt_ref_pending = 0;
6280
10.6k
    } else {
6281
1.47k
      rc->source_alt_ref_pending = 0;
6282
1.47k
    }
6283
12.1k
  }
6284
6285
918k
  if (!source) {
6286
    // Get last frame source.
6287
907k
    if (cm->current_video_frame > 0) {
6288
760k
      if ((last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL)
6289
0
        return -1;
6290
760k
    }
6291
6292
    // Read in the source frame.
6293
907k
    if (cpi->use_svc || cpi->svc.set_intra_only_frame)
6294
0
      source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush);
6295
907k
    else
6296
907k
      source = vp9_lookahead_pop(cpi->lookahead, flush);
6297
6298
907k
    if (source != NULL) {
6299
443k
      cm->show_frame = 1;
6300
443k
      cm->intra_only = 0;
6301
      // If the flags indicate intra frame, but if the current picture is for
6302
      // spatial layer above first_spatial_layer_to_encode, it should not be an
6303
      // intra picture.
6304
443k
      if ((source->flags & VPX_EFLAG_FORCE_KF) && cpi->use_svc &&
6305
0
          cpi->svc.spatial_layer_id > cpi->svc.first_spatial_layer_to_encode) {
6306
0
        source->flags &= ~(unsigned int)(VPX_EFLAG_FORCE_KF);
6307
0
      }
6308
6309
      // Check to see if the frame should be encoded as an arf overlay.
6310
443k
      check_src_altref(cpi, source);
6311
443k
    }
6312
907k
  }
6313
6314
918k
  if (source) {
6315
454k
    cpi->un_scaled_source = cpi->Source =
6316
454k
        force_src_buffer ? force_src_buffer : &source->img;
6317
6318
#ifdef ENABLE_KF_DENOISE
6319
    // Copy of raw source for metrics calculation.
6320
    if (is_psnr_calc_enabled(cpi))
6321
      vp9_copy_and_extend_frame(cpi->Source, &cpi->raw_unscaled_source);
6322
#endif
6323
6324
454k
    cpi->unscaled_last_source = last_source != NULL ? &last_source->img : NULL;
6325
6326
454k
    *time_stamp = source->ts_start;
6327
454k
    *time_end = source->ts_end;
6328
454k
    *frame_flags = (source->flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
6329
463k
  } else {
6330
463k
    *size = 0;
6331
463k
    return -1;
6332
463k
  }
6333
6334
454k
  if (source->ts_start < cpi->first_time_stamp_ever) {
6335
10.9k
    cpi->first_time_stamp_ever = source->ts_start;
6336
10.9k
    cpi->last_end_time_stamp_seen = source->ts_start;
6337
10.9k
  }
6338
6339
  // Clear down mmx registers
6340
454k
  vpx_clear_system_state();
6341
6342
  // adjust frame rates based on timestamps given
6343
454k
  if (cm->show_frame) {
6344
443k
    if (cpi->use_svc && cpi->svc.use_set_ref_frame_config &&
6345
0
        cpi->svc.duration[cpi->svc.spatial_layer_id] > 0) {
6346
0
      if (cpi->svc.timebase_fac > 0 &&
6347
0
          cpi->svc.duration[cpi->svc.spatial_layer_id] >
6348
0
              INT64_MAX / cpi->svc.timebase_fac) {
6349
0
        vpx_internal_error(&cpi->common.error, VPX_CODEC_INVALID_PARAM,
6350
0
                           "svc duration would overflow timebase conversion");
6351
0
      } else {
6352
0
        vp9_svc_adjust_frame_rate(cpi);
6353
0
      }
6354
443k
    } else {
6355
443k
      adjust_frame_rate(cpi, source);
6356
443k
    }
6357
443k
  }
6358
6359
454k
  if (is_one_pass_svc(cpi)) {
6360
0
    vp9_update_temporal_layer_framerate(cpi);
6361
0
    vp9_restore_layer_context(cpi);
6362
0
  }
6363
6364
  // Find a free buffer for the new frame, releasing the reference previously
6365
  // held.
6366
454k
  if (cm->new_fb_idx != INVALID_IDX) {
6367
443k
    --pool->frame_bufs[cm->new_fb_idx].ref_count;
6368
443k
  }
6369
454k
  cm->new_fb_idx = get_free_fb(cm);
6370
6371
454k
  if (cm->new_fb_idx == INVALID_IDX) return -1;
6372
454k
  cm->cur_frame = &pool->frame_bufs[cm->new_fb_idx];
6373
  // If the frame buffer for current frame is the same as previous frame, MV in
6374
  // the base layer shouldn't be used as it'll cause data race.
6375
454k
  if (cpi->svc.spatial_layer_id > 0 && cm->cur_frame == cm->prev_frame) {
6376
0
    cpi->svc.use_base_mv = 0;
6377
0
  }
6378
  // Start with a 0 size frame.
6379
454k
  *size = 0;
6380
6381
454k
  cpi->frame_flags = *frame_flags;
6382
6383
454k
#if !CONFIG_REALTIME_ONLY
6384
454k
  if ((oxcf->pass == 2) && !cpi->use_svc) {
6385
#if CONFIG_COLLECT_COMPONENT_TIMING
6386
    start_timing(cpi, vp9_rc_get_second_pass_params_time);
6387
#endif
6388
0
    vp9_rc_get_second_pass_params(cpi);
6389
#if CONFIG_COLLECT_COMPONENT_TIMING
6390
    end_timing(cpi, vp9_rc_get_second_pass_params_time);
6391
#endif
6392
454k
  } else if (oxcf->pass == 1) {
6393
0
    set_frame_size(cpi);
6394
0
  }
6395
6396
  // Key frame temporal filtering
6397
454k
  const int is_key_temporal_filter_enabled =
6398
454k
      oxcf->enable_keyframe_filtering && cpi->oxcf.mode != REALTIME &&
6399
0
      (oxcf->pass != 1) && !cpi->use_svc &&
6400
0
      !is_lossless_requested(&cpi->oxcf) && cm->frame_type == KEY_FRAME &&
6401
0
      (oxcf->arnr_max_frames > 0) && (oxcf->arnr_strength > 0) &&
6402
0
      cpi->oxcf.speed < 2;
6403
  // Save the pointer to the original source image.
6404
454k
  YV12_BUFFER_CONFIG *source_buffer = cpi->un_scaled_source;
6405
6406
454k
  if (is_key_temporal_filter_enabled && source != NULL) {
6407
    // Produce the filtered Key frame. Set distance to -1 since the key frame
6408
    // is already popped out.
6409
0
    vp9_temporal_filter(cpi, -1);
6410
0
    vpx_extend_frame_borders(&cpi->tf_buffer);
6411
0
    force_src_buffer = &cpi->tf_buffer;
6412
0
    cpi->un_scaled_source = cpi->Source =
6413
0
        force_src_buffer ? force_src_buffer : &source->img;
6414
0
  }
6415
454k
#endif  // !CONFIG_REALTIME_ONLY
6416
6417
454k
  if (oxcf->pass != 1 && cpi->level_constraint.level_index >= 0 &&
6418
0
      cpi->level_constraint.fail_flag == 0)
6419
0
    level_rc_framerate(cpi, arf_src_index);
6420
6421
454k
  if (cpi->oxcf.pass != 0 || cpi->use_svc || frame_is_intra_only(cm) == 1) {
6422
147k
    for (i = 0; i < REFS_PER_FRAME; ++i) cpi->scaled_ref_idx[i] = INVALID_IDX;
6423
36.8k
  }
6424
6425
454k
  if (cpi->kmeans_data_arr_alloc == 0) {
6426
10.9k
    int init_mi_rows, init_mi_cols, init_mi_stride;
6427
10.9k
    vp9_set_mi_size(&init_mi_rows, &init_mi_cols, &init_mi_stride,
6428
10.9k
                    cpi->initial_width, cpi->initial_height);
6429
10.9k
    const int mi_cols = mi_cols_aligned_to_sb(init_mi_cols);
6430
10.9k
    const int mi_rows = mi_cols_aligned_to_sb(init_mi_rows);
6431
10.9k
#if CONFIG_MULTITHREAD
6432
10.9k
    pthread_mutex_init(&cpi->kmeans_mutex, NULL);
6433
10.9k
#endif
6434
10.9k
    CHECK_MEM_ERROR(
6435
10.9k
        &cm->error, cpi->kmeans_data_arr,
6436
10.9k
        vpx_calloc(mi_rows * mi_cols, sizeof(*cpi->kmeans_data_arr)));
6437
10.9k
    cpi->kmeans_data_stride = mi_cols;
6438
10.9k
    cpi->kmeans_data_arr_alloc = 1;
6439
10.9k
  }
6440
6441
#if CONFIG_NON_GREEDY_MV
6442
  {
6443
    const int mi_cols = mi_cols_aligned_to_sb(cm->mi_cols);
6444
    const int mi_rows = mi_cols_aligned_to_sb(cm->mi_rows);
6445
    Status status = vp9_alloc_motion_field_info(
6446
        &cpi->motion_field_info, MAX_ARF_GOP_SIZE, mi_rows, mi_cols);
6447
    if (status == STATUS_FAILED) {
6448
      vpx_internal_error(&(cm)->error, VPX_CODEC_MEM_ERROR,
6449
                         "vp9_alloc_motion_field_info failed");
6450
    }
6451
  }
6452
#endif  // CONFIG_NON_GREEDY_MV
6453
6454
#if CONFIG_COLLECT_COMPONENT_TIMING
6455
  start_timing(cpi, setup_tpl_stats_time);
6456
#endif
6457
454k
  if (should_run_tpl(cpi, cpi->twopass.gf_group.index)) {
6458
0
    vp9_init_tpl_buffer(cpi);
6459
0
    vp9_estimate_tpl_qp_gop(cpi);
6460
0
    vp9_setup_tpl_stats(cpi);
6461
0
  }
6462
#if CONFIG_COLLECT_COMPONENT_TIMING
6463
  end_timing(cpi, setup_tpl_stats_time);
6464
#endif
6465
6466
#if CONFIG_BITSTREAM_DEBUG
6467
  assert(cpi->oxcf.max_threads == 0 &&
6468
         "bitstream debug tool does not support multithreading");
6469
  bitstream_queue_record_write();
6470
#endif
6471
#if CONFIG_BITSTREAM_DEBUG || CONFIG_MISMATCH_DEBUG
6472
  bitstream_queue_set_frame_write(cm->current_video_frame * 2 + cm->show_frame);
6473
#endif
6474
6475
454k
  cpi->td.mb.fp_src_pred = 0;
6476
#if CONFIG_REALTIME_ONLY
6477
  (void)encode_frame_result;
6478
  if (cpi->use_svc) {
6479
    SvcEncode(cpi, size, dest, dest_size, frame_flags);
6480
  } else {
6481
    // One pass encode
6482
    Pass0Encode(cpi, size, dest, dest_size, frame_flags);
6483
  }
6484
#else  // !CONFIG_REALTIME_ONLY
6485
454k
  if (oxcf->pass == 1 && !cpi->use_svc) {
6486
0
    const int lossless = is_lossless_requested(oxcf);
6487
0
#if CONFIG_VP9_HIGHBITDEPTH
6488
0
    if (cpi->oxcf.use_highbitdepth)
6489
0
      cpi->td.mb.fwd_txfm4x4 =
6490
0
          lossless ? vp9_highbd_fwht4x4 : vpx_highbd_fdct4x4;
6491
0
    else
6492
0
      cpi->td.mb.fwd_txfm4x4 = lossless ? vp9_fwht4x4 : vpx_fdct4x4;
6493
0
    cpi->td.mb.highbd_inv_txfm_add =
6494
0
        lossless ? vp9_highbd_iwht4x4_add : vp9_highbd_idct4x4_add;
6495
#else
6496
    cpi->td.mb.fwd_txfm4x4 = lossless ? vp9_fwht4x4 : vpx_fdct4x4;
6497
#endif  // CONFIG_VP9_HIGHBITDEPTH
6498
0
    cpi->td.mb.inv_txfm_add = lossless ? vp9_iwht4x4_add : vp9_idct4x4_add;
6499
0
    vp9_first_pass(cpi, source);
6500
454k
  } else if (oxcf->pass == 2 && !cpi->use_svc) {
6501
#if CONFIG_COLLECT_COMPONENT_TIMING
6502
    // Accumulate 2nd pass time in 2-pass case.
6503
    start_timing(cpi, Pass2Encode_time);
6504
#endif
6505
0
    Pass2Encode(cpi, size, dest, dest_size, frame_flags, encode_frame_result);
6506
0
    vp9_twopass_postencode_update(cpi);
6507
#if CONFIG_COLLECT_COMPONENT_TIMING
6508
    end_timing(cpi, Pass2Encode_time);
6509
#endif
6510
454k
  } else if (cpi->use_svc) {
6511
0
    SvcEncode(cpi, size, dest, dest_size, frame_flags);
6512
454k
  } else {
6513
    // One pass encode
6514
454k
    Pass0Encode(cpi, size, dest, dest_size, frame_flags);
6515
454k
  }
6516
454k
#endif  // CONFIG_REALTIME_ONLY
6517
6518
454k
  if (cm->show_frame) cm->cur_show_frame_fb_idx = cm->new_fb_idx;
6519
6520
454k
  if (cm->refresh_frame_context)
6521
425k
    cm->frame_contexts[cm->frame_context_idx] = *cm->fc;
6522
6523
  // No frame encoded, or frame was dropped, release scaled references.
6524
454k
  if ((*size == 0) && (frame_is_intra_only(cm) == 0)) {
6525
0
    release_scaled_references(cpi);
6526
0
  }
6527
6528
454k
  if (*size > 0) {
6529
453k
    cpi->droppable = !frame_is_reference(cpi);
6530
453k
  }
6531
6532
  // Save layer specific state.
6533
454k
  if (is_one_pass_svc(cpi) || ((cpi->svc.number_temporal_layers > 1 ||
6534
453k
                                cpi->svc.number_spatial_layers > 1) &&
6535
0
                               oxcf->pass == 2)) {
6536
0
    vp9_save_layer_context(cpi);
6537
0
  }
6538
6539
454k
  if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
6540
453k
    cpi->fixed_qp_onepass = 0;
6541
6542
#if CONFIG_INTERNAL_STATS
6543
  vpx_usec_timer_mark(&cmptimer);
6544
  cpi->time_compress_data += vpx_usec_timer_elapsed(&cmptimer);
6545
#endif
6546
6547
454k
  if (cpi->keep_level_stats && oxcf->pass != 1)
6548
0
    update_level_info(cpi, *size, arf_src_index);
6549
6550
454k
#if !CONFIG_REALTIME_ONLY
6551
454k
  if (is_key_temporal_filter_enabled && cpi->b_calculate_psnr) {
6552
0
    cpi->raw_source_frame = vp9_scale_if_required(
6553
0
        cm, source_buffer, &cpi->scaled_source, (oxcf->pass == 0), EIGHTTAP, 0);
6554
0
  }
6555
454k
#endif  // !CONFIG_REALTIME_ONLY
6556
6557
#if CONFIG_INTERNAL_STATS
6558
6559
  if (oxcf->pass != 1 && !cpi->last_frame_dropped) {
6560
    double samples = 0.0;
6561
    cpi->bytes += *size;
6562
6563
    if (cm->show_frame) {
6564
      uint32_t bit_depth = 8;
6565
      uint32_t in_bit_depth = 8;
6566
      cpi->count++;
6567
#if CONFIG_VP9_HIGHBITDEPTH
6568
      if (cm->use_highbitdepth) {
6569
        in_bit_depth = cpi->oxcf.input_bit_depth;
6570
        bit_depth = cm->bit_depth;
6571
      }
6572
#endif
6573
6574
      if (cpi->b_calculate_psnr) {
6575
        YV12_BUFFER_CONFIG *orig = cpi->raw_source_frame;
6576
        YV12_BUFFER_CONFIG *recon = cpi->common.frame_to_show;
6577
        YV12_BUFFER_CONFIG *pp = &cm->post_proc_buffer;
6578
        PSNR_STATS psnr;
6579
#if CONFIG_VP9_HIGHBITDEPTH
6580
        vpx_calc_highbd_psnr(orig, recon, &psnr, cpi->td.mb.e_mbd.bd,
6581
                             in_bit_depth, cpi->svc.spatial_layer_id);
6582
#else
6583
        vpx_calc_psnr(orig, recon, &psnr, cpi->svc.spatial_layer_id);
6584
#endif  // CONFIG_VP9_HIGHBITDEPTH
6585
6586
        adjust_image_stat(psnr.psnr[1], psnr.psnr[2], psnr.psnr[3],
6587
                          psnr.psnr[0], &cpi->psnr);
6588
        cpi->total_sq_error += psnr.sse[0];
6589
        cpi->total_samples += psnr.samples[0];
6590
        samples = psnr.samples[0];
6591
6592
        {
6593
          PSNR_STATS psnr2;
6594
          double frame_ssim2 = 0, weight = 0;
6595
#if CONFIG_VP9_POSTPROC
6596
          if (vpx_alloc_frame_buffer(
6597
                  pp, recon->y_crop_width, recon->y_crop_height,
6598
                  cm->subsampling_x, cm->subsampling_y,
6599
#if CONFIG_VP9_HIGHBITDEPTH
6600
                  cm->use_highbitdepth,
6601
#endif
6602
                  VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment) < 0) {
6603
            vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
6604
                               "Failed to allocate post processing buffer");
6605
          }
6606
          {
6607
            vp9_ppflags_t ppflags;
6608
            ppflags.post_proc_flag = VP9D_DEBLOCK;
6609
            ppflags.deblocking_level = 0;  // not used in vp9_post_proc_frame()
6610
            ppflags.noise_level = 0;       // not used in vp9_post_proc_frame()
6611
            vp9_post_proc_frame(cm, pp, &ppflags,
6612
                                cpi->un_scaled_source->y_width);
6613
          }
6614
#endif
6615
          vpx_clear_system_state();
6616
6617
#if CONFIG_VP9_HIGHBITDEPTH
6618
          vpx_calc_highbd_psnr(orig, pp, &psnr2, cpi->td.mb.e_mbd.bd,
6619
                               cpi->oxcf.input_bit_depth,
6620
                               cpi->svc.spatial_layer_id);
6621
#else
6622
          vpx_calc_psnr(orig, pp, &psnr2, cpi->svc.spatial_layer_id);
6623
#endif  // CONFIG_VP9_HIGHBITDEPTH
6624
6625
          cpi->totalp_sq_error += psnr2.sse[0];
6626
          cpi->totalp_samples += psnr2.samples[0];
6627
          adjust_image_stat(psnr2.psnr[1], psnr2.psnr[2], psnr2.psnr[3],
6628
                            psnr2.psnr[0], &cpi->psnrp);
6629
6630
#if CONFIG_VP9_HIGHBITDEPTH
6631
          if (cm->use_highbitdepth) {
6632
            frame_ssim2 = vpx_highbd_calc_ssim(orig, recon, &weight, bit_depth,
6633
                                               in_bit_depth);
6634
          } else {
6635
            frame_ssim2 = vpx_calc_ssim(orig, recon, &weight);
6636
          }
6637
#else
6638
          frame_ssim2 = vpx_calc_ssim(orig, recon, &weight);
6639
#endif  // CONFIG_VP9_HIGHBITDEPTH
6640
6641
          cpi->worst_ssim = VPXMIN(cpi->worst_ssim, frame_ssim2);
6642
          cpi->summed_quality += frame_ssim2 * weight;
6643
          cpi->summed_weights += weight;
6644
6645
#if CONFIG_VP9_HIGHBITDEPTH
6646
          if (cm->use_highbitdepth) {
6647
            frame_ssim2 = vpx_highbd_calc_ssim(orig, pp, &weight, bit_depth,
6648
                                               in_bit_depth);
6649
          } else {
6650
            frame_ssim2 = vpx_calc_ssim(orig, pp, &weight);
6651
          }
6652
#else
6653
          frame_ssim2 = vpx_calc_ssim(orig, pp, &weight);
6654
#endif  // CONFIG_VP9_HIGHBITDEPTH
6655
6656
          cpi->summedp_quality += frame_ssim2 * weight;
6657
          cpi->summedp_weights += weight;
6658
#if 0
6659
          if (cm->show_frame) {
6660
            FILE *f = fopen("q_used.stt", "a");
6661
            fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
6662
                    cpi->common.current_video_frame, psnr2.psnr[1],
6663
                    psnr2.psnr[2], psnr2.psnr[3], psnr2.psnr[0], frame_ssim2);
6664
            fclose(f);
6665
          }
6666
#endif
6667
        }
6668
      }
6669
      if (cpi->b_calculate_blockiness) {
6670
#if CONFIG_VP9_HIGHBITDEPTH
6671
        if (!cm->use_highbitdepth)
6672
#endif
6673
        {
6674
          double frame_blockiness = vp9_get_blockiness(
6675
              cpi->Source->y_buffer, cpi->Source->y_stride,
6676
              cm->frame_to_show->y_buffer, cm->frame_to_show->y_stride,
6677
              cpi->Source->y_width, cpi->Source->y_height);
6678
          cpi->worst_blockiness =
6679
              VPXMAX(cpi->worst_blockiness, frame_blockiness);
6680
          cpi->total_blockiness += frame_blockiness;
6681
        }
6682
      }
6683
6684
      if (cpi->b_calculate_consistency) {
6685
#if CONFIG_VP9_HIGHBITDEPTH
6686
        if (!cm->use_highbitdepth)
6687
#endif
6688
        {
6689
          double this_inconsistency = vpx_get_ssim_metrics(
6690
              cpi->Source->y_buffer, cpi->Source->y_stride,
6691
              cm->frame_to_show->y_buffer, cm->frame_to_show->y_stride,
6692
              cpi->Source->y_width, cpi->Source->y_height, cpi->ssim_vars,
6693
              &cpi->metrics, 1);
6694
6695
          const double peak = (double)((1 << cpi->oxcf.input_bit_depth) - 1);
6696
          double consistency =
6697
              vpx_sse_to_psnr(samples, peak, (double)cpi->total_inconsistency);
6698
          if (consistency > 0.0)
6699
            cpi->worst_consistency =
6700
                VPXMIN(cpi->worst_consistency, consistency);
6701
          cpi->total_inconsistency += this_inconsistency;
6702
        }
6703
      }
6704
6705
      {
6706
        double y, u, v, frame_all;
6707
        frame_all = vpx_calc_fastssim(cpi->Source, cm->frame_to_show, &y, &u,
6708
                                      &v, bit_depth, in_bit_depth);
6709
        adjust_image_stat(y, u, v, frame_all, &cpi->fastssim);
6710
      }
6711
      {
6712
        double y, u, v, frame_all;
6713
        frame_all = vpx_psnrhvs(cpi->Source, cm->frame_to_show, &y, &u, &v,
6714
                                bit_depth, in_bit_depth);
6715
        adjust_image_stat(y, u, v, frame_all, &cpi->psnrhvs);
6716
      }
6717
    }
6718
  }
6719
6720
#endif
6721
6722
#if CONFIG_COLLECT_COMPONENT_TIMING
6723
  if (oxcf->pass == 2) end_timing(cpi, vp9_get_compressed_data_time);
6724
6725
  // Print out timing information.
6726
  // Note: Use "cpi->frame_component_time[0] > 100 us" to avoid showing of
6727
  // show_existing_frame and lag-in-frames.
6728
  //  if (cpi->frame_component_time[0] > 100)
6729
  if (oxcf->pass == 2) {
6730
    uint64_t frame_total = 0, total = 0;
6731
    int i;
6732
6733
    fprintf(stderr,
6734
            "\n Frame number: %d, Frame type: %s, Show Frame: %d, Q: %d\n",
6735
            cm->current_video_frame, get_frame_type_enum(cm->frame_type),
6736
            cm->show_frame, cm->base_qindex);
6737
    for (i = 0; i < kTimingComponents; i++) {
6738
      cpi->component_time[i] += cpi->frame_component_time[i];
6739
      // Use vp9_get_compressed_data_time (i = 0) as the total time.
6740
      if (i == 0) {
6741
        frame_total = cpi->frame_component_time[0];
6742
        total = cpi->component_time[0];
6743
      }
6744
      fprintf(stderr,
6745
              " %50s:  %15" PRId64 " us [%6.2f%%] (total: %15" PRId64
6746
              " us [%6.2f%%])\n",
6747
              get_component_name(i), cpi->frame_component_time[i],
6748
              (float)((float)cpi->frame_component_time[i] * 100.0 /
6749
                      (float)frame_total),
6750
              cpi->component_time[i],
6751
              (float)((float)cpi->component_time[i] * 100.0 / (float)total));
6752
      cpi->frame_component_time[i] = 0;
6753
    }
6754
  }
6755
#endif
6756
6757
454k
  if (is_one_pass_svc(cpi)) {
6758
0
    if (cm->show_frame) {
6759
0
      ++cpi->svc.spatial_layer_to_encode;
6760
0
      if (cpi->svc.spatial_layer_to_encode >= cpi->svc.number_spatial_layers)
6761
0
        cpi->svc.spatial_layer_to_encode = 0;
6762
0
    }
6763
0
  }
6764
6765
454k
  vpx_clear_system_state();
6766
454k
  return 0;
6767
454k
}
6768
6769
int vp9_get_preview_raw_frame(VP9_COMP *cpi, YV12_BUFFER_CONFIG *dest,
6770
0
                              vp9_ppflags_t *flags) {
6771
0
  VP9_COMMON *cm = &cpi->common;
6772
0
#if !CONFIG_VP9_POSTPROC
6773
0
  (void)flags;
6774
0
#endif
6775
6776
0
  if (!cm->show_frame) {
6777
0
    return -1;
6778
0
  } else {
6779
0
    int ret;
6780
#if CONFIG_VP9_POSTPROC
6781
    ret = vp9_post_proc_frame(cm, dest, flags, cpi->un_scaled_source->y_width);
6782
#else
6783
0
    if (cm->frame_to_show) {
6784
0
      *dest = *cm->frame_to_show;
6785
0
      dest->y_width = cm->width;
6786
0
      dest->y_height = cm->height;
6787
0
      dest->uv_width = cm->width >> cm->subsampling_x;
6788
0
      dest->uv_height = cm->height >> cm->subsampling_y;
6789
0
      ret = 0;
6790
0
    } else {
6791
0
      ret = -1;
6792
0
    }
6793
0
#endif  // !CONFIG_VP9_POSTPROC
6794
0
    vpx_clear_system_state();
6795
0
    return ret;
6796
0
  }
6797
0
}
6798
6799
int vp9_set_internal_size(VP9_COMP *cpi, VPX_SCALING_MODE horiz_mode,
6800
0
                          VPX_SCALING_MODE vert_mode) {
6801
0
  VP9_COMMON *cm = &cpi->common;
6802
0
  int hr = 0, hs = 0, vr = 0, vs = 0;
6803
6804
0
  if (horiz_mode > VP8E_ONETWO || vert_mode > VP8E_ONETWO) return -1;
6805
6806
0
  Scale2Ratio(horiz_mode, &hr, &hs);
6807
0
  Scale2Ratio(vert_mode, &vr, &vs);
6808
6809
  // always go to the next whole number
6810
0
  cm->width = (hs - 1 + cpi->oxcf.width * hr) / hs;
6811
0
  cm->height = (vs - 1 + cpi->oxcf.height * vr) / vs;
6812
0
  if (cm->current_video_frame) {
6813
0
    assert(cm->width <= cpi->initial_width);
6814
0
    assert(cm->height <= cpi->initial_height);
6815
0
  }
6816
6817
0
  update_frame_size(cpi);
6818
6819
0
  return 0;
6820
0
}
6821
6822
int vp9_set_size_literal(VP9_COMP *cpi, unsigned int width,
6823
0
                         unsigned int height) {
6824
0
  VP9_COMMON *cm = &cpi->common;
6825
0
#if CONFIG_VP9_HIGHBITDEPTH
6826
0
  update_initial_width(cpi, cm->use_highbitdepth, cpi->common.subsampling_x,
6827
0
                       cpi->common.subsampling_y);
6828
#else
6829
  update_initial_width(cpi, 0, cpi->common.subsampling_x,
6830
                       cpi->common.subsampling_y);
6831
#endif  // CONFIG_VP9_HIGHBITDEPTH
6832
6833
#if CONFIG_VP9_TEMPORAL_DENOISING
6834
  setup_denoiser_buffer(cpi);
6835
#endif
6836
0
  alloc_raw_frame_buffers(cpi);
6837
0
  if (width) {
6838
0
    cm->width = width;
6839
0
    if (cm->width > cpi->initial_width) {
6840
0
      cm->width = cpi->initial_width;
6841
0
    }
6842
0
  }
6843
6844
0
  if (height) {
6845
0
    cm->height = height;
6846
0
    if (cm->height > cpi->initial_height) {
6847
0
      cm->height = cpi->initial_height;
6848
0
    }
6849
0
  }
6850
0
  assert(cm->width <= cpi->initial_width);
6851
0
  assert(cm->height <= cpi->initial_height);
6852
6853
0
  update_frame_size(cpi);
6854
6855
0
  return 0;
6856
0
}
6857
6858
0
void vp9_set_svc(VP9_COMP *cpi, int use_svc) {
6859
0
  cpi->use_svc = use_svc;
6860
0
  return;
6861
0
}
6862
6863
0
int vp9_get_quantizer(const VP9_COMP *cpi) { return cpi->common.base_qindex; }
6864
6865
473k
void vp9_apply_encoding_flags(VP9_COMP *cpi, vpx_enc_frame_flags_t flags) {
6866
473k
  if (flags &
6867
473k
      (VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF | VP8_EFLAG_NO_REF_ARF)) {
6868
0
    int ref = 7;
6869
6870
0
    if (flags & VP8_EFLAG_NO_REF_LAST) ref ^= VP9_LAST_FLAG;
6871
6872
0
    if (flags & VP8_EFLAG_NO_REF_GF) ref ^= VP9_GOLD_FLAG;
6873
6874
0
    if (flags & VP8_EFLAG_NO_REF_ARF) ref ^= VP9_ALT_FLAG;
6875
6876
0
    vp9_use_as_reference(cpi, ref);
6877
0
  }
6878
6879
473k
  if (flags &
6880
473k
      (VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
6881
473k
       VP8_EFLAG_FORCE_GF | VP8_EFLAG_FORCE_ARF)) {
6882
0
    int upd = 7;
6883
6884
0
    if (flags & VP8_EFLAG_NO_UPD_LAST) upd ^= VP9_LAST_FLAG;
6885
6886
0
    if (flags & VP8_EFLAG_NO_UPD_GF) upd ^= VP9_GOLD_FLAG;
6887
6888
0
    if (flags & VP8_EFLAG_NO_UPD_ARF) upd ^= VP9_ALT_FLAG;
6889
6890
0
    vp9_update_reference(cpi, upd);
6891
0
  }
6892
6893
473k
  if (flags & VP8_EFLAG_NO_UPD_ENTROPY) {
6894
0
    vp9_update_entropy(cpi, 0);
6895
0
  }
6896
473k
}
6897
6898
18.2k
void vp9_set_row_mt(VP9_COMP *cpi) {
6899
  // Enable row based multi-threading for supported modes of encoding
6900
18.2k
  cpi->row_mt = 0;
6901
18.2k
  if (((cpi->oxcf.mode == GOOD || cpi->oxcf.mode == BEST) &&
6902
13.8k
       cpi->oxcf.speed < 5 && cpi->oxcf.pass == 1) &&
6903
0
      cpi->oxcf.row_mt && !cpi->use_svc)
6904
0
    cpi->row_mt = 1;
6905
6906
18.2k
  if (cpi->oxcf.mode == GOOD && cpi->oxcf.speed < 5 &&
6907
10.9k
      (cpi->oxcf.pass == 0 || cpi->oxcf.pass == 2) && cpi->oxcf.row_mt &&
6908
0
      !cpi->use_svc)
6909
0
    cpi->row_mt = 1;
6910
6911
  // In realtime mode, enable row based multi-threading for all the speed levels
6912
  // where non-rd path is used.
6913
18.2k
  if (cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5 && cpi->oxcf.row_mt) {
6914
0
    cpi->row_mt = 1;
6915
0
  }
6916
6917
18.2k
  if (cpi->row_mt)
6918
0
    cpi->row_mt_bit_exact = 1;
6919
18.2k
  else
6920
18.2k
    cpi->row_mt_bit_exact = 0;
6921
18.2k
}