Coverage Report

Created: 2026-05-23 07:06

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
30.6k
#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
178k
#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
59.9k
#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
150k
static int is_psnr_calc_enabled(const VP9_COMP *cpi) {
465
150k
  const VP9_COMMON *const cm = &cpi->common;
466
150k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
467
468
150k
  return cpi->b_calculate_psnr && (oxcf->pass != 1) && cm->show_frame;
469
150k
}
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
75.2k
static void suppress_active_map(VP9_COMP *cpi) {
530
75.2k
  unsigned char *const seg_map = cpi->segmentation_map;
531
532
75.2k
  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
75.2k
}
542
543
75.2k
static void apply_active_map(VP9_COMP *cpi) {
544
75.2k
  struct segmentation *const seg = &cpi->common.seg;
545
75.2k
  unsigned char *const seg_map = cpi->segmentation_map;
546
75.2k
  const unsigned char *const active_map = cpi->active_map.map;
547
75.2k
  int i;
548
549
75.2k
  assert(AM_SEGMENT_ID_ACTIVE == CR_SEGMENT_ID_BASE);
550
551
75.2k
  if (frame_is_intra_only(&cpi->common)) {
552
15.3k
    cpi->active_map.enabled = 0;
553
15.3k
    cpi->active_map.update = 1;
554
15.3k
  }
555
556
75.2k
  if (cpi->active_map.update) {
557
15.3k
    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
15.3k
    } else {
568
15.3k
      vp9_disable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_SKIP);
569
15.3k
      vp9_disable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_ALT_LF);
570
15.3k
      if (seg->enabled) {
571
0
        seg->update_data = 1;
572
0
        seg->update_map = 1;
573
0
      }
574
15.3k
    }
575
15.3k
    cpi->active_map.update = 0;
576
15.3k
  }
577
75.2k
}
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
3.80k
static void init_level_info(Vp9LevelInfo *level_info) {
646
3.80k
  Vp9LevelStats *const level_stats = &level_info->level_stats;
647
3.80k
  Vp9LevelSpec *const level_spec = &level_info->level_spec;
648
649
3.80k
  memset(level_stats, 0, sizeof(*level_stats));
650
3.80k
  memset(level_spec, 0, sizeof(*level_spec));
651
3.80k
  level_spec->level = LEVEL_UNKNOWN;
652
3.80k
  level_spec->min_altref_distance = INT_MAX;
653
3.80k
}
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
271k
void vp9_set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
803
271k
  MACROBLOCK *const mb = &cpi->td.mb;
804
271k
  cpi->common.allow_high_precision_mv = allow_high_precision_mv;
805
271k
  if (cpi->common.allow_high_precision_mv) {
806
226k
    mb->mvcost = mb->nmvcost_hp;
807
226k
    mb->mvsadcost = mb->nmvsadcost_hp;
808
226k
  } else {
809
44.7k
    mb->mvcost = mb->nmvcost;
810
44.7k
    mb->mvsadcost = mb->nmvsadcost;
811
44.7k
  }
812
271k
}
813
814
75.2k
static void setup_frame(VP9_COMP *cpi) {
815
75.2k
  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
75.2k
  if (frame_is_intra_only(cm) || cm->error_resilient_mode) {
822
15.3k
    vp9_setup_past_independence(cm);
823
59.9k
  } else {
824
59.9k
    if (!cpi->use_svc) cm->frame_context_idx = cpi->refresh_alt_ref_frame;
825
59.9k
  }
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
75.2k
  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
75.2k
  if (cm->frame_type == KEY_FRAME) {
857
15.3k
    cpi->refresh_golden_frame = 1;
858
15.3k
    cpi->refresh_alt_ref_frame = 1;
859
15.3k
    vp9_zero(cpi->interp_filter_selected);
860
59.9k
  } else {
861
59.9k
    *cm->fc = cm->frame_contexts[cm->frame_context_idx];
862
59.9k
    vp9_zero(cpi->interp_filter_selected[0]);
863
59.9k
  }
864
75.2k
}
865
866
32.8k
static void vp9_enc_setup_mi(VP9_COMMON *cm) {
867
32.8k
  int i;
868
32.8k
  cm->mi = cm->mip + cm->mi_stride + 1;
869
32.8k
  memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip));
870
32.8k
  cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
871
  // Clear top border row
872
32.8k
  memset(cm->prev_mip, 0, sizeof(*cm->prev_mip) * cm->mi_stride);
873
  // Clear left border column
874
2.32M
  for (i = 1; i < cm->mi_rows + 1; ++i)
875
2.29M
    memset(&cm->prev_mip[i * cm->mi_stride], 0, sizeof(*cm->prev_mip));
876
877
32.8k
  cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
878
32.8k
  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
879
880
32.8k
  memset(cm->mi_grid_base, 0,
881
32.8k
         cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mi_grid_base));
882
32.8k
}
883
884
3.80k
static int vp9_enc_alloc_mi(VP9_COMMON *cm, int mi_size) {
885
3.80k
  cm->mip = vpx_calloc(mi_size, sizeof(*cm->mip));
886
3.80k
  if (!cm->mip) return 1;
887
3.80k
  cm->prev_mip = vpx_calloc(mi_size, sizeof(*cm->prev_mip));
888
3.80k
  if (!cm->prev_mip) return 1;
889
3.80k
  cm->mi_alloc_size = mi_size;
890
891
3.80k
  cm->mi_grid_base =
892
3.80k
      (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
893
3.80k
  if (!cm->mi_grid_base) return 1;
894
3.80k
  cm->prev_mi_grid_base =
895
3.80k
      (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base));
896
3.80k
  if (!cm->prev_mi_grid_base) return 1;
897
898
3.80k
  return 0;
899
3.80k
}
900
901
11.4k
static void vp9_enc_free_mi(VP9_COMMON *cm) {
902
11.4k
  vpx_free(cm->mip);
903
11.4k
  cm->mip = NULL;
904
11.4k
  vpx_free(cm->prev_mip);
905
11.4k
  cm->prev_mip = NULL;
906
11.4k
  vpx_free(cm->mi_grid_base);
907
11.4k
  cm->mi_grid_base = NULL;
908
11.4k
  vpx_free(cm->prev_mi_grid_base);
909
11.4k
  cm->prev_mi_grid_base = NULL;
910
11.4k
  cm->mi_alloc_size = 0;
911
11.4k
}
912
913
75.1k
static void vp9_swap_mi_and_prev_mi(VP9_COMMON *cm) {
914
  // Current mip will be the prev_mip for the next frame.
915
75.1k
  MODE_INFO **temp_base = cm->prev_mi_grid_base;
916
75.1k
  MODE_INFO *temp = cm->prev_mip;
917
918
  // Skip update prev_mi frame in show_existing_frame mode.
919
75.1k
  if (cm->show_existing_frame) return;
920
921
75.1k
  cm->prev_mip = cm->mip;
922
75.1k
  cm->mip = temp;
923
924
  // Update the upper left visible macroblock ptrs.
925
75.1k
  cm->mi = cm->mip + cm->mi_stride + 1;
926
75.1k
  cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
927
928
75.1k
  cm->prev_mi_grid_base = cm->mi_grid_base;
929
75.1k
  cm->mi_grid_base = temp_base;
930
75.1k
  cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
931
75.1k
  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
932
75.1k
}
933
934
1
static void initialize_enc(void) {
935
1
  vp9_rtcd();
936
1
  vpx_dsp_rtcd();
937
1
  vpx_scale_rtcd();
938
1
  vp9_init_intra_predictors();
939
1
  vp9_init_me_luts();
940
1
  vp9_rc_init_minq_luts();
941
1
  vp9_entropy_mv_init();
942
1
#if !CONFIG_REALTIME_ONLY
943
1
  vp9_temporal_filter_init();
944
1
#endif
945
1
}
946
947
3.84k
void vp9_initialize_enc(void) { once(initialize_enc); }
948
949
3.80k
static void dealloc_compressor_data(VP9_COMP *cpi) {
950
3.80k
  VP9_COMMON *const cm = &cpi->common;
951
3.80k
  int i;
952
953
3.80k
  vpx_free(cpi->mbmi_ext_base);
954
3.80k
  cpi->mbmi_ext_base = NULL;
955
956
3.80k
  vpx_free(cpi->tile_data);
957
3.80k
  cpi->tile_data = NULL;
958
959
3.80k
  vpx_free(cpi->segmentation_map);
960
3.80k
  cpi->segmentation_map = NULL;
961
3.80k
  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
962
3.80k
  cpi->coding_context.last_frame_seg_map_copy = NULL;
963
964
3.80k
  vpx_free(cpi->nmvcosts[0]);
965
3.80k
  vpx_free(cpi->nmvcosts[1]);
966
3.80k
  cpi->nmvcosts[0] = NULL;
967
3.80k
  cpi->nmvcosts[1] = NULL;
968
969
3.80k
  vpx_free(cpi->nmvcosts_hp[0]);
970
3.80k
  vpx_free(cpi->nmvcosts_hp[1]);
971
3.80k
  cpi->nmvcosts_hp[0] = NULL;
972
3.80k
  cpi->nmvcosts_hp[1] = NULL;
973
974
3.80k
  vpx_free(cpi->nmvsadcosts[0]);
975
3.80k
  vpx_free(cpi->nmvsadcosts[1]);
976
3.80k
  cpi->nmvsadcosts[0] = NULL;
977
3.80k
  cpi->nmvsadcosts[1] = NULL;
978
979
3.80k
  vpx_free(cpi->nmvsadcosts_hp[0]);
980
3.80k
  vpx_free(cpi->nmvsadcosts_hp[1]);
981
3.80k
  cpi->nmvsadcosts_hp[0] = NULL;
982
3.80k
  cpi->nmvsadcosts_hp[1] = NULL;
983
984
3.80k
  vpx_free(cpi->skin_map);
985
3.80k
  cpi->skin_map = NULL;
986
987
3.80k
  vpx_free(cpi->prev_partition);
988
3.80k
  cpi->prev_partition = NULL;
989
990
3.80k
  vpx_free(cpi->svc.prev_partition_svc);
991
3.80k
  cpi->svc.prev_partition_svc = NULL;
992
993
3.80k
  vpx_free(cpi->prev_segment_id);
994
3.80k
  cpi->prev_segment_id = NULL;
995
996
3.80k
  vpx_free(cpi->prev_variance_low);
997
3.80k
  cpi->prev_variance_low = NULL;
998
999
3.80k
  vpx_free(cpi->copied_frame_cnt);
1000
3.80k
  cpi->copied_frame_cnt = NULL;
1001
1002
3.80k
  vpx_free(cpi->content_state_sb_fd);
1003
3.80k
  cpi->content_state_sb_fd = NULL;
1004
1005
3.80k
  vpx_free(cpi->count_arf_frame_usage);
1006
3.80k
  cpi->count_arf_frame_usage = NULL;
1007
3.80k
  vpx_free(cpi->count_lastgolden_frame_usage);
1008
3.80k
  cpi->count_lastgolden_frame_usage = NULL;
1009
1010
3.80k
  vp9_cyclic_refresh_free(cpi->cyclic_refresh);
1011
3.80k
  cpi->cyclic_refresh = NULL;
1012
1013
3.80k
  vpx_free(cpi->active_map.map);
1014
3.80k
  cpi->active_map.map = NULL;
1015
1016
3.80k
  vpx_free(cpi->roi.roi_map);
1017
3.80k
  cpi->roi.roi_map = NULL;
1018
1019
3.80k
  vpx_free(cpi->consec_zero_mv);
1020
3.80k
  cpi->consec_zero_mv = NULL;
1021
1022
3.80k
  vpx_free(cpi->mb_wiener_variance);
1023
3.80k
  cpi->mb_wiener_variance = NULL;
1024
1025
3.80k
  vpx_free(cpi->sb_mul_scale);
1026
3.80k
  cpi->sb_mul_scale = NULL;
1027
1028
3.80k
  vpx_free(cpi->mi_ssim_rdmult_scaling_factors);
1029
3.80k
  cpi->mi_ssim_rdmult_scaling_factors = NULL;
1030
1031
3.80k
  vp9_free_ref_frame_buffers(cm->buffer_pool);
1032
#if CONFIG_VP9_POSTPROC
1033
  vp9_free_postproc_buffers(cm);
1034
#endif
1035
3.80k
  vp9_free_context_buffers(cm);
1036
1037
3.80k
  vpx_free_frame_buffer(&cpi->last_frame_uf);
1038
3.80k
  vpx_free_frame_buffer(&cpi->scaled_source);
1039
3.80k
  vpx_free_frame_buffer(&cpi->scaled_last_source);
1040
3.80k
  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
3.80k
  vp9_lookahead_destroy(cpi->lookahead);
1047
1048
3.80k
  vpx_free(cpi->tile_tok[0][0]);
1049
3.80k
  cpi->tile_tok[0][0] = 0;
1050
1051
3.80k
  vpx_free(cpi->tplist[0][0]);
1052
3.80k
  cpi->tplist[0][0] = NULL;
1053
1054
3.80k
  vp9_free_pc_tree(&cpi->td);
1055
1056
7.61k
  for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
1057
3.80k
    LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i];
1058
3.80k
    vpx_free(lc->rc_twopass_stats_in.buf);
1059
3.80k
    lc->rc_twopass_stats_in.buf = NULL;
1060
3.80k
    lc->rc_twopass_stats_in.sz = 0;
1061
3.80k
  }
