Coverage Report

Created: 2026-07-25 07:52

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
24.2k
#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
134k
#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
43.7k
#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
111k
static int is_psnr_calc_enabled(const VP9_COMP *cpi) {
465
111k
  const VP9_COMMON *const cm = &cpi->common;
466
111k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
467
468
111k
  return cpi->b_calculate_psnr && (oxcf->pass != 1) && cm->show_frame;
469
111k
}
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
55.8k
static void suppress_active_map(VP9_COMP *cpi) {
530
55.8k
  unsigned char *const seg_map = cpi->segmentation_map;
531
532
55.8k
  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
55.8k
}
542
543
55.8k
static void apply_active_map(VP9_COMP *cpi) {
544
55.8k
  struct segmentation *const seg = &cpi->common.seg;
545
55.8k
  unsigned char *const seg_map = cpi->segmentation_map;
546
55.8k
  const unsigned char *const active_map = cpi->active_map.map;
547
55.8k
  int i;
548
549
55.8k
  assert(AM_SEGMENT_ID_ACTIVE == CR_SEGMENT_ID_BASE);
550
551
55.8k
  if (frame_is_intra_only(&cpi->common)) {
552
12.1k
    cpi->active_map.enabled = 0;
553
12.1k
    cpi->active_map.update = 1;
554
12.1k
  }
555
556
55.8k
  if (cpi->active_map.update) {
557
12.1k
    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
12.1k
    } else {
568
12.1k
      vp9_disable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_SKIP);
569
12.1k
      vp9_disable_segfeature(seg, AM_SEGMENT_ID_INACTIVE, SEG_LVL_ALT_LF);
570
12.1k
      if (seg->enabled) {
571
0
        seg->update_data = 1;
572
0
        seg->update_map = 1;
573
0
      }
574
12.1k
    }
575
12.1k
    cpi->active_map.update = 0;
576
12.1k
  }
577
55.8k
}
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.16k
static void init_level_info(Vp9LevelInfo *level_info) {
646
3.16k
  Vp9LevelStats *const level_stats = &level_info->level_stats;
647
3.16k
  Vp9LevelSpec *const level_spec = &level_info->level_spec;
648
649
3.16k
  memset(level_stats, 0, sizeof(*level_stats));
650
3.16k
  memset(level_spec, 0, sizeof(*level_spec));
651
3.16k
  level_spec->level = LEVEL_UNKNOWN;
652
3.16k
  level_spec->min_altref_distance = INT_MAX;
653
3.16k
}
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
204k
void vp9_set_high_precision_mv(VP9_COMP *cpi, int allow_high_precision_mv) {
803
204k
  MACROBLOCK *const mb = &cpi->td.mb;
804
204k
  cpi->common.allow_high_precision_mv = allow_high_precision_mv;
805
204k
  if (cpi->common.allow_high_precision_mv) {
806
169k
    mb->mvcost = mb->nmvcost_hp;
807
169k
    mb->mvsadcost = mb->nmvsadcost_hp;
808
169k
  } else {
809
35.4k
    mb->mvcost = mb->nmvcost;
810
35.4k
    mb->mvsadcost = mb->nmvsadcost;
811
35.4k
  }
812
204k
}
813
814
55.8k
static void setup_frame(VP9_COMP *cpi) {
815
55.8k
  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
55.8k
  if (frame_is_intra_only(cm) || cm->error_resilient_mode) {
822
12.1k
    vp9_setup_past_independence(cm);
823
43.7k
  } else {
824
43.7k
    if (!cpi->use_svc) cm->frame_context_idx = cpi->refresh_alt_ref_frame;
825
43.7k
  }
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
55.8k
  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
55.8k
  if (cm->frame_type == KEY_FRAME) {
857
12.1k
    cpi->refresh_golden_frame = 1;
858
12.1k
    cpi->refresh_alt_ref_frame = 1;
859
12.1k
    vp9_zero(cpi->interp_filter_selected);
860
43.7k
  } else {
861
43.7k
    *cm->fc = cm->frame_contexts[cm->frame_context_idx];
862
43.7k
    vp9_zero(cpi->interp_filter_selected[0]);
863
43.7k
  }
864
55.8k
}
865
866
27.0k
static void vp9_enc_setup_mi(VP9_COMMON *cm) {
867
27.0k
  int i;
868
27.0k
  cm->mi = cm->mip + cm->mi_stride + 1;
869
27.0k
  memset(cm->mip, 0, cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mip));
870
27.0k
  cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
871
  // Clear top border row
872
27.0k
  memset(cm->prev_mip, 0, sizeof(*cm->prev_mip) * cm->mi_stride);
873
  // Clear left border column
874
2.15M
  for (i = 1; i < cm->mi_rows + 1; ++i)
875
2.12M
    memset(&cm->prev_mip[i * cm->mi_stride], 0, sizeof(*cm->prev_mip));
876
877
27.0k
  cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
878
27.0k
  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
879
880
27.0k
  memset(cm->mi_grid_base, 0,
881
27.0k
         cm->mi_stride * (cm->mi_rows + 1) * sizeof(*cm->mi_grid_base));
882
27.0k
}
883
884
3.16k
static int vp9_enc_alloc_mi(VP9_COMMON *cm, int mi_size) {
885
3.16k
  cm->mip = vpx_calloc(mi_size, sizeof(*cm->mip));
886
3.16k
  if (!cm->mip) return 1;
887
3.16k
  cm->prev_mip = vpx_calloc(mi_size, sizeof(*cm->prev_mip));
888
3.16k
  if (!cm->prev_mip) return 1;
889
3.16k
  cm->mi_alloc_size = mi_size;
890
891
3.16k
  cm->mi_grid_base =
892
3.16k
      (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->mi_grid_base));
893
3.16k
  if (!cm->mi_grid_base) return 1;
894
3.16k
  cm->prev_mi_grid_base =
895
3.16k
      (MODE_INFO **)vpx_calloc(mi_size, sizeof(*cm->prev_mi_grid_base));
896
3.16k
  if (!cm->prev_mi_grid_base) return 1;
897
898
3.16k
  return 0;
899
3.16k
}
900
901
9.50k
static void vp9_enc_free_mi(VP9_COMMON *cm) {
902
9.50k
  vpx_free(cm->mip);
903
9.50k
  cm->mip = NULL;
904
9.50k
  vpx_free(cm->prev_mip);
905
9.50k
  cm->prev_mip = NULL;
906
9.50k
  vpx_free(cm->mi_grid_base);
907
9.50k
  cm->mi_grid_base = NULL;
908
9.50k
  vpx_free(cm->prev_mi_grid_base);
909
9.50k
  cm->prev_mi_grid_base = NULL;
910
9.50k
  cm->mi_alloc_size = 0;
911
9.50k
}
912
913
55.8k
static void vp9_swap_mi_and_prev_mi(VP9_COMMON *cm) {
914
  // Current mip will be the prev_mip for the next frame.
915
55.8k
  MODE_INFO **temp_base = cm->prev_mi_grid_base;
916
55.8k
  MODE_INFO *temp = cm->prev_mip;
917
918
  // Skip update prev_mi frame in show_existing_frame mode.
919
55.8k
  if (cm->show_existing_frame) return;
920
921
55.8k
  cm->prev_mip = cm->mip;
922
55.8k
  cm->mip = temp;
923
924
  // Update the upper left visible macroblock ptrs.
925
55.8k
  cm->mi = cm->mip + cm->mi_stride + 1;
926
55.8k
  cm->prev_mi = cm->prev_mip + cm->mi_stride + 1;
927
928
55.8k
  cm->prev_mi_grid_base = cm->mi_grid_base;
929
55.8k
  cm->mi_grid_base = temp_base;
930
55.8k
  cm->mi_grid_visible = cm->mi_grid_base + cm->mi_stride + 1;
931
55.8k
  cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mi_stride + 1;
932
55.8k
}
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.20k
void vp9_initialize_enc(void) { once(initialize_enc); }
948
949
3.16k
static void dealloc_compressor_data(VP9_COMP *cpi) {
950
3.16k
  VP9_COMMON *const cm = &cpi->common;
951
3.16k
  int i;
952
953
3.16k
  vpx_free(cpi->mbmi_ext_base);
954
3.16k
  cpi->mbmi_ext_base = NULL;
955
956
3.16k
  vpx_free(cpi->tile_data);
957
3.16k
  cpi->tile_data = NULL;
958
959
3.16k
  vpx_free(cpi->segmentation_map);
960
3.16k
  cpi->segmentation_map = NULL;
961
3.16k
  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
962
3.16k
  cpi->coding_context.last_frame_seg_map_copy = NULL;
963
964
3.16k
  vpx_free(cpi->nmvcosts[0]);
965
3.16k
  vpx_free(cpi->nmvcosts[1]);
966
3.16k
  cpi->nmvcosts[0] = NULL;
967
3.16k
  cpi->nmvcosts[1] = NULL;
968
969
3.16k
  vpx_free(cpi->nmvcosts_hp[0]);
970
3.16k
  vpx_free(cpi->nmvcosts_hp[1]);
971
3.16k
  cpi->nmvcosts_hp[0] = NULL;
972
3.16k
  cpi->nmvcosts_hp[1] = NULL;
973
974
3.16k
  vpx_free(cpi->nmvsadcosts[0]);
975
3.16k
  vpx_free(cpi->nmvsadcosts[1]);
976
3.16k
  cpi->nmvsadcosts[0] = NULL;
977
3.16k
  cpi->nmvsadcosts[1] = NULL;
978
979
3.16k
  vpx_free(cpi->nmvsadcosts_hp[0]);
980
3.16k
  vpx_free(cpi->nmvsadcosts_hp[1]);
981
3.16k
  cpi->nmvsadcosts_hp[0] = NULL;
982
3.16k
  cpi->nmvsadcosts_hp[1] = NULL;
983
984
3.16k
  vpx_free(cpi->skin_map);
985
3.16k
  cpi->skin_map = NULL;
986
987
3.16k
  vpx_free(cpi->prev_partition);
988
3.16k
  cpi->prev_partition = NULL;
989
990
3.16k
  vpx_free(cpi->svc.prev_partition_svc);
991
3.16k
  cpi->svc.prev_partition_svc = NULL;
992
993
3.16k
  vpx_free(cpi->prev_segment_id);
994
3.16k
  cpi->prev_segment_id = NULL;
995
996
3.16k
  vpx_free(cpi->prev_variance_low);
997
3.16k
  cpi->prev_variance_low = NULL;
998
999
3.16k
  vpx_free(cpi->copied_frame_cnt);
1000
3.16k
  cpi->copied_frame_cnt = NULL;
1001
1002
3.16k
  vpx_free(cpi->content_state_sb_fd);
1003
3.16k
  cpi->content_state_sb_fd = NULL;
1004
1005
3.16k
  vpx_free(cpi->count_arf_frame_usage);
1006
3.16k
  cpi->count_arf_frame_usage = NULL;
1007
3.16k
  vpx_free(cpi->count_lastgolden_frame_usage);
1008
3.16k
  cpi->count_lastgolden_frame_usage = NULL;
1009
1010
3.16k
  vp9_cyclic_refresh_free(cpi->cyclic_refresh);
1011
3.16k
  cpi->cyclic_refresh = NULL;
1012
1013
3.16k
  vpx_free(cpi->active_map.map);
1014
3.16k
  cpi->active_map.map = NULL;
1015
1016
3.16k
  vpx_free(cpi->roi.roi_map);
1017
3.16k
  cpi->roi.roi_map = NULL;
1018
1019
3.16k
  vpx_free(cpi->consec_zero_mv);
1020
3.16k
  cpi->consec_zero_mv = NULL;
1021
1022
3.16k
  vpx_free(cpi->mb_wiener_variance);
1023
3.16k
  cpi->mb_wiener_variance = NULL;
1024
1025
3.16k
  vpx_free(cpi->sb_mul_scale);
1026
3.16k
  cpi->sb_mul_scale = NULL;
1027
1028
3.16k
  vpx_free(cpi->mi_ssim_rdmult_scaling_factors);
1029
3.16k
  cpi->mi_ssim_rdmult_scaling_factors = NULL;
1030
1031
3.16k
  vp9_free_ref_frame_buffers(cm->buffer_pool);
1032
#if CONFIG_VP9_POSTPROC
1033
  vp9_free_postproc_buffers(cm);
1034
#endif
1035
3.16k
  vp9_free_context_buffers(cm);
1036
1037
3.16k
  vpx_free_frame_buffer(&cpi->last_frame_uf);
1038
3.16k
  vpx_free_frame_buffer(&cpi->scaled_source);
1039
3.16k
  vpx_free_frame_buffer(&cpi->scaled_last_source);
1040
3.16k
  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.16k
  vp9_lookahead_destroy(cpi->lookahead);
1047
1048
3.16k
  vpx_free(cpi->tile_tok[0][0]);
1049
3.16k
  cpi->tile_tok[0][0] = 0;
1050
1051
3.16k
  vpx_free(cpi->tplist[0][0]);
1052
3.16k
  cpi->tplist[0][0] = NULL;
1053
1054
3.16k
  vp9_free_pc_tree(&cpi->td);
1055
1056
6.33k
  for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
1057
3.16k
    LAYER_CONTEXT *const lc = &cpi->svc.layer_context[i];
1058
3.16k
    vpx_free(lc->rc_twopass_stats_in.buf);
1059
3.16k
    lc->rc_twopass_stats_in.buf = NULL;
1060
3.16k
    lc->rc_twopass_stats_in.sz = 0;
1061
3.16k
  }
1062
1063
82.3k
  for (i = 0; i < MAX_LAG_BUFFERS; ++i) {
1064
79.2k
    vpx_free_frame_buffer(&cpi->svc.scaled_frames[i]);
1065
79.2k
  }
1066
3.16k
  memset(&cpi->svc.scaled_frames[0], 0,
1067
3.16k
         MAX_LAG_BUFFERS * sizeof(cpi->svc.scaled_frames[0]));
1068
1069
3.16k
  vpx_free_frame_buffer(&cpi->svc.scaled_temp);
1070
3.16k
  memset(&cpi->svc.scaled_temp, 0, sizeof(cpi->svc.scaled_temp));
1071
1072
3.16k
  vpx_free_frame_buffer(&cpi->svc.empty_frame.img);
1073
3.16k
  memset(&cpi->svc.empty_frame, 0, sizeof(cpi->svc.empty_frame));
1074
1075
3.16k
  vp9_free_svc_cyclic_refresh(cpi);
1076
3.16k
}
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
56.0k
static void alloc_raw_frame_buffers(VP9_COMP *cpi) {
1277
56.0k
  VP9_COMMON *cm = &cpi->common;
1278
56.0k
  const VP9EncoderConfig *oxcf = &cpi->oxcf;
1279
1280
56.0k
  if (!cpi->lookahead)
1281
2.96k
    cpi->lookahead = vp9_lookahead_init(oxcf->width, oxcf->height,
1282
2.96k
                                        cm->subsampling_x, cm->subsampling_y,
1283
2.96k
#if CONFIG_VP9_HIGHBITDEPTH
1284
2.96k
                                        cm->use_highbitdepth,
1285
2.96k
#endif
1286
2.96k
                                        oxcf->lag_in_frames);
1287
56.0k
  if (!cpi->lookahead)
1288
4
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1289
4
                       "Failed to allocate lag buffers");
1290
1291
  // TODO(agrange) Check if ARF is enabled and skip allocation if not.
1292
56.0k
  if (vpx_realloc_frame_buffer(&cpi->tf_buffer, oxcf->width, oxcf->height,
1293
56.0k
                               cm->subsampling_x, cm->subsampling_y,
1294
56.0k
#if CONFIG_VP9_HIGHBITDEPTH
1295
56.0k
                               cm->use_highbitdepth,
1296
56.0k
#endif
1297
56.0k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1298
56.0k
                               NULL, NULL, NULL))
1299
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1300
0
                       "Failed to allocate temporal filter buffer");
1301
56.0k
}
1302
1303
58.6k
static void alloc_util_frame_buffers(VP9_COMP *cpi) {
1304
58.6k
  VP9_COMMON *const cm = &cpi->common;
1305
58.6k
  if (vpx_realloc_frame_buffer(&cpi->last_frame_uf, cm->width, cm->height,
1306
58.6k
                               cm->subsampling_x, cm->subsampling_y,
1307
58.6k
#if CONFIG_VP9_HIGHBITDEPTH
1308
58.6k
                               cm->use_highbitdepth,
1309
58.6k
#endif
1310
58.6k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1311
58.6k
                               NULL, NULL, NULL))
1312
18
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
1313
18
                       "Failed to allocate last frame buffer");
