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