1062
1063
98.9k
  for (i = 0; i < MAX_LAG_BUFFERS; ++i) {
1064
95.1k
    vpx_free_frame_buffer(&cpi->svc.scaled_frames[i]);
1065
95.1k
  }
1066
3.80k
  memset(&cpi->svc.scaled_frames[0], 0,
1067
3.80k
         MAX_LAG_BUFFERS * sizeof(cpi->svc.scaled_frames[0]));
1068
1069
3.80k
  vpx_free_frame_buffer(&cpi->svc.scaled_temp);
1070
3.80k
  memset(&cpi->svc.scaled_temp, 0, sizeof(cpi->svc.scaled_temp));
1071
1072
3.80k
  vpx_free_frame_buffer(&cpi->svc.empty_frame.img);
1073
3.80k
  memset(&cpi->svc.empty_frame, 0, sizeof(cpi->svc.empty_frame));
1074
1075
3.80k
  vp9_free_svc_cyclic_refresh(cpi);
1076
3.80k
}
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
75.9k
static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
1277
75.9k
  VP9_COMMON *cm = &cpi->common;
1278
75.9k
  const VP9EncoderConfig *oxcf = &cpi->oxcf;
1279
1280
75.9k
  if (!cpi->lookahead)
1281
3.68k
    cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height,
1282
3.68k
                                        cm->subsampling_x, cm->subsampling_y,
1283
3.68k
#if CONFIG_VP9_HIGHBITDEPTH
1284
3.68k
                                        cm->use_highbitdepth,
1285
3.68k
#endif
1286
3.68k
                                        oxcf->lag_in_frames);
1287
75.9k
  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
75.9k
  if (vpx_realloc_frame_buffer(&cpi->tf_buffer, oxcf->width, oxcf->height,
1293
75.9k
                               cm->subsampling_x, cm->subsampling_y,
1294
75.9k
#if CONFIG_VP9_HIGHBITDEPTH
1295
75.9k
                               cm->use_highbitdepth,
1296
75.9k
#endif
1297
75.9k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1298
75.9k
                               NULL, NULL, NULL))
1299
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1300
0
                       "Failed to allocate temporal filter buffer");
1301
75.9k
}
1302
1303
78.9k
static void alloc_util_frame_buffers(VP9_COMP *cpi) {
1304
78.9k
  VP9_COMMON *const cm = &cpi->common;
1305
78.9k
  if (vpx_realloc_frame_buffer(&cpi->last_frame_uf, cm->width, cm->height,
1306
78.9k
                               cm->subsampling_x, cm->subsampling_y,
1307
78.9k
#if CONFIG_VP9_HIGHBITDEPTH
1308
78.9k
                               cm->use_highbitdepth,
1309
78.9k
#endif
1310
78.9k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1311
78.9k
                               NULL, NULL, NULL))
1312
28
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1313
28
                       "Failed to allocate last frame buffer");
1314
1315
78.9k
  if (vpx_realloc_frame_buffer(&cpi->scaled_source, cm->width, cm->height,
1316
78.9k
                               cm->subsampling_x, cm->subsampling_y,
1317
78.9k
#if CONFIG_VP9_HIGHBITDEPTH
1318
78.9k
                               cm->use_highbitdepth,
1319
78.9k
#endif
1320
78.9k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1321
78.9k
                               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
78.9k
  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
78.9k
  if (vpx_realloc_frame_buffer(&cpi->scaled_last_source, cm->width, cm->height,
1343
78.9k
                               cm->subsampling_x, cm->subsampling_y,
1344
78.9k
#if CONFIG_VP9_HIGHBITDEPTH
1345
78.9k
                               cm->use_highbitdepth,
1346
78.9k
#endif
1347
78.9k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1348
78.9k
                               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
78.9k
}
1373
1374
3.80k
static void alloc_context_buffers_ext(VP9_COMP *cpi) {
1375
3.80k
  VP9_COMMON *cm = &cpi->common;
1376
3.80k
  int mi_size = cm->mi_cols * cm->mi_rows;
1377
1378
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->mbmi_ext_base,
1379
3.80k
                  vpx_calloc(mi_size, sizeof(*cpi->mbmi_ext_base)));
1380
3.80k
}
1381
1382
3.80k
static void alloc_compressor_data(VP9_COMP *cpi) {
1383
3.80k
  VP9_COMMON *cm = &cpi->common;
1384
3.80k
  int sb_rows;
1385
1386
3.80k
  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
3.80k
  alloc_context_buffers_ext(cpi);
1392
1393
3.80k
  vpx_free(cpi->tile_tok[0][0]);
1394
1395
3.80k
  {
1396
3.80k
    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
3.80k
    CHECK_MEM_ERROR(&cm->error, cpi->tile_tok[0][0],
1405
3.80k
                    vpx_calloc((size_t)tokens, sizeof(*cpi->tile_tok[0][0])));
1406
3.80k
  }
1407
1408
3.80k
  sb_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> MI_BLOCK_SIZE_LOG2;
1409
3.80k
  vpx_free(cpi->tplist[0][0]);
1410
3.80k
  CHECK_MEM_ERROR(
1411
3.80k
      &cm->error, cpi->tplist[0][0],
1412
3.80k
      vpx_calloc(sb_rows * 4 * (1 << 6), sizeof(*cpi->tplist[0][0])));
1413
1414
3.80k
  vp9_setup_pc_tree(&cpi->common, &cpi->td);
1415
1416
3.80k
  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
3.80k
}
1425
1426
107k
void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
1427
107k
  cpi->framerate = framerate < 0.1 ? 30 : framerate;
1428
107k
  vp9_rc_update_framerate(cpi);
1429
107k
}
1430
1431
65.6k
static void set_tile_limits(VP9_COMP *cpi) {
1432
65.6k
  VP9_COMMON *const cm = &cpi->common;
1433
1434
65.6k
  int min_log2_tile_cols, max_log2_tile_cols;
1435
65.6k
  vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
1436
1437
65.6k
  cm->log2_tile_cols =
1438
65.6k
      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
65.6k
  const int sb64_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> 3;
1443
65.6k
  const int max_log2_tile_rows = (sb64_rows >= 4)   ? 2
1444
65.6k
                                 : (sb64_rows >= 2) ? 1
1445
58.3k
                                                    : 0;
1446
65.6k
  cm->log2_tile_rows = VPXMIN(cpi->oxcf.tile_rows, max_log2_tile_rows);
1447
1448
65.6k
  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
65.6k
}
1456
1457
32.8k
static void update_frame_size(VP9_COMP *cpi) {
1458
32.8k
  VP9_COMMON *const cm = &cpi->common;
1459
32.8k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
1460
1461
32.8k
  vp9_set_mb_mi(cm, cm->width, cm->height);
1462
32.8k
  vp9_init_context_buffers(cm);
1463
32.8k
  vp9_init_macroblockd(cm, xd, NULL);
1464
32.8k
  cpi->td.mb.mbmi_ext_base = cpi->mbmi_ext_base;
1465
32.8k
  memset(cpi->mbmi_ext_base, 0,
1466
32.8k
         cm->mi_rows * cm->mi_cols * sizeof(*cpi->mbmi_ext_base));
1467
1468
32.8k
  set_tile_limits(cpi);
1469
32.8k
}
1470
1471
3.80k
static void init_buffer_indices(VP9_COMP *cpi) {
1472
3.80k
  int ref_frame;
1473
1474
34.2k
  for (ref_frame = 0; ref_frame < REF_FRAMES; ++ref_frame)
1475
30.4k
    cpi->ref_fb_idx[ref_frame] = ref_frame;
1476
1477
3.80k
  cpi->lst_fb_idx = cpi->ref_fb_idx[LAST_FRAME - 1];
1478
3.80k
  cpi->gld_fb_idx = cpi->ref_fb_idx[GOLDEN_FRAME - 1];
1479
3.80k
  cpi->alt_fb_idx = cpi->ref_fb_idx[ALTREF_FRAME - 1];
1480
3.80k
}
1481
1482
3.80k
static void init_level_constraint(LevelConstraint *lc) {
1483
3.80k
  lc->level_index = -1;
1484
3.80k
  lc->max_cpb_size = INT_MAX;
1485
3.80k
  lc->max_frame_size = INT_MAX;
1486
3.80k
  lc->fail_flag = 0;
1487
3.80k
}
1488
1489
36.6k
static void set_level_constraint(LevelConstraint *ls, int8_t level_index) {
1490
36.6k
  vpx_clear_system_state();
1491
36.6k
  ls->level_index = level_index;
1492
36.6k
  if (level_index >= 0) {
1493
0
    ls->max_cpb_size = vp9_level_defs[level_index].max_cpb_size * (double)1000;
1494
0
  }
1495
36.6k
}
1496
1497
3.80k
static void init_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
1498
3.80k
  VP9_COMMON *const cm = &cpi->common;
1499
1500
3.80k
  cpi->oxcf = *oxcf;
1501
3.80k
  cpi->framerate = oxcf->init_framerate;
1502
3.80k
  cm->profile = oxcf->profile;
1503
3.80k
  cm->bit_depth = oxcf->bit_depth;
1504
3.80k
#if CONFIG_VP9_HIGHBITDEPTH
1505
3.80k
  cm->use_highbitdepth = oxcf->use_highbitdepth;
1506
3.80k
#endif
1507
3.80k
  cm->color_space = oxcf->color_space;
1508
3.80k
  cm->color_range = oxcf->color_range;
1509
1510
3.80k
  cpi->target_level = oxcf->target_level;
1511
3.80k
  cpi->keep_level_stats = oxcf->target_level != LEVEL_MAX;
1512
3.80k
  set_level_constraint(&cpi->level_constraint,
1513
3.80k
                       get_level_index(cpi->target_level));
1514
1515
3.80k
  cm->width = oxcf->width;
1516
3.80k
  cm->height = oxcf->height;
1517
3.80k
  alloc_compressor_data(cpi);
1518
1519
3.80k
  cpi->svc.temporal_layering_mode = oxcf->temporal_layering_mode;
1520
1521
  // Single thread case: use counts in common.
1522
3.80k
  cpi->td.counts = &cm->counts;
1523
1524
  // Spatial scalability.
1525
3.80k
  cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
1526
  // Temporal scalability.
1527
3.80k
  cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
1528
1529
3.80k
  if (cpi->svc.number_temporal_layers > 1 ||
1530
3.80k
      cpi->svc.number_spatial_layers > 1) {
1531
0
    vp9_init_layer_context(cpi);
1532
0
  }
1533
1534
  // change includes all joint functionality
1535
3.80k
  vp9_change_config(cpi, oxcf);
1536
1537
3.80k
  cpi->static_mb_pct = 0;
1538
3.80k
  cpi->ref_frame_flags = 0;
1539
1540
3.80k
  init_buffer_indices(cpi);
1541
1542
3.80k
  vp9_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
1543
3.80k
  cpi->fixed_qp_onepass = 0;
1544
3.80k
}
1545
1546
32.8k
void vp9_check_reset_rc_flag(VP9_COMP *cpi) {
1547
32.8k
  RATE_CONTROL *rc = &cpi->rc;
1548
1549
32.8k
  if (cpi->common.current_video_frame >
1550
32.8k
      (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
32.8k
}
1564
1565
32.8k
void vp9_set_rc_buffer_sizes(VP9_COMP *cpi) {
1566
32.8k
  RATE_CONTROL *rc = &cpi->rc;
1567
32.8k
  const VP9EncoderConfig *oxcf = &cpi->oxcf;
1568
1569
32.8k
  const int64_t bandwidth = oxcf->target_bandwidth;
1570
32.8k
  const int64_t starting = oxcf->starting_buffer_level_ms;
1571
32.8k
  const int64_t optimal = oxcf->optimal_buffer_level_ms;
1572
32.8k
  const int64_t maximum = oxcf->maximum_buffer_size_ms;
1573
1574
32.8k
  rc->starting_buffer_level = starting * bandwidth / 1000;
1575
32.8k
  rc->optimal_buffer_level =
1576
32.8k
      (optimal == 0) ? bandwidth / 8 : optimal * bandwidth / 1000;
1577
32.8k
  rc->maximum_buffer_size =
1578
32.8k
      (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
32.8k
  rc->bits_off_target = VPXMIN(rc->bits_off_target, rc->maximum_buffer_size);
1583
32.8k
  rc->buffer_level = VPXMIN(rc->buffer_level, rc->maximum_buffer_size);
1584
32.8k
}
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
36.6k
static void highbd_set_var_fns(VP9_COMP *const cpi) {
1733
36.6k
  VP9_COMMON *const cm = &cpi->common;
1734
36.6k
  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
36.6k
}
2014
#endif  // CONFIG_VP9_HIGHBITDEPTH
2015
2016
3.80k
static void realloc_segmentation_maps(VP9_COMP *cpi) {
2017
3.80k
  VP9_COMMON *const cm = &cpi->common;
2018
2019
  // Create the encoder segmentation map and set all entries to 0
2020
3.80k
  vpx_free(cpi->segmentation_map);
2021
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->segmentation_map,
2022
3.80k
                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
2023
2024
  // Create a map used for cyclic background refresh.
2025
3.80k
  if (cpi->cyclic_refresh) vp9_cyclic_refresh_free(cpi->cyclic_refresh);
2026
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->cyclic_refresh,
2027
3.80k
                  vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols));
2028
2029
  // Create a map used to mark inactive areas.
2030
3.80k
  vpx_free(cpi->active_map.map);
2031
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->active_map.map,
2032
3.80k
                  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
3.80k
  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
2037
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->coding_context.last_frame_seg_map_copy,
2038
3.80k
                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
2039
3.80k
}
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
32.8k
void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
2098
32.8k
  VP9_COMMON *const cm = &cpi->common;
2099
32.8k
  RATE_CONTROL *const rc = &cpi->rc;
2100
32.8k
  int last_w = cpi->oxcf.width;
2101
32.8k
  int last_h = cpi->oxcf.height;
2102
2103
32.8k
  vp9_init_quantizer(cpi);
2104
32.8k
  if (cm->profile != oxcf->profile) cm->profile = oxcf->profile;
2105
32.8k
  cm->bit_depth = oxcf->bit_depth;
2106
32.8k
  cm->color_space = oxcf->color_space;
2107
32.8k
  cm->color_range = oxcf->color_range;
2108
2109
32.8k
  cpi->target_level = oxcf->target_level;
2110
32.8k
  cpi->keep_level_stats = oxcf->target_level != LEVEL_MAX;
2111
32.8k
  set_level_constraint(&cpi->level_constraint,
2112
32.8k
                       get_level_index(cpi->target_level));
2113
2114
32.8k
  if (cm->profile <= PROFILE_1)
2115
32.8k
    assert(cm->bit_depth == VPX_BITS_8);
2116
0
  else
2117
32.8k
    assert(cm->bit_depth > VPX_BITS_8);
2118
2119
32.8k
  cpi->oxcf = *oxcf;
2120
32.8k
#if CONFIG_VP9_HIGHBITDEPTH
2121
32.8k
  cpi->td.mb.e_mbd.bd = (int)cm->bit_depth;
2122
32.8k
#endif  // CONFIG_VP9_HIGHBITDEPTH
2123
2124
32.8k
  if ((oxcf->pass == 0) && (oxcf->rc_mode == VPX_Q)) {
2125
1.56k
    rc->baseline_gf_interval = FIXED_GF_INTERVAL;
2126
31.2k
  } else {
2127
31.2k
    rc->baseline_gf_interval = (MIN_GF_INTERVAL + MAX_GF_INTERVAL) / 2;
2128
31.2k
  }
2129
2130
32.8k
  cpi->refresh_golden_frame = 0;
2131
32.8k
  cpi->refresh_last_frame = 1;
2132
32.8k
  cm->refresh_frame_context = 1;
2133
32.8k
  cm->reset_frame_context = 0;
2134
2135
32.8k
  vp9_reset_segment_features(&cm->seg);
2136
32.8k
  vp9_set_high_precision_mv(cpi, 0);
2137
2138
32.8k
  {
2139
32.8k
    int i;
2140
2141
295k
    for (i = 0; i < MAX_SEGMENTS; i++)
2142
262k
      cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
2143
32.8k
  }
2144
32.8k
  cpi->encode_breakout = cpi->oxcf.encode_breakout;
2145
2146
32.8k
  vp9_set_rc_buffer_sizes(cpi);
2147
2148
  // Set up frame rate and related parameters rate control values.
2149
32.8k
  vp9_new_framerate(cpi, cpi->framerate);
2150
2151
  // Set absolute upper and lower quality limits
2152
32.8k
  rc->worst_quality = cpi->oxcf.worst_allowed_q;
2153
32.8k
  rc->best_quality = cpi->oxcf.best_allowed_q;
2154
2155
32.8k
  cm->interp_filter = cpi->sf.default_interp_filter;
2156
2157
32.8k
  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
32.8k
  } else {
2161
32.8k
    cm->render_width = cpi->oxcf.width;
2162
32.8k
    cm->render_height = cpi->oxcf.height;
2163
32.8k
  }