1314
1315
58.6k
  if (vpx_realloc_frame_buffer(&cpi->scaled_source, cm->width, cm->height,
1316
58.6k
                               cm->subsampling_x, cm->subsampling_y,
1317
58.6k
#if CONFIG_VP9_HIGHBITDEPTH
1318
58.6k
                               cm->use_highbitdepth,
1319
58.6k
#endif
1320
58.6k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1321
58.6k
                               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
58.6k
  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
58.6k
  if (vpx_realloc_frame_buffer(&cpi->scaled_last_source, cm->width, cm->height,
1343
58.6k
                               cm->subsampling_x, cm->subsampling_y,
1344
58.6k
#if CONFIG_VP9_HIGHBITDEPTH
1345
58.6k
                               cm->use_highbitdepth,
1346
58.6k
#endif
1347
58.6k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
1348
58.6k
                               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
58.6k
}
1373
1374
3.16k
static void alloc_context_buffers_ext(VP9_COMP *cpi) {
1375
3.16k
  VP9_COMMON *cm = &cpi->common;
1376
3.16k
  int mi_size = cm->mi_cols * cm->mi_rows;
1377
1378
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->mbmi_ext_base,
1379
3.16k
                  vpx_calloc(mi_size, sizeof(*cpi->mbmi_ext_base)));
1380
3.16k
}
1381
1382
3.16k
static void alloc_compressor_data(VP9_COMP *cpi) {
1383
3.16k
  VP9_COMMON *cm = &cpi->common;
1384
3.16k
  int sb_rows;
1385
1386
3.16k
  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.16k
  alloc_context_buffers_ext(cpi);
1392
1393
3.16k
  vpx_free(cpi->tile_tok[0][0]);
1394
1395
3.16k
  {
1396
3.16k
    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.16k
    CHECK_MEM_ERROR(&cm->error, cpi->tile_tok[0][0],
1405
3.16k
                    vpx_calloc((size_t)tokens, sizeof(*cpi->tile_tok[0][0])));
1406
3.16k
  }
1407
1408
3.16k
  sb_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> MI_BLOCK_SIZE_LOG2;
1409
3.16k
  vpx_free(cpi->tplist[0][0]);
1410
3.16k
  CHECK_MEM_ERROR(
1411
3.16k
      &cm->error, cpi->tplist[0][0],
1412
3.16k
      vpx_calloc(sb_rows * 4 * (1 << 6), sizeof(*cpi->tplist[0][0])));
1413
1414
3.16k
  vp9_setup_pc_tree(&cpi->common, &cpi->td);
1415
1416
3.16k
  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.16k
}
1425
1426
82.2k
void vp9_new_framerate(VP9_COMP *cpi, double framerate) {
1427
82.2k
  cpi->framerate = framerate < 0.1 ? 30 : framerate;
1428
82.2k
  vp9_rc_update_framerate(cpi);
1429
82.2k
}
1430
1431
54.0k
static void set_tile_limits(VP9_COMP *cpi) {
1432
54.0k
  VP9_COMMON *const cm = &cpi->common;
1433
1434
54.0k
  int min_log2_tile_cols, max_log2_tile_cols;
1435
54.0k
  vp9_get_tile_n_bits(cm->mi_cols, &min_log2_tile_cols, &max_log2_tile_cols);
1436
1437
54.0k
  cm->log2_tile_cols =
1438
54.0k
      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
54.0k
  const int sb64_rows = mi_cols_aligned_to_sb(cm->mi_rows) >> 3;
1443
54.0k
  const int max_log2_tile_rows = (sb64_rows >= 4)   ? 2
1444
54.0k
                                 : (sb64_rows >= 2) ? 1
1445
47.3k
                                                    : 0;
1446
54.0k
  cm->log2_tile_rows = VPXMIN(cpi->oxcf.tile_rows, max_log2_tile_rows);
1447
1448
54.0k
  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
54.0k
}
1456
1457
27.0k
static void update_frame_size(VP9_COMP *cpi) {
1458
27.0k
  VP9_COMMON *const cm = &cpi->common;
1459
27.0k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
1460
1461
27.0k
  vp9_set_mb_mi(cm, cm->width, cm->height);
1462
27.0k
  vp9_init_context_buffers(cm);
1463
27.0k
  vp9_init_macroblockd(cm, xd, NULL);
1464
27.0k
  cpi->td.mb.mbmi_ext_base = cpi->mbmi_ext_base;
1465
27.0k
  memset(cpi->mbmi_ext_base, 0,
1466
27.0k
         cm->mi_rows * cm->mi_cols * sizeof(*cpi->mbmi_ext_base));
1467
1468
27.0k
  set_tile_limits(cpi);
1469
27.0k
}
1470
1471
3.16k
static void init_buffer_indices(VP9_COMP *cpi) {
1472
3.16k
  int ref_frame;
1473
1474
28.5k
  for (ref_frame = 0; ref_frame < REF_FRAMES; ++ref_frame)
1475
25.3k
    cpi->ref_fb_idx[ref_frame] = ref_frame;
1476
1477
3.16k
  cpi->lst_fb_idx = cpi->ref_fb_idx[LAST_FRAME - 1];
1478
3.16k
  cpi->gld_fb_idx = cpi->ref_fb_idx[GOLDEN_FRAME - 1];
1479
3.16k
  cpi->alt_fb_idx = cpi->ref_fb_idx[ALTREF_FRAME - 1];
1480
3.16k
}
1481
1482
3.16k
static void init_level_constraint(LevelConstraint *lc) {
1483
3.16k
  lc->level_index = -1;
1484
3.16k
  lc->max_cpb_size = INT_MAX;
1485
3.16k
  lc->max_frame_size = INT_MAX;
1486
3.16k
  lc->fail_flag = 0;
1487
3.16k
}
1488
1489
30.1k
static void set_level_constraint(LevelConstraint *ls, int8_t level_index) {
1490
30.1k
  vpx_clear_system_state();
1491
30.1k
  ls->level_index = level_index;
1492
30.1k
  if (level_index >= 0) {
1493
0
    ls->max_cpb_size = vp9_level_defs[level_index].max_cpb_size * (double)1000;
1494
0
  }
1495
30.1k
}
1496
1497
3.16k
static void init_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
1498
3.16k
  VP9_COMMON *const cm = &cpi->common;
1499
1500
3.16k
  cpi->oxcf = *oxcf;
1501
3.16k
  cpi->framerate = oxcf->init_framerate;
1502
3.16k
  cm->profile = oxcf->profile;
1503
3.16k
  cm->bit_depth = oxcf->bit_depth;
1504
3.16k
#if CONFIG_VP9_HIGHBITDEPTH
1505
3.16k
  cm->use_highbitdepth = oxcf->use_highbitdepth;
1506
3.16k
#endif
1507
3.16k
  cm->color_space = oxcf->color_space;
1508
3.16k
  cm->color_range = oxcf->color_range;
1509
1510
3.16k
  cpi->target_level = oxcf->target_level;
1511
3.16k
  cpi->keep_level_stats = oxcf->target_level != LEVEL_MAX;
1512
3.16k
  set_level_constraint(&cpi->level_constraint,
1513
3.16k
                       get_level_index(cpi->target_level));
1514
1515
3.16k
  cm->width = oxcf->width;
1516
3.16k
  cm->height = oxcf->height;
1517
3.16k
  alloc_compressor_data(cpi);
1518
1519
3.16k
  cpi->svc.temporal_layering_mode = oxcf->temporal_layering_mode;
1520
1521
  // Single thread case: use counts in common.
1522
3.16k
  cpi->td.counts = &cm->counts;
1523
1524
  // Spatial scalability.
1525
3.16k
  cpi->svc.number_spatial_layers = oxcf->ss_number_layers;
1526
  // Temporal scalability.
1527
3.16k
  cpi->svc.number_temporal_layers = oxcf->ts_number_layers;
1528
1529
3.16k
  if (cpi->svc.number_temporal_layers > 1 ||
1530
3.16k
      cpi->svc.number_spatial_layers > 1) {
1531
0
    vp9_init_layer_context(cpi);
1532
0
  }
1533
1534
  // change includes all joint functionality
1535
3.16k
  vp9_change_config(cpi, oxcf);
1536
1537
3.16k
  cpi->static_mb_pct = 0;
1538
3.16k
  cpi->ref_frame_flags = 0;
1539
1540
3.16k
  init_buffer_indices(cpi);
1541
1542
3.16k
  vp9_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
1543
3.16k
  cpi->fixed_qp_onepass = 0;
1544
3.16k
}
1545
1546
27.0k
void vp9_check_reset_rc_flag(VP9_COMP *cpi) {
1547
27.0k
  RATE_CONTROL *rc = &cpi->rc;
1548
1549
27.0k
  if (cpi->common.current_video_frame >
1550
27.0k
      (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
27.0k
}
1564
1565
27.0k
void vp9_set_rc_buffer_sizes(VP9_COMP *cpi) {
1566
27.0k
  RATE_CONTROL *rc = &cpi->rc;
1567
27.0k
  const VP9EncoderConfig *oxcf = &cpi->oxcf;
1568
1569
27.0k
  const int64_t bandwidth = oxcf->target_bandwidth;
1570
27.0k
  const int64_t starting = oxcf->starting_buffer_level_ms;
1571
27.0k
  const int64_t optimal = oxcf->optimal_buffer_level_ms;
1572
27.0k
  const int64_t maximum = oxcf->maximum_buffer_size_ms;
1573
1574
27.0k
  rc->starting_buffer_level = starting * bandwidth / 1000;
1575
27.0k
  rc->optimal_buffer_level =
1576
27.0k
      (optimal == 0) ? bandwidth / 8 : optimal * bandwidth / 1000;
1577
27.0k
  rc->maximum_buffer_size =
1578
27.0k
      (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
27.0k
  rc->bits_off_target = VPXMIN(rc->bits_off_target, rc->maximum_buffer_size);
1583
27.0k
  rc->buffer_level = VPXMIN(rc->buffer_level, rc->maximum_buffer_size);
1584
27.0k
}
1585
1586
#if CONFIG_VP9_HIGHBITDEPTH
1587
#define HIGHBD_BFP(BT, SDF, SDSF, SDAF, VF, SVF, SVAF, SDX4DF, SDSX4DF) \
1588
13.3k
  cpi->fn_ptr[BT].sdf = SDF;                                            \
1589
13.3k
  cpi->fn_ptr[BT].sdsf = SDSF;                                          \
1590
13.3k
  cpi->fn_ptr[BT].sdaf = SDAF;                                          \
1591
13.3k
  cpi->fn_ptr[BT].vf = VF;                                              \
1592
13.3k
  cpi->fn_ptr[BT].svf = SVF;                                            \
1593
13.3k
  cpi->fn_ptr[BT].svaf = SVAF;                                          \
1594
13.3k
  cpi->fn_ptr[BT].sdx4df = SDX4DF;                                      \
1595
13.3k
  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
30.1k
static void highbd_set_var_fns(VP9_COMP *const cpi) {
1733
30.1k
  VP9_COMMON *const cm = &cpi->common;
1734
30.1k
  if (cm->use_highbitdepth) {
1735
1.02k
    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
499
      case VPX_BITS_10:
1826
499
        HIGHBD_BFP(
1827
499
            BLOCK_32X16, vpx_highbd_sad32x16_bits10,
1828
499
            vpx_highbd_sad_skip_32x16_bits10, vpx_highbd_sad32x16_avg_bits10,
1829
499
            vpx_highbd_10_variance32x16, vpx_highbd_10_sub_pixel_variance32x16,
1830
499
            vpx_highbd_10_sub_pixel_avg_variance32x16,
1831
499
            vpx_highbd_sad32x16x4d_bits10, vpx_highbd_sad_skip_32x16x4d_bits10)
1832
1833
499
        HIGHBD_BFP(
1834
499
            BLOCK_16X32, vpx_highbd_sad16x32_bits10,
1835
499
            vpx_highbd_sad_skip_16x32_bits10, vpx_highbd_sad16x32_avg_bits10,
1836
499
            vpx_highbd_10_variance16x32, vpx_highbd_10_sub_pixel_variance16x32,
1837
499
            vpx_highbd_10_sub_pixel_avg_variance16x32,
1838
499
            vpx_highbd_sad16x32x4d_bits10, vpx_highbd_sad_skip_16x32x4d_bits10)
1839
1840
499
        HIGHBD_BFP(
1841
499
            BLOCK_64X32, vpx_highbd_sad64x32_bits10,
1842
499
            vpx_highbd_sad_skip_64x32_bits10, vpx_highbd_sad64x32_avg_bits10,
1843
499
            vpx_highbd_10_variance64x32, vpx_highbd_10_sub_pixel_variance64x32,
1844
499
            vpx_highbd_10_sub_pixel_avg_variance64x32,
1845
499
            vpx_highbd_sad64x32x4d_bits10, vpx_highbd_sad_skip_64x32x4d_bits10)
1846
1847
499
        HIGHBD_BFP(
1848
499
            BLOCK_32X64, vpx_highbd_sad32x64_bits10,
1849
499
            vpx_highbd_sad_skip_32x64_bits10, vpx_highbd_sad32x64_avg_bits10,
1850
499
            vpx_highbd_10_variance32x64, vpx_highbd_10_sub_pixel_variance32x64,
1851
499
            vpx_highbd_10_sub_pixel_avg_variance32x64,
1852
499
            vpx_highbd_sad32x64x4d_bits10, vpx_highbd_sad_skip_32x64x4d_bits10)
1853
1854
499
        HIGHBD_BFP(
1855
499
            BLOCK_32X32, vpx_highbd_sad32x32_bits10,
1856
499
            vpx_highbd_sad_skip_32x32_bits10, vpx_highbd_sad32x32_avg_bits10,
1857
499
            vpx_highbd_10_variance32x32, vpx_highbd_10_sub_pixel_variance32x32,
1858
499
            vpx_highbd_10_sub_pixel_avg_variance32x32,
1859
499
            vpx_highbd_sad32x32x4d_bits10, vpx_highbd_sad_skip_32x32x4d_bits10)
1860
1861
499
        HIGHBD_BFP(
1862
499
            BLOCK_64X64, vpx_highbd_sad64x64_bits10,
1863
499
            vpx_highbd_sad_skip_64x64_bits10, vpx_highbd_sad64x64_avg_bits10,
1864
499
            vpx_highbd_10_variance64x64, vpx_highbd_10_sub_pixel_variance64x64,
1865
499
            vpx_highbd_10_sub_pixel_avg_variance64x64,
1866
499
            vpx_highbd_sad64x64x4d_bits10, vpx_highbd_sad_skip_64x64x4d_bits10)
1867
1868
499
        HIGHBD_BFP(
1869
499
            BLOCK_16X16, vpx_highbd_sad16x16_bits10,
1870
499
            vpx_highbd_sad_skip_16x16_bits10, vpx_highbd_sad16x16_avg_bits10,
1871
499
            vpx_highbd_10_variance16x16, vpx_highbd_10_sub_pixel_variance16x16,
1872
499
            vpx_highbd_10_sub_pixel_avg_variance16x16,
1873
499
            vpx_highbd_sad16x16x4d_bits10, vpx_highbd_sad_skip_16x16x4d_bits10)
1874
1875
499
        HIGHBD_BFP(
1876
499
            BLOCK_16X8, vpx_highbd_sad16x8_bits10,
1877
499
            vpx_highbd_sad_skip_16x8_bits10, vpx_highbd_sad16x8_avg_bits10,
1878
499
            vpx_highbd_10_variance16x8, vpx_highbd_10_sub_pixel_variance16x8,
1879
499
            vpx_highbd_10_sub_pixel_avg_variance16x8,
1880
499
            vpx_highbd_sad16x8x4d_bits10, vpx_highbd_sad_skip_16x8x4d_bits10)
1881
1882
499
        HIGHBD_BFP(
1883
499
            BLOCK_8X16, vpx_highbd_sad8x16_bits10,
1884
499
            vpx_highbd_sad_skip_8x16_bits10, vpx_highbd_sad8x16_avg_bits10,
1885
499
            vpx_highbd_10_variance8x16, vpx_highbd_10_sub_pixel_variance8x16,
1886
499
            vpx_highbd_10_sub_pixel_avg_variance8x16,
1887
499
            vpx_highbd_sad8x16x4d_bits10, vpx_highbd_sad_skip_8x16x4d_bits10)
1888
1889
499
        HIGHBD_BFP(
1890
499
            BLOCK_8X8, vpx_highbd_sad8x8_bits10, vpx_highbd_sad_skip_8x8_bits10,
1891
499
            vpx_highbd_sad8x8_avg_bits10, vpx_highbd_10_variance8x8,
1892
499
            vpx_highbd_10_sub_pixel_variance8x8,
1893
499
            vpx_highbd_10_sub_pixel_avg_variance8x8,
1894
499
            vpx_highbd_sad8x8x4d_bits10, vpx_highbd_sad_skip_8x8x4d_bits10)
1895
1896
499
        HIGHBD_BFP(
1897
499
            BLOCK_8X4, vpx_highbd_sad8x4_bits10, vpx_highbd_sad_skip_8x4_bits10,
1898
499
            vpx_highbd_sad8x4_avg_bits10, vpx_highbd_10_variance8x4,
1899
499
            vpx_highbd_10_sub_pixel_variance8x4,
1900
499
            vpx_highbd_10_sub_pixel_avg_variance8x4,
1901
499
            vpx_highbd_sad8x4x4d_bits10, vpx_highbd_sad_skip_8x4x4d_bits10)
1902
1903
499
        HIGHBD_BFP(
1904
499
            BLOCK_4X8, vpx_highbd_sad4x8_bits10, vpx_highbd_sad_skip_4x8_bits10,
1905
499
            vpx_highbd_sad4x8_avg_bits10, vpx_highbd_10_variance4x8,
1906
499
            vpx_highbd_10_sub_pixel_variance4x8,
1907
499
            vpx_highbd_10_sub_pixel_avg_variance4x8,
1908
499
            vpx_highbd_sad4x8x4d_bits10, vpx_highbd_sad_skip_4x8x4d_bits10)
1909
1910
499
        HIGHBD_BFP(
1911
499
            BLOCK_4X4, vpx_highbd_sad4x4_bits10, vpx_highbd_sad_skip_4x4_bits10,
1912
499
            vpx_highbd_sad4x4_avg_bits10, vpx_highbd_10_variance4x4,
1913
499
            vpx_highbd_10_sub_pixel_variance4x4,
1914
499
            vpx_highbd_10_sub_pixel_avg_variance4x4,
1915
499
            vpx_highbd_sad4x4x4d_bits10, vpx_highbd_sad_skip_4x4x4d_bits10)
1916
499
        break;
1917
1918
530
      default:
1919
530
        assert(cm->bit_depth == VPX_BITS_12);
1920
530
        HIGHBD_BFP(
1921
530
            BLOCK_32X16, vpx_highbd_sad32x16_bits12,
1922
530
            vpx_highbd_sad_skip_32x16_bits12, vpx_highbd_sad32x16_avg_bits12,
1923
530
            vpx_highbd_12_variance32x16, vpx_highbd_12_sub_pixel_variance32x16,
1924
530
            vpx_highbd_12_sub_pixel_avg_variance32x16,
1925
530
            vpx_highbd_sad32x16x4d_bits12, vpx_highbd_sad_skip_32x16x4d_bits12)
1926
1927
530
        HIGHBD_BFP(
1928
530
            BLOCK_16X32, vpx_highbd_sad16x32_bits12,
1929
530
            vpx_highbd_sad_skip_16x32_bits12, vpx_highbd_sad16x32_avg_bits12,
1930
530
            vpx_highbd_12_variance16x32, vpx_highbd_12_sub_pixel_variance16x32,
1931
530
            vpx_highbd_12_sub_pixel_avg_variance16x32,
1932
530
            vpx_highbd_sad16x32x4d_bits12, vpx_highbd_sad_skip_16x32x4d_bits12)
1933
1934
530
        HIGHBD_BFP(
1935
530
            BLOCK_64X32, vpx_highbd_sad64x32_bits12,
1936
530
            vpx_highbd_sad_skip_64x32_bits12, vpx_highbd_sad64x32_avg_bits12,
1937
530
            vpx_highbd_12_variance64x32, vpx_highbd_12_sub_pixel_variance64x32,
1938
530
            vpx_highbd_12_sub_pixel_avg_variance64x32,
1939
530
            vpx_highbd_sad64x32x4d_bits12, vpx_highbd_sad_skip_64x32x4d_bits12)
1940
1941
530
        HIGHBD_BFP(
1942
530
            BLOCK_32X64, vpx_highbd_sad32x64_bits12,
1943
530
            vpx_highbd_sad_skip_32x64_bits12, vpx_highbd_sad32x64_avg_bits12,
1944
530
            vpx_highbd_12_variance32x64, vpx_highbd_12_sub_pixel_variance32x64,
1945
530
            vpx_highbd_12_sub_pixel_avg_variance32x64,
1946
530
            vpx_highbd_sad32x64x4d_bits12, vpx_highbd_sad_skip_32x64x4d_bits12)
1947
1948
530
        HIGHBD_BFP(
1949
530
            BLOCK_32X32, vpx_highbd_sad32x32_bits12,
1950
530
            vpx_highbd_sad_skip_32x32_bits12, vpx_highbd_sad32x32_avg_bits12,
1951
530
            vpx_highbd_12_variance32x32, vpx_highbd_12_sub_pixel_variance32x32,
1952
530
            vpx_highbd_12_sub_pixel_avg_variance32x32,
1953
530
            vpx_highbd_sad32x32x4d_bits12, vpx_highbd_sad_skip_32x32x4d_bits12)
1954
1955
530
        HIGHBD_BFP(
1956
530
            BLOCK_64X64, vpx_highbd_sad64x64_bits12,
1957
530
            vpx_highbd_sad_skip_64x64_bits12, vpx_highbd_sad64x64_avg_bits12,
1958
530
            vpx_highbd_12_variance64x64, vpx_highbd_12_sub_pixel_variance64x64,
1959
530
            vpx_highbd_12_sub_pixel_avg_variance64x64,
1960
530
            vpx_highbd_sad64x64x4d_bits12, vpx_highbd_sad_skip_64x64x4d_bits12)
1961
1962
530
        HIGHBD_BFP(
1963
530
            BLOCK_16X16, vpx_highbd_sad16x16_bits12,
1964
530
            vpx_highbd_sad_skip_16x16_bits12, vpx_highbd_sad16x16_avg_bits12,
1965
530
            vpx_highbd_12_variance16x16, vpx_highbd_12_sub_pixel_variance16x16,
1966
530
            vpx_highbd_12_sub_pixel_avg_variance16x16,
1967
530
            vpx_highbd_sad16x16x4d_bits12, vpx_highbd_sad_skip_16x16x4d_bits12)
1968
1969
530
        HIGHBD_BFP(
1970
530
            BLOCK_16X8, vpx_highbd_sad16x8_bits12,
1971
530
            vpx_highbd_sad_skip_16x8_bits12, vpx_highbd_sad16x8_avg_bits12,
1972
530
            vpx_highbd_12_variance16x8, vpx_highbd_12_sub_pixel_variance16x8,
1973
530
            vpx_highbd_12_sub_pixel_avg_variance16x8,
1974
530
            vpx_highbd_sad16x8x4d_bits12, vpx_highbd_sad_skip_16x8x4d_bits12)
1975
1976
530
        HIGHBD_BFP(
1977
530
            BLOCK_8X16, vpx_highbd_sad8x16_bits12,
1978
530
            vpx_highbd_sad_skip_8x16_bits12, vpx_highbd_sad8x16_avg_bits12,
1979
530
            vpx_highbd_12_variance8x16, vpx_highbd_12_sub_pixel_variance8x16,
1980
530
            vpx_highbd_12_sub_pixel_avg_variance8x16,
1981
530
            vpx_highbd_sad8x16x4d_bits12, vpx_highbd_sad_skip_8x16x4d_bits12)
1982
1983
530
        HIGHBD_BFP(
1984
530
            BLOCK_8X8, vpx_highbd_sad8x8_bits12, vpx_highbd_sad_skip_8x8_bits12,
1985
530
            vpx_highbd_sad8x8_avg_bits12, vpx_highbd_12_variance8x8,
1986
530
            vpx_highbd_12_sub_pixel_variance8x8,
1987
530
            vpx_highbd_12_sub_pixel_avg_variance8x8,
1988
530
            vpx_highbd_sad8x8x4d_bits12, vpx_highbd_sad_skip_8x8x4d_bits12)
1989
1990
530
        HIGHBD_BFP(
1991
530
            BLOCK_8X4, vpx_highbd_sad8x4_bits12, vpx_highbd_sad_skip_8x4_bits12,
1992
530
            vpx_highbd_sad8x4_avg_bits12, vpx_highbd_12_variance8x4,
1993
530
            vpx_highbd_12_sub_pixel_variance8x4,
1994
530
            vpx_highbd_12_sub_pixel_avg_variance8x4,
1995
530
            vpx_highbd_sad8x4x4d_bits12, vpx_highbd_sad_skip_8x4x4d_bits12)
1996
1997
530
        HIGHBD_BFP(
1998
530
            BLOCK_4X8, vpx_highbd_sad4x8_bits12, vpx_highbd_sad_skip_4x8_bits12,
1999
530
            vpx_highbd_sad4x8_avg_bits12, vpx_highbd_12_variance4x8,
2000
530
            vpx_highbd_12_sub_pixel_variance4x8,
2001
530
            vpx_highbd_12_sub_pixel_avg_variance4x8,
2002
530
            vpx_highbd_sad4x8x4d_bits12, vpx_highbd_sad_skip_4x8x4d_bits12)
2003
2004
530
        HIGHBD_BFP(
2005
530
            BLOCK_4X4, vpx_highbd_sad4x4_bits12, vpx_highbd_sad_skip_4x4_bits12,
2006
530
            vpx_highbd_sad4x4_avg_bits12, vpx_highbd_12_variance4x4,
2007
530
            vpx_highbd_12_sub_pixel_variance4x4,
2008
530
            vpx_highbd_12_sub_pixel_avg_variance4x4,
2009
530
            vpx_highbd_sad4x4x4d_bits12, vpx_highbd_sad_skip_4x4x4d_bits12)
2010
530
        break;
2011
1.02k
    }
2012
1.02k
  }
2013
30.1k
}
2014
#endif  // CONFIG_VP9_HIGHBITDEPTH
2015
2016
3.16k
static void realloc_segmentation_maps(VP9_COMP *cpi) {
2017
3.16k
  VP9_COMMON *const cm = &cpi->common;
2018
2019
  // Create the encoder segmentation map and set all entries to 0
2020
3.16k
  vpx_free(cpi->segmentation_map);
2021
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->segmentation_map,
2022
3.16k
                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
2023
2024
  // Create a map used for cyclic background refresh.
2025
3.16k
  if (cpi->cyclic_refresh) vp9_cyclic_refresh_free(cpi->cyclic_refresh);
2026
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->cyclic_refresh,
2027
3.16k
                  vp9_cyclic_refresh_alloc(cm->mi_rows, cm->mi_cols));
2028
2029
  // Create a map used to mark inactive areas.
2030
3.16k
  vpx_free(cpi->active_map.map);
2031
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->active_map.map,
2032
3.16k
                  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.16k
  vpx_free(cpi->coding_context.last_frame_seg_map_copy);
2037
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->coding_context.last_frame_seg_map_copy,
2038
3.16k
                  vpx_calloc(cm->mi_rows * cm->mi_cols, 1));
2039
3.16k
}
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
27.0k
void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) {
2098
27.0k
  VP9_COMMON *const cm = &cpi->common;
2099
27.0k
  RATE_CONTROL *const rc = &cpi->rc;
2100
27.0k
  int last_w = cpi->oxcf.width;
2101
27.0k
  int last_h = cpi->oxcf.height;
2102
2103
27.0k
  vp9_init_quantizer(cpi);
2104
27.0k
  if (cm->profile != oxcf->profile) cm->profile = oxcf->profile;
2105
27.0k
  cm->bit_depth = oxcf->bit_depth;
2106
27.0k
  cm->color_space = oxcf->color_space;
2107
27.0k
  cm->color_range = oxcf->color_range;
2108
2109
27.0k
  cpi->target_level = oxcf->target_level;
2110
27.0k
  cpi->keep_level_stats = oxcf->target_level != LEVEL_MAX;
2111
27.0k
  set_level_constraint(&cpi->level_constraint,
2112
27.0k
                       get_level_index(cpi->target_level));
2113
2114
27.0k
  if (cm->profile <= PROFILE_1)
2115
27.0k
    assert(cm->bit_depth == VPX_BITS_8);
2116
920
  else
2117
27.0k
    assert(cm->bit_depth > VPX_BITS_8);
2118
2119
27.0k
  cpi->oxcf = *oxcf;
2120
27.0k
#if CONFIG_VP9_HIGHBITDEPTH
2121
27.0k
  cpi->td.mb.e_mbd.bd = (int)cm->bit_depth;
2122
27.0k
#endif  // CONFIG_VP9_HIGHBITDEPTH
2123
2124
27.0k
  if ((oxcf->pass == 0) && (oxcf->rc_mode == VPX_Q)) {
2125
1.42k
    rc->baseline_gf_interval = FIXED_GF_INTERVAL;
2126
25.5k
  } else {
2127
25.5k
    rc->baseline_gf_interval = (MIN_GF_INTERVAL + MAX_GF_INTERVAL) / 2;
2128
25.5k
  }
2129
2130
27.0k
  cpi->refresh_golden_frame = 0;
2131
27.0k
  cpi->refresh_last_frame = 1;
2132
27.0k
  cm->refresh_frame_context = 1;
2133
27.0k
  cm->reset_frame_context = 0;
2134
2135
27.0k
  vp9_reset_segment_features(&cm->seg);
2136
27.0k
  vp9_set_high_precision_mv(cpi, 0);
2137
2138
27.0k
  {
2139
27.0k
    int i;
2140
2141
243k
    for (i = 0; i < MAX_SEGMENTS; i++)
2142
216k
      cpi->segment_encode_breakout[i] = cpi->oxcf.encode_breakout;
2143
27.0k
  }
2144
27.0k
  cpi->encode_breakout = cpi->oxcf.encode_breakout;
2145
2146
27.0k
  vp9_set_rc_buffer_sizes(cpi);
2147
2148
  // Set up frame rate and related parameters rate control values.
2149
27.0k
  vp9_new_framerate(cpi, cpi->framerate);
2150
2151
  // Set absolute upper and lower quality limits
2152
27.0k
  rc->worst_quality = cpi->oxcf.worst_allowed_q;
2153
27.0k
  rc->best_quality = cpi->oxcf.best_allowed_q;
2154
2155
27.0k
  cm->interp_filter = cpi->sf.default_interp_filter;
2156
2157
27.0k
  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
27.0k
  } else {
2161
27.0k
    cm->render_width = cpi->oxcf.width;
2162
27.0k
    cm->render_height = cpi->oxcf.height;
2163
27.0k
  }
