tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

encoder.h (136118B)


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