2164
32.8k
  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
32.8k
  if (cpi->initial_width && cpi->initial_height &&
2171
29.0k
      (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
32.8k
  if (cm->current_video_frame == 0 || last_w != cpi->oxcf.width ||
2183
0
      last_h != cpi->oxcf.height)
2184
32.8k
    update_frame_size(cpi);
2185
2186
32.8k
  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
      if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
2214
0
        for (int sl = 0; sl < cpi->svc.number_spatial_layers; ++sl) {
2215
0
          const int layer =
2216
0
              LAYER_IDS_TO_IDX(sl, 0, cpi->svc.number_temporal_layers);
2217
0
          LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer];
2218
0
          lc->sb_index = 0;
2219
0
          lc->actual_num_seg1_blocks = 0;
2220
0
          lc->actual_num_seg2_blocks = 0;
2221
0
          lc->counter_encode_maxq_scene_change = 0;
2222
0
          vpx_free(lc->map);
2223
0
          CHECK_MEM_ERROR(&cm->error, lc->map,
2224
0
                          vpx_calloc(svc_alloc_mi_area, sizeof(*lc->map)));
2225
0
          vpx_free(lc->last_coded_q_map);
2226
0
          CHECK_MEM_ERROR(
2227
0
              &cm->error, lc->last_coded_q_map,
2228
0
              vpx_malloc(svc_alloc_mi_area * sizeof(*lc->last_coded_q_map)));
2229
0
          memset(lc->last_coded_q_map, MAXQ, svc_alloc_mi_area);
2230
0
          vpx_free(lc->consec_zero_mv);
2231
0
          CHECK_MEM_ERROR(
2232
0
              &cm->error, lc->consec_zero_mv,
2233
0
              vpx_calloc(svc_alloc_mi_area, sizeof(*lc->consec_zero_mv)));
2234
0
        }
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
32.8k
  if ((cpi->svc.number_temporal_layers > 1) ||
2254
32.8k
      ((cpi->svc.number_temporal_layers > 1 ||
2255
32.8k
        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
32.8k
  vp9_check_reset_rc_flag(cpi);
2262
2263
32.8k
  cpi->alt_ref_source = NULL;
2264
32.8k
  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
32.8k
  set_tile_limits(cpi);
2273
2274
32.8k
  cpi->ext_refresh_frame_flags_pending = 0;
2275
32.8k
  cpi->ext_refresh_frame_context_pending = 0;
2276
2277
32.8k
#if CONFIG_VP9_HIGHBITDEPTH
2278
32.8k
  highbd_set_var_fns(cpi);
2279
32.8k
#endif
2280
2281
32.8k
  vp9_set_row_mt(cpi);
2282
32.8k
}
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
3.80k
static void cal_nmvjointsadcost(int *mvjointsadcost) {
2305
  /*********************************************************************
2306
   * Warning: Read the comments above before modifying this function   *
2307
   *********************************************************************/
2308
3.80k
  mvjointsadcost[0] = 600;
2309
3.80k
  mvjointsadcost[1] = 300;
2310
3.80k
  mvjointsadcost[2] = 300;
2311
3.80k
  mvjointsadcost[3] = 300;
2312
3.80k
}
2313
2314
3.80k
static void cal_nmvsadcosts(int *mvsadcost[2]) {
2315
  /*********************************************************************
2316
   * Warning: Read the comments above before modifying this function   *
2317
   *********************************************************************/
2318
3.80k
  int i = 1;
2319
2320
3.80k
  mvsadcost[0][0] = 0;
2321
3.80k
  mvsadcost[1][0] = 0;
2322
2323
62.3M
  do {
2324
62.3M
    double z = 256 * (2 * (log2f(8 * i) + .6));
2325
62.3M
    mvsadcost[0][i] = (int)z;
2326
62.3M
    mvsadcost[1][i] = (int)z;
2327
62.3M
    mvsadcost[0][-i] = (int)z;
2328
62.3M
    mvsadcost[1][-i] = (int)z;
2329
62.3M
  } while (++i <= MV_MAX);
2330
3.80k
}
2331
2332
3.80k
static void cal_nmvsadcosts_hp(int *mvsadcost[2]) {
2333
3.80k
  int i = 1;
2334
2335
3.80k
  mvsadcost[0][0] = 0;
2336
3.80k
  mvsadcost[1][0] = 0;
2337
2338
62.3M
  do {
2339
62.3M
    double z = 256 * (2 * (log2f(8 * i) + .6));
2340
62.3M
    mvsadcost[0][i] = (int)z;
2341
62.3M
    mvsadcost[1][i] = (int)z;
2342
62.3M
    mvsadcost[0][-i] = (int)z;
2343
62.3M
    mvsadcost[1][-i] = (int)z;
2344
62.3M
  } while (++i <= MV_MAX);
2345
3.80k
}
2346
2347
3.80k
static void init_ref_frame_bufs(VP9_COMMON *cm) {
2348
3.80k
  int i;
2349
3.80k
  BufferPool *const pool = cm->buffer_pool;
2350
3.80k
  cm->new_fb_idx = INVALID_IDX;
2351
34.2k
  for (i = 0; i < REF_FRAMES; ++i) {
2352
30.4k
    cm->ref_frame_map[i] = INVALID_IDX;
2353
30.4k
  }
2354
49.4k
  for (i = 0; i < FRAME_BUFFERS; ++i) {
2355
45.6k
    pool->frame_bufs[i].ref_count = 0;
2356
45.6k
  }
2357
3.80k
}
2358
2359
static void update_initial_width(VP9_COMP *cpi, int use_highbitdepth,
2360
75.9k
                                 int subsampling_x, int subsampling_y) {
2361
75.9k
  VP9_COMMON *const cm = &cpi->common;
2362
#if !CONFIG_VP9_HIGHBITDEPTH
2363
  (void)use_highbitdepth;
2364
  assert(use_highbitdepth == 0);
2365
#endif
2366
2367
75.9k
  if (!cpi->initial_width ||
2368
75.9k
#if CONFIG_VP9_HIGHBITDEPTH
2369
75.9k
      cm->use_highbitdepth != use_highbitdepth ||
2370
75.9k
#endif
2371
75.9k
      cm->subsampling_x != subsampling_x ||
2372
72.2k
      cm->subsampling_y != subsampling_y) {
2373
3.71k
    cm->subsampling_x = subsampling_x;
2374
3.71k
    cm->subsampling_y = subsampling_y;
2375
3.71k
#if CONFIG_VP9_HIGHBITDEPTH
2376
3.71k
    cm->use_highbitdepth = use_highbitdepth;
2377
3.71k
#endif
2378
3.71k
    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
3.71k
    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
3.71k
    cpi->initial_mbs = cm->MBs;
2391
3.71k
  }
2392
75.9k
}
2393
2394
VP9_COMP *vp9_create_compressor(const VP9EncoderConfig *oxcf,
2395
3.80k
                                BufferPool *const pool) {
2396
3.80k
  unsigned int i;
2397
3.80k
  VP9_COMP *volatile const cpi = vpx_memalign(32, sizeof(*cpi));
2398
3.80k
  VP9_COMMON *volatile const cm = cpi != NULL ? &cpi->common : NULL;
2399
2400
3.80k
  if (!cm) return NULL;
2401
2402
3.80k
  vp9_zero(*cpi);
2403
2404
3.80k
  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
3.80k
  cm->error.setjmp = 1;
2411
3.80k
  cm->alloc_mi = vp9_enc_alloc_mi;
2412
3.80k
  cm->free_mi = vp9_enc_free_mi;
2413
3.80k
  cm->setup_mi = vp9_enc_setup_mi;
2414
2415
3.80k
  CHECK_MEM_ERROR(&cm->error, cm->fc,
2416
3.80k
                  (FRAME_CONTEXT *)vpx_calloc(1, sizeof(*cm->fc)));
2417
3.80k
  CHECK_MEM_ERROR(
2418
3.80k
      &cm->error, cm->frame_contexts,
2419
3.80k
      (FRAME_CONTEXT *)vpx_calloc(FRAME_CONTEXTS, sizeof(*cm->frame_contexts)));
2420
2421
3.80k
  cpi->compute_frame_low_motion_onepass = 1;
2422
3.80k
  cpi->use_svc = 0;
2423
3.80k
  cpi->resize_state = ORIG;
2424
3.80k
  cpi->external_resize = 0;
2425
3.80k
  cpi->resize_avg_qp = 0;
2426
3.80k
  cpi->resize_buffer_underflow = 0;
2427
3.80k
  cpi->use_skin_detection = 0;
2428
3.80k
  cpi->common.buffer_pool = pool;
2429
3.80k
  init_ref_frame_bufs(cm);
2430
2431
3.80k
  cpi->force_update_segmentation = 0;
2432
2433
3.80k
  init_config(cpi, oxcf);
2434
3.80k
  cpi->frame_info = vp9_get_frame_info(oxcf);
2435
2436
3.80k
  vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc);
2437
3.80k
  vp9_init_rd_parameters(cpi);
2438
2439
3.80k
  init_frame_indexes(cm);
2440
3.80k
  cpi->initial_width = cpi->oxcf.width;
2441
3.80k
  cpi->initial_height = cpi->oxcf.height;
2442
3.80k
  cpi->tile_data = NULL;
2443
2444
3.80k
  realloc_segmentation_maps(cpi);
2445
2446
3.80k
  CHECK_MEM_ERROR(
2447
3.80k
      &cm->error, cpi->skin_map,
2448
3.80k
      vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->skin_map)));
2449
2450
3.80k
#if !CONFIG_REALTIME_ONLY
2451
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->alt_ref_aq, vp9_alt_ref_aq_create());
2452
3.80k
#endif
2453
2454
3.80k
  CHECK_MEM_ERROR(
2455
3.80k
      &cm->error, cpi->consec_zero_mv,
2456
3.80k
      vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->consec_zero_mv)));