2164
27.0k
  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
27.0k
  if (cpi->initial_width && cpi->initial_height &&
2171
23.8k
      (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
27.0k
  if (cm->current_video_frame == 0 || last_w != cpi->oxcf.width ||
2183
0
      last_h != cpi->oxcf.height)
2184
27.0k
    update_frame_size(cpi);
2185
2186
27.0k
  if (last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) {
2187
0
    int svc_alloc_mi_area = cm->mi_rows * cm->mi_cols;
2188
0
    if (cpi->svc.number_spatial_layers > 1 && cpi->initial_width &&
2189
0
        cpi->initial_height) {
2190
0
      int init_mi_rows, init_mi_cols, init_mi_stride;
2191
0
      vp9_set_mi_size(&init_mi_rows, &init_mi_cols, &init_mi_stride,
2192
0
                      cpi->initial_width, cpi->initial_height);
2193
0
      svc_alloc_mi_area =
2194
0
          VPXMAX(svc_alloc_mi_area, init_mi_rows * init_mi_cols);
2195
0
    }
2196
0
    vpx_free(cpi->consec_zero_mv);
2197
0
    CHECK_MEM_ERROR(
2198
0
        &cm->error, cpi->consec_zero_mv,
2199
0
        vpx_calloc(svc_alloc_mi_area, sizeof(*cpi->consec_zero_mv)));
2200
2201
0
    vpx_free(cpi->skin_map);
2202
0
    CHECK_MEM_ERROR(&cm->error, cpi->skin_map,
2203
0
                    vpx_calloc(svc_alloc_mi_area, sizeof(*cpi->skin_map)));
2204
2205
0
    if (cpi->svc.number_spatial_layers > 1) {
2206
#if CONFIG_VP9_TEMPORAL_DENOISING
2207
      // Reset the denoiser for svc on the resize change.
2208
      if (cpi->oxcf.noise_sensitivity > 0) {
2209
        vp9_denoiser_free(&cpi->denoiser);
2210
        setup_denoiser_buffer(cpi);
2211
      }
2212
#endif
2213
0
      for (int sl = 0; sl < cpi->svc.number_spatial_layers; ++sl) {
2214
0
        const int layer =
2215
0
            LAYER_IDS_TO_IDX(sl, 0, cpi->svc.number_temporal_layers);
2216
0
        LAYER_CONTEXT *const lc = &cpi->svc.layer_context[layer];
2217
0
        lc->sb_index = 0;
2218
0
        lc->actual_num_seg1_blocks = 0;
2219
0
        lc->actual_num_seg2_blocks = 0;
2220
0
        lc->counter_encode_maxq_scene_change = 0;
2221
0
        vpx_free(lc->map);
2222
0
        CHECK_MEM_ERROR(&cm->error, lc->map,
2223
0
                        vpx_calloc(svc_alloc_mi_area, sizeof(*lc->map)));
2224
0
        vpx_free(lc->last_coded_q_map);
2225
0
        CHECK_MEM_ERROR(
2226
0
            &cm->error, lc->last_coded_q_map,
2227
0
            vpx_malloc(svc_alloc_mi_area * sizeof(*lc->last_coded_q_map)));
2228
0
        memset(lc->last_coded_q_map, MAXQ, svc_alloc_mi_area);
2229
0
        vpx_free(lc->consec_zero_mv);
2230
0
        CHECK_MEM_ERROR(
2231
0
            &cm->error, lc->consec_zero_mv,
2232
0
            vpx_calloc(svc_alloc_mi_area, sizeof(*lc->consec_zero_mv)));
2233
0
      }
2234
0
      if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
2235
0
        cpi->refresh_golden_frame = 1;
2236
0
        cpi->refresh_alt_ref_frame = 1;
2237
0
      }
2238
0
    }
2239
2240
0
    free_copy_partition_data(cpi);
2241
0
    alloc_copy_partition_data(cpi);
2242
0
    if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ &&
2243
0
        cpi->svc.number_spatial_layers == 1)
2244
0
      vp9_cyclic_refresh_reset_resize(cpi);
2245
0
    vpx_free(cpi->count_arf_frame_usage);
2246
0
    cpi->count_arf_frame_usage = NULL;
2247
0
    vpx_free(cpi->count_lastgolden_frame_usage);
2248
0
    cpi->count_lastgolden_frame_usage = NULL;
2249
0
    rc->rc_1_frame = 0;
2250
0
    rc->rc_2_frame = 0;
2251
0
  }
