• 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 /*!\file
13  * \brief Declares top-level encoder structures and functions.
14  */
15 #ifndef AOM_AV1_ENCODER_ENCODER_H_
16 #define AOM_AV1_ENCODER_ENCODER_H_
17 
18 #include <stdbool.h>
19 #include <stdio.h>
20 
21 #include "config/aom_config.h"
22 
23 #include "aom/aomcx.h"
24 
25 #include "av1/common/alloccommon.h"
26 #include "av1/common/av1_common_int.h"
27 #include "av1/common/blockd.h"
28 #include "av1/common/entropymode.h"
29 #include "av1/common/enums.h"
30 #include "av1/common/resize.h"
31 #include "av1/common/thread_common.h"
32 #include "av1/common/timing.h"
33 
34 #include "av1/encoder/aq_cyclicrefresh.h"
35 #include "av1/encoder/av1_quantize.h"
36 #include "av1/encoder/block.h"
37 #include "av1/encoder/context_tree.h"
38 #include "av1/encoder/encodemb.h"
39 #include "av1/encoder/external_partition.h"
40 #include "av1/encoder/firstpass.h"
41 #include "av1/encoder/global_motion.h"
42 #include "av1/encoder/level.h"
43 #include "av1/encoder/lookahead.h"
44 #include "av1/encoder/mcomp.h"
45 #include "av1/encoder/pickcdef.h"
46 #include "av1/encoder/ratectrl.h"
47 #include "av1/encoder/rd.h"
48 #include "av1/encoder/speed_features.h"
49 #include "av1/encoder/svc_layercontext.h"
50 #include "av1/encoder/temporal_filter.h"
51 #include "av1/encoder/thirdpass.h"
52 #include "av1/encoder/tokenize.h"
53 #include "av1/encoder/tpl_model.h"
54 #include "av1/encoder/av1_noise_estimate.h"
55 #include "av1/encoder/bitstream.h"
56 
57 #if CONFIG_INTERNAL_STATS
58 #include "aom_dsp/ssim.h"
59 #endif
60 #include "aom_dsp/variance.h"
61 #if CONFIG_DENOISE
62 #include "aom_dsp/noise_model.h"
63 #endif
64 #if CONFIG_TUNE_VMAF
65 #include "av1/encoder/tune_vmaf.h"
66 #endif
67 #if CONFIG_AV1_TEMPORAL_DENOISING
68 #include "av1/encoder/av1_temporal_denoiser.h"
69 #endif
70 #if CONFIG_TUNE_BUTTERAUGLI
71 #include "av1/encoder/tune_butteraugli.h"
72 #endif
73 
74 #include "aom/internal/aom_codec_internal.h"
75 #include "aom_util/aom_thread.h"
76 
77 #ifdef __cplusplus
78 extern "C" {
79 #endif
80 
81 // TODO(yunqing, any): Added suppression tag to quiet Doxygen warnings. Need to
82 // adjust it while we work on documentation.
83 /*!\cond */
84 // Number of frames required to test for scene cut detection
85 #define SCENE_CUT_KEY_TEST_INTERVAL 16
86 
87 // Lookahead index threshold to enable temporal filtering for second arf.
88 #define TF_LOOKAHEAD_IDX_THR 7
89 
90 // Rational number with an int64 numerator
91 // This structure holds a fractional value
92 typedef struct aom_rational64 {
93   int64_t num;       // fraction numerator
94   int den;           // fraction denominator
95 } aom_rational64_t;  // alias for struct aom_rational
96 
97 enum {
98   NORMAL = 0,
99   FOURFIVE = 1,
100   THREEFIVE = 2,
101   THREEFOUR = 3,
102   ONEFOUR = 4,
103   ONEEIGHT = 5,
104   ONETWO = 6
105 } UENUM1BYTE(AOM_SCALING);
106 
107 enum {
108   // Good Quality Fast Encoding. The encoder balances quality with the amount of
109   // time it takes to encode the output. Speed setting controls how fast.
110   GOOD,
111   // Realtime Fast Encoding. Will force some restrictions on bitrate
112   // constraints.
113   REALTIME,
114   // All intra mode. All the frames are coded as intra frames.
115   ALLINTRA
116 } UENUM1BYTE(MODE);
117 
118 enum {
119   FRAMEFLAGS_KEY = 1 << 0,
120   FRAMEFLAGS_GOLDEN = 1 << 1,
121   FRAMEFLAGS_BWDREF = 1 << 2,
122   // TODO(zoeliu): To determine whether a frame flag is needed for ALTREF2_FRAME
123   FRAMEFLAGS_ALTREF = 1 << 3,
124   FRAMEFLAGS_INTRAONLY = 1 << 4,
125   FRAMEFLAGS_SWITCH = 1 << 5,
126   FRAMEFLAGS_ERROR_RESILIENT = 1 << 6,
127 } UENUM1BYTE(FRAMETYPE_FLAGS);
128 
129 #if CONFIG_FRAME_PARALLEL_ENCODE
130 // 0 level frames are sometimes used for rate control purposes, but for
131 // reference mapping purposes, the minimum level should be 1.
132 #define MIN_PYR_LEVEL 1
get_true_pyr_level(int frame_level,int frame_order,int max_layer_depth)133 static INLINE int get_true_pyr_level(int frame_level, int frame_order,
134                                      int max_layer_depth) {
135   if (frame_order == 0) {
136     // Keyframe case
137     return MIN_PYR_LEVEL;
138   } else if (frame_level == MAX_ARF_LAYERS) {
139     // Leaves
140     return max_layer_depth;
141   } else if (frame_level == (MAX_ARF_LAYERS + 1)) {
142     // Altrefs
143     return MIN_PYR_LEVEL;
144   }
145   return AOMMAX(MIN_PYR_LEVEL, frame_level);
146 }
147 #endif  // CONFIG_FRAME_PARALLEL_ENCODE
148 
149 enum {
150   NO_AQ = 0,
151   VARIANCE_AQ = 1,
152   COMPLEXITY_AQ = 2,
153   CYCLIC_REFRESH_AQ = 3,
154   AQ_MODE_COUNT  // This should always be the last member of the enum
155 } UENUM1BYTE(AQ_MODE);
156 enum {
157   NO_DELTA_Q = 0,
158   DELTA_Q_OBJECTIVE = 1,      // Modulation to improve objective quality
159   DELTA_Q_PERCEPTUAL = 2,     // Modulation to improve video perceptual quality
160   DELTA_Q_PERCEPTUAL_AI = 3,  // Perceptual quality opt for all intra mode
161   DELTA_Q_USER_RATING_BASED = 4,  // User rating based delta q mode
162   DELTA_Q_MODE_COUNT  // This should always be the last member of the enum
163 } UENUM1BYTE(DELTAQ_MODE);
164 
165 enum {
166   RESIZE_NONE = 0,     // No frame resizing allowed.
167   RESIZE_FIXED = 1,    // All frames are coded at the specified scale.
168   RESIZE_RANDOM = 2,   // All frames are coded at a random scale.
169   RESIZE_DYNAMIC = 3,  // Frames coded at lower scale based on rate control.
170   RESIZE_MODES
171 } UENUM1BYTE(RESIZE_MODE);
172 
173 enum {
174   SS_CFG_SRC = 0,
175   SS_CFG_LOOKAHEAD = 1,
176   SS_CFG_FPF = 2,
177   SS_CFG_TOTAL = 3
178 } UENUM1BYTE(SS_CFG_OFFSET);
179 
180 enum {
181   DISABLE_SCENECUT,        // For LAP, lag_in_frames < 19
182   ENABLE_SCENECUT_MODE_1,  // For LAP, lag_in_frames >=19 and < 33
183   ENABLE_SCENECUT_MODE_2   // For twopass and LAP - lag_in_frames >=33
184 } UENUM1BYTE(SCENECUT_MODE);
185 
186 #define MAX_VBR_CORPUS_COMPLEXITY 10000
187 
188 /*!\cond */
189 
190 typedef enum {
191   MOD_FP,           // First pass
192   MOD_TF,           // Temporal filtering
193   MOD_TPL,          // TPL
194   MOD_GME,          // Global motion estimation
195   MOD_ENC,          // Encode stage
196   MOD_LPF,          // Deblocking loop filter
197   MOD_CDEF_SEARCH,  // CDEF search
198   MOD_CDEF,         // CDEF frame
199   MOD_LR,           // Loop restoration filtering
200   MOD_PACK_BS,      // Pack bitstream
201   MOD_FRAME_ENC,    // Frame Parallel encode
202   NUM_MT_MODULES
203 } MULTI_THREADED_MODULES;
204 
205 /*!\endcond */
206 
207 /*!\enum COST_UPDATE_TYPE
208  * \brief This enum controls how often the entropy costs should be updated.
209  */
210 typedef enum {
211   COST_UPD_SB,    /*!< Update every sb. */
212   COST_UPD_SBROW, /*!< Update every sb rows inside a tile. */
213   COST_UPD_TILE,  /*!< Update every tile. */
214   COST_UPD_OFF,   /*!< Turn off cost updates. */
215 } COST_UPDATE_TYPE;
216 
217 /*!
218  * \brief Encoder config related to resize.
219  */
220 typedef struct {
221   /*!
222    * Indicates the frame resize mode to be used by the encoder.
223    */
224   RESIZE_MODE resize_mode;
225   /*!
226    * Indicates the denominator for resize of inter frames, assuming 8 as the
227    *  numerator. Its value ranges between 8-16.
228    */
229   uint8_t resize_scale_denominator;
230   /*!
231    * Indicates the denominator for resize of key frames, assuming 8 as the
232    * numerator. Its value ranges between 8-16.
233    */
234   uint8_t resize_kf_scale_denominator;
235 } ResizeCfg;
236 
237 /*!
238  * \brief Encoder config for coding block partitioning.
239  */
240 typedef struct {
241   /*!
242    * Flag to indicate if rectanguar partitions should be enabled.
243    */
244   bool enable_rect_partitions;
245   /*!
246    * Flag to indicate if AB partitions should be enabled.
247    */
248   bool enable_ab_partitions;
249   /*!
250    * Flag to indicate if 1:4 / 4:1 partitions should be enabled.
251    */
252   bool enable_1to4_partitions;
253   /*!
254    * Indicates the minimum partition size that should be allowed. Both width and
255    * height of a partition cannot be smaller than the min_partition_size.
256    */
257   BLOCK_SIZE min_partition_size;
258   /*!
259    * Indicates the maximum partition size that should be allowed. Both width and
260    * height of a partition cannot be larger than the max_partition_size.
261    */
262   BLOCK_SIZE max_partition_size;
263 } PartitionCfg;
264 
265 /*!
266  * \brief Encoder flags for intra prediction.
267  */
268 typedef struct {
269   /*!
270    * Flag to indicate if intra edge filtering process should be enabled.
271    */
272   bool enable_intra_edge_filter;
273   /*!
274    * Flag to indicate if recursive filtering based intra prediction should be
275    * enabled.
276    */
277   bool enable_filter_intra;
278   /*!
279    * Flag to indicate if smooth intra prediction modes should be enabled.
280    */
281   bool enable_smooth_intra;
282   /*!
283    * Flag to indicate if PAETH intra prediction mode should be enabled.
284    */
285   bool enable_paeth_intra;
286   /*!
287    * Flag to indicate if CFL uv intra mode should be enabled.
288    */
289   bool enable_cfl_intra;
290   /*!
291    * Flag to indicate if directional modes should be enabled.
292    */
293   bool enable_directional_intra;
294   /*!
295    * Flag to indicate if the subset of directional modes from D45 to D203 intra
296    * should be enabled. Has no effect if directional modes are disabled.
297    */
298   bool enable_diagonal_intra;
299   /*!
300    * Flag to indicate if delta angles for directional intra prediction should be
301    * enabled.
302    */
303   bool enable_angle_delta;
304 } IntraModeCfg;
305 
306 /*!
307  * \brief Encoder flags for transform sizes and types.
308  */
309 typedef struct {
310   /*!
311    * Flag to indicate if 64-pt transform should be enabled.
312    */
313   bool enable_tx64;
314   /*!
315    * Flag to indicate if flip and identity transform types should be enabled.
316    */
317   bool enable_flip_idtx;
318   /*!
319    * Flag to indicate if rectangular transform should be enabled.
320    */
321   bool enable_rect_tx;
322   /*!
323    * Flag to indicate whether or not to use a default reduced set for ext-tx
324    * rather than the potential full set of 16 transforms.
325    */
326   bool reduced_tx_type_set;
327   /*!
328    * Flag to indicate if transform type for intra blocks should be limited to
329    * DCT_DCT.
330    */
331   bool use_intra_dct_only;
332   /*!
333    * Flag to indicate if transform type for inter blocks should be limited to
334    * DCT_DCT.
335    */
336   bool use_inter_dct_only;
337   /*!
338    * Flag to indicate if intra blocks should use default transform type
339    * (mode-dependent) only.
340    */
341   bool use_intra_default_tx_only;
342   /*!
343    * Flag to indicate if transform size search should be enabled.
344    */
345   bool enable_tx_size_search;
346 } TxfmSizeTypeCfg;
347 
348 /*!
349  * \brief Encoder flags for compound prediction modes.
350  */
351 typedef struct {
352   /*!
353    * Flag to indicate if distance-weighted compound type should be enabled.
354    */
355   bool enable_dist_wtd_comp;
356   /*!
357    * Flag to indicate if masked (wedge/diff-wtd) compound type should be
358    * enabled.
359    */
360   bool enable_masked_comp;
361   /*!
362    * Flag to indicate if smooth interintra mode should be enabled.
363    */
364   bool enable_smooth_interintra;
365   /*!
366    * Flag to indicate if difference-weighted compound type should be enabled.
367    */
368   bool enable_diff_wtd_comp;
369   /*!
370    * Flag to indicate if inter-inter wedge compound type should be enabled.
371    */
372   bool enable_interinter_wedge;
373   /*!
374    * Flag to indicate if inter-intra wedge compound type should be enabled.
375    */
376   bool enable_interintra_wedge;
377 } CompoundTypeCfg;
378 
379 /*!
380  * \brief Encoder config related to frame super-resolution.
381  */
382 typedef struct {
383   /*!
384    * Indicates the qindex based threshold to be used when AOM_SUPERRES_QTHRESH
385    * mode is used for inter frames.
386    */
387   int superres_qthresh;
388   /*!
389    * Indicates the qindex based threshold to be used when AOM_SUPERRES_QTHRESH
390    * mode is used for key frames.
391    */
392   int superres_kf_qthresh;
393   /*!
394    * Indicates the denominator of the fraction that specifies the ratio between
395    * the superblock width before and after upscaling for inter frames. The
396    * numerator of this fraction is equal to the constant SCALE_NUMERATOR.
397    */
398   uint8_t superres_scale_denominator;
399   /*!
400    * Indicates the denominator of the fraction that specifies the ratio between
401    * the superblock width before and after upscaling for key frames. The
402    * numerator of this fraction is equal to the constant SCALE_NUMERATOR.
403    */
404   uint8_t superres_kf_scale_denominator;
405   /*!
406    * Indicates the Super-resolution mode to be used by the encoder.
407    */
408   aom_superres_mode superres_mode;
409   /*!
410    * Flag to indicate if super-resolution should be enabled for the sequence.
411    */
412   bool enable_superres;
413 } SuperResCfg;
414 
415 /*!
416  * \brief Encoder config related to the coding of key frames.
417  */
418 typedef struct {
419   /*!
420    * Indicates the minimum distance to a key frame.
421    */
422   int key_freq_min;
423 
424   /*!
425    * Indicates the maximum distance to a key frame.
426    */
427   int key_freq_max;
428 
429   /*!
430    * Indicates if temporal filtering should be applied on keyframe.
431    */
432   int enable_keyframe_filtering;
433 
434   /*!
435    * Indicates the number of frames after which a frame may be coded as an
436    * S-Frame.
437    */
438   int sframe_dist;
439 
440   /*!
441    * Indicates how an S-Frame should be inserted.
442    * 1: the considered frame will be made into an S-Frame only if it is an
443    * altref frame. 2: the next altref frame will be made into an S-Frame.
444    */
445   int sframe_mode;
446 
447   /*!
448    * Indicates if encoder should autodetect cut scenes and set the keyframes.
449    */
450   bool auto_key;
451 
452   /*!
453    * Indicates the forward key frame distance.
454    */
455   int fwd_kf_dist;
456 
457   /*!
458    * Indicates if forward keyframe reference should be enabled.
459    */
460   bool fwd_kf_enabled;
461 
462   /*!
463    * Indicates if S-Frames should be enabled for the sequence.
464    */
465   bool enable_sframe;
466 
467   /*!
468    * Indicates if intra block copy prediction mode should be enabled or not.
469    */
470   bool enable_intrabc;
471 } KeyFrameCfg;
472 
473 /*!
474  * \brief Encoder rate control configuration parameters
475  */
476 typedef struct {
477   /*!\cond */
478   // BUFFERING PARAMETERS
479   /*!\endcond */
480   /*!
481    * Indicates the amount of data that will be buffered by the decoding
482    * application prior to beginning playback, and is expressed in units of
483    * time(milliseconds).
484    */
485   int64_t starting_buffer_level_ms;
486   /*!
487    * Indicates the amount of data that the encoder should try to maintain in the
488    * decoder's buffer, and is expressed in units of time(milliseconds).
489    */
490   int64_t optimal_buffer_level_ms;
491   /*!
492    * Indicates the maximum amount of data that may be buffered by the decoding
493    * application, and is expressed in units of time(milliseconds).
494    */
495   int64_t maximum_buffer_size_ms;
496 
497   /*!
498    * Indicates the bandwidth to be used in bits per second.
499    */
500   int64_t target_bandwidth;
501 
502   /*!
503    * Indicates average complexity of the corpus in single pass vbr based on
504    * LAP. 0 indicates that corpus complexity vbr mode is disabled.
505    */
506   unsigned int vbr_corpus_complexity_lap;
507   /*!
508    * Indicates the maximum allowed bitrate for any intra frame as % of bitrate
509    * target.
510    */
511   unsigned int max_intra_bitrate_pct;
512   /*!
513    * Indicates the maximum allowed bitrate for any inter frame as % of bitrate
514    * target.
515    */
516   unsigned int max_inter_bitrate_pct;
517   /*!
518    * Indicates the percentage of rate boost for golden frame in CBR mode.
519    */
520   unsigned int gf_cbr_boost_pct;
521   /*!
522    * min_cr / 100 indicates the target minimum compression ratio for each
523    * frame.
524    */
525   unsigned int min_cr;
526   /*!
527    * Indicates the frame drop threshold.
528    */
529   int drop_frames_water_mark;
530   /*!
531    * under_shoot_pct indicates the tolerance of the VBR algorithm to
532    * undershoot and is used as a trigger threshold for more agressive
533    * adaptation of Q. It's value can range from 0-100.
534    */
535   int under_shoot_pct;
536   /*!
537    * over_shoot_pct indicates the tolerance of the VBR algorithm to overshoot
538    * and is used as a trigger threshold for more agressive adaptation of Q.
539    * It's value can range from 0-1000.
540    */
541   int over_shoot_pct;
542   /*!
543    * Indicates the maximum qindex that can be used by the quantizer i.e. the
544    * worst quality qindex.
545    */
546   int worst_allowed_q;
547   /*!
548    * Indicates the minimum qindex that can be used by the quantizer i.e. the
549    * best quality qindex.
550    */
551   int best_allowed_q;
552   /*!
553    * Indicates the Constant/Constrained Quality level.
554    */
555   int cq_level;
556   /*!
557    * Indicates if the encoding mode is vbr, cbr, constrained quality or
558    * constant quality.
559    */
560   enum aom_rc_mode mode;
561   /*!
562    * Indicates the bias (expressed on a scale of 0 to 100) for determining
563    * target size for the current frame. The value 0 indicates the optimal CBR
564    * mode value should be used, and 100 indicates the optimal VBR mode value
565    * should be used.
566    */
567   int vbrbias;
568   /*!
569    * Indicates the minimum bitrate to be used for a single frame as a percentage
570    * of the target bitrate.
571    */
572   int vbrmin_section;
573   /*!
574    * Indicates the maximum bitrate to be used for a single frame as a percentage
575    * of the target bitrate.
576    */
577   int vbrmax_section;
578 } RateControlCfg;
579 
580 /*!\cond */
581 typedef struct {
582   // Indicates the number of frames lag before encoding is started.
583   int lag_in_frames;
584   // Indicates the minimum gf/arf interval to be used.
585   int min_gf_interval;
586   // Indicates the maximum gf/arf interval to be used.
587   int max_gf_interval;
588   // Indicates the minimum height for GF group pyramid structure to be used.
589   int gf_min_pyr_height;
590   // Indicates the maximum height for GF group pyramid structure to be used.
591   int gf_max_pyr_height;
592   // Indicates if automatic set and use of altref frames should be enabled.
593   bool enable_auto_arf;
594   // Indicates if automatic set and use of (b)ackward (r)ef (f)rames should be
595   // enabled.
596   bool enable_auto_brf;
597 } GFConfig;
598 
599 typedef struct {
600   // Indicates the number of tile groups.
601   unsigned int num_tile_groups;
602   // Indicates the MTU size for a tile group. If mtu is non-zero,
603   // num_tile_groups is set to DEFAULT_MAX_NUM_TG.
604   unsigned int mtu;
605   // Indicates the number of tile columns in log2.
606   int tile_columns;
607   // Indicates the number of tile rows in log2.
608   int tile_rows;
609   // Indicates the number of widths in the tile_widths[] array.
610   int tile_width_count;
611   // Indicates the number of heights in the tile_heights[] array.
612   int tile_height_count;
613   // Indicates the tile widths, and may be empty.
614   int tile_widths[MAX_TILE_COLS];
615   // Indicates the tile heights, and may be empty.
616   int tile_heights[MAX_TILE_ROWS];
617   // Indicates if large scale tile coding should be used.
618   bool enable_large_scale_tile;
619   // Indicates if single tile decoding mode should be enabled.
620   bool enable_single_tile_decoding;
621   // Indicates if EXT_TILE_DEBUG should be enabled.
622   bool enable_ext_tile_debug;
623 } TileConfig;
624 
625 typedef struct {
626   // Indicates the width of the input frame.
627   int width;
628   // Indicates the height of the input frame.
629   int height;
630   // If forced_max_frame_width is non-zero then it is used to force the maximum
631   // frame width written in write_sequence_header().
632   int forced_max_frame_width;
633   // If forced_max_frame_width is non-zero then it is used to force the maximum
634   // frame height written in write_sequence_header().
635   int forced_max_frame_height;
636   // Indicates the frame width after applying both super-resolution and resize
637   // to the coded frame.
638   int render_width;
639   // Indicates the frame height after applying both super-resolution and resize
640   // to the coded frame.
641   int render_height;
642 } FrameDimensionCfg;
643 
644 typedef struct {
645   // Indicates if warped motion should be enabled.
646   bool enable_warped_motion;
647   // Indicates if warped motion should be evaluated or not.
648   bool allow_warped_motion;
649   // Indicates if OBMC motion should be enabled.
650   bool enable_obmc;
651 } MotionModeCfg;
652 
653 typedef struct {
654   // Timing info for each frame.
655   aom_timing_info_t timing_info;
656   // Indicates the number of time units of a decoding clock.
657   uint32_t num_units_in_decoding_tick;
658   // Indicates if decoder model information is present in the coded sequence
659   // header.
660   bool decoder_model_info_present_flag;
661   // Indicates if display model information is present in the coded sequence
662   // header.
663   bool display_model_info_present_flag;
664   // Indicates if timing info for each frame is present.
665   bool timing_info_present;
666 } DecoderModelCfg;
667 
668 typedef struct {
669   // Indicates the update frequency for coeff costs.
670   COST_UPDATE_TYPE coeff;
671   // Indicates the update frequency for mode costs.
672   COST_UPDATE_TYPE mode;
673   // Indicates the update frequency for mv costs.
674   COST_UPDATE_TYPE mv;
675   // Indicates the update frequency for dv costs.
676   COST_UPDATE_TYPE dv;
677 } CostUpdateFreq;
678 
679 typedef struct {
680   // Indicates the maximum number of reference frames allowed per frame.
681   unsigned int max_reference_frames;
682   // Indicates if the reduced set of references should be enabled.
683   bool enable_reduced_reference_set;
684   // Indicates if one-sided compound should be enabled.
685   bool enable_onesided_comp;
686 } RefFrameCfg;
687 
688 typedef struct {
689   // Indicates the color space that should be used.
690   aom_color_primaries_t color_primaries;
691   // Indicates the characteristics of transfer function to be used.
692   aom_transfer_characteristics_t transfer_characteristics;
693   // Indicates the matrix coefficients to be used for the transfer function.
694   aom_matrix_coefficients_t matrix_coefficients;
695   // Indicates the chroma 4:2:0 sample position info.
696   aom_chroma_sample_position_t chroma_sample_position;
697   // Indicates if a limited color range or full color range should be used.
698   aom_color_range_t color_range;
699 } ColorCfg;
700 
701 typedef struct {
702   // Indicates if extreme motion vector unit test should be enabled or not.
703   unsigned int motion_vector_unit_test;
704   // Indicates if superblock multipass unit test should be enabled or not.
705   unsigned int sb_multipass_unit_test;
706 } UnitTestCfg;
707 
708 typedef struct {
709   // Indicates the file path to the VMAF model.
710   const char *vmaf_model_path;
711   // Indicates the path to the film grain parameters.
712   const char *film_grain_table_filename;
713   // Indicates the visual tuning metric.
714   aom_tune_metric tuning;
715   // Indicates if the current content is screen or default type.
716   aom_tune_content content;
717   // Indicates the film grain parameters.
718   int film_grain_test_vector;
719 } TuneCfg;
720 
721 typedef struct {
722   // Indicates the framerate of the input video.
723   double init_framerate;
724   // Indicates the bit-depth of the input video.
725   unsigned int input_bit_depth;
726   // Indicates the maximum number of frames to be encoded.
727   unsigned int limit;
728   // Indicates the chrome subsampling x value.
729   unsigned int chroma_subsampling_x;
730   // Indicates the chrome subsampling y value.
731   unsigned int chroma_subsampling_y;
732 } InputCfg;
733 
734 typedef struct {
735   // List of QP offsets for: keyframe, ALTREF, and 3 levels of internal ARFs.
736   // If any of these values are negative, fixed offsets are disabled.
737   // Uses internal q range.
738   double fixed_qp_offsets[FIXED_QP_OFFSET_COUNT];
739   // If true, encoder will use fixed QP offsets, that are either:
740   // - Given by the user, and stored in 'fixed_qp_offsets' array, OR
741   // - Picked automatically from cq_level.
742   int use_fixed_qp_offsets;
743   // Indicates the minimum flatness of the quantization matrix.
744   int qm_minlevel;
745   // Indicates the maximum flatness of the quantization matrix.
746   int qm_maxlevel;
747   // Indicates if adaptive quantize_b should be enabled.
748   int quant_b_adapt;
749   // Indicates the Adaptive Quantization mode to be used.
750   AQ_MODE aq_mode;
751   // Indicates the delta q mode to be used.
752   DELTAQ_MODE deltaq_mode;
753   // Indicates if delta quantization should be enabled in chroma planes.
754   bool enable_chroma_deltaq;
755   // Indicates if encoding with quantization matrices should be enabled.
756   bool using_qm;
757 } QuantizationCfg;
758 
759 /*!\endcond */
760 /*!
761  * \brief Algorithm configuration parameters.
762  */
763 typedef struct {
764   /*!
765    * Controls the level at which rate-distortion optimization of transform
766    * coefficients favours sharpness in the block. Has no impact on RD when set
767    * to zero (default). For values 1-7, eob and skip block optimization are
768    * avoided and rdmult is adjusted in favour of block sharpness.
769    */
770   int sharpness;
771 
772   /*!
773    * Indicates the trellis optimization mode of quantized coefficients.
774    * 0: disabled
775    * 1: enabled
776    * 2: enabled for rd search
777    * 3: true for estimate yrd search
778    */
779   int disable_trellis_quant;
780 
781   /*!
782    * The maximum number of frames used to create an arf.
783    */
784   int arnr_max_frames;
785 
786   /*!
787    * The temporal filter strength for arf used when creating ARFs.
788    */
789   int arnr_strength;
790 
791   /*!
792    * Indicates the CDF update mode
793    * 0: no update
794    * 1: update on every frame(default)
795    * 2: selectively update
796    */
797   uint8_t cdf_update_mode;
798 
799   /*!
800    * Indicates if RDO based on frame temporal dependency should be enabled.
801    */
802   bool enable_tpl_model;
803 
804   /*!
805    * Indicates if coding of overlay frames for filtered ALTREF frames is
806    * enabled.
807    */
808   bool enable_overlay;
809 } AlgoCfg;
810 /*!\cond */
811 
812 typedef struct {
813   // Indicates the codec bit-depth.
814   aom_bit_depth_t bit_depth;
815   // Indicates the superblock size that should be used by the encoder.
816   aom_superblock_size_t superblock_size;
817   // Indicates if loopfilter modulation should be enabled.
818   bool enable_deltalf_mode;
819   // Indicates if CDEF should be enabled.
820   bool enable_cdef;
821   // Indicates if loop restoration filter should be enabled.
822   bool enable_restoration;
823   // When enabled, video mode should be used even for single frame input.
824   bool force_video_mode;
825   // Indicates if the error resiliency features should be enabled.
826   bool error_resilient_mode;
827   // Indicates if frame parallel decoding feature should be enabled.
828   bool frame_parallel_decoding_mode;
829   // Indicates if the input should be encoded as monochrome.
830   bool enable_monochrome;
831   // When enabled, the encoder will use a full header even for still pictures.
832   // When disabled, a reduced header is used for still pictures.
833   bool full_still_picture_hdr;
834   // Indicates if dual interpolation filters should be enabled.
835   bool enable_dual_filter;
836   // Indicates if frame order hint should be enabled or not.
837   bool enable_order_hint;
838   // Indicates if ref_frame_mvs should be enabled at the sequence level.
839   bool ref_frame_mvs_present;
840   // Indicates if ref_frame_mvs should be enabled at the frame level.
841   bool enable_ref_frame_mvs;
842   // Indicates if interintra compound mode is enabled.
843   bool enable_interintra_comp;
844   // Indicates if global motion should be enabled.
845   bool enable_global_motion;
846   // Indicates if palette should be enabled.
847   bool enable_palette;
848 } ToolCfg;
849 
850 /*!\endcond */
851 /*!
852  * \brief Main encoder configuration data structure.
853  */
854 typedef struct AV1EncoderConfig {
855   /*!\cond */
856   // Configuration related to the input video.
857   InputCfg input_cfg;
858 
859   // Configuration related to frame-dimensions.
860   FrameDimensionCfg frm_dim_cfg;
861 
862   /*!\endcond */
863   /*!
864    * Encoder algorithm configuration.
865    */
866   AlgoCfg algo_cfg;
867 
868   /*!
869    * Configuration related to key-frames.
870    */
871   KeyFrameCfg kf_cfg;
872 
873   /*!
874    * Rate control configuration
875    */
876   RateControlCfg rc_cfg;
877   /*!\cond */
878 
879   // Configuration related to Quantization.
880   QuantizationCfg q_cfg;
881 
882   // Internal frame size scaling.
883   ResizeCfg resize_cfg;
884 
885   // Frame Super-Resolution size scaling.
886   SuperResCfg superres_cfg;
887 
888   /*!\endcond */
889   /*!
890    * stats_in buffer contains all of the stats packets produced in the first
891    * pass, concatenated.
892    */
893   aom_fixed_buf_t twopass_stats_in;
894   /*!\cond */
895 
896   // Configuration related to encoder toolsets.
897   ToolCfg tool_cfg;
898 
899   // Configuration related to Group of frames.
900   GFConfig gf_cfg;
901 
902   // Tile related configuration parameters.
903   TileConfig tile_cfg;
904 
905   // Configuration related to Tune.
906   TuneCfg tune_cfg;
907 
908   // Configuration related to color.
909   ColorCfg color_cfg;
910 
911   // Configuration related to decoder model.
912   DecoderModelCfg dec_model_cfg;
913 
914   // Configuration related to reference frames.
915   RefFrameCfg ref_frm_cfg;
916 
917   // Configuration related to unit tests.
918   UnitTestCfg unit_test_cfg;
919 
920   // Flags related to motion mode.
921   MotionModeCfg motion_mode_cfg;
922 
923   // Flags related to intra mode search.
924   IntraModeCfg intra_mode_cfg;
925 
926   // Flags related to transform size/type.
927   TxfmSizeTypeCfg txfm_cfg;
928 
929   // Flags related to compound type.
930   CompoundTypeCfg comp_type_cfg;
931 
932   // Partition related information.
933   PartitionCfg part_cfg;
934 
935   // Configuration related to frequency of cost update.
936   CostUpdateFreq cost_upd_freq;
937 
938 #if CONFIG_DENOISE
939   // Indicates the noise level.
940   float noise_level;
941   // Indicates the the denoisers block size.
942   int noise_block_size;
943   // Indicates whether to apply denoising to the frame to be encoded
944   int enable_dnl_denoising;
945 #endif
946 
947 #if CONFIG_AV1_TEMPORAL_DENOISING
948   // Noise sensitivity.
949   int noise_sensitivity;
950 #endif
951   // Bit mask to specify which tier each of the 32 possible operating points
952   // conforms to.
953   unsigned int tier_mask;
954 
955   // Indicates the number of pixels off the edge of a reference frame we're
956   // allowed to go when forming an inter prediction.
957   int border_in_pixels;
958 
959   // Indicates the maximum number of threads that may be used by the encoder.
960   int max_threads;
961 
962   // Indicates the speed preset to be used.
963   int speed;
964 
965   // Indicates the target sequence level index for each operating point(OP).
966   AV1_LEVEL target_seq_level_idx[MAX_NUM_OPERATING_POINTS];
967 
968   // Indicates the bitstream profile to be used.
969   BITSTREAM_PROFILE profile;
970 
971   /*!\endcond */
972   /*!
973    * Indicates the current encoder pass :
974    * AOM_RC_ONE_PASS = One pass encode,
975    * AOM_RC_FIRST_PASS = First pass of multiple-pass
976    * AOM_RC_SECOND_PASS = Second pass of multiple-pass
977    * AOM_RC_THIRD_PASS = Third pass of multiple-pass
978    */
979   enum aom_enc_pass pass;
980   /*!\cond */
981 
982   // Total number of encoding passes.
983   int passes;
984 
985   // the name of the second pass output file when passes > 2
986   const char *two_pass_output;
987 
988   // Indicates if the encoding is GOOD or REALTIME.
989   MODE mode;
990 
991   // Indicates if row-based multi-threading should be enabled or not.
992   bool row_mt;
993 
994   // Indicates if 16bit frame buffers are to be used i.e., the content is >
995   // 8-bit.
996   bool use_highbitdepth;
997 
998   // Indicates the bitstream syntax mode. 0 indicates bitstream is saved as
999   // Section 5 bitstream, while 1 indicates the bitstream is saved in Annex - B
1000   // format.
1001   bool save_as_annexb;
1002 
1003   // The path for partition stats reading and writing, used in the experiment
1004   // CONFIG_PARTITION_SEARCH_ORDER.
1005   const char *partition_info_path;
1006   /*!\endcond */
1007 } AV1EncoderConfig;
1008 
1009 /*!\cond */
is_lossless_requested(const RateControlCfg * const rc_cfg)1010 static INLINE int is_lossless_requested(const RateControlCfg *const rc_cfg) {
1011   return rc_cfg->best_allowed_q == 0 && rc_cfg->worst_allowed_q == 0;
1012 }
1013 /*!\endcond */
1014 
1015 /*!
1016  * \brief Encoder-side probabilities for pruning of various AV1 tools
1017  */
1018 typedef struct {
1019   /*!
1020    * obmc_probs[i][j] is the probability of OBMC being the best motion mode for
1021    * jth block size and ith frame update type, averaged over past frames. If
1022    * obmc_probs[i][j] < thresh, then OBMC search is pruned.
1023    */
1024   int obmc_probs[FRAME_UPDATE_TYPES][BLOCK_SIZES_ALL];
1025 
1026   /*!
1027    * warped_probs[i] is the probability of warped motion being the best motion
1028    * mode for ith frame update type, averaged over past frames. If
1029    * warped_probs[i] < thresh, then warped motion search is pruned.
1030    */
1031   int warped_probs[FRAME_UPDATE_TYPES];
1032 
1033   /*!
1034    * tx_type_probs[i][j][k] is the probability of kth tx_type being the best
1035    * for jth transform size and ith frame update type, averaged over past
1036    * frames. If tx_type_probs[i][j][k] < thresh, then transform search for that
1037    * type is pruned.
1038    */
1039   int tx_type_probs[FRAME_UPDATE_TYPES][TX_SIZES_ALL][TX_TYPES];
1040 
1041   /*!
1042    * switchable_interp_probs[i][j][k] is the probability of kth interpolation
1043    * filter being the best for jth filter context and ith frame update type,
1044    * averaged over past frames. If switchable_interp_probs[i][j][k] < thresh,
1045    * then interpolation filter search is pruned for that case.
1046    */
1047   int switchable_interp_probs[FRAME_UPDATE_TYPES][SWITCHABLE_FILTER_CONTEXTS]
1048                              [SWITCHABLE_FILTERS];
1049 } FrameProbInfo;
1050 
1051 /*!\cond */
1052 
1053 typedef struct FRAME_COUNTS {
1054 // Note: This structure should only contain 'unsigned int' fields, or
1055 // aggregates built solely from 'unsigned int' fields/elements
1056 #if CONFIG_ENTROPY_STATS
1057   unsigned int kf_y_mode[KF_MODE_CONTEXTS][KF_MODE_CONTEXTS][INTRA_MODES];
1058   unsigned int angle_delta[DIRECTIONAL_MODES][2 * MAX_ANGLE_DELTA + 1];
1059   unsigned int y_mode[BLOCK_SIZE_GROUPS][INTRA_MODES];
1060   unsigned int uv_mode[CFL_ALLOWED_TYPES][INTRA_MODES][UV_INTRA_MODES];
1061   unsigned int cfl_sign[CFL_JOINT_SIGNS];
1062   unsigned int cfl_alpha[CFL_ALPHA_CONTEXTS][CFL_ALPHABET_SIZE];
1063   unsigned int palette_y_mode[PALATTE_BSIZE_CTXS][PALETTE_Y_MODE_CONTEXTS][2];
1064   unsigned int palette_uv_mode[PALETTE_UV_MODE_CONTEXTS][2];
1065   unsigned int palette_y_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
1066   unsigned int palette_uv_size[PALATTE_BSIZE_CTXS][PALETTE_SIZES];
1067   unsigned int palette_y_color_index[PALETTE_SIZES]
1068                                     [PALETTE_COLOR_INDEX_CONTEXTS]
1069                                     [PALETTE_COLORS];
1070   unsigned int palette_uv_color_index[PALETTE_SIZES]
1071                                      [PALETTE_COLOR_INDEX_CONTEXTS]
1072                                      [PALETTE_COLORS];
1073   unsigned int partition[PARTITION_CONTEXTS][EXT_PARTITION_TYPES];
1074   unsigned int txb_skip[TOKEN_CDF_Q_CTXS][TX_SIZES][TXB_SKIP_CONTEXTS][2];
1075   unsigned int eob_extra[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
1076                         [EOB_COEF_CONTEXTS][2];
1077   unsigned int dc_sign[PLANE_TYPES][DC_SIGN_CONTEXTS][2];
1078   unsigned int coeff_lps[TX_SIZES][PLANE_TYPES][BR_CDF_SIZE - 1][LEVEL_CONTEXTS]
1079                         [2];
1080   unsigned int eob_flag[TX_SIZES][PLANE_TYPES][EOB_COEF_CONTEXTS][2];
1081   unsigned int eob_multi16[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][5];
1082   unsigned int eob_multi32[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][6];
1083   unsigned int eob_multi64[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][7];
1084   unsigned int eob_multi128[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][8];
1085   unsigned int eob_multi256[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][9];
1086   unsigned int eob_multi512[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][10];
1087   unsigned int eob_multi1024[TOKEN_CDF_Q_CTXS][PLANE_TYPES][2][11];
1088   unsigned int coeff_lps_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
1089                               [LEVEL_CONTEXTS][BR_CDF_SIZE];
1090   unsigned int coeff_base_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
1091                                [SIG_COEF_CONTEXTS][NUM_BASE_LEVELS + 2];
1092   unsigned int coeff_base_eob_multi[TOKEN_CDF_Q_CTXS][TX_SIZES][PLANE_TYPES]
1093                                    [SIG_COEF_CONTEXTS_EOB][NUM_BASE_LEVELS + 1];
1094   unsigned int newmv_mode[NEWMV_MODE_CONTEXTS][2];
1095   unsigned int zeromv_mode[GLOBALMV_MODE_CONTEXTS][2];
1096   unsigned int refmv_mode[REFMV_MODE_CONTEXTS][2];
1097   unsigned int drl_mode[DRL_MODE_CONTEXTS][2];
1098   unsigned int inter_compound_mode[INTER_MODE_CONTEXTS][INTER_COMPOUND_MODES];
1099   unsigned int wedge_idx[BLOCK_SIZES_ALL][16];
1100   unsigned int interintra[BLOCK_SIZE_GROUPS][2];
1101   unsigned int interintra_mode[BLOCK_SIZE_GROUPS][INTERINTRA_MODES];
1102   unsigned int wedge_interintra[BLOCK_SIZES_ALL][2];
1103   unsigned int compound_type[BLOCK_SIZES_ALL][MASKED_COMPOUND_TYPES];
1104   unsigned int motion_mode[BLOCK_SIZES_ALL][MOTION_MODES];
1105   unsigned int obmc[BLOCK_SIZES_ALL][2];
1106   unsigned int intra_inter[INTRA_INTER_CONTEXTS][2];
1107   unsigned int comp_inter[COMP_INTER_CONTEXTS][2];
1108   unsigned int comp_ref_type[COMP_REF_TYPE_CONTEXTS][2];
1109   unsigned int uni_comp_ref[UNI_COMP_REF_CONTEXTS][UNIDIR_COMP_REFS - 1][2];
1110   unsigned int single_ref[REF_CONTEXTS][SINGLE_REFS - 1][2];
1111   unsigned int comp_ref[REF_CONTEXTS][FWD_REFS - 1][2];
1112   unsigned int comp_bwdref[REF_CONTEXTS][BWD_REFS - 1][2];
1113   unsigned int intrabc[2];
1114 
1115   unsigned int txfm_partition[TXFM_PARTITION_CONTEXTS][2];
1116   unsigned int intra_tx_size[MAX_TX_CATS][TX_SIZE_CONTEXTS][MAX_TX_DEPTH + 1];
1117   unsigned int skip_mode[SKIP_MODE_CONTEXTS][2];
1118   unsigned int skip_txfm[SKIP_CONTEXTS][2];
1119   unsigned int compound_index[COMP_INDEX_CONTEXTS][2];
1120   unsigned int comp_group_idx[COMP_GROUP_IDX_CONTEXTS][2];
1121   unsigned int delta_q[DELTA_Q_PROBS][2];
1122   unsigned int delta_lf_multi[FRAME_LF_COUNT][DELTA_LF_PROBS][2];
1123   unsigned int delta_lf[DELTA_LF_PROBS][2];
1124 
1125   unsigned int inter_ext_tx[EXT_TX_SETS_INTER][EXT_TX_SIZES][TX_TYPES];
1126   unsigned int intra_ext_tx[EXT_TX_SETS_INTRA][EXT_TX_SIZES][INTRA_MODES]
1127                            [TX_TYPES];
1128   unsigned int filter_intra_mode[FILTER_INTRA_MODES];
1129   unsigned int filter_intra[BLOCK_SIZES_ALL][2];
1130   unsigned int switchable_restore[RESTORE_SWITCHABLE_TYPES];
1131   unsigned int wiener_restore[2];
1132   unsigned int sgrproj_restore[2];
1133 #endif  // CONFIG_ENTROPY_STATS
1134 
1135   unsigned int switchable_interp[SWITCHABLE_FILTER_CONTEXTS]
1136                                 [SWITCHABLE_FILTERS];
1137 } FRAME_COUNTS;
1138 
1139 #define INTER_MODE_RD_DATA_OVERALL_SIZE 6400
1140 
1141 typedef struct {
1142   int ready;
1143   double a;
1144   double b;
1145   double dist_mean;
1146   double ld_mean;
1147   double sse_mean;
1148   double sse_sse_mean;
1149   double sse_ld_mean;
1150   int num;
1151   double dist_sum;
1152   double ld_sum;
1153   double sse_sum;
1154   double sse_sse_sum;
1155   double sse_ld_sum;
1156 } InterModeRdModel;
1157 
1158 typedef struct {
1159   int idx;
1160   int64_t rd;
1161 } RdIdxPair;
1162 // TODO(angiebird): This is an estimated size. We still need to figure what is
1163 // the maximum number of modes.
1164 #define MAX_INTER_MODES 1024
1165 // TODO(any): rename this struct to something else. There is already another
1166 // struct called inter_mode_info, which makes this terribly confusing.
1167 /*!\endcond */
1168 /*!
1169  * \brief Struct used to hold inter mode data for fast tx search.
1170  *
1171  * This struct is used to perform a full transform search only on winning
1172  * candidates searched with an estimate for transform coding RD.
1173  */
1174 typedef struct inter_modes_info {
1175   /*!
1176    * The number of inter modes for which data was stored in each of the
1177    * following arrays.
1178    */
1179   int num;
1180   /*!
1181    * Mode info struct for each of the candidate modes.
1182    */
1183   MB_MODE_INFO mbmi_arr[MAX_INTER_MODES];
1184   /*!
1185    * The rate for each of the candidate modes.
1186    */
1187   int mode_rate_arr[MAX_INTER_MODES];
1188   /*!
1189    * The sse of the predictor for each of the candidate modes.
1190    */
1191   int64_t sse_arr[MAX_INTER_MODES];
1192   /*!
1193    * The estimated rd of the predictor for each of the candidate modes.
1194    */
1195   int64_t est_rd_arr[MAX_INTER_MODES];
1196   /*!
1197    * The rate and mode index for each of the candidate modes.
1198    */
1199   RdIdxPair rd_idx_pair_arr[MAX_INTER_MODES];
1200   /*!
1201    * The full rd stats for each of the candidate modes.
1202    */
1203   RD_STATS rd_cost_arr[MAX_INTER_MODES];
1204   /*!
1205    * The full rd stats of luma only for each of the candidate modes.
1206    */
1207   RD_STATS rd_cost_y_arr[MAX_INTER_MODES];
1208   /*!
1209    * The full rd stats of chroma only for each of the candidate modes.
1210    */
1211   RD_STATS rd_cost_uv_arr[MAX_INTER_MODES];
1212 } InterModesInfo;
1213 
1214 /*!\cond */
1215 typedef struct {
1216   // TODO(kyslov): consider changing to 64bit
1217 
1218   // This struct is used for computing variance in choose_partitioning(), where
1219   // the max number of samples within a superblock is 32x32 (with 4x4 avg).
1220   // With 8bit bitdepth, uint32_t is enough for sum_square_error (2^8 * 2^8 * 32
1221   // * 32 = 2^26). For high bitdepth we need to consider changing this to 64 bit
1222   uint32_t sum_square_error;
1223   int32_t sum_error;
1224   int log2_count;
1225   int variance;
1226 } VPartVar;
1227 
1228 typedef struct {
1229   VPartVar none;
1230   VPartVar horz[2];
1231   VPartVar vert[2];
1232 } VPVariance;
1233 
1234 typedef struct {
1235   VPVariance part_variances;
1236   VPartVar split[4];
1237 } VP4x4;
1238 
1239 typedef struct {
1240   VPVariance part_variances;
1241   VP4x4 split[4];
1242 } VP8x8;
1243 
1244 typedef struct {
1245   VPVariance part_variances;
1246   VP8x8 split[4];
1247 } VP16x16;
1248 
1249 typedef struct {
1250   VPVariance part_variances;
1251   VP16x16 split[4];
1252 } VP32x32;
1253 
1254 typedef struct {
1255   VPVariance part_variances;
1256   VP32x32 split[4];
1257 } VP64x64;
1258 
1259 typedef struct {
1260   VPVariance part_variances;
1261   VP64x64 *split;
1262 } VP128x128;
1263 
1264 /*!\endcond */
1265 
1266 /*!
1267  * \brief Thresholds for variance based partitioning.
1268  */
1269 typedef struct {
1270   /*!
1271    * If block variance > threshold, then that block is forced to split.
1272    * thresholds[0] - threshold for 128x128;
1273    * thresholds[1] - threshold for 64x64;
1274    * thresholds[2] - threshold for 32x32;
1275    * thresholds[3] - threshold for 16x16;
1276    * thresholds[4] - threshold for 8x8;
1277    */
1278   int64_t thresholds[5];
1279 
1280   /*!
1281    * MinMax variance threshold for 8x8 sub blocks of a 16x16 block. If actual
1282    * minmax > threshold_minmax, the 16x16 is forced to split.
1283    */
1284   int64_t threshold_minmax;
1285 } VarBasedPartitionInfo;
1286 
1287 /*!
1288  * \brief Encoder parameters for synchronization of row based multi-threading
1289  */
1290 typedef struct {
1291 #if CONFIG_MULTITHREAD
1292   /**
1293    * \name Synchronization objects for top-right dependency.
1294    */
1295   /**@{*/
1296   pthread_mutex_t *mutex_; /*!< Mutex lock object */
1297   pthread_cond_t *cond_;   /*!< Condition variable */
1298   /**@}*/
1299 #endif  // CONFIG_MULTITHREAD
1300   /*!
1301    * Buffer to store the superblock whose encoding is complete.
1302    * cur_col[i] stores the number of superblocks which finished encoding in the
1303    * ith superblock row.
1304    */
1305   int *num_finished_cols;
1306   /*!
1307    * Number of extra superblocks of the top row to be complete for encoding
1308    * of the current superblock to start. A value of 1 indicates top-right
1309    * dependency.
1310    */
1311   int sync_range;
1312   /*!
1313    * Number of superblock rows.
1314    */
1315   int rows;
1316   /*!
1317    * The superblock row (in units of MI blocks) to be processed next.
1318    */
1319   int next_mi_row;
1320   /*!
1321    * Number of threads processing the current tile.
1322    */
1323   int num_threads_working;
1324 } AV1EncRowMultiThreadSync;
1325 
1326 /*!\cond */
1327 
1328 // TODO(jingning) All spatially adaptive variables should go to TileDataEnc.
1329 typedef struct TileDataEnc {
1330   TileInfo tile_info;
1331   DECLARE_ALIGNED(16, FRAME_CONTEXT, tctx);
1332   FRAME_CONTEXT *row_ctx;
1333   uint64_t abs_sum_level;
1334   uint8_t allow_update_cdf;
1335   InterModeRdModel inter_mode_rd_models[BLOCK_SIZES_ALL];
1336   AV1EncRowMultiThreadSync row_mt_sync;
1337   MV firstpass_top_mv;
1338 } TileDataEnc;
1339 
1340 typedef struct RD_COUNTS {
1341   int64_t comp_pred_diff[REFERENCE_MODES];
1342   int compound_ref_used_flag;
1343   int skip_mode_used_flag;
1344   int tx_type_used[TX_SIZES_ALL][TX_TYPES];
1345   int obmc_used[BLOCK_SIZES_ALL][2];
1346   int warped_used[2];
1347 } RD_COUNTS;
1348 
1349 typedef struct ThreadData {
1350   MACROBLOCK mb;
1351   RD_COUNTS rd_counts;
1352   FRAME_COUNTS *counts;
1353   PC_TREE_SHARED_BUFFERS shared_coeff_buf;
1354   SIMPLE_MOTION_DATA_TREE *sms_tree;
1355   SIMPLE_MOTION_DATA_TREE *sms_root;
1356   uint32_t *hash_value_buffer[2][2];
1357   OBMCBuffer obmc_buffer;
1358   PALETTE_BUFFER *palette_buffer;
1359   CompoundTypeRdBuffers comp_rd_buffer;
1360   CONV_BUF_TYPE *tmp_conv_dst;
1361   uint64_t abs_sum_level;
1362   uint8_t *tmp_pred_bufs[2];
1363   int intrabc_used;
1364   int deltaq_used;
1365   int coefficient_size;
1366   int max_mv_magnitude;
1367   int interp_filter_selected[SWITCHABLE];
1368   FRAME_CONTEXT *tctx;
1369   VP64x64 *vt64x64;
1370   int32_t num_64x64_blocks;
1371   PICK_MODE_CONTEXT *firstpass_ctx;
1372   TemporalFilterData tf_data;
1373   TplTxfmStats tpl_txfm_stats;
1374   // Pointer to the array of structures to store gradient information of each
1375   // pixel in a superblock. The buffer constitutes of MAX_SB_SQUARE pixel level
1376   // structures for each of the plane types (PLANE_TYPE_Y and PLANE_TYPE_UV).
1377   PixelLevelGradientInfo *pixel_gradient_info;
1378 } ThreadData;
1379 
1380 struct EncWorkerData;
1381 
1382 /*!\endcond */
1383 
1384 /*!
1385  * \brief Encoder data related to row-based multi-threading
1386  */
1387 typedef struct {
1388   /*!
1389    * Number of tile rows for which row synchronization memory is allocated.
1390    */
1391   int allocated_tile_rows;
1392   /*!
1393    * Number of tile cols for which row synchronization memory is allocated.
1394    */
1395   int allocated_tile_cols;
1396   /*!
1397    * Number of rows for which row synchronization memory is allocated
1398    * per tile. During first-pass/look-ahead stage this equals the
1399    * maximum number of macroblock rows in a tile. During encode stage,
1400    * this equals the maximum number of superblock rows in a tile.
1401    */
1402   int allocated_rows;
1403   /*!
1404    * Number of columns for which entropy context memory is allocated
1405    * per tile. During encode stage, this equals the maximum number of
1406    * superblock columns in a tile minus 1. The entropy context memory
1407    * is not allocated during first-pass/look-ahead stage.
1408    */
1409   int allocated_cols;
1410 
1411   /*!
1412    * thread_id_to_tile_id[i] indicates the tile id assigned to the ith thread.
1413    */
1414   int thread_id_to_tile_id[MAX_NUM_THREADS];
1415 
1416 #if CONFIG_MULTITHREAD
1417   /*!
1418    * Mutex lock used while dispatching jobs.
1419    */
1420   pthread_mutex_t *mutex_;
1421 #endif
1422 
1423   /**
1424    * \name Row synchronization related function pointers.
1425    */
1426   /**@{*/
1427   /*!
1428    * Reader.
1429    */
1430   void (*sync_read_ptr)(AV1EncRowMultiThreadSync *const, int, int);
1431   /*!
1432    * Writer.
1433    */
1434   void (*sync_write_ptr)(AV1EncRowMultiThreadSync *const, int, int, int);
1435   /**@}*/
1436 } AV1EncRowMultiThreadInfo;
1437 
1438 #if CONFIG_FRAME_PARALLEL_ENCODE
1439 /*!
1440  * \brief Max number of frames that can be encoded in a parallel encode set.
1441  */
1442 #define MAX_PARALLEL_FRAMES 4
1443 /*!
1444  * \brief Max number of recodes used to track the frame probabilities.
1445  */
1446 #define NUM_RECODES_PER_FRAME 10
1447 
1448 /*!
1449  * \brief Buffers to be backed up during parallel encode set to be restored
1450  * later.
1451  */
1452 typedef struct RestoreStateBuffers {
1453   /*!
1454    * Backup of original CDEF srcbuf.
1455    */
1456   uint16_t *cdef_srcbuf;
1457 
1458   /*!
1459    * Backup of original CDEF colbuf.
1460    */
1461   uint16_t *cdef_colbuf[MAX_MB_PLANE];
1462 
1463   /*!
1464    * Backup of original LR rst_tmpbuf.
1465    */
1466   int32_t *rst_tmpbuf;
1467 
1468   /*!
1469    * Backup of original LR rlbs.
1470    */
1471   RestorationLineBuffers *rlbs;
1472 } RestoreStateBuffers;
1473 #endif  // CONFIG_FRAME_PARALLEL_ENCODE
1474 
1475 /*!
1476  * \brief Primary Encoder parameters related to multi-threading.
1477  */
1478 typedef struct PrimaryMultiThreadInfo {
1479   /*!
1480    * Number of workers created for multi-threading.
1481    */
1482   int num_workers;
1483 
1484   /*!
1485    * Number of workers used for different MT modules.
1486    */
1487   int num_mod_workers[NUM_MT_MODULES];
1488 
1489   /*!
1490    * Synchronization object used to launch job in the worker thread.
1491    */
1492   AVxWorker *workers;
1493 
1494   /*!
1495    * Data specific to each worker in encoder multi-threading.
1496    * tile_thr_data[i] stores the worker data of the ith thread.
1497    */
1498   struct EncWorkerData *tile_thr_data;
1499 
1500   /*!
1501    * CDEF row multi-threading data.
1502    */
1503   AV1CdefWorkerData *cdef_worker;
1504 
1505 #if CONFIG_FRAME_PARALLEL_ENCODE
1506   /*!
1507    * Primary(Level 1) Synchronization object used to launch job in the worker
1508    * thread.
1509    */
1510   AVxWorker *p_workers[MAX_PARALLEL_FRAMES];
1511 
1512   /*!
1513    * Number of primary workers created for multi-threading.
1514    */
1515   int p_num_workers;
1516 #endif  // CONFIG_FRAME_PARALLEL_ENCODE
1517 } PrimaryMultiThreadInfo;
1518 
1519 /*!
1520  * \brief Encoder parameters related to multi-threading.
1521  */
1522 typedef struct MultiThreadInfo {
1523   /*!
1524    * Number of workers created for multi-threading.
1525    */
1526   int num_workers;
1527 
1528   /*!
1529    * Number of workers used for different MT modules.
1530    */
1531   int num_mod_workers[NUM_MT_MODULES];
1532 
1533   /*!
1534    * Synchronization object used to launch job in the worker thread.
1535    */
1536   AVxWorker *workers;
1537 
1538   /*!
1539    * Data specific to each worker in encoder multi-threading.
1540    * tile_thr_data[i] stores the worker data of the ith thread.
1541    */
1542   struct EncWorkerData *tile_thr_data;
1543 
1544   /*!
1545    * When set, indicates that row based multi-threading of the encoder is
1546    * enabled.
1547    */
1548   bool row_mt_enabled;
1549 
1550   /*!
1551    * Encoder row multi-threading data.
1552    */
1553   AV1EncRowMultiThreadInfo enc_row_mt;
1554 
1555   /*!
1556    * Tpl row multi-threading data.
1557    */
1558   AV1TplRowMultiThreadInfo tpl_row_mt;
1559 
1560   /*!
1561    * Loop Filter multi-threading object.
1562    */
1563   AV1LfSync lf_row_sync;
1564 
1565   /*!
1566    * Loop Restoration multi-threading object.
1567    */
1568   AV1LrSync lr_row_sync;
1569 
1570   /*!
1571    * Pack bitstream multi-threading object.
1572    */
1573   AV1EncPackBSSync pack_bs_sync;
1574 
1575   /*!
1576    * Global Motion multi-threading object.
1577    */
1578   AV1GlobalMotionSync gm_sync;
1579 
1580   /*!
1581    * Temporal Filter multi-threading object.
1582    */
1583   AV1TemporalFilterSync tf_sync;
1584 
1585   /*!
1586    * CDEF search multi-threading object.
1587    */
1588   AV1CdefSync cdef_sync;
1589 
1590   /*!
1591    * Pointer to CDEF row multi-threading data for the frame.
1592    */
1593   AV1CdefWorkerData *cdef_worker;
1594 
1595 #if CONFIG_FRAME_PARALLEL_ENCODE
1596   /*!
1597    * Buffers to be stored/restored before/after parallel encode.
1598    */
1599   RestoreStateBuffers restore_state_buf;
1600 #endif  // CONFIG_FRAME_PARALLEL_ENCODE
1601 } MultiThreadInfo;
1602 
1603 /*!\cond */
1604 
1605 typedef struct ActiveMap {
1606   int enabled;
1607   int update;
1608   unsigned char *map;
1609 } ActiveMap;
1610 
1611 /*!\endcond */
1612 
1613 /*!
1614  * \brief Encoder info used for decision on forcing integer motion vectors.
1615  */
1616 typedef struct {
1617   /*!
1618    * cs_rate_array[i] is the fraction of blocks in a frame which either match
1619    * with the collocated block or are smooth, where i is the rate_index.
1620    */
1621   double cs_rate_array[32];
1622   /*!
1623    * rate_index is used to index cs_rate_array.
1624    */
1625   int rate_index;
1626   /*!
1627    * rate_size is the total number of entries populated in cs_rate_array.
1628    */
1629   int rate_size;
1630 } ForceIntegerMVInfo;
1631 
1632 /*!\cond */
1633 
1634 #if CONFIG_INTERNAL_STATS
1635 // types of stats
1636 enum {
1637   STAT_Y,
1638   STAT_U,
1639   STAT_V,
1640   STAT_ALL,
1641   NUM_STAT_TYPES  // This should always be the last member of the enum
1642 } UENUM1BYTE(StatType);
1643 
1644 typedef struct IMAGE_STAT {
1645   double stat[NUM_STAT_TYPES];
1646   double worst;
1647 } ImageStat;
1648 #endif  // CONFIG_INTERNAL_STATS
1649 
1650 typedef struct {
1651   int ref_count;
1652   YV12_BUFFER_CONFIG buf;
1653 } EncRefCntBuffer;
1654 
1655 /*!\endcond */
1656 
1657 /*!
1658  * \brief Buffer to store mode information at mi_alloc_bsize (4x4 or 8x8) level
1659  *
1660  * This is used for bitstream preparation.
1661  */
1662 typedef struct {
1663   /*!
1664    * frame_base[mi_row * stride + mi_col] stores the mode information of
1665    * block (mi_row,mi_col).
1666    */
1667   MB_MODE_INFO_EXT_FRAME *frame_base;
1668   /*!
1669    * Size of frame_base buffer.
1670    */
1671   int alloc_size;
1672   /*!
1673    * Stride of frame_base buffer.
1674    */
1675   int stride;
1676 } MBMIExtFrameBufferInfo;
1677 
1678 /*!\cond */
1679 
1680 #if CONFIG_COLLECT_PARTITION_STATS
1681 typedef struct FramePartitionTimingStats {
1682   int partition_decisions[6][EXT_PARTITION_TYPES];
1683   int partition_attempts[6][EXT_PARTITION_TYPES];
1684   int64_t partition_times[6][EXT_PARTITION_TYPES];
1685 
1686   int partition_redo;
1687 } FramePartitionTimingStats;
1688 #endif  // CONFIG_COLLECT_PARTITION_STATS
1689 
1690 #if CONFIG_COLLECT_COMPONENT_TIMING
1691 #include "aom_ports/aom_timer.h"
1692 // Adjust the following to add new components.
1693 enum {
1694   av1_encode_strategy_time,
1695   av1_get_one_pass_rt_params_time,
1696   av1_get_second_pass_params_time,
1697   denoise_and_encode_time,
1698   apply_filtering_time,
1699   av1_tpl_setup_stats_time,
1700   encode_frame_to_data_rate_time,
1701   encode_with_or_without_recode_time,
1702   loop_filter_time,
1703   cdef_time,
1704   loop_restoration_time,
1705   av1_pack_bitstream_final_time,
1706   av1_encode_frame_time,
1707   av1_compute_global_motion_time,
1708   av1_setup_motion_field_time,
1709   encode_sb_row_time,
1710 
1711   rd_pick_partition_time,
1712   rd_use_partition_time,
1713   av1_prune_partitions_time,
1714   none_partition_search_time,
1715   split_partition_search_time,
1716   rectangular_partition_search_time,
1717   ab_partitions_search_time,
1718   rd_pick_4partition_time,
1719   encode_sb_time,
1720 
1721   rd_pick_sb_modes_time,
1722   av1_rd_pick_intra_mode_sb_time,
1723   av1_rd_pick_inter_mode_sb_time,
1724   set_params_rd_pick_inter_mode_time,
1725   skip_inter_mode_time,
1726   handle_inter_mode_time,
1727   evaluate_motion_mode_for_winner_candidates_time,
1728   do_tx_search_time,
1729   handle_intra_mode_time,
1730   refine_winner_mode_tx_time,
1731   av1_search_palette_mode_time,
1732   handle_newmv_time,
1733   compound_type_rd_time,
1734   interpolation_filter_search_time,
1735   motion_mode_rd_time,
1736   kTimingComponents,
1737 } UENUM1BYTE(TIMING_COMPONENT);
1738 
get_component_name(int index)1739 static INLINE char const *get_component_name(int index) {
1740   switch (index) {
1741     case av1_encode_strategy_time: return "av1_encode_strategy_time";
1742     case av1_get_one_pass_rt_params_time:
1743       return "av1_get_one_pass_rt_params_time";
1744     case av1_get_second_pass_params_time:
1745       return "av1_get_second_pass_params_time";
1746     case denoise_and_encode_time: return "denoise_and_encode_time";
1747     case apply_filtering_time: return "apply_filtering_time";
1748     case av1_tpl_setup_stats_time: return "av1_tpl_setup_stats_time";
1749     case encode_frame_to_data_rate_time:
1750       return "encode_frame_to_data_rate_time";
1751     case encode_with_or_without_recode_time:
1752       return "encode_with_or_without_recode_time";
1753     case loop_filter_time: return "loop_filter_time";
1754     case cdef_time: return "cdef_time";
1755     case loop_restoration_time: return "loop_restoration_time";
1756     case av1_pack_bitstream_final_time: return "av1_pack_bitstream_final_time";
1757     case av1_encode_frame_time: return "av1_encode_frame_time";
1758     case av1_compute_global_motion_time:
1759       return "av1_compute_global_motion_time";
1760     case av1_setup_motion_field_time: return "av1_setup_motion_field_time";
1761     case encode_sb_row_time: return "encode_sb_row_time";
1762 
1763     case rd_pick_partition_time: return "rd_pick_partition_time";
1764     case rd_use_partition_time: return "rd_use_partition_time";
1765     case av1_prune_partitions_time: return "av1_prune_partitions_time";
1766     case none_partition_search_time: return "none_partition_search_time";
1767     case split_partition_search_time: return "split_partition_search_time";
1768     case rectangular_partition_search_time:
1769       return "rectangular_partition_search_time";
1770     case ab_partitions_search_time: return "ab_partitions_search_time";
1771     case rd_pick_4partition_time: return "rd_pick_4partition_time";
1772     case encode_sb_time: return "encode_sb_time";
1773 
1774     case rd_pick_sb_modes_time: return "rd_pick_sb_modes_time";
1775     case av1_rd_pick_intra_mode_sb_time:
1776       return "av1_rd_pick_intra_mode_sb_time";
1777     case av1_rd_pick_inter_mode_sb_time:
1778       return "av1_rd_pick_inter_mode_sb_time";
1779     case set_params_rd_pick_inter_mode_time:
1780       return "set_params_rd_pick_inter_mode_time";
1781     case skip_inter_mode_time: return "skip_inter_mode_time";
1782     case handle_inter_mode_time: return "handle_inter_mode_time";
1783     case evaluate_motion_mode_for_winner_candidates_time:
1784       return "evaluate_motion_mode_for_winner_candidates_time";
1785     case do_tx_search_time: return "do_tx_search_time";
1786     case handle_intra_mode_time: return "handle_intra_mode_time";
1787     case refine_winner_mode_tx_time: return "refine_winner_mode_tx_time";
1788     case av1_search_palette_mode_time: return "av1_search_palette_mode_time";
1789     case handle_newmv_time: return "handle_newmv_time";
1790     case compound_type_rd_time: return "compound_type_rd_time";
1791     case interpolation_filter_search_time:
1792       return "interpolation_filter_search_time";
1793     case motion_mode_rd_time: return "motion_mode_rd_time";
1794     default: assert(0);
1795   }
1796   return "error";
1797 }
1798 #endif
1799 
1800 // The maximum number of internal ARFs except ALTREF_FRAME
1801 #define MAX_INTERNAL_ARFS (REF_FRAMES - BWDREF_FRAME - 1)
1802 
1803 /*!\endcond */
1804 
1805 /*!
1806  * \brief Parameters related to global motion search
1807  */
1808 typedef struct {
1809   /*!
1810    * Flag to indicate if global motion search needs to be rerun.
1811    */
1812   bool search_done;
1813 
1814   /*!
1815    * Array of pointers to the frame buffers holding the reference frames.
1816    * ref_buf[i] stores the pointer to the reference frame of the ith
1817    * reference frame type.
1818    */
1819   YV12_BUFFER_CONFIG *ref_buf[REF_FRAMES];
1820 
1821   /*!
1822    * Pointer to the source frame buffer.
1823    */
1824   unsigned char *src_buffer;
1825 
1826   /*!
1827    * Holds the number of valid reference frames in past and future directions
1828    * w.r.t. the current frame. num_ref_frames[i] stores the total number of
1829    * valid reference frames in 'i' direction.
1830    */
1831   int num_ref_frames[MAX_DIRECTIONS];
1832 
1833   /*!
1834    * Array of structure which stores the valid reference frames in past and
1835    * future directions and their corresponding distance from the source frame.
1836    * reference_frames[i][j] holds the jth valid reference frame type in the
1837    * direction 'i' and its temporal distance from the source frame .
1838    */
1839   FrameDistPair reference_frames[MAX_DIRECTIONS][REF_FRAMES - 1];
1840 
1841   /**
1842    * \name Dimensions for which segment map is allocated.
1843    */
1844   /**@{*/
1845   int segment_map_w; /*!< segment map width */
1846   int segment_map_h; /*!< segment map height */
1847   /**@}*/
1848 
1849   /*!
1850    * Holds the total number of corner points detected in the source frame.
1851    */
1852   int num_src_corners;
1853 
1854   /*!
1855    * Holds the x and y co-ordinates of the corner points detected in the source
1856    * frame. src_corners[i] holds the x co-ordinate and src_corners[i+1] holds
1857    * the y co-ordinate of the ith corner point detected.
1858    */
1859   int src_corners[2 * MAX_CORNERS];
1860 } GlobalMotionInfo;
1861 
1862 /*!
1863  * \brief Initial frame dimensions
1864  *
1865  * Tracks the frame dimensions using which:
1866  *  - Frame buffers (like altref and util frame buffers) were allocated
1867  *  - Motion estimation related initializations were done
1868  * This structure is helpful to reallocate / reinitialize the above when there
1869  * is a change in frame dimensions.
1870  */
1871 typedef struct {
1872   int width;  /*!< initial width */
1873   int height; /*!< initial height */
1874 } InitialDimensions;
1875 
1876 /*!
1877  * \brief Flags related to interpolation filter search
1878  */
1879 typedef struct {
1880   /*!
1881    * Stores the default value of skip flag depending on chroma format
1882    * Set as 1 for monochrome and 3 for other color formats
1883    */
1884   int default_interp_skip_flags;
1885   /*!
1886    * Filter mask to allow certain interp_filter type.
1887    */
1888   uint16_t interp_filter_search_mask;
1889 } InterpSearchFlags;
1890 
1891 /*!
1892  * \brief Parameters for motion vector search process
1893  */
1894 typedef struct {
1895   /*!
1896    * Largest MV component used in a frame.
1897    * The value from the previous frame is used to set the full pixel search
1898    * range for the current frame.
1899    */
1900   int max_mv_magnitude;
1901   /*!
1902    * Parameter indicating initial search window to be used in full-pixel search.
1903    * Range [0, MAX_MVSEARCH_STEPS-2]. Lower value indicates larger window.
1904    */
1905   int mv_step_param;
1906   /*!
1907    * Pointer to sub-pixel search function.
1908    * In encoder: av1_find_best_sub_pixel_tree
1909    *             av1_find_best_sub_pixel_tree_pruned
1910    *             av1_find_best_sub_pixel_tree_pruned_more
1911    * In MV unit test: av1_return_max_sub_pixel_mv
1912    *                  av1_return_min_sub_pixel_mv
1913    */
1914   fractional_mv_step_fp *find_fractional_mv_step;
1915   /*!
1916    * Search site configuration for full-pel MV search.
1917    * search_site_cfg[SS_CFG_SRC]: Used in tpl, rd/non-rd inter mode loop, simple
1918    * motion search. search_site_cfg[SS_CFG_LOOKAHEAD]: Used in intraBC, temporal
1919    * filter search_site_cfg[SS_CFG_FPF]: Used during first pass and lookahead
1920    */
1921   search_site_config search_site_cfg[SS_CFG_TOTAL][NUM_DISTINCT_SEARCH_METHODS];
1922 } MotionVectorSearchParams;
1923 
1924 /*!
1925  * \brief Refresh frame flags for different type of frames.
1926  *
1927  * If the refresh flag is true for a particular reference frame, after the
1928  * current frame is encoded, the reference frame gets refreshed (updated) to
1929  * be the current frame. Note: Usually at most one flag will be set to true at
1930  * a time. But, for key-frames, all flags are set to true at once.
1931  */
1932 typedef struct {
1933   bool golden_frame;  /*!< Refresh flag for golden frame */
1934   bool bwd_ref_frame; /*!< Refresh flag for bwd-ref frame */
1935   bool alt_ref_frame; /*!< Refresh flag for alt-ref frame */
1936 } RefreshFrameFlagsInfo;
1937 
1938 /*!
1939  * \brief Desired dimensions for an externally triggered resize.
1940  *
1941  * When resize is triggered externally, the desired dimensions are stored in
1942  * this struct until used in the next frame to be coded. These values are
1943  * effective only for one frame and are reset after they are used.
1944  */
1945 typedef struct {
1946   int width;  /*!< Desired resized width */
1947   int height; /*!< Desired resized height */
1948 } ResizePendingParams;
1949 
1950 /*!
1951  * \brief Refrence frame distance related variables.
1952  */
1953 typedef struct {
1954   /*!
1955    * True relative distance of reference frames w.r.t. the current frame.
1956    */
1957   int ref_relative_dist[INTER_REFS_PER_FRAME];
1958   /*!
1959    * The nearest reference w.r.t. current frame in the past.
1960    */
1961   int8_t nearest_past_ref;
1962   /*!
1963    * The nearest reference w.r.t. current frame in the future.
1964    */
1965   int8_t nearest_future_ref;
1966 } RefFrameDistanceInfo;
1967 
1968 /*!
1969  * \brief Parameters used for winner mode processing.
1970  *
1971  * This is a basic two pass approach: in the first pass, we reduce the number of
1972  * transform searches based on some thresholds during the rdopt process to find
1973  * the  "winner mode". In the second pass, we perform a more through tx search
1974  * on the winner mode.
1975  * There are some arrays in the struct, and their indices are used in the
1976  * following manner:
1977  * Index 0: Default mode evaluation, Winner mode processing is not applicable
1978  * (Eg : IntraBc).
1979  * Index 1: Mode evaluation.
1980  * Index 2: Winner mode evaluation
1981  * Index 1 and 2 are only used when the respective speed feature is on.
1982  */
1983 typedef struct {
1984   /*!
1985    * Threshold to determine if trellis optimization is to be enabled
1986    * based on :
1987    * 0 : dist threshold
1988    * 1 : satd threshold
1989    * Corresponds to enable_winner_mode_for_coeff_opt speed feature.
1990    */
1991   unsigned int coeff_opt_thresholds[MODE_EVAL_TYPES][2];
1992 
1993   /*!
1994    * Determines the tx size search method during rdopt.
1995    * Corresponds to enable_winner_mode_for_tx_size_srch speed feature.
1996    */
1997   TX_SIZE_SEARCH_METHOD tx_size_search_methods[MODE_EVAL_TYPES];
1998 
1999   /*!
2000    * Controls how often we should approximate prediction error with tx
2001    * coefficients. If it's 0, then never. If 1, then it's during the tx_type
2002    * search only. If 2, then always.
2003    * Corresponds to tx_domain_dist_level speed feature.
2004    */
2005   unsigned int use_transform_domain_distortion[MODE_EVAL_TYPES];
2006 
2007   /*!
2008    * Threshold to approximate pixel domain distortion with transform domain
2009    * distortion. This is only used if use_txform_domain_distortion is on.
2010    * Corresponds to enable_winner_mode_for_use_tx_domain_dist speed feature.
2011    */
2012   unsigned int tx_domain_dist_threshold[MODE_EVAL_TYPES];
2013 
2014   /*!
2015    * Controls how often we should try to skip the transform process based on
2016    * result from dct.
2017    * Corresponds to use_skip_flag_prediction speed feature.
2018    */
2019   unsigned int skip_txfm_level[MODE_EVAL_TYPES];
2020 
2021   /*!
2022    * Predict DC only txfm blocks for default, mode and winner mode evaluation.
2023    * Index 0: Default mode evaluation, Winner mode processing is not applicable.
2024    * Index 1: Mode evaluation, Index 2: Winner mode evaluation
2025    */
2026   unsigned int predict_dc_level[MODE_EVAL_TYPES];
2027 } WinnerModeParams;
2028 
2029 /*!
2030  * \brief Frame refresh flags set by the external interface.
2031  *
2032  * Flags set by external interface to determine which reference buffers are
2033  * refreshed by this frame. When set, the encoder will update the particular
2034  * reference frame buffer with the contents of the current frame.
2035  */
2036 typedef struct {
2037   bool last_frame;     /*!< Refresh flag for last frame */
2038   bool golden_frame;   /*!< Refresh flag for golden frame */
2039   bool bwd_ref_frame;  /*!< Refresh flag for bwd-ref frame */
2040   bool alt2_ref_frame; /*!< Refresh flag for alt2-ref frame */
2041   bool alt_ref_frame;  /*!< Refresh flag for alt-ref frame */
2042   /*!
2043    * Flag indicating if the update of refresh frame flags is pending.
2044    */
2045   bool update_pending;
2046 } ExtRefreshFrameFlagsInfo;
2047 
2048 /*!
2049  * \brief Flags signalled by the external interface at frame level.
2050  */
2051 typedef struct {
2052   /*!
2053    * Bit mask to disable certain reference frame types.
2054    */
2055   int ref_frame_flags;
2056 
2057   /*!
2058    * Frame refresh flags set by the external interface.
2059    */
2060   ExtRefreshFrameFlagsInfo refresh_frame;
2061 
2062   /*!
2063    * Flag to enable the update of frame contexts at the end of a frame decode.
2064    */
2065   bool refresh_frame_context;
2066 
2067   /*!
2068    * Flag to indicate that update of refresh_frame_context from external
2069    * interface is pending.
2070    */
2071   bool refresh_frame_context_pending;
2072 
2073   /*!
2074    * Flag to enable temporal MV prediction.
2075    */
2076   bool use_ref_frame_mvs;
2077 
2078   /*!
2079    * Indicates whether the current frame is to be coded as error resilient.
2080    */
2081   bool use_error_resilient;
2082 
2083   /*!
2084    * Indicates whether the current frame is to be coded as s-frame.
2085    */
2086   bool use_s_frame;
2087 
2088   /*!
2089    * Indicates whether the current frame's primary_ref_frame is set to
2090    * PRIMARY_REF_NONE.
2091    */
2092   bool use_primary_ref_none;
2093 } ExternalFlags;
2094 
2095 /*!\cond */
2096 
2097 typedef struct {
2098   int arf_stack[FRAME_BUFFERS];
2099   int arf_stack_size;
2100   int lst_stack[FRAME_BUFFERS];
2101   int lst_stack_size;
2102   int gld_stack[FRAME_BUFFERS];
2103   int gld_stack_size;
2104 } RefBufferStack;
2105 
2106 typedef struct {
2107   // Some misc info
2108   int high_prec;
2109   int q;
2110   int order;
2111 
2112   // MV counters
2113   int inter_count;
2114   int intra_count;
2115   int default_mvs;
2116   int mv_joint_count[4];
2117   int last_bit_zero;
2118   int last_bit_nonzero;
2119 
2120   // Keep track of the rates
2121   int total_mv_rate;
2122   int hp_total_mv_rate;
2123   int lp_total_mv_rate;
2124 
2125   // Texture info
2126   int horz_text;
2127   int vert_text;
2128   int diag_text;
2129 
2130   // Whether the current struct contains valid data
2131   int valid;
2132 } MV_STATS;
2133 
2134 typedef struct WeberStats {
2135   int64_t mb_wiener_variance;
2136   int64_t src_variance;
2137   int64_t rec_variance;
2138   int16_t src_pix_max;
2139   int16_t rec_pix_max;
2140   int64_t distortion;
2141   int64_t satd;
2142   double alpha;
2143   double max_scale;
2144 } WeberStats;
2145 
2146 typedef struct {
2147   struct loopfilter lf;
2148   CdefInfo cdef_info;
2149   YV12_BUFFER_CONFIG copy_buffer;
2150   RATE_CONTROL rc;
2151   MV_STATS mv_stats;
2152 } CODING_CONTEXT;
2153 
2154 typedef struct {
2155   int frame_width;
2156   int frame_height;
2157   int mi_rows;
2158   int mi_cols;
2159   int mb_rows;
2160   int mb_cols;
2161   int num_mbs;
2162   aom_bit_depth_t bit_depth;
2163   int subsampling_x;
2164   int subsampling_y;
2165 } FRAME_INFO;
2166 
2167 /*!
2168  * \brief This structure stores different types of frame indices.
2169  */
2170 typedef struct {
2171   int show_frame_count;
2172 } FRAME_INDEX_SET;
2173 
2174 /*!\endcond */
2175 
2176 /*!
2177  * \brief Segmentation related information for the current frame.
2178  */
2179 typedef struct {
2180   /*!
2181    * 3-bit number containing the segment affiliation for each 4x4 block in the
2182    * frame. map[y * stride + x] contains the segment id of the 4x4 block at
2183    * (x,y) position.
2184    */
2185   uint8_t *map;
2186   /*!
2187    * Flag to indicate if current frame has lossless segments or not.
2188    * 1: frame has at least one lossless segment.
2189    * 0: frame has no lossless segments.
2190    */
2191   bool has_lossless_segment;
2192 } EncSegmentationInfo;
2193 
2194 /*!
2195  * \brief Frame time stamps.
2196  */
2197 typedef struct {
2198   /*!
2199    * Start time stamp of the previous frame
2200    */
2201   int64_t prev_ts_start;
2202   /*!
2203    * End time stamp of the previous frame
2204    */
2205   int64_t prev_ts_end;
2206   /*!
2207    * Start time stamp of the first frame
2208    */
2209   int64_t first_ts_start;
2210 } TimeStamps;
2211 
2212 /*!
2213  * Pointers to the memory allocated for frame level transform coeff related
2214  * info.
2215  */
2216 typedef struct {
2217   /*!
2218    * Pointer to the transformed coefficients buffer.
2219    */
2220   tran_low_t *tcoeff;
2221   /*!
2222    * Pointer to the eobs buffer.
2223    */
2224   uint16_t *eobs;
2225   /*!
2226    * Pointer to the entropy_ctx buffer.
2227    */
2228   uint8_t *entropy_ctx;
2229 } CoeffBufferPool;
2230 
2231 /*!
2232  * \brief Structure to hold data corresponding to an encoded frame.
2233  */
2234 typedef struct AV1_COMP_DATA {
2235   /*!
2236    * Buffer to store packed bitstream data of a frame.
2237    */
2238   unsigned char *cx_data;
2239 
2240   /*!
2241    * Allocated size of the cx_data buffer.
2242    */
2243   size_t cx_data_sz;
2244 
2245   /*!
2246    * Size of data written in the cx_data buffer.
2247    */
2248   size_t frame_size;
2249 
2250   /*!
2251    * Flags for the frame.
2252    */
2253   unsigned int lib_flags;
2254 
2255   /*!
2256    * Time stamp for start of frame.
2257    */
2258   int64_t ts_frame_start;
2259 
2260   /*!
2261    * Time stamp for end of frame.
2262    */
2263   int64_t ts_frame_end;
2264 
2265   /*!
2266    * Flag to indicate flush call.
2267    */
2268   int flush;
2269 
2270   /*!
2271    * Time base for sequence.
2272    */
2273   const aom_rational64_t *timestamp_ratio;
2274 
2275   /*!
2276    * Decide to pop the source for this frame from input buffer queue.
2277    */
2278   int pop_lookahead;
2279 #if CONFIG_FRAME_PARALLEL_ENCODE
2280   /*!
2281    * Display order hint of frame whose packed data is in cx_data buffer.
2282    */
2283   int frame_display_order_hint;
2284 #endif
2285 } AV1_COMP_DATA;
2286 
2287 /*!
2288  * \brief Top level primary encoder structure
2289  */
2290 typedef struct AV1_PRIMARY {
2291 #if CONFIG_FRAME_PARALLEL_ENCODE
2292   /*!
2293    * Array of frame level encoder stage top level structures
2294    */
2295   struct AV1_COMP *parallel_cpi[MAX_PARALLEL_FRAMES];
2296 
2297   /*!
2298    * Number of frame level contexts(cpis)
2299    */
2300   int num_fp_contexts;
2301 
2302   /*!
2303    * Array of structures to hold data of frames encoded in a given parallel
2304    * encode set.
2305    */
2306   struct AV1_COMP_DATA parallel_frames_data[MAX_PARALLEL_FRAMES - 1];
2307 
2308   /*!
2309    * Loopfilter levels of the previous encoded frame.
2310    */
2311   int filter_level[2];
2312 
2313   /*!
2314    * Chrominance component loopfilter level of the previous encoded frame.
2315    */
2316   int filter_level_u;
2317 
2318   /*!
2319    * Chrominance component loopfilter level of the previous encoded frame.
2320    */
2321   int filter_level_v;
2322 
2323   /*!
2324    * Start time stamp of the last encoded show frame
2325    */
2326   int64_t ts_start_last_show_frame;
2327 
2328   /*!
2329    * End time stamp of the last encoded show frame
2330    */
2331   int64_t ts_end_last_show_frame;
2332 #if CONFIG_FRAME_PARALLEL_ENCODE_2
2333   /*!
2334    * Copy of cm->ref_frame_map maintained to facilitate sequential update of
2335    * ref_frame_map by lower layer depth frames encoded ahead of time in a
2336    * parallel encode set.
2337    */
2338   RefCntBuffer *ref_frame_map_copy[REF_FRAMES];
2339 #endif  // CONFIG_FRAME_PARALLEL_ENCODE_2
2340 #endif  // CONFIG_FRAME_PARALLEL_ENCODE
2341   /*!
2342    * Encode stage top level structure
2343    * When CONFIG_FRAME_PARALLEL_ENCODE is enabled this is the same as
2344    * parallel_cpi[0]
2345    */
2346   struct AV1_COMP *cpi;
2347 
2348   /*!
2349    * Lookahead processing stage top level structure
2350    */
2351   struct AV1_COMP *cpi_lap;
2352 
2353   /*!
2354    * Look-ahead context.
2355    */
2356   struct lookahead_ctx *lookahead;
2357 
2358   /*!
2359    * Sequence parameters have been transmitted already and locked
2360    * or not. Once locked av1_change_config cannot change the seq
2361    * parameters.
2362    */
2363   int seq_params_locked;
2364 
2365   /*!
2366    * Pointer to internal utility functions that manipulate aom_codec_* data
2367    * structures.
2368    */
2369   struct aom_codec_pkt_list *output_pkt_list;
2370 
2371   /*!
2372    * When set, indicates that internal ARFs are enabled.
2373    */
2374   int internal_altref_allowed;
2375 
2376   /*!
2377    * Tell if OVERLAY frame shows existing alt_ref frame.
2378    */
2379   int show_existing_alt_ref;
2380 
2381   /*!
2382    * Information related to a gf group.
2383    */
2384   GF_GROUP gf_group;
2385 
2386   /*!
2387    * Track prior gf group state.
2388    */
2389   GF_STATE gf_state;
2390 
2391   /*!
2392    * Flag indicating whether look ahead processing (LAP) is enabled.
2393    */
2394   int lap_enabled;
2395 
2396   /*!
2397    * Parameters for AV1 bitstream levels.
2398    */
2399   AV1LevelParams level_params;
2400 
2401   /*!
2402    * Calculates PSNR on each frame when set to 1.
2403    */
2404   int b_calculate_psnr;
2405 
2406   /*!
2407    * Number of frames left to be encoded, is 0 if limit is not set.
2408    */
2409   int frames_left;
2410 
2411   /*!
2412    * Information related to two pass encoding.
2413    */
2414   TWO_PASS twopass;
2415 
2416   /*!
2417    * Rate control related parameters.
2418    */
2419   PRIMARY_RATE_CONTROL p_rc;
2420 
2421   /*!
2422    * Frame buffer holding the temporally filtered source frame. It can be KEY
2423    * frame or ARF frame.
2424    */
2425   YV12_BUFFER_CONFIG alt_ref_buffer;
2426 
2427   /*!
2428    * Elements part of the sequence header, that are applicable for all the
2429    * frames in the video.
2430    */
2431   SequenceHeader seq_params;
2432 
2433   /*!
2434    * Indicates whether to use SVC.
2435    */
2436   int use_svc;
2437 
2438   /*!
2439    * If true, buffer removal times are present.
2440    */
2441   bool buffer_removal_time_present;
2442 
2443   /*!
2444    * Number of temporal layers: may be > 1 for SVC (scalable vector coding).
2445    */
2446   unsigned int number_temporal_layers;
2447 
2448   /*!
2449    * Number of spatial layers: may be > 1 for SVC (scalable vector coding).
2450    */
2451   unsigned int number_spatial_layers;
2452 
2453   /*!
2454    * Code and details about current error status.
2455    */
2456   struct aom_internal_error_info error;
2457 
2458   /*!
2459    * Function pointers to variants of sse/sad/variance computation functions.
2460    * fn_ptr[i] indicates the list of function pointers corresponding to block
2461    * size i.
2462    */
2463   aom_variance_fn_ptr_t fn_ptr[BLOCK_SIZES_ALL];
2464 
2465   /*!
2466    * Scaling factors used in the RD multiplier modulation.
2467    * TODO(sdeng): consider merge the following arrays.
2468    * tpl_rdmult_scaling_factors is a temporary buffer used to store the
2469    * intermediate scaling factors which are used in the calculation of
2470    * tpl_sb_rdmult_scaling_factors. tpl_rdmult_scaling_factors[i] stores the
2471    * intermediate scaling factor of the ith 16 x 16 block in raster scan order.
2472    */
2473   double *tpl_rdmult_scaling_factors;
2474 
2475   /*!
2476    * tpl_sb_rdmult_scaling_factors[i] stores the RD multiplier scaling factor of
2477    * the ith 16 x 16 block in raster scan order.
2478    */
2479   double *tpl_sb_rdmult_scaling_factors;
2480 
2481   /*!
2482    * Parameters related to tpl.
2483    */
2484   TplParams tpl_data;
2485 
2486   /*!
2487    * Motion vector stats of the previous encoded frame.
2488    */
2489   MV_STATS mv_stats;
2490 
2491 #if CONFIG_INTERNAL_STATS
2492   /*!\cond */
2493   uint64_t total_time_receive_data;
2494   uint64_t total_time_compress_data;
2495 
2496   unsigned int total_mode_chosen_counts[MAX_MODES];
2497 
2498   int count[2];
2499   uint64_t total_sq_error[2];
2500   uint64_t total_samples[2];
2501   ImageStat psnr[2];
2502 
2503   double total_blockiness;
2504   double worst_blockiness;
2505 
2506   int total_bytes;
2507   double summed_quality;
2508   double summed_weights;
2509   double summed_quality_hbd;
2510   double summed_weights_hbd;
2511   unsigned int total_recode_hits;
2512   double worst_ssim;
2513   double worst_ssim_hbd;
2514 
2515   ImageStat fastssim;
2516   ImageStat psnrhvs;
2517 
2518   int b_calculate_blockiness;
2519   int b_calculate_consistency;
2520 
2521   double total_inconsistency;
2522   double worst_consistency;
2523   Ssimv *ssim_vars;
2524   Metrics metrics;
2525   /*!\endcond */
2526 #endif
2527 
2528 #if CONFIG_ENTROPY_STATS
2529   /*!
2530    * Aggregates frame counts for the sequence.
2531    */
2532   FRAME_COUNTS aggregate_fc;
2533 #endif  // CONFIG_ENTROPY_STATS
2534 
2535   /*!
2536    * For each type of reference frame, this contains the index of a reference
2537    * frame buffer for a reference frame of the same type.  We use this to
2538    * choose our primary reference frame (which is the most recent reference
2539    * frame of the same type as the current frame).
2540    */
2541   int fb_of_context_type[REF_FRAMES];
2542 
2543   /*!
2544    * Primary Multi-threading parameters.
2545    */
2546   PrimaryMultiThreadInfo p_mt_info;
2547 
2548   /*!
2549    * Probabilities for pruning of various AV1 tools.
2550    */
2551   FrameProbInfo frame_probs;
2552 } AV1_PRIMARY;
2553 
2554 /*!
2555  * \brief Top level encoder structure.
2556  */
2557 typedef struct AV1_COMP {
2558   /*!
2559    * Pointer to top level primary encoder structure
2560    */
2561   AV1_PRIMARY *ppi;
2562 
2563   /*!
2564    * Quantization and dequantization parameters for internal quantizer setup
2565    * in the encoder.
2566    */
2567   EncQuantDequantParams enc_quant_dequant_params;
2568 
2569   /*!
2570    * Structure holding thread specific variables.
2571    */
2572   ThreadData td;
2573 
2574   /*!
2575    * Statistics collected at frame level.
2576    */
2577   FRAME_COUNTS counts;
2578 
2579   /*!
2580    * Holds buffer storing mode information at 4x4/8x8 level.
2581    */
2582   MBMIExtFrameBufferInfo mbmi_ext_info;
2583 
2584   /*!
2585    * Buffer holding the transform block related information.
2586    * coeff_buffer_base[i] stores the transform block related information of the
2587    * ith superblock in raster scan order.
2588    */
2589   CB_COEFF_BUFFER *coeff_buffer_base;
2590 
2591   /*!
2592    * Structure holding pointers to frame level memory allocated for transform
2593    * block related information.
2594    */
2595   CoeffBufferPool coeff_buffer_pool;
2596 
2597   /*!
2598    * Structure holding variables common to encoder and decoder.
2599    */
2600   AV1_COMMON common;
2601 
2602   /*!
2603    * Encoder configuration related parameters.
2604    */
2605   AV1EncoderConfig oxcf;
2606 
2607   /*!
2608    * Stores the trellis optimization type at segment level.
2609    * optimize_seg_arr[i] stores the trellis opt type for ith segment.
2610    */
2611   TRELLIS_OPT_TYPE optimize_seg_arr[MAX_SEGMENTS];
2612 
2613   /*!
2614    * Pointer to the frame buffer holding the source frame to be used during the
2615    * current stage of encoding. It can be the raw input, temporally filtered
2616    * input or scaled input.
2617    */
2618   YV12_BUFFER_CONFIG *source;
2619 
2620   /*!
2621    * Pointer to the frame buffer holding the last raw source frame.
2622    * last_source is NULL for the following cases:
2623    * 1) First frame
2624    * 2) Alt-ref frames
2625    * 3) All frames for all-intra frame encoding.
2626    */
2627   YV12_BUFFER_CONFIG *last_source;
2628 
2629   /*!
2630    * Pointer to the frame buffer holding the unscaled source frame.
2631    * It can be either the raw input or temporally filtered input.
2632    */
2633   YV12_BUFFER_CONFIG *unscaled_source;
2634 
2635   /*!
2636    * Frame buffer holding the resized source frame (cropping / superres).
2637    */
2638   YV12_BUFFER_CONFIG scaled_source;
2639 
2640   /*!
2641    * Pointer to the frame buffer holding the unscaled last source frame.
2642    */
2643   YV12_BUFFER_CONFIG *unscaled_last_source;
2644 
2645   /*!
2646    * Frame buffer holding the resized last source frame.
2647    */
2648   YV12_BUFFER_CONFIG scaled_last_source;
2649 
2650   /*!
2651    * Pointer to the original source frame. This is used to determine if the
2652    * content is screen.
2653    */
2654   YV12_BUFFER_CONFIG *unfiltered_source;
2655 
2656   /*!
2657    * Skip tpl setup when tpl data from gop length decision can be reused.
2658    */
2659   int skip_tpl_setup_stats;
2660 
2661   /*!
2662    * Temporal filter context.
2663    */
2664   TemporalFilterCtx tf_ctx;
2665 
2666   /*!
2667    * Variables related to forcing integer mv decisions for the current frame.
2668    */
2669   ForceIntegerMVInfo force_intpel_info;
2670 
2671   /*!
2672    * Pointer to the buffer holding the scaled reference frames.
2673    * scaled_ref_buf[i] holds the scaled reference frame of type i.
2674    */
2675   RefCntBuffer *scaled_ref_buf[INTER_REFS_PER_FRAME];
2676 
2677   /*!
2678    * Pointer to the buffer holding the last show frame.
2679    */
2680   RefCntBuffer *last_show_frame_buf;
2681 
2682   /*!
2683    * Refresh frame flags for golden, bwd-ref and alt-ref frames.
2684    */
2685   RefreshFrameFlagsInfo refresh_frame;
2686 
2687   /*!
2688    * Flags signalled by the external interface at frame level.
2689    */
2690   ExternalFlags ext_flags;
2691 
2692   /*!
2693    * Temporary frame buffer used to store the non-loop filtered reconstructed
2694    * frame during the search of loop filter level.
2695    */
2696   YV12_BUFFER_CONFIG last_frame_uf;
2697 
2698   /*!
2699    * Temporary frame buffer used to store the loop restored frame during loop
2700    * restoration search.
2701    */
2702   YV12_BUFFER_CONFIG trial_frame_rst;
2703 
2704   /*!
2705    * Ambient reconstruction err target for force key frames.
2706    */
2707   int64_t ambient_err;
2708 
2709   /*!
2710    * Parameters related to rate distortion optimization.
2711    */
2712   RD_OPT rd;
2713 
2714   /*!
2715    * Temporary coding context used to save and restore when encoding with and
2716    * without super-resolution.
2717    */
2718   CODING_CONTEXT coding_context;
2719 
2720   /*!
2721    * Parameters related to global motion search.
2722    */
2723   GlobalMotionInfo gm_info;
2724 
2725   /*!
2726    * Parameters related to winner mode processing.
2727    */
2728   WinnerModeParams winner_mode_params;
2729 
2730   /*!
2731    * Frame time stamps.
2732    */
2733   TimeStamps time_stamps;
2734 
2735   /*!
2736    * Rate control related parameters.
2737    */
2738   RATE_CONTROL rc;
2739 
2740   /*!
2741    * Frame rate of the video.
2742    */
2743   double framerate;
2744 
2745   /*!
2746    * Bitmask indicating which reference buffers may be referenced by this frame.
2747    */
2748   int ref_frame_flags;
2749 
2750   /*!
2751    * speed is passed as a per-frame parameter into the encoder.
2752    */
2753   int speed;
2754 
2755   /*!
2756    * sf contains fine-grained config set internally based on speed.
2757    */
2758   SPEED_FEATURES sf;
2759 
2760   /*!
2761    * Parameters for motion vector search process.
2762    */
2763   MotionVectorSearchParams mv_search_params;
2764 
2765   /*!
2766    * When set, indicates that all reference frames are forward references,
2767    * i.e., all the reference frames are output before the current frame.
2768    */
2769   int all_one_sided_refs;
2770 
2771   /*!
2772    * Segmentation related information for current frame.
2773    */
2774   EncSegmentationInfo enc_seg;
2775 
2776   /*!
2777    * Parameters related to cyclic refresh aq-mode.
2778    */
2779   CYCLIC_REFRESH *cyclic_refresh;
2780   /*!
2781    * Parameters related to active map. Active maps indicate
2782    * if there is any activity on a 4x4 block basis.
2783    */
2784   ActiveMap active_map;
2785 
2786   /*!
2787    * The frame processing order within a GOP.
2788    */
2789   unsigned char gf_frame_index;
2790 
2791   /*!
2792    * To control the reference frame buffer and selection.
2793    */
2794   RefBufferStack ref_buffer_stack;
2795 
2796 #if CONFIG_INTERNAL_STATS
2797   /*!\cond */
2798   uint64_t time_compress_data;
2799 
2800   unsigned int mode_chosen_counts[MAX_MODES];
2801   int bytes;
2802   unsigned int frame_recode_hits;
2803   /*!\endcond */
2804 #endif
2805 
2806 #if CONFIG_SPEED_STATS
2807   /*!
2808    * For debugging: number of transform searches we have performed.
2809    */
2810   unsigned int tx_search_count;
2811 #endif  // CONFIG_SPEED_STATS
2812 
2813   /*!
2814    * When set, indicates that the frame is droppable, i.e., this frame
2815    * does not update any reference buffers.
2816    */
2817   int droppable;
2818 
2819   /*!
2820    * Stores the frame parameters during encoder initialization.
2821    */
2822   FRAME_INFO frame_info;
2823 
2824   /*!
2825    * Stores different types of frame indices.
2826    */
2827   FRAME_INDEX_SET frame_index_set;
2828 
2829   /*!
2830    * Structure to store the dimensions of current frame.
2831    */
2832   InitialDimensions initial_dimensions;
2833 
2834   /*!
2835    * Number of MBs in the full-size frame; to be used to
2836    * normalize the firstpass stats. This will differ from the
2837    * number of MBs in the current frame when the frame is
2838    * scaled.
2839    */
2840   int initial_mbs;
2841 
2842   /*!
2843    * Resize related parameters.
2844    */
2845   ResizePendingParams resize_pending_params;
2846 
2847   /*!
2848    * Pointer to struct holding adaptive data/contexts/models for the tile during
2849    * encoding.
2850    */
2851   TileDataEnc *tile_data;
2852   /*!
2853    * Number of tiles for which memory has been allocated for tile_data.
2854    */
2855   int allocated_tiles;
2856 
2857   /*!
2858    * Structure to store the palette token related information.
2859    */
2860   TokenInfo token_info;
2861 
2862   /*!
2863    * VARIANCE_AQ segment map refresh.
2864    */
2865   int vaq_refresh;
2866 
2867   /*!
2868    * Thresholds for variance based partitioning.
2869    */
2870   VarBasedPartitionInfo vbp_info;
2871 
2872 #if CONFIG_FRAME_PARALLEL_ENCODE
2873   /*!
2874    * Number of recodes in the frame.
2875    */
2876   int num_frame_recode;
2877 
2878   /*!
2879    * Current frame probability of parallel frames, across recodes.
2880    */
2881   FrameProbInfo frame_new_probs[NUM_RECODES_PER_FRAME];
2882 
2883   /*!
2884    * Retain condition for transform type frame_probability calculation
2885    */
2886   int do_update_frame_probs_txtype[NUM_RECODES_PER_FRAME];
2887 
2888   /*!
2889    * Retain condition for obmc frame_probability calculation
2890    */
2891   int do_update_frame_probs_obmc[NUM_RECODES_PER_FRAME];
2892 
2893   /*!
2894    * Retain condition for warped motion frame_probability calculation
2895    */
2896   int do_update_frame_probs_warp[NUM_RECODES_PER_FRAME];
2897 
2898   /*!
2899    * Retain condition for interpolation filter frame_probability calculation
2900    */
2901   int do_update_frame_probs_interpfilter[NUM_RECODES_PER_FRAME];
2902 
2903   /*!
2904    * Retain condition for fast_extra_bits calculation.
2905    */
2906   int do_update_vbr_bits_off_target_fast;
2907 #endif
2908   /*!
2909    * Multi-threading parameters.
2910    */
2911   MultiThreadInfo mt_info;
2912 
2913   /*!
2914    * Specifies the frame to be output. It is valid only if show_existing_frame
2915    * is 1. When show_existing_frame is 0, existing_fb_idx_to_show is set to
2916    * INVALID_IDX.
2917    */
2918   int existing_fb_idx_to_show;
2919 
2920   /*!
2921    * A flag to indicate if intrabc is ever used in current frame.
2922    */
2923   int intrabc_used;
2924 
2925   /*!
2926    * Mark which ref frames can be skipped for encoding current frame during RDO.
2927    */
2928   int prune_ref_frame_mask;
2929 
2930   /*!
2931    * Loop Restoration context.
2932    */
2933   AV1LrStruct lr_ctxt;
2934 
2935   /*!
2936    * Pointer to list of tables with film grain parameters.
2937    */
2938   aom_film_grain_table_t *film_grain_table;
2939 
2940 #if CONFIG_DENOISE
2941   /*!
2942    * Pointer to structure holding the denoised image buffers and the helper
2943    * noise models.
2944    */
2945   struct aom_denoise_and_model_t *denoise_and_model;
2946 #endif
2947 
2948   /*!
2949    * Flags related to interpolation filter search.
2950    */
2951   InterpSearchFlags interp_search_flags;
2952 
2953   /*!
2954    * Turn on screen content tools flag.
2955    * Note that some videos are not screen content videos, but
2956    * screen content tools could also improve coding efficiency.
2957    * For example, videos with large flat regions, gaming videos that look
2958    * like natural videos.
2959    */
2960   int use_screen_content_tools;
2961 
2962   /*!
2963    * A flag to indicate "real" screen content videos.
2964    * For example, screen shares, screen editing.
2965    * This type is true indicates |use_screen_content_tools| must be true.
2966    * In addition, rate control strategy is adjusted when this flag is true.
2967    */
2968   int is_screen_content_type;
2969 
2970 #if CONFIG_COLLECT_PARTITION_STATS
2971   /*!
2972    * Accumulates the partition timing stat over the whole frame.
2973    */
2974   FramePartitionTimingStats partition_stats;
2975 #endif  // CONFIG_COLLECT_PARTITION_STATS
2976 
2977 #if CONFIG_COLLECT_COMPONENT_TIMING
2978   /*!
2979    * component_time[] are initialized to zero while encoder starts.
2980    */
2981   uint64_t component_time[kTimingComponents];
2982   /*!
2983    * Stores timing for individual components between calls of start_timing()
2984    * and end_timing().
2985    */
2986   struct aom_usec_timer component_timer[kTimingComponents];
2987   /*!
2988    * frame_component_time[] are initialized to zero at beginning of each frame.
2989    */
2990   uint64_t frame_component_time[kTimingComponents];
2991 #endif
2992 
2993   /*!
2994    * Count the number of OBU_FRAME and OBU_FRAME_HEADER for level calculation.
2995    */
2996   int frame_header_count;
2997 
2998   /*!
2999    * Whether any no-zero delta_q was actually used.
3000    */
3001   int deltaq_used;
3002 
3003   /*!
3004    * Refrence frame distance related variables.
3005    */
3006   RefFrameDistanceInfo ref_frame_dist_info;
3007 
3008   /*!
3009    * ssim_rdmult_scaling_factors[i] stores the RD multiplier scaling factor of
3010    * the ith 16 x 16 block in raster scan order. This scaling factor is used for
3011    * RD multiplier modulation when SSIM tuning is enabled.
3012    */
3013   double *ssim_rdmult_scaling_factors;
3014 
3015 #if CONFIG_TUNE_VMAF
3016   /*!
3017    * Parameters for VMAF tuning.
3018    */
3019   TuneVMAFInfo vmaf_info;
3020 #endif
3021 
3022 #if CONFIG_TUNE_BUTTERAUGLI
3023   /*!
3024    * Parameters for Butteraugli tuning.
3025    */
3026   TuneButteraugliInfo butteraugli_info;
3027 #endif
3028 
3029   /*!
3030    * Parameters for scalable video coding.
3031    */
3032   SVC svc;
3033 
3034   /*!
3035    * Indicates whether current processing stage is encode stage or LAP stage.
3036    */
3037   COMPRESSOR_STAGE compressor_stage;
3038 
3039   /*!
3040    * Frame type of the last frame. May be used in some heuristics for speeding
3041    * up the encoding.
3042    */
3043   FRAME_TYPE last_frame_type;
3044 
3045   /*!
3046    * Number of tile-groups.
3047    */
3048   int num_tg;
3049 
3050   /*!
3051    * Super-resolution mode currently being used by the encoder.
3052    * This may / may not be same as user-supplied mode in oxcf->superres_mode
3053    * (when we are recoding to try multiple options for example).
3054    */
3055   aom_superres_mode superres_mode;
3056 
3057   /*!
3058    * First pass related data.
3059    */
3060   FirstPassData firstpass_data;
3061 
3062   /*!
3063    * Temporal Noise Estimate
3064    */
3065   NOISE_ESTIMATE noise_estimate;
3066 
3067 #if CONFIG_AV1_TEMPORAL_DENOISING
3068   /*!
3069    * Temporal Denoiser
3070    */
3071   AV1_DENOISER denoiser;
3072 #endif
3073 
3074   /*!
3075    * Count on how many consecutive times a block uses small/zeromv for encoding
3076    * in a scale of 8x8 block.
3077    */
3078   uint8_t *consec_zero_mv;
3079 
3080   /*!
3081    * Block size of first pass encoding
3082    */
3083   BLOCK_SIZE fp_block_size;
3084 
3085   /*!
3086    * The counter of encoded super block, used to differentiate block names.
3087    * This number starts from 0 and increases whenever a super block is encoded.
3088    */
3089   int sb_counter;
3090 
3091   /*!
3092    * Available bitstream buffer size in bytes
3093    */
3094   size_t available_bs_size;
3095 
3096   /*!
3097    * The controller of the external partition model.
3098    * It is used to do partition type selection based on external models.
3099    */
3100   ExtPartController ext_part_controller;
3101 
3102 #if CONFIG_FRAME_PARALLEL_ENCODE
3103   /*!
3104    * A flag to indicate frames that will update their data to the primary
3105    * context at the end of the encode. It is set for non-parallel frames and the
3106    * last frame in encode order in a given parallel encode set.
3107    */
3108   bool do_frame_data_update;
3109 
3110   /*!
3111    * Motion vector stats of the current encoded frame, used to update the
3112    * ppi->mv_stats during postencode.
3113    */
3114   MV_STATS mv_stats;
3115 #if CONFIG_FRAME_PARALLEL_ENCODE_2
3116   /*!
3117    * Stores the reference refresh index for the current frame.
3118    */
3119   int ref_refresh_index;
3120 
3121   /*!
3122    * A flag to indicate if the reference refresh index is available for the
3123    * current frame.
3124    */
3125   bool refresh_idx_available;
3126 
3127   /*!
3128    * Reference frame index corresponding to the frame to be excluded from being
3129    * used as a reference by frame_parallel_level 2 frame in a parallel
3130    * encode set of lower layer frames.
3131    */
3132   int ref_idx_to_skip;
3133 #endif  // CONFIG_FRAME_PARALLEL_ENCODE_2
3134 #endif  // CONFIG_FRAME_PARALLEL_ENCODE
3135 #if CONFIG_RD_COMMAND
3136   /*!
3137    *  A structure for assigning external q_index / rdmult for experiments
3138    */
3139   RD_COMMAND rd_command;
3140 #endif  // CONFIG_RD_COMMAND
3141 
3142   /*!
3143    * Buffer to store MB variance after Wiener filter.
3144    */
3145   WeberStats *mb_weber_stats;
3146 
3147   /*!
3148    * Buffer to store MB variance after Wiener filter.
3149    */
3150   BLOCK_SIZE weber_bsize;
3151 
3152   /*!
3153    * Frame level Wiener filter normalization.
3154    */
3155   int64_t norm_wiener_variance;
3156 
3157   /*!
3158    * Buffer to store delta-q values for delta-q mode 4.
3159    */
3160   int *mb_delta_q;
3161 
3162   /*!
3163    * Flag to indicate that current frame is dropped.
3164    */
3165   bool is_dropped_frame;
3166 
3167 #if CONFIG_BITRATE_ACCURACY
3168   /*!
3169    * Structure stores information needed for bitrate accuracy experiment.
3170    */
3171   VBR_RATECTRL_INFO vbr_rc_info;
3172 #endif
3173 
3174   /*!
3175    * Frame level twopass status and control data
3176    */
3177   TWO_PASS_FRAME twopass_frame;
3178 
3179   /*!
3180    * Context needed for third pass encoding.
3181    */
3182   THIRD_PASS_DEC_CTX *third_pass_ctx;
3183 } AV1_COMP;
3184 
3185 /*!
3186  * \brief Input frames and last input frame
3187  */
3188 typedef struct EncodeFrameInput {
3189   /*!\cond */
3190   YV12_BUFFER_CONFIG *source;
3191   YV12_BUFFER_CONFIG *last_source;
3192   int64_t ts_duration;
3193   /*!\endcond */
3194 } EncodeFrameInput;
3195 
3196 /*!
3197  * \brief contains per-frame encoding parameters decided upon by
3198  * av1_encode_strategy() and passed down to av1_encode().
3199  */
3200 typedef struct EncodeFrameParams {
3201   /*!
3202    * Is error resilient mode enabled
3203    */
3204   int error_resilient_mode;
3205   /*!
3206    * Frame type (eg KF vs inter frame etc)
3207    */
3208   FRAME_TYPE frame_type;
3209 
3210   /*!\cond */
3211   int primary_ref_frame;
3212   int order_offset;
3213 
3214   /*!\endcond */
3215   /*!
3216    * Should the current frame be displayed after being decoded
3217    */
3218   int show_frame;
3219 
3220   /*!\cond */
3221   int refresh_frame_flags;
3222 
3223   int show_existing_frame;
3224   int existing_fb_idx_to_show;
3225 
3226   /*!\endcond */
3227   /*!
3228    *  Bitmask of which reference buffers may be referenced by this frame.
3229    */
3230   int ref_frame_flags;
3231 
3232   /*!
3233    *  Reference buffer assignment for this frame.
3234    */
3235   int remapped_ref_idx[REF_FRAMES];
3236 
3237   /*!
3238    *  Flags which determine which reference buffers are refreshed by this
3239    *  frame.
3240    */
3241   RefreshFrameFlagsInfo refresh_frame;
3242 
3243   /*!
3244    *  Speed level to use for this frame: Bigger number means faster.
3245    */
3246   int speed;
3247 } EncodeFrameParams;
3248 
3249 /*!\cond */
3250 
3251 // EncodeFrameResults contains information about the result of encoding a
3252 // single frame
3253 typedef struct {
3254   size_t size;  // Size of resulting bitstream
3255 } EncodeFrameResults;
3256 
3257 // Must not be called more than once.
3258 void av1_initialize_enc(void);
3259 
3260 struct AV1_COMP *av1_create_compressor(AV1_PRIMARY *ppi, AV1EncoderConfig *oxcf,
3261                                        BufferPool *const pool,
3262                                        COMPRESSOR_STAGE stage,
3263                                        int lap_lag_in_frames);
3264 
3265 struct AV1_PRIMARY *av1_create_primary_compressor(
3266     struct aom_codec_pkt_list *pkt_list_head, int num_lap_buffers,
3267     AV1EncoderConfig *oxcf);
3268 
3269 void av1_remove_compressor(AV1_COMP *cpi);
3270 
3271 void av1_remove_primary_compressor(AV1_PRIMARY *ppi);
3272 
3273 #if CONFIG_ENTROPY_STATS
3274 void print_entropy_stats(AV1_PRIMARY *const ppi);
3275 #endif
3276 #if CONFIG_INTERNAL_STATS
3277 void print_internal_stats(AV1_PRIMARY *ppi);
3278 #endif
3279 
3280 void av1_change_config_seq(AV1_PRIMARY *ppi, const AV1EncoderConfig *oxcf,
3281                            bool *sb_size_changed);
3282 
3283 void av1_change_config(AV1_COMP *cpi, const AV1EncoderConfig *oxcf,
3284                        bool sb_size_changed);
3285 
3286 void av1_check_initial_width(AV1_COMP *cpi, int use_highbitdepth,
3287                              int subsampling_x, int subsampling_y);
3288 
3289 void av1_init_seq_coding_tools(AV1_PRIMARY *const ppi,
3290                                const AV1EncoderConfig *oxcf, int use_svc);
3291 
3292 void av1_post_encode_updates(AV1_COMP *const cpi,
3293                              const AV1_COMP_DATA *const cpi_data);
3294 
3295 #if CONFIG_FRAME_PARALLEL_ENCODE
3296 void av1_scale_references_fpmt(AV1_COMP *cpi, int *ref_buffers_used_map);
3297 
3298 void av1_increment_scaled_ref_counts_fpmt(BufferPool *buffer_pool,
3299                                           int ref_buffers_used_map);
3300 
3301 void av1_release_scaled_references_fpmt(AV1_COMP *cpi);
3302 
3303 void av1_decrement_ref_counts_fpmt(BufferPool *buffer_pool,
3304                                    int ref_buffers_used_map);
3305 
3306 void av1_init_sc_decisions(AV1_PRIMARY *const ppi);
3307 
3308 AV1_COMP *av1_get_parallel_frame_enc_data(AV1_PRIMARY *const ppi,
3309                                           AV1_COMP_DATA *const first_cpi_data);
3310 
3311 int av1_init_parallel_frame_context(const AV1_COMP_DATA *const first_cpi_data,
3312                                     AV1_PRIMARY *const ppi,
3313                                     int *ref_buffers_used_map);
3314 #endif  // CONFIG_FRAME_PARALLEL_ENCODE
3315 
3316 /*!\endcond */
3317 
3318 /*!\brief Obtain the raw frame data
3319  *
3320  * \ingroup high_level_algo
3321  * This function receives the raw frame data from input.
3322  *
3323  * \param[in]    cpi            Top-level encoder structure
3324  * \param[in]    frame_flags    Flags to decide how to encoding the frame
3325  * \param[in]    sd             Contain raw frame data
3326  * \param[in]    time_stamp     Time stamp of the frame
3327  * \param[in]    end_time_stamp End time stamp
3328  *
3329  * \return Returns a value to indicate if the frame data is received
3330  * successfully.
3331  * \note The caller can assume that a copy of this frame is made and not just a
3332  * copy of the pointer.
3333  */
3334 int av1_receive_raw_frame(AV1_COMP *cpi, aom_enc_frame_flags_t frame_flags,
3335                           YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
3336                           int64_t end_time_stamp);
3337 
3338 /*!\brief Encode a frame
3339  *
3340  * \ingroup high_level_algo
3341  * \callgraph
3342  * \callergraph
3343  * This function encodes the raw frame data, and outputs the frame bit stream
3344  * to the designated buffer. The caller should use the output parameters
3345  * cpi_data->ts_frame_start and cpi_data->ts_frame_end only when this function
3346  * returns AOM_CODEC_OK.
3347  *
3348  * \param[in]     cpi         Top-level encoder structure
3349  * \param[in,out] cpi_data    Data corresponding to a frame encode
3350  *
3351  * \return Returns a value to indicate if the encoding is done successfully.
3352  * \retval #AOM_CODEC_OK
3353  * \retval -1
3354  *     No frame encoded; more input is required.
3355  * \retval #AOM_CODEC_ERROR
3356  */
3357 int av1_get_compressed_data(AV1_COMP *cpi, AV1_COMP_DATA *const cpi_data);
3358 
3359 /*!\brief Run 1-pass/2-pass encoding
3360  *
3361  * \ingroup high_level_algo
3362  * \callgraph
3363  * \callergraph
3364  */
3365 int av1_encode(AV1_COMP *const cpi, uint8_t *const dest,
3366                const EncodeFrameInput *const frame_input,
3367                const EncodeFrameParams *const frame_params,
3368                EncodeFrameResults *const frame_results);
3369 
3370 /*!\cond */
3371 int av1_get_preview_raw_frame(AV1_COMP *cpi, YV12_BUFFER_CONFIG *dest);
3372 
3373 int av1_get_last_show_frame(AV1_COMP *cpi, YV12_BUFFER_CONFIG *frame);
3374 
3375 aom_codec_err_t av1_copy_new_frame_enc(AV1_COMMON *cm,
3376                                        YV12_BUFFER_CONFIG *new_frame,
3377                                        YV12_BUFFER_CONFIG *sd);
3378 
3379 int av1_use_as_reference(int *ext_ref_frame_flags, int ref_frame_flags);
3380 
3381 int av1_copy_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd);
3382 
3383 int av1_set_reference_enc(AV1_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd);
3384 
3385 int av1_set_size_literal(AV1_COMP *cpi, int width, int height);
3386 
3387 void av1_set_frame_size(AV1_COMP *cpi, int width, int height);
3388 
3389 int av1_set_active_map(AV1_COMP *cpi, unsigned char *map, int rows, int cols);
3390 
3391 int av1_get_active_map(AV1_COMP *cpi, unsigned char *map, int rows, int cols);
3392 
3393 int av1_set_internal_size(AV1EncoderConfig *const oxcf,
3394                           ResizePendingParams *resize_pending_params,
3395                           AOM_SCALING horiz_mode, AOM_SCALING vert_mode);
3396 
3397 int av1_get_quantizer(struct AV1_COMP *cpi);
3398 
3399 int av1_convert_sect5obus_to_annexb(uint8_t *buffer, size_t *input_size);
3400 
3401 // Set screen content options.
3402 // This function estimates whether to use screen content tools, by counting
3403 // the portion of blocks that have few luma colors.
3404 // Modifies:
3405 //   cpi->commom.features.allow_screen_content_tools
3406 //   cpi->common.features.allow_intrabc
3407 //   cpi->use_screen_content_tools
3408 //   cpi->is_screen_content_type
3409 // However, the estimation is not accurate and may misclassify videos.
3410 // A slower but more accurate approach that determines whether to use screen
3411 // content tools is employed later. See av1_determine_sc_tools_with_encoding().
3412 void av1_set_screen_content_options(struct AV1_COMP *cpi,
3413                                     FeatureFlags *features);
3414 
3415 void av1_update_frame_size(AV1_COMP *cpi);
3416 
3417 #if CONFIG_FRAME_PARALLEL_ENCODE
3418 typedef struct {
3419   int pyr_level;
3420   int disp_order;
3421 } RefFrameMapPair;
3422 
init_ref_map_pair(AV1_COMP * cpi,RefFrameMapPair ref_frame_map_pairs[REF_FRAMES])3423 static INLINE void init_ref_map_pair(
3424     AV1_COMP *cpi, RefFrameMapPair ref_frame_map_pairs[REF_FRAMES]) {
3425   if (cpi->ppi->gf_group.update_type[cpi->gf_frame_index] == KF_UPDATE) {
3426     memset(ref_frame_map_pairs, -1, sizeof(*ref_frame_map_pairs) * REF_FRAMES);
3427     return;
3428   }
3429   memset(ref_frame_map_pairs, 0, sizeof(*ref_frame_map_pairs) * REF_FRAMES);
3430   for (int map_idx = 0; map_idx < REF_FRAMES; map_idx++) {
3431     // Get reference frame buffer.
3432     const RefCntBuffer *const buf = cpi->common.ref_frame_map[map_idx];
3433     if (ref_frame_map_pairs[map_idx].disp_order == -1) continue;
3434     if (buf == NULL) {
3435       ref_frame_map_pairs[map_idx].disp_order = -1;
3436       ref_frame_map_pairs[map_idx].pyr_level = -1;
3437       continue;
3438     } else if (buf->ref_count > 1) {
3439       // Once the keyframe is coded, the slots in ref_frame_map will all
3440       // point to the same frame. In that case, all subsequent pointers
3441       // matching the current are considered "free" slots. This will find
3442       // the next occurance of the current pointer if ref_count indicates
3443       // there are multiple instances of it and mark it as free.
3444       for (int idx2 = map_idx + 1; idx2 < REF_FRAMES; ++idx2) {
3445         const RefCntBuffer *const buf2 = cpi->common.ref_frame_map[idx2];
3446         if (buf2 == buf) {
3447           ref_frame_map_pairs[idx2].disp_order = -1;
3448           ref_frame_map_pairs[idx2].pyr_level = -1;
3449         }
3450       }
3451     }
3452     ref_frame_map_pairs[map_idx].disp_order = (int)buf->display_order_hint;
3453     ref_frame_map_pairs[map_idx].pyr_level = buf->pyramid_level;
3454   }
3455 }
3456 
calc_frame_data_update_flag(GF_GROUP * const gf_group,int gf_frame_index,bool * const do_frame_data_update)3457 static AOM_INLINE void calc_frame_data_update_flag(
3458     GF_GROUP *const gf_group, int gf_frame_index,
3459     bool *const do_frame_data_update) {
3460   *do_frame_data_update = true;
3461   // Set the flag to false for all frames in a given parallel encode set except
3462   // the last frame in the set with frame_parallel_level = 2.
3463   if (gf_group->frame_parallel_level[gf_frame_index] == 1) {
3464     *do_frame_data_update = false;
3465   } else if (gf_group->frame_parallel_level[gf_frame_index] == 2) {
3466     // Check if this is the last frame in the set with frame_parallel_level = 2.
3467     for (int i = gf_frame_index + 1; i < gf_group->size; i++) {
3468       if ((gf_group->frame_parallel_level[i] == 0 &&
3469            (gf_group->update_type[i] == ARF_UPDATE ||
3470             gf_group->update_type[i] == INTNL_ARF_UPDATE)) ||
3471           gf_group->frame_parallel_level[i] == 1) {
3472         break;
3473       } else if (gf_group->frame_parallel_level[i] == 2) {
3474         *do_frame_data_update = false;
3475         break;
3476       }
3477     }
3478   }
3479 }
3480 #endif  // CONFIG_FRAME_PARALLEL_ENCODE
3481 
3482 // TODO(jingning): Move these functions as primitive members for the new cpi
3483 // class.
stack_push(int * stack,int * stack_size,int item)3484 static INLINE void stack_push(int *stack, int *stack_size, int item) {
3485   for (int i = *stack_size - 1; i >= 0; --i) stack[i + 1] = stack[i];
3486   stack[0] = item;
3487   ++*stack_size;
3488 }
3489 
stack_pop(int * stack,int * stack_size)3490 static INLINE int stack_pop(int *stack, int *stack_size) {
3491   if (*stack_size <= 0) return -1;
3492 
3493   int item = stack[0];
3494   for (int i = 0; i < *stack_size; ++i) stack[i] = stack[i + 1];
3495   --*stack_size;
3496 
3497   return item;
3498 }
3499 
stack_pop_end(int * stack,int * stack_size)3500 static INLINE int stack_pop_end(int *stack, int *stack_size) {
3501   int item = stack[*stack_size - 1];
3502   stack[*stack_size - 1] = -1;
3503   --*stack_size;
3504 
3505   return item;
3506 }
3507 
stack_reset(int * stack,int * stack_size)3508 static INLINE void stack_reset(int *stack, int *stack_size) {
3509   for (int i = 0; i < *stack_size; ++i) stack[i] = INVALID_IDX;
3510   *stack_size = 0;
3511 }
3512 
3513 // av1 uses 10,000,000 ticks/second as time stamp
3514 #define TICKS_PER_SEC 10000000LL
3515 
3516 static INLINE int64_t
timebase_units_to_ticks(const aom_rational64_t * timestamp_ratio,int64_t n)3517 timebase_units_to_ticks(const aom_rational64_t *timestamp_ratio, int64_t n) {
3518   return n * timestamp_ratio->num / timestamp_ratio->den;
3519 }
3520 
3521 static INLINE int64_t
ticks_to_timebase_units(const aom_rational64_t * timestamp_ratio,int64_t n)3522 ticks_to_timebase_units(const aom_rational64_t *timestamp_ratio, int64_t n) {
3523   int64_t round = timestamp_ratio->num / 2;
3524   if (round > 0) --round;
3525   return (n * timestamp_ratio->den + round) / timestamp_ratio->num;
3526 }
3527 
frame_is_kf_gf_arf(const AV1_COMP * cpi)3528 static INLINE int frame_is_kf_gf_arf(const AV1_COMP *cpi) {
3529   const GF_GROUP *const gf_group = &cpi->ppi->gf_group;
3530   const FRAME_UPDATE_TYPE update_type =
3531       gf_group->update_type[cpi->gf_frame_index];
3532 
3533   return frame_is_intra_only(&cpi->common) || update_type == ARF_UPDATE ||
3534          update_type == GF_UPDATE;
3535 }
3536 
3537 // TODO(huisu@google.com, youzhou@microsoft.com): enable hash-me for HBD.
av1_use_hash_me(const AV1_COMP * const cpi)3538 static INLINE int av1_use_hash_me(const AV1_COMP *const cpi) {
3539   return (cpi->common.features.allow_screen_content_tools &&
3540           cpi->common.features.allow_intrabc &&
3541           frame_is_intra_only(&cpi->common));
3542 }
3543 
get_ref_frame_yv12_buf(const AV1_COMMON * const cm,MV_REFERENCE_FRAME ref_frame)3544 static INLINE const YV12_BUFFER_CONFIG *get_ref_frame_yv12_buf(
3545     const AV1_COMMON *const cm, MV_REFERENCE_FRAME ref_frame) {
3546   const RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
3547   return buf != NULL ? &buf->buf : NULL;
3548 }
3549 
alloc_frame_mvs(AV1_COMMON * const cm,RefCntBuffer * buf)3550 static INLINE void alloc_frame_mvs(AV1_COMMON *const cm, RefCntBuffer *buf) {
3551   assert(buf != NULL);
3552   ensure_mv_buffer(buf, cm);
3553   buf->width = cm->width;
3554   buf->height = cm->height;
3555 }
3556 
3557 // Get the allocated token size for a tile. It does the same calculation as in
3558 // the frame token allocation.
allocated_tokens(TileInfo tile,int sb_size_log2,int num_planes)3559 static INLINE unsigned int allocated_tokens(TileInfo tile, int sb_size_log2,
3560                                             int num_planes) {
3561   int tile_mb_rows = (tile.mi_row_end - tile.mi_row_start + 2) >> 2;
3562   int tile_mb_cols = (tile.mi_col_end - tile.mi_col_start + 2) >> 2;
3563 
3564   return get_token_alloc(tile_mb_rows, tile_mb_cols, sb_size_log2, num_planes);
3565 }
3566 
get_start_tok(AV1_COMP * cpi,int tile_row,int tile_col,int mi_row,TokenExtra ** tok,int sb_size_log2,int num_planes)3567 static INLINE void get_start_tok(AV1_COMP *cpi, int tile_row, int tile_col,
3568                                  int mi_row, TokenExtra **tok, int sb_size_log2,
3569                                  int num_planes) {
3570   AV1_COMMON *const cm = &cpi->common;
3571   const int tile_cols = cm->tiles.cols;
3572   TileDataEnc *this_tile = &cpi->tile_data[tile_row * tile_cols + tile_col];
3573   const TileInfo *const tile_info = &this_tile->tile_info;
3574 
3575   const int tile_mb_cols =
3576       (tile_info->mi_col_end - tile_info->mi_col_start + 2) >> 2;
3577   const int tile_mb_row = (mi_row - tile_info->mi_row_start + 2) >> 2;
3578 
3579   *tok = cpi->token_info.tile_tok[tile_row][tile_col] +
3580          get_token_alloc(tile_mb_row, tile_mb_cols, sb_size_log2, num_planes);
3581 }
3582 
3583 void av1_apply_encoding_flags(AV1_COMP *cpi, aom_enc_frame_flags_t flags);
3584 
3585 #define ALT_MIN_LAG 3
is_altref_enabled(int lag_in_frames,bool enable_auto_arf)3586 static INLINE int is_altref_enabled(int lag_in_frames, bool enable_auto_arf) {
3587   return lag_in_frames >= ALT_MIN_LAG && enable_auto_arf;
3588 }
3589 
can_disable_altref(const GFConfig * gf_cfg)3590 static AOM_INLINE int can_disable_altref(const GFConfig *gf_cfg) {
3591   return is_altref_enabled(gf_cfg->lag_in_frames, gf_cfg->enable_auto_arf) &&
3592          (gf_cfg->gf_min_pyr_height == 0);
3593 }
3594 
3595 // Helper function to compute number of blocks on either side of the frame.
get_num_blocks(const int frame_length,const int mb_length)3596 static INLINE int get_num_blocks(const int frame_length, const int mb_length) {
3597   return (frame_length + mb_length - 1) / mb_length;
3598 }
3599 
3600 // Check if statistics generation stage
is_stat_generation_stage(const AV1_COMP * const cpi)3601 static INLINE int is_stat_generation_stage(const AV1_COMP *const cpi) {
3602   assert(IMPLIES(cpi->compressor_stage == LAP_STAGE,
3603                  cpi->oxcf.pass == AOM_RC_ONE_PASS && cpi->ppi->lap_enabled));
3604   return (cpi->oxcf.pass == AOM_RC_FIRST_PASS ||
3605           (cpi->compressor_stage == LAP_STAGE));
3606 }
3607 // Check if statistics consumption stage
is_stat_consumption_stage_twopass(const AV1_COMP * const cpi)3608 static INLINE int is_stat_consumption_stage_twopass(const AV1_COMP *const cpi) {
3609   return (cpi->oxcf.pass >= AOM_RC_SECOND_PASS);
3610 }
3611 
3612 // Check if statistics consumption stage
is_stat_consumption_stage(const AV1_COMP * const cpi)3613 static INLINE int is_stat_consumption_stage(const AV1_COMP *const cpi) {
3614   return (is_stat_consumption_stage_twopass(cpi) ||
3615           (cpi->oxcf.pass == AOM_RC_ONE_PASS &&
3616            (cpi->compressor_stage == ENCODE_STAGE) && cpi->ppi->lap_enabled));
3617 }
3618 
3619 /*!\endcond */
3620 /*!\brief Check if the current stage has statistics
3621  *
3622  *\ingroup two_pass_algo
3623  *
3624  * \param[in]    cpi     Top - level encoder instance structure
3625  *
3626  * \return 0 if no stats for current stage else 1
3627  */
has_no_stats_stage(const AV1_COMP * const cpi)3628 static INLINE int has_no_stats_stage(const AV1_COMP *const cpi) {
3629   assert(
3630       IMPLIES(!cpi->ppi->lap_enabled, cpi->compressor_stage == ENCODE_STAGE));
3631   return (cpi->oxcf.pass == AOM_RC_ONE_PASS && !cpi->ppi->lap_enabled);
3632 }
3633 
3634 /*!\cond */
3635 
is_one_pass_rt_params(const AV1_COMP * cpi)3636 static INLINE int is_one_pass_rt_params(const AV1_COMP *cpi) {
3637   return has_no_stats_stage(cpi) && cpi->oxcf.mode == REALTIME &&
3638          cpi->oxcf.gf_cfg.lag_in_frames == 0;
3639 }
3640 
3641 // Function return size of frame stats buffer
get_stats_buf_size(int num_lap_buffer,int num_lag_buffer)3642 static INLINE int get_stats_buf_size(int num_lap_buffer, int num_lag_buffer) {
3643   /* if lookahead is enabled return num_lap_buffers else num_lag_buffers */
3644   return (num_lap_buffer > 0 ? num_lap_buffer + 1 : num_lag_buffer);
3645 }
3646 
3647 // TODO(zoeliu): To set up cpi->oxcf.gf_cfg.enable_auto_brf
3648 
set_ref_ptrs(const AV1_COMMON * cm,MACROBLOCKD * xd,MV_REFERENCE_FRAME ref0,MV_REFERENCE_FRAME ref1)3649 static INLINE void set_ref_ptrs(const AV1_COMMON *cm, MACROBLOCKD *xd,
3650                                 MV_REFERENCE_FRAME ref0,
3651                                 MV_REFERENCE_FRAME ref1) {
3652   xd->block_ref_scale_factors[0] =
3653       get_ref_scale_factors_const(cm, ref0 >= LAST_FRAME ? ref0 : 1);
3654   xd->block_ref_scale_factors[1] =
3655       get_ref_scale_factors_const(cm, ref1 >= LAST_FRAME ? ref1 : 1);
3656 }
3657 
get_chessboard_index(int frame_index)3658 static INLINE int get_chessboard_index(int frame_index) {
3659   return frame_index & 0x1;
3660 }
3661 
cond_cost_list_const(const struct AV1_COMP * cpi,const int * cost_list)3662 static INLINE const int *cond_cost_list_const(const struct AV1_COMP *cpi,
3663                                               const int *cost_list) {
3664   const int use_cost_list = cpi->sf.mv_sf.subpel_search_method != SUBPEL_TREE &&
3665                             cpi->sf.mv_sf.use_fullpel_costlist;
3666   return use_cost_list ? cost_list : NULL;
3667 }
3668 
cond_cost_list(const struct AV1_COMP * cpi,int * cost_list)3669 static INLINE int *cond_cost_list(const struct AV1_COMP *cpi, int *cost_list) {
3670   const int use_cost_list = cpi->sf.mv_sf.subpel_search_method != SUBPEL_TREE &&
3671                             cpi->sf.mv_sf.use_fullpel_costlist;
3672   return use_cost_list ? cost_list : NULL;
3673 }
3674 
3675 // Compression ratio of current frame.
3676 double av1_get_compression_ratio(const AV1_COMMON *const cm,
3677                                  size_t encoded_frame_size);
3678 
3679 void av1_new_framerate(AV1_COMP *cpi, double framerate);
3680 
3681 void av1_setup_frame_size(AV1_COMP *cpi);
3682 
3683 #define LAYER_IDS_TO_IDX(sl, tl, num_tl) ((sl) * (num_tl) + (tl))
3684 
3685 // Returns 1 if a frame is scaled and 0 otherwise.
av1_resize_scaled(const AV1_COMMON * cm)3686 static INLINE int av1_resize_scaled(const AV1_COMMON *cm) {
3687   return !(cm->superres_upscaled_width == cm->render_width &&
3688            cm->superres_upscaled_height == cm->render_height);
3689 }
3690 
av1_frame_scaled(const AV1_COMMON * cm)3691 static INLINE int av1_frame_scaled(const AV1_COMMON *cm) {
3692   return !av1_superres_scaled(cm) && av1_resize_scaled(cm);
3693 }
3694 
3695 // Don't allow a show_existing_frame to coincide with an error resilient
3696 // frame. An exception can be made for a forward keyframe since it has no
3697 // previous dependencies.
encode_show_existing_frame(const AV1_COMMON * cm)3698 static INLINE int encode_show_existing_frame(const AV1_COMMON *cm) {
3699   return cm->show_existing_frame && (!cm->features.error_resilient_mode ||
3700                                      cm->current_frame.frame_type == KEY_FRAME);
3701 }
3702 
3703 // Get index into the 'cpi->mbmi_ext_info.frame_base' array for the given
3704 // 'mi_row' and 'mi_col'.
get_mi_ext_idx(const int mi_row,const int mi_col,const BLOCK_SIZE mi_alloc_bsize,const int mbmi_ext_stride)3705 static INLINE int get_mi_ext_idx(const int mi_row, const int mi_col,
3706                                  const BLOCK_SIZE mi_alloc_bsize,
3707                                  const int mbmi_ext_stride) {
3708   const int mi_ext_size_1d = mi_size_wide[mi_alloc_bsize];
3709   const int mi_ext_row = mi_row / mi_ext_size_1d;
3710   const int mi_ext_col = mi_col / mi_ext_size_1d;
3711   return mi_ext_row * mbmi_ext_stride + mi_ext_col;
3712 }
3713 
3714 // Lighter version of set_offsets that only sets the mode info
3715 // pointers.
set_mode_info_offsets(const CommonModeInfoParams * const mi_params,const MBMIExtFrameBufferInfo * const mbmi_ext_info,MACROBLOCK * const x,MACROBLOCKD * const xd,int mi_row,int mi_col)3716 static INLINE void set_mode_info_offsets(
3717     const CommonModeInfoParams *const mi_params,
3718     const MBMIExtFrameBufferInfo *const mbmi_ext_info, MACROBLOCK *const x,
3719     MACROBLOCKD *const xd, int mi_row, int mi_col) {
3720   set_mi_offsets(mi_params, xd, mi_row, mi_col);
3721   const int ext_idx = get_mi_ext_idx(mi_row, mi_col, mi_params->mi_alloc_bsize,
3722                                      mbmi_ext_info->stride);
3723   x->mbmi_ext_frame = mbmi_ext_info->frame_base + ext_idx;
3724 }
3725 
3726 // Check to see if the given partition size is allowed for a specified number
3727 // of mi block rows and columns remaining in the image.
3728 // If not then return the largest allowed partition size
find_partition_size(BLOCK_SIZE bsize,int rows_left,int cols_left,int * bh,int * bw)3729 static INLINE BLOCK_SIZE find_partition_size(BLOCK_SIZE bsize, int rows_left,
3730                                              int cols_left, int *bh, int *bw) {
3731   int int_size = (int)bsize;
3732   if (rows_left <= 0 || cols_left <= 0) {
3733     return AOMMIN(bsize, BLOCK_8X8);
3734   } else {
3735     for (; int_size > 0; int_size -= 3) {
3736       *bh = mi_size_high[int_size];
3737       *bw = mi_size_wide[int_size];
3738       if ((*bh <= rows_left) && (*bw <= cols_left)) {
3739         break;
3740       }
3741     }
3742   }
3743   return (BLOCK_SIZE)int_size;
3744 }
3745 
3746 static const uint8_t av1_ref_frame_flag_list[REF_FRAMES] = { 0,
3747                                                              AOM_LAST_FLAG,
3748                                                              AOM_LAST2_FLAG,
3749                                                              AOM_LAST3_FLAG,
3750                                                              AOM_GOLD_FLAG,
3751                                                              AOM_BWD_FLAG,
3752                                                              AOM_ALT2_FLAG,
3753                                                              AOM_ALT_FLAG };
3754 
3755 // When more than 'max_allowed_refs' are available, we reduce the number of
3756 // reference frames one at a time based on this order.
3757 static const MV_REFERENCE_FRAME disable_order[] = {
3758   LAST3_FRAME,
3759   LAST2_FRAME,
3760   ALTREF2_FRAME,
3761   GOLDEN_FRAME,
3762 };
3763 
3764 static const MV_REFERENCE_FRAME
3765     ref_frame_priority_order[INTER_REFS_PER_FRAME] = {
3766       LAST_FRAME,    ALTREF_FRAME, BWDREF_FRAME, GOLDEN_FRAME,
3767       ALTREF2_FRAME, LAST2_FRAME,  LAST3_FRAME,
3768     };
3769 
get_ref_frame_flags(const SPEED_FEATURES * const sf,const int use_one_pass_rt_params,const YV12_BUFFER_CONFIG ** ref_frames,const int ext_ref_frame_flags)3770 static INLINE int get_ref_frame_flags(const SPEED_FEATURES *const sf,
3771                                       const int use_one_pass_rt_params,
3772                                       const YV12_BUFFER_CONFIG **ref_frames,
3773                                       const int ext_ref_frame_flags) {
3774   // cpi->ext_flags.ref_frame_flags allows certain reference types to be
3775   // disabled by the external interface.  These are set by
3776   // av1_apply_encoding_flags(). Start with what the external interface allows,
3777   // then suppress any reference types which we have found to be duplicates.
3778   int flags = ext_ref_frame_flags;
3779 
3780   for (int i = 1; i < INTER_REFS_PER_FRAME; ++i) {
3781     const YV12_BUFFER_CONFIG *const this_ref = ref_frames[i];
3782     // If this_ref has appeared before, mark the corresponding ref frame as
3783     // invalid. For one_pass_rt mode, only disable GOLDEN_FRAME if it's the
3784     // same as LAST_FRAME or ALTREF_FRAME (if ALTREF is being used in nonrd).
3785     int index =
3786         (use_one_pass_rt_params && ref_frame_priority_order[i] == GOLDEN_FRAME)
3787             ? (1 + sf->rt_sf.use_nonrd_altref_frame)
3788             : i;
3789     for (int j = 0; j < index; ++j) {
3790       if (this_ref == ref_frames[j]) {
3791         flags &= ~(1 << (ref_frame_priority_order[i] - 1));
3792         break;
3793       }
3794     }
3795   }
3796   return flags;
3797 }
3798 
3799 // Returns a Sequence Header OBU stored in an aom_fixed_buf_t, or NULL upon
3800 // failure. When a non-NULL aom_fixed_buf_t pointer is returned by this
3801 // function, the memory must be freed by the caller. Both the buf member of the
3802 // aom_fixed_buf_t, and the aom_fixed_buf_t pointer itself must be freed. Memory
3803 // returned must be freed via call to free().
3804 //
3805 // Note: The OBU returned is in Low Overhead Bitstream Format. Specifically,
3806 // the obu_has_size_field bit is set, and the buffer contains the obu_size
3807 // field.
3808 aom_fixed_buf_t *av1_get_global_headers(AV1_PRIMARY *ppi);
3809 
3810 #define MAX_GFUBOOST_FACTOR 10.0
3811 #define MIN_GFUBOOST_FACTOR 4.0
3812 
is_frame_tpl_eligible(const GF_GROUP * const gf_group,uint8_t index)3813 static INLINE int is_frame_tpl_eligible(const GF_GROUP *const gf_group,
3814                                         uint8_t index) {
3815   const FRAME_UPDATE_TYPE update_type = gf_group->update_type[index];
3816   return update_type == ARF_UPDATE || update_type == GF_UPDATE ||
3817          update_type == KF_UPDATE;
3818 }
3819 
is_frame_eligible_for_ref_pruning(const GF_GROUP * gf_group,int selective_ref_frame,int prune_ref_frames,int gf_index)3820 static INLINE int is_frame_eligible_for_ref_pruning(const GF_GROUP *gf_group,
3821                                                     int selective_ref_frame,
3822                                                     int prune_ref_frames,
3823                                                     int gf_index) {
3824   return (selective_ref_frame > 0) && (prune_ref_frames > 0) &&
3825          !is_frame_tpl_eligible(gf_group, gf_index);
3826 }
3827 
3828 // Get update type of the current frame.
get_frame_update_type(const GF_GROUP * gf_group,int gf_frame_index)3829 static INLINE FRAME_UPDATE_TYPE get_frame_update_type(const GF_GROUP *gf_group,
3830                                                       int gf_frame_index) {
3831   return gf_group->update_type[gf_frame_index];
3832 }
3833 
av1_pixels_to_mi(int pixels)3834 static INLINE int av1_pixels_to_mi(int pixels) {
3835   return ALIGN_POWER_OF_TWO(pixels, 3) >> MI_SIZE_LOG2;
3836 }
3837 
is_psnr_calc_enabled(const AV1_COMP * cpi)3838 static AOM_INLINE int is_psnr_calc_enabled(const AV1_COMP *cpi) {
3839   const AV1_COMMON *const cm = &cpi->common;
3840 
3841   return cpi->ppi->b_calculate_psnr && !is_stat_generation_stage(cpi) &&
3842          cm->show_frame;
3843 }
3844 
3845 #if CONFIG_AV1_TEMPORAL_DENOISING
denoise_svc(const struct AV1_COMP * const cpi)3846 static INLINE int denoise_svc(const struct AV1_COMP *const cpi) {
3847   return (!cpi->ppi->use_svc ||
3848           (cpi->ppi->use_svc &&
3849            cpi->svc.spatial_layer_id >= cpi->svc.first_layer_denoise));
3850 }
3851 #endif
3852 
3853 #if CONFIG_COLLECT_PARTITION_STATS == 2
av1_print_fr_partition_timing_stats(const FramePartitionTimingStats * part_stats,const char * filename)3854 static INLINE void av1_print_fr_partition_timing_stats(
3855     const FramePartitionTimingStats *part_stats, const char *filename) {
3856   FILE *f = fopen(filename, "w");
3857   if (!f) {
3858     return;
3859   }
3860 
3861   fprintf(f, "bsize,redo,");
3862   for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3863     fprintf(f, "decision_%d,", part);
3864   }
3865   for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3866     fprintf(f, "attempt_%d,", part);
3867   }
3868   for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3869     fprintf(f, "time_%d,", part);
3870   }
3871   fprintf(f, "\n");
3872 
3873   static const int bsizes[6] = { 128, 64, 32, 16, 8, 4 };
3874 
3875   for (int bsize_idx = 0; bsize_idx < 6; bsize_idx++) {
3876     fprintf(f, "%d,%d,", bsizes[bsize_idx], part_stats->partition_redo);
3877     for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3878       fprintf(f, "%d,", part_stats->partition_decisions[bsize_idx][part]);
3879     }
3880     for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3881       fprintf(f, "%d,", part_stats->partition_attempts[bsize_idx][part]);
3882     }
3883     for (int part = 0; part < EXT_PARTITION_TYPES; part++) {
3884       fprintf(f, "%ld,", part_stats->partition_times[bsize_idx][part]);
3885     }
3886     fprintf(f, "\n");
3887   }
3888   fclose(f);
3889 }
3890 #endif  // CONFIG_COLLECT_PARTITION_STATS == 2
3891 
3892 #if CONFIG_COLLECT_PARTITION_STATS
av1_get_bsize_idx_for_part_stats(BLOCK_SIZE bsize)3893 static INLINE int av1_get_bsize_idx_for_part_stats(BLOCK_SIZE bsize) {
3894   assert(bsize == BLOCK_128X128 || bsize == BLOCK_64X64 ||
3895          bsize == BLOCK_32X32 || bsize == BLOCK_16X16 || bsize == BLOCK_8X8 ||
3896          bsize == BLOCK_4X4);
3897   switch (bsize) {
3898     case BLOCK_128X128: return 0;
3899     case BLOCK_64X64: return 1;
3900     case BLOCK_32X32: return 2;
3901     case BLOCK_16X16: return 3;
3902     case BLOCK_8X8: return 4;
3903     case BLOCK_4X4: return 5;
3904     default: assert(0 && "Invalid bsize for partition_stats."); return -1;
3905   }
3906 }
3907 #endif  // CONFIG_COLLECT_PARTITION_STATS
3908 
3909 #if CONFIG_COLLECT_COMPONENT_TIMING
start_timing(AV1_COMP * cpi,int component)3910 static INLINE void start_timing(AV1_COMP *cpi, int component) {
3911   aom_usec_timer_start(&cpi->component_timer[component]);
3912 }
end_timing(AV1_COMP * cpi,int component)3913 static INLINE void end_timing(AV1_COMP *cpi, int component) {
3914   aom_usec_timer_mark(&cpi->component_timer[component]);
3915   cpi->frame_component_time[component] +=
3916       aom_usec_timer_elapsed(&cpi->component_timer[component]);
3917 }
get_frame_type_enum(int type)3918 static INLINE char const *get_frame_type_enum(int type) {
3919   switch (type) {
3920     case 0: return "KEY_FRAME";
3921     case 1: return "INTER_FRAME";
3922     case 2: return "INTRA_ONLY_FRAME";
3923     case 3: return "S_FRAME";
3924     default: assert(0);
3925   }
3926   return "error";
3927 }
3928 #endif
3929 
3930 /*!\endcond */
3931 
3932 #ifdef __cplusplus
3933 }  // extern "C"
3934 #endif
3935 
3936 #endif  // AOM_AV1_ENCODER_ENCODER_H_
3937