2457
2458
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts[0],
2459
3.80k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[0])));
2460
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts[1],
2461
3.80k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[1])));
2462
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts_hp[0],
2463
3.80k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[0])));
2464
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts_hp[1],
2465
3.80k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[1])));
2466
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts[0],
2467
3.80k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[0])));
2468
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts[1],
2469
3.80k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[1])));
2470
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts_hp[0],
2471
3.80k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[0])));
2472
3.80k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts_hp[1],
2473
3.80k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[1])));
2474
2475
98.9k
  for (i = 0; i < (sizeof(cpi->mbgraph_stats) / sizeof(cpi->mbgraph_stats[0]));
2476
95.1k
       i++) {
2477
95.1k
    CHECK_MEM_ERROR(
2478
95.1k
        &cm->error, cpi->mbgraph_stats[i].mb_stats,
2479
95.1k
        vpx_calloc(cm->MBs * sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
2480
95.1k
  }
2481
2482
3.80k
  cpi->refresh_alt_ref_frame = 0;
2483
3.80k
  cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
2484
2485
3.80k
  init_level_info(&cpi->level_info);
2486
3.80k
  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
3.80k
  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
3.80k
  cal_nmvjointsadcost(cpi->td.mb.nmvjointsadcost);
2539
3.80k
  cpi->td.mb.nmvcost[0] = &cpi->nmvcosts[0][MV_MAX];
2540
3.80k
  cpi->td.mb.nmvcost[1] = &cpi->nmvcosts[1][MV_MAX];
2541
3.80k
  cpi->td.mb.nmvsadcost[0] = &cpi->nmvsadcosts[0][MV_MAX];
2542
3.80k
  cpi->td.mb.nmvsadcost[1] = &cpi->nmvsadcosts[1][MV_MAX];
2543
3.80k
  cal_nmvsadcosts(cpi->td.mb.nmvsadcost);
2544
2545
3.80k
  cpi->td.mb.nmvcost_hp[0] = &cpi->nmvcosts_hp[0][MV_MAX];
2546
3.80k
  cpi->td.mb.nmvcost_hp[1] = &cpi->nmvcosts_hp[1][MV_MAX];
2547
3.80k
  cpi->td.mb.nmvsadcost_hp[0] = &cpi->nmvsadcosts_hp[0][MV_MAX];
2548
3.80k
  cpi->td.mb.nmvsadcost_hp[1] = &cpi->nmvsadcosts_hp[1][MV_MAX];
2549
3.80k
  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
3.80k
  cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
2574
2575
3.80k
  {
2576
3.80k
    vpx_codec_err_t codec_status = vp9_extrc_init(&cpi->ext_ratectrl);
2577
3.80k
    if (codec_status != VPX_CODEC_OK) {
2578
0
      vpx_internal_error(&cm->error, codec_status, "vp9_extrc_init() failed");
2579
0
    }
2580
3.80k
  }
2581
2582
3.80k
#if !CONFIG_REALTIME_ONLY
2583
3.80k
  if (oxcf->pass == 1) {
2584
0
    vp9_init_first_pass(cpi);
2585
3.80k
  } 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
3.80k
#endif  // !CONFIG_REALTIME_ONLY
2648
2649
3.80k
  cpi->mb_wiener_var_cols = 0;
2650
3.80k
  cpi->mb_wiener_var_rows = 0;
2651
3.80k
  cpi->mb_wiener_variance = NULL;
2652
3.80k
  cpi->mi_ssim_rdmult_scaling_factors = NULL;
2653
3.80k
  cpi->mi_ssim_rdmult_scaling_factors_rows = 0;
2654
3.80k
  cpi->mi_ssim_rdmult_scaling_factors_cols = 0;
2655
2656
3.80k
  vp9_set_speed_features_framesize_independent(cpi, oxcf->speed);
2657
3.80k
  vp9_set_speed_features_framesize_dependent(cpi, oxcf->speed);
2658
2659
3.80k
  cpi->kmeans_data_arr_alloc = 0;
2660
#if CONFIG_NON_GREEDY_MV
2661
  cpi->tpl_ready = 0;
2662
#endif  // CONFIG_NON_GREEDY_MV
2663
194k
  for (i = 0; i < MAX_ARF_GOP_SIZE; ++i) {
2664
190k
    cpi->tpl_stats[i].tpl_stats_ptr = NULL;
2665
190k
  }
2666
2667
3.80k
#define BFP(BT, SDF, SDSF, SDAF, VF, SVF, SVAF, SDX4DF, SDSX4DF) \
2668
49.4k
  cpi->fn_ptr[BT].sdf = SDF;                                     \
2669
49.4k
  cpi->fn_ptr[BT].sdsf = SDSF;                                   \
2670
49.4k
  cpi->fn_ptr[BT].sdaf = SDAF;                                   \
2671
49.4k
  cpi->fn_ptr[BT].vf = VF;                                       \
2672
49.4k
  cpi->fn_ptr[BT].svf = SVF;                                     \
2673
49.4k
  cpi->fn_ptr[BT].svaf = SVAF;                                   \
2674
49.4k
  cpi->fn_ptr[BT].sdx4df = SDX4DF;                               \
2675
49.4k
  cpi->fn_ptr[BT].sdsx4df = SDSX4DF;
2676
2677
3.80k
  BFP(BLOCK_32X16, vpx_sad32x16, vpx_sad_skip_32x16, vpx_sad32x16_avg,
2678
3.80k
      vpx_variance32x16, vpx_sub_pixel_variance32x16,
2679
3.80k
      vpx_sub_pixel_avg_variance32x16, vpx_sad32x16x4d, vpx_sad_skip_32x16x4d)
2680
2681
3.80k
  BFP(BLOCK_16X32, vpx_sad16x32, vpx_sad_skip_16x32, vpx_sad16x32_avg,
2682
3.80k
      vpx_variance16x32, vpx_sub_pixel_variance16x32,
2683
3.80k
      vpx_sub_pixel_avg_variance16x32, vpx_sad16x32x4d, vpx_sad_skip_16x32x4d)
2684
2685
3.80k
  BFP(BLOCK_64X32, vpx_sad64x32, vpx_sad_skip_64x32, vpx_sad64x32_avg,
2686
3.80k
      vpx_variance64x32, vpx_sub_pixel_variance64x32,
2687
3.80k
      vpx_sub_pixel_avg_variance64x32, vpx_sad64x32x4d, vpx_sad_skip_64x32x4d)
2688
2689
3.80k
  BFP(BLOCK_32X64, vpx_sad32x64, vpx_sad_skip_32x64, vpx_sad32x64_avg,
2690
3.80k
      vpx_variance32x64, vpx_sub_pixel_variance32x64,
2691
3.80k
      vpx_sub_pixel_avg_variance32x64, vpx_sad32x64x4d, vpx_sad_skip_32x64x4d)
2692
2693
3.80k
  BFP(BLOCK_32X32, vpx_sad32x32, vpx_sad_skip_32x32, vpx_sad32x32_avg,
2694
3.80k
      vpx_variance32x32, vpx_sub_pixel_variance32x32,
2695
3.80k
      vpx_sub_pixel_avg_variance32x32, vpx_sad32x32x4d, vpx_sad_skip_32x32x4d)
2696
2697
3.80k
  BFP(BLOCK_64X64, vpx_sad64x64, vpx_sad_skip_64x64, vpx_sad64x64_avg,
2698
3.80k
      vpx_variance64x64, vpx_sub_pixel_variance64x64,
2699
3.80k
      vpx_sub_pixel_avg_variance64x64, vpx_sad64x64x4d, vpx_sad_skip_64x64x4d)
2700
2701
3.80k
  BFP(BLOCK_16X16, vpx_sad16x16, vpx_sad_skip_16x16, vpx_sad16x16_avg,
2702
3.80k
      vpx_variance16x16, vpx_sub_pixel_variance16x16,
2703
3.80k
      vpx_sub_pixel_avg_variance16x16, vpx_sad16x16x4d, vpx_sad_skip_16x16x4d)
2704
2705
3.80k
  BFP(BLOCK_16X8, vpx_sad16x8, vpx_sad_skip_16x8, vpx_sad16x8_avg,
2706
3.80k
      vpx_variance16x8, vpx_sub_pixel_variance16x8,
2707
3.80k
      vpx_sub_pixel_avg_variance16x8, vpx_sad16x8x4d, vpx_sad_skip_16x8x4d)
2708
2709
3.80k
  BFP(BLOCK_8X16, vpx_sad8x16, vpx_sad_skip_8x16, vpx_sad8x16_avg,
2710
3.80k
      vpx_variance8x16, vpx_sub_pixel_variance8x16,
2711
3.80k
      vpx_sub_pixel_avg_variance8x16, vpx_sad8x16x4d, vpx_sad_skip_8x16x4d)
2712
2713
3.80k
  BFP(BLOCK_8X8, vpx_sad8x8, vpx_sad_skip_8x8, vpx_sad8x8_avg, vpx_variance8x8,
2714
3.80k
      vpx_sub_pixel_variance8x8, vpx_sub_pixel_avg_variance8x8, vpx_sad8x8x4d,
2715
3.80k
      vpx_sad_skip_8x8x4d)
2716
2717
3.80k
  BFP(BLOCK_8X4, vpx_sad8x4, vpx_sad_skip_8x4, vpx_sad8x4_avg, vpx_variance8x4,
2718
3.80k
      vpx_sub_pixel_variance8x4, vpx_sub_pixel_avg_variance8x4, vpx_sad8x4x4d,
2719
3.80k
      vpx_sad_skip_8x4x4d)
2720
2721
3.80k
  BFP(BLOCK_4X8, vpx_sad4x8, vpx_sad_skip_4x8, vpx_sad4x8_avg, vpx_variance4x8,
2722
3.80k
      vpx_sub_pixel_variance4x8, vpx_sub_pixel_avg_variance4x8, vpx_sad4x8x4d,
2723
3.80k
      vpx_sad_skip_4x8x4d)
2724
2725
3.80k
  BFP(BLOCK_4X4, vpx_sad4x4, vpx_sad_skip_4x4, vpx_sad4x4_avg, vpx_variance4x4,
2726
3.80k
      vpx_sub_pixel_variance4x4, vpx_sub_pixel_avg_variance4x4, vpx_sad4x4x4d,
2727
3.80k
      vpx_sad_skip_4x4x4d)
2728
2729
3.80k
#if CONFIG_VP9_HIGHBITDEPTH
2730
3.80k
  highbd_set_var_fns(cpi);
2731
3.80k
#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
3.80k
  vp9_init_quantizer(cpi);
2739
2740
3.80k
  vp9_loop_filter_init(cm);
2741
2742
  // Set up the unit scaling factor used during motion search.
2743
3.80k
#if CONFIG_VP9_HIGHBITDEPTH
2744
3.80k
  vp9_setup_scale_factors_for_frame(&cpi->me_sf, cm->width, cm->height,
2745
3.80k
                                    cm->width, cm->height,
2746
3.80k
                                    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
3.80k
  cpi->td.mb.me_sf = &cpi->me_sf;
2752
2753
3.80k
  cm->error.setjmp = 0;
2754
2755
3.80k
  return cpi;
2756
3.80k
}
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
3.84k
void vp9_remove_compressor(VP9_COMP *cpi) {
2766
3.84k
  VP9_COMMON *cm;
2767
3.84k
  unsigned int i;
2768
2769
3.84k
  if (!cpi) return;
2770
2771
#if CONFIG_INTERNAL_STATS
2772
  vpx_free(cpi->ssim_vars);
2773
#endif
2774
2775
3.80k
  cm = &cpi->common;
2776
3.80k
  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
3.68k
  }
2866
2867
#if CONFIG_VP9_TEMPORAL_DENOISING
2868
  vp9_denoiser_free(&(cpi->denoiser));
2869
#endif
2870
2871
3.80k
  if (cpi->kmeans_data_arr_alloc) {
2872
3.68k
#if CONFIG_MULTITHREAD
2873
3.68k
    pthread_mutex_destroy(&cpi->kmeans_mutex);
2874
3.68k
#endif
2875
3.68k
    vpx_free(cpi->kmeans_data_arr);
2876
3.68k
  }
2877
2878
3.80k
  vp9_free_tpl_buffer(cpi);
2879
2880
3.80k
  vp9_loop_filter_dealloc(&cpi->lf_row_sync);
2881
3.80k
  vp9_bitstream_encode_tiles_buffer_dealloc(cpi);
2882
3.80k
  vp9_row_mt_mem_dealloc(cpi);
2883
3.80k
  vp9_encode_free_mt_data(cpi);
2884
2885
3.80k
#if !CONFIG_REALTIME_ONLY
2886
3.80k
  vp9_alt_ref_aq_destroy(cpi->alt_ref_aq);
2887
3.80k
#endif
2888
2889
3.80k
  dealloc_compressor_data(cpi);
2890
2891
98.9k
  for (i = 0; i < sizeof(cpi->mbgraph_stats) / sizeof(cpi->mbgraph_stats[0]);
2892
95.1k
       ++i) {
2893
95.1k
    vpx_free(cpi->mbgraph_stats[i].mb_stats);
2894
95.1k
  }
2895
2896
3.80k
  vp9_extrc_delete(&cpi->ext_ratectrl);
2897
2898
  // Help detect use after free of the error detail string.
2899
3.80k
  memset(cm->error.detail, 'A', sizeof(cm->error.detail) - 1);
2900
3.80k
  cm->error.detail[sizeof(cm->error.detail) - 1] = '\0';
2901
2902
3.80k
  vp9_remove_common(cm);
2903
3.80k
  vp9_free_ref_frame_buffers(cm->buffer_pool);
2904
#if CONFIG_VP9_POSTPROC
2905
  vp9_free_postproc_buffers(cm);
2906
#endif
2907
3.80k
  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
3.80k
}
2939
2940
75.1k
int vp9_get_psnr(const VP9_COMP *cpi, PSNR_STATS *psnr) {
2941
75.1k
  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
75.1k
  } else {
2952
75.1k
    vp9_zero(*psnr);
2953
75.1k
    return 0;
2954
75.1k
  }
2955
75.1k
}
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
75.1k
static void update_ref_frames(VP9_COMP *cpi) {
3288
75.1k
  VP9_COMMON *const cm = &cpi->common;
3289
75.1k
  BufferPool *const pool = cm->buffer_pool;
3290
75.1k
  GF_GROUP *const gf_group = &cpi->twopass.gf_group;
3291
3292
75.1k
  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
75.1k
  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
75.1k
  } 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