2252
2253
27.0k
  if ((cpi->svc.number_temporal_layers > 1) ||
2254
27.0k
      ((cpi->svc.number_temporal_layers > 1 ||
2255
27.0k
        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
27.0k
  vp9_check_reset_rc_flag(cpi);
2262
2263
27.0k
  cpi->alt_ref_source = NULL;
2264
27.0k
  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
27.0k
  set_tile_limits(cpi);
2273
2274
27.0k
  cpi->ext_refresh_frame_flags_pending = 0;
2275
27.0k
  cpi->ext_refresh_frame_context_pending = 0;
2276
2277
27.0k
#if CONFIG_VP9_HIGHBITDEPTH
2278
27.0k
  highbd_set_var_fns(cpi);
2279
27.0k
#endif
2280
2281
27.0k
  vp9_set_row_mt(cpi);
2282
27.0k
}
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.16k
static void cal_nmvjointsadcost(int *mvjointsadcost) {
2305
  /*********************************************************************
2306
   * Warning: Read the comments above before modifying this function   *
2307
   *********************************************************************/
2308
3.16k
  mvjointsadcost[0] = 600;
2309
3.16k
  mvjointsadcost[1] = 300;
2310
3.16k
  mvjointsadcost[2] = 300;
2311
3.16k
  mvjointsadcost[3] = 300;
2312
3.16k
}
2313
2314
3.16k
static void cal_nmvsadcosts(int *mvsadcost[2]) {
2315
  /*********************************************************************
2316
   * Warning: Read the comments above before modifying this function   *
2317
   *********************************************************************/
2318
3.16k
  int i = 1;
2319
2320
3.16k
  mvsadcost[0][0] = 0;
2321
3.16k
  mvsadcost[1][0] = 0;
2322
2323
51.9M
  do {
2324
51.9M
    double z = 256 * (2 * (log2f(8 * i) + .6));
2325
51.9M
    mvsadcost[0][i] = (int)z;
2326
51.9M
    mvsadcost[1][i] = (int)z;
2327
51.9M
    mvsadcost[0][-i] = (int)z;
2328
51.9M
    mvsadcost[1][-i] = (int)z;
2329
51.9M
  } while (++i <= MV_MAX);
2330
3.16k
}
2331
2332
3.16k
static void cal_nmvsadcosts_hp(int *mvsadcost[2]) {
2333
3.16k
  int i = 1;
2334
2335
3.16k
  mvsadcost[0][0] = 0;
2336
3.16k
  mvsadcost[1][0] = 0;
2337
2338
51.9M
  do {
2339
51.9M
    double z = 256 * (2 * (log2f(8 * i) + .6));
2340
51.9M
    mvsadcost[0][i] = (int)z;
2341
51.9M
    mvsadcost[1][i] = (int)z;
2342
51.9M
    mvsadcost[0][-i] = (int)z;
2343
51.9M
    mvsadcost[1][-i] = (int)z;
2344
51.9M
  } while (++i <= MV_MAX);
2345
3.16k
}
2346
2347
3.16k
static void init_ref_frame_bufs(VP9_COMMON *cm) {
2348
3.16k
  int i;
2349
3.16k
  BufferPool *const pool = cm->buffer_pool;
2350
3.16k
  cm->new_fb_idx = INVALID_IDX;
2351
28.5k
  for (i = 0; i < REF_FRAMES; ++i) {
2352
25.3k
    cm->ref_frame_map[i] = INVALID_IDX;
2353
25.3k
  }
2354
41.1k
  for (i = 0; i < FRAME_BUFFERS; ++i) {
2355
38.0k
    pool->frame_bufs[i].ref_count = 0;
2356
38.0k
  }
2357
3.16k
}
2358
2359
static void update_initial_width(VP9_COMP *cpi, int use_highbitdepth,
2360
56.1k
                                 int subsampling_x, int subsampling_y) {
2361
56.1k
  VP9_COMMON *const cm = &cpi->common;
2362
#if !CONFIG_VP9_HIGHBITDEPTH
2363
  (void)use_highbitdepth;
2364
  assert(use_highbitdepth == 0);
2365
#endif
2366
2367
56.1k
  if (!cpi->initial_width ||
2368
56.1k
#if CONFIG_VP9_HIGHBITDEPTH
2369
56.1k
      cm->use_highbitdepth != use_highbitdepth ||
2370
56.1k
#endif
2371
56.1k
      cm->subsampling_x != subsampling_x ||
2372
53.4k
      cm->subsampling_y != subsampling_y) {
2373
2.76k
    cm->subsampling_x = subsampling_x;
2374
2.76k
    cm->subsampling_y = subsampling_y;
2375
2.76k
#if CONFIG_VP9_HIGHBITDEPTH
2376
2.76k
    cm->use_highbitdepth = use_highbitdepth;
2377
2.76k
#endif
2378
2.76k
    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
2.76k
    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
2.76k
    cpi->initial_mbs = cm->MBs;
2391
2.76k
  }
2392
56.1k
}
2393
2394
VP9_COMP *vp9_create_compressor(const VP9EncoderConfig *oxcf,
2395
3.16k
                                BufferPool *const pool) {
2396
3.16k
  unsigned int i;
2397
3.16k
  VP9_COMP *volatile const cpi = vpx_memalign(32, sizeof(*cpi));
2398
3.16k
  VP9_COMMON *volatile const cm = cpi != NULL ? &cpi->common : NULL;
2399
2400
3.16k
  if (!cm) return NULL;
2401
2402
3.16k
  vp9_zero(*cpi);
2403
2404
3.16k
  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.16k
  cm->error.setjmp = 1;
2411
3.16k
  cm->alloc_mi = vp9_enc_alloc_mi;
2412
3.16k
  cm->free_mi = vp9_enc_free_mi;
2413
3.16k
  cm->setup_mi = vp9_enc_setup_mi;
2414
2415
3.16k
  CHECK_MEM_ERROR(&cm->error, cm->fc,
2416
3.16k
                  (FRAME_CONTEXT *)vpx_calloc(1, sizeof(*cm->fc)));
2417
3.16k
  CHECK_MEM_ERROR(
2418
3.16k
      &cm->error, cm->frame_contexts,
2419
3.16k
      (FRAME_CONTEXT *)vpx_calloc(FRAME_CONTEXTS, sizeof(*cm->frame_contexts)));
2420
2421
3.16k
  cpi->compute_frame_low_motion_onepass = 1;
2422
3.16k
  cpi->use_svc = 0;
2423
3.16k
  cpi->resize_state = ORIG;
2424
3.16k
  cpi->external_resize = 0;
2425
3.16k
  cpi->resize_avg_qp = 0;
2426
3.16k
  cpi->resize_buffer_underflow = 0;
2427
3.16k
  cpi->use_skin_detection = 0;
2428
3.16k
  cpi->common.buffer_pool = pool;
2429
3.16k
  init_ref_frame_bufs(cm);
2430
2431
3.16k
  cpi->force_update_segmentation = 0;
2432
2433
3.16k
  init_config(cpi, oxcf);
2434
3.16k
  cpi->frame_info = vp9_get_frame_info(oxcf);
2435
2436
3.16k
  vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc);
2437
3.16k
  vp9_init_rd_parameters(cpi);
2438
2439
3.16k
  init_frame_indexes(cm);
2440
3.16k
  cpi->initial_width = cpi->oxcf.width;
2441
3.16k
  cpi->initial_height = cpi->oxcf.height;
2442
3.16k
  cpi->tile_data = NULL;
2443
2444
3.16k
  realloc_segmentation_maps(cpi);
2445
2446
3.16k
  CHECK_MEM_ERROR(
2447
3.16k
      &cm->error, cpi->skin_map,
2448
3.16k
      vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->skin_map)));
2449
2450
3.16k
#if !CONFIG_REALTIME_ONLY
2451
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->alt_ref_aq, vp9_alt_ref_aq_create());
2452
3.16k
#endif
2453
2454
3.16k
  CHECK_MEM_ERROR(
2455
3.16k
      &cm->error, cpi->consec_zero_mv,
2456
3.16k
      vpx_calloc(cm->mi_rows * cm->mi_cols, sizeof(*cpi->consec_zero_mv)));
2457
2458
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts[0],
2459
3.16k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[0])));
2460
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts[1],
2461
3.16k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[1])));
2462
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts_hp[0],
2463
3.16k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[0])));
2464
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvcosts_hp[1],
2465
3.16k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts_hp[1])));
2466
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts[0],
2467
3.16k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[0])));
2468
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts[1],
2469
3.16k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts[1])));
2470
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts_hp[0],
2471
3.16k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[0])));
2472
3.16k
  CHECK_MEM_ERROR(&cm->error, cpi->nmvsadcosts_hp[1],
2473
3.16k
                  vpx_calloc(MV_VALS, sizeof(*cpi->nmvsadcosts_hp[1])));
2474
2475
82.3k
  for (i = 0; i < (sizeof(cpi->mbgraph_stats) / sizeof(cpi->mbgraph_stats[0]));
2476
79.2k
       i++) {
2477
79.2k
    CHECK_MEM_ERROR(
2478
79.2k
        &cm->error, cpi->mbgraph_stats[i].mb_stats,
2479
79.2k
        vpx_calloc(cm->MBs * sizeof(*cpi->mbgraph_stats[i].mb_stats), 1));
2480
79.2k
  }
2481
2482
3.16k
  cpi->refresh_alt_ref_frame = 0;
2483
3.16k
  cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
2484
2485
3.16k
  init_level_info(&cpi->level_info);
2486
3.16k
  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.16k
  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.16k
  cal_nmvjointsadcost(cpi->td.mb.nmvjointsadcost);
2539
3.16k
  cpi->td.mb.nmvcost[0] = &cpi->nmvcosts[0][MV_MAX];
2540
3.16k
  cpi->td.mb.nmvcost[1] = &cpi->nmvcosts[1][MV_MAX];
2541
3.16k
  cpi->td.mb.nmvsadcost[0] = &cpi->nmvsadcosts[0][MV_MAX];
2542
3.16k
  cpi->td.mb.nmvsadcost[1] = &cpi->nmvsadcosts[1][MV_MAX];
2543
3.16k
  cal_nmvsadcosts(cpi->td.mb.nmvsadcost);
2544
2545
3.16k
  cpi->td.mb.nmvcost_hp[0] = &cpi->nmvcosts_hp[0][MV_MAX];
2546
3.16k
  cpi->td.mb.nmvcost_hp[1] = &cpi->nmvcosts_hp[1][MV_MAX];
2547
3.16k
  cpi->td.mb.nmvsadcost_hp[0] = &cpi->nmvsadcosts_hp[0][MV_MAX];
2548
3.16k
  cpi->td.mb.nmvsadcost_hp[1] = &cpi->nmvsadcosts_hp[1][MV_MAX];
2549
3.16k
  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.16k
  cpi->allow_encode_breakout = ENCODE_BREAKOUT_ENABLED;
2574
2575
3.16k
  {
2576
3.16k
    vpx_codec_err_t codec_status = vp9_extrc_init(&cpi->ext_ratectrl);
2577
3.16k
    if (codec_status != VPX_CODEC_OK) {
2578
0
      vpx_internal_error(&cm->error, codec_status, "vp9_extrc_init() failed");
2579
0
    }
2580
3.16k
  }
2581
2582
3.16k
#if !CONFIG_REALTIME_ONLY
2583
3.16k
  if (oxcf->pass == 1) {
2584
0
    vp9_init_first_pass(cpi);
2585
3.16k
  } 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.16k
#endif  // !CONFIG_REALTIME_ONLY
2648
2649
3.16k
  cpi->mb_wiener_var_cols = 0;
2650
3.16k
  cpi->mb_wiener_var_rows = 0;
2651
3.16k
  cpi->mb_wiener_variance = NULL;
2652
3.16k
  cpi->mi_ssim_rdmult_scaling_factors = NULL;
2653
3.16k
  cpi->mi_ssim_rdmult_scaling_factors_rows = 0;
2654
3.16k
  cpi->mi_ssim_rdmult_scaling_factors_cols = 0;
2655
2656
3.16k
  vp9_set_speed_features_framesize_independent(cpi, oxcf->speed);
2657
3.16k
  vp9_set_speed_features_framesize_dependent(cpi, oxcf->speed);
2658
2659
3.16k
  cpi->kmeans_data_arr_alloc = 0;
2660
#if CONFIG_NON_GREEDY_MV
2661
  cpi->tpl_ready = 0;
2662
#endif  // CONFIG_NON_GREEDY_MV
2663
161k
  for (i = 0; i < MAX_ARF_GOP_SIZE; ++i) {
2664
158k
    cpi->tpl_stats[i].tpl_stats_ptr = NULL;
2665
158k
  }
2666
2667
3.16k
#define BFP(BT, SDF, SDSF, SDAF, VF, SVF, SVAF, SDX4DF, SDSX4DF) \
2668
41.1k
  cpi->fn_ptr[BT].sdf = SDF;                                     \
2669
41.1k
  cpi->fn_ptr[BT].sdsf = SDSF;                                   \
2670
41.1k
  cpi->fn_ptr[BT].sdaf = SDAF;                                   \
2671
41.1k
  cpi->fn_ptr[BT].vf = VF;                                       \
2672
41.1k
  cpi->fn_ptr[BT].svf = SVF;                                     \
2673
41.1k
  cpi->fn_ptr[BT].svaf = SVAF;                                   \
2674
41.1k
  cpi->fn_ptr[BT].sdx4df = SDX4DF;                               \
2675
41.1k
  cpi->fn_ptr[BT].sdsx4df = SDSX4DF;
2676
2677
3.16k
  BFP(BLOCK_32X16, vpx_sad32x16, vpx_sad_skip_32x16, vpx_sad32x16_avg,
2678
3.16k
      vpx_variance32x16, vpx_sub_pixel_variance32x16,
2679
3.16k
      vpx_sub_pixel_avg_variance32x16, vpx_sad32x16x4d, vpx_sad_skip_32x16x4d)
2680
2681
3.16k
  BFP(BLOCK_16X32, vpx_sad16x32, vpx_sad_skip_16x32, vpx_sad16x32_avg,
2682
3.16k
      vpx_variance16x32, vpx_sub_pixel_variance16x32,
2683
3.16k
      vpx_sub_pixel_avg_variance16x32, vpx_sad16x32x4d, vpx_sad_skip_16x32x4d)
2684
2685
3.16k
  BFP(BLOCK_64X32, vpx_sad64x32, vpx_sad_skip_64x32, vpx_sad64x32_avg,
2686
3.16k
      vpx_variance64x32, vpx_sub_pixel_variance64x32,
2687
3.16k
      vpx_sub_pixel_avg_variance64x32, vpx_sad64x32x4d, vpx_sad_skip_64x32x4d)
2688
2689
3.16k
  BFP(BLOCK_32X64, vpx_sad32x64, vpx_sad_skip_32x64, vpx_sad32x64_avg,
2690
3.16k
      vpx_variance32x64, vpx_sub_pixel_variance32x64,
2691
3.16k
      vpx_sub_pixel_avg_variance32x64, vpx_sad32x64x4d, vpx_sad_skip_32x64x4d)
2692
2693
3.16k
  BFP(BLOCK_32X32, vpx_sad32x32, vpx_sad_skip_32x32, vpx_sad32x32_avg,
2694
3.16k
      vpx_variance32x32, vpx_sub_pixel_variance32x32,
2695
3.16k
      vpx_sub_pixel_avg_variance32x32, vpx_sad32x32x4d, vpx_sad_skip_32x32x4d)
2696
2697
3.16k
  BFP(BLOCK_64X64, vpx_sad64x64, vpx_sad_skip_64x64, vpx_sad64x64_avg,
2698
3.16k
      vpx_variance64x64, vpx_sub_pixel_variance64x64,
2699
3.16k
      vpx_sub_pixel_avg_variance64x64, vpx_sad64x64x4d, vpx_sad_skip_64x64x4d)
2700
2701
3.16k
  BFP(BLOCK_16X16, vpx_sad16x16, vpx_sad_skip_16x16, vpx_sad16x16_avg,
2702
3.16k
      vpx_variance16x16, vpx_sub_pixel_variance16x16,
2703
3.16k
      vpx_sub_pixel_avg_variance16x16, vpx_sad16x16x4d, vpx_sad_skip_16x16x4d)
2704
2705
3.16k
  BFP(BLOCK_16X8, vpx_sad16x8, vpx_sad_skip_16x8, vpx_sad16x8_avg,
2706
3.16k
      vpx_variance16x8, vpx_sub_pixel_variance16x8,
2707
3.16k
      vpx_sub_pixel_avg_variance16x8, vpx_sad16x8x4d, vpx_sad_skip_16x8x4d)
