• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
3  *
4  * This source code is subject to the terms of the BSD 2 Clause License and
5  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6  * was not distributed with this source code in the LICENSE file, you can
7  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8  * Media Patent License 1.0 was not distributed with this source code in the
9  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10  */
11 
12 #include <assert.h>
13 #include <float.h>
14 #include <limits.h>
15 #include <math.h>
16 #include <stdbool.h>
17 #include <stdio.h>
18 #include <stdlib.h>
19 #include <time.h>
20 
21 #include "av1/common/scale.h"
22 #include "config/aom_config.h"
23 #include "config/aom_dsp_rtcd.h"
24 
25 #include "aom/aomcx.h"
26 
27 #if CONFIG_DENOISE
28 #include "aom_dsp/grain_table.h"
29 #include "aom_dsp/noise_util.h"
30 #include "aom_dsp/noise_model.h"
31 #endif
32 #include "aom_dsp/flow_estimation/corner_detect.h"
33 #include "aom_dsp/psnr.h"
34 #if CONFIG_INTERNAL_STATS
35 #include "aom_dsp/ssim.h"
36 #endif
37 #include "aom_ports/aom_timer.h"
38 #include "aom_ports/mem.h"
39 #include "aom_util/aom_pthread.h"
40 #if CONFIG_BITSTREAM_DEBUG
41 #include "aom_util/debug_util.h"
42 #endif  // CONFIG_BITSTREAM_DEBUG
43 
44 #include "av1/common/alloccommon.h"
45 #include "av1/common/debugmodes.h"
46 #include "av1/common/filter.h"
47 #include "av1/common/idct.h"
48 #include "av1/common/reconinter.h"
49 #include "av1/common/reconintra.h"
50 #include "av1/common/resize.h"
51 #include "av1/common/tile_common.h"
52 
53 #include "av1/encoder/allintra_vis.h"
54 #include "av1/encoder/aq_complexity.h"
55 #include "av1/encoder/aq_cyclicrefresh.h"
56 #include "av1/encoder/aq_variance.h"
57 #include "av1/encoder/bitstream.h"
58 #if CONFIG_INTERNAL_STATS
59 #include "av1/encoder/blockiness.h"
60 #endif
61 #include "av1/encoder/context_tree.h"
62 #include "av1/encoder/dwt.h"
63 #include "av1/encoder/encodeframe.h"
64 #include "av1/encoder/encodemv.h"
65 #include "av1/encoder/encode_strategy.h"
66 #include "av1/encoder/encoder.h"
67 #include "av1/encoder/encoder_alloc.h"
68 #include "av1/encoder/encoder_utils.h"
69 #include "av1/encoder/encodetxb.h"
70 #include "av1/encoder/ethread.h"
71 #include "av1/encoder/firstpass.h"
72 #include "av1/encoder/hash_motion.h"
73 #include "av1/encoder/hybrid_fwd_txfm.h"
74 #include "av1/encoder/intra_mode_search.h"
75 #include "av1/encoder/mv_prec.h"
76 #include "av1/encoder/pass2_strategy.h"
77 #include "av1/encoder/pickcdef.h"
78 #include "av1/encoder/picklpf.h"
79 #include "av1/encoder/pickrst.h"
80 #include "av1/encoder/random.h"
81 #include "av1/encoder/ratectrl.h"
82 #include "av1/encoder/rc_utils.h"
83 #include "av1/encoder/rd.h"
84 #include "av1/encoder/rdopt.h"
85 #if CONFIG_SALIENCY_MAP
86 #include "av1/encoder/saliency_map.h"
87 #endif
88 #include "av1/encoder/segmentation.h"
89 #include "av1/encoder/speed_features.h"
90 #include "av1/encoder/superres_scale.h"
91 #if CONFIG_THREE_PASS
92 #include "av1/encoder/thirdpass.h"
93 #endif
94 #include "av1/encoder/tpl_model.h"
95 #include "av1/encoder/reconinter_enc.h"
96 #include "av1/encoder/var_based_part.h"
97 
98 #define DEFAULT_EXPLICIT_ORDER_HINT_BITS 7
99 
100 // #define OUTPUT_YUV_REC
101 #ifdef OUTPUT_YUV_REC
102 FILE *yuv_rec_file;
103 #define FILE_NAME_LEN 100
104 #endif
105 
106 #ifdef OUTPUT_YUV_DENOISED
107 FILE *yuv_denoised_file = NULL;
108 #endif
109 
Scale2Ratio(AOM_SCALING_MODE mode,int * hr,int * hs)110 static inline void Scale2Ratio(AOM_SCALING_MODE mode, int *hr, int *hs) {
111   switch (mode) {
112     case AOME_NORMAL:
113       *hr = 1;
114       *hs = 1;
115       break;
116     case AOME_FOURFIVE:
117       *hr = 4;
118       *hs = 5;
119       break;
120     case AOME_THREEFIVE:
121       *hr = 3;
122       *hs = 5;
123       break;
124     case AOME_THREEFOUR:
125       *hr = 3;
126       *hs = 4;
127       break;
128     case AOME_ONEFOUR:
129       *hr = 1;
130       *hs = 4;
131       break;
132     case AOME_ONEEIGHT:
133       *hr = 1;
134       *hs = 8;
135       break;
136     case AOME_ONETWO:
137       *hr = 1;
138       *hs = 2;
139       break;
140     case AOME_TWOTHREE:
141       *hr = 2;
142       *hs = 3;
143       break;
144     case AOME_ONETHREE:
145       *hr = 1;
146       *hs = 3;
147       break;
148     default:
149       *hr = 1;
150       *hs = 1;
151       assert(0);
152       break;
153   }
154 }
155 
av1_set_active_map(AV1_COMP * cpi,unsigned char * new_map_16x16,int rows,int cols)156 int av1_set_active_map(AV1_COMP *cpi, unsigned char *new_map_16x16, int rows,
157                        int cols) {
158   const CommonModeInfoParams *const mi_params = &cpi->common.mi_params;
159   if (rows == mi_params->mb_rows && cols == mi_params->mb_cols) {
160     unsigned char *const active_map_4x4 = cpi->active_map.map;
161     const int mi_rows = mi_params->mi_rows;
162     const int mi_cols = mi_params->mi_cols;
163     cpi->active_map.update = 0;
164     cpi->rc.percent_blocks_inactive = 0;
165     assert(mi_rows % 2 == 0 && mi_rows > 0);
166     assert(mi_cols % 2 == 0 && mi_cols > 0);
167     if (new_map_16x16) {
168       int num_samples = 0;
169       int num_blocks_inactive = 0;
170       for (int r = 0; r < mi_rows; r += 4) {
171         for (int c = 0; c < mi_cols; c += 4) {
172           const uint8_t val = new_map_16x16[(r >> 2) * cols + (c >> 2)]
173                                   ? AM_SEGMENT_ID_ACTIVE
174                                   : AM_SEGMENT_ID_INACTIVE;
175           num_samples++;
176           if (val == AM_SEGMENT_ID_INACTIVE) num_blocks_inactive++;
177           const int row_max = AOMMIN(4, mi_rows - r);
178           const int col_max = AOMMIN(4, mi_cols - c);
179           for (int x = 0; x < row_max; ++x) {
180             for (int y = 0; y < col_max; ++y) {
181               active_map_4x4[(r + x) * mi_cols + (c + y)] = val;
182             }
183           }
184         }
185       }
186       cpi->active_map.enabled = 1;
187       cpi->active_map.update = 1;
188       assert(num_samples);
189       cpi->rc.percent_blocks_inactive =
190           (num_blocks_inactive * 100) / num_samples;
191     }
192     return 0;
193   }
194 
195   return -1;
196 }
197 
av1_get_active_map(AV1_COMP * cpi,unsigned char * new_map_16x16,int rows,int cols)198 int av1_get_active_map(AV1_COMP *cpi, unsigned char *new_map_16x16, int rows,
199                        int cols) {
200   const CommonModeInfoParams *const mi_params = &cpi->common.mi_params;
201   if (rows == mi_params->mb_rows && cols == mi_params->mb_cols &&
202       new_map_16x16) {
203     unsigned char *const seg_map_8x8 = cpi->enc_seg.map;
204     const int mi_rows = mi_params->mi_rows;
205     const int mi_cols = mi_params->mi_cols;
206     const int row_scale = mi_size_high_log2[BLOCK_16X16];
207     const int col_scale = mi_size_wide_log2[BLOCK_16X16];
208     assert(mi_rows % 2 == 0);
209     assert(mi_cols % 2 == 0);
210 
211     memset(new_map_16x16, !cpi->active_map.enabled, rows * cols);
212     if (cpi->active_map.enabled) {
213       for (int r = 0; r < (mi_rows >> row_scale); ++r) {
214         for (int c = 0; c < (mi_cols >> col_scale); ++c) {
215           // Cyclic refresh segments are considered active despite not having
216           // AM_SEGMENT_ID_ACTIVE
217           uint8_t temp = 0;
218           temp |= seg_map_8x8[(2 * r + 0) * mi_cols + (2 * c + 0)] !=
219                   AM_SEGMENT_ID_INACTIVE;
220           temp |= seg_map_8x8[(2 * r + 0) * mi_cols + (2 * c + 1)] !=
221                   AM_SEGMENT_ID_INACTIVE;
222           temp |= seg_map_8x8[(2 * r + 1) * mi_cols + (2 * c + 0)] !=
223                   AM_SEGMENT_ID_INACTIVE;
224           temp |= seg_map_8x8[(2 * r + 1) * mi_cols + (2 * c + 1)] !=
225                   AM_SEGMENT_ID_INACTIVE;
226           new_map_16x16[r * cols + c] |= temp;
227         }
228       }
229     }
230     return 0;
231   }
232 
233   return -1;
234 }
235 
av1_initialize_enc(unsigned int usage,enum aom_rc_mode end_usage)236 void av1_initialize_enc(unsigned int usage, enum aom_rc_mode end_usage) {
237   bool is_allintra = usage == ALLINTRA;
238 
239   av1_rtcd();
240   aom_dsp_rtcd();
241   aom_scale_rtcd();
242   av1_init_intra_predictors();
243   av1_init_me_luts();
244   if (!is_allintra) av1_init_wedge_masks();
245   if (!is_allintra || end_usage != AOM_Q) av1_rc_init_minq_luts();
246 }
247 
av1_new_framerate(AV1_COMP * cpi,double framerate)248 void av1_new_framerate(AV1_COMP *cpi, double framerate) {
249   cpi->framerate = framerate < 0.1 ? 30 : framerate;
250   av1_rc_update_framerate(cpi, cpi->common.width, cpi->common.height);
251 }
252 
av1_get_compression_ratio(const AV1_COMMON * const cm,size_t encoded_frame_size)253 double av1_get_compression_ratio(const AV1_COMMON *const cm,
254                                  size_t encoded_frame_size) {
255   const int upscaled_width = cm->superres_upscaled_width;
256   const int height = cm->height;
257   const int64_t luma_pic_size = (int64_t)upscaled_width * height;
258   const SequenceHeader *const seq_params = cm->seq_params;
259   const BITSTREAM_PROFILE profile = seq_params->profile;
260   const int pic_size_profile_factor =
261       profile == PROFILE_0 ? 15 : (profile == PROFILE_1 ? 30 : 36);
262   encoded_frame_size =
263       (encoded_frame_size > 129 ? encoded_frame_size - 128 : 1);
264   const int64_t uncompressed_frame_size =
265       (luma_pic_size * pic_size_profile_factor) >> 3;
266   return (double)uncompressed_frame_size / encoded_frame_size;
267 }
268 
auto_tile_size_balancing(AV1_COMMON * const cm,int num_sbs,int num_tiles_lg,int tile_col_row)269 static void auto_tile_size_balancing(AV1_COMMON *const cm, int num_sbs,
270                                      int num_tiles_lg, int tile_col_row) {
271   CommonTileParams *const tiles = &cm->tiles;
272   int i, start_sb;
273   int size_sb = num_sbs >> num_tiles_lg;
274   int res_sbs = num_sbs - (size_sb << num_tiles_lg);
275   int num_tiles = 1 << num_tiles_lg;
276   int inc_index = num_tiles - res_sbs;
277 
278   tiles->uniform_spacing = 0;
279 
280   for (i = 0, start_sb = 0; start_sb < num_sbs && i < MAX_TILE_COLS; ++i) {
281     if (i == inc_index) ++size_sb;
282     if (tile_col_row)
283       tiles->col_start_sb[i] = start_sb;
284     else
285       tiles->row_start_sb[i] = start_sb;
286 
287     start_sb += AOMMIN(size_sb, tiles->max_width_sb);
288   }
289 
290   if (tile_col_row) {
291     tiles->cols = i;
292     tiles->col_start_sb[i] = num_sbs;
293   } else {
294     tiles->rows = i;
295     tiles->row_start_sb[i] = num_sbs;
296   }
297 }
298 
set_tile_info(AV1_COMMON * const cm,const TileConfig * const tile_cfg)299 static void set_tile_info(AV1_COMMON *const cm,
300                           const TileConfig *const tile_cfg) {
301   const CommonModeInfoParams *const mi_params = &cm->mi_params;
302   const SequenceHeader *const seq_params = cm->seq_params;
303   CommonTileParams *const tiles = &cm->tiles;
304   int i, start_sb;
305 
306   av1_get_tile_limits(cm);
307 
308   int sb_cols =
309       CEIL_POWER_OF_TWO(mi_params->mi_cols, seq_params->mib_size_log2);
310   // configure tile columns
311   if (tile_cfg->tile_width_count == 0 || tile_cfg->tile_height_count == 0) {
312     tiles->uniform_spacing = 1;
313     tiles->log2_cols = AOMMAX(tile_cfg->tile_columns, tiles->min_log2_cols);
314     // Add a special case to handle super resolution
315     sb_cols = coded_to_superres_mi(sb_cols, cm->superres_scale_denominator);
316     int min_log2_cols = 0;
317     for (; (tiles->max_width_sb << min_log2_cols) <= sb_cols; ++min_log2_cols) {
318     }
319     tiles->log2_cols = AOMMAX(tiles->log2_cols, min_log2_cols);
320 
321     tiles->log2_cols = AOMMIN(tiles->log2_cols, tiles->max_log2_cols);
322   } else if (tile_cfg->tile_widths[0] < 0) {
323     auto_tile_size_balancing(cm, sb_cols, tile_cfg->tile_columns, 1);
324   } else {
325     int size_sb, j = 0;
326     tiles->uniform_spacing = 0;
327     for (i = 0, start_sb = 0; start_sb < sb_cols && i < MAX_TILE_COLS; i++) {
328       tiles->col_start_sb[i] = start_sb;
329       size_sb = tile_cfg->tile_widths[j++];
330       if (j >= tile_cfg->tile_width_count) j = 0;
331       start_sb += AOMMIN(size_sb, tiles->max_width_sb);
332     }
333     tiles->cols = i;
334     tiles->col_start_sb[i] = sb_cols;
335   }
336   av1_calculate_tile_cols(seq_params, mi_params->mi_rows, mi_params->mi_cols,
337                           tiles);
338 
339   // configure tile rows
340   int sb_rows =
341       CEIL_POWER_OF_TWO(mi_params->mi_rows, seq_params->mib_size_log2);
342   if (tiles->uniform_spacing) {
343     tiles->log2_rows = AOMMAX(tile_cfg->tile_rows, tiles->min_log2_rows);
344     tiles->log2_rows = AOMMIN(tiles->log2_rows, tiles->max_log2_rows);
345   } else if (tile_cfg->tile_heights[0] < 0) {
346     auto_tile_size_balancing(cm, sb_rows, tile_cfg->tile_rows, 0);
347   } else {
348     int size_sb, j = 0;
349     for (i = 0, start_sb = 0; start_sb < sb_rows && i < MAX_TILE_ROWS; i++) {
350       tiles->row_start_sb[i] = start_sb;
351       size_sb = tile_cfg->tile_heights[j++];
352       if (j >= tile_cfg->tile_height_count) j = 0;
353       start_sb += AOMMIN(size_sb, tiles->max_height_sb);
354     }
355     tiles->rows = i;
356     tiles->row_start_sb[i] = sb_rows;
357   }
358   av1_calculate_tile_rows(seq_params, mi_params->mi_rows, tiles);
359 }
360 
av1_update_frame_size(AV1_COMP * cpi)361 void av1_update_frame_size(AV1_COMP *cpi) {
362   AV1_COMMON *const cm = &cpi->common;
363   MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
364 
365   // Setup mi_params here in case we need more mi's.
366   CommonModeInfoParams *const mi_params = &cm->mi_params;
367   mi_params->set_mb_mi(mi_params, cm->width, cm->height,
368                        cpi->sf.part_sf.default_min_partition_size);
369 
370   av1_init_macroblockd(cm, xd);
371 
372   if (!cpi->ppi->seq_params_locked)
373     set_sb_size(cm->seq_params,
374                 av1_select_sb_size(&cpi->oxcf, cm->width, cm->height,
375                                    cpi->ppi->number_spatial_layers));
376 
377   set_tile_info(cm, &cpi->oxcf.tile_cfg);
378 }
379 
does_level_match(int width,int height,double fps,int lvl_width,int lvl_height,double lvl_fps,int lvl_dim_mult)380 static inline int does_level_match(int width, int height, double fps,
381                                    int lvl_width, int lvl_height,
382                                    double lvl_fps, int lvl_dim_mult) {
383   const int64_t lvl_luma_pels = (int64_t)lvl_width * lvl_height;
384   const double lvl_display_sample_rate = lvl_luma_pels * lvl_fps;
385   const int64_t luma_pels = (int64_t)width * height;
386   const double display_sample_rate = luma_pels * fps;
387   return luma_pels <= lvl_luma_pels &&
388          display_sample_rate <= lvl_display_sample_rate &&
389          width <= lvl_width * lvl_dim_mult &&
390          height <= lvl_height * lvl_dim_mult;
391 }
392 
set_bitstream_level_tier(AV1_PRIMARY * const ppi,int width,int height,double init_framerate)393 static void set_bitstream_level_tier(AV1_PRIMARY *const ppi, int width,
394                                      int height, double init_framerate) {
395   SequenceHeader *const seq_params = &ppi->seq_params;
396   const AV1LevelParams *const level_params = &ppi->level_params;
397   // TODO(any): This is a placeholder function that only addresses dimensions
398   // and max display sample rates.
399   // Need to add checks for max bit rate, max decoded luma sample rate, header
400   // rate, etc. that are not covered by this function.
401   AV1_LEVEL level = SEQ_LEVEL_MAX;
402   if (does_level_match(width, height, init_framerate, 512, 288, 30.0, 4)) {
403     level = SEQ_LEVEL_2_0;
404   } else if (does_level_match(width, height, init_framerate, 704, 396, 30.0,
405                               4)) {
406     level = SEQ_LEVEL_2_1;
407   } else if (does_level_match(width, height, init_framerate, 1088, 612, 30.0,
408                               4)) {
409     level = SEQ_LEVEL_3_0;
410   } else if (does_level_match(width, height, init_framerate, 1376, 774, 30.0,
411                               4)) {
412     level = SEQ_LEVEL_3_1;
413   } else if (does_level_match(width, height, init_framerate, 2048, 1152, 30.0,
414                               3)) {
415     level = SEQ_LEVEL_4_0;
416   } else if (does_level_match(width, height, init_framerate, 2048, 1152, 60.0,
417                               3)) {
418     level = SEQ_LEVEL_4_1;
419   } else if (does_level_match(width, height, init_framerate, 4096, 2176, 30.0,
420                               2)) {
421     level = SEQ_LEVEL_5_0;
422   } else if (does_level_match(width, height, init_framerate, 4096, 2176, 60.0,
423                               2)) {
424     level = SEQ_LEVEL_5_1;
425   } else if (does_level_match(width, height, init_framerate, 4096, 2176, 120.0,
426                               2)) {
427     level = SEQ_LEVEL_5_2;
428   } else if (does_level_match(width, height, init_framerate, 8192, 4352, 30.0,
429                               2)) {
430     level = SEQ_LEVEL_6_0;
431   } else if (does_level_match(width, height, init_framerate, 8192, 4352, 60.0,
432                               2)) {
433     level = SEQ_LEVEL_6_1;
434   } else if (does_level_match(width, height, init_framerate, 8192, 4352, 120.0,
435                               2)) {
436     level = SEQ_LEVEL_6_2;
437   }
438 #if CONFIG_CWG_C013
439   // TODO(bohanli): currently target level is only working for the 0th operating
440   // point, so scalable coding is not supported.
441   else if (level_params->target_seq_level_idx[0] >= SEQ_LEVEL_7_0 &&
442            level_params->target_seq_level_idx[0] <= SEQ_LEVEL_8_3) {
443     // Only use level 7.x to 8.x when explicitly asked to.
444     if (does_level_match(width, height, init_framerate, 16384, 8704, 30.0, 2)) {
445       level = SEQ_LEVEL_7_0;
446     } else if (does_level_match(width, height, init_framerate, 16384, 8704,
447                                 60.0, 2)) {
448       level = SEQ_LEVEL_7_1;
449     } else if (does_level_match(width, height, init_framerate, 16384, 8704,
450                                 120.0, 2)) {
451       level = SEQ_LEVEL_7_2;
452     } else if (does_level_match(width, height, init_framerate, 32768, 17408,
453                                 30.0, 2)) {
454       level = SEQ_LEVEL_8_0;
455     } else if (does_level_match(width, height, init_framerate, 32768, 17408,
456                                 60.0, 2)) {
457       level = SEQ_LEVEL_8_1;
458     } else if (does_level_match(width, height, init_framerate, 32768, 17408,
459                                 120.0, 2)) {
460       level = SEQ_LEVEL_8_2;
461     }
462   }
463 #endif
464 
465   for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
466     assert(is_valid_seq_level_idx(level_params->target_seq_level_idx[i]) ||
467            level_params->target_seq_level_idx[i] == SEQ_LEVEL_KEEP_STATS);
468     // If a higher target level is specified, it is then used rather than the
469     // inferred one from resolution and framerate.
470     seq_params->seq_level_idx[i] =
471         level_params->target_seq_level_idx[i] < SEQ_LEVELS &&
472                 level_params->target_seq_level_idx[i] > level
473             ? level_params->target_seq_level_idx[i]
474             : level;
475     // Set the maximum parameters for bitrate and buffer size for this profile,
476     // level, and tier
477     seq_params->op_params[i].bitrate = av1_max_level_bitrate(
478         seq_params->profile, seq_params->seq_level_idx[i], seq_params->tier[i]);
479     // Level with seq_level_idx = 31 returns a high "dummy" bitrate to pass the
480     // check
481     if (seq_params->op_params[i].bitrate == 0)
482       aom_internal_error(
483           &ppi->error, AOM_CODEC_UNSUP_BITSTREAM,
484           "AV1 does not support this combination of profile, level, and tier.");
485     // Buffer size in bits/s is bitrate in bits/s * 1 s
486     seq_params->op_params[i].buffer_size = seq_params->op_params[i].bitrate;
487   }
488 }
489 
init_seq_coding_tools(AV1_PRIMARY * const ppi,const AV1EncoderConfig * oxcf,int disable_frame_id_numbers)490 static void init_seq_coding_tools(AV1_PRIMARY *const ppi,
491                                   const AV1EncoderConfig *oxcf,
492                                   int disable_frame_id_numbers) {
493   SequenceHeader *const seq = &ppi->seq_params;
494   const FrameDimensionCfg *const frm_dim_cfg = &oxcf->frm_dim_cfg;
495   const ToolCfg *const tool_cfg = &oxcf->tool_cfg;
496 
497   seq->still_picture =
498       !tool_cfg->force_video_mode && (oxcf->input_cfg.limit == 1);
499   seq->reduced_still_picture_hdr =
500       seq->still_picture && !tool_cfg->full_still_picture_hdr;
501   seq->force_screen_content_tools = 2;
502   seq->force_integer_mv = 2;
503   seq->order_hint_info.enable_order_hint = tool_cfg->enable_order_hint;
504   seq->frame_id_numbers_present_flag =
505       !seq->reduced_still_picture_hdr &&
506       !oxcf->tile_cfg.enable_large_scale_tile &&
507       tool_cfg->error_resilient_mode && !disable_frame_id_numbers;
508   if (seq->reduced_still_picture_hdr) {
509     seq->order_hint_info.enable_order_hint = 0;
510     seq->force_screen_content_tools = 2;
511     seq->force_integer_mv = 2;
512   }
513   seq->order_hint_info.order_hint_bits_minus_1 =
514       seq->order_hint_info.enable_order_hint
515           ? DEFAULT_EXPLICIT_ORDER_HINT_BITS - 1
516           : -1;
517 
518   seq->max_frame_width = frm_dim_cfg->forced_max_frame_width
519                              ? frm_dim_cfg->forced_max_frame_width
520                              : frm_dim_cfg->width;
521   seq->max_frame_height = frm_dim_cfg->forced_max_frame_height
522                               ? frm_dim_cfg->forced_max_frame_height
523                               : frm_dim_cfg->height;
524   seq->num_bits_width =
525       (seq->max_frame_width > 1) ? get_msb(seq->max_frame_width - 1) + 1 : 1;
526   seq->num_bits_height =
527       (seq->max_frame_height > 1) ? get_msb(seq->max_frame_height - 1) + 1 : 1;
528   assert(seq->num_bits_width <= 16);
529   assert(seq->num_bits_height <= 16);
530 
531   seq->frame_id_length = FRAME_ID_LENGTH;
532   seq->delta_frame_id_length = DELTA_FRAME_ID_LENGTH;
533 
534   seq->enable_dual_filter = tool_cfg->enable_dual_filter;
535   seq->order_hint_info.enable_dist_wtd_comp =
536       oxcf->comp_type_cfg.enable_dist_wtd_comp;
537   seq->order_hint_info.enable_dist_wtd_comp &=
538       seq->order_hint_info.enable_order_hint;
539   seq->order_hint_info.enable_ref_frame_mvs = tool_cfg->ref_frame_mvs_present;
540   seq->order_hint_info.enable_ref_frame_mvs &=
541       seq->order_hint_info.enable_order_hint;
542   seq->enable_superres = oxcf->superres_cfg.enable_superres;
543   seq->enable_cdef = tool_cfg->cdef_control != CDEF_NONE ? 1 : 0;
544   seq->enable_restoration = tool_cfg->enable_restoration;
545   seq->enable_warped_motion = oxcf->motion_mode_cfg.enable_warped_motion;
546   seq->enable_interintra_compound = tool_cfg->enable_interintra_comp;
547   seq->enable_masked_compound = oxcf->comp_type_cfg.enable_masked_comp;
548   seq->enable_intra_edge_filter = oxcf->intra_mode_cfg.enable_intra_edge_filter;
549   seq->enable_filter_intra = oxcf->intra_mode_cfg.enable_filter_intra;
550 
551   set_bitstream_level_tier(ppi, frm_dim_cfg->width, frm_dim_cfg->height,
552                            oxcf->input_cfg.init_framerate);
553 
554   if (seq->operating_points_cnt_minus_1 == 0) {
555     seq->operating_point_idc[0] = 0;
556     seq->has_nonzero_operating_point_idc = false;
557   } else {
558     // Set operating_point_idc[] such that the i=0 point corresponds to the
559     // highest quality operating point (all layers), and subsequent
560     // operarting points (i > 0) are lower quality corresponding to
561     // skip decoding enhancement  layers (temporal first).
562     int i = 0;
563     assert(seq->operating_points_cnt_minus_1 ==
564            (int)(ppi->number_spatial_layers * ppi->number_temporal_layers - 1));
565     for (unsigned int sl = 0; sl < ppi->number_spatial_layers; sl++) {
566       for (unsigned int tl = 0; tl < ppi->number_temporal_layers; tl++) {
567         seq->operating_point_idc[i] =
568             (~(~0u << (ppi->number_spatial_layers - sl)) << 8) |
569             ~(~0u << (ppi->number_temporal_layers - tl));
570         assert(seq->operating_point_idc[i] != 0);
571         i++;
572       }
573     }
574     seq->has_nonzero_operating_point_idc = true;
575   }
576 }
577 
init_config_sequence(struct AV1_PRIMARY * ppi,const AV1EncoderConfig * oxcf)578 static void init_config_sequence(struct AV1_PRIMARY *ppi,
579                                  const AV1EncoderConfig *oxcf) {
580   SequenceHeader *const seq_params = &ppi->seq_params;
581   const DecoderModelCfg *const dec_model_cfg = &oxcf->dec_model_cfg;
582   const ColorCfg *const color_cfg = &oxcf->color_cfg;
583 
584   ppi->use_svc = 0;
585   ppi->number_spatial_layers = 1;
586   ppi->number_temporal_layers = 1;
587 
588   seq_params->profile = oxcf->profile;
589   seq_params->bit_depth = oxcf->tool_cfg.bit_depth;
590   seq_params->use_highbitdepth = oxcf->use_highbitdepth;
591   seq_params->color_primaries = color_cfg->color_primaries;
592   seq_params->transfer_characteristics = color_cfg->transfer_characteristics;
593   seq_params->matrix_coefficients = color_cfg->matrix_coefficients;
594   seq_params->monochrome = oxcf->tool_cfg.enable_monochrome;
595   seq_params->chroma_sample_position = color_cfg->chroma_sample_position;
596   seq_params->color_range = color_cfg->color_range;
597   seq_params->timing_info_present = dec_model_cfg->timing_info_present;
598   seq_params->timing_info.num_units_in_display_tick =
599       dec_model_cfg->timing_info.num_units_in_display_tick;
600   seq_params->timing_info.time_scale = dec_model_cfg->timing_info.time_scale;
601   seq_params->timing_info.equal_picture_interval =
602       dec_model_cfg->timing_info.equal_picture_interval;
603   seq_params->timing_info.num_ticks_per_picture =
604       dec_model_cfg->timing_info.num_ticks_per_picture;
605 
606   seq_params->display_model_info_present_flag =
607       dec_model_cfg->display_model_info_present_flag;
608   seq_params->decoder_model_info_present_flag =
609       dec_model_cfg->decoder_model_info_present_flag;
610   if (dec_model_cfg->decoder_model_info_present_flag) {
611     // set the decoder model parameters in schedule mode
612     seq_params->decoder_model_info.num_units_in_decoding_tick =
613         dec_model_cfg->num_units_in_decoding_tick;
614     ppi->buffer_removal_time_present = 1;
615     av1_set_aom_dec_model_info(&seq_params->decoder_model_info);
616     av1_set_dec_model_op_parameters(&seq_params->op_params[0]);
617   } else if (seq_params->timing_info_present &&
618              seq_params->timing_info.equal_picture_interval &&
619              !seq_params->decoder_model_info_present_flag) {
620     // set the decoder model parameters in resource availability mode
621     av1_set_resource_availability_parameters(&seq_params->op_params[0]);
622   } else {
623     seq_params->op_params[0].initial_display_delay =
624         10;  // Default value (not signaled)
625   }
626 
627   if (seq_params->monochrome) {
628     seq_params->subsampling_x = 1;
629     seq_params->subsampling_y = 1;
630   } else if (seq_params->color_primaries == AOM_CICP_CP_BT_709 &&
631              seq_params->transfer_characteristics == AOM_CICP_TC_SRGB &&
632              seq_params->matrix_coefficients == AOM_CICP_MC_IDENTITY) {
633     seq_params->subsampling_x = 0;
634     seq_params->subsampling_y = 0;
635   } else {
636     if (seq_params->profile == 0) {
637       seq_params->subsampling_x = 1;
638       seq_params->subsampling_y = 1;
639     } else if (seq_params->profile == 1) {
640       seq_params->subsampling_x = 0;
641       seq_params->subsampling_y = 0;
642     } else {
643       if (seq_params->bit_depth == AOM_BITS_12) {
644         seq_params->subsampling_x = oxcf->input_cfg.chroma_subsampling_x;
645         seq_params->subsampling_y = oxcf->input_cfg.chroma_subsampling_y;
646       } else {
647         seq_params->subsampling_x = 1;
648         seq_params->subsampling_y = 0;
649       }
650     }
651   }
652   av1_change_config_seq(ppi, oxcf, NULL);
653 }
654 
init_config(struct AV1_COMP * cpi,const AV1EncoderConfig * oxcf)655 static void init_config(struct AV1_COMP *cpi, const AV1EncoderConfig *oxcf) {
656   AV1_COMMON *const cm = &cpi->common;
657   ResizePendingParams *resize_pending_params = &cpi->resize_pending_params;
658 
659   cpi->oxcf = *oxcf;
660   cpi->framerate = oxcf->input_cfg.init_framerate;
661 
662   cm->width = oxcf->frm_dim_cfg.width;
663   cm->height = oxcf->frm_dim_cfg.height;
664   cpi->is_dropped_frame = false;
665 
666   alloc_compressor_data(cpi);
667 
668   cpi->data_alloc_width = cm->width;
669   cpi->data_alloc_height = cm->height;
670   cpi->frame_size_related_setup_done = false;
671 
672   // Single thread case: use counts in common.
673   cpi->td.counts = &cpi->counts;
674 
675   // Init SVC parameters.
676   cpi->svc.number_spatial_layers = 1;
677   cpi->svc.number_temporal_layers = 1;
678   cm->spatial_layer_id = 0;
679   cm->temporal_layer_id = 0;
680   // Init rtc_ref parameters.
681   cpi->ppi->rtc_ref.set_ref_frame_config = 0;
682   cpi->ppi->rtc_ref.non_reference_frame = 0;
683   cpi->ppi->rtc_ref.ref_frame_comp[0] = 0;
684   cpi->ppi->rtc_ref.ref_frame_comp[1] = 0;
685   cpi->ppi->rtc_ref.ref_frame_comp[2] = 0;
686 
687   // change includes all joint functionality
688   av1_change_config(cpi, oxcf, false);
689 
690   cpi->ref_frame_flags = 0;
691 
692   // Reset resize pending flags
693   resize_pending_params->width = 0;
694   resize_pending_params->height = 0;
695 
696   // Setup identity scale factor
697   av1_setup_scale_factors_for_frame(&cm->sf_identity, 1, 1, 1, 1);
698 
699   init_buffer_indices(&cpi->force_intpel_info, cm->remapped_ref_idx);
700 
701   av1_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
702 }
703 
av1_change_config_seq(struct AV1_PRIMARY * ppi,const AV1EncoderConfig * oxcf,bool * is_sb_size_changed)704 void av1_change_config_seq(struct AV1_PRIMARY *ppi,
705                            const AV1EncoderConfig *oxcf,
706                            bool *is_sb_size_changed) {
707   SequenceHeader *const seq_params = &ppi->seq_params;
708   const FrameDimensionCfg *const frm_dim_cfg = &oxcf->frm_dim_cfg;
709   const DecoderModelCfg *const dec_model_cfg = &oxcf->dec_model_cfg;
710   const ColorCfg *const color_cfg = &oxcf->color_cfg;
711 
712   if (seq_params->profile != oxcf->profile) seq_params->profile = oxcf->profile;
713   seq_params->bit_depth = oxcf->tool_cfg.bit_depth;
714   seq_params->color_primaries = color_cfg->color_primaries;
715   seq_params->transfer_characteristics = color_cfg->transfer_characteristics;
716   seq_params->matrix_coefficients = color_cfg->matrix_coefficients;
717   seq_params->monochrome = oxcf->tool_cfg.enable_monochrome;
718   seq_params->chroma_sample_position = color_cfg->chroma_sample_position;
719   seq_params->color_range = color_cfg->color_range;
720 
721   assert(IMPLIES(seq_params->profile <= PROFILE_1,
722                  seq_params->bit_depth <= AOM_BITS_10));
723 
724   seq_params->timing_info_present = dec_model_cfg->timing_info_present;
725   seq_params->timing_info.num_units_in_display_tick =
726       dec_model_cfg->timing_info.num_units_in_display_tick;
727   seq_params->timing_info.time_scale = dec_model_cfg->timing_info.time_scale;
728   seq_params->timing_info.equal_picture_interval =
729       dec_model_cfg->timing_info.equal_picture_interval;
730   seq_params->timing_info.num_ticks_per_picture =
731       dec_model_cfg->timing_info.num_ticks_per_picture;
732 
733   seq_params->display_model_info_present_flag =
734       dec_model_cfg->display_model_info_present_flag;
735   seq_params->decoder_model_info_present_flag =
736       dec_model_cfg->decoder_model_info_present_flag;
737   if (dec_model_cfg->decoder_model_info_present_flag) {
738     // set the decoder model parameters in schedule mode
739     seq_params->decoder_model_info.num_units_in_decoding_tick =
740         dec_model_cfg->num_units_in_decoding_tick;
741     ppi->buffer_removal_time_present = 1;
742     av1_set_aom_dec_model_info(&seq_params->decoder_model_info);
743     av1_set_dec_model_op_parameters(&seq_params->op_params[0]);
744   } else if (seq_params->timing_info_present &&
745              seq_params->timing_info.equal_picture_interval &&
746              !seq_params->decoder_model_info_present_flag) {
747     // set the decoder model parameters in resource availability mode
748     av1_set_resource_availability_parameters(&seq_params->op_params[0]);
749   } else {
750     seq_params->op_params[0].initial_display_delay =
751         10;  // Default value (not signaled)
752   }
753 
754 #if !CONFIG_REALTIME_ONLY
755   av1_update_film_grain_parameters_seq(ppi, oxcf);
756 #endif
757 
758   int sb_size = seq_params->sb_size;
759   // Superblock size should not be updated after the first key frame.
760   if (!ppi->seq_params_locked) {
761     set_sb_size(seq_params, av1_select_sb_size(oxcf, frm_dim_cfg->width,
762                                                frm_dim_cfg->height,
763                                                ppi->number_spatial_layers));
764     for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i)
765       seq_params->tier[i] = (oxcf->tier_mask >> i) & 1;
766   }
767   if (is_sb_size_changed != NULL && sb_size != seq_params->sb_size)
768     *is_sb_size_changed = true;
769 
770   // Init sequence level coding tools
771   // This should not be called after the first key frame.
772   if (!ppi->seq_params_locked) {
773     seq_params->operating_points_cnt_minus_1 =
774         (ppi->number_spatial_layers > 1 || ppi->number_temporal_layers > 1)
775             ? ppi->number_spatial_layers * ppi->number_temporal_layers - 1
776             : 0;
777     init_seq_coding_tools(ppi, oxcf,
778                           ppi->use_svc || ppi->rtc_ref.set_ref_frame_config);
779   }
780   seq_params->timing_info_present &= !seq_params->reduced_still_picture_hdr;
781 
782 #if CONFIG_AV1_HIGHBITDEPTH
783   highbd_set_var_fns(ppi);
784 #endif
785 
786   set_primary_rc_buffer_sizes(oxcf, ppi);
787 }
788 
av1_change_config(struct AV1_COMP * cpi,const AV1EncoderConfig * oxcf,bool is_sb_size_changed)789 void av1_change_config(struct AV1_COMP *cpi, const AV1EncoderConfig *oxcf,
790                        bool is_sb_size_changed) {
791   AV1_COMMON *const cm = &cpi->common;
792   SequenceHeader *const seq_params = cm->seq_params;
793   RATE_CONTROL *const rc = &cpi->rc;
794   PRIMARY_RATE_CONTROL *const p_rc = &cpi->ppi->p_rc;
795   MACROBLOCK *const x = &cpi->td.mb;
796   AV1LevelParams *const level_params = &cpi->ppi->level_params;
797   RefreshFrameInfo *const refresh_frame = &cpi->refresh_frame;
798   const FrameDimensionCfg *const frm_dim_cfg = &cpi->oxcf.frm_dim_cfg;
799   const RateControlCfg *const rc_cfg = &oxcf->rc_cfg;
800   FeatureFlags *const features = &cm->features;
801 
802   // in case of LAP, lag in frames is set according to number of lap buffers
803   // calculated at init time. This stores and restores LAP's lag in frames to
804   // prevent override by new cfg.
805   int lap_lag_in_frames = -1;
806   if (cpi->ppi->lap_enabled && cpi->compressor_stage == LAP_STAGE) {
807     lap_lag_in_frames = cpi->oxcf.gf_cfg.lag_in_frames;
808   }
809 
810   cpi->oxcf = *oxcf;
811 
812 #if !CONFIG_REALTIME_ONLY
813   av1_update_film_grain_parameters(cpi, oxcf);
814 #endif
815 
816   // When user provides superres_mode = AOM_SUPERRES_AUTO, we still initialize
817   // superres mode for current encoding = AOM_SUPERRES_NONE. This is to ensure
818   // that any analysis (e.g. TPL) happening outside the main encoding loop still
819   // happens at full resolution.
820   // This value will later be set appropriately just before main encoding loop.
821   cpi->superres_mode = oxcf->superres_cfg.superres_mode == AOM_SUPERRES_AUTO
822                            ? AOM_SUPERRES_NONE
823                            : oxcf->superres_cfg.superres_mode;  // default
824   x->e_mbd.bd = (int)seq_params->bit_depth;
825   x->e_mbd.global_motion = cm->global_motion;
826 
827   memcpy(level_params->target_seq_level_idx, cpi->oxcf.target_seq_level_idx,
828          sizeof(level_params->target_seq_level_idx));
829   level_params->keep_level_stats = 0;
830   for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
831     if (level_params->target_seq_level_idx[i] < SEQ_LEVELS ||
832         level_params->target_seq_level_idx[i] == SEQ_LEVEL_KEEP_STATS) {
833       level_params->keep_level_stats |= 1u << i;
834       if (!level_params->level_info[i]) {
835         CHECK_MEM_ERROR(cm, level_params->level_info[i],
836                         aom_calloc(1, sizeof(*level_params->level_info[i])));
837       }
838     }
839   }
840 
841   // TODO(huisu@): level targeting currently only works for the 0th operating
842   // point, so scalable coding is not supported yet.
843   if (level_params->target_seq_level_idx[0] < SEQ_LEVELS) {
844     // Adjust encoder config in order to meet target level.
845     config_target_level(cpi, level_params->target_seq_level_idx[0],
846                         seq_params->tier[0]);
847   }
848 
849   if (has_no_stats_stage(cpi) && (rc_cfg->mode == AOM_Q)) {
850     p_rc->baseline_gf_interval = FIXED_GF_INTERVAL;
851   } else if (!is_one_pass_rt_params(cpi) ||
852              cm->current_frame.frame_number == 0) {
853     // For rtc mode: logic for setting the baseline_gf_interval is done
854     // in av1_get_one_pass_rt_params(), and it should not be reset here in
855     // change_config(), unless after init_config (first frame).
856     p_rc->baseline_gf_interval = (MIN_GF_INTERVAL + MAX_GF_INTERVAL) / 2;
857   }
858 
859   refresh_frame->golden_frame = false;
860   refresh_frame->bwd_ref_frame = false;
861 
862   features->refresh_frame_context =
863       (oxcf->tool_cfg.frame_parallel_decoding_mode)
864           ? REFRESH_FRAME_CONTEXT_DISABLED
865           : REFRESH_FRAME_CONTEXT_BACKWARD;
866   if (oxcf->tile_cfg.enable_large_scale_tile)
867     features->refresh_frame_context = REFRESH_FRAME_CONTEXT_DISABLED;
868 
869   if (x->palette_buffer == NULL) {
870     CHECK_MEM_ERROR(cm, x->palette_buffer,
871                     aom_memalign(16, sizeof(*x->palette_buffer)));
872   }
873 
874   if (x->tmp_conv_dst == NULL) {
875     CHECK_MEM_ERROR(
876         cm, x->tmp_conv_dst,
877         aom_memalign(32, MAX_SB_SIZE * MAX_SB_SIZE * sizeof(*x->tmp_conv_dst)));
878     x->e_mbd.tmp_conv_dst = x->tmp_conv_dst;
879   }
880   // The buffers 'tmp_pred_bufs[]' and 'comp_rd_buffer' are used in inter frames
881   // to store intermediate inter mode prediction results and are not required
882   // for allintra encoding mode. Hence, the memory allocations for these buffers
883   // are avoided for allintra encoding mode.
884   if (cpi->oxcf.kf_cfg.key_freq_max != 0) {
885     if (x->comp_rd_buffer.pred0 == NULL)
886       alloc_compound_type_rd_buffers(cm->error, &x->comp_rd_buffer);
887 
888     for (int i = 0; i < 2; ++i) {
889       if (x->tmp_pred_bufs[i] == NULL) {
890         CHECK_MEM_ERROR(cm, x->tmp_pred_bufs[i],
891                         aom_memalign(32, 2 * MAX_MB_PLANE * MAX_SB_SQUARE *
892                                              sizeof(*x->tmp_pred_bufs[i])));
893         x->e_mbd.tmp_obmc_bufs[i] = x->tmp_pred_bufs[i];
894       }
895     }
896   }
897 
898   av1_reset_segment_features(cm);
899 
900   av1_set_high_precision_mv(cpi, 1, 0);
901 
902   // Under a configuration change, where maximum_buffer_size may change,
903   // keep buffer level clipped to the maximum allowed buffer size.
904   p_rc->bits_off_target =
905       AOMMIN(p_rc->bits_off_target, p_rc->maximum_buffer_size);
906   p_rc->buffer_level = AOMMIN(p_rc->buffer_level, p_rc->maximum_buffer_size);
907 
908   // Set up frame rate and related parameters rate control values.
909   av1_new_framerate(cpi, cpi->framerate);
910 
911   // Set absolute upper and lower quality limits
912   rc->worst_quality = rc_cfg->worst_allowed_q;
913   rc->best_quality = rc_cfg->best_allowed_q;
914 
915   // If lossless has been requested make sure average Q accumulators are reset.
916   if (is_lossless_requested(&cpi->oxcf.rc_cfg)) {
917     int i;
918     for (i = 0; i < FRAME_TYPES; ++i) {
919       p_rc->avg_frame_qindex[i] = 0;
920     }
921   }
922 
923   features->interp_filter =
924       oxcf->tile_cfg.enable_large_scale_tile ? EIGHTTAP_REGULAR : SWITCHABLE;
925   features->switchable_motion_mode = is_switchable_motion_mode_allowed(
926       features->allow_warped_motion, oxcf->motion_mode_cfg.enable_obmc);
927 
928   if (frm_dim_cfg->render_width > 0 && frm_dim_cfg->render_height > 0) {
929     cm->render_width = frm_dim_cfg->render_width;
930     cm->render_height = frm_dim_cfg->render_height;
931   } else {
932     cm->render_width = frm_dim_cfg->width;
933     cm->render_height = frm_dim_cfg->height;
934   }
935   cm->width = frm_dim_cfg->width;
936   cm->height = frm_dim_cfg->height;
937 
938   if (cm->width > cpi->data_alloc_width ||
939       cm->height > cpi->data_alloc_height || is_sb_size_changed) {
940     av1_free_context_buffers(cm);
941     av1_free_shared_coeff_buffer(&cpi->td.shared_coeff_buf);
942     av1_free_sms_tree(&cpi->td);
943     av1_free_pmc(cpi->td.firstpass_ctx, av1_num_planes(cm));
944     cpi->td.firstpass_ctx = NULL;
945     alloc_compressor_data(cpi);
946     realloc_segmentation_maps(cpi);
947     cpi->data_alloc_width = cm->width;
948     cpi->data_alloc_height = cm->height;
949     cpi->frame_size_related_setup_done = false;
950   }
951   av1_update_frame_size(cpi);
952 
953   rc->is_src_frame_alt_ref = 0;
954 
955   if (!cpi->ppi->rtc_ref.set_ref_frame_config)
956     cpi->ext_flags.refresh_frame.update_pending = 0;
957   cpi->ext_flags.refresh_frame_context_pending = 0;
958 
959   if (cpi->ppi->use_svc)
960     av1_update_layer_context_change_config(cpi, rc_cfg->target_bandwidth);
961 
962   check_reset_rc_flag(cpi);
963 
964   // restore the value of lag_in_frame for LAP stage.
965   if (lap_lag_in_frames != -1) {
966     cpi->oxcf.gf_cfg.lag_in_frames = lap_lag_in_frames;
967   }
968 
969 #if CONFIG_REALTIME_ONLY
970   assert(!oxcf->tool_cfg.enable_global_motion);
971   cpi->alloc_pyramid = false;
972 #else
973   cpi->alloc_pyramid = oxcf->tool_cfg.enable_global_motion;
974 #endif  // CONFIG_REALTIME_ONLY
975 }
976 
init_frame_info(FRAME_INFO * frame_info,const AV1_COMMON * const cm)977 static inline void init_frame_info(FRAME_INFO *frame_info,
978                                    const AV1_COMMON *const cm) {
979   const CommonModeInfoParams *const mi_params = &cm->mi_params;
980   const SequenceHeader *const seq_params = cm->seq_params;
981   frame_info->frame_width = cm->width;
982   frame_info->frame_height = cm->height;
983   frame_info->mi_cols = mi_params->mi_cols;
984   frame_info->mi_rows = mi_params->mi_rows;
985   frame_info->mb_cols = mi_params->mb_cols;
986   frame_info->mb_rows = mi_params->mb_rows;
987   frame_info->num_mbs = mi_params->MBs;
988   frame_info->bit_depth = seq_params->bit_depth;
989   frame_info->subsampling_x = seq_params->subsampling_x;
990   frame_info->subsampling_y = seq_params->subsampling_y;
991 }
992 
init_frame_index_set(FRAME_INDEX_SET * frame_index_set)993 static inline void init_frame_index_set(FRAME_INDEX_SET *frame_index_set) {
994   frame_index_set->show_frame_count = 0;
995 }
996 
update_counters_for_show_frame(AV1_COMP * const cpi)997 static inline void update_counters_for_show_frame(AV1_COMP *const cpi) {
998   assert(cpi->common.show_frame);
999   cpi->frame_index_set.show_frame_count++;
1000   cpi->common.current_frame.frame_number++;
1001 }
1002 
av1_create_primary_compressor(struct aom_codec_pkt_list * pkt_list_head,int num_lap_buffers,const AV1EncoderConfig * oxcf)1003 AV1_PRIMARY *av1_create_primary_compressor(
1004     struct aom_codec_pkt_list *pkt_list_head, int num_lap_buffers,
1005     const AV1EncoderConfig *oxcf) {
1006   AV1_PRIMARY *volatile const ppi = aom_memalign(32, sizeof(AV1_PRIMARY));
1007   if (!ppi) return NULL;
1008   av1_zero(*ppi);
1009 
1010   // The jmp_buf is valid only for the duration of the function that calls
1011   // setjmp(). Therefore, this function must reset the 'setjmp' field to 0
1012   // before it returns.
1013   if (setjmp(ppi->error.jmp)) {
1014     ppi->error.setjmp = 0;
1015     av1_remove_primary_compressor(ppi);
1016     return 0;
1017   }
1018   ppi->error.setjmp = 1;
1019 
1020   ppi->seq_params_locked = 0;
1021   ppi->lap_enabled = num_lap_buffers > 0;
1022   ppi->output_pkt_list = pkt_list_head;
1023   ppi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
1024   ppi->frames_left = oxcf->input_cfg.limit;
1025   ppi->num_fp_contexts = 1;
1026 
1027   init_config_sequence(ppi, oxcf);
1028 
1029 #if CONFIG_ENTROPY_STATS
1030   av1_zero(ppi->aggregate_fc);
1031 #endif  // CONFIG_ENTROPY_STATS
1032 
1033   av1_primary_rc_init(oxcf, &ppi->p_rc);
1034 
1035   // For two pass and lag_in_frames > 33 in LAP.
1036   ppi->p_rc.enable_scenecut_detection = ENABLE_SCENECUT_MODE_2;
1037   if (ppi->lap_enabled) {
1038     if ((num_lap_buffers <
1039          (MAX_GF_LENGTH_LAP + SCENE_CUT_KEY_TEST_INTERVAL + 1)) &&
1040         num_lap_buffers >= (MAX_GF_LENGTH_LAP + 3)) {
1041       /*
1042        * For lag in frames >= 19 and <33, enable scenecut
1043        * with limited future frame prediction.
1044        */
1045       ppi->p_rc.enable_scenecut_detection = ENABLE_SCENECUT_MODE_1;
1046     } else if (num_lap_buffers < (MAX_GF_LENGTH_LAP + 3)) {
1047       // Disable scenecut when lag_in_frames < 19.
1048       ppi->p_rc.enable_scenecut_detection = DISABLE_SCENECUT;
1049     }
1050   }
1051 
1052 #define BFP(BT, SDF, SDAF, VF, SVF, SVAF, SDX4DF, SDX3DF) \
1053   ppi->fn_ptr[BT].sdf = SDF;                              \
1054   ppi->fn_ptr[BT].sdaf = SDAF;                            \
1055   ppi->fn_ptr[BT].vf = VF;                                \
1056   ppi->fn_ptr[BT].svf = SVF;                              \
1057   ppi->fn_ptr[BT].svaf = SVAF;                            \
1058   ppi->fn_ptr[BT].sdx4df = SDX4DF;                        \
1059   ppi->fn_ptr[BT].sdx3df = SDX3DF;
1060 
1061 // Realtime mode doesn't use 4x rectangular blocks.
1062 #if !CONFIG_REALTIME_ONLY
1063   // sdaf (used in compound prediction, get_mvpred_compound_sad()) is unused
1064   // for 4xN and Nx4 blocks.
1065   BFP(BLOCK_4X16, aom_sad4x16, /*SDAF=*/NULL, aom_variance4x16,
1066       aom_sub_pixel_variance4x16, aom_sub_pixel_avg_variance4x16,
1067       aom_sad4x16x4d, aom_sad4x16x3d)
1068 
1069   // sdaf (used in compound prediction, get_mvpred_compound_sad()) is unused
1070   // for 4xN and Nx4 blocks.
1071   BFP(BLOCK_16X4, aom_sad16x4, /*SDAF=*/NULL, aom_variance16x4,
1072       aom_sub_pixel_variance16x4, aom_sub_pixel_avg_variance16x4,
1073       aom_sad16x4x4d, aom_sad16x4x3d)
1074 
1075   BFP(BLOCK_8X32, aom_sad8x32, aom_sad8x32_avg, aom_variance8x32,
1076       aom_sub_pixel_variance8x32, aom_sub_pixel_avg_variance8x32,
1077       aom_sad8x32x4d, aom_sad8x32x3d)
1078 
1079   BFP(BLOCK_32X8, aom_sad32x8, aom_sad32x8_avg, aom_variance32x8,
1080       aom_sub_pixel_variance32x8, aom_sub_pixel_avg_variance32x8,
1081       aom_sad32x8x4d, aom_sad32x8x3d)
1082 
1083   BFP(BLOCK_16X64, aom_sad16x64, aom_sad16x64_avg, aom_variance16x64,
1084       aom_sub_pixel_variance16x64, aom_sub_pixel_avg_variance16x64,
1085       aom_sad16x64x4d, aom_sad16x64x3d)
1086 
1087   BFP(BLOCK_64X16, aom_sad64x16, aom_sad64x16_avg, aom_variance64x16,
1088       aom_sub_pixel_variance64x16, aom_sub_pixel_avg_variance64x16,
1089       aom_sad64x16x4d, aom_sad64x16x3d)
1090 #endif  // !CONFIG_REALTIME_ONLY
1091 
1092   BFP(BLOCK_128X128, aom_sad128x128, aom_sad128x128_avg, aom_variance128x128,
1093       aom_sub_pixel_variance128x128, aom_sub_pixel_avg_variance128x128,
1094       aom_sad128x128x4d, aom_sad128x128x3d)
1095 
1096   BFP(BLOCK_128X64, aom_sad128x64, aom_sad128x64_avg, aom_variance128x64,
1097       aom_sub_pixel_variance128x64, aom_sub_pixel_avg_variance128x64,
1098       aom_sad128x64x4d, aom_sad128x64x3d)
1099 
1100   BFP(BLOCK_64X128, aom_sad64x128, aom_sad64x128_avg, aom_variance64x128,
1101       aom_sub_pixel_variance64x128, aom_sub_pixel_avg_variance64x128,
1102       aom_sad64x128x4d, aom_sad64x128x3d)
1103 
1104   BFP(BLOCK_32X16, aom_sad32x16, aom_sad32x16_avg, aom_variance32x16,
1105       aom_sub_pixel_variance32x16, aom_sub_pixel_avg_variance32x16,
1106       aom_sad32x16x4d, aom_sad32x16x3d)
1107 
1108   BFP(BLOCK_16X32, aom_sad16x32, aom_sad16x32_avg, aom_variance16x32,
1109       aom_sub_pixel_variance16x32, aom_sub_pixel_avg_variance16x32,
1110       aom_sad16x32x4d, aom_sad16x32x3d)
1111 
1112   BFP(BLOCK_64X32, aom_sad64x32, aom_sad64x32_avg, aom_variance64x32,
1113       aom_sub_pixel_variance64x32, aom_sub_pixel_avg_variance64x32,
1114       aom_sad64x32x4d, aom_sad64x32x3d)
1115 
1116   BFP(BLOCK_32X64, aom_sad32x64, aom_sad32x64_avg, aom_variance32x64,
1117       aom_sub_pixel_variance32x64, aom_sub_pixel_avg_variance32x64,
1118       aom_sad32x64x4d, aom_sad32x64x3d)
1119 
1120   BFP(BLOCK_32X32, aom_sad32x32, aom_sad32x32_avg, aom_variance32x32,
1121       aom_sub_pixel_variance32x32, aom_sub_pixel_avg_variance32x32,
1122       aom_sad32x32x4d, aom_sad32x32x3d)
1123 
1124   BFP(BLOCK_64X64, aom_sad64x64, aom_sad64x64_avg, aom_variance64x64,
1125       aom_sub_pixel_variance64x64, aom_sub_pixel_avg_variance64x64,
1126       aom_sad64x64x4d, aom_sad64x64x3d)
1127 
1128   BFP(BLOCK_16X16, aom_sad16x16, aom_sad16x16_avg, aom_variance16x16,
1129       aom_sub_pixel_variance16x16, aom_sub_pixel_avg_variance16x16,
1130       aom_sad16x16x4d, aom_sad16x16x3d)
1131 
1132   BFP(BLOCK_16X8, aom_sad16x8, aom_sad16x8_avg, aom_variance16x8,
1133       aom_sub_pixel_variance16x8, aom_sub_pixel_avg_variance16x8,
1134       aom_sad16x8x4d, aom_sad16x8x3d)
1135 
1136   BFP(BLOCK_8X16, aom_sad8x16, aom_sad8x16_avg, aom_variance8x16,
1137       aom_sub_pixel_variance8x16, aom_sub_pixel_avg_variance8x16,
1138       aom_sad8x16x4d, aom_sad8x16x3d)
1139 
1140   BFP(BLOCK_8X8, aom_sad8x8, aom_sad8x8_avg, aom_variance8x8,
1141       aom_sub_pixel_variance8x8, aom_sub_pixel_avg_variance8x8, aom_sad8x8x4d,
1142       aom_sad8x8x3d)
1143 
1144   // sdaf (used in compound prediction, get_mvpred_compound_sad()) is unused
1145   // for 4xN and Nx4 blocks.
1146   BFP(BLOCK_8X4, aom_sad8x4, /*SDAF=*/NULL, aom_variance8x4,
1147       aom_sub_pixel_variance8x4, aom_sub_pixel_avg_variance8x4, aom_sad8x4x4d,
1148       aom_sad8x4x3d)
1149 
1150   // sdaf (used in compound prediction, get_mvpred_compound_sad()) is unused
1151   // for 4xN and Nx4 blocks.
1152   BFP(BLOCK_4X8, aom_sad4x8, /*SDAF=*/NULL, aom_variance4x8,
1153       aom_sub_pixel_variance4x8, aom_sub_pixel_avg_variance4x8, aom_sad4x8x4d,
1154       aom_sad4x8x3d)
1155 
1156   // sdaf (used in compound prediction, get_mvpred_compound_sad()) is unused
1157   // for 4xN and Nx4 blocks.
1158   BFP(BLOCK_4X4, aom_sad4x4, /*SDAF=*/NULL, aom_variance4x4,
1159       aom_sub_pixel_variance4x4, aom_sub_pixel_avg_variance4x4, aom_sad4x4x4d,
1160       aom_sad4x4x3d)
1161 
1162 #if !CONFIG_REALTIME_ONLY
1163 #define OBFP(BT, OSDF, OVF, OSVF) \
1164   ppi->fn_ptr[BT].osdf = OSDF;    \
1165   ppi->fn_ptr[BT].ovf = OVF;      \
1166   ppi->fn_ptr[BT].osvf = OSVF;
1167 
1168   OBFP(BLOCK_128X128, aom_obmc_sad128x128, aom_obmc_variance128x128,
1169        aom_obmc_sub_pixel_variance128x128)
1170   OBFP(BLOCK_128X64, aom_obmc_sad128x64, aom_obmc_variance128x64,
1171        aom_obmc_sub_pixel_variance128x64)
1172   OBFP(BLOCK_64X128, aom_obmc_sad64x128, aom_obmc_variance64x128,
1173        aom_obmc_sub_pixel_variance64x128)
1174   OBFP(BLOCK_64X64, aom_obmc_sad64x64, aom_obmc_variance64x64,
1175        aom_obmc_sub_pixel_variance64x64)
1176   OBFP(BLOCK_64X32, aom_obmc_sad64x32, aom_obmc_variance64x32,
1177        aom_obmc_sub_pixel_variance64x32)
1178   OBFP(BLOCK_32X64, aom_obmc_sad32x64, aom_obmc_variance32x64,
1179        aom_obmc_sub_pixel_variance32x64)
1180   OBFP(BLOCK_32X32, aom_obmc_sad32x32, aom_obmc_variance32x32,
1181        aom_obmc_sub_pixel_variance32x32)
1182   OBFP(BLOCK_32X16, aom_obmc_sad32x16, aom_obmc_variance32x16,
1183        aom_obmc_sub_pixel_variance32x16)
1184   OBFP(BLOCK_16X32, aom_obmc_sad16x32, aom_obmc_variance16x32,
1185        aom_obmc_sub_pixel_variance16x32)
1186   OBFP(BLOCK_16X16, aom_obmc_sad16x16, aom_obmc_variance16x16,
1187        aom_obmc_sub_pixel_variance16x16)
1188   OBFP(BLOCK_16X8, aom_obmc_sad16x8, aom_obmc_variance16x8,
1189        aom_obmc_sub_pixel_variance16x8)
1190   OBFP(BLOCK_8X16, aom_obmc_sad8x16, aom_obmc_variance8x16,
1191        aom_obmc_sub_pixel_variance8x16)
1192   OBFP(BLOCK_8X8, aom_obmc_sad8x8, aom_obmc_variance8x8,
1193        aom_obmc_sub_pixel_variance8x8)
1194   OBFP(BLOCK_4X8, aom_obmc_sad4x8, aom_obmc_variance4x8,
1195        aom_obmc_sub_pixel_variance4x8)
1196   OBFP(BLOCK_8X4, aom_obmc_sad8x4, aom_obmc_variance8x4,
1197        aom_obmc_sub_pixel_variance8x4)
1198   OBFP(BLOCK_4X4, aom_obmc_sad4x4, aom_obmc_variance4x4,
1199        aom_obmc_sub_pixel_variance4x4)
1200   OBFP(BLOCK_4X16, aom_obmc_sad4x16, aom_obmc_variance4x16,
1201        aom_obmc_sub_pixel_variance4x16)
1202   OBFP(BLOCK_16X4, aom_obmc_sad16x4, aom_obmc_variance16x4,
1203        aom_obmc_sub_pixel_variance16x4)
1204   OBFP(BLOCK_8X32, aom_obmc_sad8x32, aom_obmc_variance8x32,
1205        aom_obmc_sub_pixel_variance8x32)
1206   OBFP(BLOCK_32X8, aom_obmc_sad32x8, aom_obmc_variance32x8,
1207        aom_obmc_sub_pixel_variance32x8)
1208   OBFP(BLOCK_16X64, aom_obmc_sad16x64, aom_obmc_variance16x64,
1209        aom_obmc_sub_pixel_variance16x64)
1210   OBFP(BLOCK_64X16, aom_obmc_sad64x16, aom_obmc_variance64x16,
1211        aom_obmc_sub_pixel_variance64x16)
1212 #endif  // !CONFIG_REALTIME_ONLY
1213 
1214 #define MBFP(BT, MCSDF, MCSVF)  \
1215   ppi->fn_ptr[BT].msdf = MCSDF; \
1216   ppi->fn_ptr[BT].msvf = MCSVF;
1217 
1218   MBFP(BLOCK_128X128, aom_masked_sad128x128,
1219        aom_masked_sub_pixel_variance128x128)
1220   MBFP(BLOCK_128X64, aom_masked_sad128x64, aom_masked_sub_pixel_variance128x64)
1221   MBFP(BLOCK_64X128, aom_masked_sad64x128, aom_masked_sub_pixel_variance64x128)
1222   MBFP(BLOCK_64X64, aom_masked_sad64x64, aom_masked_sub_pixel_variance64x64)
1223   MBFP(BLOCK_64X32, aom_masked_sad64x32, aom_masked_sub_pixel_variance64x32)
1224   MBFP(BLOCK_32X64, aom_masked_sad32x64, aom_masked_sub_pixel_variance32x64)
1225   MBFP(BLOCK_32X32, aom_masked_sad32x32, aom_masked_sub_pixel_variance32x32)
1226   MBFP(BLOCK_32X16, aom_masked_sad32x16, aom_masked_sub_pixel_variance32x16)
1227   MBFP(BLOCK_16X32, aom_masked_sad16x32, aom_masked_sub_pixel_variance16x32)
1228   MBFP(BLOCK_16X16, aom_masked_sad16x16, aom_masked_sub_pixel_variance16x16)
1229   MBFP(BLOCK_16X8, aom_masked_sad16x8, aom_masked_sub_pixel_variance16x8)
1230   MBFP(BLOCK_8X16, aom_masked_sad8x16, aom_masked_sub_pixel_variance8x16)
1231   MBFP(BLOCK_8X8, aom_masked_sad8x8, aom_masked_sub_pixel_variance8x8)
1232   MBFP(BLOCK_4X8, aom_masked_sad4x8, aom_masked_sub_pixel_variance4x8)
1233   MBFP(BLOCK_8X4, aom_masked_sad8x4, aom_masked_sub_pixel_variance8x4)
1234   MBFP(BLOCK_4X4, aom_masked_sad4x4, aom_masked_sub_pixel_variance4x4)
1235 
1236 #if !CONFIG_REALTIME_ONLY
1237   MBFP(BLOCK_4X16, aom_masked_sad4x16, aom_masked_sub_pixel_variance4x16)
1238   MBFP(BLOCK_16X4, aom_masked_sad16x4, aom_masked_sub_pixel_variance16x4)
1239   MBFP(BLOCK_8X32, aom_masked_sad8x32, aom_masked_sub_pixel_variance8x32)
1240   MBFP(BLOCK_32X8, aom_masked_sad32x8, aom_masked_sub_pixel_variance32x8)
1241   MBFP(BLOCK_16X64, aom_masked_sad16x64, aom_masked_sub_pixel_variance16x64)
1242   MBFP(BLOCK_64X16, aom_masked_sad64x16, aom_masked_sub_pixel_variance64x16)
1243 #endif
1244 
1245 #define SDSFP(BT, SDSF, SDSX4DF) \
1246   ppi->fn_ptr[BT].sdsf = SDSF;   \
1247   ppi->fn_ptr[BT].sdsx4df = SDSX4DF;
1248 
1249   SDSFP(BLOCK_128X128, aom_sad_skip_128x128, aom_sad_skip_128x128x4d)
1250   SDSFP(BLOCK_128X64, aom_sad_skip_128x64, aom_sad_skip_128x64x4d)
1251   SDSFP(BLOCK_64X128, aom_sad_skip_64x128, aom_sad_skip_64x128x4d)
1252   SDSFP(BLOCK_64X64, aom_sad_skip_64x64, aom_sad_skip_64x64x4d)
1253   SDSFP(BLOCK_64X32, aom_sad_skip_64x32, aom_sad_skip_64x32x4d)
1254 
1255   SDSFP(BLOCK_32X64, aom_sad_skip_32x64, aom_sad_skip_32x64x4d)
1256   SDSFP(BLOCK_32X32, aom_sad_skip_32x32, aom_sad_skip_32x32x4d)
1257   SDSFP(BLOCK_32X16, aom_sad_skip_32x16, aom_sad_skip_32x16x4d)
1258 
1259   SDSFP(BLOCK_16X32, aom_sad_skip_16x32, aom_sad_skip_16x32x4d)
1260   SDSFP(BLOCK_16X16, aom_sad_skip_16x16, aom_sad_skip_16x16x4d)
1261   SDSFP(BLOCK_8X16, aom_sad_skip_8x16, aom_sad_skip_8x16x4d)
1262 
1263 #if !CONFIG_REALTIME_ONLY
1264   SDSFP(BLOCK_64X16, aom_sad_skip_64x16, aom_sad_skip_64x16x4d)
1265   SDSFP(BLOCK_16X64, aom_sad_skip_16x64, aom_sad_skip_16x64x4d)
1266   SDSFP(BLOCK_8X32, aom_sad_skip_8x32, aom_sad_skip_8x32x4d)
1267   SDSFP(BLOCK_4X16, aom_sad_skip_4x16, aom_sad_skip_4x16x4d)
1268 #endif
1269 #undef SDSFP
1270 
1271 #if CONFIG_AV1_HIGHBITDEPTH
1272   highbd_set_var_fns(ppi);
1273 #endif
1274 
1275   {
1276     // As cm->mi_params is a part of the frame level context (cpi), it is
1277     // unavailable at this point. mi_params is created as a local temporary
1278     // variable, to be passed into the functions used for allocating tpl
1279     // buffers. The values in this variable are populated according to initial
1280     // width and height of the frame.
1281     CommonModeInfoParams mi_params;
1282     enc_set_mb_mi(&mi_params, oxcf->frm_dim_cfg.width, oxcf->frm_dim_cfg.height,
1283                   BLOCK_4X4);
1284 
1285     const BLOCK_SIZE bsize = BLOCK_16X16;
1286     const int w = mi_size_wide[bsize];
1287     const int h = mi_size_high[bsize];
1288     const int num_cols = (mi_params.mi_cols + w - 1) / w;
1289     const int num_rows = (mi_params.mi_rows + h - 1) / h;
1290     AOM_CHECK_MEM_ERROR(
1291         &ppi->error, ppi->tpl_sb_rdmult_scaling_factors,
1292         aom_calloc(num_rows * num_cols,
1293                    sizeof(*ppi->tpl_sb_rdmult_scaling_factors)));
1294 
1295 #if CONFIG_INTERNAL_STATS
1296     ppi->b_calculate_blockiness = 1;
1297     ppi->b_calculate_consistency = 1;
1298 
1299     for (int i = 0; i <= STAT_ALL; i++) {
1300       ppi->psnr[0].stat[i] = 0;
1301       ppi->psnr[1].stat[i] = 0;
1302 
1303       ppi->fastssim.stat[i] = 0;
1304       ppi->psnrhvs.stat[i] = 0;
1305     }
1306 
1307     ppi->psnr[0].worst = 100.0;
1308     ppi->psnr[1].worst = 100.0;
1309     ppi->worst_ssim = 100.0;
1310     ppi->worst_ssim_hbd = 100.0;
1311 
1312     ppi->count[0] = 0;
1313     ppi->count[1] = 0;
1314     ppi->total_bytes = 0;
1315 
1316     if (ppi->b_calculate_psnr) {
1317       ppi->total_sq_error[0] = 0;
1318       ppi->total_samples[0] = 0;
1319       ppi->total_sq_error[1] = 0;
1320       ppi->total_samples[1] = 0;
1321       ppi->total_recode_hits = 0;
1322       ppi->summed_quality = 0;
1323       ppi->summed_weights = 0;
1324       ppi->summed_quality_hbd = 0;
1325       ppi->summed_weights_hbd = 0;
1326     }
1327 
1328     ppi->fastssim.worst = 100.0;
1329     ppi->psnrhvs.worst = 100.0;
1330 
1331     if (ppi->b_calculate_blockiness) {
1332       ppi->total_blockiness = 0;
1333       ppi->worst_blockiness = 0.0;
1334     }
1335 
1336     ppi->total_inconsistency = 0;
1337     ppi->worst_consistency = 100.0;
1338     if (ppi->b_calculate_consistency) {
1339       AOM_CHECK_MEM_ERROR(&ppi->error, ppi->ssim_vars,
1340                           aom_malloc(sizeof(*ppi->ssim_vars) * 4 *
1341                                      mi_params.mi_rows * mi_params.mi_cols));
1342     }
1343 #endif
1344   }
1345 
1346   ppi->error.setjmp = 0;
1347   return ppi;
1348 }
1349 
av1_create_compressor(AV1_PRIMARY * ppi,const AV1EncoderConfig * oxcf,BufferPool * const pool,COMPRESSOR_STAGE stage,int lap_lag_in_frames)1350 AV1_COMP *av1_create_compressor(AV1_PRIMARY *ppi, const AV1EncoderConfig *oxcf,
1351                                 BufferPool *const pool, COMPRESSOR_STAGE stage,
1352                                 int lap_lag_in_frames) {
1353   AV1_COMP *volatile const cpi = aom_memalign(32, sizeof(AV1_COMP));
1354 
1355   if (!cpi) return NULL;
1356 
1357   av1_zero(*cpi);
1358 
1359   cpi->ppi = ppi;
1360 
1361   AV1_COMMON *volatile const cm = &cpi->common;
1362   cm->seq_params = &ppi->seq_params;
1363   cm->error =
1364       (struct aom_internal_error_info *)aom_calloc(1, sizeof(*cm->error));
1365   if (!cm->error) {
1366     aom_free(cpi);
1367     return NULL;
1368   }
1369 
1370   // The jmp_buf is valid only for the duration of the function that calls
1371   // setjmp(). Therefore, this function must reset the 'setjmp' field to 0
1372   // before it returns.
1373   if (setjmp(cm->error->jmp)) {
1374     cm->error->setjmp = 0;
1375     av1_remove_compressor(cpi);
1376     return NULL;
1377   }
1378 
1379   cm->error->setjmp = 1;
1380   cpi->compressor_stage = stage;
1381 
1382   cpi->do_frame_data_update = true;
1383 
1384   CommonModeInfoParams *const mi_params = &cm->mi_params;
1385   mi_params->free_mi = enc_free_mi;
1386   mi_params->setup_mi = enc_setup_mi;
1387   mi_params->set_mb_mi =
1388       (oxcf->pass == AOM_RC_FIRST_PASS || cpi->compressor_stage == LAP_STAGE)
1389           ? stat_stage_set_mb_mi
1390           : enc_set_mb_mi;
1391 
1392   mi_params->mi_alloc_bsize = BLOCK_4X4;
1393 
1394   CHECK_MEM_ERROR(cm, cm->fc,
1395                   (FRAME_CONTEXT *)aom_memalign(32, sizeof(*cm->fc)));
1396   CHECK_MEM_ERROR(
1397       cm, cm->default_frame_context,
1398       (FRAME_CONTEXT *)aom_memalign(32, sizeof(*cm->default_frame_context)));
1399   memset(cm->fc, 0, sizeof(*cm->fc));
1400   memset(cm->default_frame_context, 0, sizeof(*cm->default_frame_context));
1401 
1402   cpi->common.buffer_pool = pool;
1403 
1404   init_config(cpi, oxcf);
1405   if (cpi->compressor_stage == LAP_STAGE) {
1406     cpi->oxcf.gf_cfg.lag_in_frames = lap_lag_in_frames;
1407   }
1408 
1409   av1_rc_init(&cpi->oxcf, &cpi->rc);
1410 
1411   init_frame_info(&cpi->frame_info, cm);
1412   init_frame_index_set(&cpi->frame_index_set);
1413 
1414   cm->current_frame.frame_number = 0;
1415   cpi->rc.frame_number_encoded = 0;
1416   cpi->rc.prev_frame_is_dropped = 0;
1417   cpi->rc.max_consec_drop = INT_MAX;
1418   cpi->rc.drop_count_consec = 0;
1419   cm->current_frame_id = -1;
1420   cpi->tile_data = NULL;
1421   cpi->last_show_frame_buf = NULL;
1422   realloc_segmentation_maps(cpi);
1423 
1424   cpi->refresh_frame.alt_ref_frame = false;
1425 
1426 #if CONFIG_SPEED_STATS
1427   cpi->tx_search_count = 0;
1428 #endif  // CONFIG_SPEED_STATS
1429 
1430   cpi->time_stamps.first_ts_start = INT64_MAX;
1431 
1432 #ifdef OUTPUT_YUV_REC
1433   yuv_rec_file = fopen("rec.yuv", "wb");
1434 #endif
1435 #ifdef OUTPUT_YUV_DENOISED
1436   yuv_denoised_file = fopen("denoised.yuv", "wb");
1437 #endif
1438 
1439 #if !CONFIG_REALTIME_ONLY
1440   if (is_stat_consumption_stage(cpi)) {
1441     const size_t packet_sz = sizeof(FIRSTPASS_STATS);
1442     const int packets = (int)(oxcf->twopass_stats_in.sz / packet_sz);
1443 
1444     if (!cpi->ppi->lap_enabled) {
1445       /*Re-initialize to stats buffer, populated by application in the case of
1446        * two pass*/
1447       cpi->ppi->twopass.stats_buf_ctx->stats_in_start =
1448           oxcf->twopass_stats_in.buf;
1449       cpi->twopass_frame.stats_in =
1450           cpi->ppi->twopass.stats_buf_ctx->stats_in_start;
1451       cpi->ppi->twopass.stats_buf_ctx->stats_in_end =
1452           &cpi->ppi->twopass.stats_buf_ctx->stats_in_start[packets - 1];
1453 
1454       // The buffer size is packets - 1 because the last packet is total_stats.
1455       av1_firstpass_info_init(&cpi->ppi->twopass.firstpass_info,
1456                               oxcf->twopass_stats_in.buf, packets - 1);
1457       av1_init_second_pass(cpi);
1458     } else {
1459       av1_firstpass_info_init(&cpi->ppi->twopass.firstpass_info, NULL, 0);
1460       av1_init_single_pass_lap(cpi);
1461     }
1462   }
1463 #endif
1464 
1465   // The buffer "obmc_buffer" is used in inter frames for fast obmc search.
1466   // Hence, the memory allocation for the same is avoided for allintra encoding
1467   // mode.
1468   if (cpi->oxcf.kf_cfg.key_freq_max != 0)
1469     alloc_obmc_buffers(&cpi->td.mb.obmc_buffer, cm->error);
1470 
1471   for (int x = 0; x < 2; x++)
1472     for (int y = 0; y < 2; y++)
1473       CHECK_MEM_ERROR(
1474           cm, cpi->td.mb.intrabc_hash_info.hash_value_buffer[x][y],
1475           (uint32_t *)aom_malloc(
1476               AOM_BUFFER_SIZE_FOR_BLOCK_HASH *
1477               sizeof(*cpi->td.mb.intrabc_hash_info.hash_value_buffer[0][0])));
1478 
1479   cpi->td.mb.intrabc_hash_info.g_crc_initialized = 0;
1480 
1481   av1_set_speed_features_framesize_independent(cpi, oxcf->speed);
1482   av1_set_speed_features_framesize_dependent(cpi, oxcf->speed);
1483 
1484   int max_mi_cols = mi_params->mi_cols;
1485   int max_mi_rows = mi_params->mi_rows;
1486   if (oxcf->frm_dim_cfg.forced_max_frame_width) {
1487     max_mi_cols = size_in_mi(oxcf->frm_dim_cfg.forced_max_frame_width);
1488   }
1489   if (oxcf->frm_dim_cfg.forced_max_frame_height) {
1490     max_mi_rows = size_in_mi(oxcf->frm_dim_cfg.forced_max_frame_height);
1491   }
1492 
1493   const int consec_zero_mv_alloc_size = (max_mi_rows * max_mi_cols) >> 2;
1494   CHECK_MEM_ERROR(
1495       cm, cpi->consec_zero_mv,
1496       aom_calloc(consec_zero_mv_alloc_size, sizeof(*cpi->consec_zero_mv)));
1497   cpi->consec_zero_mv_alloc_size = consec_zero_mv_alloc_size;
1498 
1499   cpi->mb_weber_stats = NULL;
1500   cpi->mb_delta_q = NULL;
1501   cpi->palette_pixel_num = 0;
1502   cpi->scaled_last_source_available = 0;
1503 
1504   {
1505     const BLOCK_SIZE bsize = BLOCK_16X16;
1506     const int w = mi_size_wide[bsize];
1507     const int h = mi_size_high[bsize];
1508     const int num_cols = (max_mi_cols + w - 1) / w;
1509     const int num_rows = (max_mi_rows + h - 1) / h;
1510     CHECK_MEM_ERROR(cm, cpi->ssim_rdmult_scaling_factors,
1511                     aom_calloc(num_rows * num_cols,
1512                                sizeof(*cpi->ssim_rdmult_scaling_factors)));
1513     CHECK_MEM_ERROR(cm, cpi->tpl_rdmult_scaling_factors,
1514                     aom_calloc(num_rows * num_cols,
1515                                sizeof(*cpi->tpl_rdmult_scaling_factors)));
1516   }
1517 
1518 #if CONFIG_TUNE_VMAF
1519   {
1520     const BLOCK_SIZE bsize = BLOCK_64X64;
1521     const int w = mi_size_wide[bsize];
1522     const int h = mi_size_high[bsize];
1523     const int num_cols = (mi_params->mi_cols + w - 1) / w;
1524     const int num_rows = (mi_params->mi_rows + h - 1) / h;
1525     CHECK_MEM_ERROR(cm, cpi->vmaf_info.rdmult_scaling_factors,
1526                     aom_calloc(num_rows * num_cols,
1527                                sizeof(*cpi->vmaf_info.rdmult_scaling_factors)));
1528     for (int i = 0; i < MAX_ARF_LAYERS; i++) {
1529       cpi->vmaf_info.last_frame_unsharp_amount[i] = -1.0;
1530       cpi->vmaf_info.last_frame_ysse[i] = -1.0;
1531       cpi->vmaf_info.last_frame_vmaf[i] = -1.0;
1532     }
1533     cpi->vmaf_info.original_qindex = -1;
1534     cpi->vmaf_info.vmaf_model = NULL;
1535   }
1536 #endif
1537 
1538 #if CONFIG_TUNE_BUTTERAUGLI
1539   {
1540     const int w = mi_size_wide[butteraugli_rdo_bsize];
1541     const int h = mi_size_high[butteraugli_rdo_bsize];
1542     const int num_cols = (mi_params->mi_cols + w - 1) / w;
1543     const int num_rows = (mi_params->mi_rows + h - 1) / h;
1544     CHECK_MEM_ERROR(
1545         cm, cpi->butteraugli_info.rdmult_scaling_factors,
1546         aom_malloc(num_rows * num_cols *
1547                    sizeof(*cpi->butteraugli_info.rdmult_scaling_factors)));
1548     memset(&cpi->butteraugli_info.source, 0,
1549            sizeof(cpi->butteraugli_info.source));
1550     memset(&cpi->butteraugli_info.resized_source, 0,
1551            sizeof(cpi->butteraugli_info.resized_source));
1552     cpi->butteraugli_info.recon_set = false;
1553   }
1554 #endif
1555 
1556 #if CONFIG_SALIENCY_MAP
1557   {
1558     CHECK_MEM_ERROR(cm, cpi->saliency_map,
1559                     (uint8_t *)aom_calloc(cm->height * cm->width,
1560                                           sizeof(*cpi->saliency_map)));
1561     // Buffer initialization based on MIN_MIB_SIZE_LOG2 to ensure that
1562     // cpi->sm_scaling_factor buffer is allocated big enough, since we have no
1563     // idea of the actual superblock size we are going to use yet.
1564     const int min_mi_w_sb = (1 << MIN_MIB_SIZE_LOG2);
1565     const int min_mi_h_sb = (1 << MIN_MIB_SIZE_LOG2);
1566     const int max_sb_cols =
1567         (cm->mi_params.mi_cols + min_mi_w_sb - 1) / min_mi_w_sb;
1568     const int max_sb_rows =
1569         (cm->mi_params.mi_rows + min_mi_h_sb - 1) / min_mi_h_sb;
1570     CHECK_MEM_ERROR(cm, cpi->sm_scaling_factor,
1571                     (double *)aom_calloc(max_sb_rows * max_sb_cols,
1572                                          sizeof(*cpi->sm_scaling_factor)));
1573   }
1574 #endif
1575 
1576 #if CONFIG_COLLECT_PARTITION_STATS
1577   av1_zero(cpi->partition_stats);
1578 #endif  // CONFIG_COLLECT_PARTITION_STATS
1579 
1580   // Initialize the members of DeltaQuantParams with INT_MAX to ensure that
1581   // the quantizer tables are correctly initialized using the default deltaq
1582   // parameters when av1_init_quantizer is called for the first time.
1583   DeltaQuantParams *const prev_deltaq_params =
1584       &cpi->enc_quant_dequant_params.prev_deltaq_params;
1585   prev_deltaq_params->y_dc_delta_q = INT_MAX;
1586   prev_deltaq_params->u_dc_delta_q = INT_MAX;
1587   prev_deltaq_params->v_dc_delta_q = INT_MAX;
1588   prev_deltaq_params->u_ac_delta_q = INT_MAX;
1589   prev_deltaq_params->v_ac_delta_q = INT_MAX;
1590 
1591   av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
1592                      cm->seq_params->bit_depth);
1593   av1_qm_init(&cm->quant_params, av1_num_planes(cm));
1594 
1595   av1_loop_filter_init(cm);
1596   cm->superres_scale_denominator = SCALE_NUMERATOR;
1597   cm->superres_upscaled_width = oxcf->frm_dim_cfg.width;
1598   cm->superres_upscaled_height = oxcf->frm_dim_cfg.height;
1599 #if !CONFIG_REALTIME_ONLY
1600   av1_loop_restoration_precal();
1601 #endif
1602 
1603 #if CONFIG_THREE_PASS
1604   cpi->third_pass_ctx = NULL;
1605   if (cpi->oxcf.pass == AOM_RC_THIRD_PASS) {
1606     av1_init_thirdpass_ctx(cm, &cpi->third_pass_ctx, NULL);
1607   }
1608 #endif
1609 
1610   cpi->second_pass_log_stream = NULL;
1611   cpi->use_ducky_encode = 0;
1612 
1613   cm->error->setjmp = 0;
1614   return cpi;
1615 }
1616 
1617 #if CONFIG_INTERNAL_STATS
1618 #define SNPRINT(H, T) snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T))
1619 
1620 #define SNPRINT2(H, T, V) \
1621   snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T), (V))
1622 #endif  // CONFIG_INTERNAL_STATS
1623 
av1_remove_primary_compressor(AV1_PRIMARY * ppi)1624 void av1_remove_primary_compressor(AV1_PRIMARY *ppi) {
1625   if (!ppi) return;
1626 #if !CONFIG_REALTIME_ONLY
1627   av1_tf_info_free(&ppi->tf_info);
1628 #endif  // !CONFIG_REALTIME_ONLY
1629 
1630   for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
1631     aom_free(ppi->level_params.level_info[i]);
1632   }
1633   av1_lookahead_destroy(ppi->lookahead);
1634 
1635   aom_free(ppi->tpl_sb_rdmult_scaling_factors);
1636   ppi->tpl_sb_rdmult_scaling_factors = NULL;
1637 
1638   TplParams *const tpl_data = &ppi->tpl_data;
1639   aom_free(tpl_data->txfm_stats_list);
1640 
1641   for (int frame = 0; frame < MAX_LAG_BUFFERS; ++frame) {
1642     aom_free(tpl_data->tpl_stats_pool[frame]);
1643     aom_free_frame_buffer(&tpl_data->tpl_rec_pool[frame]);
1644     tpl_data->tpl_stats_pool[frame] = NULL;
1645   }
1646 
1647 #if !CONFIG_REALTIME_ONLY
1648   av1_tpl_dealloc(&tpl_data->tpl_mt_sync);
1649 #endif
1650 
1651   av1_terminate_workers(ppi);
1652   free_thread_data(ppi);
1653 
1654   aom_free(ppi->p_mt_info.tile_thr_data);
1655   ppi->p_mt_info.tile_thr_data = NULL;
1656   aom_free(ppi->p_mt_info.workers);
1657   ppi->p_mt_info.workers = NULL;
1658   ppi->p_mt_info.num_workers = 0;
1659 
1660   aom_free(ppi);
1661 }
1662 
av1_remove_compressor(AV1_COMP * cpi)1663 void av1_remove_compressor(AV1_COMP *cpi) {
1664   if (!cpi) return;
1665 #if CONFIG_RATECTRL_LOG
1666   if (cpi->oxcf.pass == 3) {
1667     rc_log_show(&cpi->rc_log);
1668   }
1669 #endif  // CONFIG_RATECTRL_LOG
1670 
1671   AV1_COMMON *cm = &cpi->common;
1672   if (cm->current_frame.frame_number > 0) {
1673 #if CONFIG_SPEED_STATS
1674     if (!is_stat_generation_stage(cpi)) {
1675       fprintf(stdout, "tx_search_count = %d\n", cpi->tx_search_count);
1676     }
1677 #endif  // CONFIG_SPEED_STATS
1678 
1679 #if CONFIG_COLLECT_PARTITION_STATS == 2
1680     if (!is_stat_generation_stage(cpi)) {
1681       av1_print_fr_partition_timing_stats(&cpi->partition_stats,
1682                                           "fr_part_timing_data.csv");
1683     }
1684 #endif
1685   }
1686 
1687 #if CONFIG_AV1_TEMPORAL_DENOISING
1688   av1_denoiser_free(&(cpi->denoiser));
1689 #endif
1690 
1691   if (cm->error) {
1692     // Help detect use after free of the error detail string.
1693     memset(cm->error->detail, 'A', sizeof(cm->error->detail) - 1);
1694     cm->error->detail[sizeof(cm->error->detail) - 1] = '\0';
1695     aom_free(cm->error);
1696   }
1697   aom_free(cpi->td.tctx);
1698   MultiThreadInfo *const mt_info = &cpi->mt_info;
1699 #if CONFIG_MULTITHREAD
1700   pthread_mutex_t *const enc_row_mt_mutex_ = mt_info->enc_row_mt.mutex_;
1701   pthread_cond_t *const enc_row_mt_cond_ = mt_info->enc_row_mt.cond_;
1702   pthread_mutex_t *const gm_mt_mutex_ = mt_info->gm_sync.mutex_;
1703   pthread_mutex_t *const tpl_error_mutex_ = mt_info->tpl_row_mt.mutex_;
1704   pthread_mutex_t *const pack_bs_mt_mutex_ = mt_info->pack_bs_sync.mutex_;
1705   if (enc_row_mt_mutex_ != NULL) {
1706     pthread_mutex_destroy(enc_row_mt_mutex_);
1707     aom_free(enc_row_mt_mutex_);
1708   }
1709   if (enc_row_mt_cond_ != NULL) {
1710     pthread_cond_destroy(enc_row_mt_cond_);
1711     aom_free(enc_row_mt_cond_);
1712   }
1713   if (gm_mt_mutex_ != NULL) {
1714     pthread_mutex_destroy(gm_mt_mutex_);
1715     aom_free(gm_mt_mutex_);
1716   }
1717   if (tpl_error_mutex_ != NULL) {
1718     pthread_mutex_destroy(tpl_error_mutex_);
1719     aom_free(tpl_error_mutex_);
1720   }
1721   if (pack_bs_mt_mutex_ != NULL) {
1722     pthread_mutex_destroy(pack_bs_mt_mutex_);
1723     aom_free(pack_bs_mt_mutex_);
1724   }
1725 #endif
1726   av1_row_mt_mem_dealloc(cpi);
1727 
1728   if (mt_info->num_workers > 1) {
1729     av1_row_mt_sync_mem_dealloc(&cpi->ppi->intra_row_mt_sync);
1730     av1_loop_filter_dealloc(&mt_info->lf_row_sync);
1731     av1_cdef_mt_dealloc(&mt_info->cdef_sync);
1732 #if !CONFIG_REALTIME_ONLY
1733     av1_loop_restoration_dealloc(&mt_info->lr_row_sync);
1734     av1_tf_mt_dealloc(&mt_info->tf_sync);
1735 #endif
1736   }
1737 
1738 #if CONFIG_THREE_PASS
1739   av1_free_thirdpass_ctx(cpi->third_pass_ctx);
1740 
1741   av1_close_second_pass_log(cpi);
1742 #endif
1743 
1744   dealloc_compressor_data(cpi);
1745 
1746   av1_ext_part_delete(&cpi->ext_part_controller);
1747 
1748   av1_remove_common(cm);
1749 
1750   aom_free(cpi);
1751 
1752 #ifdef OUTPUT_YUV_REC
1753   fclose(yuv_rec_file);
1754 #endif
1755 
1756 #ifdef OUTPUT_YUV_DENOISED
1757   fclose(yuv_denoised_file);
1758 #endif
1759 }
1760 
generate_psnr_packet(AV1_COMP * cpi)1761 static void generate_psnr_packet(AV1_COMP *cpi) {
1762   struct aom_codec_cx_pkt pkt;
1763   int i;
1764   PSNR_STATS psnr;
1765 #if CONFIG_AV1_HIGHBITDEPTH
1766   const uint32_t in_bit_depth = cpi->oxcf.input_cfg.input_bit_depth;
1767   const uint32_t bit_depth = cpi->td.mb.e_mbd.bd;
1768   aom_calc_highbd_psnr(cpi->source, &cpi->common.cur_frame->buf, &psnr,
1769                        bit_depth, in_bit_depth);
1770 #else
1771   aom_calc_psnr(cpi->source, &cpi->common.cur_frame->buf, &psnr);
1772 #endif
1773 
1774   for (i = 0; i < 4; ++i) {
1775     pkt.data.psnr.samples[i] = psnr.samples[i];
1776     pkt.data.psnr.sse[i] = psnr.sse[i];
1777     pkt.data.psnr.psnr[i] = psnr.psnr[i];
1778   }
1779 
1780 #if CONFIG_AV1_HIGHBITDEPTH
1781   if ((cpi->source->flags & YV12_FLAG_HIGHBITDEPTH) &&
1782       (in_bit_depth < bit_depth)) {
1783     for (i = 0; i < 4; ++i) {
1784       pkt.data.psnr.samples_hbd[i] = psnr.samples_hbd[i];
1785       pkt.data.psnr.sse_hbd[i] = psnr.sse_hbd[i];
1786       pkt.data.psnr.psnr_hbd[i] = psnr.psnr_hbd[i];
1787     }
1788   }
1789 #endif
1790 
1791   pkt.kind = AOM_CODEC_PSNR_PKT;
1792   aom_codec_pkt_list_add(cpi->ppi->output_pkt_list, &pkt);
1793 }
1794 
av1_use_as_reference(int * ext_ref_frame_flags,int ref_frame_flags)1795 int av1_use_as_reference(int *ext_ref_frame_flags, int ref_frame_flags) {
1796   if (ref_frame_flags > ((1 << INTER_REFS_PER_FRAME) - 1)) return -1;
1797 
1798   *ext_ref_frame_flags = ref_frame_flags;
1799   return 0;
1800 }
1801 
av1_copy_reference_enc(AV1_COMP * cpi,int idx,YV12_BUFFER_CONFIG * sd)1802 int av1_copy_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd) {
1803   AV1_COMMON *const cm = &cpi->common;
1804   const int num_planes = av1_num_planes(cm);
1805   YV12_BUFFER_CONFIG *cfg = get_ref_frame(cm, idx);
1806   if (cfg) {
1807     aom_yv12_copy_frame(cfg, sd, num_planes);
1808     return 0;
1809   } else {
1810     return -1;
1811   }
1812 }
1813 
av1_set_reference_enc(AV1_COMP * cpi,int idx,YV12_BUFFER_CONFIG * sd)1814 int av1_set_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd) {
1815   AV1_COMMON *const cm = &cpi->common;
1816   const int num_planes = av1_num_planes(cm);
1817   YV12_BUFFER_CONFIG *cfg = get_ref_frame(cm, idx);
1818   if (cfg) {
1819     aom_yv12_copy_frame(sd, cfg, num_planes);
1820     return 0;
1821   } else {
1822     return -1;
1823   }
1824 }
1825 
1826 #ifdef OUTPUT_YUV_REC
aom_write_one_yuv_frame(AV1_COMMON * cm,YV12_BUFFER_CONFIG * s)1827 void aom_write_one_yuv_frame(AV1_COMMON *cm, YV12_BUFFER_CONFIG *s) {
1828   uint8_t *src = s->y_buffer;
1829   int h = cm->height;
1830   if (yuv_rec_file == NULL) return;
1831   if (s->flags & YV12_FLAG_HIGHBITDEPTH) {
1832     uint16_t *src16 = CONVERT_TO_SHORTPTR(s->y_buffer);
1833 
1834     do {
1835       fwrite(src16, s->y_width, 2, yuv_rec_file);
1836       src16 += s->y_stride;
1837     } while (--h);
1838 
1839     src16 = CONVERT_TO_SHORTPTR(s->u_buffer);
1840     h = s->uv_height;
1841 
1842     do {
1843       fwrite(src16, s->uv_width, 2, yuv_rec_file);
1844       src16 += s->uv_stride;
1845     } while (--h);
1846 
1847     src16 = CONVERT_TO_SHORTPTR(s->v_buffer);
1848     h = s->uv_height;
1849 
1850     do {
1851       fwrite(src16, s->uv_width, 2, yuv_rec_file);
1852       src16 += s->uv_stride;
1853     } while (--h);
1854 
1855     fflush(yuv_rec_file);
1856     return;
1857   }
1858 
1859   do {
1860     fwrite(src, s->y_width, 1, yuv_rec_file);
1861     src += s->y_stride;
1862   } while (--h);
1863 
1864   src = s->u_buffer;
1865   h = s->uv_height;
1866 
1867   do {
1868     fwrite(src, s->uv_width, 1, yuv_rec_file);
1869     src += s->uv_stride;
1870   } while (--h);
1871 
1872   src = s->v_buffer;
1873   h = s->uv_height;
1874 
1875   do {
1876     fwrite(src, s->uv_width, 1, yuv_rec_file);
1877     src += s->uv_stride;
1878   } while (--h);
1879 
1880   fflush(yuv_rec_file);
1881 }
1882 #endif  // OUTPUT_YUV_REC
1883 
av1_set_mv_search_params(AV1_COMP * cpi)1884 void av1_set_mv_search_params(AV1_COMP *cpi) {
1885   const AV1_COMMON *const cm = &cpi->common;
1886   MotionVectorSearchParams *const mv_search_params = &cpi->mv_search_params;
1887   const int max_mv_def = AOMMAX(cm->width, cm->height);
1888 
1889   // Default based on max resolution.
1890   mv_search_params->mv_step_param = av1_init_search_range(max_mv_def);
1891 
1892   if (cpi->sf.mv_sf.auto_mv_step_size) {
1893     if (frame_is_intra_only(cm)) {
1894       // Initialize max_mv_magnitude for use in the first INTER frame
1895       // after a key/intra-only frame.
1896       mv_search_params->max_mv_magnitude = max_mv_def;
1897     } else {
1898       // Use adaptive mv steps based on previous frame stats for show frames and
1899       // internal arfs.
1900       FRAME_UPDATE_TYPE cur_update_type =
1901           cpi->ppi->gf_group.update_type[cpi->gf_frame_index];
1902       int use_auto_mv_step =
1903           (cm->show_frame || cur_update_type == INTNL_ARF_UPDATE) &&
1904           mv_search_params->max_mv_magnitude != -1 &&
1905           cpi->sf.mv_sf.auto_mv_step_size >= 2;
1906       if (use_auto_mv_step) {
1907         // Allow mv_steps to correspond to twice the max mv magnitude found
1908         // in the previous frame, capped by the default max_mv_magnitude based
1909         // on resolution.
1910         mv_search_params->mv_step_param = av1_init_search_range(
1911             AOMMIN(max_mv_def, 2 * mv_search_params->max_mv_magnitude));
1912       }
1913       // Reset max_mv_magnitude based on update flag.
1914       if (cpi->do_frame_data_update) mv_search_params->max_mv_magnitude = -1;
1915     }
1916   }
1917 }
1918 
av1_set_screen_content_options(AV1_COMP * cpi,FeatureFlags * features)1919 void av1_set_screen_content_options(AV1_COMP *cpi, FeatureFlags *features) {
1920   const AV1_COMMON *const cm = &cpi->common;
1921   const MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
1922 
1923   if (cm->seq_params->force_screen_content_tools != 2) {
1924     features->allow_screen_content_tools = features->allow_intrabc =
1925         cm->seq_params->force_screen_content_tools;
1926     return;
1927   }
1928 
1929   if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_SCREEN) {
1930     features->allow_screen_content_tools = 1;
1931     features->allow_intrabc = cpi->oxcf.mode == REALTIME ? 0 : 1;
1932     cpi->is_screen_content_type = 1;
1933     cpi->use_screen_content_tools = 1;
1934     return;
1935   }
1936 
1937   if (cpi->oxcf.mode == REALTIME) {
1938     features->allow_screen_content_tools = features->allow_intrabc = 0;
1939     return;
1940   }
1941 
1942   // Screen content tools are not evaluated in non-RD encoding mode unless
1943   // content type is not set explicitly, i.e., when
1944   // cpi->oxcf.tune_cfg.content != AOM_CONTENT_SCREEN, use_nonrd_pick_mode = 1
1945   // and hybrid_intra_pickmode = 0. Hence, screen content detection is
1946   // disabled.
1947   if (cpi->sf.rt_sf.use_nonrd_pick_mode &&
1948       !cpi->sf.rt_sf.hybrid_intra_pickmode) {
1949     features->allow_screen_content_tools = features->allow_intrabc = 0;
1950     return;
1951   }
1952 
1953   // Estimate if the source frame is screen content, based on the portion of
1954   // blocks that have few luma colors.
1955   const uint8_t *src = cpi->unfiltered_source->y_buffer;
1956   assert(src != NULL);
1957   const int use_hbd = cpi->unfiltered_source->flags & YV12_FLAG_HIGHBITDEPTH;
1958   const int stride = cpi->unfiltered_source->y_stride;
1959   const int width = cpi->unfiltered_source->y_width;
1960   const int height = cpi->unfiltered_source->y_height;
1961   const int64_t area = (int64_t)width * height;
1962   const int bd = cm->seq_params->bit_depth;
1963   const int blk_w = 16;
1964   const int blk_h = 16;
1965   // These threshold values are selected experimentally.
1966   const int color_thresh = 4;
1967   const unsigned int var_thresh = 0;
1968   // Counts of blocks with no more than color_thresh colors.
1969   int64_t counts_1 = 0;
1970   // Counts of blocks with no more than color_thresh colors and variance larger
1971   // than var_thresh.
1972   int64_t counts_2 = 0;
1973 
1974   for (int r = 0; r + blk_h <= height; r += blk_h) {
1975     for (int c = 0; c + blk_w <= width; c += blk_w) {
1976       int count_buf[1 << 8];  // Maximum (1 << 8) bins for hbd path.
1977       const uint8_t *const this_src = src + r * stride + c;
1978       int n_colors;
1979       if (use_hbd)
1980         av1_count_colors_highbd(this_src, stride, blk_w, blk_h, bd, NULL,
1981                                 count_buf, &n_colors, NULL);
1982       else
1983         av1_count_colors(this_src, stride, blk_w, blk_h, count_buf, &n_colors);
1984       if (n_colors > 1 && n_colors <= color_thresh) {
1985         ++counts_1;
1986         struct buf_2d buf;
1987         buf.stride = stride;
1988         buf.buf = (uint8_t *)this_src;
1989         const unsigned int var = av1_get_perpixel_variance(
1990             cpi, xd, &buf, BLOCK_16X16, AOM_PLANE_Y, use_hbd);
1991         if (var > var_thresh) ++counts_2;
1992       }
1993     }
1994   }
1995 
1996   // The threshold values are selected experimentally.
1997   features->allow_screen_content_tools = counts_1 * blk_h * blk_w * 10 > area;
1998   // IntraBC would force loop filters off, so we use more strict rules that also
1999   // requires that the block has high variance.
2000   features->allow_intrabc = features->allow_screen_content_tools &&
2001                             counts_2 * blk_h * blk_w * 12 > area;
2002   cpi->use_screen_content_tools = features->allow_screen_content_tools;
2003   cpi->is_screen_content_type =
2004       features->allow_intrabc || (counts_1 * blk_h * blk_w * 10 > area * 4 &&
2005                                   counts_2 * blk_h * blk_w * 30 > area);
2006 }
2007 
init_motion_estimation(AV1_COMP * cpi)2008 static void init_motion_estimation(AV1_COMP *cpi) {
2009   AV1_COMMON *const cm = &cpi->common;
2010   MotionVectorSearchParams *const mv_search_params = &cpi->mv_search_params;
2011   const int aligned_width = (cm->width + 7) & ~7;
2012   const int y_stride =
2013       aom_calc_y_stride(aligned_width, cpi->oxcf.border_in_pixels);
2014   const int y_stride_src = ((cpi->oxcf.frm_dim_cfg.width != cm->width ||
2015                              cpi->oxcf.frm_dim_cfg.height != cm->height) ||
2016                             av1_superres_scaled(cm))
2017                                ? y_stride
2018                                : cpi->ppi->lookahead->buf->img.y_stride;
2019   int fpf_y_stride =
2020       cm->cur_frame != NULL ? cm->cur_frame->buf.y_stride : y_stride;
2021 
2022   // Update if search_site_cfg is uninitialized or the current frame has a new
2023   // stride
2024   const int should_update =
2025       !mv_search_params->search_site_cfg[SS_CFG_SRC][DIAMOND].stride ||
2026       !mv_search_params->search_site_cfg[SS_CFG_LOOKAHEAD][DIAMOND].stride ||
2027       (y_stride !=
2028        mv_search_params->search_site_cfg[SS_CFG_SRC][DIAMOND].stride);
2029 
2030   if (!should_update) {
2031     return;
2032   }
2033 
2034   // Initialization of search_site_cfg for NUM_DISTINCT_SEARCH_METHODS.
2035   for (SEARCH_METHODS i = DIAMOND; i < NUM_DISTINCT_SEARCH_METHODS; i++) {
2036     const int level = ((i == NSTEP_8PT) || (i == CLAMPED_DIAMOND)) ? 1 : 0;
2037     av1_init_motion_compensation[i](
2038         &mv_search_params->search_site_cfg[SS_CFG_SRC][i], y_stride, level);
2039     av1_init_motion_compensation[i](
2040         &mv_search_params->search_site_cfg[SS_CFG_LOOKAHEAD][i], y_stride_src,
2041         level);
2042   }
2043 
2044   // First pass search site config initialization.
2045   av1_init_motion_fpf(&mv_search_params->search_site_cfg[SS_CFG_FPF][DIAMOND],
2046                       fpf_y_stride);
2047   for (SEARCH_METHODS i = NSTEP; i < NUM_DISTINCT_SEARCH_METHODS; i++) {
2048     memcpy(&mv_search_params->search_site_cfg[SS_CFG_FPF][i],
2049            &mv_search_params->search_site_cfg[SS_CFG_FPF][DIAMOND],
2050            sizeof(search_site_config));
2051   }
2052 }
2053 
init_ref_frame_bufs(AV1_COMP * cpi)2054 static void init_ref_frame_bufs(AV1_COMP *cpi) {
2055   AV1_COMMON *const cm = &cpi->common;
2056   int i;
2057   if (cm->cur_frame) {
2058     cm->cur_frame->ref_count--;
2059     cm->cur_frame = NULL;
2060   }
2061   for (i = 0; i < REF_FRAMES; ++i) {
2062     if (cm->ref_frame_map[i]) {
2063       cm->ref_frame_map[i]->ref_count--;
2064       cm->ref_frame_map[i] = NULL;
2065     }
2066   }
2067 #ifndef NDEBUG
2068   BufferPool *const pool = cm->buffer_pool;
2069   for (i = 0; i < pool->num_frame_bufs; ++i) {
2070     assert(pool->frame_bufs[i].ref_count == 0);
2071   }
2072 #endif
2073 }
2074 
2075 // TODO(chengchen): consider renaming this function as it is necessary
2076 // for the encoder to setup critical parameters, and it does not
2077 // deal with initial width any longer.
av1_check_initial_width(AV1_COMP * cpi,int use_highbitdepth,int subsampling_x,int subsampling_y)2078 aom_codec_err_t av1_check_initial_width(AV1_COMP *cpi, int use_highbitdepth,
2079                                         int subsampling_x, int subsampling_y) {
2080   AV1_COMMON *const cm = &cpi->common;
2081   SequenceHeader *const seq_params = cm->seq_params;
2082 
2083   if (!cpi->frame_size_related_setup_done ||
2084       seq_params->use_highbitdepth != use_highbitdepth ||
2085       seq_params->subsampling_x != subsampling_x ||
2086       seq_params->subsampling_y != subsampling_y) {
2087     seq_params->subsampling_x = subsampling_x;
2088     seq_params->subsampling_y = subsampling_y;
2089     seq_params->use_highbitdepth = use_highbitdepth;
2090 
2091     av1_set_speed_features_framesize_independent(cpi, cpi->oxcf.speed);
2092     av1_set_speed_features_framesize_dependent(cpi, cpi->oxcf.speed);
2093 
2094     if (!is_stat_generation_stage(cpi)) {
2095 #if !CONFIG_REALTIME_ONLY
2096       if (!av1_tf_info_alloc(&cpi->ppi->tf_info, cpi))
2097         return AOM_CODEC_MEM_ERROR;
2098 #endif  // !CONFIG_REALTIME_ONLY
2099     }
2100     init_ref_frame_bufs(cpi);
2101 
2102     init_motion_estimation(cpi);  // TODO(agrange) This can be removed.
2103 
2104     cpi->initial_mbs = cm->mi_params.MBs;
2105     cpi->frame_size_related_setup_done = true;
2106   }
2107   return AOM_CODEC_OK;
2108 }
2109 
2110 #if CONFIG_AV1_TEMPORAL_DENOISING
setup_denoiser_buffer(AV1_COMP * cpi)2111 static void setup_denoiser_buffer(AV1_COMP *cpi) {
2112   AV1_COMMON *const cm = &cpi->common;
2113   if (cpi->oxcf.noise_sensitivity > 0 &&
2114       !cpi->denoiser.frame_buffer_initialized) {
2115     if (av1_denoiser_alloc(
2116             cm, &cpi->svc, &cpi->denoiser, cpi->ppi->use_svc,
2117             cpi->oxcf.noise_sensitivity, cm->width, cm->height,
2118             cm->seq_params->subsampling_x, cm->seq_params->subsampling_y,
2119             cm->seq_params->use_highbitdepth, AOM_BORDER_IN_PIXELS))
2120       aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR,
2121                          "Failed to allocate denoiser");
2122   }
2123 }
2124 #endif
2125 
2126 // Returns 1 if the assigned width or height was <= 0.
set_size_literal(AV1_COMP * cpi,int width,int height)2127 static int set_size_literal(AV1_COMP *cpi, int width, int height) {
2128   AV1_COMMON *cm = &cpi->common;
2129   aom_codec_err_t err = av1_check_initial_width(
2130       cpi, cm->seq_params->use_highbitdepth, cm->seq_params->subsampling_x,
2131       cm->seq_params->subsampling_y);
2132   if (err != AOM_CODEC_OK) {
2133     aom_internal_error(cm->error, err, "av1_check_initial_width() failed");
2134   }
2135 
2136   if (width <= 0 || height <= 0) return 1;
2137 
2138   cm->width = width;
2139   cm->height = height;
2140 
2141 #if CONFIG_AV1_TEMPORAL_DENOISING
2142   setup_denoiser_buffer(cpi);
2143 #endif
2144 
2145   if (cm->width > cpi->data_alloc_width ||
2146       cm->height > cpi->data_alloc_height) {
2147     av1_free_context_buffers(cm);
2148     av1_free_shared_coeff_buffer(&cpi->td.shared_coeff_buf);
2149     av1_free_sms_tree(&cpi->td);
2150     av1_free_pmc(cpi->td.firstpass_ctx, av1_num_planes(cm));
2151     cpi->td.firstpass_ctx = NULL;
2152     alloc_compressor_data(cpi);
2153     realloc_segmentation_maps(cpi);
2154     cpi->data_alloc_width = cm->width;
2155     cpi->data_alloc_height = cm->height;
2156     cpi->frame_size_related_setup_done = false;
2157   }
2158   alloc_mb_mode_info_buffers(cpi);
2159   av1_update_frame_size(cpi);
2160 
2161   return 0;
2162 }
2163 
av1_set_frame_size(AV1_COMP * cpi,int width,int height)2164 void av1_set_frame_size(AV1_COMP *cpi, int width, int height) {
2165   AV1_COMMON *const cm = &cpi->common;
2166   const SequenceHeader *const seq_params = cm->seq_params;
2167   const int num_planes = av1_num_planes(cm);
2168   MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
2169   int ref_frame;
2170 
2171   if (width != cm->width || height != cm->height) {
2172     // There has been a change in the encoded frame size
2173     set_size_literal(cpi, width, height);
2174     // Recalculate 'all_lossless' in case super-resolution was (un)selected.
2175     cm->features.all_lossless =
2176         cm->features.coded_lossless && !av1_superres_scaled(cm);
2177 
2178     av1_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
2179 #if CONFIG_AV1_TEMPORAL_DENOISING
2180     // Reset the denoiser on the resized frame.
2181     if (cpi->oxcf.noise_sensitivity > 0) {
2182       av1_denoiser_free(&(cpi->denoiser));
2183       setup_denoiser_buffer(cpi);
2184     }
2185 #endif
2186   }
2187   if (is_stat_consumption_stage(cpi)) {
2188     av1_set_target_rate(cpi, cm->width, cm->height);
2189   }
2190 
2191   alloc_frame_mvs(cm, cm->cur_frame);
2192 
2193   // Allocate above context buffers
2194   CommonContexts *const above_contexts = &cm->above_contexts;
2195   if (above_contexts->num_planes < av1_num_planes(cm) ||
2196       above_contexts->num_mi_cols < cm->mi_params.mi_cols ||
2197       above_contexts->num_tile_rows < cm->tiles.rows) {
2198     av1_free_above_context_buffers(above_contexts);
2199     if (av1_alloc_above_context_buffers(above_contexts, cm->tiles.rows,
2200                                         cm->mi_params.mi_cols,
2201                                         av1_num_planes(cm)))
2202       aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR,
2203                          "Failed to allocate context buffers");
2204   }
2205 
2206   AV1EncoderConfig *oxcf = &cpi->oxcf;
2207   oxcf->border_in_pixels = av1_get_enc_border_size(
2208       av1_is_resize_needed(oxcf), oxcf->kf_cfg.key_freq_max == 0,
2209       cm->seq_params->sb_size);
2210 
2211   // Reset the frame pointers to the current frame size.
2212   if (aom_realloc_frame_buffer(
2213           &cm->cur_frame->buf, cm->width, cm->height, seq_params->subsampling_x,
2214           seq_params->subsampling_y, seq_params->use_highbitdepth,
2215           cpi->oxcf.border_in_pixels, cm->features.byte_alignment, NULL, NULL,
2216           NULL, cpi->alloc_pyramid, 0))
2217     aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR,
2218                        "Failed to allocate frame buffer");
2219 
2220   if (!is_stat_generation_stage(cpi)) av1_init_cdef_worker(cpi);
2221 
2222 #if !CONFIG_REALTIME_ONLY
2223   if (is_restoration_used(cm)) {
2224     for (int i = 0; i < num_planes; ++i)
2225       cm->rst_info[i].frame_restoration_type = RESTORE_NONE;
2226 
2227     const bool is_sgr_enabled = !cpi->sf.lpf_sf.disable_sgr_filter;
2228     av1_alloc_restoration_buffers(cm, is_sgr_enabled);
2229     // Store the allocated restoration buffers in MT object.
2230     if (cpi->ppi->p_mt_info.num_workers > 1) {
2231       av1_init_lr_mt_buffers(cpi);
2232     }
2233   }
2234 #endif
2235 
2236   init_motion_estimation(cpi);
2237 
2238   int has_valid_ref_frame = 0;
2239   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
2240     RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
2241     if (buf != NULL) {
2242       struct scale_factors *sf = get_ref_scale_factors(cm, ref_frame);
2243       av1_setup_scale_factors_for_frame(sf, buf->buf.y_crop_width,
2244                                         buf->buf.y_crop_height, cm->width,
2245                                         cm->height);
2246       has_valid_ref_frame |= av1_is_valid_scale(sf);
2247       if (av1_is_scaled(sf)) aom_extend_frame_borders(&buf->buf, num_planes);
2248     }
2249   }
2250   if (!frame_is_intra_only(cm) && !has_valid_ref_frame) {
2251     aom_internal_error(
2252         cm->error, AOM_CODEC_CORRUPT_FRAME,
2253         "Can't find at least one reference frame with valid size");
2254   }
2255 
2256   av1_setup_scale_factors_for_frame(&cm->sf_identity, cm->width, cm->height,
2257                                     cm->width, cm->height);
2258 
2259   set_ref_ptrs(cm, xd, LAST_FRAME, LAST_FRAME);
2260 }
2261 
extend_borders_mt(const AV1_COMP * cpi,MULTI_THREADED_MODULES stage,int plane)2262 static inline int extend_borders_mt(const AV1_COMP *cpi,
2263                                     MULTI_THREADED_MODULES stage, int plane) {
2264   const AV1_COMMON *const cm = &cpi->common;
2265   if (cpi->mt_info.num_mod_workers[stage] < 2) return 0;
2266   switch (stage) {
2267     // TODO(deepa.kg@ittiam.com): When cdef and loop-restoration are disabled,
2268     // multi-thread frame border extension along with loop filter frame.
2269     // As loop-filtering of a superblock row modifies the pixels of the
2270     // above superblock row, border extension requires that loop filtering
2271     // of the current and above superblock row is complete.
2272     case MOD_LPF: return 0;
2273     case MOD_CDEF:
2274       return is_cdef_used(cm) && !cpi->ppi->rtc_ref.non_reference_frame &&
2275              !is_restoration_used(cm) && !av1_superres_scaled(cm);
2276     case MOD_LR:
2277       return is_restoration_used(cm) &&
2278              (cm->rst_info[plane].frame_restoration_type != RESTORE_NONE);
2279     default: assert(0);
2280   }
2281   return 0;
2282 }
2283 
2284 /*!\brief Select and apply cdef filters and switchable restoration filters
2285  *
2286  * \ingroup high_level_algo
2287  */
cdef_restoration_frame(AV1_COMP * cpi,AV1_COMMON * cm,MACROBLOCKD * xd,int use_restoration,int use_cdef,unsigned int skip_apply_postproc_filters)2288 static void cdef_restoration_frame(AV1_COMP *cpi, AV1_COMMON *cm,
2289                                    MACROBLOCKD *xd, int use_restoration,
2290                                    int use_cdef,
2291                                    unsigned int skip_apply_postproc_filters) {
2292 #if !CONFIG_REALTIME_ONLY
2293   if (use_restoration)
2294     av1_loop_restoration_save_boundary_lines(&cm->cur_frame->buf, cm, 0);
2295 #else
2296   (void)use_restoration;
2297 #endif
2298 
2299   if (use_cdef) {
2300 #if CONFIG_COLLECT_COMPONENT_TIMING
2301     start_timing(cpi, cdef_time);
2302 #endif
2303     const int num_workers = cpi->mt_info.num_mod_workers[MOD_CDEF];
2304     // Find CDEF parameters
2305     av1_cdef_search(cpi);
2306 
2307     // Apply the filter
2308     if ((skip_apply_postproc_filters & SKIP_APPLY_CDEF) == 0) {
2309       assert(!cpi->ppi->rtc_ref.non_reference_frame);
2310       if (num_workers > 1) {
2311         // Extension of frame borders is multi-threaded along with cdef.
2312         const int do_extend_border =
2313             extend_borders_mt(cpi, MOD_CDEF, /* plane */ 0);
2314         av1_cdef_frame_mt(cm, xd, cpi->mt_info.cdef_worker,
2315                           cpi->mt_info.workers, &cpi->mt_info.cdef_sync,
2316                           num_workers, av1_cdef_init_fb_row_mt,
2317                           do_extend_border);
2318       } else {
2319         av1_cdef_frame(&cm->cur_frame->buf, cm, xd, av1_cdef_init_fb_row);
2320       }
2321     }
2322 #if CONFIG_COLLECT_COMPONENT_TIMING
2323     end_timing(cpi, cdef_time);
2324 #endif
2325   }
2326 
2327   const int use_superres = av1_superres_scaled(cm);
2328   if (use_superres) {
2329     if ((skip_apply_postproc_filters & SKIP_APPLY_SUPERRES) == 0) {
2330       av1_superres_post_encode(cpi);
2331     }
2332   }
2333 
2334 #if !CONFIG_REALTIME_ONLY
2335 #if CONFIG_COLLECT_COMPONENT_TIMING
2336   start_timing(cpi, loop_restoration_time);
2337 #endif
2338   if (use_restoration) {
2339     MultiThreadInfo *const mt_info = &cpi->mt_info;
2340     const int num_workers = mt_info->num_mod_workers[MOD_LR];
2341     av1_loop_restoration_save_boundary_lines(&cm->cur_frame->buf, cm, 1);
2342     av1_pick_filter_restoration(cpi->source, cpi);
2343     if ((skip_apply_postproc_filters & SKIP_APPLY_RESTORATION) == 0 &&
2344         (cm->rst_info[0].frame_restoration_type != RESTORE_NONE ||
2345          cm->rst_info[1].frame_restoration_type != RESTORE_NONE ||
2346          cm->rst_info[2].frame_restoration_type != RESTORE_NONE)) {
2347       if (num_workers > 1) {
2348         // Extension of frame borders is multi-threaded along with loop
2349         // restoration filter.
2350         const int do_extend_border = 1;
2351         av1_loop_restoration_filter_frame_mt(
2352             &cm->cur_frame->buf, cm, 0, mt_info->workers, num_workers,
2353             &mt_info->lr_row_sync, &cpi->lr_ctxt, do_extend_border);
2354       } else {
2355         av1_loop_restoration_filter_frame(&cm->cur_frame->buf, cm, 0,
2356                                           &cpi->lr_ctxt);
2357       }
2358     }
2359   }
2360 #if CONFIG_COLLECT_COMPONENT_TIMING
2361   end_timing(cpi, loop_restoration_time);
2362 #endif
2363 #endif  // !CONFIG_REALTIME_ONLY
2364 }
2365 
extend_frame_borders(AV1_COMP * cpi)2366 static void extend_frame_borders(AV1_COMP *cpi) {
2367   const AV1_COMMON *const cm = &cpi->common;
2368   // TODO(debargha): Fix mv search range on encoder side
2369   for (int plane = 0; plane < av1_num_planes(cm); ++plane) {
2370     const bool extend_border_done = extend_borders_mt(cpi, MOD_CDEF, plane) ||
2371                                     extend_borders_mt(cpi, MOD_LR, plane);
2372     if (!extend_border_done) {
2373       const YV12_BUFFER_CONFIG *const ybf = &cm->cur_frame->buf;
2374       aom_extend_frame_borders_plane_row(ybf, plane, 0,
2375                                          ybf->crop_heights[plane > 0]);
2376     }
2377   }
2378 }
2379 
2380 /*!\brief Select and apply deblocking filters, cdef filters, and restoration
2381  * filters.
2382  *
2383  * \ingroup high_level_algo
2384  */
loopfilter_frame(AV1_COMP * cpi,AV1_COMMON * cm)2385 static void loopfilter_frame(AV1_COMP *cpi, AV1_COMMON *cm) {
2386   MultiThreadInfo *const mt_info = &cpi->mt_info;
2387   const int num_workers = mt_info->num_mod_workers[MOD_LPF];
2388   const int num_planes = av1_num_planes(cm);
2389   MACROBLOCKD *xd = &cpi->td.mb.e_mbd;
2390   cpi->td.mb.rdmult = cpi->rd.RDMULT;
2391 
2392   assert(IMPLIES(is_lossless_requested(&cpi->oxcf.rc_cfg),
2393                  cm->features.coded_lossless && cm->features.all_lossless));
2394 
2395   const int use_loopfilter =
2396       is_loopfilter_used(cm) && !cpi->mt_info.pipeline_lpf_mt_with_enc;
2397   const int use_cdef = is_cdef_used(cm);
2398   const int use_superres = av1_superres_scaled(cm);
2399   const int use_restoration = is_restoration_used(cm);
2400 
2401   const unsigned int skip_apply_postproc_filters =
2402       derive_skip_apply_postproc_filters(cpi, use_loopfilter, use_cdef,
2403                                          use_superres, use_restoration);
2404 
2405 #if CONFIG_COLLECT_COMPONENT_TIMING
2406   start_timing(cpi, loop_filter_time);
2407 #endif
2408   if (use_loopfilter) {
2409     av1_pick_filter_level(cpi->source, cpi, cpi->sf.lpf_sf.lpf_pick);
2410     struct loopfilter *lf = &cm->lf;
2411     if ((lf->filter_level[0] || lf->filter_level[1]) &&
2412         (skip_apply_postproc_filters & SKIP_APPLY_LOOPFILTER) == 0) {
2413       assert(!cpi->ppi->rtc_ref.non_reference_frame);
2414       // lpf_opt_level = 1 : Enables dual/quad loop-filtering.
2415       // lpf_opt_level is set to 1 if transform size search depth in inter
2416       // blocks is limited to one as quad loop filtering assumes that all the
2417       // transform blocks within a 16x8/8x16/16x16 prediction block are of the
2418       // same size. lpf_opt_level = 2 : Filters both chroma planes together, in
2419       // addition to enabling dual/quad loop-filtering. This is enabled when lpf
2420       // pick method is LPF_PICK_FROM_Q as u and v plane filter levels are
2421       // equal.
2422       int lpf_opt_level = get_lpf_opt_level(&cpi->sf);
2423       av1_loop_filter_frame_mt(&cm->cur_frame->buf, cm, xd, 0, num_planes, 0,
2424                                mt_info->workers, num_workers,
2425                                &mt_info->lf_row_sync, lpf_opt_level);
2426     }
2427   }
2428 
2429 #if CONFIG_COLLECT_COMPONENT_TIMING
2430   end_timing(cpi, loop_filter_time);
2431 #endif
2432 
2433   cdef_restoration_frame(cpi, cm, xd, use_restoration, use_cdef,
2434                          skip_apply_postproc_filters);
2435 }
2436 
update_motion_stat(AV1_COMP * const cpi)2437 static void update_motion_stat(AV1_COMP *const cpi) {
2438   AV1_COMMON *const cm = &cpi->common;
2439   const CommonModeInfoParams *const mi_params = &cm->mi_params;
2440   RATE_CONTROL *const rc = &cpi->rc;
2441   SVC *const svc = &cpi->svc;
2442   const int avg_cnt_zeromv =
2443       100 * cpi->rc.cnt_zeromv / (mi_params->mi_rows * mi_params->mi_cols);
2444   if (!cpi->ppi->use_svc ||
2445       (cpi->ppi->use_svc &&
2446        !cpi->svc.layer_context[cpi->svc.temporal_layer_id].is_key_frame &&
2447        cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)) {
2448     rc->avg_frame_low_motion =
2449         (rc->avg_frame_low_motion == 0)
2450             ? avg_cnt_zeromv
2451             : (3 * rc->avg_frame_low_motion + avg_cnt_zeromv) / 4;
2452     // For SVC: set avg_frame_low_motion (only computed on top spatial layer)
2453     // to all lower spatial layers.
2454     if (cpi->ppi->use_svc &&
2455         svc->spatial_layer_id == svc->number_spatial_layers - 1) {
2456       for (int i = 0; i < svc->number_spatial_layers - 1; ++i) {
2457         const int layer = LAYER_IDS_TO_IDX(i, svc->temporal_layer_id,
2458                                            svc->number_temporal_layers);
2459         LAYER_CONTEXT *const lc = &svc->layer_context[layer];
2460         RATE_CONTROL *const lrc = &lc->rc;
2461         lrc->avg_frame_low_motion = rc->avg_frame_low_motion;
2462       }
2463     }
2464   }
2465 }
2466 
2467 /*!\brief Encode a frame without the recode loop, usually used in one-pass
2468  * encoding and realtime coding.
2469  *
2470  * \ingroup high_level_algo
2471  *
2472  * \param[in]    cpi             Top-level encoder structure
2473  *
2474  * \return Returns a value to indicate if the encoding is done successfully.
2475  * \retval #AOM_CODEC_OK
2476  * \retval #AOM_CODEC_ERROR
2477  */
encode_without_recode(AV1_COMP * cpi)2478 static int encode_without_recode(AV1_COMP *cpi) {
2479   AV1_COMMON *const cm = &cpi->common;
2480   const QuantizationCfg *const q_cfg = &cpi->oxcf.q_cfg;
2481   SVC *const svc = &cpi->svc;
2482   const int resize_pending = is_frame_resize_pending(cpi);
2483   int top_index = 0, bottom_index = 0, q = 0;
2484   YV12_BUFFER_CONFIG *unscaled = cpi->unscaled_source;
2485   InterpFilter filter_scaler =
2486       cpi->ppi->use_svc ? svc->downsample_filter_type[svc->spatial_layer_id]
2487                         : EIGHTTAP_SMOOTH;
2488   int phase_scaler = cpi->ppi->use_svc
2489                          ? svc->downsample_filter_phase[svc->spatial_layer_id]
2490                          : 0;
2491 
2492   if (cpi->rc.postencode_drop && allow_postencode_drop_rtc(cpi))
2493     av1_save_all_coding_context(cpi);
2494 
2495   set_size_independent_vars(cpi);
2496   av1_setup_frame_size(cpi);
2497   cm->prev_frame = get_primary_ref_frame_buf(cm);
2498   av1_set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
2499   av1_set_mv_search_params(cpi);
2500 
2501   if (cm->current_frame.frame_number == 0 &&
2502       (cpi->ppi->use_svc || cpi->oxcf.rc_cfg.drop_frames_water_mark > 0) &&
2503       cpi->svc.temporal_layer_id == 0) {
2504     const SequenceHeader *seq_params = cm->seq_params;
2505     if (aom_alloc_frame_buffer(
2506             &cpi->svc.source_last_TL0, cpi->oxcf.frm_dim_cfg.width,
2507             cpi->oxcf.frm_dim_cfg.height, seq_params->subsampling_x,
2508             seq_params->subsampling_y, seq_params->use_highbitdepth,
2509             cpi->oxcf.border_in_pixels, cm->features.byte_alignment, false,
2510             0)) {
2511       aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR,
2512                          "Failed to allocate buffer for source_last_TL0");
2513     }
2514   }
2515 
2516   if (!cpi->ppi->use_svc) {
2517     phase_scaler = 8;
2518     // 2:1 scaling.
2519     if ((cm->width << 1) == unscaled->y_crop_width &&
2520         (cm->height << 1) == unscaled->y_crop_height) {
2521       filter_scaler = BILINEAR;
2522       // For lower resolutions use eighttap_smooth.
2523       if (cm->width * cm->height <= 320 * 180) filter_scaler = EIGHTTAP_SMOOTH;
2524     } else if ((cm->width << 2) == unscaled->y_crop_width &&
2525                (cm->height << 2) == unscaled->y_crop_height) {
2526       // 4:1 scaling.
2527       filter_scaler = EIGHTTAP_SMOOTH;
2528     } else if ((cm->width << 2) == 3 * unscaled->y_crop_width &&
2529                (cm->height << 2) == 3 * unscaled->y_crop_height) {
2530       // 4:3 scaling.
2531       filter_scaler = EIGHTTAP_REGULAR;
2532     }
2533   }
2534 
2535   allocate_gradient_info_for_hog(cpi);
2536 
2537   allocate_src_var_of_4x4_sub_block_buf(cpi);
2538 
2539   const SPEED_FEATURES *sf = &cpi->sf;
2540   if (sf->part_sf.partition_search_type == VAR_BASED_PARTITION)
2541     variance_partition_alloc(cpi);
2542 
2543   if (cm->current_frame.frame_type == KEY_FRAME ||
2544       ((sf->inter_sf.extra_prune_warped && cpi->refresh_frame.golden_frame)))
2545     copy_frame_prob_info(cpi);
2546 
2547 #if CONFIG_COLLECT_COMPONENT_TIMING
2548   printf("\n Encoding a frame: \n");
2549 #endif
2550 
2551 #if CONFIG_TUNE_BUTTERAUGLI
2552   if (cpi->oxcf.tune_cfg.tuning == AOM_TUNE_BUTTERAUGLI) {
2553     av1_setup_butteraugli_rdmult(cpi);
2554   }
2555 #endif
2556 
2557   cpi->source = av1_realloc_and_scale_if_required(
2558       cm, unscaled, &cpi->scaled_source, filter_scaler, phase_scaler, true,
2559       false, cpi->oxcf.border_in_pixels, cpi->alloc_pyramid);
2560   if (frame_is_intra_only(cm) || resize_pending != 0) {
2561     const int current_size =
2562         (cm->mi_params.mi_rows * cm->mi_params.mi_cols) >> 2;
2563     if (cpi->consec_zero_mv &&
2564         (cpi->consec_zero_mv_alloc_size < current_size)) {
2565       aom_free(cpi->consec_zero_mv);
2566       cpi->consec_zero_mv_alloc_size = 0;
2567       CHECK_MEM_ERROR(cm, cpi->consec_zero_mv,
2568                       aom_malloc(current_size * sizeof(*cpi->consec_zero_mv)));
2569       cpi->consec_zero_mv_alloc_size = current_size;
2570     }
2571     assert(cpi->consec_zero_mv != NULL);
2572     memset(cpi->consec_zero_mv, 0, current_size * sizeof(*cpi->consec_zero_mv));
2573   }
2574 
2575   if (cpi->scaled_last_source_available) {
2576     cpi->last_source = &cpi->scaled_last_source;
2577     cpi->scaled_last_source_available = 0;
2578   } else if (cpi->unscaled_last_source != NULL) {
2579     cpi->last_source = av1_realloc_and_scale_if_required(
2580         cm, cpi->unscaled_last_source, &cpi->scaled_last_source, filter_scaler,
2581         phase_scaler, true, false, cpi->oxcf.border_in_pixels,
2582         cpi->alloc_pyramid);
2583   }
2584 
2585   if (cpi->sf.rt_sf.use_temporal_noise_estimate) {
2586     av1_update_noise_estimate(cpi);
2587   }
2588 
2589 #if CONFIG_AV1_TEMPORAL_DENOISING
2590   if (cpi->oxcf.noise_sensitivity > 0 && cpi->ppi->use_svc)
2591     av1_denoiser_reset_on_first_frame(cpi);
2592 #endif
2593 
2594   // For 1 spatial layer encoding: if the (non-LAST) reference has different
2595   // resolution from the source then disable that reference. This is to avoid
2596   // significant increase in encode time from scaling the references in
2597   // av1_scale_references. Note GOLDEN is forced to update on the (first/tigger)
2598   // resized frame and ALTREF will be refreshed ~4 frames later, so both
2599   // references become available again after few frames.
2600   // For superres: don't disable golden reference.
2601   if (svc->number_spatial_layers == 1) {
2602     if (!cpi->oxcf.superres_cfg.enable_superres) {
2603       if (cpi->ref_frame_flags & av1_ref_frame_flag_list[GOLDEN_FRAME]) {
2604         const YV12_BUFFER_CONFIG *const ref =
2605             get_ref_frame_yv12_buf(cm, GOLDEN_FRAME);
2606         if (ref == NULL || ref->y_crop_width != cm->width ||
2607             ref->y_crop_height != cm->height) {
2608           cpi->ref_frame_flags ^= AOM_GOLD_FLAG;
2609         }
2610       }
2611     }
2612     if (cpi->ref_frame_flags & av1_ref_frame_flag_list[ALTREF_FRAME]) {
2613       const YV12_BUFFER_CONFIG *const ref =
2614           get_ref_frame_yv12_buf(cm, ALTREF_FRAME);
2615       if (ref == NULL || ref->y_crop_width != cm->width ||
2616           ref->y_crop_height != cm->height) {
2617         cpi->ref_frame_flags ^= AOM_ALT_FLAG;
2618       }
2619     }
2620   }
2621 
2622   int scale_references = 0;
2623 #if CONFIG_FPMT_TEST
2624   scale_references =
2625       cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE ? 1 : 0;
2626 #endif  // CONFIG_FPMT_TEST
2627   if (scale_references ||
2628       cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] == 0) {
2629     if (!frame_is_intra_only(cm)) {
2630       av1_scale_references(cpi, filter_scaler, phase_scaler, 1);
2631     }
2632   }
2633 
2634   av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel, q,
2635                     q_cfg->enable_chroma_deltaq, q_cfg->enable_hdr_deltaq,
2636                     cpi->oxcf.mode == ALLINTRA, cpi->oxcf.tune_cfg.tuning);
2637   av1_set_speed_features_qindex_dependent(cpi, cpi->oxcf.speed);
2638   av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
2639                      cm->seq_params->bit_depth);
2640   av1_set_variance_partition_thresholds(cpi, q, 0);
2641   av1_setup_frame(cpi);
2642 
2643   // Check if this high_source_sad (scene/slide change) frame should be
2644   // encoded at high/max QP, and if so, set the q and adjust some rate
2645   // control parameters.
2646   if (cpi->sf.rt_sf.overshoot_detection_cbr == FAST_DETECTION_MAXQ &&
2647       cpi->rc.high_source_sad) {
2648     if (av1_encodedframe_overshoot_cbr(cpi, &q)) {
2649       av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel, q,
2650                         q_cfg->enable_chroma_deltaq, q_cfg->enable_hdr_deltaq,
2651                         cpi->oxcf.mode == ALLINTRA, cpi->oxcf.tune_cfg.tuning);
2652       av1_set_speed_features_qindex_dependent(cpi, cpi->oxcf.speed);
2653       av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
2654                          cm->seq_params->bit_depth);
2655       av1_set_variance_partition_thresholds(cpi, q, 0);
2656       if (frame_is_intra_only(cm) || cm->features.error_resilient_mode ||
2657           cm->features.primary_ref_frame == PRIMARY_REF_NONE)
2658         av1_setup_frame(cpi);
2659     }
2660   }
2661   av1_apply_active_map(cpi);
2662   if (q_cfg->aq_mode == CYCLIC_REFRESH_AQ) av1_cyclic_refresh_setup(cpi);
2663   if (cm->seg.enabled) {
2664     if (!cm->seg.update_data && cm->prev_frame) {
2665       segfeatures_copy(&cm->seg, &cm->prev_frame->seg);
2666       cm->seg.enabled = cm->prev_frame->seg.enabled;
2667     } else {
2668       av1_calculate_segdata(&cm->seg);
2669     }
2670   } else {
2671     memset(&cm->seg, 0, sizeof(cm->seg));
2672   }
2673   segfeatures_copy(&cm->cur_frame->seg, &cm->seg);
2674   cm->cur_frame->seg.enabled = cm->seg.enabled;
2675 
2676   // This is for rtc temporal filtering case.
2677   if (is_psnr_calc_enabled(cpi) && cpi->sf.rt_sf.use_rtc_tf) {
2678     const SequenceHeader *seq_params = cm->seq_params;
2679 
2680     if (cpi->orig_source.buffer_alloc_sz == 0 ||
2681         cpi->rc.prev_coded_width != cpi->oxcf.frm_dim_cfg.width ||
2682         cpi->rc.prev_coded_height != cpi->oxcf.frm_dim_cfg.height) {
2683       // Allocate a source buffer to store the true source for psnr calculation.
2684       if (aom_alloc_frame_buffer(
2685               &cpi->orig_source, cpi->oxcf.frm_dim_cfg.width,
2686               cpi->oxcf.frm_dim_cfg.height, seq_params->subsampling_x,
2687               seq_params->subsampling_y, seq_params->use_highbitdepth,
2688               cpi->oxcf.border_in_pixels, cm->features.byte_alignment, false,
2689               0))
2690         aom_internal_error(cm->error, AOM_CODEC_MEM_ERROR,
2691                            "Failed to allocate scaled buffer");
2692     }
2693 
2694     aom_yv12_copy_y(cpi->source, &cpi->orig_source, 1);
2695     aom_yv12_copy_u(cpi->source, &cpi->orig_source, 1);
2696     aom_yv12_copy_v(cpi->source, &cpi->orig_source, 1);
2697   }
2698 
2699 #if CONFIG_COLLECT_COMPONENT_TIMING
2700   start_timing(cpi, av1_encode_frame_time);
2701 #endif
2702 
2703   // Set the motion vector precision based on mv stats from the last coded
2704   // frame.
2705   if (!frame_is_intra_only(cm)) av1_pick_and_set_high_precision_mv(cpi, q);
2706 
2707   // transform / motion compensation build reconstruction frame
2708   av1_encode_frame(cpi);
2709 
2710   if (!cpi->rc.rtc_external_ratectrl && !frame_is_intra_only(cm))
2711     update_motion_stat(cpi);
2712 
2713   // Adjust the refresh of the golden (longer-term) reference based on QP
2714   // selected for this frame. This is for CBR real-time mode, and only
2715   // for single layer without usage of the set_ref_frame_config (so
2716   // reference structure for 1 layer is set internally).
2717   if (!frame_is_intra_only(cm) && cpi->oxcf.rc_cfg.mode == AOM_CBR &&
2718       cpi->oxcf.mode == REALTIME && svc->number_spatial_layers == 1 &&
2719       svc->number_temporal_layers == 1 && !cpi->rc.rtc_external_ratectrl &&
2720       !cpi->ppi->rtc_ref.set_ref_frame_config &&
2721       sf->rt_sf.gf_refresh_based_on_qp)
2722     av1_adjust_gf_refresh_qp_one_pass_rt(cpi);
2723 
2724   // For non-svc: if scaling is required, copy scaled_source
2725   // into scaled_last_source.
2726   if (cm->current_frame.frame_number > 1 && !cpi->ppi->use_svc &&
2727       cpi->scaled_source.y_buffer != NULL &&
2728       cpi->scaled_last_source.y_buffer != NULL &&
2729       cpi->scaled_source.y_crop_width == cpi->scaled_last_source.y_crop_width &&
2730       cpi->scaled_source.y_crop_height ==
2731           cpi->scaled_last_source.y_crop_height &&
2732       (cm->width != cpi->unscaled_source->y_crop_width ||
2733        cm->height != cpi->unscaled_source->y_crop_height)) {
2734     cpi->scaled_last_source_available = 1;
2735     aom_yv12_copy_y(&cpi->scaled_source, &cpi->scaled_last_source, 1);
2736     aom_yv12_copy_u(&cpi->scaled_source, &cpi->scaled_last_source, 1);
2737     aom_yv12_copy_v(&cpi->scaled_source, &cpi->scaled_last_source, 1);
2738   }
2739 
2740 #if CONFIG_COLLECT_COMPONENT_TIMING
2741   end_timing(cpi, av1_encode_frame_time);
2742 #endif
2743 #if CONFIG_INTERNAL_STATS
2744   ++cpi->frame_recode_hits;
2745 #endif
2746 
2747   return AOM_CODEC_OK;
2748 }
2749 
2750 #if !CONFIG_REALTIME_ONLY
2751 
2752 /*!\brief Recode loop for encoding one frame. the purpose of encoding one frame
2753  * for multiple times can be approaching a target bitrate or adjusting the usage
2754  * of global motions.
2755  *
2756  * \ingroup high_level_algo
2757  *
2758  * \param[in]    cpi             Top-level encoder structure
2759  * \param[in]    size            Bitstream size
2760  * \param[out]   dest            Bitstream output buffer
2761  * \param[in]    dest_size       Bitstream output buffer size
2762  *
2763  * \return Returns a value to indicate if the encoding is done successfully.
2764  * \retval #AOM_CODEC_OK
2765  * \retval -1
2766  * \retval #AOM_CODEC_ERROR
2767  */
encode_with_recode_loop(AV1_COMP * cpi,size_t * size,uint8_t * dest,size_t dest_size)2768 static int encode_with_recode_loop(AV1_COMP *cpi, size_t *size, uint8_t *dest,
2769                                    size_t dest_size) {
2770   AV1_COMMON *const cm = &cpi->common;
2771   RATE_CONTROL *const rc = &cpi->rc;
2772   GlobalMotionInfo *const gm_info = &cpi->gm_info;
2773   const AV1EncoderConfig *const oxcf = &cpi->oxcf;
2774   const QuantizationCfg *const q_cfg = &oxcf->q_cfg;
2775   const int allow_recode = (cpi->sf.hl_sf.recode_loop != DISALLOW_RECODE);
2776   // Must allow recode if minimum compression ratio is set.
2777   assert(IMPLIES(oxcf->rc_cfg.min_cr > 0, allow_recode));
2778 
2779   set_size_independent_vars(cpi);
2780   if (is_stat_consumption_stage_twopass(cpi) &&
2781       cpi->sf.interp_sf.adaptive_interp_filter_search)
2782     cpi->interp_search_flags.interp_filter_search_mask =
2783         av1_setup_interp_filter_search_mask(cpi);
2784 
2785   av1_setup_frame_size(cpi);
2786 
2787   if (av1_superres_in_recode_allowed(cpi) &&
2788       cpi->superres_mode != AOM_SUPERRES_NONE &&
2789       cm->superres_scale_denominator == SCALE_NUMERATOR) {
2790     // Superres mode is currently enabled, but the denominator selected will
2791     // disable superres. So no need to continue, as we will go through another
2792     // recode loop for full-resolution after this anyway.
2793     return -1;
2794   }
2795 
2796   int top_index = 0, bottom_index = 0;
2797   int q = 0, q_low = 0, q_high = 0;
2798   av1_set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
2799   q_low = bottom_index;
2800   q_high = top_index;
2801 
2802   av1_set_mv_search_params(cpi);
2803 
2804   allocate_gradient_info_for_hog(cpi);
2805 
2806   allocate_src_var_of_4x4_sub_block_buf(cpi);
2807 
2808   if (cpi->sf.part_sf.partition_search_type == VAR_BASED_PARTITION)
2809     variance_partition_alloc(cpi);
2810 
2811   if (cm->current_frame.frame_type == KEY_FRAME) copy_frame_prob_info(cpi);
2812 
2813 #if CONFIG_COLLECT_COMPONENT_TIMING
2814   printf("\n Encoding a frame: \n");
2815 #endif
2816 
2817 #if !CONFIG_RD_COMMAND
2818   // Determine whether to use screen content tools using two fast encoding.
2819   if (!cpi->sf.hl_sf.disable_extra_sc_testing && !cpi->use_ducky_encode)
2820     av1_determine_sc_tools_with_encoding(cpi, q);
2821 #endif  // !CONFIG_RD_COMMAND
2822 
2823 #if CONFIG_TUNE_VMAF
2824   if (oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_NEG_MAX_GAIN) {
2825     av1_vmaf_neg_preprocessing(cpi, cpi->unscaled_source);
2826   }
2827 #endif
2828 
2829 #if CONFIG_TUNE_BUTTERAUGLI
2830   cpi->butteraugli_info.recon_set = false;
2831   int original_q = 0;
2832 #endif
2833 
2834   cpi->num_frame_recode = 0;
2835 
2836   // Loop variables
2837   int loop = 0;
2838   int loop_count = 0;
2839   int overshoot_seen = 0;
2840   int undershoot_seen = 0;
2841   int low_cr_seen = 0;
2842   int last_loop_allow_hp = 0;
2843 
2844   do {
2845     loop = 0;
2846     int do_mv_stats_collection = 1;
2847 
2848     // if frame was scaled calculate global_motion_search again if already
2849     // done
2850     if (loop_count > 0 && cpi->source && gm_info->search_done) {
2851       if (cpi->source->y_crop_width != cm->width ||
2852           cpi->source->y_crop_height != cm->height) {
2853         gm_info->search_done = 0;
2854       }
2855     }
2856     cpi->source = av1_realloc_and_scale_if_required(
2857         cm, cpi->unscaled_source, &cpi->scaled_source, EIGHTTAP_REGULAR, 0,
2858         false, false, cpi->oxcf.border_in_pixels, cpi->alloc_pyramid);
2859 
2860 #if CONFIG_TUNE_BUTTERAUGLI
2861     if (oxcf->tune_cfg.tuning == AOM_TUNE_BUTTERAUGLI) {
2862       if (loop_count == 0) {
2863         original_q = q;
2864         // TODO(sdeng): different q here does not make big difference. Use a
2865         // faster pass instead.
2866         q = 96;
2867         av1_setup_butteraugli_source(cpi);
2868       } else {
2869         q = original_q;
2870       }
2871     }
2872 #endif
2873 
2874     if (cpi->unscaled_last_source != NULL) {
2875       cpi->last_source = av1_realloc_and_scale_if_required(
2876           cm, cpi->unscaled_last_source, &cpi->scaled_last_source,
2877           EIGHTTAP_REGULAR, 0, false, false, cpi->oxcf.border_in_pixels,
2878           cpi->alloc_pyramid);
2879     }
2880 
2881     int scale_references = 0;
2882 #if CONFIG_FPMT_TEST
2883     scale_references =
2884         cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE ? 1 : 0;
2885 #endif  // CONFIG_FPMT_TEST
2886     if (scale_references ||
2887         cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] == 0) {
2888       if (!frame_is_intra_only(cm)) {
2889         if (loop_count > 0) {
2890           release_scaled_references(cpi);
2891         }
2892         av1_scale_references(cpi, EIGHTTAP_REGULAR, 0, 0);
2893       }
2894     }
2895 
2896 #if CONFIG_TUNE_VMAF
2897     if (oxcf->tune_cfg.tuning >= AOM_TUNE_VMAF_WITH_PREPROCESSING &&
2898         oxcf->tune_cfg.tuning <= AOM_TUNE_VMAF_NEG_MAX_GAIN) {
2899       cpi->vmaf_info.original_qindex = q;
2900       q = av1_get_vmaf_base_qindex(cpi, q);
2901     }
2902 #endif
2903 
2904 #if CONFIG_RD_COMMAND
2905     RD_COMMAND *rd_command = &cpi->rd_command;
2906     RD_OPTION option = rd_command->option_ls[rd_command->frame_index];
2907     if (option == RD_OPTION_SET_Q || option == RD_OPTION_SET_Q_RDMULT) {
2908       q = rd_command->q_index_ls[rd_command->frame_index];
2909     }
2910 #endif  // CONFIG_RD_COMMAND
2911 
2912 #if CONFIG_BITRATE_ACCURACY
2913 #if CONFIG_THREE_PASS
2914     if (oxcf->pass == AOM_RC_THIRD_PASS && cpi->vbr_rc_info.ready == 1) {
2915       int frame_coding_idx =
2916           av1_vbr_rc_frame_coding_idx(&cpi->vbr_rc_info, cpi->gf_frame_index);
2917       if (frame_coding_idx < cpi->vbr_rc_info.total_frame_count) {
2918         q = cpi->vbr_rc_info.q_index_list[frame_coding_idx];
2919       } else {
2920         // TODO(angiebird): Investigate why sometimes there is an extra frame
2921         // after the last GOP.
2922         q = cpi->vbr_rc_info.base_q_index;
2923       }
2924     }
2925 #else
2926     if (cpi->vbr_rc_info.q_index_list_ready) {
2927       q = cpi->vbr_rc_info.q_index_list[cpi->gf_frame_index];
2928     }
2929 #endif  // CONFIG_THREE_PASS
2930 #endif  // CONFIG_BITRATE_ACCURACY
2931 
2932 #if CONFIG_RATECTRL_LOG && CONFIG_THREE_PASS && CONFIG_BITRATE_ACCURACY
2933     // TODO(angiebird): Move this into a function.
2934     if (oxcf->pass == AOM_RC_THIRD_PASS) {
2935       int frame_coding_idx =
2936           av1_vbr_rc_frame_coding_idx(&cpi->vbr_rc_info, cpi->gf_frame_index);
2937       double qstep_ratio = cpi->vbr_rc_info.qstep_ratio_list[frame_coding_idx];
2938       FRAME_UPDATE_TYPE update_type =
2939           cpi->vbr_rc_info.update_type_list[frame_coding_idx];
2940       rc_log_frame_encode_param(&cpi->rc_log, frame_coding_idx, qstep_ratio, q,
2941                                 update_type);
2942     }
2943 #endif  // CONFIG_RATECTRL_LOG && CONFIG_THREE_PASS && CONFIG_BITRATE_ACCURACY
2944 
2945     if (cpi->use_ducky_encode) {
2946       const DuckyEncodeFrameInfo *frame_info =
2947           &cpi->ducky_encode_info.frame_info;
2948       if (frame_info->qp_mode == DUCKY_ENCODE_FRAME_MODE_QINDEX) {
2949         q = frame_info->q_index;
2950         cm->delta_q_info.delta_q_present_flag = frame_info->delta_q_enabled;
2951       }
2952     }
2953 
2954     av1_set_quantizer(cm, q_cfg->qm_minlevel, q_cfg->qm_maxlevel, q,
2955                       q_cfg->enable_chroma_deltaq, q_cfg->enable_hdr_deltaq,
2956                       oxcf->mode == ALLINTRA, oxcf->tune_cfg.tuning);
2957     av1_set_speed_features_qindex_dependent(cpi, oxcf->speed);
2958     av1_init_quantizer(&cpi->enc_quant_dequant_params, &cm->quant_params,
2959                        cm->seq_params->bit_depth);
2960 
2961     av1_set_variance_partition_thresholds(cpi, q, 0);
2962 
2963     // printf("Frame %d/%d: q = %d, frame_type = %d superres_denom = %d\n",
2964     //        cm->current_frame.frame_number, cm->show_frame, q,
2965     //        cm->current_frame.frame_type, cm->superres_scale_denominator);
2966 
2967     if (loop_count == 0) {
2968       av1_setup_frame(cpi);
2969     } else if (get_primary_ref_frame_buf(cm) == NULL) {
2970       // Base q-index may have changed, so we need to assign proper default coef
2971       // probs before every iteration.
2972       av1_default_coef_probs(cm);
2973       av1_setup_frame_contexts(cm);
2974     }
2975 
2976     if (q_cfg->aq_mode == VARIANCE_AQ) {
2977       av1_vaq_frame_setup(cpi);
2978     } else if (q_cfg->aq_mode == COMPLEXITY_AQ) {
2979       av1_setup_in_frame_q_adj(cpi);
2980     }
2981 
2982     if (cm->seg.enabled) {
2983       if (!cm->seg.update_data && cm->prev_frame) {
2984         segfeatures_copy(&cm->seg, &cm->prev_frame->seg);
2985         cm->seg.enabled = cm->prev_frame->seg.enabled;
2986       } else {
2987         av1_calculate_segdata(&cm->seg);
2988       }
2989     } else {
2990       memset(&cm->seg, 0, sizeof(cm->seg));
2991     }
2992     segfeatures_copy(&cm->cur_frame->seg, &cm->seg);
2993     cm->cur_frame->seg.enabled = cm->seg.enabled;
2994 
2995 #if CONFIG_COLLECT_COMPONENT_TIMING
2996     start_timing(cpi, av1_encode_frame_time);
2997 #endif
2998     // Set the motion vector precision based on mv stats from the last coded
2999     // frame.
3000     if (!frame_is_intra_only(cm)) {
3001       av1_pick_and_set_high_precision_mv(cpi, q);
3002 
3003       // If the precision has changed during different iteration of the loop,
3004       // then we need to reset the global motion vectors
3005       if (loop_count > 0 &&
3006           cm->features.allow_high_precision_mv != last_loop_allow_hp) {
3007         gm_info->search_done = 0;
3008       }
3009       last_loop_allow_hp = cm->features.allow_high_precision_mv;
3010     }
3011 
3012     // transform / motion compensation build reconstruction frame
3013     av1_encode_frame(cpi);
3014 
3015     // Disable mv_stats collection for parallel frames based on update flag.
3016     if (!cpi->do_frame_data_update) do_mv_stats_collection = 0;
3017 
3018     // Reset the mv_stats in case we are interrupted by an intraframe or an
3019     // overlay frame.
3020     if (cpi->mv_stats.valid && do_mv_stats_collection) av1_zero(cpi->mv_stats);
3021 
3022     // Gather the mv_stats for the next frame
3023     if (cpi->sf.hl_sf.high_precision_mv_usage == LAST_MV_DATA &&
3024         av1_frame_allows_smart_mv(cpi) && do_mv_stats_collection) {
3025       av1_collect_mv_stats(cpi, q);
3026     }
3027 
3028 #if CONFIG_COLLECT_COMPONENT_TIMING
3029     end_timing(cpi, av1_encode_frame_time);
3030 #endif
3031 
3032 #if CONFIG_BITRATE_ACCURACY || CONFIG_RD_COMMAND
3033     const int do_dummy_pack = 1;
3034 #else   // CONFIG_BITRATE_ACCURACY
3035     // Dummy pack of the bitstream using up to date stats to get an
3036     // accurate estimate of output frame size to determine if we need
3037     // to recode.
3038     const int do_dummy_pack =
3039         (cpi->sf.hl_sf.recode_loop >= ALLOW_RECODE_KFARFGF &&
3040          oxcf->rc_cfg.mode != AOM_Q) ||
3041         oxcf->rc_cfg.min_cr > 0;
3042 #endif  // CONFIG_BITRATE_ACCURACY
3043     if (do_dummy_pack) {
3044       av1_finalize_encoded_frame(cpi);
3045       int largest_tile_id = 0;  // Output from bitstream: unused here
3046       rc->coefficient_size = 0;
3047       if (av1_pack_bitstream(cpi, dest, dest_size, size, &largest_tile_id) !=
3048           AOM_CODEC_OK) {
3049         return AOM_CODEC_ERROR;
3050       }
3051 
3052       // bits used for this frame
3053       rc->projected_frame_size = (int)(*size) << 3;
3054 #if CONFIG_RD_COMMAND
3055       PSNR_STATS psnr;
3056       aom_calc_psnr(cpi->source, &cpi->common.cur_frame->buf, &psnr);
3057       printf("q %d rdmult %d rate %d dist %" PRIu64 "\n", q, cpi->rd.RDMULT,
3058              rc->projected_frame_size, psnr.sse[0]);
3059       ++rd_command->frame_index;
3060       if (rd_command->frame_index == rd_command->frame_count) {
3061         return AOM_CODEC_ERROR;
3062       }
3063 #endif  // CONFIG_RD_COMMAND
3064 
3065 #if CONFIG_RATECTRL_LOG && CONFIG_THREE_PASS && CONFIG_BITRATE_ACCURACY
3066       if (oxcf->pass == AOM_RC_THIRD_PASS) {
3067         int frame_coding_idx =
3068             av1_vbr_rc_frame_coding_idx(&cpi->vbr_rc_info, cpi->gf_frame_index);
3069         rc_log_frame_entropy(&cpi->rc_log, frame_coding_idx,
3070                              rc->projected_frame_size, rc->coefficient_size);
3071       }
3072 #endif  // CONFIG_RATECTRL_LOG && CONFIG_THREE_PASS && CONFIG_BITRATE_ACCURACY
3073     }
3074 
3075 #if CONFIG_TUNE_VMAF
3076     if (oxcf->tune_cfg.tuning >= AOM_TUNE_VMAF_WITH_PREPROCESSING &&
3077         oxcf->tune_cfg.tuning <= AOM_TUNE_VMAF_NEG_MAX_GAIN) {
3078       q = cpi->vmaf_info.original_qindex;
3079     }
3080 #endif
3081     if (allow_recode) {
3082       // Update q and decide whether to do a recode loop
3083       recode_loop_update_q(cpi, &loop, &q, &q_low, &q_high, top_index,
3084                            bottom_index, &undershoot_seen, &overshoot_seen,
3085                            &low_cr_seen, loop_count);
3086     }
3087 
3088 #if CONFIG_TUNE_BUTTERAUGLI
3089     if (loop_count == 0 && oxcf->tune_cfg.tuning == AOM_TUNE_BUTTERAUGLI) {
3090       loop = 1;
3091       av1_setup_butteraugli_rdmult_and_restore_source(cpi, 0.4);
3092     }
3093 #endif
3094 
3095     if (cpi->use_ducky_encode) {
3096       // Ducky encode currently does not support recode loop.
3097       loop = 0;
3098     }
3099 #if CONFIG_BITRATE_ACCURACY || CONFIG_RD_COMMAND
3100     loop = 0;  // turn off recode loop when CONFIG_BITRATE_ACCURACY is on
3101 #endif         // CONFIG_BITRATE_ACCURACY || CONFIG_RD_COMMAND
3102 
3103     if (loop) {
3104       ++loop_count;
3105       cpi->num_frame_recode =
3106           (cpi->num_frame_recode < (NUM_RECODES_PER_FRAME - 1))
3107               ? (cpi->num_frame_recode + 1)
3108               : (NUM_RECODES_PER_FRAME - 1);
3109 #if CONFIG_INTERNAL_STATS
3110       ++cpi->frame_recode_hits;
3111 #endif
3112     }
3113 #if CONFIG_COLLECT_COMPONENT_TIMING
3114     if (loop) printf("\n Recoding:");
3115 #endif
3116   } while (loop);
3117 
3118   return AOM_CODEC_OK;
3119 }
3120 #endif  // !CONFIG_REALTIME_ONLY
3121 
3122 // TODO(jingning, paulwilkins): Set up high grain level to test
3123 // hardware decoders. Need to adapt the actual noise variance
3124 // according to the difference between reconstructed frame and the
3125 // source signal.
set_grain_syn_params(AV1_COMMON * cm)3126 static void set_grain_syn_params(AV1_COMMON *cm) {
3127   aom_film_grain_t *film_grain_params = &cm->film_grain_params;
3128   film_grain_params->apply_grain = 1;
3129   film_grain_params->update_parameters = 1;
3130   film_grain_params->random_seed = rand() & 0xffff;
3131 
3132   film_grain_params->num_y_points = 1;
3133   film_grain_params->scaling_points_y[0][0] = 128;
3134   film_grain_params->scaling_points_y[0][1] = 100;
3135 
3136   if (!cm->seq_params->monochrome) {
3137     film_grain_params->num_cb_points = 1;
3138     film_grain_params->scaling_points_cb[0][0] = 128;
3139     film_grain_params->scaling_points_cb[0][1] = 100;
3140 
3141     film_grain_params->num_cr_points = 1;
3142     film_grain_params->scaling_points_cr[0][0] = 128;
3143     film_grain_params->scaling_points_cr[0][1] = 100;
3144   } else {
3145     film_grain_params->num_cb_points = 0;
3146     film_grain_params->num_cr_points = 0;
3147   }
3148 
3149   film_grain_params->chroma_scaling_from_luma = 0;
3150 
3151   film_grain_params->scaling_shift = 1;
3152   film_grain_params->ar_coeff_lag = 0;
3153   film_grain_params->ar_coeff_shift = 1;
3154   film_grain_params->overlap_flag = 1;
3155   film_grain_params->grain_scale_shift = 0;
3156 }
3157 
3158 /*!\brief Recode loop or a single loop for encoding one frame, followed by
3159  * in-loop deblocking filters, CDEF filters, and restoration filters.
3160  *
3161  * \ingroup high_level_algo
3162  * \callgraph
3163  * \callergraph
3164  *
3165  * \param[in]    cpi             Top-level encoder structure
3166  * \param[in]    size            Bitstream size
3167  * \param[out]   dest            Bitstream output buffer
3168  * \param[in]    dest_size       Bitstream output buffer size
3169  * \param[in]    sse             Total distortion of the frame
3170  * \param[in]    rate            Total rate of the frame
3171  * \param[in]    largest_tile_id Tile id of the last tile
3172  *
3173  * \return Returns a value to indicate if the encoding is done successfully.
3174  * \retval #AOM_CODEC_OK
3175  * \retval #AOM_CODEC_ERROR
3176  */
encode_with_recode_loop_and_filter(AV1_COMP * cpi,size_t * size,uint8_t * dest,size_t dest_size,int64_t * sse,int64_t * rate,int * largest_tile_id)3177 static int encode_with_recode_loop_and_filter(AV1_COMP *cpi, size_t *size,
3178                                               uint8_t *dest, size_t dest_size,
3179                                               int64_t *sse, int64_t *rate,
3180                                               int *largest_tile_id) {
3181 #if CONFIG_COLLECT_COMPONENT_TIMING
3182   start_timing(cpi, encode_with_or_without_recode_time);
3183 #endif
3184   for (int i = 0; i < NUM_RECODES_PER_FRAME; i++) {
3185     cpi->do_update_frame_probs_txtype[i] = 0;
3186     cpi->do_update_frame_probs_obmc[i] = 0;
3187     cpi->do_update_frame_probs_warp[i] = 0;
3188     cpi->do_update_frame_probs_interpfilter[i] = 0;
3189   }
3190 
3191   cpi->do_update_vbr_bits_off_target_fast = 0;
3192   int err;
3193 #if CONFIG_REALTIME_ONLY
3194   err = encode_without_recode(cpi);
3195 #else
3196   if (cpi->sf.hl_sf.recode_loop == DISALLOW_RECODE)
3197     err = encode_without_recode(cpi);
3198   else
3199     err = encode_with_recode_loop(cpi, size, dest, dest_size);
3200 #endif
3201 #if CONFIG_COLLECT_COMPONENT_TIMING
3202   end_timing(cpi, encode_with_or_without_recode_time);
3203 #endif
3204   if (err != AOM_CODEC_OK) {
3205     if (err == -1) {
3206       // special case as described in encode_with_recode_loop().
3207       // Encoding was skipped.
3208       err = AOM_CODEC_OK;
3209       if (sse != NULL) *sse = INT64_MAX;
3210       if (rate != NULL) *rate = INT64_MAX;
3211       *largest_tile_id = 0;
3212     }
3213     return err;
3214   }
3215 
3216 #ifdef OUTPUT_YUV_DENOISED
3217   const AV1EncoderConfig *const oxcf = &cpi->oxcf;
3218   if (oxcf->noise_sensitivity > 0 && denoise_svc(cpi)) {
3219     aom_write_yuv_frame(yuv_denoised_file,
3220                         &cpi->denoiser.running_avg_y[INTRA_FRAME]);
3221   }
3222 #endif
3223 
3224   AV1_COMMON *const cm = &cpi->common;
3225   SequenceHeader *const seq_params = cm->seq_params;
3226 
3227   // Special case code to reduce pulsing when key frames are forced at a
3228   // fixed interval. Note the reconstruction error if it is the frame before
3229   // the force key frame
3230   if (cpi->ppi->p_rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
3231 #if CONFIG_AV1_HIGHBITDEPTH
3232     if (seq_params->use_highbitdepth) {
3233       cpi->ambient_err = aom_highbd_get_y_sse(cpi->source, &cm->cur_frame->buf);
3234     } else {
3235       cpi->ambient_err = aom_get_y_sse(cpi->source, &cm->cur_frame->buf);
3236     }
3237 #else
3238     cpi->ambient_err = aom_get_y_sse(cpi->source, &cm->cur_frame->buf);
3239 #endif
3240   }
3241 
3242   cm->cur_frame->buf.color_primaries = seq_params->color_primaries;
3243   cm->cur_frame->buf.transfer_characteristics =
3244       seq_params->transfer_characteristics;
3245   cm->cur_frame->buf.matrix_coefficients = seq_params->matrix_coefficients;
3246   cm->cur_frame->buf.monochrome = seq_params->monochrome;
3247   cm->cur_frame->buf.chroma_sample_position =
3248       seq_params->chroma_sample_position;
3249   cm->cur_frame->buf.color_range = seq_params->color_range;
3250   cm->cur_frame->buf.render_width = cm->render_width;
3251   cm->cur_frame->buf.render_height = cm->render_height;
3252 
3253   if (!cpi->mt_info.pipeline_lpf_mt_with_enc)
3254     set_postproc_filter_default_params(&cpi->common);
3255 
3256   if (!cm->features.allow_intrabc) {
3257     loopfilter_frame(cpi, cm);
3258   }
3259 
3260   if (cpi->oxcf.mode != ALLINTRA && !cpi->ppi->rtc_ref.non_reference_frame) {
3261     extend_frame_borders(cpi);
3262   }
3263 
3264 #ifdef OUTPUT_YUV_REC
3265   aom_write_one_yuv_frame(cm, &cm->cur_frame->buf);
3266 #endif
3267 
3268   if (cpi->oxcf.tune_cfg.content == AOM_CONTENT_FILM) {
3269     set_grain_syn_params(cm);
3270   }
3271 
3272   av1_finalize_encoded_frame(cpi);
3273   // Build the bitstream
3274 #if CONFIG_COLLECT_COMPONENT_TIMING
3275   start_timing(cpi, av1_pack_bitstream_final_time);
3276 #endif
3277   cpi->rc.coefficient_size = 0;
3278   if (av1_pack_bitstream(cpi, dest, dest_size, size, largest_tile_id) !=
3279       AOM_CODEC_OK)
3280     return AOM_CODEC_ERROR;
3281 #if CONFIG_COLLECT_COMPONENT_TIMING
3282   end_timing(cpi, av1_pack_bitstream_final_time);
3283 #endif
3284 
3285   if (cpi->rc.postencode_drop && allow_postencode_drop_rtc(cpi) &&
3286       av1_postencode_drop_cbr(cpi, size)) {
3287     return AOM_CODEC_OK;
3288   }
3289 
3290   // Compute sse and rate.
3291   if (sse != NULL) {
3292 #if CONFIG_AV1_HIGHBITDEPTH
3293     *sse = (seq_params->use_highbitdepth)
3294                ? aom_highbd_get_y_sse(cpi->source, &cm->cur_frame->buf)
3295                : aom_get_y_sse(cpi->source, &cm->cur_frame->buf);
3296 #else
3297     *sse = aom_get_y_sse(cpi->source, &cm->cur_frame->buf);
3298 #endif
3299   }
3300   if (rate != NULL) {
3301     const int64_t bits = (*size << 3);
3302     *rate = (bits << 5);  // To match scale.
3303   }
3304 
3305 #if !CONFIG_REALTIME_ONLY
3306   if (cpi->use_ducky_encode) {
3307     PSNR_STATS psnr;
3308     aom_calc_psnr(cpi->source, &cpi->common.cur_frame->buf, &psnr);
3309     DuckyEncodeFrameResult *frame_result = &cpi->ducky_encode_info.frame_result;
3310     frame_result->global_order_idx = cm->cur_frame->display_order_hint;
3311     frame_result->q_index = cm->quant_params.base_qindex;
3312     frame_result->rdmult = cpi->rd.RDMULT;
3313     frame_result->rate = (int)(*size) * 8;
3314     frame_result->dist = psnr.sse[0];
3315     frame_result->psnr = psnr.psnr[0];
3316   }
3317 #endif  // !CONFIG_REALTIME_ONLY
3318 
3319   return AOM_CODEC_OK;
3320 }
3321 
encode_with_and_without_superres(AV1_COMP * cpi,size_t * size,uint8_t * dest,size_t dest_size,int * largest_tile_id)3322 static int encode_with_and_without_superres(AV1_COMP *cpi, size_t *size,
3323                                             uint8_t *dest, size_t dest_size,
3324                                             int *largest_tile_id) {
3325   const AV1_COMMON *const cm = &cpi->common;
3326   assert(cm->seq_params->enable_superres);
3327   assert(av1_superres_in_recode_allowed(cpi));
3328   aom_codec_err_t err = AOM_CODEC_OK;
3329   av1_save_all_coding_context(cpi);
3330 
3331   int64_t sse1 = INT64_MAX;
3332   int64_t rate1 = INT64_MAX;
3333   int largest_tile_id1 = 0;
3334   int64_t sse2 = INT64_MAX;
3335   int64_t rate2 = INT64_MAX;
3336   int largest_tile_id2;
3337   double proj_rdcost1 = DBL_MAX;
3338   const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
3339   const FRAME_UPDATE_TYPE update_type =
3340       gf_group->update_type[cpi->gf_frame_index];
3341   const aom_bit_depth_t bit_depth = cm->seq_params->bit_depth;
3342 
3343   // Encode with superres.
3344   if (cpi->sf.hl_sf.superres_auto_search_type == SUPERRES_AUTO_ALL) {
3345     SuperResCfg *const superres_cfg = &cpi->oxcf.superres_cfg;
3346     int64_t superres_sses[SCALE_NUMERATOR];
3347     int64_t superres_rates[SCALE_NUMERATOR];
3348     int superres_largest_tile_ids[SCALE_NUMERATOR];
3349     // Use superres for Key-frames and Alt-ref frames only.
3350     if (update_type != OVERLAY_UPDATE && update_type != INTNL_OVERLAY_UPDATE) {
3351       for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
3352            ++denom) {
3353         superres_cfg->superres_scale_denominator = denom;
3354         superres_cfg->superres_kf_scale_denominator = denom;
3355         const int this_index = denom - (SCALE_NUMERATOR + 1);
3356 
3357         cpi->superres_mode = AOM_SUPERRES_AUTO;  // Super-res on for this loop.
3358         err = encode_with_recode_loop_and_filter(
3359             cpi, size, dest, dest_size, &superres_sses[this_index],
3360             &superres_rates[this_index],
3361             &superres_largest_tile_ids[this_index]);
3362         cpi->superres_mode = AOM_SUPERRES_NONE;  // Reset to default (full-res).
3363         if (err != AOM_CODEC_OK) return err;
3364         restore_all_coding_context(cpi);
3365       }
3366       // Reset.
3367       superres_cfg->superres_scale_denominator = SCALE_NUMERATOR;
3368       superres_cfg->superres_kf_scale_denominator = SCALE_NUMERATOR;
3369     } else {
3370       for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
3371            ++denom) {
3372         const int this_index = denom - (SCALE_NUMERATOR + 1);
3373         superres_sses[this_index] = INT64_MAX;
3374         superres_rates[this_index] = INT64_MAX;
3375       }
3376     }
3377     // Encode without superres.
3378     assert(cpi->superres_mode == AOM_SUPERRES_NONE);
3379     err = encode_with_recode_loop_and_filter(cpi, size, dest, dest_size, &sse2,
3380                                              &rate2, &largest_tile_id2);
3381     if (err != AOM_CODEC_OK) return err;
3382 
3383     // Note: Both use common rdmult based on base qindex of fullres.
3384     const int64_t rdmult = av1_compute_rd_mult_based_on_qindex(
3385         bit_depth, update_type, cm->quant_params.base_qindex,
3386         cpi->oxcf.tune_cfg.tuning);
3387 
3388     // Find the best rdcost among all superres denoms.
3389     int best_denom = -1;
3390     for (int denom = SCALE_NUMERATOR + 1; denom <= 2 * SCALE_NUMERATOR;
3391          ++denom) {
3392       const int this_index = denom - (SCALE_NUMERATOR + 1);
3393       const int64_t this_sse = superres_sses[this_index];
3394       const int64_t this_rate = superres_rates[this_index];
3395       const int this_largest_tile_id = superres_largest_tile_ids[this_index];
3396       const double this_rdcost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
3397           rdmult, this_rate, this_sse, bit_depth);
3398       if (this_rdcost < proj_rdcost1) {
3399         sse1 = this_sse;
3400         rate1 = this_rate;
3401         largest_tile_id1 = this_largest_tile_id;
3402         proj_rdcost1 = this_rdcost;
3403         best_denom = denom;
3404       }
3405     }
3406     const double proj_rdcost2 =
3407         RDCOST_DBL_WITH_NATIVE_BD_DIST(rdmult, rate2, sse2, bit_depth);
3408     // Re-encode with superres if it's better.
3409     if (proj_rdcost1 < proj_rdcost2) {
3410       restore_all_coding_context(cpi);
3411       // TODO(urvang): We should avoid rerunning the recode loop by saving
3412       // previous output+state, or running encode only for the selected 'q' in
3413       // previous step.
3414       // Again, temporarily force the best denom.
3415       superres_cfg->superres_scale_denominator = best_denom;
3416       superres_cfg->superres_kf_scale_denominator = best_denom;
3417       int64_t sse3 = INT64_MAX;
3418       int64_t rate3 = INT64_MAX;
3419       cpi->superres_mode =
3420           AOM_SUPERRES_AUTO;  // Super-res on for this recode loop.
3421       err = encode_with_recode_loop_and_filter(cpi, size, dest, dest_size,
3422                                                &sse3, &rate3, largest_tile_id);
3423       cpi->superres_mode = AOM_SUPERRES_NONE;  // Reset to default (full-res).
3424       assert(sse1 == sse3);
3425       assert(rate1 == rate3);
3426       assert(largest_tile_id1 == *largest_tile_id);
3427       // Reset.
3428       superres_cfg->superres_scale_denominator = SCALE_NUMERATOR;
3429       superres_cfg->superres_kf_scale_denominator = SCALE_NUMERATOR;
3430     } else {
3431       *largest_tile_id = largest_tile_id2;
3432     }
3433   } else {
3434     assert(cpi->sf.hl_sf.superres_auto_search_type == SUPERRES_AUTO_DUAL);
3435     cpi->superres_mode =
3436         AOM_SUPERRES_AUTO;  // Super-res on for this recode loop.
3437     err = encode_with_recode_loop_and_filter(cpi, size, dest, dest_size, &sse1,
3438                                              &rate1, &largest_tile_id1);
3439     cpi->superres_mode = AOM_SUPERRES_NONE;  // Reset to default (full-res).
3440     if (err != AOM_CODEC_OK) return err;
3441     restore_all_coding_context(cpi);
3442     // Encode without superres.
3443     assert(cpi->superres_mode == AOM_SUPERRES_NONE);
3444     err = encode_with_recode_loop_and_filter(cpi, size, dest, dest_size, &sse2,
3445                                              &rate2, &largest_tile_id2);
3446     if (err != AOM_CODEC_OK) return err;
3447 
3448     // Note: Both use common rdmult based on base qindex of fullres.
3449     const int64_t rdmult = av1_compute_rd_mult_based_on_qindex(
3450         bit_depth, update_type, cm->quant_params.base_qindex,
3451         cpi->oxcf.tune_cfg.tuning);
3452     proj_rdcost1 =
3453         RDCOST_DBL_WITH_NATIVE_BD_DIST(rdmult, rate1, sse1, bit_depth);
3454     const double proj_rdcost2 =
3455         RDCOST_DBL_WITH_NATIVE_BD_DIST(rdmult, rate2, sse2, bit_depth);
3456     // Re-encode with superres if it's better.
3457     if (proj_rdcost1 < proj_rdcost2) {
3458       restore_all_coding_context(cpi);
3459       // TODO(urvang): We should avoid rerunning the recode loop by saving
3460       // previous output+state, or running encode only for the selected 'q' in
3461       // previous step.
3462       int64_t sse3 = INT64_MAX;
3463       int64_t rate3 = INT64_MAX;
3464       cpi->superres_mode =
3465           AOM_SUPERRES_AUTO;  // Super-res on for this recode loop.
3466       err = encode_with_recode_loop_and_filter(cpi, size, dest, dest_size,
3467                                                &sse3, &rate3, largest_tile_id);
3468       cpi->superres_mode = AOM_SUPERRES_NONE;  // Reset to default (full-res).
3469       assert(sse1 == sse3);
3470       assert(rate1 == rate3);
3471       assert(largest_tile_id1 == *largest_tile_id);
3472     } else {
3473       *largest_tile_id = largest_tile_id2;
3474     }
3475   }
3476 
3477   return err;
3478 }
3479 
3480 // Conditions to disable cdf_update mode in selective mode for real-time.
3481 // Handle case for layers, scene change, and resizing.
selective_disable_cdf_rtc(const AV1_COMP * cpi)3482 static inline int selective_disable_cdf_rtc(const AV1_COMP *cpi) {
3483   const AV1_COMMON *const cm = &cpi->common;
3484   const RATE_CONTROL *const rc = &cpi->rc;
3485   // For single layer.
3486   if (cpi->svc.number_spatial_layers == 1 &&
3487       cpi->svc.number_temporal_layers == 1) {
3488     // Don't disable on intra_only, scene change (high_source_sad = 1),
3489     // or resized frame. To avoid quality loss force enable at
3490     // for ~30 frames after key or scene/slide change, and
3491     // after 8 frames since last update if frame_source_sad > 0.
3492     if (frame_is_intra_only(cm) || is_frame_resize_pending(cpi) ||
3493         rc->high_source_sad || rc->frames_since_key < 30 ||
3494         (cpi->oxcf.q_cfg.aq_mode == CYCLIC_REFRESH_AQ &&
3495          cpi->cyclic_refresh->counter_encode_maxq_scene_change < 30) ||
3496         (cpi->frames_since_last_update > 8 && cpi->rc.frame_source_sad > 0))
3497       return 0;
3498     else
3499       return 1;
3500   } else if (cpi->svc.number_temporal_layers > 1) {
3501     // Disable only on top temporal enhancement layer for now.
3502     return cpi->svc.temporal_layer_id == cpi->svc.number_temporal_layers - 1;
3503   }
3504   return 1;
3505 }
3506 
3507 #if !CONFIG_REALTIME_ONLY
subtract_stats(FIRSTPASS_STATS * section,const FIRSTPASS_STATS * frame)3508 static void subtract_stats(FIRSTPASS_STATS *section,
3509                            const FIRSTPASS_STATS *frame) {
3510   section->frame -= frame->frame;
3511   section->weight -= frame->weight;
3512   section->intra_error -= frame->intra_error;
3513   section->frame_avg_wavelet_energy -= frame->frame_avg_wavelet_energy;
3514   section->coded_error -= frame->coded_error;
3515   section->sr_coded_error -= frame->sr_coded_error;
3516   section->pcnt_inter -= frame->pcnt_inter;
3517   section->pcnt_motion -= frame->pcnt_motion;
3518   section->pcnt_second_ref -= frame->pcnt_second_ref;
3519   section->pcnt_neutral -= frame->pcnt_neutral;
3520   section->intra_skip_pct -= frame->intra_skip_pct;
3521   section->inactive_zone_rows -= frame->inactive_zone_rows;
3522   section->inactive_zone_cols -= frame->inactive_zone_cols;
3523   section->MVr -= frame->MVr;
3524   section->mvr_abs -= frame->mvr_abs;
3525   section->MVc -= frame->MVc;
3526   section->mvc_abs -= frame->mvc_abs;
3527   section->MVrv -= frame->MVrv;
3528   section->MVcv -= frame->MVcv;
3529   section->mv_in_out_count -= frame->mv_in_out_count;
3530   section->new_mv_count -= frame->new_mv_count;
3531   section->count -= frame->count;
3532   section->duration -= frame->duration;
3533 }
3534 
calculate_frame_avg_haar_energy(AV1_COMP * cpi)3535 static void calculate_frame_avg_haar_energy(AV1_COMP *cpi) {
3536   TWO_PASS *const twopass = &cpi->ppi->twopass;
3537   const FIRSTPASS_STATS *const total_stats =
3538       twopass->stats_buf_ctx->total_stats;
3539 
3540   if (is_one_pass_rt_params(cpi) ||
3541       (cpi->oxcf.q_cfg.deltaq_mode != DELTA_Q_PERCEPTUAL) ||
3542       (is_fp_wavelet_energy_invalid(total_stats) == 0))
3543     return;
3544 
3545   const int num_mbs = (cpi->oxcf.resize_cfg.resize_mode != RESIZE_NONE)
3546                           ? cpi->initial_mbs
3547                           : cpi->common.mi_params.MBs;
3548   const YV12_BUFFER_CONFIG *const unfiltered_source = cpi->unfiltered_source;
3549   const uint8_t *const src = unfiltered_source->y_buffer;
3550   const int hbd = unfiltered_source->flags & YV12_FLAG_HIGHBITDEPTH;
3551   const int stride = unfiltered_source->y_stride;
3552   const BLOCK_SIZE fp_block_size =
3553       get_fp_block_size(cpi->is_screen_content_type);
3554   const int fp_block_size_width = block_size_wide[fp_block_size];
3555   const int fp_block_size_height = block_size_high[fp_block_size];
3556   const int num_unit_cols =
3557       get_num_blocks(unfiltered_source->y_crop_width, fp_block_size_width);
3558   const int num_unit_rows =
3559       get_num_blocks(unfiltered_source->y_crop_height, fp_block_size_height);
3560   const int num_8x8_cols = num_unit_cols * (fp_block_size_width / 8);
3561   const int num_8x8_rows = num_unit_rows * (fp_block_size_height / 8);
3562   int64_t frame_avg_wavelet_energy = av1_haar_ac_sad_mxn_uint8_input(
3563       src, stride, hbd, num_8x8_rows, num_8x8_cols);
3564 
3565   cpi->twopass_frame.frame_avg_haar_energy =
3566       log1p((double)frame_avg_wavelet_energy / num_mbs);
3567 }
3568 #endif
3569 
3570 /*!\brief Run the final pass encoding for 1-pass/2-pass encoding mode, and pack
3571  * the bitstream
3572  *
3573  * \ingroup high_level_algo
3574  * \callgraph
3575  * \callergraph
3576  *
3577  * \param[in]    cpi             Top-level encoder structure
3578  * \param[in]    size            Bitstream size
3579  * \param[out]   dest            Bitstream output buffer
3580  * \param[in]    dest_size       Bitstream output buffer size
3581  *
3582  * \return Returns a value to indicate if the encoding is done successfully.
3583  * \retval #AOM_CODEC_OK
3584  * \retval #AOM_CODEC_ERROR
3585  */
encode_frame_to_data_rate(AV1_COMP * cpi,size_t * size,uint8_t * dest,size_t dest_size)3586 static int encode_frame_to_data_rate(AV1_COMP *cpi, size_t *size, uint8_t *dest,
3587                                      size_t dest_size) {
3588   AV1_COMMON *const cm = &cpi->common;
3589   SequenceHeader *const seq_params = cm->seq_params;
3590   CurrentFrame *const current_frame = &cm->current_frame;
3591   const AV1EncoderConfig *const oxcf = &cpi->oxcf;
3592   struct segmentation *const seg = &cm->seg;
3593   FeatureFlags *const features = &cm->features;
3594   const TileConfig *const tile_cfg = &oxcf->tile_cfg;
3595   assert(cpi->source != NULL);
3596   cpi->td.mb.e_mbd.cur_buf = cpi->source;
3597 
3598 #if CONFIG_COLLECT_COMPONENT_TIMING
3599   start_timing(cpi, encode_frame_to_data_rate_time);
3600 #endif
3601 
3602 #if !CONFIG_REALTIME_ONLY
3603   calculate_frame_avg_haar_energy(cpi);
3604 #endif
3605 
3606   // frame type has been decided outside of this function call
3607   cm->cur_frame->frame_type = current_frame->frame_type;
3608 
3609   cm->tiles.large_scale = tile_cfg->enable_large_scale_tile;
3610   cm->tiles.single_tile_decoding = tile_cfg->enable_single_tile_decoding;
3611 
3612   features->allow_ref_frame_mvs &= frame_might_allow_ref_frame_mvs(cm);
3613   // features->allow_ref_frame_mvs needs to be written into the frame header
3614   // while cm->tiles.large_scale is 1, therefore, "cm->tiles.large_scale=1" case
3615   // is separated from frame_might_allow_ref_frame_mvs().
3616   features->allow_ref_frame_mvs &= !cm->tiles.large_scale;
3617 
3618   features->allow_warped_motion = oxcf->motion_mode_cfg.allow_warped_motion &&
3619                                   frame_might_allow_warped_motion(cm);
3620 
3621   cpi->last_frame_type = current_frame->frame_type;
3622 
3623   if (frame_is_intra_only(cm)) {
3624     cpi->frames_since_last_update = 0;
3625   }
3626 
3627   if (frame_is_sframe(cm)) {
3628     GF_GROUP *gf_group = &cpi->ppi->gf_group;
3629     // S frame will wipe out any previously encoded altref so we cannot place
3630     // an overlay frame
3631     gf_group->update_type[gf_group->size] = GF_UPDATE;
3632   }
3633 
3634   if (encode_show_existing_frame(cm)) {
3635 #if CONFIG_RATECTRL_LOG && CONFIG_THREE_PASS && CONFIG_BITRATE_ACCURACY
3636     // TODO(angiebird): Move this into a function.
3637     if (oxcf->pass == AOM_RC_THIRD_PASS) {
3638       int frame_coding_idx =
3639           av1_vbr_rc_frame_coding_idx(&cpi->vbr_rc_info, cpi->gf_frame_index);
3640       rc_log_frame_encode_param(
3641           &cpi->rc_log, frame_coding_idx, 1, 255,
3642           cpi->ppi->gf_group.update_type[cpi->gf_frame_index]);
3643     }
3644 #endif
3645     av1_finalize_encoded_frame(cpi);
3646     // Build the bitstream
3647     int largest_tile_id = 0;  // Output from bitstream: unused here
3648     cpi->rc.coefficient_size = 0;
3649     if (av1_pack_bitstream(cpi, dest, dest_size, size, &largest_tile_id) !=
3650         AOM_CODEC_OK)
3651       return AOM_CODEC_ERROR;
3652 
3653     if (seq_params->frame_id_numbers_present_flag &&
3654         current_frame->frame_type == KEY_FRAME) {
3655       // Displaying a forward key-frame, so reset the ref buffer IDs
3656       int display_frame_id = cm->ref_frame_id[cpi->existing_fb_idx_to_show];
3657       for (int i = 0; i < REF_FRAMES; i++)
3658         cm->ref_frame_id[i] = display_frame_id;
3659     }
3660 
3661 #if DUMP_RECON_FRAMES == 1
3662     // NOTE(zoeliu): For debug - Output the filtered reconstructed video.
3663     av1_dump_filtered_recon_frames(cpi);
3664 #endif  // DUMP_RECON_FRAMES
3665 
3666     // NOTE: Save the new show frame buffer index for --test-code=warn, i.e.,
3667     //       for the purpose to verify no mismatch between encoder and decoder.
3668     if (cm->show_frame) cpi->last_show_frame_buf = cm->cur_frame;
3669 
3670 #if CONFIG_AV1_TEMPORAL_DENOISING
3671     av1_denoiser_update_ref_frame(cpi);
3672 #endif
3673 
3674     // Since we allocate a spot for the OVERLAY frame in the gf group, we need
3675     // to do post-encoding update accordingly.
3676     av1_set_target_rate(cpi, cm->width, cm->height);
3677 
3678     if (is_psnr_calc_enabled(cpi)) {
3679       cpi->source =
3680           realloc_and_scale_source(cpi, cm->cur_frame->buf.y_crop_width,
3681                                    cm->cur_frame->buf.y_crop_height);
3682     }
3683 
3684 #if !CONFIG_REALTIME_ONLY
3685     if (cpi->use_ducky_encode) {
3686       PSNR_STATS psnr;
3687       aom_calc_psnr(cpi->source, &cpi->common.cur_frame->buf, &psnr);
3688       DuckyEncodeFrameResult *frame_result =
3689           &cpi->ducky_encode_info.frame_result;
3690       frame_result->global_order_idx = cm->cur_frame->display_order_hint;
3691       frame_result->q_index = cm->quant_params.base_qindex;
3692       frame_result->rdmult = cpi->rd.RDMULT;
3693       frame_result->rate = (int)(*size) * 8;
3694       frame_result->dist = psnr.sse[0];
3695       frame_result->psnr = psnr.psnr[0];
3696     }
3697 #endif  // !CONFIG_REALTIME_ONLY
3698 
3699     update_counters_for_show_frame(cpi);
3700     return AOM_CODEC_OK;
3701   }
3702 
3703   // Work out whether to force_integer_mv this frame
3704   if (!is_stat_generation_stage(cpi) &&
3705       cpi->common.features.allow_screen_content_tools &&
3706       !frame_is_intra_only(cm) && !cpi->sf.rt_sf.use_nonrd_pick_mode) {
3707     if (cpi->common.seq_params->force_integer_mv == 2) {
3708       // Adaptive mode: see what previous frame encoded did
3709       if (cpi->unscaled_last_source != NULL) {
3710         features->cur_frame_force_integer_mv = av1_is_integer_mv(
3711             cpi->source, cpi->unscaled_last_source, &cpi->force_intpel_info);
3712       } else {
3713         cpi->common.features.cur_frame_force_integer_mv = 0;
3714       }
3715     } else {
3716       cpi->common.features.cur_frame_force_integer_mv =
3717           cpi->common.seq_params->force_integer_mv;
3718     }
3719   } else {
3720     cpi->common.features.cur_frame_force_integer_mv = 0;
3721   }
3722 
3723   // This is used by av1_pack_bitstream. So this needs to be set in case of
3724   // row-mt where the encoding code will use a temporary structure.
3725   cpi->td.mb.e_mbd.cur_frame_force_integer_mv =
3726       cpi->common.features.cur_frame_force_integer_mv;
3727 
3728   // Set default state for segment based loop filter update flags.
3729   cm->lf.mode_ref_delta_update = 0;
3730 
3731   // Set various flags etc to special state if it is a key frame.
3732   if (frame_is_intra_only(cm) || frame_is_sframe(cm)) {
3733     // Reset the loop filter deltas and segmentation map.
3734     av1_reset_segment_features(cm);
3735 
3736     // If segmentation is enabled force a map update for key frames.
3737     if (seg->enabled) {
3738       seg->update_map = 1;
3739       seg->update_data = 1;
3740     }
3741   }
3742   if (tile_cfg->mtu == 0) {
3743     cpi->num_tg = tile_cfg->num_tile_groups;
3744   } else {
3745     // Use a default value for the purposes of weighting costs in probability
3746     // updates
3747     cpi->num_tg = DEFAULT_MAX_NUM_TG;
3748   }
3749 
3750   // For 1 pass CBR mode: check if we are dropping this frame.
3751   if (has_no_stats_stage(cpi) && oxcf->rc_cfg.mode == AOM_CBR) {
3752     // Always drop for spatial enhancement layer if layer bandwidth is 0.
3753     // Otherwise check for frame-dropping based on buffer level in
3754     // av1_rc_drop_frame().
3755     if ((cpi->svc.spatial_layer_id > 0 &&
3756          cpi->oxcf.rc_cfg.target_bandwidth == 0) ||
3757         av1_rc_drop_frame(cpi)) {
3758       cpi->is_dropped_frame = true;
3759     }
3760     if (cpi->is_dropped_frame) {
3761       av1_setup_frame_size(cpi);
3762       av1_set_mv_search_params(cpi);
3763       av1_rc_postencode_update_drop_frame(cpi);
3764       release_scaled_references(cpi);
3765       cpi->ppi->gf_group.is_frame_dropped[cpi->gf_frame_index] = true;
3766       // A dropped frame might not be shown but it always takes a slot in the gf
3767       // group. Therefore, even when it is not shown, we still need to update
3768       // the relevant frame counters.
3769       if (cm->show_frame) {
3770         update_counters_for_show_frame(cpi);
3771       }
3772       return AOM_CODEC_OK;
3773     }
3774   }
3775 
3776   if (oxcf->tune_cfg.tuning == AOM_TUNE_SSIM ||
3777       oxcf->tune_cfg.tuning == AOM_TUNE_IQ) {
3778     av1_set_mb_ssim_rdmult_scaling(cpi);
3779   }
3780 #if CONFIG_SALIENCY_MAP
3781   else if (oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_SALIENCY_MAP &&
3782            !(cpi->source->flags & YV12_FLAG_HIGHBITDEPTH)) {
3783     if (av1_set_saliency_map(cpi) == 0) {
3784       return AOM_CODEC_MEM_ERROR;
3785     }
3786 #if !CONFIG_REALTIME_ONLY
3787     double motion_ratio = av1_setup_motion_ratio(cpi);
3788 #else
3789     double motion_ratio = 1.0;
3790 #endif
3791     if (av1_setup_sm_rdmult_scaling_factor(cpi, motion_ratio) == 0) {
3792       return AOM_CODEC_MEM_ERROR;
3793     }
3794   }
3795 #endif
3796 #if CONFIG_TUNE_VMAF
3797   else if (oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_WITHOUT_PREPROCESSING ||
3798            oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_MAX_GAIN ||
3799            oxcf->tune_cfg.tuning == AOM_TUNE_VMAF_NEG_MAX_GAIN) {
3800     av1_set_mb_vmaf_rdmult_scaling(cpi);
3801   }
3802 #endif
3803 
3804   if (cpi->oxcf.q_cfg.deltaq_mode == DELTA_Q_PERCEPTUAL_AI &&
3805       cpi->sf.rt_sf.use_nonrd_pick_mode == 0) {
3806     av1_init_mb_wiener_var_buffer(cpi);
3807     av1_set_mb_wiener_variance(cpi);
3808   }
3809 
3810   if (cpi->oxcf.q_cfg.deltaq_mode == DELTA_Q_USER_RATING_BASED) {
3811     av1_init_mb_ur_var_buffer(cpi);
3812     av1_set_mb_ur_variance(cpi);
3813   }
3814 
3815 #if CONFIG_INTERNAL_STATS
3816   memset(cpi->mode_chosen_counts, 0,
3817          MAX_MODES * sizeof(*cpi->mode_chosen_counts));
3818 #endif
3819 
3820   if (seq_params->frame_id_numbers_present_flag) {
3821     /* Non-normative definition of current_frame_id ("frame counter" with
3822      * wraparound) */
3823     if (cm->current_frame_id == -1) {
3824       int lsb, msb;
3825       /* quasi-random initialization of current_frame_id for a key frame */
3826       if (cpi->source->flags & YV12_FLAG_HIGHBITDEPTH) {
3827         lsb = CONVERT_TO_SHORTPTR(cpi->source->y_buffer)[0] & 0xff;
3828         msb = CONVERT_TO_SHORTPTR(cpi->source->y_buffer)[1] & 0xff;
3829       } else {
3830         lsb = cpi->source->y_buffer[0] & 0xff;
3831         msb = cpi->source->y_buffer[1] & 0xff;
3832       }
3833       cm->current_frame_id =
3834           ((msb << 8) + lsb) % (1 << seq_params->frame_id_length);
3835 
3836       // S_frame is meant for stitching different streams of different
3837       // resolutions together, so current_frame_id must be the
3838       // same across different streams of the same content current_frame_id
3839       // should be the same and not random. 0x37 is a chosen number as start
3840       // point
3841       if (oxcf->kf_cfg.sframe_dist != 0) cm->current_frame_id = 0x37;
3842     } else {
3843       cm->current_frame_id =
3844           (cm->current_frame_id + 1 + (1 << seq_params->frame_id_length)) %
3845           (1 << seq_params->frame_id_length);
3846     }
3847   }
3848 
3849   switch (oxcf->algo_cfg.cdf_update_mode) {
3850     case 0:  // No CDF update for any frames(4~6% compression loss).
3851       features->disable_cdf_update = 1;
3852       break;
3853     case 1:  // Enable CDF update for all frames.
3854       if (cpi->sf.rt_sf.disable_cdf_update_non_reference_frame &&
3855           cpi->ppi->rtc_ref.non_reference_frame && cpi->rc.frames_since_key > 2)
3856         features->disable_cdf_update = 1;
3857       else if (cpi->sf.rt_sf.selective_cdf_update)
3858         features->disable_cdf_update = selective_disable_cdf_rtc(cpi);
3859       else
3860         features->disable_cdf_update = 0;
3861       break;
3862     case 2:
3863       // Strategically determine at which frames to do CDF update.
3864       // Currently only enable CDF update for all-intra and no-show frames(1.5%
3865       // compression loss) for good qualiy or allintra mode.
3866       if (oxcf->mode == GOOD || oxcf->mode == ALLINTRA) {
3867         features->disable_cdf_update =
3868             (frame_is_intra_only(cm) || !cm->show_frame) ? 0 : 1;
3869       } else {
3870         features->disable_cdf_update = selective_disable_cdf_rtc(cpi);
3871       }
3872       break;
3873   }
3874 
3875   // Disable cdf update for the INTNL_ARF_UPDATE frame with
3876   // frame_parallel_level 1.
3877   if (!cpi->do_frame_data_update &&
3878       cpi->ppi->gf_group.update_type[cpi->gf_frame_index] == INTNL_ARF_UPDATE) {
3879     assert(cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] == 1);
3880     features->disable_cdf_update = 1;
3881   }
3882 
3883 #if !CONFIG_REALTIME_ONLY
3884   if (cpi->oxcf.tool_cfg.enable_global_motion && !frame_is_intra_only(cm)) {
3885     // Flush any stale global motion information, which may be left over
3886     // from a previous frame
3887     aom_invalidate_pyramid(cpi->source->y_pyramid);
3888     av1_invalidate_corner_list(cpi->source->corners);
3889   }
3890 #endif  // !CONFIG_REALTIME_ONLY
3891 
3892   int largest_tile_id = 0;
3893   if (av1_superres_in_recode_allowed(cpi)) {
3894     if (encode_with_and_without_superres(cpi, size, dest, dest_size,
3895                                          &largest_tile_id) != AOM_CODEC_OK) {
3896       return AOM_CODEC_ERROR;
3897     }
3898   } else {
3899     const aom_superres_mode orig_superres_mode = cpi->superres_mode;  // save
3900     cpi->superres_mode = cpi->oxcf.superres_cfg.superres_mode;
3901     if (encode_with_recode_loop_and_filter(cpi, size, dest, dest_size, NULL,
3902                                            NULL,
3903                                            &largest_tile_id) != AOM_CODEC_OK) {
3904       return AOM_CODEC_ERROR;
3905     }
3906     cpi->superres_mode = orig_superres_mode;  // restore
3907   }
3908 
3909   // Update reference frame ids for reference frames this frame will overwrite
3910   if (seq_params->frame_id_numbers_present_flag) {
3911     for (int i = 0; i < REF_FRAMES; i++) {
3912       if ((current_frame->refresh_frame_flags >> i) & 1) {
3913         cm->ref_frame_id[i] = cm->current_frame_id;
3914       }
3915     }
3916   }
3917 
3918   if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
3919     cpi->svc.num_encoded_top_layer++;
3920 
3921 #if DUMP_RECON_FRAMES == 1
3922   // NOTE(zoeliu): For debug - Output the filtered reconstructed video.
3923   av1_dump_filtered_recon_frames(cpi);
3924 #endif  // DUMP_RECON_FRAMES
3925 
3926   if (cm->seg.enabled) {
3927     if (cm->seg.update_map == 0 && cm->last_frame_seg_map) {
3928       memcpy(cm->cur_frame->seg_map, cm->last_frame_seg_map,
3929              cm->cur_frame->mi_cols * cm->cur_frame->mi_rows *
3930                  sizeof(*cm->cur_frame->seg_map));
3931     }
3932   }
3933 
3934   int release_scaled_refs = 0;
3935 #if CONFIG_FPMT_TEST
3936   release_scaled_refs =
3937       (cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE) ? 1 : 0;
3938 #endif  // CONFIG_FPMT_TEST
3939   if (release_scaled_refs ||
3940       cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] == 0) {
3941     if (frame_is_intra_only(cm) == 0) {
3942       release_scaled_references(cpi);
3943     }
3944   }
3945 #if CONFIG_AV1_TEMPORAL_DENOISING
3946   av1_denoiser_update_ref_frame(cpi);
3947 #endif
3948 
3949   // NOTE: Save the new show frame buffer index for --test-code=warn, i.e.,
3950   //       for the purpose to verify no mismatch between encoder and decoder.
3951   if (cm->show_frame) cpi->last_show_frame_buf = cm->cur_frame;
3952 
3953   if (features->refresh_frame_context == REFRESH_FRAME_CONTEXT_BACKWARD) {
3954     *cm->fc = cpi->tile_data[largest_tile_id].tctx;
3955     av1_reset_cdf_symbol_counters(cm->fc);
3956   }
3957   if (!cm->tiles.large_scale) {
3958     cm->cur_frame->frame_context = *cm->fc;
3959   }
3960 
3961   if (tile_cfg->enable_ext_tile_debug) {
3962     // (yunqing) This test ensures the correctness of large scale tile coding.
3963     if (cm->tiles.large_scale && is_stat_consumption_stage(cpi)) {
3964       char fn[20] = "./fc";
3965       fn[4] = current_frame->frame_number / 100 + '0';
3966       fn[5] = (current_frame->frame_number % 100) / 10 + '0';
3967       fn[6] = (current_frame->frame_number % 10) + '0';
3968       fn[7] = '\0';
3969       av1_print_frame_contexts(cm->fc, fn);
3970     }
3971   }
3972 
3973   cpi->last_frame_type = current_frame->frame_type;
3974 
3975   if (cm->features.disable_cdf_update) {
3976     cpi->frames_since_last_update++;
3977   } else {
3978     cpi->frames_since_last_update = 1;
3979   }
3980 
3981   if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1)
3982     cpi->svc.prev_number_spatial_layers = cpi->svc.number_spatial_layers;
3983 
3984   // Clear the one shot update flags for segmentation map and mode/ref loop
3985   // filter deltas.
3986   cm->seg.update_map = 0;
3987   cm->seg.update_data = 0;
3988   cm->lf.mode_ref_delta_update = 0;
3989 
3990   if (cm->show_frame) {
3991     update_counters_for_show_frame(cpi);
3992   }
3993 
3994 #if CONFIG_COLLECT_COMPONENT_TIMING
3995   end_timing(cpi, encode_frame_to_data_rate_time);
3996 #endif
3997 
3998   return AOM_CODEC_OK;
3999 }
4000 
av1_encode(AV1_COMP * const cpi,uint8_t * const dest,size_t dest_size,const EncodeFrameInput * const frame_input,const EncodeFrameParams * const frame_params,size_t * const frame_size)4001 int av1_encode(AV1_COMP *const cpi, uint8_t *const dest, size_t dest_size,
4002                const EncodeFrameInput *const frame_input,
4003                const EncodeFrameParams *const frame_params,
4004                size_t *const frame_size) {
4005   AV1_COMMON *const cm = &cpi->common;
4006   CurrentFrame *const current_frame = &cm->current_frame;
4007 
4008   cpi->unscaled_source = frame_input->source;
4009   cpi->source = frame_input->source;
4010   cpi->unscaled_last_source = frame_input->last_source;
4011 
4012   current_frame->refresh_frame_flags = frame_params->refresh_frame_flags;
4013   cm->features.error_resilient_mode = frame_params->error_resilient_mode;
4014   cm->features.primary_ref_frame = frame_params->primary_ref_frame;
4015   cm->current_frame.frame_type = frame_params->frame_type;
4016   cm->show_frame = frame_params->show_frame;
4017   cpi->ref_frame_flags = frame_params->ref_frame_flags;
4018   cpi->speed = frame_params->speed;
4019   cm->show_existing_frame = frame_params->show_existing_frame;
4020   cpi->existing_fb_idx_to_show = frame_params->existing_fb_idx_to_show;
4021 
4022   memcpy(cm->remapped_ref_idx, frame_params->remapped_ref_idx,
4023          REF_FRAMES * sizeof(*cm->remapped_ref_idx));
4024 
4025   memcpy(&cpi->refresh_frame, &frame_params->refresh_frame,
4026          sizeof(cpi->refresh_frame));
4027 
4028   if (current_frame->frame_type == KEY_FRAME &&
4029       cpi->ppi->gf_group.refbuf_state[cpi->gf_frame_index] == REFBUF_RESET) {
4030     current_frame->frame_number = 0;
4031   }
4032 
4033   current_frame->order_hint =
4034       current_frame->frame_number + frame_params->order_offset;
4035 
4036   current_frame->display_order_hint = current_frame->order_hint;
4037   current_frame->order_hint %=
4038       (1 << (cm->seq_params->order_hint_info.order_hint_bits_minus_1 + 1));
4039 
4040   current_frame->pyramid_level = get_true_pyr_level(
4041       cpi->ppi->gf_group.layer_depth[cpi->gf_frame_index],
4042       current_frame->display_order_hint, cpi->ppi->gf_group.max_layer_depth);
4043 
4044   if (is_stat_generation_stage(cpi)) {
4045 #if !CONFIG_REALTIME_ONLY
4046     if (cpi->oxcf.q_cfg.use_fixed_qp_offsets)
4047       av1_noop_first_pass_frame(cpi, frame_input->ts_duration);
4048     else
4049       av1_first_pass(cpi, frame_input->ts_duration);
4050 #endif
4051   } else if (cpi->oxcf.pass == AOM_RC_ONE_PASS ||
4052              cpi->oxcf.pass >= AOM_RC_SECOND_PASS) {
4053     if (encode_frame_to_data_rate(cpi, frame_size, dest, dest_size) !=
4054         AOM_CODEC_OK) {
4055       return AOM_CODEC_ERROR;
4056     }
4057   } else {
4058     return AOM_CODEC_ERROR;
4059   }
4060 
4061   return AOM_CODEC_OK;
4062 }
4063 
4064 #if CONFIG_DENOISE && !CONFIG_REALTIME_ONLY
apply_denoise_2d(AV1_COMP * cpi,const YV12_BUFFER_CONFIG * sd,int block_size,float noise_level,int64_t time_stamp,int64_t end_time)4065 static int apply_denoise_2d(AV1_COMP *cpi, const YV12_BUFFER_CONFIG *sd,
4066                             int block_size, float noise_level,
4067                             int64_t time_stamp, int64_t end_time) {
4068   AV1_COMMON *const cm = &cpi->common;
4069   if (!cpi->denoise_and_model) {
4070     cpi->denoise_and_model = aom_denoise_and_model_alloc(
4071         cm->seq_params->bit_depth, block_size, noise_level);
4072     if (!cpi->denoise_and_model) {
4073       aom_set_error(cm->error, AOM_CODEC_MEM_ERROR,
4074                     "Error allocating denoise and model");
4075       return -1;
4076     }
4077   }
4078   if (!cpi->film_grain_table) {
4079     cpi->film_grain_table = aom_malloc(sizeof(*cpi->film_grain_table));
4080     if (!cpi->film_grain_table) {
4081       aom_set_error(cm->error, AOM_CODEC_MEM_ERROR,
4082                     "Error allocating grain table");
4083       return -1;
4084     }
4085     memset(cpi->film_grain_table, 0, sizeof(*cpi->film_grain_table));
4086   }
4087   if (aom_denoise_and_model_run(cpi->denoise_and_model, sd,
4088                                 &cm->film_grain_params,
4089                                 cpi->oxcf.enable_dnl_denoising)) {
4090     if (cm->film_grain_params.apply_grain) {
4091       aom_film_grain_table_append(cpi->film_grain_table, time_stamp, end_time,
4092                                   &cm->film_grain_params);
4093     }
4094   }
4095   return 0;
4096 }
4097 #endif
4098 
av1_receive_raw_frame(AV1_COMP * cpi,aom_enc_frame_flags_t frame_flags,const YV12_BUFFER_CONFIG * sd,int64_t time_stamp,int64_t end_time)4099 int av1_receive_raw_frame(AV1_COMP *cpi, aom_enc_frame_flags_t frame_flags,
4100                           const YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
4101                           int64_t end_time) {
4102   AV1_COMMON *const cm = &cpi->common;
4103   const SequenceHeader *const seq_params = cm->seq_params;
4104   int res = 0;
4105   const int subsampling_x = sd->subsampling_x;
4106   const int subsampling_y = sd->subsampling_y;
4107   const int use_highbitdepth = (sd->flags & YV12_FLAG_HIGHBITDEPTH) != 0;
4108 
4109 #if CONFIG_TUNE_VMAF
4110   if (!is_stat_generation_stage(cpi) &&
4111       cpi->oxcf.tune_cfg.tuning == AOM_TUNE_VMAF_WITH_PREPROCESSING) {
4112     av1_vmaf_frame_preprocessing(cpi, sd);
4113   }
4114   if (!is_stat_generation_stage(cpi) &&
4115       cpi->oxcf.tune_cfg.tuning == AOM_TUNE_VMAF_MAX_GAIN) {
4116     av1_vmaf_blk_preprocessing(cpi, sd);
4117   }
4118 #endif
4119 
4120 #if CONFIG_INTERNAL_STATS
4121   struct aom_usec_timer timer;
4122   aom_usec_timer_start(&timer);
4123 #endif
4124 
4125 #if CONFIG_AV1_TEMPORAL_DENOISING
4126   setup_denoiser_buffer(cpi);
4127 #endif
4128 
4129 #if CONFIG_DENOISE
4130   // even if denoise_noise_level is > 0, we don't need need to denoise on pass
4131   // 1 of 2 if enable_dnl_denoising is disabled since the 2nd pass will be
4132   // encoding the original (non-denoised) frame
4133   if (cpi->oxcf.noise_level > 0 && !(cpi->oxcf.pass == AOM_RC_FIRST_PASS &&
4134                                      !cpi->oxcf.enable_dnl_denoising)) {
4135 #if !CONFIG_REALTIME_ONLY
4136     // Choose a synthetic noise level for still images for enhanced perceptual
4137     // quality based on an estimated noise level in the source, but only if
4138     // the noise level is set on the command line to > 0.
4139     if (cpi->oxcf.mode == ALLINTRA) {
4140       // No noise synthesis if source is very clean.
4141       // Uses a low edge threshold to focus on smooth areas.
4142       // Increase output noise setting a little compared to measured value.
4143       double y_noise_level = 0.0;
4144       av1_estimate_noise_level(sd, &y_noise_level, AOM_PLANE_Y, AOM_PLANE_Y,
4145                                cm->seq_params->bit_depth, 16);
4146       cpi->oxcf.noise_level = (float)(y_noise_level - 0.1);
4147       cpi->oxcf.noise_level = (float)AOMMAX(0.0, cpi->oxcf.noise_level);
4148       if (cpi->oxcf.noise_level > 0.0) {
4149         cpi->oxcf.noise_level += (float)0.5;
4150       }
4151       cpi->oxcf.noise_level = (float)AOMMIN(5.0, cpi->oxcf.noise_level);
4152     }
4153 
4154     if (apply_denoise_2d(cpi, sd, cpi->oxcf.noise_block_size,
4155                          cpi->oxcf.noise_level, time_stamp, end_time) < 0)
4156       res = -1;
4157 #endif  // !CONFIG_REALTIME_ONLY
4158   }
4159 #endif  //  CONFIG_DENOISE
4160 
4161   if (av1_lookahead_push(cpi->ppi->lookahead, sd, time_stamp, end_time,
4162                          use_highbitdepth, cpi->alloc_pyramid, frame_flags)) {
4163     aom_set_error(cm->error, AOM_CODEC_ERROR, "av1_lookahead_push() failed");
4164     res = -1;
4165   }
4166 #if CONFIG_INTERNAL_STATS
4167   aom_usec_timer_mark(&timer);
4168   cpi->ppi->total_time_receive_data += aom_usec_timer_elapsed(&timer);
4169 #endif
4170 
4171   // Note: Regarding profile setting, the following checks are added to help
4172   // choose a proper profile for the input video. The criterion is that all
4173   // bitstreams must be designated as the lowest profile that match its content.
4174   // E.G. A bitstream that contains 4:4:4 video must be designated as High
4175   // Profile in the seq header, and likewise a bitstream that contains 4:2:2
4176   // bitstream must be designated as Professional Profile in the sequence
4177   // header.
4178   if ((seq_params->profile == PROFILE_0) && !seq_params->monochrome &&
4179       (subsampling_x != 1 || subsampling_y != 1)) {
4180     aom_set_error(cm->error, AOM_CODEC_INVALID_PARAM,
4181                   "Non-4:2:0 color format requires profile 1 or 2");
4182     res = -1;
4183   }
4184   if ((seq_params->profile == PROFILE_1) &&
4185       !(subsampling_x == 0 && subsampling_y == 0)) {
4186     aom_set_error(cm->error, AOM_CODEC_INVALID_PARAM,
4187                   "Profile 1 requires 4:4:4 color format");
4188     res = -1;
4189   }
4190   if ((seq_params->profile == PROFILE_2) &&
4191       (seq_params->bit_depth <= AOM_BITS_10) &&
4192       !(subsampling_x == 1 && subsampling_y == 0)) {
4193     aom_set_error(cm->error, AOM_CODEC_INVALID_PARAM,
4194                   "Profile 2 bit-depth <= 10 requires 4:2:2 color format");
4195     res = -1;
4196   }
4197 
4198   return res;
4199 }
4200 
4201 #if CONFIG_ENTROPY_STATS
print_entropy_stats(AV1_PRIMARY * const ppi)4202 void print_entropy_stats(AV1_PRIMARY *const ppi) {
4203   if (!ppi->cpi) return;
4204 
4205   if (ppi->cpi->oxcf.pass != 1 &&
4206       ppi->cpi->common.current_frame.frame_number > 0) {
4207     fprintf(stderr, "Writing counts.stt\n");
4208     FILE *f = fopen("counts.stt", "wb");
4209     fwrite(&ppi->aggregate_fc, sizeof(ppi->aggregate_fc), 1, f);
4210     fclose(f);
4211   }
4212 }
4213 #endif  // CONFIG_ENTROPY_STATS
4214 
4215 #if CONFIG_INTERNAL_STATS
adjust_image_stat(double y,double u,double v,double all,ImageStat * s)4216 static void adjust_image_stat(double y, double u, double v, double all,
4217                               ImageStat *s) {
4218   s->stat[STAT_Y] += y;
4219   s->stat[STAT_U] += u;
4220   s->stat[STAT_V] += v;
4221   s->stat[STAT_ALL] += all;
4222   s->worst = AOMMIN(s->worst, all);
4223 }
4224 
compute_internal_stats(AV1_COMP * cpi,int frame_bytes)4225 static void compute_internal_stats(AV1_COMP *cpi, int frame_bytes) {
4226   AV1_PRIMARY *const ppi = cpi->ppi;
4227   AV1_COMMON *const cm = &cpi->common;
4228   double samples = 0.0;
4229   const uint32_t in_bit_depth = cpi->oxcf.input_cfg.input_bit_depth;
4230   const uint32_t bit_depth = cpi->td.mb.e_mbd.bd;
4231 
4232   if (cpi->ppi->use_svc &&
4233       cpi->svc.spatial_layer_id < cpi->svc.number_spatial_layers - 1)
4234     return;
4235 
4236 #if CONFIG_INTER_STATS_ONLY
4237   if (cm->current_frame.frame_type == KEY_FRAME) return;  // skip key frame
4238 #endif
4239   cpi->bytes += frame_bytes;
4240   if (cm->show_frame) {
4241     const YV12_BUFFER_CONFIG *orig = cpi->source;
4242     const YV12_BUFFER_CONFIG *recon = &cpi->common.cur_frame->buf;
4243     double y, u, v, frame_all;
4244 
4245     ppi->count[0]++;
4246     ppi->count[1]++;
4247     if (cpi->ppi->b_calculate_psnr) {
4248       PSNR_STATS psnr;
4249       double weight[2] = { 0.0, 0.0 };
4250       double frame_ssim2[2] = { 0.0, 0.0 };
4251 #if CONFIG_AV1_HIGHBITDEPTH
4252       aom_calc_highbd_psnr(orig, recon, &psnr, bit_depth, in_bit_depth);
4253 #else
4254       aom_calc_psnr(orig, recon, &psnr);
4255 #endif
4256       adjust_image_stat(psnr.psnr[1], psnr.psnr[2], psnr.psnr[3], psnr.psnr[0],
4257                         &(ppi->psnr[0]));
4258       ppi->total_sq_error[0] += psnr.sse[0];
4259       ppi->total_samples[0] += psnr.samples[0];
4260       samples = psnr.samples[0];
4261 
4262       aom_calc_ssim(orig, recon, bit_depth, in_bit_depth,
4263                     cm->seq_params->use_highbitdepth, weight, frame_ssim2);
4264 
4265       ppi->worst_ssim = AOMMIN(ppi->worst_ssim, frame_ssim2[0]);
4266       ppi->summed_quality += frame_ssim2[0] * weight[0];
4267       ppi->summed_weights += weight[0];
4268 
4269 #if CONFIG_AV1_HIGHBITDEPTH
4270       // Compute PSNR based on stream bit depth
4271       if ((cpi->source->flags & YV12_FLAG_HIGHBITDEPTH) &&
4272           (in_bit_depth < bit_depth)) {
4273         adjust_image_stat(psnr.psnr_hbd[1], psnr.psnr_hbd[2], psnr.psnr_hbd[3],
4274                           psnr.psnr_hbd[0], &ppi->psnr[1]);
4275         ppi->total_sq_error[1] += psnr.sse_hbd[0];
4276         ppi->total_samples[1] += psnr.samples_hbd[0];
4277 
4278         ppi->worst_ssim_hbd = AOMMIN(ppi->worst_ssim_hbd, frame_ssim2[1]);
4279         ppi->summed_quality_hbd += frame_ssim2[1] * weight[1];
4280         ppi->summed_weights_hbd += weight[1];
4281       }
4282 #endif
4283 
4284 #if 0
4285       {
4286         FILE *f = fopen("q_used.stt", "a");
4287         double y2 = psnr.psnr[1];
4288         double u2 = psnr.psnr[2];
4289         double v2 = psnr.psnr[3];
4290         double frame_psnr2 = psnr.psnr[0];
4291         fprintf(f, "%5d : Y%f7.3:U%f7.3:V%f7.3:F%f7.3:S%7.3f\n",
4292                 cm->current_frame.frame_number, y2, u2, v2,
4293                 frame_psnr2, frame_ssim2);
4294         fclose(f);
4295       }
4296 #endif
4297     }
4298     if (ppi->b_calculate_blockiness) {
4299       if (!cm->seq_params->use_highbitdepth) {
4300         const double frame_blockiness =
4301             av1_get_blockiness(orig->y_buffer, orig->y_stride, recon->y_buffer,
4302                                recon->y_stride, orig->y_width, orig->y_height);
4303         ppi->worst_blockiness = AOMMAX(ppi->worst_blockiness, frame_blockiness);
4304         ppi->total_blockiness += frame_blockiness;
4305       }
4306 
4307       if (ppi->b_calculate_consistency) {
4308         if (!cm->seq_params->use_highbitdepth) {
4309           const double this_inconsistency = aom_get_ssim_metrics(
4310               orig->y_buffer, orig->y_stride, recon->y_buffer, recon->y_stride,
4311               orig->y_width, orig->y_height, ppi->ssim_vars, &ppi->metrics, 1);
4312 
4313           const double peak = (double)((1 << in_bit_depth) - 1);
4314           const double consistency =
4315               aom_sse_to_psnr(samples, peak, ppi->total_inconsistency);
4316           if (consistency > 0.0)
4317             ppi->worst_consistency =
4318                 AOMMIN(ppi->worst_consistency, consistency);
4319           ppi->total_inconsistency += this_inconsistency;
4320         }
4321       }
4322     }
4323 
4324     frame_all =
4325         aom_calc_fastssim(orig, recon, &y, &u, &v, bit_depth, in_bit_depth);
4326     adjust_image_stat(y, u, v, frame_all, &ppi->fastssim);
4327     frame_all = aom_psnrhvs(orig, recon, &y, &u, &v, bit_depth, in_bit_depth);
4328     adjust_image_stat(y, u, v, frame_all, &ppi->psnrhvs);
4329   }
4330 }
4331 
print_internal_stats(AV1_PRIMARY * ppi)4332 void print_internal_stats(AV1_PRIMARY *ppi) {
4333   if (!ppi->cpi) return;
4334   AV1_COMP *const cpi = ppi->cpi;
4335 
4336   if (ppi->cpi->oxcf.pass != 1 &&
4337       ppi->cpi->common.current_frame.frame_number > 0) {
4338     char headings[512] = { 0 };
4339     char results[512] = { 0 };
4340     FILE *f = fopen("opsnr.stt", "a");
4341     double time_encoded =
4342         (cpi->time_stamps.prev_ts_end - cpi->time_stamps.first_ts_start) /
4343         10000000.000;
4344     double total_encode_time =
4345         (ppi->total_time_receive_data + ppi->total_time_compress_data) /
4346         1000.000;
4347     const double dr =
4348         (double)ppi->total_bytes * (double)8 / (double)1000 / time_encoded;
4349     const double peak =
4350         (double)((1 << ppi->cpi->oxcf.input_cfg.input_bit_depth) - 1);
4351     const double target_rate =
4352         (double)ppi->cpi->oxcf.rc_cfg.target_bandwidth / 1000;
4353     const double rate_err = ((100.0 * (dr - target_rate)) / target_rate);
4354 
4355     if (ppi->b_calculate_psnr) {
4356       const double total_psnr = aom_sse_to_psnr(
4357           (double)ppi->total_samples[0], peak, (double)ppi->total_sq_error[0]);
4358       const double total_ssim =
4359           100 * pow(ppi->summed_quality / ppi->summed_weights, 8.0);
4360       snprintf(headings, sizeof(headings),
4361                "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
4362                "AOMSSIM\tVPSSIMP\tFASTSIM\tPSNRHVS\t"
4363                "WstPsnr\tWstSsim\tWstFast\tWstHVS\t"
4364                "AVPsrnY\tAPsnrCb\tAPsnrCr");
4365       snprintf(results, sizeof(results),
4366                "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
4367                "%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
4368                "%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
4369                "%7.3f\t%7.3f\t%7.3f",
4370                dr, ppi->psnr[0].stat[STAT_ALL] / ppi->count[0], total_psnr,
4371                ppi->psnr[0].stat[STAT_ALL] / ppi->count[0], total_psnr,
4372                total_ssim, total_ssim,
4373                ppi->fastssim.stat[STAT_ALL] / ppi->count[0],
4374                ppi->psnrhvs.stat[STAT_ALL] / ppi->count[0], ppi->psnr[0].worst,
4375                ppi->worst_ssim, ppi->fastssim.worst, ppi->psnrhvs.worst,
4376                ppi->psnr[0].stat[STAT_Y] / ppi->count[0],
4377                ppi->psnr[0].stat[STAT_U] / ppi->count[0],
4378                ppi->psnr[0].stat[STAT_V] / ppi->count[0]);
4379 
4380       if (ppi->b_calculate_blockiness) {
4381         SNPRINT(headings, "\t  Block\tWstBlck");
4382         SNPRINT2(results, "\t%7.3f", ppi->total_blockiness / ppi->count[0]);
4383         SNPRINT2(results, "\t%7.3f", ppi->worst_blockiness);
4384       }
4385 
4386       if (ppi->b_calculate_consistency) {
4387         double consistency =
4388             aom_sse_to_psnr((double)ppi->total_samples[0], peak,
4389                             (double)ppi->total_inconsistency);
4390 
4391         SNPRINT(headings, "\tConsist\tWstCons");
4392         SNPRINT2(results, "\t%7.3f", consistency);
4393         SNPRINT2(results, "\t%7.3f", ppi->worst_consistency);
4394       }
4395 
4396       SNPRINT(headings, "\t   Time\tRcErr\tAbsErr");
4397       SNPRINT2(results, "\t%8.0f", total_encode_time);
4398       SNPRINT2(results, " %7.2f", rate_err);
4399       SNPRINT2(results, " %7.2f", fabs(rate_err));
4400 
4401       SNPRINT(headings, "\tAPsnr611");
4402       SNPRINT2(results, " %7.3f",
4403                (6 * ppi->psnr[0].stat[STAT_Y] + ppi->psnr[0].stat[STAT_U] +
4404                 ppi->psnr[0].stat[STAT_V]) /
4405                    (ppi->count[0] * 8));
4406 
4407 #if CONFIG_AV1_HIGHBITDEPTH
4408       const uint32_t in_bit_depth = ppi->cpi->oxcf.input_cfg.input_bit_depth;
4409       const uint32_t bit_depth = ppi->seq_params.bit_depth;
4410       // Since cpi->source->flags is not available here, but total_samples[1]
4411       // will be non-zero if cpi->source->flags & YV12_FLAG_HIGHBITDEPTH was
4412       // true in compute_internal_stats
4413       if ((ppi->total_samples[1] > 0) && (in_bit_depth < bit_depth)) {
4414         const double peak_hbd = (double)((1 << bit_depth) - 1);
4415         const double total_psnr_hbd =
4416             aom_sse_to_psnr((double)ppi->total_samples[1], peak_hbd,
4417                             (double)ppi->total_sq_error[1]);
4418         const double total_ssim_hbd =
4419             100 * pow(ppi->summed_quality_hbd / ppi->summed_weights_hbd, 8.0);
4420         SNPRINT(headings,
4421                 "\t AVGPsnrH GLBPsnrH AVPsnrPH GLPsnrPH"
4422                 " AVPsnrYH APsnrCbH APsnrCrH WstPsnrH"
4423                 " AOMSSIMH VPSSIMPH WstSsimH");
4424         SNPRINT2(results, "\t%7.3f",
4425                  ppi->psnr[1].stat[STAT_ALL] / ppi->count[1]);
4426         SNPRINT2(results, "  %7.3f", total_psnr_hbd);
4427         SNPRINT2(results, "  %7.3f",
4428                  ppi->psnr[1].stat[STAT_ALL] / ppi->count[1]);
4429         SNPRINT2(results, "  %7.3f", total_psnr_hbd);
4430         SNPRINT2(results, "  %7.3f", ppi->psnr[1].stat[STAT_Y] / ppi->count[1]);
4431         SNPRINT2(results, "  %7.3f", ppi->psnr[1].stat[STAT_U] / ppi->count[1]);
4432         SNPRINT2(results, "  %7.3f", ppi->psnr[1].stat[STAT_V] / ppi->count[1]);
4433         SNPRINT2(results, "  %7.3f", ppi->psnr[1].worst);
4434         SNPRINT2(results, "  %7.3f", total_ssim_hbd);
4435         SNPRINT2(results, "  %7.3f", total_ssim_hbd);
4436         SNPRINT2(results, "  %7.3f", ppi->worst_ssim_hbd);
4437       }
4438 #endif
4439       fprintf(f, "%s\n", headings);
4440       fprintf(f, "%s\n", results);
4441     }
4442 
4443     fclose(f);
4444 
4445     aom_free(ppi->ssim_vars);
4446     ppi->ssim_vars = NULL;
4447   }
4448 }
4449 #endif  // CONFIG_INTERNAL_STATS
4450 
update_keyframe_counters(AV1_COMP * cpi)4451 static inline void update_keyframe_counters(AV1_COMP *cpi) {
4452   if (cpi->common.show_frame && cpi->rc.frames_to_key) {
4453 #if !CONFIG_REALTIME_ONLY
4454     FIRSTPASS_INFO *firstpass_info = &cpi->ppi->twopass.firstpass_info;
4455     if (firstpass_info->past_stats_count > FIRSTPASS_INFO_STATS_PAST_MIN) {
4456       av1_firstpass_info_move_cur_index_and_pop(firstpass_info);
4457     } else {
4458       // When there is not enough past stats, we move the current
4459       // index without popping the past stats
4460       av1_firstpass_info_move_cur_index(firstpass_info);
4461     }
4462 #endif
4463     if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1) {
4464       cpi->rc.frames_since_key++;
4465       cpi->rc.frames_to_key--;
4466       cpi->rc.frames_to_fwd_kf--;
4467       cpi->rc.frames_since_scene_change++;
4468     }
4469   }
4470 }
4471 
update_frames_till_gf_update(AV1_COMP * cpi)4472 static inline void update_frames_till_gf_update(AV1_COMP *cpi) {
4473   // TODO(weitinglin): Updating this counter for is_frame_droppable
4474   // is a work-around to handle the condition when a frame is drop.
4475   // We should fix the cpi->common.show_frame flag
4476   // instead of checking the other condition to update the counter properly.
4477   if (cpi->common.show_frame ||
4478       is_frame_droppable(&cpi->ppi->rtc_ref, &cpi->ext_flags.refresh_frame)) {
4479     // Decrement count down till next gf
4480     if (cpi->rc.frames_till_gf_update_due > 0)
4481       cpi->rc.frames_till_gf_update_due--;
4482   }
4483 }
4484 
update_gf_group_index(AV1_COMP * cpi)4485 static inline void update_gf_group_index(AV1_COMP *cpi) {
4486   // Increment the gf group index ready for the next frame.
4487   if (is_one_pass_rt_params(cpi) &&
4488       cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1) {
4489     ++cpi->gf_frame_index;
4490     // Reset gf_frame_index in case it reaches MAX_STATIC_GF_GROUP_LENGTH
4491     // for real time encoding.
4492     if (cpi->gf_frame_index == MAX_STATIC_GF_GROUP_LENGTH)
4493       cpi->gf_frame_index = 0;
4494   } else {
4495     ++cpi->gf_frame_index;
4496   }
4497 }
4498 
update_fb_of_context_type(const AV1_COMP * const cpi,int * const fb_of_context_type)4499 static void update_fb_of_context_type(const AV1_COMP *const cpi,
4500                                       int *const fb_of_context_type) {
4501   const AV1_COMMON *const cm = &cpi->common;
4502   const int current_frame_ref_type = get_current_frame_ref_type(cpi);
4503 
4504   if (frame_is_intra_only(cm) || cm->features.error_resilient_mode ||
4505       cpi->ext_flags.use_primary_ref_none) {
4506     for (int i = 0; i < REF_FRAMES; i++) {
4507       fb_of_context_type[i] = -1;
4508     }
4509     fb_of_context_type[current_frame_ref_type] =
4510         cm->show_frame ? get_ref_frame_map_idx(cm, GOLDEN_FRAME)
4511                        : get_ref_frame_map_idx(cm, ALTREF_FRAME);
4512   }
4513 
4514   if (!encode_show_existing_frame(cm)) {
4515     // Refresh fb_of_context_type[]: see encoder.h for explanation
4516     if (cm->current_frame.frame_type == KEY_FRAME) {
4517       // All ref frames are refreshed, pick one that will live long enough
4518       fb_of_context_type[current_frame_ref_type] = 0;
4519     } else {
4520       // If more than one frame is refreshed, it doesn't matter which one we
4521       // pick so pick the first.  LST sometimes doesn't refresh any: this is ok
4522 
4523       for (int i = 0; i < REF_FRAMES; i++) {
4524         if (cm->current_frame.refresh_frame_flags & (1 << i)) {
4525           fb_of_context_type[current_frame_ref_type] = i;
4526           break;
4527         }
4528       }
4529     }
4530   }
4531 }
4532 
update_rc_counts(AV1_COMP * cpi)4533 static void update_rc_counts(AV1_COMP *cpi) {
4534   update_keyframe_counters(cpi);
4535   update_frames_till_gf_update(cpi);
4536   update_gf_group_index(cpi);
4537 }
4538 
update_end_of_frame_stats(AV1_COMP * cpi)4539 static void update_end_of_frame_stats(AV1_COMP *cpi) {
4540   if (cpi->do_frame_data_update) {
4541     // Store current frame loopfilter levels in ppi, if update flag is set.
4542     if (!cpi->common.show_existing_frame) {
4543       AV1_COMMON *const cm = &cpi->common;
4544       struct loopfilter *const lf = &cm->lf;
4545       cpi->ppi->filter_level[0] = lf->filter_level[0];
4546       cpi->ppi->filter_level[1] = lf->filter_level[1];
4547       cpi->ppi->filter_level_u = lf->filter_level_u;
4548       cpi->ppi->filter_level_v = lf->filter_level_v;
4549     }
4550   }
4551   // Store frame level mv_stats from cpi to ppi.
4552   cpi->ppi->mv_stats = cpi->mv_stats;
4553 }
4554 
4555 // Updates frame level stats related to global motion
update_gm_stats(AV1_COMP * cpi)4556 static inline void update_gm_stats(AV1_COMP *cpi) {
4557   FRAME_UPDATE_TYPE update_type =
4558       cpi->ppi->gf_group.update_type[cpi->gf_frame_index];
4559   int i, is_gm_present = 0;
4560 
4561   // Check if the current frame has any valid global motion model across its
4562   // reference frames
4563   for (i = 0; i < REF_FRAMES; i++) {
4564     if (cpi->common.global_motion[i].wmtype != IDENTITY) {
4565       is_gm_present = 1;
4566       break;
4567     }
4568   }
4569   int update_actual_stats = 1;
4570 #if CONFIG_FPMT_TEST
4571   update_actual_stats =
4572       (cpi->ppi->fpmt_unit_test_cfg == PARALLEL_SIMULATION_ENCODE) ? 0 : 1;
4573   if (!update_actual_stats) {
4574     if (cpi->ppi->temp_valid_gm_model_found[update_type] == INT32_MAX) {
4575       cpi->ppi->temp_valid_gm_model_found[update_type] = is_gm_present;
4576     } else {
4577       cpi->ppi->temp_valid_gm_model_found[update_type] |= is_gm_present;
4578     }
4579     int show_existing_between_parallel_frames =
4580         (cpi->ppi->gf_group.update_type[cpi->gf_frame_index] ==
4581              INTNL_OVERLAY_UPDATE &&
4582          cpi->ppi->gf_group.frame_parallel_level[cpi->gf_frame_index + 1] == 2);
4583     if (cpi->do_frame_data_update == 1 &&
4584         !show_existing_between_parallel_frames) {
4585       for (i = 0; i < FRAME_UPDATE_TYPES; i++) {
4586         cpi->ppi->valid_gm_model_found[i] =
4587             cpi->ppi->temp_valid_gm_model_found[i];
4588       }
4589     }
4590   }
4591 #endif
4592   if (update_actual_stats) {
4593     if (cpi->ppi->valid_gm_model_found[update_type] == INT32_MAX) {
4594       cpi->ppi->valid_gm_model_found[update_type] = is_gm_present;
4595     } else {
4596       cpi->ppi->valid_gm_model_found[update_type] |= is_gm_present;
4597     }
4598   }
4599 }
4600 
av1_post_encode_updates(AV1_COMP * const cpi,const AV1_COMP_DATA * const cpi_data)4601 void av1_post_encode_updates(AV1_COMP *const cpi,
4602                              const AV1_COMP_DATA *const cpi_data) {
4603   AV1_PRIMARY *const ppi = cpi->ppi;
4604   AV1_COMMON *const cm = &cpi->common;
4605 
4606   update_gm_stats(cpi);
4607 
4608 #if !CONFIG_REALTIME_ONLY
4609   // Update the total stats remaining structure.
4610   if (cpi->twopass_frame.this_frame != NULL &&
4611       ppi->twopass.stats_buf_ctx->total_left_stats) {
4612     subtract_stats(ppi->twopass.stats_buf_ctx->total_left_stats,
4613                    cpi->twopass_frame.this_frame);
4614   }
4615 #endif
4616 
4617 #if CONFIG_OUTPUT_FRAME_SIZE
4618   FILE *f = fopen("frame_sizes.csv", "a");
4619   fprintf(f, "%d,", 8 * (int)cpi_data->frame_size);
4620   fprintf(f, "%d\n", cm->quant_params.base_qindex);
4621   fclose(f);
4622 #endif  // CONFIG_OUTPUT_FRAME_SIZE
4623 
4624   if (!is_stat_generation_stage(cpi) && !cpi->is_dropped_frame) {
4625     // Before calling refresh_reference_frames(), copy ppi->ref_frame_map_copy
4626     // to cm->ref_frame_map for frame_parallel_level 2 frame in a parallel
4627     // encode set of lower layer frames.
4628     // TODO(Remya): Move ref_frame_map from AV1_COMMON to AV1_PRIMARY to avoid
4629     // copy.
4630     if (ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] == 2 &&
4631         ppi->gf_group.frame_parallel_level[cpi->gf_frame_index - 1] == 1 &&
4632         ppi->gf_group.update_type[cpi->gf_frame_index - 1] ==
4633             INTNL_ARF_UPDATE) {
4634       memcpy(cm->ref_frame_map, ppi->ref_frame_map_copy,
4635              sizeof(cm->ref_frame_map));
4636     }
4637     refresh_reference_frames(cpi);
4638     // For frame_parallel_level 1 frame in a parallel encode set of lower layer
4639     // frames, store the updated cm->ref_frame_map in ppi->ref_frame_map_copy.
4640     if (ppi->gf_group.frame_parallel_level[cpi->gf_frame_index] == 1 &&
4641         ppi->gf_group.update_type[cpi->gf_frame_index] == INTNL_ARF_UPDATE) {
4642       memcpy(ppi->ref_frame_map_copy, cm->ref_frame_map,
4643              sizeof(cm->ref_frame_map));
4644     }
4645     av1_rc_postencode_update(cpi, cpi_data->frame_size);
4646   }
4647 
4648   if (cpi_data->pop_lookahead == 1) {
4649     av1_lookahead_pop(cpi->ppi->lookahead, cpi_data->flush,
4650                       cpi->compressor_stage);
4651   }
4652   if (cpi->common.show_frame) {
4653     cpi->ppi->ts_start_last_show_frame = cpi_data->ts_frame_start;
4654     cpi->ppi->ts_end_last_show_frame = cpi_data->ts_frame_end;
4655   }
4656   if (ppi->level_params.keep_level_stats && !is_stat_generation_stage(cpi)) {
4657     // Initialize level info. at the beginning of each sequence.
4658     if (cm->current_frame.frame_type == KEY_FRAME &&
4659         ppi->gf_group.refbuf_state[cpi->gf_frame_index] == REFBUF_RESET) {
4660       av1_init_level_info(cpi);
4661     }
4662     av1_update_level_info(cpi, cpi_data->frame_size, cpi_data->ts_frame_start,
4663                           cpi_data->ts_frame_end);
4664   }
4665 
4666   if (!is_stat_generation_stage(cpi)) {
4667 #if !CONFIG_REALTIME_ONLY
4668     if (!has_no_stats_stage(cpi)) av1_twopass_postencode_update(cpi);
4669 #endif
4670     update_fb_of_context_type(cpi, ppi->fb_of_context_type);
4671     update_rc_counts(cpi);
4672     update_end_of_frame_stats(cpi);
4673   }
4674 
4675 #if CONFIG_THREE_PASS
4676   if (cpi->oxcf.pass == AOM_RC_THIRD_PASS && cpi->third_pass_ctx) {
4677     av1_pop_third_pass_info(cpi->third_pass_ctx);
4678   }
4679 #endif
4680 
4681   if (ppi->rtc_ref.set_ref_frame_config && !cpi->is_dropped_frame) {
4682     av1_svc_update_buffer_slot_refreshed(cpi);
4683     av1_svc_set_reference_was_previous(cpi);
4684   }
4685 
4686   if (ppi->use_svc) av1_save_layer_context(cpi);
4687 
4688   // Note *size = 0 indicates a dropped frame for which psnr is not calculated
4689   if (ppi->b_calculate_psnr && cpi_data->frame_size > 0) {
4690     if (cm->show_existing_frame ||
4691         (!is_stat_generation_stage(cpi) && cm->show_frame)) {
4692       generate_psnr_packet(cpi);
4693     }
4694   }
4695 
4696 #if CONFIG_INTERNAL_STATS
4697   if (!is_stat_generation_stage(cpi)) {
4698     compute_internal_stats(cpi, (int)cpi_data->frame_size);
4699   }
4700 #endif  // CONFIG_INTERNAL_STATS
4701 
4702 #if CONFIG_THREE_PASS
4703   // Write frame info. Subtract 1 from frame index since if was incremented in
4704   // update_rc_counts.
4705   av1_write_second_pass_per_frame_info(cpi, cpi->gf_frame_index - 1);
4706 #endif
4707 }
4708 
av1_get_compressed_data(AV1_COMP * cpi,AV1_COMP_DATA * const cpi_data)4709 int av1_get_compressed_data(AV1_COMP *cpi, AV1_COMP_DATA *const cpi_data) {
4710   const AV1EncoderConfig *const oxcf = &cpi->oxcf;
4711   AV1_COMMON *const cm = &cpi->common;
4712 
4713   // The jmp_buf is valid only for the duration of the function that calls
4714   // setjmp(). Therefore, this function must reset the 'setjmp' field to 0
4715   // before it returns.
4716   if (setjmp(cm->error->jmp)) {
4717     cm->error->setjmp = 0;
4718     return cm->error->error_code;
4719   }
4720   cm->error->setjmp = 1;
4721 
4722 #if CONFIG_INTERNAL_STATS
4723   cpi->frame_recode_hits = 0;
4724   cpi->time_compress_data = 0;
4725   cpi->bytes = 0;
4726 #endif
4727 #if CONFIG_ENTROPY_STATS
4728   if (cpi->compressor_stage == ENCODE_STAGE) {
4729     av1_zero(cpi->counts);
4730   }
4731 #endif
4732 
4733 #if CONFIG_BITSTREAM_DEBUG
4734   assert(cpi->oxcf.max_threads <= 1 &&
4735          "bitstream debug tool does not support multithreading");
4736   bitstream_queue_record_write();
4737 
4738   if (cm->seq_params->order_hint_info.enable_order_hint) {
4739     aom_bitstream_queue_set_frame_write(cm->current_frame.order_hint * 2 +
4740                                         cm->show_frame);
4741   } else {
4742     // This is currently used in RTC encoding. cm->show_frame is always 1.
4743     aom_bitstream_queue_set_frame_write(cm->current_frame.frame_number);
4744   }
4745 #endif
4746   if (cpi->ppi->use_svc) {
4747     av1_one_pass_cbr_svc_start_layer(cpi);
4748   }
4749 
4750   cpi->is_dropped_frame = false;
4751   cm->showable_frame = 0;
4752   cpi_data->frame_size = 0;
4753   cpi->available_bs_size = cpi_data->cx_data_sz;
4754 #if CONFIG_INTERNAL_STATS
4755   struct aom_usec_timer cmptimer;
4756   aom_usec_timer_start(&cmptimer);
4757 #endif
4758   av1_set_high_precision_mv(cpi, 1, 0);
4759 
4760   // Normal defaults
4761   cm->features.refresh_frame_context =
4762       oxcf->tool_cfg.frame_parallel_decoding_mode
4763           ? REFRESH_FRAME_CONTEXT_DISABLED
4764           : REFRESH_FRAME_CONTEXT_BACKWARD;
4765   if (oxcf->tile_cfg.enable_large_scale_tile)
4766     cm->features.refresh_frame_context = REFRESH_FRAME_CONTEXT_DISABLED;
4767 
4768   if (assign_cur_frame_new_fb(cm) == NULL) {
4769     aom_internal_error(cpi->common.error, AOM_CODEC_ERROR,
4770                        "Failed to allocate new cur_frame");
4771   }
4772 
4773 #if CONFIG_COLLECT_COMPONENT_TIMING
4774   // Accumulate 2nd pass time in 2-pass case or 1 pass time in 1-pass case.
4775   if (cpi->oxcf.pass == 2 || cpi->oxcf.pass == 0)
4776     start_timing(cpi, av1_encode_strategy_time);
4777 #endif
4778 
4779   const int result = av1_encode_strategy(
4780       cpi, &cpi_data->frame_size, cpi_data->cx_data, cpi_data->cx_data_sz,
4781       &cpi_data->lib_flags, &cpi_data->ts_frame_start, &cpi_data->ts_frame_end,
4782       cpi_data->timestamp_ratio, &cpi_data->pop_lookahead, cpi_data->flush);
4783 
4784 #if CONFIG_COLLECT_COMPONENT_TIMING
4785   if (cpi->oxcf.pass == 2 || cpi->oxcf.pass == 0)
4786     end_timing(cpi, av1_encode_strategy_time);
4787 
4788   // Print out timing information.
4789   // Note: Use "cpi->frame_component_time[0] > 100 us" to avoid showing of
4790   // show_existing_frame and lag-in-frames.
4791   if ((cpi->oxcf.pass == 2 || cpi->oxcf.pass == 0) &&
4792       cpi->frame_component_time[0] > 100) {
4793     int i;
4794     uint64_t frame_total = 0, total = 0;
4795     const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
4796     FRAME_UPDATE_TYPE frame_update_type =
4797         get_frame_update_type(gf_group, cpi->gf_frame_index);
4798 
4799     fprintf(stderr,
4800             "\n Frame number: %d, Frame type: %s, Show Frame: %d, Frame Update "
4801             "Type: %d, Q: %d\n",
4802             cm->current_frame.frame_number,
4803             get_frame_type_enum(cm->current_frame.frame_type), cm->show_frame,
4804             frame_update_type, cm->quant_params.base_qindex);
4805     for (i = 0; i < kTimingComponents; i++) {
4806       cpi->component_time[i] += cpi->frame_component_time[i];
4807       // Use av1_encode_strategy_time (i = 0) as the total time.
4808       if (i == 0) {
4809         frame_total = cpi->frame_component_time[0];
4810         total = cpi->component_time[0];
4811       }
4812       fprintf(stderr,
4813               " %50s:  %15" PRId64 " us [%6.2f%%] (total: %15" PRId64
4814               " us [%6.2f%%])\n",
4815               get_component_name(i), cpi->frame_component_time[i],
4816               (float)((float)cpi->frame_component_time[i] * 100.0 /
4817                       (float)frame_total),
4818               cpi->component_time[i],
4819               (float)((float)cpi->component_time[i] * 100.0 / (float)total));
4820       cpi->frame_component_time[i] = 0;
4821     }
4822   }
4823 #endif
4824 
4825   // Reset the flag to 0 afer encoding.
4826   cpi->rc.use_external_qp_one_pass = 0;
4827 
4828   if (result == -1) {
4829     cm->error->setjmp = 0;
4830     // Returning -1 indicates no frame encoded; more input is required
4831     return -1;
4832   }
4833   if (result != AOM_CODEC_OK) {
4834     aom_internal_error(cpi->common.error, AOM_CODEC_ERROR,
4835                        "Failed to encode frame");
4836   }
4837 #if CONFIG_INTERNAL_STATS
4838   aom_usec_timer_mark(&cmptimer);
4839   cpi->time_compress_data += aom_usec_timer_elapsed(&cmptimer);
4840 #endif  // CONFIG_INTERNAL_STATS
4841 
4842 #if CONFIG_SPEED_STATS
4843   if (!is_stat_generation_stage(cpi) && !cm->show_existing_frame) {
4844     cpi->tx_search_count += cpi->td.mb.txfm_search_info.tx_search_count;
4845     cpi->td.mb.txfm_search_info.tx_search_count = 0;
4846   }
4847 #endif  // CONFIG_SPEED_STATS
4848 
4849   cm->error->setjmp = 0;
4850   return AOM_CODEC_OK;
4851 }
4852 
4853 // Populates cpi->scaled_ref_buf corresponding to frames in a parallel encode
4854 // set. Also sets the bitmask 'ref_buffers_used_map'.
scale_references_fpmt(AV1_COMP * cpi,int * ref_buffers_used_map)4855 static void scale_references_fpmt(AV1_COMP *cpi, int *ref_buffers_used_map) {
4856   AV1_COMMON *cm = &cpi->common;
4857   MV_REFERENCE_FRAME ref_frame;
4858 
4859   for (ref_frame = LAST_FRAME; ref_frame <= ALTREF_FRAME; ++ref_frame) {
4860     // Need to convert from AOM_REFFRAME to index into ref_mask (subtract 1).
4861     if (cpi->ref_frame_flags & av1_ref_frame_flag_list[ref_frame]) {
4862       const YV12_BUFFER_CONFIG *const ref =
4863           get_ref_frame_yv12_buf(cm, ref_frame);
4864 
4865       if (ref == NULL) {
4866         cpi->scaled_ref_buf[ref_frame - 1] = NULL;
4867         continue;
4868       }
4869 
4870       // FPMT does not support scaling yet.
4871       assert(ref->y_crop_width == cm->width &&
4872              ref->y_crop_height == cm->height);
4873 
4874       RefCntBuffer *buf = get_ref_frame_buf(cm, ref_frame);
4875       cpi->scaled_ref_buf[ref_frame - 1] = buf;
4876       for (int i = 0; i < cm->buffer_pool->num_frame_bufs; ++i) {
4877         if (&cm->buffer_pool->frame_bufs[i] == buf) {
4878           *ref_buffers_used_map |= (1 << i);
4879         }
4880       }
4881     } else {
4882       if (!has_no_stats_stage(cpi)) cpi->scaled_ref_buf[ref_frame - 1] = NULL;
4883     }
4884   }
4885 }
4886 
4887 // Increments the ref_count of frame buffers referenced by cpi->scaled_ref_buf
4888 // corresponding to frames in a parallel encode set.
increment_scaled_ref_counts_fpmt(BufferPool * buffer_pool,int ref_buffers_used_map)4889 static void increment_scaled_ref_counts_fpmt(BufferPool *buffer_pool,
4890                                              int ref_buffers_used_map) {
4891   for (int i = 0; i < buffer_pool->num_frame_bufs; ++i) {
4892     if (ref_buffers_used_map & (1 << i)) {
4893       ++buffer_pool->frame_bufs[i].ref_count;
4894     }
4895   }
4896 }
4897 
4898 // Releases cpi->scaled_ref_buf corresponding to frames in a parallel encode
4899 // set.
av1_release_scaled_references_fpmt(AV1_COMP * cpi)4900 void av1_release_scaled_references_fpmt(AV1_COMP *cpi) {
4901   // TODO(isbs): only refresh the necessary frames, rather than all of them
4902   for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) {
4903     RefCntBuffer *const buf = cpi->scaled_ref_buf[i];
4904     if (buf != NULL) {
4905       cpi->scaled_ref_buf[i] = NULL;
4906     }
4907   }
4908 }
4909 
4910 // Decrements the ref_count of frame buffers referenced by cpi->scaled_ref_buf
4911 // corresponding to frames in a parallel encode set.
av1_decrement_ref_counts_fpmt(BufferPool * buffer_pool,int ref_buffers_used_map)4912 void av1_decrement_ref_counts_fpmt(BufferPool *buffer_pool,
4913                                    int ref_buffers_used_map) {
4914   for (int i = 0; i < buffer_pool->num_frame_bufs; ++i) {
4915     if (ref_buffers_used_map & (1 << i)) {
4916       --buffer_pool->frame_bufs[i].ref_count;
4917     }
4918   }
4919 }
4920 
4921 // Initialize parallel frame contexts with screen content decisions.
av1_init_sc_decisions(AV1_PRIMARY * const ppi)4922 void av1_init_sc_decisions(AV1_PRIMARY *const ppi) {
4923   AV1_COMP *const first_cpi = ppi->cpi;
4924   for (int i = 1; i < ppi->num_fp_contexts; ++i) {
4925     AV1_COMP *cur_cpi = ppi->parallel_cpi[i];
4926     cur_cpi->common.features.allow_screen_content_tools =
4927         first_cpi->common.features.allow_screen_content_tools;
4928     cur_cpi->common.features.allow_intrabc =
4929         first_cpi->common.features.allow_intrabc;
4930     cur_cpi->use_screen_content_tools = first_cpi->use_screen_content_tools;
4931     cur_cpi->is_screen_content_type = first_cpi->is_screen_content_type;
4932   }
4933 }
4934 
av1_get_parallel_frame_enc_data(AV1_PRIMARY * const ppi,AV1_COMP_DATA * const first_cpi_data)4935 AV1_COMP *av1_get_parallel_frame_enc_data(AV1_PRIMARY *const ppi,
4936                                           AV1_COMP_DATA *const first_cpi_data) {
4937   int cpi_idx = 0;
4938 
4939   // Loop over parallel_cpi to find the cpi that processed the current
4940   // gf_frame_index ahead of time.
4941   for (int i = 1; i < ppi->num_fp_contexts; i++) {
4942     if (ppi->cpi->gf_frame_index == ppi->parallel_cpi[i]->gf_frame_index) {
4943       cpi_idx = i;
4944       break;
4945     }
4946   }
4947 
4948   assert(cpi_idx > 0);
4949   assert(!ppi->parallel_cpi[cpi_idx]->common.show_existing_frame);
4950 
4951   // Release the previously-used frame-buffer.
4952   if (ppi->cpi->common.cur_frame != NULL) {
4953     --ppi->cpi->common.cur_frame->ref_count;
4954     ppi->cpi->common.cur_frame = NULL;
4955   }
4956 
4957   // Swap the appropriate parallel_cpi with the parallel_cpi[0].
4958   ppi->cpi = ppi->parallel_cpi[cpi_idx];
4959   ppi->parallel_cpi[cpi_idx] = ppi->parallel_cpi[0];
4960   ppi->parallel_cpi[0] = ppi->cpi;
4961 
4962   // Copy appropriate parallel_frames_data to local data.
4963   {
4964     AV1_COMP_DATA *data = &ppi->parallel_frames_data[cpi_idx - 1];
4965     assert(data->frame_size > 0);
4966     if (data->frame_size > first_cpi_data->cx_data_sz) {
4967       aom_internal_error(&ppi->error, AOM_CODEC_ERROR,
4968                          "first_cpi_data->cx_data buffer full");
4969     }
4970 
4971     first_cpi_data->lib_flags = data->lib_flags;
4972     first_cpi_data->ts_frame_start = data->ts_frame_start;
4973     first_cpi_data->ts_frame_end = data->ts_frame_end;
4974     memcpy(first_cpi_data->cx_data, data->cx_data, data->frame_size);
4975     first_cpi_data->frame_size = data->frame_size;
4976     if (ppi->cpi->common.show_frame) {
4977       first_cpi_data->pop_lookahead = 1;
4978     }
4979   }
4980 
4981   return ppi->cpi;
4982 }
4983 
4984 // Initialises frames belonging to a parallel encode set.
av1_init_parallel_frame_context(const AV1_COMP_DATA * const first_cpi_data,AV1_PRIMARY * const ppi,int * ref_buffers_used_map)4985 int av1_init_parallel_frame_context(const AV1_COMP_DATA *const first_cpi_data,
4986                                     AV1_PRIMARY *const ppi,
4987                                     int *ref_buffers_used_map) {
4988   AV1_COMP *const first_cpi = ppi->cpi;
4989   GF_GROUP *const gf_group = &ppi->gf_group;
4990   int gf_index_start = first_cpi->gf_frame_index;
4991   assert(gf_group->frame_parallel_level[gf_index_start] == 1);
4992   int parallel_frame_count = 0;
4993   int cur_frame_num = first_cpi->common.current_frame.frame_number;
4994   int show_frame_count = first_cpi->frame_index_set.show_frame_count;
4995   int frames_since_key = first_cpi->rc.frames_since_key;
4996   int frames_to_key = first_cpi->rc.frames_to_key;
4997   int frames_to_fwd_kf = first_cpi->rc.frames_to_fwd_kf;
4998   int cur_frame_disp = cur_frame_num + gf_group->arf_src_offset[gf_index_start];
4999   const FIRSTPASS_STATS *stats_in = first_cpi->twopass_frame.stats_in;
5000 
5001   assert(*ref_buffers_used_map == 0);
5002 
5003   // Release the previously used frame-buffer by a frame_parallel_level 1 frame.
5004   if (first_cpi->common.cur_frame != NULL) {
5005     --first_cpi->common.cur_frame->ref_count;
5006     first_cpi->common.cur_frame = NULL;
5007   }
5008 
5009   RefFrameMapPair ref_frame_map_pairs[REF_FRAMES];
5010   RefFrameMapPair first_ref_frame_map_pairs[REF_FRAMES];
5011   init_ref_map_pair(first_cpi, first_ref_frame_map_pairs);
5012   memcpy(ref_frame_map_pairs, first_ref_frame_map_pairs,
5013          sizeof(RefFrameMapPair) * REF_FRAMES);
5014 
5015   // Store the reference refresh index of frame_parallel_level 1 frame in a
5016   // parallel encode set of lower layer frames.
5017   if (gf_group->update_type[gf_index_start] == INTNL_ARF_UPDATE) {
5018     first_cpi->ref_refresh_index = av1_calc_refresh_idx_for_intnl_arf(
5019         first_cpi, ref_frame_map_pairs, gf_index_start);
5020     assert(first_cpi->ref_refresh_index != INVALID_IDX &&
5021            first_cpi->ref_refresh_index < REF_FRAMES);
5022     first_cpi->refresh_idx_available = true;
5023     // Update ref_frame_map_pairs.
5024     ref_frame_map_pairs[first_cpi->ref_refresh_index].disp_order =
5025         gf_group->display_idx[gf_index_start];
5026     ref_frame_map_pairs[first_cpi->ref_refresh_index].pyr_level =
5027         gf_group->layer_depth[gf_index_start];
5028   }
5029 
5030   // Set do_frame_data_update flag as false for frame_parallel_level 1 frame.
5031   first_cpi->do_frame_data_update = false;
5032   if (gf_group->arf_src_offset[gf_index_start] == 0) {
5033     first_cpi->time_stamps.prev_ts_start = ppi->ts_start_last_show_frame;
5034     first_cpi->time_stamps.prev_ts_end = ppi->ts_end_last_show_frame;
5035   }
5036 
5037   av1_get_ref_frames(first_ref_frame_map_pairs, cur_frame_disp, first_cpi,
5038                      gf_index_start, 1, first_cpi->common.remapped_ref_idx);
5039 
5040   scale_references_fpmt(first_cpi, ref_buffers_used_map);
5041   parallel_frame_count++;
5042 
5043   // Iterate through the GF_GROUP to find the remaining frame_parallel_level 2
5044   // frames which are part of the current parallel encode set and initialize the
5045   // required cpi elements.
5046   for (int i = gf_index_start + 1; i < gf_group->size; i++) {
5047     // Update frame counters if previous frame was show frame or show existing
5048     // frame.
5049     if (gf_group->arf_src_offset[i - 1] == 0) {
5050       cur_frame_num++;
5051       show_frame_count++;
5052       if (frames_to_fwd_kf <= 0)
5053         frames_to_fwd_kf = first_cpi->oxcf.kf_cfg.fwd_kf_dist;
5054       if (frames_to_key) {
5055         frames_since_key++;
5056         frames_to_key--;
5057         frames_to_fwd_kf--;
5058       }
5059       stats_in++;
5060     }
5061     cur_frame_disp = cur_frame_num + gf_group->arf_src_offset[i];
5062     if (gf_group->frame_parallel_level[i] == 2) {
5063       AV1_COMP *cur_cpi = ppi->parallel_cpi[parallel_frame_count];
5064       AV1_COMP_DATA *cur_cpi_data =
5065           &ppi->parallel_frames_data[parallel_frame_count - 1];
5066       cur_cpi->gf_frame_index = i;
5067       cur_cpi->framerate = first_cpi->framerate;
5068       cur_cpi->common.current_frame.frame_number = cur_frame_num;
5069       cur_cpi->common.current_frame.frame_type = gf_group->frame_type[i];
5070       cur_cpi->frame_index_set.show_frame_count = show_frame_count;
5071       cur_cpi->rc.frames_since_key = frames_since_key;
5072       cur_cpi->rc.frames_to_key = frames_to_key;
5073       cur_cpi->rc.frames_to_fwd_kf = frames_to_fwd_kf;
5074       cur_cpi->rc.active_worst_quality = first_cpi->rc.active_worst_quality;
5075       cur_cpi->rc.avg_frame_bandwidth = first_cpi->rc.avg_frame_bandwidth;
5076       cur_cpi->rc.max_frame_bandwidth = first_cpi->rc.max_frame_bandwidth;
5077       cur_cpi->rc.min_frame_bandwidth = first_cpi->rc.min_frame_bandwidth;
5078       cur_cpi->rc.intervals_till_gf_calculate_due =
5079           first_cpi->rc.intervals_till_gf_calculate_due;
5080       cur_cpi->mv_search_params.max_mv_magnitude =
5081           first_cpi->mv_search_params.max_mv_magnitude;
5082       if (gf_group->update_type[cur_cpi->gf_frame_index] == INTNL_ARF_UPDATE) {
5083         cur_cpi->common.lf.mode_ref_delta_enabled = 1;
5084       }
5085       cur_cpi->do_frame_data_update = false;
5086       // Initialize prev_ts_start and prev_ts_end for show frame(s) and show
5087       // existing frame(s).
5088       if (gf_group->arf_src_offset[i] == 0) {
5089         // Choose source of prev frame.
5090         int src_index = gf_group->src_offset[i];
5091         struct lookahead_entry *prev_source = av1_lookahead_peek(
5092             ppi->lookahead, src_index - 1, cur_cpi->compressor_stage);
5093         // Save timestamps of prev frame.
5094         cur_cpi->time_stamps.prev_ts_start = prev_source->ts_start;
5095         cur_cpi->time_stamps.prev_ts_end = prev_source->ts_end;
5096       }
5097       cur_cpi->time_stamps.first_ts_start =
5098           first_cpi->time_stamps.first_ts_start;
5099 
5100       memcpy(cur_cpi->common.ref_frame_map, first_cpi->common.ref_frame_map,
5101              sizeof(first_cpi->common.ref_frame_map));
5102       cur_cpi_data->lib_flags = 0;
5103       cur_cpi_data->timestamp_ratio = first_cpi_data->timestamp_ratio;
5104       cur_cpi_data->flush = first_cpi_data->flush;
5105       cur_cpi_data->frame_size = 0;
5106       if (gf_group->update_type[gf_index_start] == INTNL_ARF_UPDATE) {
5107         // If the first frame in a parallel encode set is INTNL_ARF_UPDATE
5108         // frame, initialize lib_flags of frame_parallel_level 2 frame in the
5109         // set with that of frame_parallel_level 1 frame.
5110         cur_cpi_data->lib_flags = first_cpi_data->lib_flags;
5111         // Store the reference refresh index of frame_parallel_level 2 frame in
5112         // a parallel encode set of lower layer frames.
5113         cur_cpi->ref_refresh_index =
5114             av1_calc_refresh_idx_for_intnl_arf(cur_cpi, ref_frame_map_pairs, i);
5115         cur_cpi->refresh_idx_available = true;
5116         // Skip the reference frame which will be refreshed by
5117         // frame_parallel_level 1 frame in a parallel encode set of lower layer
5118         // frames.
5119         cur_cpi->ref_idx_to_skip = first_cpi->ref_refresh_index;
5120       } else {
5121         cur_cpi->ref_idx_to_skip = INVALID_IDX;
5122         cur_cpi->ref_refresh_index = INVALID_IDX;
5123         cur_cpi->refresh_idx_available = false;
5124       }
5125       cur_cpi->twopass_frame.stats_in = stats_in;
5126 
5127       av1_get_ref_frames(first_ref_frame_map_pairs, cur_frame_disp, cur_cpi, i,
5128                          1, cur_cpi->common.remapped_ref_idx);
5129       scale_references_fpmt(cur_cpi, ref_buffers_used_map);
5130       parallel_frame_count++;
5131     }
5132 
5133     // Set do_frame_data_update to true for the last frame_parallel_level 2
5134     // frame in the current parallel encode set.
5135     if (i == (gf_group->size - 1) ||
5136         (gf_group->frame_parallel_level[i + 1] == 0 &&
5137          (gf_group->update_type[i + 1] == ARF_UPDATE ||
5138           gf_group->update_type[i + 1] == INTNL_ARF_UPDATE)) ||
5139         gf_group->frame_parallel_level[i + 1] == 1) {
5140       ppi->parallel_cpi[parallel_frame_count - 1]->do_frame_data_update = true;
5141       break;
5142     }
5143   }
5144 
5145   increment_scaled_ref_counts_fpmt(first_cpi->common.buffer_pool,
5146                                    *ref_buffers_used_map);
5147 
5148   // Return the number of frames in the parallel encode set.
5149   return parallel_frame_count;
5150 }
5151 
av1_get_preview_raw_frame(AV1_COMP * cpi,YV12_BUFFER_CONFIG * dest)5152 int av1_get_preview_raw_frame(AV1_COMP *cpi, YV12_BUFFER_CONFIG *dest) {
5153   AV1_COMMON *cm = &cpi->common;
5154   if (!cm->show_frame) {
5155     return -1;
5156   } else {
5157     int ret;
5158     if (cm->cur_frame != NULL && !cpi->oxcf.algo_cfg.skip_postproc_filtering) {
5159       *dest = cm->cur_frame->buf;
5160       dest->y_width = cm->width;
5161       dest->y_height = cm->height;
5162       dest->uv_width = cm->width >> cm->seq_params->subsampling_x;
5163       dest->uv_height = cm->height >> cm->seq_params->subsampling_y;
5164       ret = 0;
5165     } else {
5166       ret = -1;
5167     }
5168     return ret;
5169   }
5170 }
5171 
av1_get_last_show_frame(AV1_COMP * cpi,YV12_BUFFER_CONFIG * frame)5172 int av1_get_last_show_frame(AV1_COMP *cpi, YV12_BUFFER_CONFIG *frame) {
5173   if (cpi->last_show_frame_buf == NULL ||
5174       cpi->oxcf.algo_cfg.skip_postproc_filtering)
5175     return -1;
5176 
5177   *frame = cpi->last_show_frame_buf->buf;
5178   return 0;
5179 }
5180 
av1_copy_new_frame_enc(AV1_COMMON * cm,YV12_BUFFER_CONFIG * new_frame,YV12_BUFFER_CONFIG * sd)5181 aom_codec_err_t av1_copy_new_frame_enc(AV1_COMMON *cm,
5182                                        YV12_BUFFER_CONFIG *new_frame,
5183                                        YV12_BUFFER_CONFIG *sd) {
5184   const int num_planes = av1_num_planes(cm);
5185   if (!equal_dimensions_and_border(new_frame, sd))
5186     aom_internal_error(cm->error, AOM_CODEC_ERROR,
5187                        "Incorrect buffer dimensions");
5188   else
5189     aom_yv12_copy_frame(new_frame, sd, num_planes);
5190 
5191   return cm->error->error_code;
5192 }
5193 
av1_set_internal_size(AV1EncoderConfig * const oxcf,ResizePendingParams * resize_pending_params,AOM_SCALING_MODE horiz_mode,AOM_SCALING_MODE vert_mode)5194 int av1_set_internal_size(AV1EncoderConfig *const oxcf,
5195                           ResizePendingParams *resize_pending_params,
5196                           AOM_SCALING_MODE horiz_mode,
5197                           AOM_SCALING_MODE vert_mode) {
5198   int hr = 0, hs = 0, vr = 0, vs = 0;
5199 
5200   // Checks for invalid AOM_SCALING_MODE values.
5201   if (horiz_mode > AOME_ONETHREE || vert_mode > AOME_ONETHREE) return -1;
5202 
5203   Scale2Ratio(horiz_mode, &hr, &hs);
5204   Scale2Ratio(vert_mode, &vr, &vs);
5205 
5206   // always go to the next whole number
5207   resize_pending_params->width = (hs - 1 + oxcf->frm_dim_cfg.width * hr) / hs;
5208   resize_pending_params->height = (vs - 1 + oxcf->frm_dim_cfg.height * vr) / vs;
5209 
5210   if (horiz_mode != AOME_NORMAL || vert_mode != AOME_NORMAL) {
5211     oxcf->resize_cfg.resize_mode = RESIZE_FIXED;
5212     oxcf->algo_cfg.enable_tpl_model = 0;
5213   }
5214   return 0;
5215 }
5216 
av1_get_quantizer(AV1_COMP * cpi)5217 int av1_get_quantizer(AV1_COMP *cpi) {
5218   return cpi->common.quant_params.base_qindex;
5219 }
5220 
av1_convert_sect5obus_to_annexb(uint8_t * buffer,size_t buffer_size,size_t * frame_size)5221 int av1_convert_sect5obus_to_annexb(uint8_t *buffer, size_t buffer_size,
5222                                     size_t *frame_size) {
5223   assert(*frame_size <= buffer_size);
5224   size_t output_size = 0;
5225   size_t remaining_size = *frame_size;
5226   uint8_t *buff_ptr = buffer;
5227 
5228   // go through each OBUs
5229   while (remaining_size > 0) {
5230     uint8_t saved_obu_header[2];
5231     uint64_t obu_payload_size;
5232     size_t length_of_payload_size;
5233     size_t length_of_obu_size;
5234     const uint32_t obu_header_size = (buff_ptr[0] >> 2) & 0x1 ? 2 : 1;
5235     size_t obu_bytes_read = obu_header_size;  // bytes read for current obu
5236 
5237     // save the obu header (1 or 2 bytes)
5238     memcpy(saved_obu_header, buff_ptr, obu_header_size);
5239     // clear the obu_has_size_field
5240     saved_obu_header[0] &= ~0x2;
5241 
5242     // get the payload_size and length of payload_size
5243     if (aom_uleb_decode(buff_ptr + obu_header_size,
5244                         remaining_size - obu_header_size, &obu_payload_size,
5245                         &length_of_payload_size) != 0) {
5246       return AOM_CODEC_ERROR;
5247     }
5248     obu_bytes_read += length_of_payload_size;
5249 
5250     // calculate the length of size of the obu header plus payload
5251     const uint64_t obu_size = obu_header_size + obu_payload_size;
5252     length_of_obu_size = aom_uleb_size_in_bytes(obu_size);
5253 
5254     if (length_of_obu_size + obu_header_size >
5255         buffer_size - output_size - (remaining_size - obu_bytes_read)) {
5256       return AOM_CODEC_ERROR;
5257     }
5258     // move the rest of data to new location
5259     memmove(buff_ptr + length_of_obu_size + obu_header_size,
5260             buff_ptr + obu_bytes_read, remaining_size - obu_bytes_read);
5261     obu_bytes_read += (size_t)obu_payload_size;
5262 
5263     // write the new obu size
5264     size_t coded_obu_size;
5265     if (aom_uleb_encode(obu_size, length_of_obu_size, buff_ptr,
5266                         &coded_obu_size) != 0 ||
5267         coded_obu_size != length_of_obu_size) {
5268       return AOM_CODEC_ERROR;
5269     }
5270 
5271     // write the saved (modified) obu_header following obu size
5272     memcpy(buff_ptr + length_of_obu_size, saved_obu_header, obu_header_size);
5273 
5274     remaining_size -= obu_bytes_read;
5275     buff_ptr += length_of_obu_size + (size_t)obu_size;
5276     output_size += length_of_obu_size + (size_t)obu_size;
5277   }
5278 
5279   *frame_size = output_size;
5280   return AOM_CODEC_OK;
5281 }
5282 
rtc_set_updates_ref_frame_config(ExtRefreshFrameFlagsInfo * const ext_refresh_frame_flags,RTC_REF * const rtc_ref)5283 static void rtc_set_updates_ref_frame_config(
5284     ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags,
5285     RTC_REF *const rtc_ref) {
5286   ext_refresh_frame_flags->update_pending = 1;
5287   ext_refresh_frame_flags->last_frame = rtc_ref->refresh[rtc_ref->ref_idx[0]];
5288   ext_refresh_frame_flags->golden_frame = rtc_ref->refresh[rtc_ref->ref_idx[3]];
5289   ext_refresh_frame_flags->bwd_ref_frame =
5290       rtc_ref->refresh[rtc_ref->ref_idx[4]];
5291   ext_refresh_frame_flags->alt2_ref_frame =
5292       rtc_ref->refresh[rtc_ref->ref_idx[5]];
5293   ext_refresh_frame_flags->alt_ref_frame =
5294       rtc_ref->refresh[rtc_ref->ref_idx[6]];
5295   rtc_ref->non_reference_frame = 1;
5296   for (int i = 0; i < REF_FRAMES; i++) {
5297     if (rtc_ref->refresh[i] == 1) {
5298       rtc_ref->non_reference_frame = 0;
5299       break;
5300     }
5301   }
5302 }
5303 
rtc_set_references_external_ref_frame_config(AV1_COMP * cpi)5304 static int rtc_set_references_external_ref_frame_config(AV1_COMP *cpi) {
5305   // LAST_FRAME (0), LAST2_FRAME(1), LAST3_FRAME(2), GOLDEN_FRAME(3),
5306   // BWDREF_FRAME(4), ALTREF2_FRAME(5), ALTREF_FRAME(6).
5307   int ref = AOM_REFFRAME_ALL;
5308   for (int i = 0; i < INTER_REFS_PER_FRAME; i++) {
5309     if (!cpi->ppi->rtc_ref.reference[i]) ref ^= (1 << i);
5310   }
5311   return ref;
5312 }
5313 
av1_apply_encoding_flags(AV1_COMP * cpi,aom_enc_frame_flags_t flags)5314 void av1_apply_encoding_flags(AV1_COMP *cpi, aom_enc_frame_flags_t flags) {
5315   // TODO(yunqingwang): For what references to use, external encoding flags
5316   // should be consistent with internal reference frame selection. Need to
5317   // ensure that there is not conflict between the two. In AV1 encoder, the
5318   // priority rank for 7 reference frames are: LAST, ALTREF, LAST2, LAST3,
5319   // GOLDEN, BWDREF, ALTREF2.
5320 
5321   ExternalFlags *const ext_flags = &cpi->ext_flags;
5322   ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags =
5323       &ext_flags->refresh_frame;
5324   ext_flags->ref_frame_flags = AOM_REFFRAME_ALL;
5325   if (flags &
5326       (AOM_EFLAG_NO_REF_LAST | AOM_EFLAG_NO_REF_LAST2 | AOM_EFLAG_NO_REF_LAST3 |
5327        AOM_EFLAG_NO_REF_GF | AOM_EFLAG_NO_REF_ARF | AOM_EFLAG_NO_REF_BWD |
5328        AOM_EFLAG_NO_REF_ARF2)) {
5329     int ref = AOM_REFFRAME_ALL;
5330 
5331     if (flags & AOM_EFLAG_NO_REF_LAST) ref ^= AOM_LAST_FLAG;
5332     if (flags & AOM_EFLAG_NO_REF_LAST2) ref ^= AOM_LAST2_FLAG;
5333     if (flags & AOM_EFLAG_NO_REF_LAST3) ref ^= AOM_LAST3_FLAG;
5334 
5335     if (flags & AOM_EFLAG_NO_REF_GF) ref ^= AOM_GOLD_FLAG;
5336 
5337     if (flags & AOM_EFLAG_NO_REF_ARF) {
5338       ref ^= AOM_ALT_FLAG;
5339       ref ^= AOM_BWD_FLAG;
5340       ref ^= AOM_ALT2_FLAG;
5341     } else {
5342       if (flags & AOM_EFLAG_NO_REF_BWD) ref ^= AOM_BWD_FLAG;
5343       if (flags & AOM_EFLAG_NO_REF_ARF2) ref ^= AOM_ALT2_FLAG;
5344     }
5345 
5346     av1_use_as_reference(&ext_flags->ref_frame_flags, ref);
5347   } else {
5348     if (cpi->ppi->rtc_ref.set_ref_frame_config) {
5349       int ref = rtc_set_references_external_ref_frame_config(cpi);
5350       av1_use_as_reference(&ext_flags->ref_frame_flags, ref);
5351     }
5352   }
5353 
5354   if (flags &
5355       (AOM_EFLAG_NO_UPD_LAST | AOM_EFLAG_NO_UPD_GF | AOM_EFLAG_NO_UPD_ARF)) {
5356     int upd = AOM_REFFRAME_ALL;
5357 
5358     // Refreshing LAST/LAST2/LAST3 is handled by 1 common flag.
5359     if (flags & AOM_EFLAG_NO_UPD_LAST) upd ^= AOM_LAST_FLAG;
5360 
5361     if (flags & AOM_EFLAG_NO_UPD_GF) upd ^= AOM_GOLD_FLAG;
5362 
5363     if (flags & AOM_EFLAG_NO_UPD_ARF) {
5364       upd ^= AOM_ALT_FLAG;
5365       upd ^= AOM_BWD_FLAG;
5366       upd ^= AOM_ALT2_FLAG;
5367     }
5368 
5369     ext_refresh_frame_flags->last_frame = (upd & AOM_LAST_FLAG) != 0;
5370     ext_refresh_frame_flags->golden_frame = (upd & AOM_GOLD_FLAG) != 0;
5371     ext_refresh_frame_flags->alt_ref_frame = (upd & AOM_ALT_FLAG) != 0;
5372     ext_refresh_frame_flags->bwd_ref_frame = (upd & AOM_BWD_FLAG) != 0;
5373     ext_refresh_frame_flags->alt2_ref_frame = (upd & AOM_ALT2_FLAG) != 0;
5374     ext_refresh_frame_flags->update_pending = 1;
5375   } else {
5376     if (cpi->ppi->rtc_ref.set_ref_frame_config)
5377       rtc_set_updates_ref_frame_config(ext_refresh_frame_flags,
5378                                        &cpi->ppi->rtc_ref);
5379     else
5380       ext_refresh_frame_flags->update_pending = 0;
5381   }
5382 
5383   ext_flags->use_ref_frame_mvs = cpi->oxcf.tool_cfg.enable_ref_frame_mvs &
5384                                  ((flags & AOM_EFLAG_NO_REF_FRAME_MVS) == 0);
5385   ext_flags->use_error_resilient = cpi->oxcf.tool_cfg.error_resilient_mode |
5386                                    ((flags & AOM_EFLAG_ERROR_RESILIENT) != 0);
5387   ext_flags->use_s_frame =
5388       cpi->oxcf.kf_cfg.enable_sframe | ((flags & AOM_EFLAG_SET_S_FRAME) != 0);
5389   ext_flags->use_primary_ref_none =
5390       (flags & AOM_EFLAG_SET_PRIMARY_REF_NONE) != 0;
5391 
5392   if (flags & AOM_EFLAG_NO_UPD_ENTROPY) {
5393     update_entropy(&ext_flags->refresh_frame_context,
5394                    &ext_flags->refresh_frame_context_pending, 0);
5395   }
5396 }
5397 
av1_get_global_headers(AV1_PRIMARY * ppi)5398 aom_fixed_buf_t *av1_get_global_headers(AV1_PRIMARY *ppi) {
5399   if (!ppi) return NULL;
5400 
5401   uint8_t header_buf[512] = { 0 };
5402   const uint32_t sequence_header_size = av1_write_sequence_header_obu(
5403       &ppi->seq_params, &header_buf[0], sizeof(header_buf));
5404   assert(sequence_header_size <= sizeof(header_buf));
5405   if (sequence_header_size == 0) return NULL;
5406 
5407   const size_t obu_header_size = 1;
5408   const size_t size_field_size = aom_uleb_size_in_bytes(sequence_header_size);
5409   const size_t payload_offset = obu_header_size + size_field_size;
5410 
5411   if (payload_offset + sequence_header_size > sizeof(header_buf)) return NULL;
5412   memmove(&header_buf[payload_offset], &header_buf[0], sequence_header_size);
5413 
5414   if (av1_write_obu_header(&ppi->level_params, &ppi->cpi->frame_header_count,
5415                            OBU_SEQUENCE_HEADER,
5416                            ppi->seq_params.has_nonzero_operating_point_idc,
5417                            /*is_layer_specific_obu=*/false, 0,
5418                            &header_buf[0]) != obu_header_size) {
5419     return NULL;
5420   }
5421 
5422   size_t coded_size_field_size = 0;
5423   if (aom_uleb_encode(sequence_header_size, size_field_size,
5424                       &header_buf[obu_header_size],
5425                       &coded_size_field_size) != 0) {
5426     return NULL;
5427   }
5428   assert(coded_size_field_size == size_field_size);
5429 
5430   aom_fixed_buf_t *global_headers =
5431       (aom_fixed_buf_t *)malloc(sizeof(*global_headers));
5432   if (!global_headers) return NULL;
5433 
5434   const size_t global_header_buf_size =
5435       obu_header_size + size_field_size + sequence_header_size;
5436 
5437   global_headers->buf = malloc(global_header_buf_size);
5438   if (!global_headers->buf) {
5439     free(global_headers);
5440     return NULL;
5441   }
5442 
5443   memcpy(global_headers->buf, &header_buf[0], global_header_buf_size);
5444   global_headers->sz = global_header_buf_size;
5445   return global_headers;
5446 }
5447