75.1k
  if (cm->frame_type == KEY_FRAME) {
3335
15.2k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
3336
15.2k
               cm->new_fb_idx);
3337
15.2k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->alt_fb_idx],
3338
15.2k
               cm->new_fb_idx);
3339
59.9k
  } 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
0
    int tmp;
3349
3350
0
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->alt_fb_idx],
3351
0
               cm->new_fb_idx);
3352
3353
0
    tmp = cpi->alt_fb_idx;
3354
0
    cpi->alt_fb_idx = cpi->gld_fb_idx;
3355
0
    cpi->gld_fb_idx = tmp;
3356
59.9k
  } else { /* For non key/golden frames */
3357
59.9k
    if (cpi->refresh_alt_ref_frame) {
3358
0
      int arf_idx = gf_group->top_arf_idx;
3359
3360
      // Push new ARF into stack.
3361
0
      stack_push(gf_group->arf_index_stack, cpi->alt_fb_idx,
3362
0
                 gf_group->stack_size);
3363
0
      ++gf_group->stack_size;
3364
3365
0
      assert(arf_idx < REF_FRAMES);
3366
3367
0
      ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[arf_idx], cm->new_fb_idx);
3368
0
      memcpy(cpi->interp_filter_selected[ALTREF_FRAME],
3369
0
             cpi->interp_filter_selected[0],
3370
0
             sizeof(cpi->interp_filter_selected[0]));
3371
3372
0
      cpi->alt_fb_idx = arf_idx;
3373
0
    }
3374
3375
59.9k
    if (cpi->refresh_golden_frame) {
3376
4.43k
      ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
3377
4.43k
                 cm->new_fb_idx);
3378
4.43k
      if (!cpi->rc.is_src_frame_alt_ref)
3379
4.43k
        memcpy(cpi->interp_filter_selected[GOLDEN_FRAME],
3380
4.43k
               cpi->interp_filter_selected[0],
3381
4.43k
               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
4.43k
    }
3387
59.9k
  }
3388
3389
75.1k
  if (cpi->refresh_last_frame) {
3390
75.1k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->lst_fb_idx],
3391
75.1k
               cm->new_fb_idx);
3392
75.1k
    if (!cpi->rc.is_src_frame_alt_ref)
3393
75.1k
      memcpy(cpi->interp_filter_selected[LAST_FRAME],
3394
75.1k
             cpi->interp_filter_selected[0],
3395
75.1k
             sizeof(cpi->interp_filter_selected[0]));
3396
75.1k
  }
3397
3398
75.1k
  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
75.1k
}
3404
3405
75.1k
void vp9_update_reference_frames(VP9_COMP *cpi) {
3406
75.1k
  update_ref_frames(cpi);
3407
3408
#if CONFIG_VP9_TEMPORAL_DENOISING
3409
  vp9_denoiser_update_ref_frame(cpi);
3410
#endif
3411
3412
75.1k
  if (is_one_pass_svc(cpi)) vp9_svc_update_ref_frame(cpi);
3413
75.1k
}
3414
3415
75.2k
static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
3416
75.2k
  MACROBLOCKD *xd = &cpi->td.mb.e_mbd;
3417
75.2k
  struct loopfilter *lf = &cm->lf;
3418
75.2k
  int is_reference_frame =
3419
75.2k
      (cm->frame_type == KEY_FRAME || cpi->refresh_last_frame ||
3420
0
       cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
3421
75.2k
  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
75.2k
  if (cm->show_existing_frame) {
3427
0
    lf->filter_level = 0;
3428
0
    return;
3429
0
  }
3430
3431
75.2k
  if (cpi->loopfilter_ctrl == NO_LOOPFILTER ||
3432
75.2k
      (!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
75.2k
  if (xd->lossless) {
3439
15.7k
    lf->filter_level = 0;
3440
15.7k
    lf->last_filt_level = 0;
3441
59.4k
  } else {
3442
#if CONFIG_INTERNAL_STATS
3443
    struct vpx_usec_timer timer;
3444
#endif
3445
3446
59.4k
    vpx_clear_system_state();
3447
3448
#if CONFIG_INTERNAL_STATS
3449
    vpx_usec_timer_start(&timer);
3450
#endif
3451
3452
59.4k
    if (!cpi->rc.is_src_frame_alt_ref) {
3453
59.4k
      if ((cpi->common.frame_type == KEY_FRAME) &&
3454
13.4k
          (!cpi->rc.this_key_frame_forced)) {
3455
9.16k
        lf->last_filt_level = 0;
3456
9.16k
      }
3457
59.4k
      vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
3458
59.4k
      lf->last_filt_level = lf->filter_level;
3459
59.4k
    } else {
3460
0
      lf->filter_level = 0;
3461
0
    }
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
59.4k
  }
3468
3469
75.2k
  if (lf->filter_level > 0 && is_reference_frame) {
3470
38.7k
    vp9_build_mask_frame(cm, lf->filter_level, 0);
3471
3472
38.7k
    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
38.7k
    else
3477
38.7k
      vp9_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0);
3478
38.7k
  }
3479
3480
75.2k
  vpx_extend_frame_inner_borders(cm->frame_to_show);
3481
75.2k
}
3482
3483
59.9k
void vp9_scale_references(VP9_COMP *cpi) {
3484
59.9k
  VP9_COMMON *cm = &cpi->common;
3485
59.9k
  MV_REFERENCE_FRAME ref_frame;
3486
59.9k
  const VP9_REFFRAME ref_mask[3] = { VP9_LAST_FLAG, VP9_GOLD_FLAG,
3487
59.9k
                                     VP9_ALT_FLAG };
3488
3489
239k
  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
179k
    if (cpi->ref_frame_flags & ref_mask[ref_frame - 1]) {
3492
150k
      BufferPool *const pool = cm->buffer_pool;
3493
150k
      const YV12_BUFFER_CONFIG *const ref =
3494
150k
          get_ref_frame_buffer(cpi, ref_frame);
3495
3496
150k
      if (ref == NULL) {
3497
0
        cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
3498
0
        continue;
3499
0
      }
3500
3501
150k
      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
150k
      } else {
3540
150k
        int buf_idx;
3541
150k
        RefCntBuffer *buf = NULL;
3542
150k
        if (cpi->oxcf.pass == 0 && !cpi->use_svc) {
3543
          // Check for release of scaled reference.
3544
150k
          buf_idx = cpi->scaled_ref_idx[ref_frame - 1];
3545
150k
          if (buf_idx != INVALID_IDX) {
3546
0
            buf = &pool->frame_bufs[buf_idx];
3547
0
            --buf->ref_count;
3548
0
            cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
3549
0
          }
3550
150k
        }
3551
150k
        buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
3552
150k
        buf = &pool->frame_bufs[buf_idx];
3553
150k
        buf->buf.y_crop_width = ref->y_crop_width;
3554
150k
        buf->buf.y_crop_height = ref->y_crop_height;
3555
150k
        cpi->scaled_ref_idx[ref_frame - 1] = buf_idx;
3556
150k
        ++buf->ref_count;
3557
150k
      }
3558
150k
    } else {
3559
29.0k
      if (cpi->oxcf.pass != 0 || cpi->use_svc)
3560
0
        cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
3561
29.0k
    }
3562
179k
  }
3563
59.9k
}
3564
3565
59.9k
static void release_scaled_references(VP9_COMP *cpi) {
3566
59.9k
  VP9_COMMON *cm = &cpi->common;
3567
59.9k
  int i;
3568
59.9k
  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
59.9k
    int refresh[3];
3572
59.9k
    refresh[0] = (cpi->refresh_last_frame) ? 1 : 0;
3573
59.9k
    refresh[1] = (cpi->refresh_golden_frame) ? 1 : 0;
3574
59.9k
    refresh[2] = (cpi->refresh_alt_ref_frame) ? 1 : 0;
3575
239k
    for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) {
3576
179k
      const int idx = cpi->scaled_ref_idx[i - 1];
3577
179k
      if (idx != INVALID_IDX) {
3578
150k
        RefCntBuffer *const buf = &cm->buffer_pool->frame_bufs[idx];
3579
150k
        const YV12_BUFFER_CONFIG *const ref = get_ref_frame_buffer(cpi, i);
3580
150k
        if (refresh[i - 1] || (buf->buf.y_crop_width == ref->y_crop_width &&
3581
150k
                               buf->buf.y_crop_height == ref->y_crop_height)) {
3582
150k
          --buf->ref_count;
3583
150k
          cpi->scaled_ref_idx[i - 1] = INVALID_IDX;
3584
150k
        }
3585
150k
      }
3586
179k
    }
3587
59.9k
  } 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
59.9k
}
3598
3599
static void full_to_model_count(unsigned int *model_count,
3600
39.6M
                                unsigned int *full_count) {
3601
39.6M
  int n;
3602
39.6M
  model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
3603
39.6M
  model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
3604
39.6M
  model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
3605
357M
  for (n = THREE_TOKEN; n < EOB_TOKEN; ++n)
3606
317M
    model_count[TWO_TOKEN] += full_count[n];
3607
39.6M
  model_count[EOB_MODEL_TOKEN] = full_count[EOB_TOKEN];
3608
39.6M
}
3609
3610
static void full_to_model_counts(vp9_coeff_count_model *model_count,
3611
300k
                                 vp9_coeff_count *full_count) {
3612
300k
  int i, j, k, l;
3613
3614
901k
  for (i = 0; i < PLANE_TYPES; ++i)
3615
1.80M
    for (j = 0; j < REF_TYPES; ++j)
3616
8.41M
      for (k = 0; k < COEF_BANDS; ++k)
3617
46.8M
        for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l)
3618
39.6M
          full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]);
3619
300k
}
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
75.2k
static void set_size_independent_vars(VP9_COMP *cpi) {
3768
75.2k
  vp9_set_speed_features_framesize_independent(cpi, cpi->oxcf.speed);
3769
75.2k
  vp9_set_rd_speed_thresholds(cpi);
3770
75.2k
  vp9_set_rd_speed_thresholds_sub8x8(cpi);
3771
75.2k
  cpi->common.interp_filter = cpi->sf.default_interp_filter;
3772
75.2k
}
3773
3774
static void set_size_dependent_vars(VP9_COMP *cpi, int *q, int *bottom_index,
3775
75.2k
                                    int *top_index) {
3776
75.2k
  VP9_COMMON *const cm = &cpi->common;
3777
3778
  // Setup variables that depend on the dimensions of the frame.
3779
75.2k
  vp9_set_speed_features_framesize_dependent(cpi, cpi->oxcf.speed);
3780
3781
  // Decide q and q bounds.
3782
75.2k
  *q = vp9_rc_pick_q_and_bounds(cpi, bottom_index, top_index);
3783
3784
75.2k
  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
75.2k
  if (cpi->use_svc) {
3790
0
    cpi->svc.base_qindex[cpi->svc.spatial_layer_id] = *q;
3791
0
  }
3792
3793
75.2k
  if (!frame_is_intra_only(cm)) {
3794
59.9k
    vp9_set_high_precision_mv(cpi, (*q) < HIGH_PRECISION_MV_QTHRESH);
3795
59.9k
  }
3796
3797
75.2k
#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
75.2k
  if (cpi->oxcf.pass == 2 && cpi->sf.static_segmentation)
3803
0
    configure_static_seg_features(cpi);
3804
75.2k
#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
75.2k
}
3832
3833
150k
static void init_motion_estimation(VP9_COMP *cpi) {
3834
150k
  int y_stride = cpi->scaled_source.y_stride;
3835
3836
150k
  if (cpi->sf.mv.search_method == NSTEP) {
3837
150k
    vp9_init3smotion_compensation(&cpi->ss_cfg, y_stride);
3838
150k
  } else if (cpi->sf.mv.search_method == DIAMOND) {
3839
0
    vp9_init_dsmotion_compensation(&cpi->ss_cfg, y_stride);
3840
0
  }
3841
150k
}
3842
3843
75.2k
static void set_frame_size(VP9_COMP *cpi) {
3844
75.2k
  int ref_frame;
3845
75.2k
  VP9_COMMON *const cm = &cpi->common;
3846
75.2k
  VP9EncoderConfig *const oxcf = &cpi->oxcf;
3847
75.2k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
3848
3849
75.2k
#if !CONFIG_REALTIME_ONLY
3850
75.2k
  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
75.2k
#endif  // !CONFIG_REALTIME_ONLY
3861
3862
75.2k
  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
75.2k
  if ((oxcf->pass == 2) && !cpi->use_svc) {
3893
0
    vp9_set_target_rate(cpi);
3894
0
  }
3895
3896
75.2k
  alloc_frame_mvs(cm, cm->new_fb_idx);
3897
3898
  // Reset the frame pointers to the current frame size.
3899
75.2k
  if (vpx_realloc_frame_buffer(get_frame_new_buffer(cm), cm->width, cm->height,
3900
75.2k
                               cm->subsampling_x, cm->subsampling_y,
3901
75.2k
#if CONFIG_VP9_HIGHBITDEPTH
3902
75.2k
                               cm->use_highbitdepth,
3903
75.2k
#endif
3904
75.2k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
3905
75.2k
                               NULL, NULL, NULL))
3906
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
3907
0
                       "Failed to allocate frame buffer");