2708
2709
3.16k
  BFP(BLOCK_8X16, vpx_sad8x16, vpx_sad_skip_8x16, vpx_sad8x16_avg,
2710
3.16k
      vpx_variance8x16, vpx_sub_pixel_variance8x16,
2711
3.16k
      vpx_sub_pixel_avg_variance8x16, vpx_sad8x16x4d, vpx_sad_skip_8x16x4d)
2712
2713
3.16k
  BFP(BLOCK_8X8, vpx_sad8x8, vpx_sad_skip_8x8, vpx_sad8x8_avg, vpx_variance8x8,
2714
3.16k
      vpx_sub_pixel_variance8x8, vpx_sub_pixel_avg_variance8x8, vpx_sad8x8x4d,
2715
3.16k
      vpx_sad_skip_8x8x4d)
2716
2717
3.16k
  BFP(BLOCK_8X4, vpx_sad8x4, vpx_sad_skip_8x4, vpx_sad8x4_avg, vpx_variance8x4,
2718
3.16k
      vpx_sub_pixel_variance8x4, vpx_sub_pixel_avg_variance8x4, vpx_sad8x4x4d,
2719
3.16k
      vpx_sad_skip_8x4x4d)
2720
2721
3.16k
  BFP(BLOCK_4X8, vpx_sad4x8, vpx_sad_skip_4x8, vpx_sad4x8_avg, vpx_variance4x8,
2722
3.16k
      vpx_sub_pixel_variance4x8, vpx_sub_pixel_avg_variance4x8, vpx_sad4x8x4d,
2723
3.16k
      vpx_sad_skip_4x8x4d)
2724
2725
3.16k
  BFP(BLOCK_4X4, vpx_sad4x4, vpx_sad_skip_4x4, vpx_sad4x4_avg, vpx_variance4x4,
2726
3.16k
      vpx_sub_pixel_variance4x4, vpx_sub_pixel_avg_variance4x4, vpx_sad4x4x4d,
2727
3.16k
      vpx_sad_skip_4x4x4d)
2728
2729
3.16k
#if CONFIG_VP9_HIGHBITDEPTH
2730
3.16k
  highbd_set_var_fns(cpi);
2731
3.16k
#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.16k
  vp9_init_quantizer(cpi);
2739
2740
3.16k
  vp9_loop_filter_init(cm);
2741
2742
  // Set up the unit scaling factor used during motion search.
2743
3.16k
#if CONFIG_VP9_HIGHBITDEPTH
2744
3.16k
  vp9_setup_scale_factors_for_frame(&cpi->me_sf, cm->width, cm->height,
2745
3.16k
                                    cm->width, cm->height,
2746
3.16k
                                    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.16k
  cpi->td.mb.me_sf = &cpi->me_sf;
2752
2753
3.16k
  cm->error.setjmp = 0;
2754
2755
3.16k
  return cpi;
2756
3.16k
}
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.20k
void vp9_remove_compressor(VP9_COMP *cpi) {
2766
3.20k
  VP9_COMMON *cm;
2767
3.20k
  unsigned int i;
2768
2769
3.20k
  if (!cpi) return;
2770
2771
#if CONFIG_INTERNAL_STATS
2772
  vpx_free(cpi->ssim_vars);
2773
#endif
2774
2775
3.16k
  cm = &cpi->common;
2776
3.16k
  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
2.96k
  }
2866
2867
#if CONFIG_VP9_TEMPORAL_DENOISING
2868
  vp9_denoiser_free(&(cpi->denoiser));
2869
#endif
2870
2871
3.16k
  if (cpi->kmeans_data_arr_alloc) {
2872
2.96k
#if CONFIG_MULTITHREAD
2873
2.96k
    pthread_mutex_destroy(&cpi->kmeans_mutex);
2874
2.96k
#endif
2875
2.96k
    vpx_free(cpi->kmeans_data_arr);
2876
2.96k
  }
2877
2878
3.16k
  vp9_free_tpl_buffer(cpi);
2879
2880
3.16k
  vp9_loop_filter_dealloc(&cpi->lf_row_sync);
2881
3.16k
  vp9_bitstream_encode_tiles_buffer_dealloc(cpi);
2882
3.16k
  vp9_row_mt_mem_dealloc(cpi);
2883
3.16k
  vp9_encode_free_mt_data(cpi);
2884
2885
3.16k
#if !CONFIG_REALTIME_ONLY
2886
3.16k
  vp9_alt_ref_aq_destroy(cpi->alt_ref_aq);
2887
3.16k
#endif
2888
2889
3.16k
  dealloc_compressor_data(cpi);
2890
2891
82.3k
  for (i = 0; i < sizeof(cpi->mbgraph_stats) / sizeof(cpi->mbgraph_stats[0]);
2892
79.2k
       ++i) {
2893
79.2k
    vpx_free(cpi->mbgraph_stats[i].mb_stats);
2894
79.2k
  }
2895
2896
3.16k
  vp9_extrc_delete(&cpi->ext_ratectrl);
2897
2898
  // Help detect use after free of the error detail string.
2899
3.16k
  memset(cm->error.detail, 'A', sizeof(cm->error.detail) - 1);
2900
3.16k
  cm->error.detail[sizeof(cm->error.detail) - 1] = '\0';
2901
2902
3.16k
  vp9_remove_common(cm);
2903
3.16k
  vp9_free_ref_frame_buffers(cm->buffer_pool);
2904
#if CONFIG_VP9_POSTPROC
2905
  vp9_free_postproc_buffers(cm);
2906
#endif
2907
3.16k
  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.16k
}
2939
2940
55.8k
int vp9_get_psnr(const VP9_COMP *cpi, PSNR_STATS *psnr) {
2941
55.8k
  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
55.8k
  } else {
2952
55.8k
    vp9_zero(*psnr);
2953
55.8k
    return 0;
2954
55.8k
  }
2955
55.8k
}
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
55.8k
static void update_ref_frames(VP9_COMP *cpi) {
3288
55.8k
  VP9_COMMON *const cm = &cpi->common;
3289
55.8k
  BufferPool *const pool = cm->buffer_pool;
3290
55.8k
  GF_GROUP *const gf_group = &cpi->twopass.gf_group;
3291
3292
55.8k
  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
55.8k
  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
55.8k
  } 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
55.8k
  if (cm->frame_type == KEY_FRAME) {
3335
12.1k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
3336
12.1k
               cm->new_fb_idx);
3337
12.1k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->alt_fb_idx],
3338
12.1k
               cm->new_fb_idx);
3339
43.7k
  } 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
43.7k
  } else { /* For non key/golden frames */
3357
43.7k
    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
43.7k
    if (cpi->refresh_golden_frame) {
3376
3.18k
      ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->gld_fb_idx],
3377
3.18k
                 cm->new_fb_idx);
3378
3.18k
      if (!cpi->rc.is_src_frame_alt_ref)
3379
3.18k
        memcpy(cpi->interp_filter_selected[GOLDEN_FRAME],
3380
3.18k
               cpi->interp_filter_selected[0],
3381
3.18k
               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
3.18k
    }
3387
43.7k
  }
3388
3389
55.8k
  if (cpi->refresh_last_frame) {
3390
55.8k
    ref_cnt_fb(pool->frame_bufs, &cm->ref_frame_map[cpi->lst_fb_idx],
3391
55.8k
               cm->new_fb_idx);
3392
55.8k
    if (!cpi->rc.is_src_frame_alt_ref)
3393
55.8k
      memcpy(cpi->interp_filter_selected[LAST_FRAME],
3394
55.8k
             cpi->interp_filter_selected[0],
3395
55.8k
             sizeof(cpi->interp_filter_selected[0]));
3396
55.8k
  }
3397
3398
55.8k
  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
55.8k
}
3404
3405
55.8k
void vp9_update_reference_frames(VP9_COMP *cpi) {
3406
55.8k
  update_ref_frames(cpi);
3407
3408
#if CONFIG_VP9_TEMPORAL_DENOISING
3409
  vp9_denoiser_update_ref_frame(cpi);
3410
#endif
3411
3412
55.8k
  if (is_one_pass_svc(cpi)) vp9_svc_update_ref_frame(cpi);
3413
55.8k
}
3414
3415
55.8k
static void loopfilter_frame(VP9_COMP *cpi, VP9_COMMON *cm) {
3416
55.8k
  MACROBLOCKD *xd = &cpi->td.mb.e_mbd;
3417
55.8k
  struct loopfilter *lf = &cm->lf;
3418
55.8k
  int is_reference_frame =
3419
55.8k
      (cm->frame_type == KEY_FRAME || cpi->refresh_last_frame ||
3420
0
       cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame);
3421
55.8k
  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
55.8k
  if (cm->show_existing_frame) {
3427
0
    lf->filter_level = 0;
3428
0
    return;
3429
0
  }
3430
3431
55.8k
  if (cpi->loopfilter_ctrl == NO_LOOPFILTER ||
3432
55.8k
      (!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
55.8k
  if (xd->lossless) {
3439
12.1k
    lf->filter_level = 0;
3440
12.1k
    lf->last_filt_level = 0;
3441
43.6k
  } else {
3442
#if CONFIG_INTERNAL_STATS
3443
    struct vpx_usec_timer timer;
3444
#endif
3445
3446
43.6k
    vpx_clear_system_state();
3447
3448
#if CONFIG_INTERNAL_STATS
3449
    vpx_usec_timer_start(&timer);
3450
#endif
3451
3452
43.6k
    if (!cpi->rc.is_src_frame_alt_ref) {
3453
43.6k
      if ((cpi->common.frame_type == KEY_FRAME) &&
3454
10.7k
          (!cpi->rc.this_key_frame_forced)) {
3455
7.45k
        lf->last_filt_level = 0;
3456
7.45k
      }
3457
43.6k
      vp9_pick_filter_level(cpi->Source, cpi, cpi->sf.lpf_pick);
3458
43.6k
      lf->last_filt_level = lf->filter_level;
3459
43.6k
    } 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
43.6k
  }
3468
3469
55.8k
  if (lf->filter_level > 0 && is_reference_frame) {
3470
28.7k
    vp9_build_mask_frame(cm, lf->filter_level, 0);
3471
3472
28.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
28.7k
    else
3477
28.7k
      vp9_loop_filter_frame(cm->frame_to_show, cm, xd, lf->filter_level, 0, 0);
3478
28.7k
  }
3479
3480
55.8k
  vpx_extend_frame_inner_borders(cm->frame_to_show);
3481
55.8k
}
3482
3483
43.7k
void vp9_scale_references(VP9_COMP *cpi) {
3484
43.7k
  VP9_COMMON *cm = &cpi->common;
3485
43.7k
  MV_REFERENCE_FRAME ref_frame;
3486
43.7k
  const VP9_REFFRAME ref_mask[3] = { VP9_LAST_FLAG, VP9_GOLD_FLAG,
3487
43.7k
                                     VP9_ALT_FLAG };
3488
3489
174k
  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
131k
    if (cpi->ref_frame_flags & ref_mask[ref_frame - 1]) {
3492
108k
      BufferPool *const pool = cm->buffer_pool;
3493
108k
      const YV12_BUFFER_CONFIG *const ref =
3494
108k
          get_ref_frame_buffer(cpi, ref_frame);
3495
3496
108k
      if (ref == NULL) {
3497
0
        cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
3498
0
        continue;
3499
0
      }
3500
3501
108k
      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
108k
      } else {
3540
108k
        int buf_idx;
3541
108k
        RefCntBuffer *buf = NULL;
3542
108k
        if (cpi->oxcf.pass == 0 && !cpi->use_svc) {
3543
          // Check for release of scaled reference.
3544
108k
          buf_idx = cpi->scaled_ref_idx[ref_frame - 1];
3545
108k
          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
108k
        }
3551
108k
        buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
3552
108k
        buf = &pool->frame_bufs[buf_idx];
3553
108k
        buf->buf.y_crop_width = ref->y_crop_width;
3554
108k
        buf->buf.y_crop_height = ref->y_crop_height;
3555
108k
        cpi->scaled_ref_idx[ref_frame - 1] = buf_idx;
3556
108k
        ++buf->ref_count;
3557
108k
      }
3558
108k
    } else {
3559
22.6k
      if (cpi->oxcf.pass != 0 || cpi->use_svc)
3560
0
        cpi->scaled_ref_idx[ref_frame - 1] = INVALID_IDX;
3561
22.6k
    }
3562
131k
  }
3563
43.7k
}
3564
3565
43.7k
static void release_scaled_references(VP9_COMP *cpi) {
3566
43.7k
  VP9_COMMON *cm = &cpi->common;
3567
43.7k
  int i;
3568
43.7k
  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
43.7k
    int refresh[3];
3572
43.7k
    refresh[0] = (cpi->refresh_last_frame) ? 1 : 0;
3573
43.7k
    refresh[1] = (cpi->refresh_golden_frame) ? 1 : 0;
3574
43.7k
    refresh[2] = (cpi->refresh_alt_ref_frame) ? 1 : 0;
3575
174k
    for (i = LAST_FRAME; i <= ALTREF_FRAME; ++i) {
3576
131k
      const int idx = cpi->scaled_ref_idx[i - 1];
3577
131k
      if (idx != INVALID_IDX) {
3578
108k
        RefCntBuffer *const buf = &cm->buffer_pool->frame_bufs[idx];
3579
108k
        const YV12_BUFFER_CONFIG *const ref = get_ref_frame_buffer(cpi, i);
3580
108k
        if (refresh[i - 1] || (buf->buf.y_crop_width == ref->y_crop_width &&
3581
108k
                               buf->buf.y_crop_height == ref->y_crop_height)) {
3582
108k
          --buf->ref_count;
3583
108k
          cpi->scaled_ref_idx[i - 1] = INVALID_IDX;
3584
108k
        }
3585
108k
      }
3586
131k
    }
3587
43.7k
  } 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
