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