3908
3909
75.2k
  alloc_util_frame_buffers(cpi);
3910
75.2k
  init_motion_estimation(cpi);
3911
3912
75.2k
  int has_valid_ref_frame = 0;
3913
301k
  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
3914
225k
    RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
3915
225k
    const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
3916
3917
225k
    ref_buf->idx = buf_idx;
3918
3919
225k
    if (buf_idx != INVALID_IDX) {
3920
214k
      YV12_BUFFER_CONFIG *const buf = &cm->buffer_pool->frame_bufs[buf_idx].buf;
3921
214k
      ref_buf->buf = buf;
3922
214k
#if CONFIG_VP9_HIGHBITDEPTH
3923
214k
      vp9_setup_scale_factors_for_frame(
3924
214k
          &ref_buf->sf, buf->y_crop_width, buf->y_crop_height, cm->width,
3925
214k
          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
214k
      has_valid_ref_frame |= vp9_is_valid_scale(&ref_buf->sf);
3932
214k
      if (vp9_is_scaled(&ref_buf->sf)) vpx_extend_frame_borders(buf);
3933
214k
    } else {
3934
11.0k
      ref_buf->buf = NULL;
3935
11.0k
    }
3936
225k
  }
3937
75.2k
  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
75.2k
  set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
3944
75.2k
}
3945
3946
75.2k
static void save_encode_params(VP9_COMP *cpi) {
3947
75.2k
  int tile_idx;
3948
75.2k
  int i, j;
3949
75.2k
  TileDataEnc *tile_data;
3950
75.2k
  RD_OPT *rd_opt = &cpi->rd;
3951
376k
  for (i = 0; i < MAX_REF_FRAMES; i++) {
3952
1.20M
    for (j = 0; j < REFERENCE_MODES; j++)
3953
903k
      rd_opt->prediction_type_threshes_prev[i][j] =
3954
903k
          rd_opt->prediction_type_threshes[i][j];
3955
3956
1.50M
    for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; j++)
3957
1.20M
      rd_opt->filter_threshes_prev[i][j] = rd_opt->filter_threshes[i][j];
3958
301k
  }
3959
3960
147k
  for (tile_idx = 0; tile_idx < cpi->allocated_tiles; tile_idx++) {
3961
72.6k
    assert(cpi->tile_data);
3962
72.6k
    tile_data = &cpi->tile_data[tile_idx];
3963
72.6k
    vp9_copy(tile_data->thresh_freq_fact_prev, tile_data->thresh_freq_fact);
3964
72.6k
  }
3965
75.2k
}
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
75.2k
                                      uint8_t *dest, size_t dest_size) {
4012
75.2k
  VP9_COMMON *const cm = &cpi->common;
4013
75.2k
  SVC *const svc = &cpi->svc;
4014
75.2k
  int q = 0, bottom_index = 0, top_index = 0;
4015
75.2k
  int no_drop_scene_change = 0;
4016
75.2k
  const INTERP_FILTER filter_scaler =
4017
75.2k
      (is_one_pass_svc(cpi))
4018
75.2k
          ? svc->downsample_filter_type[svc->spatial_layer_id]
4019
75.2k
          : EIGHTTAP;
4020
75.2k
  const int phase_scaler =
4021
75.2k
      (is_one_pass_svc(cpi))
4022
75.2k
          ? svc->downsample_filter_phase[svc->spatial_layer_id]
4023
75.2k
          : 0;
4024
4025
75.2k
  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
75.2k
  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
75.2k
  cpi->compute_source_sad_onepass = cpi->oxcf.mode == REALTIME;
4037
4038
75.2k
  vpx_clear_system_state();
4039
4040
75.2k
  set_frame_size(cpi);
4041
4042
75.2k
  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
75.2k
  } 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
75.2k
  } else {
4065
75.2k
    cpi->Source = vp9_scale_if_required(
4066
75.2k
        cm, cpi->un_scaled_source, &cpi->scaled_source, (cpi->oxcf.pass == 0),
4067
75.2k
        filter_scaler, phase_scaler);
4068
75.2k
  }
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
75.2k
  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
75.2k
  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
75.2k
      cpi->resize_pending || cpi->resize_state || cpi->external_resize ||
4096
75.2k
      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
75.2k
  if (cpi->unscaled_last_source != NULL &&
4108
71.5k
      (cpi->oxcf.content == VP9E_CONTENT_SCREEN ||
4109
71.5k
       (cpi->oxcf.pass == 0 && cpi->oxcf.rc_mode == VPX_VBR &&
4110
67.3k
        cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5) ||
4111
71.5k
       (cpi->noise_estimate.enabled && !cpi->oxcf.noise_sensitivity) ||
4112
71.5k
       cpi->compute_source_sad_onepass))
4113
41.7k
    cpi->Last_Source = vp9_scale_if_required(
4114
41.7k
        cm, cpi->unscaled_last_source, &cpi->scaled_last_source,
4115
41.7k
        (cpi->oxcf.pass == 0), EIGHTTAP, 0);
4116
4117
75.2k
  if (cpi->Last_Source == NULL ||
4118
41.7k
      cpi->Last_Source->y_width != cpi->Source->y_width ||
4119
41.7k
      cpi->Last_Source->y_height != cpi->Source->y_height)
4120
33.4k
    cpi->compute_source_sad_onepass = 0;
4121
4122
75.2k
  if (frame_is_intra_only(cm) || cpi->resize_pending != 0) {
4123
15.3k
    memset(cpi->consec_zero_mv, 0,
4124
15.3k
           cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv));
4125
15.3k
  }
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
75.2k
  cpi->rc.high_source_sad = 0;
4135
75.2k
  cpi->rc.hybrid_intra_scene_change = 0;
4136
75.2k
  cpi->rc.re_encode_maxq_scene_change = 0;
4137
75.2k
  if (cm->show_frame && cpi->oxcf.mode == REALTIME &&
4138
43.9k
      !cpi->disable_scene_detection_rtc_ratectrl &&
4139
43.9k
      (cpi->oxcf.rc_mode == VPX_VBR ||
4140
2.85k
       cpi->oxcf.content == VP9E_CONTENT_SCREEN || cpi->oxcf.speed >= 5))
4141
41.1k
    vp9_scene_detection_onepass(cpi);
4142
4143
75.2k
  if (svc->spatial_layer_id == svc->first_spatial_layer_to_encode) {
4144
75.2k
    svc->high_source_sad_superframe = cpi->rc.high_source_sad;
4145
75.2k
    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
75.2k
    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
75.2k
  }
4160
4161
75.2k
  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
75.2k
  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
75.2k
  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
75.2k
  if (frame_is_intra_only(cm) == 0 &&
4184
59.9k
      ((svc->single_layer_svc && cpi->oxcf.resize_mode == RESIZE_DYNAMIC) ||
4185
59.9k
       !(is_one_pass_svc(cpi) && svc->force_zero_mode_spatial_ref &&
4186
59.9k
         cpi->sf.use_nonrd_pick_mode))) {
4187
59.9k
    vp9_scale_references(cpi);
4188
59.9k
  }
4189
4190
75.2k
  set_size_independent_vars(cpi);
4191
75.2k
  set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
4192
4193
  // search method and step parameter might be changed in speed settings.
4194
75.2k
  init_motion_estimation(cpi);
4195
4196
75.2k
  if (cpi->sf.copy_partition_flag) alloc_copy_partition_data(cpi);
4197
4198
75.2k
  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
75.2k
  if (cm->bit_depth == 8 && cpi->oxcf.speed >= 5 && cpi->oxcf.pass == 0 &&
4210
0
      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
75.2k
  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
75.2k
  vp9_set_quantizer(cpi, q, 0);
4223
75.2k
  vp9_set_variance_partition_thresholds(cpi, q, 0);
4224
4225
75.2k
  setup_frame(cpi);
4226
4227
75.2k
  suppress_active_map(cpi);
4228
4229
75.2k
  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
75.2k
  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
75.2k
  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
75.2k
#if !CONFIG_REALTIME_ONLY
4257
  // Variance adaptive and in frame q adjustment experiments are mutually
4258
  // exclusive.
4259
75.2k
  if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
4260
0
    vp9_vaq_frame_setup(cpi);
4261
75.2k
  } else if (cpi->oxcf.aq_mode == EQUATOR360_AQ) {
4262
0
    vp9_360aq_frame_setup(cpi);
4263
75.2k
  } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
4264
0
    vp9_setup_in_frame_q_adj(cpi);
4265
75.2k
  } 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
75.2k
  } else {
4270
75.2k
#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
75.2k
    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
75.2k
    } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
4284
0
      vp9_cyclic_refresh_setup(cpi);
4285
0
    }
4286
4287
75.2k
#if !CONFIG_REALTIME_ONLY
4288
75.2k
  }
4289
75.2k
#endif
4290
4291
75.2k
  apply_active_map(cpi);
4292
4293
75.2k
  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
75.2k
  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
75.2k
  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
75.2k
  vpx_clear_system_state();
4339
75.2k
  return 1;
4340
75.2k
}
4341
4342
75.1k
static int get_ref_frame_flags(const VP9_COMP *cpi) {
4343
75.1k
  const int *const map = cpi->common.ref_frame_map;
4344
75.1k
  const int gold_is_last = map[cpi->gld_fb_idx] == map[cpi->lst_fb_idx];
4345
75.1k
  const int alt_is_last = map[cpi->alt_fb_idx] == map[cpi->lst_fb_idx];
4346
75.1k
  const int gold_is_alt = map[cpi->gld_fb_idx] == map[cpi->alt_fb_idx];
4347
75.1k
  int flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
4348
4349
75.1k
  if (gold_is_last) flags &= ~VP9_GOLD_FLAG;
4350
4351
75.1k
  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
75.1k
  if (alt_is_last) flags &= ~VP9_ALT_FLAG;
4357
4358
75.1k
  if (gold_is_alt) flags &= ~VP9_ALT_FLAG;
4359
4360
75.1k
  return flags;
4361
75.1k
}
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
75.2k
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
75.2k
  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
75.2k
  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
75.2k
}
4797
4798
YV12_BUFFER_CONFIG *vp9_scale_if_required(
4799
    VP9_COMMON *cm, YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled,
4800
117k
    int use_normative_scaler, INTERP_FILTER filter_type, int phase_scaler) {
4801
117k
  if (cm->mi_cols * MI_SIZE != unscaled->y_width ||
4802
117k
      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
117k
  } else {
4823
117k
    return unscaled;
4824
117k
  }
4825
117k
}
4826
4827
75.2k
static void set_ref_sign_bias(VP9_COMP *cpi) {
4828
75.2k
  VP9_COMMON *const cm = &cpi->common;
4829
75.2k
  RefCntBuffer *const ref_buffer = get_ref_cnt_buffer(cm, cm->new_fb_idx);
4830
75.2k
  const int cur_frame_index = ref_buffer->frame_index;
4831
75.2k
  MV_REFERENCE_FRAME ref_frame;
4832
4833
301k
  for (ref_frame = LAST_FRAME; ref_frame < MAX_REF_FRAMES; ++ref_frame) {
4834
225k
    const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
4835
225k
    const RefCntBuffer *const ref_cnt_buf =
4836
225k
        get_ref_cnt_buffer(&cpi->common, buf_idx);
4837
225k
    if (ref_cnt_buf) {
4838
214k
      cm->ref_frame_sign_bias[ref_frame] =
4839
214k
          cur_frame_index < ref_cnt_buf->frame_index;
4840
214k
    }
4841
225k
  }
4842
75.2k
}
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
75.2k
static void set_frame_index(VP9_COMP *cpi, VP9_COMMON *cm) {
5051
75.2k
  RefCntBuffer *const ref_buffer = get_ref_cnt_buffer(cm, cm->new_fb_idx);
5052
5053
75.2k
  if (ref_buffer) {
5054
75.2k
    const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
5055
75.2k
    ref_buffer->frame_index =
5056
75.2k
        cm->current_video_frame + gf_group->arf_src_offset[gf_group->index];
5057
75.2k
    ref_buffer->frame_coding_index = cm->current_frame_coding_index;
5058
75.2k
  }
5059
75.2k
}
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 int *)elem1);
5151
0
  int b = *((const int *)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
75.2k
static void init_sb_mul_scale_buffer(VP9_COMP *cpi) {
5175
75.2k
  VP9_COMMON *cm = &cpi->common;
5176
5177
75.2k
  if (cpi->mb_wiener_var_rows >= cm->mb_rows &&
5178
71.5k
      cpi->mb_wiener_var_cols >= cm->mb_cols)
5179
71.5k
    return;
5180
5181
3.68k
  vpx_free(cpi->sb_mul_scale);
5182
3.68k
  cpi->sb_mul_scale = NULL;
5183
5184
3.68k
  CHECK_MEM_ERROR(
5185
3.68k
      &cm->error, cpi->sb_mul_scale,
5186
3.68k
      vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->sb_mul_scale)));