43.7k
}
3598
3599
static void full_to_model_count(unsigned int *model_count,
3600
29.4M
                                unsigned int *full_count) {
3601
29.4M
  int n;
3602
29.4M
  model_count[ZERO_TOKEN] = full_count[ZERO_TOKEN];
3603
29.4M
  model_count[ONE_TOKEN] = full_count[ONE_TOKEN];
3604
29.4M
  model_count[TWO_TOKEN] = full_count[TWO_TOKEN];
3605
265M
  for (n = THREE_TOKEN; n < EOB_TOKEN; ++n)
3606
235M
    model_count[TWO_TOKEN] += full_count[n];
3607
29.4M
  model_count[EOB_MODEL_TOKEN] = full_count[EOB_TOKEN];
3608
29.4M
}
3609
3610
static void full_to_model_counts(vp9_coeff_count_model *model_count,
3611
223k
                                 vp9_coeff_count *full_count) {
3612
223k
  int i, j, k, l;
3613
3614
669k
  for (i = 0; i < PLANE_TYPES; ++i)
3615
1.33M
    for (j = 0; j < REF_TYPES; ++j)
3616
6.25M
      for (k = 0; k < COEF_BANDS; ++k)
3617
34.8M
        for (l = 0; l < BAND_COEFF_CONTEXTS(k); ++l)
3618
29.4M
          full_to_model_count(model_count[i][j][k][l], full_count[i][j][k][l]);
3619
223k
}
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
55.8k
static void set_size_independent_vars(VP9_COMP *cpi) {
3768
55.8k
  vp9_set_speed_features_framesize_independent(cpi, cpi->oxcf.speed);
3769
55.8k
  vp9_set_rd_speed_thresholds(cpi);
3770
55.8k
  vp9_set_rd_speed_thresholds_sub8x8(cpi);
3771
55.8k
  cpi->common.interp_filter = cpi->sf.default_interp_filter;
3772
55.8k
}
3773
3774
static void set_size_dependent_vars(VP9_COMP *cpi, int *q, int *bottom_index,
3775
55.8k
                                    int *top_index) {
3776
55.8k
  VP9_COMMON *const cm = &cpi->common;
3777
3778
  // Setup variables that depend on the dimensions of the frame.
3779
55.8k
  vp9_set_speed_features_framesize_dependent(cpi, cpi->oxcf.speed);
3780
3781
  // Decide q and q bounds.
3782
55.8k
  *q = vp9_rc_pick_q_and_bounds(cpi, bottom_index, top_index);
3783
3784
55.8k
  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
55.8k
  if (cpi->use_svc) {
3790
0
    cpi->svc.base_qindex[cpi->svc.spatial_layer_id] = *q;
3791
0
  }
3792
3793
55.8k
  if (!frame_is_intra_only(cm)) {
3794
43.7k
    vp9_set_high_precision_mv(cpi, (*q) < HIGH_PRECISION_MV_QTHRESH);
3795
43.7k
  }
3796
3797
55.8k
#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
55.8k
  if (cpi->oxcf.pass == 2 && cpi->sf.static_segmentation)
3803
0
    configure_static_seg_features(cpi);
3804
55.8k
#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
55.8k
}
3832
3833
111k
static void init_motion_estimation(VP9_COMP *cpi) {
3834
111k
  int y_stride = cpi->scaled_source.y_stride;
3835
3836
111k
  if (cpi->sf.mv.search_method == NSTEP) {
3837
111k
    vp9_init3smotion_compensation(&cpi->ss_cfg, y_stride);
3838
111k
  } else if (cpi->sf.mv.search_method == DIAMOND) {
3839
0
    vp9_init_dsmotion_compensation(&cpi->ss_cfg, y_stride);
3840
0
  }
3841
111k
}
3842
3843
55.8k
static void set_frame_size(VP9_COMP *cpi) {
3844
55.8k
  int ref_frame;
3845
55.8k
  VP9_COMMON *const cm = &cpi->common;
3846
55.8k
  VP9EncoderConfig *const oxcf = &cpi->oxcf;
3847
55.8k
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
3848
3849
55.8k
#if !CONFIG_REALTIME_ONLY
3850
55.8k
  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
55.8k
#endif  // !CONFIG_REALTIME_ONLY
3861
3862
55.8k
  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
55.8k
  if ((oxcf->pass == 2) && !cpi->use_svc) {
3893
0
    vp9_set_target_rate(cpi);
3894
0
  }
3895
3896
55.8k
  alloc_frame_mvs(cm, cm->new_fb_idx);
3897
3898
  // Reset the frame pointers to the current frame size.
3899
55.8k
  if (vpx_realloc_frame_buffer(get_frame_new_buffer(cm), cm->width, cm->height,
3900
55.8k
                               cm->subsampling_x, cm->subsampling_y,
3901
55.8k
#if CONFIG_VP9_HIGHBITDEPTH
3902
55.8k
                               cm->use_highbitdepth,
3903
55.8k
#endif
3904
55.8k
                               VP9_ENC_BORDER_IN_PIXELS, cm->byte_alignment,
3905
55.8k
                               NULL, NULL, NULL))
3906
0
    vpx_internal_error(&cm->error, VPX_CODEC_MEM_ERROR,
3907
0
                       "Failed to allocate frame buffer");
3908
3909
55.8k
  alloc_util_frame_buffers(cpi);
3910
55.8k
  init_motion_estimation(cpi);
3911
3912
55.8k
  int has_valid_ref_frame = 0;
3913
223k
  for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
3914
167k
    RefBuffer *const ref_buf = &cm->frame_refs[ref_frame - 1];
3915
167k
    const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
3916
3917
167k
    ref_buf->idx = buf_idx;
3918
3919
167k
    if (buf_idx != INVALID_IDX) {
3920
158k
      YV12_BUFFER_CONFIG *const buf = &cm->buffer_pool->frame_bufs[buf_idx].buf;
3921
158k
      ref_buf->buf = buf;
3922
158k
#if CONFIG_VP9_HIGHBITDEPTH
3923
158k
      vp9_setup_scale_factors_for_frame(
3924
158k
          &ref_buf->sf, buf->y_crop_width, buf->y_crop_height, cm->width,
3925
158k
          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
158k
      has_valid_ref_frame |= vp9_is_valid_scale(&ref_buf->sf);
3932
158k
      if (vp9_is_scaled(&ref_buf->sf)) vpx_extend_frame_borders(buf);
3933
158k
    } else {
3934
8.89k
      ref_buf->buf = NULL;
3935
8.89k
    }
3936
167k
  }
3937
55.8k
  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
55.8k
  set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
3944
55.8k
}
3945
3946
55.8k
static void save_encode_params(VP9_COMP *cpi) {
3947
55.8k
  int tile_idx;
3948
55.8k
  int i, j;
3949
55.8k
  TileDataEnc *tile_data;
3950
55.8k
  RD_OPT *rd_opt = &cpi->rd;
3951
279k
  for (i = 0; i < MAX_REF_FRAMES; i++) {
3952
894k
    for (j = 0; j < REFERENCE_MODES; j++)
3953
670k
      rd_opt->prediction_type_threshes_prev[i][j] =
3954
670k
          rd_opt->prediction_type_threshes[i][j];
3955
3956
1.11M
    for (j = 0; j < SWITCHABLE_FILTER_CONTEXTS; j++)
3957
894k
      rd_opt->filter_threshes_prev[i][j] = rd_opt->filter_threshes[i][j];
3958
223k
  }
3959
3960
109k
  for (tile_idx = 0; tile_idx < cpi->allocated_tiles; tile_idx++) {
3961
53.3k
    assert(cpi->tile_data);
3962
53.3k
    tile_data = &cpi->tile_data[tile_idx];
3963
53.3k
    vp9_copy(tile_data->thresh_freq_fact_prev, tile_data->thresh_freq_fact);
3964
53.3k
  }
3965
55.8k
}
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
55.8k
                                      uint8_t *dest, size_t dest_size) {
4012
55.8k
  VP9_COMMON *const cm = &cpi->common;
4013
55.8k
  SVC *const svc = &cpi->svc;
4014
55.8k
  int q = 0, bottom_index = 0, top_index = 0;
4015
55.8k
  int no_drop_scene_change = 0;
4016
55.8k
  const INTERP_FILTER filter_scaler =
4017
55.8k
      (is_one_pass_svc(cpi))
4018
55.8k
          ? svc->downsample_filter_type[svc->spatial_layer_id]
4019
55.8k
          : EIGHTTAP;
4020
55.8k
  const int phase_scaler =
4021
55.8k
      (is_one_pass_svc(cpi))
4022
55.8k
          ? svc->downsample_filter_phase[svc->spatial_layer_id]
4023
55.8k
          : 0;
4024
4025
55.8k
  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
55.8k
  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
55.8k
  cpi->compute_source_sad_onepass = cpi->oxcf.mode == REALTIME;
4037
4038
55.8k
  vpx_clear_system_state();
4039
4040
55.8k
  set_frame_size(cpi);
4041
4042
55.8k
  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
55.8k
  } 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
55.8k
  } else {
4065
55.8k
    cpi->Source = vp9_scale_if_required(
4066
55.8k
        cm, cpi->un_scaled_source, &cpi->scaled_source, (cpi->oxcf.pass == 0),
4067
55.8k
        filter_scaler, phase_scaler);
4068
55.8k
  }
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
55.8k
  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
55.8k
  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
55.8k
      cpi->resize_pending || cpi->resize_state || cpi->external_resize ||
4096
55.8k
      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
55.8k
  if (cpi->unscaled_last_source != NULL &&
4108
52.9k
      (cpi->oxcf.content == VP9E_CONTENT_SCREEN ||
4109
52.9k
       (cpi->oxcf.pass == 0 && cpi->oxcf.rc_mode == VPX_VBR &&
4110
49.3k
        cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5) ||
4111
52.9k
       (cpi->noise_estimate.enabled && !cpi->oxcf.noise_sensitivity) ||
4112
52.9k
       cpi->compute_source_sad_onepass))
4113
31.4k
    cpi->Last_Source = vp9_scale_if_required(
4114
31.4k
        cm, cpi->unscaled_last_source, &cpi->scaled_last_source,
4115
31.4k
        (cpi->oxcf.pass == 0), EIGHTTAP, 0);
4116
4117
55.8k
  if (cpi->Last_Source == NULL ||
4118
31.4k
      cpi->Last_Source->y_width != cpi->Source->y_width ||
4119
31.4k
      cpi->Last_Source->y_height != cpi->Source->y_height)
4120
24.4k
    cpi->compute_source_sad_onepass = 0;
4121
4122
55.8k
  if (frame_is_intra_only(cm) || cpi->resize_pending != 0) {
4123
12.1k
    memset(cpi->consec_zero_mv, 0,
4124
12.1k
           cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv));
4125
12.1k
  }
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
55.8k
  cpi->rc.high_source_sad = 0;
4135
55.8k
  cpi->rc.hybrid_intra_scene_change = 0;
4136
55.8k
  cpi->rc.re_encode_maxq_scene_change = 0;
4137
55.8k
  if (cm->show_frame && cpi->oxcf.mode == REALTIME &&
4138
33.2k
      !cpi->disable_scene_detection_rtc_ratectrl &&
4139
33.2k
      (cpi->oxcf.rc_mode == VPX_VBR ||
4140
2.34k
       cpi->oxcf.content == VP9E_CONTENT_SCREEN || cpi->oxcf.speed >= 5))
4141
30.8k
    vp9_scene_detection_onepass(cpi);
4142
4143
55.8k
  if (svc->spatial_layer_id == svc->first_spatial_layer_to_encode) {
4144
55.8k
    svc->high_source_sad_superframe = cpi->rc.high_source_sad;
4145
55.8k
    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
55.8k
    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
55.8k
  }
4160
4161
55.8k
  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
55.8k
  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
55.8k
  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
55.8k
  if (frame_is_intra_only(cm) == 0 &&
4184
43.7k
      ((svc->single_layer_svc && cpi->oxcf.resize_mode == RESIZE_DYNAMIC) ||
4185
43.7k
       !(is_one_pass_svc(cpi) && svc->force_zero_mode_spatial_ref &&
4186
43.7k
         cpi->sf.use_nonrd_pick_mode))) {
4187
43.7k
    vp9_scale_references(cpi);
4188
43.7k
  }
4189
4190
55.8k
  set_size_independent_vars(cpi);
4191
55.8k
  set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
4192
4193
  // search method and step parameter might be changed in speed settings.
4194
55.8k
  init_motion_estimation(cpi);
4195
4196
55.8k
  if (cpi->sf.copy_partition_flag) alloc_copy_partition_data(cpi);
4197
4198
55.8k
  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
55.8k
  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
55.8k
  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
55.8k
  vp9_set_quantizer(cpi, q, 0);
4223
55.8k
  vp9_set_variance_partition_thresholds(cpi, q, 0);
4224
4225
55.8k
  setup_frame(cpi);
4226
4227
55.8k
  suppress_active_map(cpi);
4228
4229
55.8k
  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
55.8k
  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
55.8k
  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
55.8k
#if !CONFIG_REALTIME_ONLY
4257
  // Variance adaptive and in frame q adjustment experiments are mutually
4258
  // exclusive.
4259
55.8k
  if (cpi->oxcf.aq_mode == VARIANCE_AQ) {
4260
0
    vp9_vaq_frame_setup(cpi);
4261
55.8k
  } else if (cpi->oxcf.aq_mode == EQUATOR360_AQ) {
4262
0
    vp9_360aq_frame_setup(cpi);
4263
55.8k
  } else if (cpi->oxcf.aq_mode == COMPLEXITY_AQ) {
4264
0
    vp9_setup_in_frame_q_adj(cpi);
4265
55.8k
  } 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
55.8k
  } else {
4270
55.8k
#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
55.8k
    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
55.8k
    } else if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) {
4284
0
      vp9_cyclic_refresh_setup(cpi);
4285
0
    }
4286
4287
55.8k
#if !CONFIG_REALTIME_ONLY
4288
55.8k
  }
4289
55.8k
#endif
4290
4291
55.8k
  apply_active_map(cpi);
4292
4293
55.8k
  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
55.8k
  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
55.8k
  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
55.8k
  vpx_clear_system_state();
4339
55.8k
  return 1;
4340
55.8k
}
4341
4342
55.8k
static int get_ref_frame_flags(const VP9_COMP *cpi) {
4343
55.8k
  const int *const map = cpi->common.ref_frame_map;
4344
55.8k
  const int gold_is_last = map[cpi->gld_fb_idx] == map[cpi->lst_fb_idx];
4345
55.8k
  const int alt_is_last = map[cpi->alt_fb_idx] == map[cpi->lst_fb_idx];
4346
55.8k
  const int gold_is_alt = map[cpi->gld_fb_idx] == map[cpi->alt_fb_idx];
4347
55.8k
  int flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
4348
4349
55.8k
  if (gold_is_last) flags &= ~VP9_GOLD_FLAG;
4350
4351
55.8k
  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
55.8k
  if (alt_is_last) flags &= ~VP9_ALT_FLAG;
4357
4358
55.8k
  if (gold_is_alt) flags &= ~VP9_ALT_FLAG;
4359
4360
55.8k
  return flags;
4361
55.8k
}
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
55.8k
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
55.8k
  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
55.8k
  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
55.8k
}
4797
4798
YV12_BUFFER_CONFIG *vp9_scale_if_required(
4799
    VP9_COMMON *cm, YV12_BUFFER_CONFIG *unscaled, YV12_BUFFER_CONFIG *scaled,
4800
87.3k
    int use_normative_scaler, INTERP_FILTER filter_type, int phase_scaler) {
4801
87.3k
  if (cm->mi_cols * MI_SIZE != unscaled->y_width ||
4802
87.3k
      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
87.3k
  } else {
4823
87.3k
    return unscaled;
4824
87.3k
  }
4825
87.3k
}
4826
4827
55.8k
static void set_ref_sign_bias(VP9_COMP *cpi) {
4828
55.8k
  VP9_COMMON *const cm = &cpi->common;
4829
55.8k
  RefCntBuffer *const ref_buffer = get_ref_cnt_buffer(cm, cm->new_fb_idx);
4830
55.8k
  const int cur_frame_index = ref_buffer->frame_index;
4831
55.8k
  MV_REFERENCE_FRAME ref_frame;
4832
4833
223k
  for (ref_frame = LAST_FRAME; ref_frame < MAX_REF_FRAMES; ++ref_frame) {
4834
167k
    const int buf_idx = get_ref_frame_buf_idx(cpi, ref_frame);
4835
167k
    const RefCntBuffer *const ref_cnt_buf =
4836
167k
        get_ref_cnt_buffer(&cpi->common, buf_idx);
4837
167k
    if (ref_cnt_buf) {
4838
158k
      cm->ref_frame_sign_bias[ref_frame] =
4839
158k
          cur_frame_index < ref_cnt_buf->frame_index;
4840
158k
    }
4841
167k
  }
4842
55.8k
}
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
55.8k
static void set_frame_index(VP9_COMP *cpi, VP9_COMMON *cm) {
5051
55.8k
  RefCntBuffer *const ref_buffer = get_ref_cnt_buffer(cm, cm->new_fb_idx);
5052
5053
55.8k
  if (ref_buffer) {
5054
55.8k
    const GF_GROUP *const gf_group = &cpi->twopass.gf_group;
5055
55.8k
    ref_buffer->frame_index =
5056
55.8k
        cm->current_video_frame + gf_group->arf_src_offset[gf_group->index];
5057
55.8k
    ref_buffer->frame_coding_index = cm->current_frame_coding_index;
5058
55.8k
  }
5059
55.8k
}
5060
5061
0
static void init_mb_ssim_rdmult_scaling_buffer(VP9_COMP *cpi) {
5062
0
  VP9_COMMON *cm = &cpi->common;
5063
5064
0
  if (cpi->mi_ssim_rdmult_scaling_factors &&
5065
0
      cpi->mi_ssim_rdmult_scaling_factors_rows >= cm->mb_rows &&
5066
0
      cpi->mi_ssim_rdmult_scaling_factors_cols >= cm->mb_cols)
5067
0
    return;
5068
5069
0
  vpx_free(cpi->mi_ssim_rdmult_scaling_factors);
5070
0
  cpi->mi_ssim_rdmult_scaling_factors = NULL;
5071
5072
0
  CHECK_MEM_ERROR(&cm->error, cpi->mi_ssim_rdmult_scaling_factors,
5073
0
                  vpx_calloc(cm->mb_rows * cm->mb_cols,
5074
0
                             sizeof(*cpi->mi_ssim_rdmult_scaling_factors)));
5075
0
  cpi->mi_ssim_rdmult_scaling_factors_rows = cm->mb_rows;
5076
0
  cpi->mi_ssim_rdmult_scaling_factors_cols = cm->mb_cols;
5077
0
}
5078
5079
0
static void set_mb_ssim_rdmult_scaling(VP9_COMP *cpi) {
5080
0
  VP9_COMMON *cm = &cpi->common;
5081
0
  ThreadData *td = &cpi->td;
5082
0
  MACROBLOCK *x = &td->mb;
5083
0
  MACROBLOCKD *xd = &x->e_mbd;
5084
0
  uint8_t *y_buffer = cpi->Source->y_buffer;
5085
0
  const int y_stride = cpi->Source->y_stride;
5086
0
  const int block_size = BLOCK_16X16;
5087
5088
0
  const int num_8x8_w = num_8x8_blocks_wide_lookup[block_size];
5089
0
  const int num_8x8_h = num_8x8_blocks_high_lookup[block_size];
5090
0
  const int num_cols = (cm->mi_cols + num_8x8_w - 1) / num_8x8_w;
5091
0
  const int num_rows = (cm->mi_rows + num_8x8_h - 1) / num_8x8_h;
5092
0
  double log_sum = 0.0;
5093
0
  int row, col;
5094
5095
  // Loop through each 64x64 block.
5096
0
  for (row = 0; row < num_rows; ++row) {
5097
0
    for (col = 0; col < num_cols; ++col) {
5098
0
      int mi_row, mi_col;
5099
0
      double var = 0.0, num_of_var = 0.0;
5100
0
      const int index = row * num_cols + col;
5101
5102
0
      for (mi_row = row * num_8x8_h;
5103
0
           mi_row < cm->mi_rows && mi_row < (row + 1) * num_8x8_h; ++mi_row) {
5104
0
        for (mi_col = col * num_8x8_w;
5105
0
             mi_col < cm->mi_cols && mi_col < (col + 1) * num_8x8_w; ++mi_col) {
5106
0
          struct buf_2d buf;
5107
0
          const int row_offset_y = mi_row << 3;
5108
0
          const int col_offset_y = mi_col << 3;
5109
5110
0
          buf.buf = y_buffer + row_offset_y * y_stride + col_offset_y;
5111
0
          buf.stride = y_stride;
5112
5113
          // In order to make SSIM_VAR_SCALE in a same scale for both 8 bit
5114
          // and high bit videos, the variance needs to be divided by 2.0 or
5115
          // 64.0 separately.
5116
          // TODO(sdeng): need to tune for 12bit videos.
5117
0
#if CONFIG_VP9_HIGHBITDEPTH
5118
0
          if (cpi->Source->flags & YV12_FLAG_HIGHBITDEPTH)
5119
0
            var += vp9_high_get_sby_variance(cpi, &buf, BLOCK_8X8, xd->bd);
5120
0
          else
5121
0
#endif
5122
0
            var += vp9_get_sby_variance(cpi, &buf, BLOCK_8X8);
5123
5124
0
          num_of_var += 1.0;
5125
0
        }
5126
0
      }
5127
0
      var = var / num_of_var / 64.0;
5128
5129
      // Curve fitting with an exponential model on all 16x16 blocks from the
5130
      // Midres dataset.
5131
0
      var = 67.035434 * (1 - exp(-0.0021489 * var)) + 17.492222;
5132
0
      cpi->mi_ssim_rdmult_scaling_factors[index] = var;
5133
0
      log_sum += log(var);
5134
0
    }
5135
0
  }
5136
0
  log_sum = exp(log_sum / (double)(num_rows * num_cols));
5137
5138
0
  for (row = 0; row < num_rows; ++row) {
5139
0
    for (col = 0; col < num_cols; ++col) {
5140
0
      const int index = row * num_cols + col;
5141
0
      cpi->mi_ssim_rdmult_scaling_factors[index] /= log_sum;
5142
0
    }
5143
0
  }
5144
5145
0
  (void)xd;
5146
0
}
5147
5148
// Process the wiener variance in 16x16 block basis.
5149
0
static int qsort_comp(const void *elem1, const void *elem2) {
5150
0
  int a = *((const tran_low_t *)elem1);
5151
0
  int b = *((const tran_low_t *)elem2);
5152
0
  if (a > b) return 1;
5153
0
  if (a < b) return -1;
5154
0
  return 0;
5155
0
}
5156
5157
0
static void init_mb_wiener_var_buffer(VP9_COMP *cpi) {
5158
0
  VP9_COMMON *cm = &cpi->common;
5159
5160
0
  if (cpi->mb_wiener_variance && cpi->mb_wiener_var_rows >= cm->mb_rows &&
5161
0
      cpi->mb_wiener_var_cols >= cm->mb_cols)
5162
0
    return;
5163
5164
0
  vpx_free(cpi->mb_wiener_variance);
5165
0
  cpi->mb_wiener_variance = NULL;
5166
5167
0
  CHECK_MEM_ERROR(
5168
0
      &cm->error, cpi->mb_wiener_variance,
5169
0
      vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->mb_wiener_variance)));
5170
0
  cpi->mb_wiener_var_rows = cm->mb_rows;
5171
0
  cpi->mb_wiener_var_cols = cm->mb_cols;
5172
0
}
5173
5174
55.8k
static void init_sb_mul_scale_buffer(VP9_COMP *cpi) {
5175
55.8k
  VP9_COMMON *cm = &cpi->common;
5176
5177
55.8k
  if (cpi->mb_wiener_var_rows >= cm->mb_rows &&
5178
52.9k
      cpi->mb_wiener_var_cols >= cm->mb_cols)
5179
52.9k
    return;
5180
5181
2.96k
  vpx_free(cpi->sb_mul_scale);
5182
2.96k
  cpi->sb_mul_scale = NULL;
5183
5184
2.96k
  CHECK_MEM_ERROR(
5185
2.96k
      &cm->error, cpi->sb_mul_scale,
5186
2.96k
      vpx_calloc(cm->mb_rows * cm->mb_cols, sizeof(*cpi->sb_mul_scale)));
5187
2.96k
  cpi->mb_wiener_var_rows = cm->mb_rows;
5188
2.96k
  cpi->mb_wiener_var_cols = cm->mb_cols;
5189
2.96k
}
5190
5191
0
static void set_mb_wiener_variance(VP9_COMP *cpi) {
5192
0
  VP9_COMMON *cm = &cpi->common;
5193
0
  uint8_t *buffer = cpi->Source->y_buffer;
5194
0
  int buf_stride = cpi->Source->y_stride;
5195
5196
0
#if CONFIG_VP9_HIGHBITDEPTH
5197
0
  ThreadData *td = &cpi->td;
5198
0
  MACROBLOCK *x = &td->mb;
5199
0
  MACROBLOCKD *xd = &x->e_mbd;
5200
0
  DECLARE_ALIGNED(16, uint16_t, zero_pred16[32 * 32]);
5201
0
  DECLARE_ALIGNED(16, uint8_t, zero_pred8[32 * 32]);
5202
0
  uint8_t *zero_pred;
5203
#else
5204
  DECLARE_ALIGNED(16, uint8_t, zero_pred[32 * 32]);
5205
#endif
5206
5207
0
  DECLARE_ALIGNED(16, int16_t, src_diff[32 * 32]);
5208
0
  DECLARE_ALIGNED(16, tran_low_t, coeff[32 * 32]);
5209
5210
0
  int mb_row, mb_col, count = 0;
5211
  // Hard coded operating block size
5212
0
  const int block_size = 16;
5213
0
  const int coeff_count = block_size * block_size;
5214
0
  const TX_SIZE tx_size = TX_16X16;
5215
5216
0
#if CONFIG_VP9_HIGHBITDEPTH
5217
0
  xd->cur_buf = cpi->Source;
5218
0
  if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
5219
0
    zero_pred = CONVERT_TO_BYTEPTR(zero_pred16);
5220
0
    memset(zero_pred16, 0, sizeof(*zero_pred16) * coeff_count);
5221
0
  } else {
5222
0
    zero_pred = zero_pred8;
5223
0
    memset(zero_pred8, 0, sizeof(*zero_pred8) * coeff_count);
5224
0
  }
5225
#else
5226
  memset(zero_pred, 0, sizeof(*zero_pred) * coeff_count);
5227
#endif
5228
5229
0
  cpi->norm_wiener_variance = 0;
5230
5231
0
  for (mb_row = 0; mb_row < cm->mb_rows; ++mb_row) {
5232
0
    for (mb_col = 0; mb_col < cm->mb_cols; ++mb_col) {
5233
0
      int idx;
5234
0
      int16_t median_val = 0;
5235
0
      uint8_t *mb_buffer =
5236
0
          buffer + mb_row * block_size * buf_stride + mb_col * block_size;
5237
0
      int64_t wiener_variance = 0;
5238
5239
0
#if CONFIG_VP9_HIGHBITDEPTH
5240
0
      if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) {
5241
0
        vpx_highbd_subtract_block(block_size, block_size, src_diff, block_size,
5242
0
                                  mb_buffer, buf_stride, zero_pred, block_size,
5243
0
                                  xd->bd);
5244
0
        vp9_highbd_wht_fwd_txfm(src_diff, block_size, coeff, tx_size);
5245
0
      } else {
5246
0
        vpx_subtract_block(block_size, block_size, src_diff, block_size,
5247
0
                           mb_buffer, buf_stride, zero_pred, block_size);
5248
0
        vp9_wht_fwd_txfm(src_diff, block_size, coeff, tx_size);
5249
0
      }
5250
#else
5251
      vpx_subtract_block(block_size, block_size, src_diff, block_size,
5252
                         mb_buffer, buf_stride, zero_pred, block_size);
5253
      vp9_wht_fwd_txfm(src_diff, block_size, coeff, tx_size);
5254
#endif  // CONFIG_VP9_HIGHBITDEPTH
5255
5256
0
      coeff[0] = 0;
5257
0
      for (idx = 1; idx < coeff_count; ++idx) coeff[idx] = abs(coeff[idx]);
5258
5259
0
      qsort(coeff, coeff_count, sizeof(*coeff), qsort_comp);
5260
5261
      // Noise level estimation
5262
0
      median_val = coeff[coeff_count / 2];
5263
5264
      // Wiener filter
5265
0
      for (idx = 1; idx < coeff_count; ++idx) {
5266
0
        int64_t sqr_coeff = (int64_t)coeff[idx] * coeff[idx];
5267
0
        int64_t tmp_coeff = (int64_t)coeff[idx];
5268
0
        if (median_val) {
5269
0
          tmp_coeff = (sqr_coeff * coeff[idx]) /
5270
0
                      (sqr_coeff + (int64_t)median_val * median_val);
5271
0
        }
5272
0
        wiener_variance += tmp_coeff * tmp_coeff;
5273
0
      }
5274
0
      cpi->mb_wiener_variance[mb_row * cm->mb_cols + mb_col] =
5275
0
          wiener_variance / coeff_count;
5276
0
      cpi->norm_wiener_variance +=
5277
0
          cpi->mb_wiener_variance[mb_row * cm->mb_cols + mb_col];
5278
0
      ++count;
5279
0
    }
5280
0
  }
5281
5282
0
  if (count) cpi->norm_wiener_variance /= count;
5283
0
  cpi->norm_wiener_variance = VPXMAX(1, cpi->norm_wiener_variance);
5284
0
}
5285
5286
#if !CONFIG_REALTIME_ONLY
5287
static PSNR_STATS compute_psnr_stats(const YV12_BUFFER_CONFIG *source_frame,
5288
                                     const YV12_BUFFER_CONFIG *coded_frame,
5289
                                     uint32_t bit_depth,
5290
                                     uint32_t input_bit_depth,
5291
0
                                     int spatial_layer_id) {
5292
0
  PSNR_STATS psnr;
5293
0
#if CONFIG_VP9_HIGHBITDEPTH
5294
0
  vpx_calc_highbd_psnr(source_frame, coded_frame, &psnr, bit_depth,
5295
0
                       input_bit_depth, spatial_layer_id);
5296
#else   // CONFIG_VP9_HIGHBITDEPTH
5297
  (void)bit_depth;
5298
  (void)input_bit_depth;
5299
  vpx_calc_psnr(source_frame, coded_frame, &psnr, spatial_layer_id);
5300
#endif  // CONFIG_VP9_HIGHBITDEPTH
5301
0
  return psnr;
5302
0
}
5303
5304
static void update_encode_frame_result_basic(
5305
    FRAME_UPDATE_TYPE update_type, int show_idx, int quantize_index,
5306
0
    ENCODE_FRAME_RESULT *encode_frame_result) {
5307
0
  encode_frame_result->show_idx = show_idx;
5308
0
  encode_frame_result->update_type = update_type;
5309
0
  encode_frame_result->quantize_index = quantize_index;
5310
0
}
5311
#endif  // !CONFIG_REALTIME_ONLY
5312
5313
static void encode_frame_to_data_rate(
5314
    VP9_COMP *cpi, size_t *size, uint8_t *dest, size_t dest_size,
5315
55.8k
    unsigned int *frame_flags, ENCODE_FRAME_RESULT *encode_frame_result) {
5316
55.8k
  VP9_COMMON *const cm = &cpi->common;
5317
55.8k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
5318
55.8k
  struct segmentation *const seg = &cm->seg;
5319
55.8k
  TX_SIZE t;
5320
5321
55.8k
  if (vp9_svc_check_skip_enhancement_layer(cpi)) return;
5322
5323
55.8k
  set_ext_overrides(cpi);
5324
55.8k
  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
55.8k
  if (cm->show_existing_frame == 0) {
5332
    // Update frame index
5333
55.8k
    set_frame_index(cpi, cm);
5334
5335
    // Set the arf sign bias for this frame.
5336
55.8k
    set_ref_sign_bias(cpi);
5337
55.8k
  }
5338
5339
  // On the very first frame set the deadline_mode_previous_frame to
5340
  // the current mode.
5341
55.8k
  if (cpi->common.current_video_frame == 0)
5342
2.96k
    cpi->deadline_mode_previous_frame = cpi->oxcf.mode;
5343
5344
  // Set default state for segment based loop filter update flags.
5345
55.8k
  cm->lf.mode_ref_delta_update = 0;
5346
5347
55.8k
  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
55.8k
  if (frame_is_intra_only(cm)) {
5352
    // Reset the loop filter deltas and segmentation map.
5353
12.1k
    vp9_reset_segment_features(&cm->seg);
5354
5355
    // If segmentation is enabled force a map update for key frames.
5356
12.1k
    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
12.1k
    cpi->rc.source_alt_ref_active = 0;
5363
5364
12.1k
    cm->error_resilient_mode = oxcf->error_resilient_mode;
5365
12.1k
    cm->frame_parallel_decoding_mode = oxcf->frame_parallel_decoding_mode;
5366
5367
    // By default, encoder assumes decoder can use prev_mi.
5368
12.1k
    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
12.1k
    } else if (cm->intra_only) {
5373
      // Only reset the current context.
5374
0
      cm->reset_frame_context = 2;
5375
0
    }
5376
12.1k
  }
5377
5378
55.8k
  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
55.8k
  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
55.8k
  init_sb_mul_scale_buffer(cpi);
5389
5390
55.8k
  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
55.8k
  save_encode_params(cpi);
5398
55.8k
  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
55.8k
  if (cpi->sf.recode_loop == DISALLOW_RECODE) {
5427
55.8k
    if (!encode_without_recode_loop(cpi, size, dest, dest_size)) return;
5428
55.8k
  } 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
55.8k
  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
55.8k
#if !CONFIG_REALTIME_ONLY
5450
  // Disable segmentation if it decrease rate/distortion ratio
5451
55.8k
  if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ)
5452
0
    vp9_try_disable_lookahead_aq(cpi, size, dest, dest_size);
5453
55.8k
#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
55.8k
  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
55.8k
  if (cm->frame_type == KEY_FRAME) cpi->refresh_last_frame = 1;
5487
5488
55.8k
  cm->frame_to_show = get_frame_new_buffer(cm);
5489
55.8k
  cm->frame_to_show->color_space = cm->color_space;
5490
55.8k
  cm->frame_to_show->color_range = cm->color_range;
5491
55.8k
  cm->frame_to_show->render_width = cm->render_width;
5492
55.8k
  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
55.8k
  loopfilter_frame(cpi, cm);
5499
#if CONFIG_COLLECT_COMPONENT_TIMING
5500
  end_timing(cpi, loopfilter_frame_time);
5501
#endif
5502
5503
55.8k
  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
55.8k
  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
55.8k
  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
55.8k
  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
55.8k
#endif  // CONFIG_REALTIME_ONLY
5564
5565
55.8k
  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
55.8k
  cpi->last_frame_dropped = 0;
5572
55.8k
  cpi->svc.last_layer_dropped[cpi->svc.spatial_layer_id] = 0;
5573
55.8k
  if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
5574
55.8k
    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
55.8k
  if (cpi->svc.temporal_layer_id == 0) {
5579
55.8k
    if (cpi->refresh_last_frame)
5580
55.8k
      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
55.8k
  }
5586
5587
55.8k
  if (cm->seg.update_map) update_reference_segmentation_map(cpi);
5588
5589
55.8k
  if (frame_is_intra_only(cm) == 0) {
5590
43.7k
    release_scaled_references(cpi);
5591
43.7k
  }
5592
55.8k
  vp9_update_reference_frames(cpi);
5593
5594
55.8k
  if (!cm->show_existing_frame) {
5595
279k
    for (t = TX_4X4; t <= TX_32X32; ++t) {
5596
223k
      full_to_model_counts(cpi->td.counts->coef[t],
5597
223k
                           cpi->td.rd_counts.coef_counts[t]);
5598
223k
    }
5599
5600
55.8k
    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
55.8k
  }
5608
5609
55.8k
  cpi->ext_refresh_frame_flags_pending = 0;
5610
5611
55.8k
  if (cpi->refresh_golden_frame == 1)
5612
15.2k
    cpi->frame_flags |= FRAMEFLAGS_GOLDEN;
5613
40.5k
  else
5614
40.5k
    cpi->frame_flags &= ~FRAMEFLAGS_GOLDEN;
5615
5616
55.8k
  if (cpi->refresh_alt_ref_frame == 1)
5617
12.1k
    cpi->frame_flags |= FRAMEFLAGS_ALTREF;
5618
43.7k
  else
5619
43.7k
    cpi->frame_flags &= ~FRAMEFLAGS_ALTREF;
5620
5621
55.8k
  cpi->ref_frame_flags = get_ref_frame_flags(cpi);
5622
5623
55.8k
  cm->last_frame_type = cm->frame_type;
5624
5625
55.8k
  vp9_rc_postencode_update(cpi, *size);
5626
5627
55.8k
  if (cpi->compute_frame_low_motion_onepass && oxcf->pass == 0 &&
5628
55.8k
      !frame_is_intra_only(cm) &&
5629
43.7k
      (!cpi->use_svc ||
5630
0
       (cpi->use_svc &&
5631
0
        !cpi->svc.layer_context[cpi->svc.temporal_layer_id].is_key_frame &&
5632
43.7k
        cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1))) {
5633
43.7k
    vp9_compute_frame_low_motion(cpi);
5634
43.7k
  }