5187
3.68k
  cpi->mb_wiener_var_rows = cm->mb_rows;
5188
3.68k
  cpi->mb_wiener_var_cols = cm->mb_cols;
5189
3.68k
}
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 - 1, 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
75.2k
    unsigned int *frame_flags, ENCODE_FRAME_RESULT *encode_frame_result) {
5316
75.2k
  VP9_COMMON *const cm = &cpi->common;
5317
75.2k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
5318
75.2k
  struct segmentation *const seg = &cm->seg;
5319
75.2k
  TX_SIZE t;
5320
5321
75.2k
  if (vp9_svc_check_skip_enhancement_layer(cpi)) return;
5322
5323
75.2k
  set_ext_overrides(cpi);
5324
75.2k
  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
75.2k
  if (cm->show_existing_frame == 0) {
5332
    // Update frame index
5333
75.2k
    set_frame_index(cpi, cm);
5334
5335
    // Set the arf sign bias for this frame.
5336
75.2k
    set_ref_sign_bias(cpi);
5337
75.2k
  }
5338
5339
  // On the very first frame set the deadline_mode_previous_frame to
5340
  // the current mode.
5341
75.2k
  if (cpi->common.current_video_frame == 0)
5342
3.68k
    cpi->deadline_mode_previous_frame = cpi->oxcf.mode;
5343
5344
  // Set default state for segment based loop filter update flags.
5345
75.2k
  cm->lf.mode_ref_delta_update = 0;
5346
5347
75.2k
  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
75.2k
  if (frame_is_intra_only(cm)) {
5352
    // Reset the loop filter deltas and segmentation map.
5353
15.3k
    vp9_reset_segment_features(&cm->seg);
5354
5355
    // If segmentation is enabled force a map update for key frames.
5356
15.3k
    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
15.3k
    cpi->rc.source_alt_ref_active = 0;
5363
5364
15.3k
    cm->error_resilient_mode = oxcf->error_resilient_mode;
5365
15.3k
    cm->frame_parallel_decoding_mode = oxcf->frame_parallel_decoding_mode;
5366
5367
    // By default, encoder assumes decoder can use prev_mi.
5368
15.3k
    if (cm->error_resilient_mode) {
5369
0
      cm->frame_parallel_decoding_mode = 1;
5370
0
      cm->reset_frame_context = 0;
5371
0
      cm->refresh_frame_context = 0;
5372
15.3k
    } else if (cm->intra_only) {
5373
      // Only reset the current context.
5374
0
      cm->reset_frame_context = 2;
5375
0
    }
5376
15.3k
  }
5377
5378
75.2k
  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
75.2k
  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
75.2k
  init_sb_mul_scale_buffer(cpi);
5389
5390
75.2k
  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
75.2k
  save_encode_params(cpi);
5398
75.2k
  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
75.2k
  if (cpi->sf.recode_loop == DISALLOW_RECODE) {
5427
75.2k
    if (!encode_without_recode_loop(cpi, size, dest, dest_size)) return;
5428
75.2k
  } 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
75.2k
  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
75.2k
#if !CONFIG_REALTIME_ONLY
5450
  // Disable segmentation if it decrease rate/distortion ratio
5451
75.2k
  if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ)
5452
0
    vp9_try_disable_lookahead_aq(cpi, size, dest, dest_size);
5453
75.2k
#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
75.2k
  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
75.2k
  if (cm->frame_type == KEY_FRAME) cpi->refresh_last_frame = 1;
5487
5488
75.2k
  cm->frame_to_show = get_frame_new_buffer(cm);
5489
75.2k
  cm->frame_to_show->color_space = cm->color_space;
5490
75.2k
  cm->frame_to_show->color_range = cm->color_range;
5491
75.2k
  cm->frame_to_show->render_width = cm->render_width;
5492
75.2k
  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
75.2k
  loopfilter_frame(cpi, cm);
5499
#if CONFIG_COLLECT_COMPONENT_TIMING
5500
  end_timing(cpi, loopfilter_frame_time);
5501
#endif
5502
5503
75.2k
  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
75.2k
  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
75.2k
  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
75.2k
  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
75.2k
#endif  // CONFIG_REALTIME_ONLY
5564
5565
75.2k
  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
75.2k
  cpi->last_frame_dropped = 0;
5572
75.2k
  cpi->svc.last_layer_dropped[cpi->svc.spatial_layer_id] = 0;
5573
75.2k
  if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
5574
75.1k
    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
75.2k
  if (cpi->svc.temporal_layer_id == 0) {
5579
75.1k
    if (cpi->refresh_last_frame)
5580
75.1k
      cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->lst_fb_idx;
5581
0
    else if (cpi->refresh_golden_frame)
5582
0
      cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->gld_fb_idx;
5583
0
    else if (cpi->refresh_alt_ref_frame)
5584
0
      cpi->svc.fb_idx_upd_tl0[cpi->svc.spatial_layer_id] = cpi->alt_fb_idx;
5585
75.1k
  }
5586
5587
75.2k
  if (cm->seg.update_map) update_reference_segmentation_map(cpi);
5588
5589
75.2k
  if (frame_is_intra_only(cm) == 0) {
5590
59.9k
    release_scaled_references(cpi);
5591
59.9k
  }
5592
75.2k
  vp9_update_reference_frames(cpi);
5593
5594
75.2k
  if (!cm->show_existing_frame) {
5595
375k
    for (t = TX_4X4; t <= TX_32X32; ++t) {
5596
300k
      full_to_model_counts(cpi->td.counts->coef[t],
5597
300k
                           cpi->td.rd_counts.coef_counts[t]);
5598
300k
    }
5599
5600
75.1k
    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
75.1k
  }
5608
5609
75.2k
  cpi->ext_refresh_frame_flags_pending = 0;
5610
5611
75.2k
  if (cpi->refresh_golden_frame == 1)
5612
19.6k
    cpi->frame_flags |= FRAMEFLAGS_GOLDEN;
5613
55.5k
  else
5614
55.5k
    cpi->frame_flags &= ~FRAMEFLAGS_GOLDEN;
5615
5616
75.2k
  if (cpi->refresh_alt_ref_frame == 1)
5617
15.2k
    cpi->frame_flags |= FRAMEFLAGS_ALTREF;
5618
59.9k
  else
5619
59.9k
    cpi->frame_flags &= ~FRAMEFLAGS_ALTREF;
5620
5621
75.2k
  cpi->ref_frame_flags = get_ref_frame_flags(cpi);
5622
5623
75.2k
  cm->last_frame_type = cm->frame_type;
5624
5625
75.2k
  vp9_rc_postencode_update(cpi, *size);
5626
5627
75.2k
  if (cpi->compute_frame_low_motion_onepass && oxcf->pass == 0 &&
5628
75.1k
      !frame_is_intra_only(cm) &&
5629
59.9k
      (!cpi->use_svc ||
5630
0
       (cpi->use_svc &&
5631
0
        !cpi->svc.layer_context[cpi->svc.temporal_layer_id].is_key_frame &&
5632
59.9k
        cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1))) {
5633
59.9k
    vp9_compute_frame_low_motion(cpi);
5634
59.9k
  }
5635
5636
75.2k
  *size = VPXMAX(1, *size);
5637
5638
#if 0
5639
  output_frame_level_debug_stats(cpi);
5640
#endif
5641
5642
75.2k
  if (cm->frame_type == KEY_FRAME) {
5643
    // Tell the caller that the frame was coded as a key frame
5644
15.2k
    *frame_flags = cpi->frame_flags | FRAMEFLAGS_KEY;
5645
59.9k
  } else {
5646
59.9k
    *frame_flags = cpi->frame_flags & ~FRAMEFLAGS_KEY;
5647
59.9k
  }
5648
5649
  // Clear the one shot update flags for segmentation map and mode/ref loop
5650
  // filter deltas.
5651
75.2k
  cm->seg.update_map = 0;
5652
75.2k
  cm->seg.update_data = 0;
5653
75.2k
  cm->lf.mode_ref_delta_update = 0;
5654
5655
  // keep track of the last coded dimensions
5656
75.2k
  cm->last_width = cm->width;
5657
75.2k
  cm->last_height = cm->height;
5658
5659
  // reset to normal state now that we are done.
5660
75.2k
  if (!cm->show_existing_frame) {
5661
75.1k
    cm->last_show_frame = cm->show_frame;
5662
75.1k
    cm->prev_frame = cm->cur_frame;
5663
75.1k
  }
5664
5665
75.2k
  if (cm->show_frame) {
5666
75.1k
    vp9_swap_mi_and_prev_mi(cm);
5667
75.1k
    if (cpi->use_svc) vp9_inc_frame_in_layer(cpi);
5668
75.1k
  }
5669
75.2k
  update_frame_indexes(cm, cm->show_frame);
5670
5671
75.2k
  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
75.2k
  cpi->force_update_segmentation = 0;
5682
5683
75.2k
#if !CONFIG_REALTIME_ONLY
5684
75.2k
  if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ)
5685
0
    vp9_alt_ref_aq_unset_all(cpi->alt_ref_aq, cpi);
5686
75.2k
#endif
5687
5688
75.2k
  cpi->svc.previous_frame_is_intra_only = cm->intra_only;
5689
75.2k
  cpi->svc.set_intra_only_frame = 0;
5690
75.2k
}
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
75.2k
                        size_t dest_size, unsigned int *frame_flags) {
5701
75.2k
  if (cpi->oxcf.rc_mode == VPX_CBR) {
5702
0
    vp9_rc_get_one_pass_cbr_params(cpi);
5703
75.2k
  } else {
5704
75.2k
    vp9_rc_get_one_pass_vbr_params(cpi);
5705
75.2k
  }
5706
75.2k
  encode_frame_to_data_rate(cpi, size, dest, dest_size, frame_flags,
5707
75.2k
                            /*encode_frame_result = */ NULL);
5708
75.2k
}
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
75.9k
                          int64_t end_time) {
5726
75.9k
  VP9_COMMON *const cm = &cpi->common;
5727
#if CONFIG_INTERNAL_STATS
5728
  struct vpx_usec_timer timer;
5729
#endif
5730
75.9k
  int res = 0;
5731
75.9k
  const int subsampling_x = sd->subsampling_x;
5732
75.9k
  const int subsampling_y = sd->subsampling_y;
5733
75.9k
#if CONFIG_VP9_HIGHBITDEPTH
5734
75.9k
  const int use_highbitdepth = (sd->flags & YV12_FLAG_HIGHBITDEPTH) != 0;
5735
#else
5736
  const int use_highbitdepth = 0;
5737
#endif
5738
5739
75.9k
  if ((cm->profile == PROFILE_0 || cm->profile == PROFILE_2) &&
5740
75.9k
      (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
75.9k
  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
75.9k
  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
75.9k
  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
75.9k
  alloc_raw_frame_buffers(cpi);
5770
5771
#if CONFIG_INTERNAL_STATS
5772
  vpx_usec_timer_start(&timer);
5773
#endif
5774
5775
75.9k
  if (vp9_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
5776
75.9k
                         use_highbitdepth, frame_flags))
5777
0
    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
75.9k
  return res;
5784
75.9k
}
5785
5786
75.1k
static int frame_is_reference(const VP9_COMP *cpi) {
5787
75.1k
  const VP9_COMMON *cm = &cpi->common;
5788
5789
75.1k
  return cm->frame_type == KEY_FRAME || cpi->refresh_last_frame ||
5790
0
         cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame ||
5791
0
         cm->refresh_frame_context || cm->lf.mode_ref_delta_update ||
5792
0
         cm->seg.update_map || cm->seg.update_data;
5793
75.1k
}
5794
5795
static void adjust_frame_rate(VP9_COMP *cpi,
5796
75.2k
                              const struct lookahead_entry *source) {
5797
75.2k
  int64_t this_duration;
5798
75.2k
  int step = 0;
5799
5800
75.2k
  if (source->ts_start == cpi->first_time_stamp_ever) {
5801
75.2k
    this_duration = source->ts_end - source->ts_start;
5802
75.2k
    step = 1;
5803
75.2k
  } else {
5804
0
    int64_t last_duration =
5805
0
        cpi->last_end_time_stamp_seen - cpi->last_time_stamp_seen;
5806
5807
0
    this_duration = source->ts_end - cpi->last_end_time_stamp_seen;
5808
5809
    // do a step update if the duration changes by 10%
5810
0
    if (last_duration)
5811
0
      step = (int)((this_duration - last_duration) * 10 / last_duration);
5812
0
  }
5813
5814
75.2k
  if (this_duration) {
5815
74.6k
    if (step) {
5816
74.6k
      vp9_new_framerate(cpi, 10000000.0 / this_duration);
5817
74.6k
    } 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
0
      const double interval = VPXMIN(
5822
0
          (double)(source->ts_end - cpi->first_time_stamp_ever), 10000000.0);
5823
0
      double avg_duration = 10000000.0 / cpi->framerate;
5824
0
      avg_duration *= (interval - avg_duration + this_duration);
5825
0
      avg_duration /= interval;
5826
5827
0
      vp9_new_framerate(cpi, 10000000.0 / avg_duration);
5828
0
    }
5829
74.6k
  }
5830
75.2k
  cpi->last_time_stamp_seen = source->ts_start;
5831
75.2k
  cpi->last_end_time_stamp_seen = source->ts_end;
5832
75.2k
}
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
178k
static int get_arf_src_index(VP9_COMP *cpi) {
5837
178k
  RATE_CONTROL *const rc = &cpi->rc;
5838
178k
  int arf_src_index = 0;
5839
178k
  if (is_altref_enabled(cpi)) {
5840
178k
    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
178k
    } else if (rc->source_alt_ref_pending) {
5846
0
      arf_src_index = rc->frames_till_gf_update_due;
5847
0
    }
5848
178k
  }