5635
5636
55.8k
  *size = VPXMAX(1, *size);
5637
5638
#if 0
5639
  output_frame_level_debug_stats(cpi);
5640
#endif
5641
5642
55.8k
  if (cm->frame_type == KEY_FRAME) {
5643
    // Tell the caller that the frame was coded as a key frame
5644
12.1k
    *frame_flags = cpi->frame_flags | FRAMEFLAGS_KEY;
5645
43.7k
  } else {
5646
43.7k
    *frame_flags = cpi->frame_flags & ~FRAMEFLAGS_KEY;
5647
43.7k
  }
5648
5649
  // Clear the one shot update flags for segmentation map and mode/ref loop
5650
  // filter deltas.
5651
55.8k
  cm->seg.update_map = 0;
5652
55.8k
  cm->seg.update_data = 0;
5653
55.8k
  cm->lf.mode_ref_delta_update = 0;
5654
5655
  // keep track of the last coded dimensions
5656
55.8k
  cm->last_width = cm->width;
5657
55.8k
  cm->last_height = cm->height;
5658
5659
  // reset to normal state now that we are done.
5660
55.8k
  if (!cm->show_existing_frame) {
5661
55.8k
    cm->last_show_frame = cm->show_frame;
5662
55.8k
    cm->prev_frame = cm->cur_frame;
5663
55.8k
  }
5664
5665
55.8k
  if (cm->show_frame) {
5666
55.8k
    vp9_swap_mi_and_prev_mi(cm);
5667
55.8k
    if (cpi->use_svc) vp9_inc_frame_in_layer(cpi);
5668
55.8k
  }
5669
55.8k
  update_frame_indexes(cm, cm->show_frame);
5670
5671
55.8k
  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
55.8k
  cpi->force_update_segmentation = 0;
5682
5683
55.8k
#if !CONFIG_REALTIME_ONLY
5684
55.8k
  if (cpi->oxcf.aq_mode == LOOKAHEAD_AQ)
5685
0
    vp9_alt_ref_aq_unset_all(cpi->alt_ref_aq, cpi);
5686
55.8k
#endif
5687
5688
55.8k
  cpi->svc.previous_frame_is_intra_only = cm->intra_only;
5689
55.8k
  cpi->svc.set_intra_only_frame = 0;
5690
55.8k
}
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
55.8k
                        size_t dest_size, unsigned int *frame_flags) {
5701
55.8k
  if (cpi->oxcf.rc_mode == VPX_CBR) {
5702
0
    vp9_rc_get_one_pass_cbr_params(cpi);
5703
55.8k
  } else {
5704
55.8k
    vp9_rc_get_one_pass_vbr_params(cpi);
5705
55.8k
  }
5706
55.8k
  encode_frame_to_data_rate(cpi, size, dest, dest_size, frame_flags,
5707
55.8k
                            /*encode_frame_result = */ NULL);
5708
55.8k
}
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
56.1k
                          int64_t end_time) {
5726
56.1k
  VP9_COMMON *const cm = &cpi->common;
5727
#if CONFIG_INTERNAL_STATS
5728
  struct vpx_usec_timer timer;
5729
#endif
5730
56.1k
  int res = 0;
5731
56.1k
  const int subsampling_x = sd->subsampling_x;
5732
56.1k
  const int subsampling_y = sd->subsampling_y;
5733
56.1k
#if CONFIG_VP9_HIGHBITDEPTH
5734
56.1k
  const int use_highbitdepth = (sd->flags & YV12_FLAG_HIGHBITDEPTH) != 0;
5735
#else
5736
  const int use_highbitdepth = 0;
5737
#endif
5738
5739
56.1k
  if ((cm->profile == PROFILE_0 || cm->profile == PROFILE_2) &&
5740
52.2k
      (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
56.1k
  if ((cm->profile == PROFILE_1 || cm->profile == PROFILE_3) &&
5746
3.88k
      (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
56.1k
  if (cm->color_space == VPX_CS_SRGB) {
5752
289
    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
289
    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
289
  }
5763
5764
56.1k
  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
56.1k
  alloc_raw_frame_buffers(cpi);
5770
5771
#if CONFIG_INTERNAL_STATS
5772
  vpx_usec_timer_start(&timer);
5773
#endif
5774
5775
56.1k
  if (vp9_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
5776
56.1k
                         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
56.1k
  return res;
5784
56.1k
}
5785
5786
55.8k
static int frame_is_reference(const VP9_COMP *cpi) {
5787
55.8k
  const VP9_COMMON *cm = &cpi->common;
5788
5789
55.8k
  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
55.8k
}
5794
5795
static void adjust_frame_rate(VP9_COMP *cpi,
5796
55.8k
                              const struct lookahead_entry *source) {
5797
55.8k
  int64_t this_duration;
5798
55.8k
  int step = 0;
5799
5800
55.8k
  if (source->ts_start == cpi->first_time_stamp_ever) {
5801
55.8k
    this_duration = source->ts_end - source->ts_start;
5802
55.8k
    step = 1;
5803
55.8k
  } 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
55.8k
  if (this_duration) {
5815
55.2k
    if (step) {
5816
55.2k
      vp9_new_framerate(cpi, 10000000.0 / this_duration);
5817
55.2k
    } 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
55.2k
  }
5830
55.8k
  cpi->last_time_stamp_seen = source->ts_start;
5831
55.8k
  cpi->last_end_time_stamp_seen = source->ts_end;
5832
55.8k
}
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
134k
static int get_arf_src_index(VP9_COMP *cpi) {
5837
134k
  RATE_CONTROL *const rc = &cpi->rc;
5838
134k
  int arf_src_index = 0;
5839
134k
  if (is_altref_enabled(cpi)) {
5840
134k
    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
134k
    } else if (rc->source_alt_ref_pending) {
5846
0
      arf_src_index = rc->frames_till_gf_update_due;
5847
0
    }
5848
134k
  }
5849
134k
  return arf_src_index;
5850
134k
}
5851
5852
static void check_src_altref(VP9_COMP *cpi,
5853
55.8k
                             const struct lookahead_entry *source) {
5854
55.8k
  RATE_CONTROL *const rc = &cpi->rc;
5855
5856
55.8k
  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
55.8k
  } else {
5861
55.8k
    rc->is_src_frame_alt_ref =
5862
55.8k
        cpi->alt_ref_source && (source == cpi->alt_ref_source);
5863
55.8k
  }
5864
5865
55.8k
  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
55.8k
}
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
81.0k
void vp9_init_encode_frame_result(ENCODE_FRAME_RESULT *encode_frame_result) {
6140
81.0k
  encode_frame_result->show_idx = -1;  // Actual encoding doesn't happen.
6141
81.0k
}
6142
6143
// Returns if TPL stats need to be calculated.
6144
55.8k
static INLINE int should_run_tpl(VP9_COMP *cpi, int gf_group_index) {
6145
55.8k
  RATE_CONTROL *const rc = &cpi->rc;
6146
55.8k
  if (!cpi->sf.enable_tpl_model) return 0;
6147
  // If there is an ARF for this GOP, TPL stats is always calculated.
6148
24.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
24.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
24.4k
  return 0;
6160
24.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
134k
                            ENCODE_FRAME_RESULT *encode_frame_result) {
6166
134k
  const VP9EncoderConfig *const oxcf = &cpi->oxcf;
6167
134k
  VP9_COMMON *const cm = &cpi->common;
6168
134k
  BufferPool *const pool = cm->buffer_pool;
6169
134k
  RATE_CONTROL *const rc = &cpi->rc;
6170
#if CONFIG_INTERNAL_STATS
6171
  struct vpx_usec_timer cmptimer;
6172
#endif
6173
134k
  YV12_BUFFER_CONFIG *force_src_buffer = NULL;
6174
134k
  struct lookahead_entry *last_source = NULL;
6175
134k
  struct lookahead_entry *source = NULL;
6176
134k
  int arf_src_index;
6177
134k
  const int gf_group_index = cpi->twopass.gf_group.index;
6178
134k
  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
134k
  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
134k
  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
134k
  if ((oxcf->pass == 2) && !cpi->use_svc && (cpi->oxcf.enable_auto_arf >= 2))
6200
0
    cpi->multi_layer_arf = 1;
6201
134k
  else
6202
134k
    cpi->multi_layer_arf = 0;
6203
6204
  // Normal defaults
6205
134k
  cm->reset_frame_context = 0;
6206
134k
  cm->refresh_frame_context = 1;
6207
134k
  if (!is_one_pass_svc(cpi)) {
6208
134k
    cpi->refresh_last_frame = 1;
6209
134k
    cpi->refresh_golden_frame = 0;
6210
134k
    cpi->refresh_alt_ref_frame = 0;
6211
134k
  }
6212
6213
  // Should we encode an arf frame.
6214
134k
  arf_src_index = get_arf_src_index(cpi);
6215
6216
134k
  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
134k
  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
134k
  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
134k
  if (!source) {
6286
    // Get last frame source.
6287
134k
    if (cm->current_video_frame > 0) {
6288
108k
      if ((last_source = vp9_lookahead_peek(cpi->lookahead, -1)) == NULL)
6289
0
        return -1;
6290
108k
    }
6291
6292
    // Read in the source frame.
6293
134k
    if (cpi->use_svc || cpi->svc.set_intra_only_frame)
6294
0
      source = vp9_svc_lookahead_pop(cpi, cpi->lookahead, flush);
6295
134k
    else
6296
134k
      source = vp9_lookahead_pop(cpi->lookahead, flush);
6297
6298
134k
    if (source != NULL) {
6299
55.8k
      cm->show_frame = 1;
6300
55.8k
      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
55.8k
      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
55.8k
      check_src_altref(cpi, source);
6311
55.8k
    }
6312
134k
  }
6313
6314
134k
  if (source) {
6315
55.8k
    cpi->un_scaled_source = cpi->Source =
6316
55.8k
        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
55.8k
    cpi->unscaled_last_source = last_source != NULL ? &last_source->img : NULL;
6325
6326
55.8k
    *time_stamp = source->ts_start;
6327
55.8k
    *time_end = source->ts_end;
6328
55.8k
    *frame_flags = (source->flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
6329
78.2k
  } else {
6330
78.2k
    *size = 0;
6331
78.2k
    return -1;
6332
78.2k
  }
6333
6334
55.8k
  if (source->ts_start < cpi->first_time_stamp_ever) {
6335
2.96k
    cpi->first_time_stamp_ever = source->ts_start;
6336
2.96k
    cpi->last_end_time_stamp_seen = source->ts_start;
6337
2.96k
  }
6338
6339
  // Clear down mmx registers
6340
55.8k
  vpx_clear_system_state();
6341
6342
  // adjust frame rates based on timestamps given
6343
55.8k
  if (cm->show_frame) {
6344
55.8k
    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
55.8k
    } else {
6355
55.8k
      adjust_frame_rate(cpi, source);
6356
55.8k
    }
6357
55.8k
  }
6358
6359
55.8k
  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
55.8k
  if (cm->new_fb_idx != INVALID_IDX) {
6367
52.9k
    --pool->frame_bufs[cm->new_fb_idx].ref_count;
6368
52.9k
  }
6369
55.8k
  cm->new_fb_idx = get_free_fb(cm);
6370
6371
55.8k
  if (cm->new_fb_idx == INVALID_IDX) return -1;
6372
55.8k
  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
55.8k
  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
55.8k
  *size = 0;
6380
6381
55.8k
  cpi->frame_flags = *frame_flags;
6382
6383
55.8k
#if !CONFIG_REALTIME_ONLY
6384
55.8k
  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
55.8k
  } else if (oxcf->pass == 1) {
6393
0
    set_frame_size(cpi);
6394
0
  }
6395
6396
  // Key frame temporal filtering
6397
55.8k
  const int is_key_temporal_filter_enabled =
6398
55.8k
      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
55.8k
  YV12_BUFFER_CONFIG *source_buffer = cpi->un_scaled_source;
6405
6406
55.8k
  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
55.8k
#endif  // !CONFIG_REALTIME_ONLY
6416
6417
55.8k
  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
55.8k
  if (cpi->oxcf.pass != 0 || cpi->use_svc || frame_is_intra_only(cm) == 1) {
6422
55.4k
    for (i = 0; i < REFS_PER_FRAME; ++i) cpi->scaled_ref_idx[i] = INVALID_IDX;
6423
13.8k
  }
6424
6425
55.8k
  if (cpi->kmeans_data_arr_alloc == 0) {
6426
2.96k
    int init_mi_rows, init_mi_cols, init_mi_stride;
6427
2.96k
    vp9_set_mi_size(&init_mi_rows, &init_mi_cols, &init_mi_stride,
6428
2.96k
                    cpi->initial_width, cpi->initial_height);
6429
2.96k
    const int mi_cols = mi_cols_aligned_to_sb(init_mi_cols);
6430
2.96k
    const int mi_rows = mi_cols_aligned_to_sb(init_mi_rows);
6431
2.96k
#if CONFIG_MULTITHREAD
6432
2.96k
    pthread_mutex_init(&cpi->kmeans_mutex, NULL);
6433
2.96k
#endif
6434
2.96k
    CHECK_MEM_ERROR(
6435
2.96k
        &cm->error, cpi->kmeans_data_arr,
6436
2.96k
        vpx_calloc(mi_rows * mi_cols, sizeof(*cpi->kmeans_data_arr)));
6437
2.96k
    cpi->kmeans_data_stride = mi_cols;
6438
2.96k
    cpi->kmeans_data_arr_alloc = 1;
6439
2.96k
  }
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
55.8k
  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
55.8k
  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
55.8k
  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
55.8k
  } 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
55.8k
  } else if (cpi->use_svc) {
6511
0
    SvcEncode(cpi, size, dest, dest_size, frame_flags);
6512
55.8k
  } else {
6513
    // One pass encode
6514
55.8k
    Pass0Encode(cpi, size, dest, dest_size, frame_flags);
6515
55.8k
  }
6516
55.8k
#endif  // CONFIG_REALTIME_ONLY
6517
6518
55.8k
  if (cm->show_frame) cm->cur_show_frame_fb_idx = cm->new_fb_idx;
6519
6520
55.8k
  if (cm->refresh_frame_context)
6521
55.8k
    cm->frame_contexts[cm->frame_context_idx] = *cm->fc;
6522
6523
  // No frame encoded, or frame was dropped, release scaled references.
6524
55.8k
  if ((*size == 0) && (frame_is_intra_only(cm) == 0)) {
6525
0
    release_scaled_references(cpi);
6526
0
  }
6527
6528
55.8k
  if (*size > 0) {
6529
55.8k
    cpi->droppable = !frame_is_reference(cpi);
6530
55.8k
  }
6531
6532
  // Save layer specific state.
6533
55.8k
  if (is_one_pass_svc(cpi) || ((cpi->svc.number_temporal_layers > 1 ||
6534
55.8k
                                cpi->svc.number_spatial_layers > 1) &&
6535
0
                               oxcf->pass == 2)) {
6536
0
    vp9_save_layer_context(cpi);
6537
0
  }
6538
6539
55.8k
  if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
6540
55.8k
    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
55.8k
  if (cpi->keep_level_stats && oxcf->pass != 1)
6548
0
    update_level_info(cpi, *size, arf_src_index);
6549
6550
55.8k
#if !CONFIG_REALTIME_ONLY
6551
55.8k
  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
55.8k
#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
55.8k
  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
55.8k
  vpx_clear_system_state();
6766
55.8k
  return 0;
6767
55.8k
}
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
52.8k
int vp9_get_quantizer(const VP9_COMP *cpi) { return cpi->common.base_qindex; }
6864
6865
81.0k
void vp9_apply_encoding_flags(VP9_COMP *cpi, vpx_enc_frame_flags_t flags) {
6866
81.0k
  if (flags &
6867
81.0k
      (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
81.0k
  if (flags &
6880
81.0k
      (VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF | VP8_EFLAG_NO_UPD_ARF |
6881
81.0k
       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
81.0k
  if (flags & VP8_EFLAG_NO_UPD_ENTROPY) {
6894
0
    vp9_update_entropy(cpi, 0);
6895
0
  }
6896
81.0k
}
6897
6898
27.0k
void vp9_set_row_mt(VP9_COMP *cpi) {
6899
  // Enable row based multi-threading for supported modes of encoding
6900
27.0k
  cpi->row_mt = 0;
6901
27.0k
  if (((cpi->oxcf.mode == GOOD || cpi->oxcf.mode == BEST) &&
6902
25.1k
       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
27.0k
  if (cpi->oxcf.mode == GOOD && cpi->oxcf.speed < 5 &&
6907
25.1k
      (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
27.0k
  if (cpi->oxcf.mode == REALTIME && cpi->oxcf.speed >= 5 && cpi->oxcf.row_mt) {
6914
0
    cpi->row_mt = 1;
6915
0
  }
6916
6917
27.0k
  if (cpi->row_mt)
6918
0
    cpi->row_mt_bit_exact = 1;
6919
27.0k
  else
6920
27.0k
    cpi->row_mt_bit_exact = 0;
6921
27.0k
}