5849
178k
  return arf_src_index;
5850
178k
}
5851
5852
static void check_src_altref(VP9_COMP *cpi,
5853
75.2k
                             const struct lookahead_entry *source) {
5854
75.2k
  RATE_CONTROL *const rc = &cpi->rc;
5855
5856
75.2k
  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
75.2k
  } else {
5861
75.2k
    rc->is_src_frame_alt_ref =
5862
75.2k
        cpi->alt_ref_source && (source == cpi->alt_ref_source);
5863
75.2k
  }
5864
5865
75.2k
  if (rc->is_src_frame_alt_ref) {
5866
    // Current frame is an ARF overlay frame.
5867
0
    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
0
    cpi->refresh_last_frame = 0;
5872
0
  }
5873
75.2k
}
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
108k
void vp9_init_encode_frame_result(ENCODE_FRAME_RESULT *encode_frame_result) {
6140
108k
  encode_frame_result->show_idx = -1;  // Actual encoding doesn't happen.
6141
108k
}
6142
6143
// Returns if TPL stats need to be calculated.
6144
75.2k
static INLINE int should_run_tpl(VP9_COMP *cpi, int gf_group_index) {
6145
75.2k
  RATE_CONTROL *const rc = &cpi->rc;
6146
75.2k
  if (!cpi->sf.enable_tpl_model) return 0;
6147
  // If there is an ARF for this GOP, TPL stats is always calculated.
6148
33.4k
  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
33.4k
  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
33.4k
  return 0;
6160
33.4k
}
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
178k
                            ENCODE_FRAME_RESULT *encode_frame_result) {
6166
178k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
6167
178k
  VP9_COMMON *const cm = &cpi->common;
6168
178k
  BufferPool *const pool = cm->buffer_pool;
6169
178k
  RATE_CONTROL *const rc = &cpi->rc;
6170
#if CONFIG_INTERNAL_STATS
6171
  struct vpx_usec_timer cmptimer;
6172
#endif
6173
178k
  YV12_BUFFER_CONFIG *force_src_buffer = NULL;
6174
178k
  struct lookahead_entry *last_source = NULL;
6175
178k
  struct lookahead_entry *source = NULL;
6176
178k
  int arf_src_index;
6177
178k
  const int gf_group_index = cpi->twopass.gf_group.index;
6178
178k
  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
178k
  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
178k
  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
178k
  if ((oxcf->pass == 2) && !cpi->use_svc && (cpi->oxcf.enable_auto_arf >= 2))
6200
0
    cpi->multi_layer_arf = 1;
6201
178k
  else
6202
178k
    cpi->multi_layer_arf = 0;
6203
6204
  // Normal defaults
6205
178k
  cm->reset_frame_context = 0;
6206
178k
  cm->refresh_frame_context = 1;
6207
178k
  if (!is_one_pass_svc(cpi)) {
6208
178k
    cpi->refresh_last_frame = 1;
6209
178k
    cpi->refresh_golden_frame = 0;
6210
178k
    cpi->refresh_alt_ref_frame = 0;
6211
178k
  }
6212
6213
  // Should we encode an arf frame.
6214
178k
  arf_src_index = get_arf_src_index(cpi);
6215
6216
178k
  if (arf_src_index) {
6217
0
    for (i = 0; i <= arf_src_index; ++i) {
6218
0
      struct lookahead_entry *e = vp9_lookahead_peek(cpi->lookahead, i);
6219
      // Avoid creating an alt-ref if there's a forced keyframe pending.
6220
0
      if (e == NULL) {
6221
0
        break;
6222
0
      } else if (e->flags == VPX_EFLAG_FORCE_KF) {
6223
0
        arf_src_index = 0;
6224
0
        flush = 1;
6225
0
        break;
6226
0
      }
6227
0
    }
6228
0
  }
6229
6230
  // Clear arf index stack before group of pictures processing starts.
6231
178k
  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
178k
  if (arf_src_index) {
6237
0
    if (!(cpi->ext_ratectrl.ready &&
6238
0
          (cpi->ext_ratectrl.funcs.rc_type & VPX_RC_GOP) != 0 &&
6239
0
          cpi->ext_ratectrl.funcs.get_gop_decision != NULL)) {
6240
      // This assert only makes sense when not using external RC.
6241
0
      assert(arf_src_index <= rc->frames_to_key);
6242
0
    }
6243
0
    if ((source = vp9_lookahead_peek(cpi->lookahead, arf_src_index)) != NULL) {
6244
0
      cpi->alt_ref_source = source;
6245
6246
0
#if !CONFIG_REALTIME_ONLY
6247
0
      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
0
#endif
6273
0
      cm->show_frame = 0;
6274
0
      cm->intra_only = 0;
6275
0
      cpi->refresh_alt_ref_frame = 1;
6276
0
      cpi->refresh_golden_frame = 0;
6277
0
      cpi->refresh_last_frame = 0;
6278
0
      rc->is_src_frame_alt_ref = 0;
6279
0
      rc->source_alt_ref_pending = 0;
6280
0
    } else {
6281
0
      rc->source_alt_ref_pending = 0;
6282
0
    }
6283
0
  }
6284
6285
178k
  if (!source) {
6286
    // Get last frame source.
6287
178k
    if (cm->current_video_frame > 0) {
6288
145k
      if ((last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL)
6289
0
        return -1;
6290
145k
    }
6291
6292
    // Read in the source frame.
6293
178k
    if (cpi->use_svc || cpi->svc.set_intra_only_frame)
6294
0
      source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush);
6295
178k
    else
6296
178k
      source = vp9_lookahead_pop(cpi->lookahead, flush);
6297
6298
178k
    if (source != NULL) {
6299
75.2k
      cm->show_frame = 1;
6300
75.2k
      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
75.2k
      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
75.2k
      check_src_altref(cpi, source);
6311
75.2k
    }
6312
178k
  }
6313
6314
178k
  if (source) {
6315
75.2k
    cpi->un_scaled_source = cpi->Source =
6316
75.2k
        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
75.2k
    cpi->unscaled_last_source = last_source != NULL ? &last_source->img : NULL;
6325
6326
75.2k
    *time_stamp = source->ts_start;
6327
75.2k
    *time_end = source->ts_end;
6328
75.2k
    *frame_flags = (source->flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
6329
103k
  } else {
6330
103k
    *size = 0;
6331
103k
    return -1;
6332
103k
  }
6333
6334
75.2k
  if (source->ts_start < cpi->first_time_stamp_ever) {
6335
3.68k
    cpi->first_time_stamp_ever = source->ts_start;
6336
3.68k
    cpi->last_end_time_stamp_seen = source->ts_start;
6337
3.68k
  }
6338
6339
  // Clear down mmx registers
6340
75.2k
  vpx_clear_system_state();
6341
6342
  // adjust frame rates based on timestamps given
6343
75.2k
  if (cm->show_frame) {
6344
75.2k
    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
75.2k
    } else {
6355
75.2k
      adjust_frame_rate(cpi, source);
6356
75.2k
    }
6357
75.2k
  }
6358
6359
75.2k
  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
75.2k
  if (cm->new_fb_idx != INVALID_IDX) {
6367
71.5k
    --pool->frame_bufs[cm->new_fb_idx].ref_count;
6368
71.5k
  }
6369
75.2k
  cm->new_fb_idx = get_free_fb(cm);
6370
6371
75.2k
  if (cm->new_fb_idx == INVALID_IDX) return -1;
6372
75.2k
  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
75.2k
  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
75.2k
  *size = 0;
6380
6381
75.2k
  cpi->frame_flags = *frame_flags;
6382
6383
75.2k
#if !CONFIG_REALTIME_ONLY
6384
75.2k
  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
75.2k
  } else if (oxcf->pass == 1) {
6393
0
    set_frame_size(cpi);
6394
0
  }
6395
6396
  // Key frame temporal filtering
6397
75.2k
  const int is_key_temporal_filter_enabled =
6398
75.2k
      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
75.2k
  YV12_BUFFER_CONFIG *source_buffer = cpi->un_scaled_source;
6405
6406
75.2k
  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
75.2k
#endif  // !CONFIG_REALTIME_ONLY
6416
6417
75.2k
  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
75.2k
  if (cpi->oxcf.pass != 0 || cpi->use_svc || frame_is_intra_only(cm) == 1) {
6422
70.1k
    for (i = 0; i < REFS_PER_FRAME; ++i) cpi->scaled_ref_idx[i] = INVALID_IDX;
6423
17.5k
  }
6424
6425
75.2k
  if (cpi->kmeans_data_arr_alloc == 0) {
6426
3.68k
    int init_mi_rows, init_mi_cols, init_mi_stride;
6427
3.68k
    vp9_set_mi_size(&init_mi_rows, &init_mi_cols, &init_mi_stride,
6428
3.68k
                    cpi->initial_width, cpi->initial_height);
6429
3.68k
    const int mi_cols = mi_cols_aligned_to_sb(init_mi_cols);
6430
3.68k
    const int mi_rows = mi_cols_aligned_to_sb(init_mi_rows);
6431
3.68k
#if CONFIG_MULTITHREAD
6432
3.68k
    pthread_mutex_init(&cpi->kmeans_mutex, NULL);
6433
3.68k
#endif
6434
3.68k
    CHECK_MEM_ERROR(
6435
3.68k
        &cm->error, cpi->kmeans_data_arr,
6436
3.68k
        vpx_calloc(mi_rows * mi_cols, sizeof(*cpi->kmeans_data_arr)));
6437
3.68k
    cpi->kmeans_data_stride = mi_cols;
6438
3.68k
    cpi->kmeans_data_arr_alloc = 1;
6439
3.68k
  }
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
75.2k
  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
75.2k
  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
75.2k
  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
75.2k
  } 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
75.2k
  } else if (cpi->use_svc) {
6511
0
    SvcEncode(cpi, size, dest, dest_size, frame_flags);
6512
75.2k
  } else {
6513
    // One pass encode
6514
75.2k
    Pass0Encode(cpi, size, dest, dest_size, frame_flags);
6515
75.2k
  }
6516
75.2k
#endif  // CONFIG_REALTIME_ONLY
6517
6518
75.2k
  if (cm->show_frame) cm->cur_show_frame_fb_idx = cm->new_fb_idx;
6519
6520
75.2k
  if (cm->refresh_frame_context)
6521
75.1k
    cm->frame_contexts[cm->frame_context_idx] = *cm->fc;
6522
6523
  // No frame encoded, or frame was dropped, release scaled references.
6524
75.2k
  if ((*size == 0) && (frame_is_intra_only(cm) == 0)) {
6525
0
    release_scaled_references(cpi);
6526
0
  }
6527
6528
75.2k
  if (*size > 0) {
6529
75.1k
    cpi->droppable = !frame_is_reference(cpi);
6530
75.1k
  }
6531
6532
  // Save layer specific state.
6533
75.2k
  if (is_one_pass_svc(cpi) || ((cpi->svc.number_temporal_layers > 1 ||
6534
75.1k
                                cpi->svc.number_spatial_layers > 1) &&
6535
0
                               oxcf->pass == 2)) {
6536
0
    vp9_save_layer_context(cpi);
6537
0
  }
6538
6539
75.2k
  if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
6540
75.1k
    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
75.2k
  if (cpi->keep_level_stats && oxcf->pass != 1)
6548
0
    update_level_info(cpi, *size, arf_src_index);
6549
6550
75.2k
#if !CONFIG_REALTIME_ONLY
6551
75.2k
  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
75.2k
#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
75.2k
  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
75.2k
  vpx_clear_system_state();
6766
75.2k
  return 0;
6767
75.2k
}
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
74.7k
int vp9_get_quantizer(const VP9_COMP *cpi) { return cpi->common.base_qindex; }
6864
6865
108k
void vp9_apply_encoding_flags(VP9_COMP *cpi, vpx_enc_frame_flags_t flags) {
6866
108k
  if (flags &
6867
108k
      (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
108k
  if (flags &
6880
108k
      (VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
6881
108k
       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
108k
  if (flags & VP8_EFLAG_NO_UPD_ENTROPY) {
6894
0
    vp9_update_entropy(cpi, 0);
6895
0
  }
6896
108k
}
6897
6898
32.8k
void vp9_set_row_mt(VP9_COMP *cpi) {
6899
  // Enable row based multi-threading for supported modes of encoding
6900
32.8k
  cpi->row_mt = 0;
6901
32.8k
  if (((cpi->oxcf.mode == GOOD || cpi->oxcf.mode == BEST) &&
6902
30.6k
       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
32.8k
  if (cpi->oxcf.mode == GOOD && cpi->oxcf.speed < 5 &&
6907
30.6k
      (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
32.8k
  if (cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5 && cpi->oxcf.row_mt) {
6914
0
    cpi->row_mt = 1;
6915
0
  }
6916
6917
32.8k
  if (cpi->row_mt)
6918
0
    cpi->row_mt_bit_exact = 1;
6919
32.8k
  else
6920
32.8k
    cpi->row_mt_bit_exact = 0;
6921
32.8k
}