/*
 * Copyright (c) 2021, Alliance for Open Media. All rights reserved
 *
 * This source code is subject to the terms of the BSD 3-Clause Clear License
 * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear
 * License was not distributed with this source code in the LICENSE file, you
 * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  If the
 * Alliance for Open Media Patent License 1.0 was not distributed with this
 * source code in the PATENTS file, you can obtain it at
 * aomedia.org/license/patent-license/.
 */

#include <limits.h>
#include <float.h>
#include <math.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>

#include "av2/common/av2_common_int.h"
#include "av2/common/bru.h"
#include "config/avm_config.h"
#include "config/avm_dsp_rtcd.h"

#if CONFIG_DENOISE
#include "avm_dsp/grain_table.h"
#include "avm_dsp/noise_util.h"
#include "avm_dsp/noise_model.h"
#endif
#include "avm_dsp/psnr.h"
#if CONFIG_INTERNAL_STATS
#include "avm_dsp/ssim.h"
#endif
#include "avm_ports/avm_timer.h"
#include "avm_ports/mem.h"
#include "avm_ports/system_state.h"
#include "avm_scale/avm_scale.h"
#if CONFIG_BITSTREAM_DEBUG
#include "avm_util/debug_util.h"
#endif  // CONFIG_BITSTREAM_DEBUG

#include "av2/common/alloccommon.h"
#include "av2/common/av2_common_int.h"
#include "av2/common/filter.h"
#include "av2/common/idct.h"
#include "av2/common/pred_common.h"
#include "av2/common/reconinter.h"
#include "av2/common/reconintra.h"
#include "av2/common/cfl.h"
#include "av2/common/resize.h"
#include "av2/common/tile_common.h"
#include "av2/common/tip.h"

#include "av2/encoder/aq_complexity.h"
#include "av2/encoder/aq_cyclicrefresh.h"
#include "av2/encoder/aq_variance.h"
#include "av2/encoder/bitstream.h"
#include "av2/encoder/context_tree.h"
#include "av2/encoder/encodeframe.h"
#include "av2/encoder/encodemv.h"
#include "av2/encoder/encode_strategy.h"
#include "av2/encoder/encoder.h"
#include "av2/encoder/encoder_alloc.h"
#include "av2/encoder/encoder_utils.h"
#include "av2/encoder/encodetxb.h"
#include "av2/encoder/ethread.h"
#include "av2/encoder/firstpass.h"
#include "av2/encoder/hash_motion.h"
#include "av2/encoder/intra_mode_search.h"
#include "av2/encoder/mv_prec.h"
#include "av2/encoder/pass2_strategy.h"
#include "av2/encoder/pickcdef.h"
#include "av2/encoder/pickccso.h"
#include "av2/encoder/picklpf.h"
#include "av2/encoder/pickrst.h"
#include "av2/encoder/random.h"
#include "av2/encoder/ratectrl.h"
#include "av2/encoder/rc_utils.h"
#include "av2/encoder/rd.h"
#include "av2/encoder/rdopt.h"
#include "av2/encoder/reconinter_enc.h"
#include "av2/encoder/scale.h"
#include "av2/encoder/segmentation.h"
#include "av2/encoder/speed_features.h"
#include "av2/encoder/subgop.h"
#include "av2/encoder/tpl_model.h"

#if CONFIG_ML_PART_SPLIT
#include "av2/encoder/part_split_prune_tflite.h"
#endif  // CONFIG_ML_PART_SPLIT

#if CONFIG_DIP_EXT_PRUNING
#include "av2/encoder/intra_dip_mode_prune_tflite.h"
#endif  // CONFIG_DIP_EXT_PRUNING

#define DEFAULT_EXPLICIT_ORDER_HINT_BITS 7

#define DEF_MAX_DRL_REFMVS 4
#define DEF_MAX_DRL_REFBVS 4
#if CONFIG_ENTROPY_STATS
FRAME_COUNTS aggregate_fc;
#endif  // CONFIG_ENTROPY_STATS

// #define OUTPUT_YUV_REC
#ifdef OUTPUT_YUV_REC
FILE *yuv_rec_file;
#define FILE_NAME_LEN 100
#endif

static INLINE void Scale2Ratio(AVM_SCALING mode, int *hr, int *hs) {
  switch (mode) {
    case NORMAL:
      *hr = 1;
      *hs = 1;
      break;
    case FOURFIVE:
      *hr = 4;
      *hs = 5;
      break;
    case THREEFIVE:
      *hr = 3;
      *hs = 5;
      break;
    case THREEFOUR:
      *hr = 3;
      *hs = 4;
      break;
    case ONEFOUR:
      *hr = 1;
      *hs = 4;
      break;
    case ONEEIGHT:
      *hr = 1;
      *hs = 8;
      break;
    case ONETWO:
      *hr = 1;
      *hs = 2;
      break;
    default:
      *hr = 1;
      *hs = 1;
      assert(0);
      break;
  }
}

int av2_set_active_map(AV2_COMP *cpi, unsigned char *new_map_16x16, int rows,
                       int cols) {
  const CommonModeInfoParams *const mi_params = &cpi->common.mi_params;
  if (rows == mi_params->mb_rows && cols == mi_params->mb_cols) {
    unsigned char *const active_map_8x8 = cpi->active_map.map;
    const int mi_rows = mi_params->mi_rows;
    const int mi_cols = mi_params->mi_cols;
    const int row_scale = mi_size_high[BLOCK_16X16] == 2 ? 1 : 2;
    const int col_scale = mi_size_wide[BLOCK_16X16] == 2 ? 1 : 2;
    cpi->active_map.update = 1;
    if (new_map_16x16) {
      int r, c;
      for (r = 0; r < mi_rows; ++r) {
        for (c = 0; c < mi_cols; ++c) {
          active_map_8x8[r * mi_cols + c] =
              new_map_16x16[(r >> row_scale) * cols + (c >> col_scale)]
                  ? AM_SEGMENT_ID_ACTIVE
                  : AM_SEGMENT_ID_INACTIVE;
        }
      }
      cpi->active_map.enabled = 1;
    } else {
      cpi->active_map.enabled = 0;
    }
    return 0;
  } else {
    return -1;
  }
}

int av2_get_active_map(AV2_COMP *cpi, unsigned char *new_map_16x16, int rows,
                       int cols) {
  const CommonModeInfoParams *const mi_params = &cpi->common.mi_params;
  if (rows == mi_params->mb_rows && cols == mi_params->mb_cols &&
      new_map_16x16) {
    unsigned char *const seg_map_8x8 = cpi->enc_seg.map;
    const int mi_rows = mi_params->mi_rows;
    const int mi_cols = mi_params->mi_cols;
    const int row_scale = mi_size_high[BLOCK_16X16] == 2 ? 1 : 2;
    const int col_scale = mi_size_wide[BLOCK_16X16] == 2 ? 1 : 2;

    memset(new_map_16x16, !cpi->active_map.enabled, rows * cols);
    if (cpi->active_map.enabled) {
      int r, c;
      for (r = 0; r < mi_rows; ++r) {
        for (c = 0; c < mi_cols; ++c) {
          // Cyclic refresh segments are considered active despite not having
          // AM_SEGMENT_ID_ACTIVE
          new_map_16x16[(r >> row_scale) * cols + (c >> col_scale)] |=
              seg_map_8x8[r * mi_cols + c] != AM_SEGMENT_ID_INACTIVE;
        }
      }
    }
    return 0;
  } else {
    return -1;
  }
}

void av2_initialize_enc(void) {
  av2_rtcd();
  avm_dsp_rtcd();
  avm_scale_rtcd();
  av2_init_intra_predictors();
  av2_init_me_luts();
  av2_rc_init_minq_luts();
  av2_init_wedge_masks();
  init_cwp_masks();
  av2_init_stxfm_kernels();
}

static void update_reference_segmentation_map(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  const CommonModeInfoParams *const mi_params = &cm->mi_params;
  MB_MODE_INFO **mi_4x4_ptr = mi_params->mi_grid_base;
  uint8_t *cache_ptr = cm->cur_frame->seg_map;

  for (int row = 0; row < mi_params->mi_rows; row++) {
    MB_MODE_INFO **mi_4x4 = mi_4x4_ptr;
    uint8_t *cache = cache_ptr;
    for (int col = 0; col < mi_params->mi_cols; col++, mi_4x4++, cache++)
      cache[0] = mi_4x4[0]->segment_id;
    mi_4x4_ptr += mi_params->mi_stride;
    cache_ptr += mi_params->mi_cols;
  }
}

void av2_new_framerate(AV2_COMP *cpi, double framerate) {
  cpi->framerate = framerate < 0.1 ? 30 : framerate;
  av2_rc_update_framerate(cpi, cpi->common.width, cpi->common.height);
}

static void update_frame_size(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;

  // We need to reallocate the context buffers here in case we need more mis or
  // if we need more superblocks.
  if (av2_alloc_context_buffers(cm, cm->width, cm->height)) {
    avm_internal_error(&cm->error, AVM_CODEC_MEM_ERROR,
                       "Failed to allocate context buffers");
  }
  av2_init_mi_buffers(&cm->mi_params);

  av2_init_macroblockd(cm, xd);

  if (!is_stat_generation_stage(cpi))
    alloc_context_buffers_ext(cm, &cpi->mbmi_ext_info);

  const BLOCK_SIZE sb_size = av2_select_sb_size(cpi);
  if (!cpi->seq_params_locked) {
    set_sb_size(cm, sb_size);
  } else {
    av2_set_frame_sb_size(cm, sb_size);
  }
  cpi->td.sb_size = cm->sb_size;

  av2_set_tile_info(cm, &cpi->oxcf.tile_cfg);
}

static INLINE int does_level_match(int width, int height, double fps,
                                   int lvl_width, int lvl_height,
                                   double lvl_fps, int lvl_dim_mult) {
  const int64_t lvl_luma_pels = lvl_width * lvl_height;
  const double lvl_display_sample_rate = lvl_luma_pels * lvl_fps;
  const int64_t luma_pels = width * height;
  const double display_sample_rate = luma_pels * fps;
  return luma_pels <= lvl_luma_pels &&
         display_sample_rate <= lvl_display_sample_rate &&
         width <= lvl_width * lvl_dim_mult &&
         height <= lvl_height * lvl_dim_mult;
}

static void set_bitstream_level_tier(
#if CONFIG_CWG_F270_OPS
    AV2_COMP *cpi,
#else
    SequenceHeader *seq,
#endif  // !CONFIG_CWG_F270_OPS
    AV2_COMMON *cm, int width, int height, double init_framerate) {
  // TODO(any): This is a placeholder function that only addresses dimensions
  // and max display sample rates.
  // Need to add checks for max bit rate, max decoded luma sample rate, header
  // rate, etc. that are not covered by this function.
  AV2_LEVEL level = SEQ_LEVEL_MAX;
  if (does_level_match(width, height, init_framerate, 512, 288, 30.0, 4)) {
    level = SEQ_LEVEL_2_0;
  } else if (does_level_match(width, height, init_framerate, 704, 396, 30.0,
                              4)) {
    level = SEQ_LEVEL_2_1;
  } else if (does_level_match(width, height, init_framerate, 1088, 612, 30.0,
                              4)) {
    level = SEQ_LEVEL_3_0;
  } else if (does_level_match(width, height, init_framerate, 1376, 774, 30.0,
                              4)) {
    level = SEQ_LEVEL_3_1;
  } else if (does_level_match(width, height, init_framerate, 2048, 1152, 30.0,
                              3)) {
    level = SEQ_LEVEL_4_0;
  } else if (does_level_match(width, height, init_framerate, 2048, 1152, 60.0,
                              3)) {
    level = SEQ_LEVEL_4_1;
  } else if (does_level_match(width, height, init_framerate, 4096, 2176, 30.0,
                              2)) {
    level = SEQ_LEVEL_5_0;
  } else if (does_level_match(width, height, init_framerate, 4096, 2176, 60.0,
                              2)) {
    level = SEQ_LEVEL_5_1;
  } else if (does_level_match(width, height, init_framerate, 4096, 2176, 120.0,
                              2)) {
    level = SEQ_LEVEL_5_2;
  } else if (does_level_match(width, height, init_framerate, 8192, 4352, 30.0,
                              2)) {
    level = SEQ_LEVEL_6_0;
  } else if (does_level_match(width, height, init_framerate, 8192, 4352, 60.0,
                              2)) {
    level = SEQ_LEVEL_6_1;
  } else if (does_level_match(width, height, init_framerate, 8192, 4352, 120.0,
                              2)) {
    level = SEQ_LEVEL_6_2;
  }

  SequenceHeader *const seq_params = &cm->seq_params;
  for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
#if CONFIG_CWG_F270_OPS
    cpi->level_idx[i] = level;
#else
    seq->seq_level_idx[i] = level;
#endif  // CONFIG_CWG_F270_OPS
    // Set the maximum parameters for bitrate and buffer size for this profile,
    // level, and tier
    seq_params->op_params[i].bitrate = av2_max_level_bitrate(
#if CONFIG_CWG_F270_OPS
        cm->seq_params.profile, cpi->level_idx[i], cpi->tier[i]);
#else
        cm->seq_params.profile, seq->seq_level_idx[i], seq->tier[i]);
#endif  //  CONFIG_CWG_F270_OPS

    // Level with seq_level_idx = 31 returns a high "dummy" bitrate to pass the
    // check
    if (seq_params->op_params[i].bitrate == 0)
      avm_internal_error(
          &cm->error, AVM_CODEC_UNSUP_BITSTREAM,
          "AV2 does not support this combination of profile, level, and tier.");
    // Buffer size in bits/s is bitrate in bits/s * 1 s
    seq_params->op_params[i].buffer_size = seq_params->op_params[i].bitrate;
  }
}

void av2_init_seq_coding_tools(
#if CONFIG_CWG_F270_OPS
    AV2_COMP *cpi,
#endif  // CONFIG_CWG_F270_OPS
    SequenceHeader *seq, AV2_COMMON *cm, const AV2EncoderConfig *oxcf) {
  const FrameDimensionCfg *const frm_dim_cfg = &oxcf->frm_dim_cfg;
  const ToolCfg *const tool_cfg = &oxcf->tool_cfg;

  seq->still_picture =
      (tool_cfg->force_video_mode == 0) && (oxcf->input_cfg.limit == 1);
  seq->single_picture_header_flag = seq->still_picture;
  seq->single_picture_header_flag &= !tool_cfg->full_still_picture_hdr;
  seq->force_screen_content_tools = 2;
  seq->force_integer_mv = 2;
  if (seq->still_picture && seq->single_picture_header_flag) {
    seq->force_screen_content_tools = 2;
    seq->force_integer_mv = 2;
  }
  if (oxcf->kf_cfg.key_freq_min == 9999 && oxcf->kf_cfg.key_freq_max == 9999
#if CONFIG_F322_OBUER_REFRESTRICT
      && oxcf->kf_cfg.sframe_mode != 0
#endif  // CONFIG_F322_OBUER_REFRESTRICT
  )
    seq->order_hint_info.order_hint_bits_minus_1 =
        DEFAULT_EXPLICIT_ORDER_HINT_BITS - 4;
  else if (oxcf->kf_cfg.key_freq_min == 65 && oxcf->kf_cfg.key_freq_max == 65)
    seq->order_hint_info.order_hint_bits_minus_1 =
        DEFAULT_EXPLICIT_ORDER_HINT_BITS - 1;  // 7
  else if (oxcf->kf_cfg.key_freq_min == 0 && oxcf->kf_cfg.key_freq_max == 0)
    seq->order_hint_info.order_hint_bits_minus_1 = 0;  // 1 bit
  else
    seq->order_hint_info.order_hint_bits_minus_1 =
        DEFAULT_EXPLICIT_ORDER_HINT_BITS - 1;
  seq->enable_bru = seq->single_picture_header_flag ? 0 : tool_cfg->enable_bru;
  seq->enable_explicit_ref_frame_map =
      seq->single_picture_header_flag
          ? 0
          : oxcf->ref_frm_cfg.explicit_ref_frame_map;
  if (oxcf->tool_cfg.max_drl_refmvs == 0) {
    seq->def_max_drl_bits = DEF_MAX_DRL_REFMVS - 1;
  } else {
    seq->def_max_drl_bits = oxcf->tool_cfg.max_drl_refmvs - 1;
  }
  // Disable frame by frame update for now. Can be changed later.
  seq->allow_frame_max_drl_bits = 0;
  if (seq->single_picture_header_flag) {
    seq->def_max_drl_bits = MIN_MAX_DRL_BITS;
    seq->allow_frame_max_drl_bits = 0;
  }
  if (oxcf->tool_cfg.max_drl_refbvs == 0) {
    seq->def_max_bvp_drl_bits = DEF_MAX_DRL_REFBVS - 1;
  } else {
    seq->def_max_bvp_drl_bits = oxcf->tool_cfg.max_drl_refbvs - 1;
  }
  // Disable frame by frame update for now. Can be changed later.
  seq->allow_frame_max_bvp_drl_bits = 0;
  seq->num_same_ref_compound =
      seq->single_picture_header_flag ? 0 : SAME_REF_COMPOUND_PRUNE;

  seq->max_frame_width = frm_dim_cfg->forced_max_frame_width
                             ? frm_dim_cfg->forced_max_frame_width
                             : frm_dim_cfg->width;
  seq->max_frame_height = frm_dim_cfg->forced_max_frame_height
                              ? frm_dim_cfg->forced_max_frame_height
                              : frm_dim_cfg->height;
  seq->tile_params.allow_tile_info_change = 0;
  if (!seq->still_picture && oxcf->kf_cfg.key_freq_max > 0) {
    av2_set_seq_tile_info(seq, oxcf);
    seq->seq_tile_info_present_flag = 1;
  } else {
    seq->seq_tile_info_present_flag = 0;
  }

  seq->seg_params.allow_seg_info_change = 1;
  if (!seq->still_picture && oxcf->kf_cfg.key_freq_max > 0) {
    seq->seq_seg_info_present_flag = 1;
  } else {
    // For image coding turn seq level seg features off
    seq->seq_seg_info_present_flag = 0;
  }

  seq->num_bits_width =
      (seq->max_frame_width > 1) ? get_msb(seq->max_frame_width - 1) + 1 : 1;
  seq->num_bits_height =
      (seq->max_frame_height > 1) ? get_msb(seq->max_frame_height - 1) + 1 : 1;
  assert(seq->num_bits_width <= 16);
  assert(seq->num_bits_height <= 16);

  seq->order_hint_info.enable_ref_frame_mvs = tool_cfg->ref_frame_mvs_present;
  seq->order_hint_info.reduced_ref_frame_mvs_mode =
      tool_cfg->reduced_ref_frame_mvs_mode;
  seq->disable_loopfilters_across_tiles =
      tool_cfg->disable_loopfilters_across_tiles;
  seq->enable_cdef = tool_cfg->enable_cdef;
  seq->enable_gdf = tool_cfg->enable_gdf;
  seq->enable_restoration = tool_cfg->enable_restoration;
  seq->enable_ccso = tool_cfg->enable_ccso;
  seq->enable_lf_sub_pu =
      seq->single_picture_header_flag ? 0 : tool_cfg->enable_lf_sub_pu;
  seq->enable_opfl_refine = seq->single_picture_header_flag
                                ? AVM_OPFL_REFINE_NONE
                                : tool_cfg->enable_opfl_refine;
  seq->enable_tip = seq->single_picture_header_flag ? 0 : tool_cfg->enable_tip;
  seq->enable_tip_refinemv = tool_cfg->enable_tip_refinemv;
  seq->enable_tip_hole_fill = seq->enable_tip != 0;
  seq->enable_tip_explicit_qp = 0;
  seq->enable_mv_traj =
      seq->single_picture_header_flag ? 0 : tool_cfg->enable_mv_traj;
  seq->enable_bawp = tool_cfg->enable_bawp;
  seq->enable_cwp = seq->single_picture_header_flag ? 0 : tool_cfg->enable_cwp;
  seq->enable_imp_msk_bld =
      seq->single_picture_header_flag ? 0 : tool_cfg->enable_imp_msk_bld;
  seq->seq_enabled_motion_modes =
      oxcf->motion_mode_cfg.seq_enabled_motion_modes;

  uint8_t warp_delta_enabled =
      (seq->seq_enabled_motion_modes & (1 << WARP_DELTA)) != 0 ? 1 : 0;
  ;
  seq->seq_frame_motion_modes_present_flag = 0;  // in CTC set that flag to 0
  seq->enable_six_param_warp_delta =
      warp_delta_enabled ? oxcf->motion_mode_cfg.enable_six_param_warp_delta
                         : 0;

  seq->enable_ext_partitions = oxcf->part_cfg.enable_ext_partitions;
  seq->enable_uneven_4way_partitions =
      oxcf->part_cfg.enable_uneven_4way_partitions;
  const int max_ratio = oxcf->part_cfg.max_partition_aspect_ratio;
  seq->max_pb_aspect_ratio_log2_m1 =
      max_ratio == 2 ? 0 : (max_ratio == 4 ? 1 : 2);
  seq->enable_masked_compound = oxcf->comp_type_cfg.enable_masked_comp;
  seq->enable_intra_edge_filter = oxcf->intra_mode_cfg.enable_intra_edge_filter;
  seq->enable_intra_dip = oxcf->intra_mode_cfg.enable_intra_dip;

  seq->enable_sdp = oxcf->part_cfg.enable_sdp;
  seq->enable_extended_sdp =
      seq->single_picture_header_flag ? 0 : oxcf->part_cfg.enable_extended_sdp;
  seq->enable_mrls = oxcf->intra_mode_cfg.enable_mrls;
  seq->enable_fsc = oxcf->intra_mode_cfg.enable_fsc;
  if (!seq->enable_fsc) {
    seq->enable_idtx_intra = oxcf->intra_mode_cfg.enable_idtx_intra;
  } else {
    seq->enable_idtx_intra = 1;
  }
  seq->enable_ist = oxcf->txfm_cfg.enable_ist;
  seq->enable_inter_ist = oxcf->txfm_cfg.enable_inter_ist;
  seq->enable_chroma_dctonly = oxcf->txfm_cfg.enable_chroma_dctonly;
  seq->enable_cfl_intra = oxcf->intra_mode_cfg.enable_cfl_intra;
  seq->enable_mhccp = oxcf->intra_mode_cfg.enable_mhccp;
  seq->enable_inter_ddt =
      seq->single_picture_header_flag ? 0 : oxcf->txfm_cfg.enable_inter_ddt;
  seq->reduced_tx_part_set = oxcf->txfm_cfg.reduced_tx_part_set;
  seq->enable_cctx = oxcf->txfm_cfg.enable_cctx;
  seq->enable_ibp = oxcf->intra_mode_cfg.enable_ibp;
  seq->enable_adaptive_mvd =
      seq->single_picture_header_flag ? 0 : tool_cfg->enable_adaptive_mvd;
  seq->enable_flex_mvres =
      seq->single_picture_header_flag ? 0 : tool_cfg->enable_flex_mvres;
  seq->cfl_ds_filter_index = tool_cfg->select_cfl_ds_filter;
  seq->enable_joint_mvd = tool_cfg->enable_joint_mvd;
  seq->enable_refinemv =
      seq->single_picture_header_flag ? 0 : tool_cfg->enable_refinemv;
  seq->enable_mvd_sign_derive =
      seq->single_picture_header_flag ? 0 : tool_cfg->enable_mvd_sign_derive;

  set_bitstream_level_tier(
#if CONFIG_CWG_F270_OPS
      cpi,
#else
      seq,
#endif  // CONFIG_CWG_F270_OPS
      cm, frm_dim_cfg->width, frm_dim_cfg->height,
      oxcf->input_cfg.init_framerate);

#if CONFIG_CWG_F270_OPS
  seq->seq_max_level_idx = cpi->level_idx[0];
#endif  // CONFIG_CWG_F270_OPS

  if (seq->operating_points_cnt_minus_1 == 0) {
    seq->operating_point_idc[0] = 0;
  } else {
    // Set operating_point_idc[] such that the i=0 point corresponds to the
    // highest quality operating point (all layers), and subsequent
    // operarting points (i > 0) are lower quality corresponding to
    // skip decoding enhancement  layers (temporal first).
    int i = 0;
    assert(seq->operating_points_cnt_minus_1 ==
           (int)(cm->number_mlayers * cm->number_tlayers - 1));
    for (unsigned int sl = 0; sl < cm->number_mlayers; sl++) {
      for (unsigned int tl = 0; tl < cm->number_tlayers; tl++) {
        seq->operating_point_idc[i] =
            (~(~0u << (cm->number_mlayers - sl)) << MAX_NUM_TLAYERS) |
            ~(~0u << (cm->number_tlayers - tl));
        i++;
      }
    }
  }

  // layer dependency information
  seq->max_tlayer_id = 0;
  seq->max_mlayer_id = 0;
  seq->tlayer_dependency_present_flag = 0;
  seq->mlayer_dependency_present_flag = 0;
  setup_default_temporal_layer_dependency_structure(seq);
  setup_default_embedded_layer_dependency_structure(seq);

  // delta_q
  seq->base_y_dc_delta_q = 0;
  seq->base_uv_dc_delta_q = 0;
  // Note if equal_ac_dc_q is on, then:
  // seq->y_dc_delta_q_enabled == 0
  // seq->uv_dc_delta_q_enabled == 0
  // seq->base_uv_dc_delta_q == seq->base_uv_ac_delta_q
  seq->equal_ac_dc_q = 1;

  seq->base_uv_ac_delta_q = 0;
  seq->y_dc_delta_q_enabled = 0;
  seq->uv_dc_delta_q_enabled = 0;
  seq->uv_ac_delta_q_enabled = 0;
  const int is_360p_or_larger =
      AVMMIN(seq->max_frame_width, seq->max_frame_height) >= 360;
  const int is_720p_or_larger =
      AVMMIN(seq->max_frame_width, seq->max_frame_height) >= 720;
  if (!is_360p_or_larger) {
    seq->base_y_dc_delta_q = 0;
    seq->base_uv_dc_delta_q = 0;
    seq->base_uv_ac_delta_q = 0;
  } else if (!is_720p_or_larger) {
    seq->base_y_dc_delta_q = 0;
    seq->base_uv_dc_delta_q = 0;
    seq->base_uv_ac_delta_q = 0;
  } else {
    seq->base_y_dc_delta_q = 0;
    seq->base_uv_dc_delta_q = 0;
    seq->base_uv_ac_delta_q = 0;
  }
  assert(IMPLIES(seq->equal_ac_dc_q, seq->y_dc_delta_q_enabled == 0 &&
                                         seq->base_y_dc_delta_q == 0));
  assert(IMPLIES(seq->equal_ac_dc_q,
                 seq->uv_dc_delta_q_enabled == 0 &&
                     seq->base_uv_dc_delta_q == seq->base_uv_ac_delta_q));

  seq->enable_refmvbank = tool_cfg->enable_refmvbank;
  seq->enable_drl_reorder = tool_cfg->enable_drl_reorder;

  seq->conf.conf_win_enabled_flag = oxcf->tool_cfg.enable_cropping_window;
  if (seq->conf.conf_win_enabled_flag) {
    seq->conf.conf_win_left_offset = oxcf->tool_cfg.crop_win_left_offset;
    seq->conf.conf_win_top_offset = oxcf->tool_cfg.crop_win_top_offset;
    seq->conf.conf_win_right_offset = oxcf->tool_cfg.crop_win_right_offset;
    seq->conf.conf_win_bottom_offset = oxcf->tool_cfg.crop_win_bottom_offset;
  } else {
    seq->conf.conf_win_left_offset = 0;
    seq->conf.conf_win_top_offset = 0;
    seq->conf.conf_win_right_offset = 0;
    seq->conf.conf_win_bottom_offset = 0;
  }

#if !CONFIG_CWG_F270_CI_OBU
  seq->scan_type_info_present_flag = oxcf->tool_cfg.scan_type_info_present_flag;
  if (seq->scan_type_info_present_flag) {
    seq->scan_type_idc = AVM_SCAN_TYPE_UNSPECIFIED;
    seq->fixed_cvs_pic_rate_flag = 0;
    seq->elemental_ct_duration_minus_1 = -1;
  }
#endif  // !CONFIG_CWG_F270_CI_OBU

  seq->enable_cdef_on_skip_txfm = seq->single_picture_header_flag
                                      ? CDEF_ON_SKIP_TXFM_ADAPTIVE
                                      : tool_cfg->enable_cdef_on_skip_txfm;
  // If seq->single_picture_header_flag is equal to 1, setting both
  // enable_avg_cdf and avg_cdf_type to 1 allows us to omit the
  // context_update_tile_id syntax element in tile_info(), which is part of
  // uncompressed_header().
  seq->enable_avg_cdf =
      seq->single_picture_header_flag ? 1 : tool_cfg->enable_avg_cdf;
  seq->avg_cdf_type =
      seq->single_picture_header_flag ? 1 : tool_cfg->avg_cdf_type;
  seq->enable_tcq =
      is_lossless_requested(&oxcf->rc_cfg) ? 0 : tool_cfg->enable_tcq;
  if (seq->enable_tcq != TCQ_DISABLE && seq->single_picture_header_flag) {
    seq->enable_tcq = TCQ_8ST;
  }
  if (seq->enable_tcq == TCQ_DISABLE || seq->enable_tcq >= TCQ_8ST_FR) {
    seq->enable_parity_hiding = is_lossless_requested(&oxcf->rc_cfg)
                                    ? 0
                                    : tool_cfg->enable_parity_hiding;
  } else {
    seq->enable_parity_hiding = 0;
  }
  // TODO(rachelbarker): Check if cpi->sf.gm_sf.gm_search_type is set by this
  // point, and set to 0 if cpi->sf.gm_sf.gm_search_type == GM_DISABLE_SEARCH
  // if possible
  seq->enable_global_motion =
      tool_cfg->enable_global_motion && !seq->single_picture_header_flag;
  seq->enable_short_refresh_frame_flags =
      seq->single_picture_header_flag
          ? 0
          : tool_cfg->enable_short_refresh_frame_flags;
  seq->number_of_bits_for_lt_frame_id = seq->single_picture_header_flag ? 0 : 3;
  seq->enable_ext_seg = tool_cfg->enable_ext_seg;
  seq->ref_frames = seq->single_picture_header_flag ? 2 : tool_cfg->dpb_size;
  seq->ref_frames_log2 = avm_ceil_log2(seq->ref_frames);
}
#if CONFIG_CWG_F270_CI_OBU
static void set_content_interpreation_params(struct AV2_COMP *cpi,
                                             const AV2EncoderConfig *oxcf,
                                             CHROMA_FORMAT chroma_format_idc) {
  const DecoderModelCfg *const dec_model_cfg = &oxcf->dec_model_cfg;
  const ColorCfg *const color_cfg = &oxcf->color_cfg;
  cpi->oxcf = *oxcf;
  ContentInterpretation *ci_params = &cpi->common.ci_params_encoder;

  // Scan type information
  cpi->scan_type_info_present_flag = oxcf->tool_cfg.scan_type_info_present_flag;
  ci_params->ci_scan_type_idc = AVM_SCAN_TYPE_UNSPECIFIED;

  // Set color info
  ci_params->color_info.color_primaries = color_cfg->color_primaries;
  ci_params->color_info.matrix_coefficients = color_cfg->matrix_coefficients;
  ci_params->color_info.transfer_characteristics =
      color_cfg->transfer_characteristics;

  ci_params->color_info.color_description_idc = AVM_COLOR_DESC_IDC_EXPLICIT;
  if (ci_params->color_info.color_primaries == AVM_CICP_CP_BT_709 &&
      ci_params->color_info.transfer_characteristics == AVM_CICP_TC_BT_709 &&
      ci_params->color_info.matrix_coefficients == AVM_CICP_MC_BT_470_B_G) {
    ci_params->color_info.color_description_idc = AVM_COLOR_DESC_IDC_BT709SDR;
  } else if (ci_params->color_info.color_primaries == AVM_CICP_CP_BT_709 &&
             ci_params->color_info.transfer_characteristics ==
                 AVM_CICP_TC_SRGB &&
             ci_params->color_info.matrix_coefficients ==
                 AVM_CICP_MC_IDENTITY) {
    ci_params->color_info.color_description_idc = AVM_COLOR_DESC_IDC_SRGB;
  } else if (ci_params->color_info.color_primaries == AVM_CICP_CP_BT_709 &&
             ci_params->color_info.transfer_characteristics ==
                 AVM_CICP_TC_SRGB &&
             ci_params->color_info.matrix_coefficients ==
                 AVM_CICP_MC_BT_470_B_G) {
    ci_params->color_info.color_description_idc = AVM_COLOR_DESC_IDC_SRGBSYCC;
  } else if (ci_params->color_info.color_primaries == AVM_CICP_CP_BT_2020 &&
             ci_params->color_info.transfer_characteristics ==
                 AVM_CICP_TC_SMPTE_2084 &&
             ci_params->color_info.matrix_coefficients ==
                 AVM_CICP_MC_BT_2020_NCL) {
    ci_params->color_info.color_description_idc = AVM_COLOR_DESC_IDC_BT2100PQ;
  } else if (ci_params->color_info.color_primaries == AVM_CICP_CP_BT_2020 &&
             ci_params->color_info.transfer_characteristics ==
                 AVM_CICP_TC_BT_2020_10_BIT &&
             ci_params->color_info.matrix_coefficients ==
                 AVM_CICP_MC_BT_2020_NCL) {
    ci_params->color_info.color_description_idc = AVM_COLOR_DESC_IDC_BT2100HLG;
  }
  ci_params->color_info.full_range_flag = color_cfg->color_range;

  if ((ci_params->color_info.color_description_idc ==
       AVM_COLOR_DESC_IDC_EXPLICIT) ||
      (ci_params->color_info.color_description_idc ==
       AVM_COLOR_DESC_IDC_BT709SDR) ||
      (ci_params->color_info.color_description_idc ==
       AVM_COLOR_DESC_IDC_SRGB) ||
      (ci_params->color_info.color_description_idc ==
       AVM_COLOR_DESC_IDC_SRGBSYCC) ||
      (ci_params->color_info.color_description_idc ==
       AVM_CICP_TC_BT_2020_10_BIT) ||
      (ci_params->color_info.color_description_idc ==
       AVM_COLOR_DESC_IDC_BT2100HLG) ||
      (ci_params->color_info.full_range_flag != 0))
    ci_params->ci_color_description_present_flag = 1;
  else
    ci_params->ci_color_description_present_flag = 0;
  ci_params->ci_chroma_sample_position_present_flag = 0;
  if (chroma_format_idc == CHROMA_FORMAT_422 ||
      chroma_format_idc == CHROMA_FORMAT_420) {
    ci_params->ci_chroma_sample_position_present_flag =
        color_cfg->chroma_sample_position != AVM_CSP_UNSPECIFIED;
    ci_params->ci_chroma_sample_position[0] = color_cfg->chroma_sample_position;
    if (ci_params->ci_scan_type_idc != 1)
      ci_params->ci_chroma_sample_position[1] =
          color_cfg->chroma_sample_position;
  }

  // SAR information
  ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_UNSPECIFIED;
  ci_params->sar_info.sar_width = 0;
  ci_params->sar_info.sar_height = 0;
  if (ci_params->sar_info.sar_width == 1 && ci_params->sar_info.sar_height == 1)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_1_TO_1;
  else if (ci_params->sar_info.sar_width == 12 &&
           ci_params->sar_info.sar_height == 11)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_12_TO_11;
  else if (ci_params->sar_info.sar_width == 10 &&
           ci_params->sar_info.sar_height == 11)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_10_TO_11;
  else if (ci_params->sar_info.sar_width == 16 &&
           ci_params->sar_info.sar_height == 11)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_16_TO_11;
  else if (ci_params->sar_info.sar_width == 40 &&
           ci_params->sar_info.sar_height == 33)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_40_TO_33;
  else if (ci_params->sar_info.sar_width == 24 &&
           ci_params->sar_info.sar_height == 11)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_24_TO_11;
  else if (ci_params->sar_info.sar_width == 20 &&
           ci_params->sar_info.sar_height == 11)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_20_TO_11;
  else if (ci_params->sar_info.sar_width == 32 &&
           ci_params->sar_info.sar_height == 11)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_32_TO_11;
  else if (ci_params->sar_info.sar_width == 80 &&
           ci_params->sar_info.sar_height == 33)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_80_TO_33;
  else if (ci_params->sar_info.sar_width == 18 &&
           ci_params->sar_info.sar_height == 11)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_18_TO_11;
  else if (ci_params->sar_info.sar_width == 15 &&
           ci_params->sar_info.sar_height == 11)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_15_TO_11;
  else if (ci_params->sar_info.sar_width == 64 &&
           ci_params->sar_info.sar_height == 33)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_64_TO_33;
  else if (ci_params->sar_info.sar_width == 160 &&
           ci_params->sar_info.sar_height == 99)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_160_TO_99;
  else if (ci_params->sar_info.sar_width == 4 &&
           ci_params->sar_info.sar_height == 3)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_4_TO_3;
  else if (ci_params->sar_info.sar_width == 3 &&
           ci_params->sar_info.sar_height == 2)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_3_TO_2;
  else if (ci_params->sar_info.sar_width == 2 &&
           ci_params->sar_info.sar_height == 1)
    ci_params->sar_info.sar_aspect_ratio_idc = AVM_SAR_IDC_2_TO_1;
  ci_params->ci_aspect_ratio_info_present_flag = 0;

  // timing information
  ci_params->ci_timing_info_present_flag = dec_model_cfg->timing_info_present;
  if (ci_params->ci_timing_info_present_flag) {
    // TODO
    ci_params->timing_info.equal_elemental_interval =
        dec_model_cfg->timing_info.equal_elemental_interval;
    ci_params->timing_info.num_ticks_per_elemental_duration =
        dec_model_cfg->timing_info.num_ticks_per_elemental_duration;
    ci_params->timing_info.num_units_in_display_tick =
        dec_model_cfg->timing_info.num_units_in_display_tick;
    ci_params->timing_info.time_scale = dec_model_cfg->timing_info.time_scale;
  }
  ci_params->ci_extension_present_flag = 0;

  if (ci_params->ci_color_description_present_flag ||
      ci_params->ci_chroma_sample_position_present_flag ||
      ci_params->ci_aspect_ratio_info_present_flag ||
      ci_params->ci_timing_info_present_flag ||
      cpi->scan_type_info_present_flag)
    cpi->write_ci_obu_flag = 1;
  else
    cpi->write_ci_obu_flag = 0;
}
#endif  // CONFIG_CWG_F270_CI_OBU

static void init_config(struct AV2_COMP *cpi, AV2EncoderConfig *oxcf) {
  AV2_COMMON *const cm = &cpi->common;
  SequenceHeader *const seq_params = &cm->seq_params;
  ResizePendingParams *resize_pending_params = &cpi->resize_pending_params;
  const DecoderModelCfg *const dec_model_cfg = &oxcf->dec_model_cfg;
  const ColorCfg *const color_cfg = &oxcf->color_cfg;
  cpi->oxcf = *oxcf;
  cpi->framerate = oxcf->input_cfg.init_framerate;

  //  Initialize LCR information
  for (int i = 0; i < MAX_NUM_LCR; i++)
    memset(&cpi->lcr_list[i], 0, sizeof(struct LayerConfigurationRecord));
  cm->lcr = &cpi->lcr_list[0];

  cm->lcr->lcr_global_config_record_id = 1;
  for (int i = 0; i < MAX_NUM_LCR; i++) cm->lcr->lcr_global_id[i] = 1;

  // Initialize LCR params which is used by write_lcr_local_info()
  // lcr_global_id must be non-zero since 0 is LCR_ID_UNSPECIFIED
  cm->lcr_params.lcr_global_config_record_id = 1;
  for (int i = 0; i < MAX_NUM_LCR; i++) cm->lcr_params.lcr_global_id[i] = 1;

  // Initialize OPS information
  for (int i = 0; i < MAX_NUM_OPS_ID; i++)
    memset(&cpi->ops_list[i], 0, sizeof(struct OperatingPointSet));
  cm->ops = &cpi->ops_list[0];

  for (int i = 0; i < MAX_NUM_XLAYERS; i++) {
    for (int j = 0; j < MAX_NUM_OPS_ID; j++) {
      cm->ops->ops_cnt[i][j] = oxcf->tool_cfg.operating_points_count;
    }
  }

  // Initialize Atlas Segment information
  for (int i = 0; i < MAX_NUM_ATLAS_SEG_ID; i++)
    memset(&cpi->atlas_list[i], 0, sizeof(struct AtlasSegmentInfo));
  cm->atlas = &cpi->atlas_list[0];

  cpi->written_fgm_num = 0;

#if CONFIG_CWG_E242_SEQ_HDR_ID
  seq_params->seq_header_id =
      0;  // intentionally 0 for a single sequence bitstream
#endif    // CONFIG_CWG_E242_SEQ_HDR_ID
  if (oxcf->layer_cfg.enable_lcr) {
    seq_params->seq_lcr_id = 1;
  } else {
    seq_params->seq_lcr_id = LCR_ID_UNSPECIFIED;
  }

  seq_params->profile = oxcf->profile;
  seq_params->bit_depth = oxcf->tool_cfg.bit_depth;
#if !CONFIG_CWG_F270_CI_OBU
  seq_params->color_primaries = color_cfg->color_primaries;
  seq_params->transfer_characteristics = color_cfg->transfer_characteristics;
  seq_params->matrix_coefficients = color_cfg->matrix_coefficients;
#endif  // !CONFIG_CWG_F270_CI_OBU
  seq_params->monochrome = oxcf->tool_cfg.enable_monochrome;
#if !CONFIG_CWG_F270_CI_OBU
  seq_params->chroma_sample_position = color_cfg->chroma_sample_position;
  seq_params->color_range = color_cfg->color_range;
  seq_params->timing_info_present = dec_model_cfg->timing_info_present;
  seq_params->timing_info.num_units_in_display_tick =
      dec_model_cfg->timing_info.num_units_in_display_tick;
  seq_params->timing_info.time_scale = dec_model_cfg->timing_info.time_scale;
  seq_params->timing_info.equal_picture_interval =
      dec_model_cfg->timing_info.equal_picture_interval;
  seq_params->timing_info.num_ticks_per_picture =
      dec_model_cfg->timing_info.num_ticks_per_picture;
#endif  // !CONFIG_CWG_F270_CI_OBU

  seq_params->display_model_info_present_flag =
      dec_model_cfg->display_model_info_present_flag;
  seq_params->decoder_model_info_present_flag =
      dec_model_cfg->decoder_model_info_present_flag;
  if (dec_model_cfg->decoder_model_info_present_flag) {
    // set the decoder model parameters in schedule mode
    seq_params->decoder_model_info.num_units_in_decoding_tick =
        dec_model_cfg->num_units_in_decoding_tick;
    av2_set_avm_dec_model_info(&seq_params->decoder_model_info);
    av2_set_dec_model_op_parameters(&seq_params->op_params[0]);
#if CONFIG_CWG_F270_CI_OBU
  } else if (dec_model_cfg->timing_info_present &&
             dec_model_cfg->timing_info.equal_elemental_interval &&
             !dec_model_cfg->decoder_model_info_present_flag) {
#else
  } else if (seq_params->timing_info_present &&
             seq_params->timing_info.equal_picture_interval &&
             !seq_params->decoder_model_info_present_flag) {
#endif  // CONFIG_CWG_F270_CI_OBU
    // set the decoder model parameters in resource availability mode
    av2_set_resource_availability_parameters(&seq_params->op_params[0]);
  } else {
    seq_params->op_params[0].initial_display_delay =
        10;  // Default value (not signaled)
  }
#if CONFIG_CWG_F270_OPS
  seq_params->seq_max_display_model_info_present_flag = 0;
  seq_params->seq_max_initial_display_delay_minus_1 = 0;
  if (seq_params->decoder_model_info_present_flag) {
    seq_params->seq_max_decoder_model_present_flag = 0;
    if (seq_params->seq_max_decoder_model_present_flag) {
      seq_params->seq_max_decoder_buffer_delay = 0;
      seq_params->seq_max_encoder_buffer_delay = 0;
      seq_params->seq_max_low_delay_mode_flag = 0;
    }
  }
#endif  //  CONFIG_CWG_F270_OPS

  if (seq_params->monochrome) {
    seq_params->subsampling_x = 1;
    seq_params->subsampling_y = 1;
#if CONFIG_CWG_F270_CI_OBU
  } else if (color_cfg->color_primaries == AVM_CICP_CP_BT_709 &&
             color_cfg->transfer_characteristics == AVM_CICP_TC_SRGB &&
             color_cfg->matrix_coefficients == AVM_CICP_MC_IDENTITY) {
#else
  } else if (seq_params->color_primaries == AVM_CICP_CP_BT_709 &&
             seq_params->transfer_characteristics == AVM_CICP_TC_SRGB &&
             seq_params->matrix_coefficients == AVM_CICP_MC_IDENTITY) {
#endif  // CONFIG_CWG_F270_CI_OBU
    seq_params->subsampling_x = 0;
    seq_params->subsampling_y = 0;
  } else {
    if (seq_params->profile == 0) {
      seq_params->subsampling_x = 1;
      seq_params->subsampling_y = 1;
    } else if (seq_params->profile == 1) {
      seq_params->subsampling_x = 0;
      seq_params->subsampling_y = 0;
    } else {
      if (seq_params->bit_depth == AVM_BITS_12) {
        seq_params->subsampling_x = oxcf->input_cfg.chroma_subsampling_x;
        seq_params->subsampling_y = oxcf->input_cfg.chroma_subsampling_y;
      } else {
        seq_params->subsampling_x = 1;
        seq_params->subsampling_y = 0;
      }
    }
  }

#if CONFIG_CWG_F270_CI_OBU
  uint32_t seq_chroma_format_idc = 0;
#else
  uint32_t seq_chroma_format_idc;
#endif  // CONFIG_CWG_F270_CI_OBU
  avm_codec_err_t err =
      av2_get_chroma_format_idc(seq_params, &seq_chroma_format_idc);
  if (err != AVM_CODEC_OK) {
    avm_internal_error(&cm->error, err,
                       "Unsupported subsampling_x = %d, subsampling_y = %d.",
                       seq_params->subsampling_x, seq_params->subsampling_y);
  }

#if CONFIG_CWG_F270_CI_OBU
  set_content_interpreation_params(cpi, oxcf, seq_chroma_format_idc);
#endif  // CONFIG_CWG_F270_CI_OBU

  cm->width = oxcf->frm_dim_cfg.width;
  cm->height = oxcf->frm_dim_cfg.height;
  // set sb size before allocations
  const BLOCK_SIZE sb_size = av2_select_sb_size(cpi);
  set_sb_size(cm, sb_size);
  cpi->td.sb_size = cm->sb_size;
  alloc_compressor_data(cpi);

  av2_update_film_grain_parameters(cpi, oxcf);

  cm->cur_mfh_id = oxcf->tool_cfg.enable_mfh_obu_signaling ? 1 : 0;
  cpi->cur_mfh_params.mfh_deblocking_filter_update_flag = 0;
  cpi->cur_mfh_params.mfh_tile_info_present_flag = 0;

  // Single thread case: use counts in common.
  cpi->td.counts = &cpi->counts;

  cm->pic_struct_metadata_params.mps_pic_struct_type = AVM_PIC_FRAME;
  cm->pic_struct_metadata_params.mps_source_scan_type_idc =
      AVM_SCAN_TYPE_PROGRESSIVE;
  cm->pic_struct_metadata_params.mps_duplicate_flag = 0;

  // Set init SVC parameters.
  cm->number_tlayers = 1;
  cm->number_mlayers = 1;
  cm->number_xlayers = 1;
  cm->tlayer_id = 0;
  cm->mlayer_id = 0;
  cm->xlayer_id = 0;

  // change includes all joint functionality
  av2_change_config(cpi, oxcf);

  cm->ref_frame_flags = 0;

  // Reset resize pending flags
  resize_pending_params->width = 0;
  resize_pending_params->height = 0;

  // Setup identity scale factor
  av2_setup_scale_factors_for_frame(&cm->sf_identity, 1, 1, 1, 1);

  init_buffer_indices(&cpi->force_intpel_info, cm->remapped_ref_idx);

  av2_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
}

int avm_strcmp(const char *a, const char *b) {
  if (a == NULL && b == NULL) return 0;
  if (a == NULL && b != NULL) return -1;
  if (a != NULL && b == NULL) return 1;
  return strcmp(a, b);
}

static void set_max_drl_bits(struct AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  // Add logic to choose this in the range [MIN_MAX_DRL_BITS, MAX_MAX_DRL_BITS]
  if (!cm->seq_params.allow_frame_max_drl_bits) {
    cm->features.max_drl_bits = cm->seq_params.def_max_drl_bits;
  } else {  // Can be changed with logic later
    if (cpi->oxcf.tool_cfg.max_drl_refmvs == 0) {
      cm->features.max_drl_bits = DEF_MAX_DRL_REFMVS - 1;
    } else {
      cm->features.max_drl_bits = cpi->oxcf.tool_cfg.max_drl_refmvs - 1;
    }
  }
  assert(cm->features.max_drl_bits >= MIN_MAX_DRL_BITS &&
         cm->features.max_drl_bits <= MAX_MAX_DRL_BITS);
}

static void set_max_bvp_drl_bits(struct AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  // Add logic to choose this in the range [MIN_MAX_IBC_DRL_BITS,
  // MAX_MAX_IBC_DRL_BITS]
  if (!cm->seq_params.allow_frame_max_bvp_drl_bits) {
    cm->features.max_bvp_drl_bits = cm->seq_params.def_max_bvp_drl_bits;
  } else {  // Can be changed with logic later
    if (cpi->oxcf.tool_cfg.max_drl_refbvs == 0) {
      cm->features.max_bvp_drl_bits = DEF_MAX_DRL_REFBVS - 1;
    } else {
      cm->features.max_bvp_drl_bits = cpi->oxcf.tool_cfg.max_drl_refbvs - 1;
    }
  }
  assert(cm->features.max_bvp_drl_bits >= MIN_MAX_IBC_DRL_BITS &&
         cm->features.max_bvp_drl_bits <= MAX_MAX_IBC_DRL_BITS);
}

static void set_seq_lr_tools_mask(SequenceHeader *const seq_params,
                                  const AV2EncoderConfig *oxcf) {
  const ToolCfg *const tool_cfg = &oxcf->tool_cfg;
  seq_params->lr_tools_disable_mask[0] = 0;  // default - no tools disabled
  seq_params->lr_tools_disable_mask[1] = 0;  // default - no tools disabled

  // Parse oxcf here to disable tools as requested through cmd lines
  if (!tool_cfg->enable_pc_wiener) {
    seq_params->lr_tools_disable_mask[0] |= (1 << RESTORE_PC_WIENER);
    seq_params->lr_tools_disable_mask[1] |= (1 << RESTORE_PC_WIENER);
  }
  if (!tool_cfg->enable_wiener_nonsep) {
    seq_params->lr_tools_disable_mask[0] |= (1 << RESTORE_WIENER_NONSEP);
    seq_params->lr_tools_disable_mask[1] |= (1 << RESTORE_WIENER_NONSEP);
  }

  seq_params->lr_tools_disable_mask[1] |= DEF_UV_LR_TOOLS_DISABLE_MASK;
}

void av2_change_config(struct AV2_COMP *cpi, const AV2EncoderConfig *oxcf) {
  AV2_COMMON *const cm = &cpi->common;
  SequenceHeader *const seq_params = &cm->seq_params;
  BufferRemovalTimingInfo *const brt_info = &cm->brt_info;
  RATE_CONTROL *const rc = &cpi->rc;
  MACROBLOCK *const x = &cpi->td.mb;
  AV2LevelParams *const level_params = &cpi->level_params;
  InitialDimensions *const initial_dimensions = &cpi->initial_dimensions;
  const FrameDimensionCfg *const frm_dim_cfg = &cpi->oxcf.frm_dim_cfg;
  const DecoderModelCfg *const dec_model_cfg = &oxcf->dec_model_cfg;
#if !CONFIG_CWG_F270_CI_OBU
  const ColorCfg *const color_cfg = &oxcf->color_cfg;
#endif  // !CONFIG_CWG_F270_CI_OBU
  const RateControlCfg *const rc_cfg = &oxcf->rc_cfg;
  // in case of LAP, lag in frames is set according to number of lap buffers
  // calculated at init time. This stores and restores LAP's lag in frames to
  // prevent override by new cfg.
  int lap_lag_in_frames = -1;
  if (cpi->lap_enabled && cpi->compressor_stage == LAP_STAGE) {
    lap_lag_in_frames = cpi->oxcf.gf_cfg.lag_in_frames;
  }

  memset(brt_info, 0, sizeof(BufferRemovalTimingInfo));

  if (seq_params->profile != oxcf->profile) seq_params->profile = oxcf->profile;
  seq_params->bit_depth = oxcf->tool_cfg.bit_depth;
#if !CONFIG_CWG_F270_CI_OBU
  seq_params->color_primaries = color_cfg->color_primaries;
  seq_params->transfer_characteristics = color_cfg->transfer_characteristics;
  seq_params->matrix_coefficients = color_cfg->matrix_coefficients;
  seq_params->monochrome = oxcf->tool_cfg.enable_monochrome;
  seq_params->chroma_sample_position = color_cfg->chroma_sample_position;

  seq_params->color_range = color_cfg->color_range;

#else
  uint32_t chroma_format_idc = 0;
  avm_codec_err_t err =
      av2_get_chroma_format_idc(seq_params, &chroma_format_idc);
  if (err != AVM_CODEC_OK) {
    avm_internal_error(&cm->error, err,
                       "Unsupported subsampling_x = %d, subsampling_y = %d.",
                       seq_params->subsampling_x, seq_params->subsampling_y);
  }
  set_content_interpreation_params(cpi, oxcf, chroma_format_idc);
#endif  // CONFIG_CWG_F270_CI_OBU

  assert(IMPLIES(seq_params->profile <= PROFILE_1,
                 seq_params->bit_depth <= AVM_BITS_10));

#if !CONFIG_CWG_F270_CI_OBU
  seq_params->timing_info_present = dec_model_cfg->timing_info_present;
  seq_params->timing_info.num_units_in_display_tick =
      dec_model_cfg->timing_info.num_units_in_display_tick;
  seq_params->timing_info.time_scale = dec_model_cfg->timing_info.time_scale;
  seq_params->timing_info.equal_picture_interval =
      dec_model_cfg->timing_info.equal_picture_interval;
  seq_params->timing_info.num_ticks_per_picture =
      dec_model_cfg->timing_info.num_ticks_per_picture;
#endif  // !CONFIG_CWG_F270_CI_OBU

  seq_params->display_model_info_present_flag =
      dec_model_cfg->display_model_info_present_flag;
  seq_params->decoder_model_info_present_flag =
      dec_model_cfg->decoder_model_info_present_flag;
  if (dec_model_cfg->decoder_model_info_present_flag) {
    // set the decoder model parameters in schedule mode
    seq_params->decoder_model_info.num_units_in_decoding_tick =
        dec_model_cfg->num_units_in_decoding_tick;
    av2_set_avm_dec_model_info(&seq_params->decoder_model_info);
    av2_set_dec_model_op_parameters(&seq_params->op_params[0]);
#if CONFIG_CWG_F270_CI_OBU
  } else if (dec_model_cfg->timing_info_present &&
             dec_model_cfg->timing_info.equal_elemental_interval &&
             !dec_model_cfg->decoder_model_info_present_flag) {
#else
  } else if (seq_params->timing_info_present &&
             seq_params->timing_info.equal_picture_interval &&
             !seq_params->decoder_model_info_present_flag) {
#endif  // CONFIG_CWG_F270_CI_OBU
    // set the decoder model parameters in resource availability mode
    av2_set_resource_availability_parameters(&seq_params->op_params[0]);
  } else {
    seq_params->op_params[0].initial_display_delay =
        10;  // Default value (not signaled)
  }

  av2_update_film_grain_parameters(cpi, oxcf);

  cpi->oxcf = *oxcf;

  x->e_mbd.bd = (int)seq_params->bit_depth;
  x->e_mbd.global_motion = cm->global_motion;

  memcpy(level_params->target_seq_level_idx, cpi->oxcf.target_seq_level_idx,
         sizeof(level_params->target_seq_level_idx));
  level_params->keep_level_stats = 0;
  for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i) {
    if (level_params->target_seq_level_idx[i] <= SEQ_LEVELS) {
      level_params->keep_level_stats |= 1u << i;
      if (!level_params->level_info[i]) {
        CHECK_MEM_ERROR(cm, level_params->level_info[i],
                        avm_calloc(1, sizeof(*level_params->level_info[i])));
      }
    }
  }

  // TODO(huisu@): level targeting currently only works for the 0th operating
  // point, so scalable coding is not supported yet.
  if (level_params->target_seq_level_idx[0] < SEQ_LEVELS) {
    // Adjust encoder config in order to meet target level.
    config_target_level(cpi, level_params->target_seq_level_idx[0],
#if CONFIG_CWG_F270_OPS
                        cpi->tier[0]
#else
                        seq_params->tier[0]
#endif  // CONFIG_CWG_F270_OPS
    );
  }

  // Need to call av2_rc_init() whenever any QP, lossless or related config
  // is changed after compressor creation.
  av2_rc_init(&cpi->oxcf, 0, rc);
  rc->baseline_gf_interval = (MIN_GF_INTERVAL + MAX_GF_INTERVAL) / 2;

  cm->features.cross_frame_context =
      (oxcf->tool_cfg.frame_parallel_decoding_mode)
          ? CROSS_FRAME_CONTEXT_DISABLED
          : CROSS_FRAME_CONTEXT_FORWARD;

  if (x->palette_buffer == NULL) {
    CHECK_MEM_ERROR(cm, x->palette_buffer,
                    avm_memalign(16, sizeof(*x->palette_buffer)));
  }

  if (x->comp_rd_buffer.pred0 == NULL) {
    alloc_compound_type_rd_buffers(cm, &x->comp_rd_buffer);
  }

  if (x->tmp_conv_dst == NULL) {
    CHECK_MEM_ERROR(
        cm, x->tmp_conv_dst,
        avm_memalign(32, MAX_SB_SIZE * MAX_SB_SIZE * sizeof(*x->tmp_conv_dst)));
    x->e_mbd.tmp_conv_dst = x->tmp_conv_dst;
  }

  if (x->upsample_pred == NULL) {
    CHECK_MEM_ERROR(cm, x->upsample_pred,
                    avm_memalign(16, ((MAX_SB_SIZE + 16) + 16) * MAX_SB_SIZE *
                                         sizeof(*x->upsample_pred)));
    x->e_mbd.tmp_upsample_pred = x->upsample_pred;
  }

  if (x->coef_info == NULL) {
    CHECK_MEM_ERROR(cm, x->coef_info,
                    avm_malloc(MAX_TX_SQUARE * sizeof(*x->coef_info)));
  }

  // Temporary buffers used during the DMVR and OPFL processing.
  if (x->opfl_vxy_bufs == NULL) {
    CHECK_MEM_ERROR(
        cm, x->opfl_vxy_bufs,
        avm_memalign(32, N_OF_OFFSETS * 4 * sizeof(*x->opfl_vxy_bufs)));
    x->e_mbd.opfl_vxy_bufs = x->opfl_vxy_bufs;
  }
  if (x->opfl_gxy_bufs == NULL) {
    CHECK_MEM_ERROR(
        cm, x->opfl_gxy_bufs,
        avm_memalign(32, MAX_SB_SQUARE * 4 * sizeof(*x->opfl_gxy_bufs)));
    x->e_mbd.opfl_gxy_bufs = x->opfl_gxy_bufs;
  }
  if (x->opfl_dst_bufs == NULL) {
    CHECK_MEM_ERROR(
        cm, x->opfl_dst_bufs,
        avm_memalign(32, MAX_SB_SQUARE * 2 * sizeof(*x->opfl_dst_bufs)));
    x->e_mbd.opfl_dst_bufs = x->opfl_dst_bufs;
  }

  for (int i = 0; i < 2; ++i) {
    if (x->tmp_pred_bufs[i] == NULL) {
      CHECK_MEM_ERROR(cm, x->tmp_pred_bufs[i],
                      avm_memalign(32, 2 * MAX_MB_PLANE * MAX_SB_SQUARE *
                                           sizeof(*x->tmp_pred_bufs[i])));
    }
  }

  av2_reset_segment_features(cm);

  av2_set_high_precision_mv(cpi, MV_PRECISION_ONE_EIGHTH_PEL);

  set_rc_buffer_sizes(rc, rc_cfg);

  // Under a configuration change, where maximum_buffer_size may change,
  // keep buffer level clipped to the maximum allowed buffer size.
  rc->bits_off_target = AVMMIN(rc->bits_off_target, rc->maximum_buffer_size);
  rc->buffer_level = AVMMIN(rc->buffer_level, rc->maximum_buffer_size);

  // Set up frame rate and related parameters rate control values.
  av2_new_framerate(cpi, cpi->framerate);

  // Set absolute upper and lower quality limits
  rc->worst_quality = rc_cfg->worst_allowed_q;
  rc->best_quality = rc_cfg->best_allowed_q;

  cm->features.interp_filter = SWITCHABLE;

  cm->features.opfl_refine_type = REFINE_SWITCHABLE;

  if (frm_dim_cfg->render_width > 0 && frm_dim_cfg->render_height > 0) {
    cm->render_width = frm_dim_cfg->render_width;
    cm->render_height = frm_dim_cfg->render_height;
  } else {
    cm->render_width = frm_dim_cfg->width;
    cm->render_height = frm_dim_cfg->height;
  }
  cm->width = frm_dim_cfg->width;
  cm->height = frm_dim_cfg->height;

  if (cm->lcr->lcr_rep_info_present_flag[0][0] == 1) {
    // NOTE: if LCR exist
    cm->lcr_params.rep_params.lcr_max_pic_width = cm->width;
    cm->lcr_params.rep_params.lcr_max_pic_height = cm->height;
  }

  BLOCK_SIZE sb_size = cm->sb_size;
  BLOCK_SIZE new_sb_size = av2_select_sb_size(cpi);
  // Superblock size should not be updated after the first key frame.
  if (!cpi->seq_params_locked) {
    set_sb_size(cm, new_sb_size);
    for (int i = 0; i < MAX_NUM_OPERATING_POINTS; ++i)
#if CONFIG_CWG_F270_OPS
      cpi->tier[i] = (oxcf->tier_mask >> i) & 1;
#else
      seq_params->tier[i] = (oxcf->tier_mask >> i) & 1;
#endif  // CONFIG_CWG_F270_OPS
  } else {
    av2_set_frame_sb_size(cm, new_sb_size);
  }
  cpi->td.sb_size = cm->sb_size;

  if (initial_dimensions->width || sb_size != cm->sb_size) {
    if (cm->width > initial_dimensions->width ||
        cm->height > initial_dimensions->height || cm->sb_size != sb_size) {
      av2_free_context_buffers(cm);
      av2_free_shared_coeff_buffer(&cpi->td.shared_coeff_buf);
      av2_free_sms_tree(&cpi->td);
      av2_free_sms_bufs(&cpi->td);
#if CONFIG_ML_PART_SPLIT
      av2_part_prune_tflite_close(&(cpi->td.partition_model));
#endif  // CONFIG_ML_PART_SPLIT
#if CONFIG_DIP_EXT_PRUNING
      intra_dip_mode_prune_close(&(cpi->td.dip_pruning_model));
#endif  // CONFIG_DIP_EXT_PRUNING
      av2_free_pmc(cpi->td.firstpass_ctx, av2_num_planes(cm));
      cpi->td.firstpass_ctx = NULL;
      alloc_compressor_data(cpi);
      realloc_segmentation_maps(cpi);
      initial_dimensions->width = initial_dimensions->height = 0;
    }
  }
  update_frame_size(cpi);

  rc->is_src_frame_alt_ref = 0;

  av2_set_tile_info(cm, &cpi->oxcf.tile_cfg);

  cpi->ext_flags.refresh_frame.update_pending = 0;
  cpi->ext_flags.refresh_frame.all_ref_frames = 1;

  highbd_set_var_fns(cpi);

  // Init sequence level coding tools
  // This should not be called after the first key frame.
  if (!cpi->seq_params_locked) {
#if !CONFIG_CWG_F270_OPS
    seq_params->operating_points_cnt_minus_1 =
        oxcf->tool_cfg.operating_points_count - 1;
#endif  // !CONFIG_CWG_F270_OPS
    av2_init_seq_coding_tools(
#if CONFIG_CWG_F270_OPS
        cpi,
#endif  // CONFIG_CWG_F270_OPS
        &cm->seq_params, cm, oxcf);
    if (seq_params->enable_restoration) set_seq_lr_tools_mask(seq_params, oxcf);
  }

  // restore the value of lag_in_frame for LAP stage.
  if (lap_lag_in_frames != -1) {
    cpi->oxcf.gf_cfg.lag_in_frames = lap_lag_in_frames;
  }

  cpi->write_brt_obu = 0;

  bool subgop_config_changed = false;
  if (avm_strcmp(cpi->subgop_config_path, oxcf->subgop_config_path)) {
    avm_free(cpi->subgop_config_path);
    cpi->subgop_config_path = NULL;
    if (oxcf->subgop_config_path != NULL) {
      cpi->subgop_config_path =
          (char *)avm_malloc((strlen(oxcf->subgop_config_path) + 1) *
                             sizeof(*oxcf->subgop_config_path));
      strcpy(cpi->subgop_config_path, oxcf->subgop_config_path);
    }
    subgop_config_changed = true;
  }
  if (avm_strcmp(cpi->subgop_config_str, oxcf->subgop_config_str)) {
    avm_free(cpi->subgop_config_str);
    cpi->subgop_config_str = NULL;
    if (oxcf->subgop_config_str != NULL) {
      cpi->subgop_config_str =
          (char *)avm_malloc((strlen(oxcf->subgop_config_str) + 1) *
                             sizeof(*oxcf->subgop_config_str));
      strcpy(cpi->subgop_config_str, oxcf->subgop_config_str);
    }
    subgop_config_changed = true;
  }
  if (subgop_config_changed && cpi->compressor_stage == ENCODE_STAGE) {
    av2_init_subgop_config_set(&cpi->subgop_config_set);
    // Parse config file first
    av2_process_subgop_config_set_fromfile(cpi->subgop_config_path,
                                           &cpi->subgop_config_set);
    // Parse config string next, which may override config file configs
    // or append to it.
    av2_process_subgop_config_set(cpi->subgop_config_str,
                                  &cpi->subgop_config_set);
    if (cpi->print_per_frame_stats) {
      printf("Successfully processed %d subgop configs.\n",
             cpi->subgop_config_set.num_configs);
      // Print out the configuration. Note the printed configuration
      // is in fact in the config file format that can be parsed back.
      av2_print_subgop_config_set(&cpi->subgop_config_set);
    }
  }

  cpi->alloc_pyramid = oxcf->tool_cfg.enable_global_motion;
}

static INLINE void init_frame_info(FRAME_INFO *frame_info,
                                   const AV2_COMMON *const cm) {
  const CommonModeInfoParams *const mi_params = &cm->mi_params;
  const SequenceHeader *const seq_params = &cm->seq_params;
  frame_info->frame_width = cm->width;
  frame_info->frame_height = cm->height;
  frame_info->mi_cols = mi_params->mi_cols;
  frame_info->mi_rows = mi_params->mi_rows;
  frame_info->mb_cols = mi_params->mb_cols;
  frame_info->mb_rows = mi_params->mb_rows;
  frame_info->num_mbs = mi_params->MBs;
  frame_info->bit_depth = seq_params->bit_depth;
  frame_info->subsampling_x = seq_params->subsampling_x;
  frame_info->subsampling_y = seq_params->subsampling_y;
}

static INLINE void init_tip_ref_frame(AV2_COMMON *const cm) {
  cm->tip_ref.tip_frame = avm_calloc(1, sizeof(*cm->tip_ref.tip_frame));
  cm->tip_ref.tmp_tip_frame = avm_calloc(1, sizeof(*cm->tip_ref.tmp_tip_frame));
}

static INLINE void free_tip_ref_frame(AV2_COMMON *const cm) {
  avm_free_frame_buffer(&cm->tip_ref.tip_frame->buf);
  avm_free(cm->tip_ref.tip_frame);
  avm_free_frame_buffer(&cm->tip_ref.tmp_tip_frame->buf);
  avm_free(cm->tip_ref.tmp_tip_frame);
}

static INLINE void init_optflow_bufs(AV2_COMMON *const cm) {
  cm->dst0_16_tip = avm_memalign(32, 8 * 8 * sizeof(uint16_t));
  cm->dst1_16_tip = avm_memalign(32, 8 * 8 * sizeof(uint16_t));
  cm->gx0 = avm_memalign(32, 2 * 8 * 8 * sizeof(*cm->gx0));
  cm->gx1 = avm_memalign(32, 2 * 8 * 8 * sizeof(*cm->gx1));
  cm->gy0 = cm->gx0 + (8 * 8);
  cm->gy1 = cm->gx1 + (8 * 8);
}
static INLINE void free_optflow_bufs(AV2_COMMON *const cm) {
  avm_free(cm->dst0_16_tip);
  avm_free(cm->dst1_16_tip);
  avm_free(cm->gx0);
  avm_free(cm->gx1);
}

AV2_COMP *av2_create_compressor(AV2EncoderConfig *oxcf, BufferPool *const pool,
                                FIRSTPASS_STATS *frame_stats_buf,
                                COMPRESSOR_STAGE stage, int num_lap_buffers,
                                int lap_lag_in_frames,
                                STATS_BUFFER_CTX *stats_buf_context) {
  AV2_COMP *volatile const cpi = avm_memalign(32, sizeof(AV2_COMP));
  AV2_COMMON *volatile const cm = cpi != NULL ? &cpi->common : NULL;

  if (!cm) return NULL;

  av2_zero(*cpi);

  // The jmp_buf is valid only for the duration of the function that calls
  // setjmp(). Therefore, this function must reset the 'setjmp' field to 0
  // before it returns.
  if (setjmp(cm->error.jmp)) {
    cm->error.setjmp = 0;
    av2_remove_compressor(cpi);
    return 0;
  }

#if DEBUG_EXTQUANT
  cm->fEncCoeffLog = fopen("EncCoeffLog.txt", "wt");
#endif

  cm->error.setjmp = 1;
  cpi->lap_enabled = num_lap_buffers > 0;
  cpi->compressor_stage = stage;

  CommonModeInfoParams *const mi_params = &cm->mi_params;
  mi_params->free_mi = enc_free_mi;
  mi_params->setup_mi = enc_setup_mi;
  mi_params->set_mb_mi = (cpi->compressor_stage == LAP_STAGE)
                             ? stat_stage_set_mb_mi
                             : enc_set_mb_mi;

  mi_params->mi_alloc_bsize = BLOCK_4X4;
  cm->frame_filter_dictionary_stride = 0;
  cm->frame_filter_dictionary = NULL;
  cm->translated_pcwiener_filters = NULL;
  cm->num_ref_filters = NULL;

  CHECK_MEM_ERROR(cm, cm->fc,
                  (FRAME_CONTEXT *)avm_memalign(32, sizeof(*cm->fc)));
  CHECK_MEM_ERROR(
      cm, cm->default_frame_context,
      (FRAME_CONTEXT *)avm_memalign(32, sizeof(*cm->default_frame_context)));
  memset(cm->fc, 0, sizeof(*cm->fc));
  memset(cm->default_frame_context, 0, sizeof(*cm->default_frame_context));

  cpi->common.buffer_pool = pool;

  init_config(cpi, oxcf);
  if (cpi->compressor_stage == LAP_STAGE) {
    cpi->oxcf.gf_cfg.lag_in_frames = lap_lag_in_frames;
  }

  cpi->frames_left = cpi->oxcf.input_cfg.limit;

  av2_rc_init(&cpi->oxcf, 0, &cpi->rc);

  // For two pass and lag_in_frames > 33 in LAP.
  cpi->rc.enable_scenecut_detection = ENABLE_SCENECUT_MODE_2;
  if (cpi->lap_enabled) {
    if ((num_lap_buffers <
         (MAX_GF_LENGTH_LAP + SCENE_CUT_KEY_TEST_INTERVAL + 1)) &&
        num_lap_buffers >= (MAX_GF_LENGTH_LAP + 3)) {
      /*
       * For lag in frames >= 19 and <33, enable scenecut
       * with limited future frame prediction.
       */
      cpi->rc.enable_scenecut_detection = ENABLE_SCENECUT_MODE_1;
    } else if (num_lap_buffers < (MAX_GF_LENGTH_LAP + 3)) {
      // Disable scenecut when lag_in_frames < 19.
      cpi->rc.enable_scenecut_detection = DISABLE_SCENECUT;
    }
  }
  init_frame_info(&cpi->frame_info, cm);

  cm->current_frame.frame_number = 0;
  cm->current_frame.key_frame_number = 0;
  cpi->seq_params_locked = 0;
  cpi->partition_search_skippable_frame = 0;
  cpi->tile_data = NULL;
  cpi->last_show_frame_buf = NULL;
  realloc_segmentation_maps(cpi);

  cpi->b_calculate_psnr = CONFIG_INTERNAL_STATS;
#if CONFIG_INTERNAL_STATS
  cpi->b_calculate_blockiness = 1;
  cpi->b_calculate_consistency = 1;
  cpi->total_inconsistency = 0;
  cpi->psnr[0].worst = 100.0;
  cpi->psnr[1].worst = 100.0;
  cpi->worst_ssim = 100.0;

  cpi->count[0] = 0;
  cpi->count[1] = 0;
  cpi->bytes = 0;
#if CONFIG_SPEED_STATS
  cpi->tx_search_count = 0;
#endif  // CONFIG_SPEED_STATS

  if (cpi->b_calculate_psnr) {
    cpi->total_sq_error[0] = 0;
    cpi->total_samples[0] = 0;
    cpi->total_sq_error[1] = 0;
    cpi->total_samples[1] = 0;
    cpi->tot_recode_hits = 0;
    cpi->summed_quality = 0;
    cpi->summed_weights = 0;
  }

  cpi->fastssim.worst = 100.0;
  cpi->psnrhvs.worst = 100.0;

  if (cpi->b_calculate_blockiness) {
    cpi->total_blockiness = 0;
    cpi->worst_blockiness = 0.0;
  }

  if (cpi->b_calculate_consistency) {
    CHECK_MEM_ERROR(
        cm, cpi->ssim_vars,
        avm_malloc(sizeof(*cpi->ssim_vars) * 4 * cpi->common.mi_params.mi_rows *
                   cpi->common.mi_params.mi_cols));
    cpi->worst_consistency = 100.0;
  }
#endif
#if CONFIG_ENTROPY_STATS
  av2_zero(aggregate_fc);
#endif  // CONFIG_ENTROPY_STATS

  cpi->time_stamps.first_ever = INT64_MAX;

#ifdef OUTPUT_YUV_REC
  yuv_rec_file = fopen("rec.yuv", "wb");
#endif

  assert(MAX_LAP_BUFFERS >= MAX_LAG_BUFFERS);
  int size = get_stats_buf_size(num_lap_buffers, MAX_LAG_BUFFERS);
  for (int i = 0; i < size; i++)
    cpi->twopass.frame_stats_arr[i] = &frame_stats_buf[i];

  cpi->twopass.stats_buf_ctx = stats_buf_context;
  cpi->twopass.stats_in = cpi->twopass.stats_buf_ctx->stats_in_start;

  if (is_stat_consumption_stage(cpi)) {
    av2_init_single_pass_lap(cpi);
  }

  int sb_mi_size = av2_get_sb_mi_size(cm);

  for (int x = 0; x < 2; x++)
    for (int y = 0; y < 2; y++)
      CHECK_MEM_ERROR(
          cm, cpi->td.mb.intrabc_hash_info.hash_value_buffer[x][y],
          (uint32_t *)avm_malloc(
              AVM_BUFFER_SIZE_FOR_BLOCK_HASH *
              sizeof(*cpi->td.mb.intrabc_hash_info.hash_value_buffer[0][0])));

  cpi->td.mb.intrabc_hash_info.g_crc_initialized = 0;

  CHECK_MEM_ERROR(cm, cpi->td.mb.mbmi_ext,
                  avm_calloc(sb_mi_size, sizeof(*cpi->td.mb.mbmi_ext)));

  av2_set_speed_features_framesize_independent(cpi, oxcf->speed);
  av2_set_speed_features_framesize_dependent(cpi, oxcf->speed);

  CHECK_MEM_ERROR(cm, cpi->consec_zero_mv,
                  avm_calloc((mi_params->mi_rows * mi_params->mi_cols) >> 2,
                             sizeof(*cpi->consec_zero_mv)));
  cpi->palette_pixel_num = 0;
  {
    const BLOCK_SIZE bsize = BLOCK_16X16;
    const int w = mi_size_wide[bsize];
    const int h = mi_size_high[bsize];
    const int num_cols = (mi_params->mi_cols + w - 1) / w;
    const int num_rows = (mi_params->mi_rows + h - 1) / h;
    CHECK_MEM_ERROR(cm, cpi->tpl_rdmult_scaling_factors,
                    avm_calloc(num_rows * num_cols,
                               sizeof(*cpi->tpl_rdmult_scaling_factors)));
    CHECK_MEM_ERROR(cm, cpi->tpl_sb_rdmult_scaling_factors,
                    avm_calloc(num_rows * num_cols,
                               sizeof(*cpi->tpl_sb_rdmult_scaling_factors)));
  }

  {
    const BLOCK_SIZE bsize = BLOCK_16X16;
    const int w = mi_size_wide[bsize];
    const int h = mi_size_high[bsize];
    const int num_cols = (mi_params->mi_cols + w - 1) / w;
    const int num_rows = (mi_params->mi_rows + h - 1) / h;
    CHECK_MEM_ERROR(cm, cpi->ssim_rdmult_scaling_factors,
                    avm_calloc(num_rows * num_cols,
                               sizeof(*cpi->ssim_rdmult_scaling_factors)));
  }

#if CONFIG_TUNE_VMAF
  {
    const BLOCK_SIZE bsize = BLOCK_64X64;
    const int w = mi_size_wide[bsize];
    const int h = mi_size_high[bsize];
    const int num_cols = (mi_params->mi_cols + w - 1) / w;
    const int num_rows = (mi_params->mi_rows + h - 1) / h;
    CHECK_MEM_ERROR(cm, cpi->vmaf_info.rdmult_scaling_factors,
                    avm_calloc(num_rows * num_cols,
                               sizeof(*cpi->vmaf_info.rdmult_scaling_factors)));
    for (int i = 0; i < MAX_ARF_LAYERS; i++) {
      cpi->vmaf_info.last_frame_unsharp_amount[i] = -1.0;
      cpi->vmaf_info.last_frame_ysse[i] = -1.0;
      cpi->vmaf_info.last_frame_vmaf[i] = -1.0;
      cpi->vmaf_info.best_unsharp_amount[i] = -1.0;
    }
    cpi->vmaf_info.original_qindex = -1;

#if CONFIG_USE_VMAF_RC
    cpi->vmaf_info.vmaf_model = NULL;
#endif
  }
#endif

#if CONFIG_COLLECT_PARTITION_STATS == 2
  av2_zero(cpi->partition_stats);
#endif

  highbd_set_var_fns(cpi);

  /* av2_init_quantizer() is first called here. Add check in
   * av2_frame_init_quantizer() so that av2_init_quantizer is only
   * called later when needed. This will avoid unnecessary calls of
   * av2_init_quantizer() for every frame.
   */
  av2_init_quantizer(&cm->seq_params, &cpi->enc_quant_dequant_params, cm);

  av2_qm_init(&cm->quant_params, av2_num_planes(cm));
  cm->seq_params.df_par_bits_minus2 = DF_PAR_BITS - 2;
  av2_loop_filter_init(cm);

  // The buffers related to TIP are not used during LAP stage. Hence,
  // the allocation is limited to encode stage.
  if (cpi->compressor_stage == ENCODE_STAGE) init_tip_ref_frame(cm);

  init_optflow_bufs(cm);

  cm->error.setjmp = 0;

  return cpi;
}

#if CONFIG_INTERNAL_STATS
#define SNPRINT(H, T) snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T))

#define SNPRINT2(H, T, V) \
  snprintf((H) + strlen(H), sizeof(H) - strlen(H), (T), (V))
#endif  // CONFIG_INTERNAL_STATS

// This function will change the state and free the mutex of corresponding
// workers and terminate the object. The object can not be re-used unless a call
// to reset() is made.
static AVM_INLINE void terminate_worker_data(AV2_COMP *cpi) {
  MultiThreadInfo *const mt_info = &cpi->mt_info;
  for (int t = mt_info->num_workers - 1; t >= 0; --t) {
    AVxWorker *const worker = &mt_info->workers[t];
    avm_get_worker_interface()->end(worker);
  }
}

// Deallocate allocated thread_data.
static AVM_INLINE void free_thread_data(AV2_COMP *cpi) {
  MultiThreadInfo *const mt_info = &cpi->mt_info;
  AV2_COMMON *cm = &cpi->common;
  for (int t = 0; t < mt_info->num_workers; ++t) {
    EncWorkerData *const thread_data = &mt_info->tile_thr_data[t];
    avm_free(thread_data->td->tctx);
    if (t == 0) continue;
    avm_free(thread_data->td->palette_buffer);
    avm_free(thread_data->td->tmp_conv_dst);
    avm_free(thread_data->td->upsample_pred);
    avm_free(thread_data->td->coef_info);

    // Temporary buffers used during the DMVR and OPFL processing.
    avm_free(thread_data->td->opfl_vxy_bufs);
    avm_free(thread_data->td->opfl_gxy_bufs);
    avm_free(thread_data->td->opfl_dst_bufs);
    release_compound_type_rd_buffers(&thread_data->td->comp_rd_buffer);
    for (int j = 0; j < 2; ++j) {
      avm_free(thread_data->td->tmp_pred_bufs[j]);
    }
    avm_free(thread_data->td->mb.inter_modes_info);
    for (int x = 0; x < 2; x++) {
      for (int y = 0; y < 2; y++) {
        avm_free(thread_data->td->hash_value_buffer[x][y]);
        thread_data->td->hash_value_buffer[x][y] = NULL;
      }
    }
    avm_free(thread_data->td->counts);
    avm_free(thread_data->td->mbmi_ext);
    av2_free_pmc(thread_data->td->firstpass_ctx, av2_num_planes(cm));
    thread_data->td->firstpass_ctx = NULL;
    av2_free_shared_coeff_buffer(&thread_data->td->shared_coeff_buf);
    av2_free_sms_tree(thread_data->td);
    av2_free_sms_bufs(thread_data->td);
#if CONFIG_ML_PART_SPLIT
    av2_part_prune_tflite_close(&(thread_data->td->partition_model));
#endif  // CONFIG_ML_PART_SPLIT
#if CONFIG_DIP_EXT_PRUNING
    intra_dip_mode_prune_close(&(thread_data->td->dip_pruning_model));
#endif  // CONFIG_DIP_EXT_PRUNING
    avm_free(thread_data->td);
  }
}

void av2_remove_compressor(AV2_COMP *cpi) {
  if (!cpi) return;

  AV2_COMMON *cm = &cpi->common;
  if (cm->current_frame.frame_number > 0) {
#if CONFIG_ENTROPY_STATS
    if (!is_stat_generation_stage(cpi)) {
      fprintf(stderr, "Writing counts.stt\n");
      FILE *f = fopen("counts.stt", "wb");
      fwrite(&aggregate_fc, sizeof(aggregate_fc), 1, f);
      fclose(f);
    }
#endif  // CONFIG_ENTROPY_STATS
#if CONFIG_INTERNAL_STATS
    avm_clear_system_state();

    if (!is_stat_generation_stage(cpi)) {
      char headings[512] = { 0 };
      char results[512] = { 0 };
      FILE *f = fopen("opsnr.stt", "a");
      double time_encoded =
          (cpi->time_stamps.prev_end_seen - cpi->time_stamps.first_ever) /
          10000000.000;
      double total_encode_time =
          (cpi->time_receive_data + cpi->time_compress_data) / 1000.000;
      const double dr =
          (double)cpi->bytes * (double)8 / (double)1000 / time_encoded;
      const double peak =
          (double)((1 << cpi->oxcf.input_cfg.input_bit_depth) - 1);
      const double target_rate =
          (double)cpi->oxcf.rc_cfg.target_bandwidth / 1000;
      const double rate_err = ((100.0 * (dr - target_rate)) / target_rate);

      if (cpi->b_calculate_psnr) {
        const double total_psnr =
            avm_sse_to_psnr((double)cpi->total_samples[0], peak,
                            (double)cpi->total_sq_error[0]);
        const double total_ssim =
            100 * pow(cpi->summed_quality / cpi->summed_weights, 8.0);
        snprintf(headings, sizeof(headings),
                 "Bitrate\tAVGPsnr\tGLBPsnr\tAVPsnrP\tGLPsnrP\t"
                 "AVMSSIM\tVPSSIMP\tFASTSIM\tPSNRHVS\t"
                 "WstPsnr\tWstSsim\tWstFast\tWstHVS\t"
                 "AVPsrnY\tAPsnrCb\tAPsnrCr");
        snprintf(results, sizeof(results),
                 "%7.2f\t%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
                 "%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
                 "%7.3f\t%7.3f\t%7.3f\t%7.3f\t"
                 "%7.3f\t%7.3f\t%7.3f",
                 dr, cpi->psnr[0].stat[STAT_ALL] / cpi->count[0], total_psnr,
                 cpi->psnr[0].stat[STAT_ALL] / cpi->count[0], total_psnr,
                 total_ssim, total_ssim,
                 cpi->fastssim.stat[STAT_ALL] / cpi->count[0],
                 cpi->psnrhvs.stat[STAT_ALL] / cpi->count[0],
                 cpi->psnr[0].worst, cpi->worst_ssim, cpi->fastssim.worst,
                 cpi->psnrhvs.worst, cpi->psnr[0].stat[STAT_Y] / cpi->count[0],
                 cpi->psnr[0].stat[STAT_U] / cpi->count[0],
                 cpi->psnr[0].stat[STAT_V] / cpi->count[0]);

        if (cpi->b_calculate_blockiness) {
          SNPRINT(headings, "\t  Block\tWstBlck");
          SNPRINT2(results, "\t%7.3f", cpi->total_blockiness / cpi->count[0]);
          SNPRINT2(results, "\t%7.3f", cpi->worst_blockiness);
        }

        if (cpi->b_calculate_consistency) {
          double consistency =
              avm_sse_to_psnr((double)cpi->total_samples[0], peak,
                              (double)cpi->total_inconsistency);

          SNPRINT(headings, "\tConsist\tWstCons");
          SNPRINT2(results, "\t%7.3f", consistency);
          SNPRINT2(results, "\t%7.3f", cpi->worst_consistency);
        }

        SNPRINT(headings, "\t   Time\tRcErr\tAbsErr");
        SNPRINT2(results, "\t%8.0f", total_encode_time);
        SNPRINT2(results, " %7.2f", rate_err);
        SNPRINT2(results, " %7.2f", fabs(rate_err));

        SNPRINT(headings, "\tAPsnr611");
        SNPRINT2(results, " %7.3f",
                 (6 * cpi->psnr[0].stat[STAT_Y] + cpi->psnr[0].stat[STAT_U] +
                  cpi->psnr[0].stat[STAT_V]) /
                     (cpi->count[0] * 8));

        const uint32_t in_bit_depth = cpi->oxcf.input_cfg.input_bit_depth;
        const uint32_t bit_depth = cpi->td.mb.e_mbd.bd;
        if (in_bit_depth < bit_depth) {
          const double peak_hbd = (double)((1 << bit_depth) - 1);
          const double total_psnr_hbd =
              avm_sse_to_psnr((double)cpi->total_samples[1], peak_hbd,
                              (double)cpi->total_sq_error[1]);
          SNPRINT(headings,
                  "\t AVGPsnrH GLBPsnrH AVPsnrPH GLPsnrPH"
                  " AVPsnrYH APsnrCbH APsnrCrH WstPsnrH");
          SNPRINT2(results, "\t%7.3f",
                   cpi->psnr[1].stat[STAT_ALL] / cpi->count[1]);
          SNPRINT2(results, "  %7.3f", total_psnr_hbd);
          SNPRINT2(results, "  %7.3f",
                   cpi->psnr[1].stat[STAT_ALL] / cpi->count[1]);
          SNPRINT2(results, "  %7.3f", total_psnr_hbd);
          SNPRINT2(results, "  %7.3f",
                   cpi->psnr[1].stat[STAT_Y] / cpi->count[1]);
          SNPRINT2(results, "  %7.3f",
                   cpi->psnr[1].stat[STAT_U] / cpi->count[1]);
          SNPRINT2(results, "  %7.3f",
                   cpi->psnr[1].stat[STAT_V] / cpi->count[1]);
          SNPRINT2(results, "  %7.3f", cpi->psnr[1].worst);
        }
        fprintf(f, "%s\n", headings);
        fprintf(f, "%s\n", results);
      }

      fclose(f);
    }
#endif  // CONFIG_INTERNAL_STATS
#if CONFIG_SPEED_STATS
    if (!is_stat_generation_stage(cpi)) {
      fprintf(stdout, "tx_search_count = %d\n", cpi->tx_search_count);
    }
#endif  // CONFIG_SPEED_STATS

#if CONFIG_COLLECT_PARTITION_STATS == 2
    if (!is_stat_generation_stage(cpi)) {
      av2_print_partition_stats(&cpi->partition_stats);
    }
#endif
  }

  TplParams *const tpl_data = &cpi->tpl_data;
  for (int frame = 0; frame < MAX_LAG_BUFFERS; ++frame) {
    avm_free(tpl_data->tpl_stats_pool[frame]);
    avm_free_frame_buffer(&tpl_data->tpl_rec_pool[frame]);
  }

  if (cpi->compressor_stage != LAP_STAGE) {
    terminate_worker_data(cpi);
    free_thread_data(cpi);
  }

  MultiThreadInfo *const mt_info = &cpi->mt_info;
#if CONFIG_MULTITHREAD
  pthread_mutex_t *const enc_row_mt_mutex_ = mt_info->enc_row_mt.mutex_;
  pthread_mutex_t *const gm_mt_mutex_ = mt_info->gm_sync.mutex_;
  if (enc_row_mt_mutex_ != NULL) {
    pthread_mutex_destroy(enc_row_mt_mutex_);
    avm_free(enc_row_mt_mutex_);
  }
  if (gm_mt_mutex_ != NULL) {
    pthread_mutex_destroy(gm_mt_mutex_);
    avm_free(gm_mt_mutex_);
  }
#endif
  av2_row_mt_mem_dealloc(cpi);
  if (cpi->compressor_stage != LAP_STAGE) {
    avm_free(mt_info->tile_thr_data);
    avm_free(mt_info->workers);
  }

  av2_tpl_dealloc(&tpl_data->tpl_mt_sync);
  if (mt_info->num_workers > 1) {
    av2_loop_filter_dealloc(&mt_info->lf_row_sync);
    av2_loop_restoration_dealloc(&mt_info->lr_row_sync, mt_info->num_workers);
    av2_gm_dealloc(&mt_info->gm_sync);
  }

  dealloc_compressor_data(cpi);

#if CONFIG_INTERNAL_STATS
  avm_free(cpi->ssim_vars);
  cpi->ssim_vars = NULL;
#endif  // CONFIG_INTERNAL_STATS

  if (cpi->compressor_stage == ENCODE_STAGE) free_tip_ref_frame(cm);

  free_optflow_bufs(cm);

  free_bru_info(cm);

  av2_remove_common(cm);
  av2_free_ref_frame_buffers(cm->buffer_pool);

#if DEBUG_EXTQUANT
  if (cpi->common.fEncCoeffLog != NULL) {
    fclose(cpi->common.fEncCoeffLog);
  }
#endif
  avm_free(cpi->subgop_config_str);
  avm_free(cpi->subgop_config_path);
  avm_free(cpi);

#ifdef OUTPUT_YUV_REC
  fclose(yuv_rec_file);
#endif
}

static void generate_psnr_packet(AV2_COMP *cpi) {
  struct avm_codec_cx_pkt pkt;
  int i;
  PSNR_STATS psnr;
  const uint32_t in_bit_depth = cpi->oxcf.input_cfg.input_bit_depth;
  const uint32_t bit_depth = cpi->td.mb.e_mbd.bd;
  const YV12_BUFFER_CONFIG *b =
      cpi->common.show_existing_frame
          ? &cpi->common.ref_frame_map[cpi->common.sef_ref_fb_idx]->buf
          : &cpi->common.cur_frame->buf;
  avm_calc_highbd_psnr(cpi->source, b, &psnr, bit_depth, in_bit_depth,
                       is_lossless_requested(&cpi->oxcf.rc_cfg));

  for (i = 0; i < 4; ++i) {
    pkt.data.psnr.samples[i] = psnr.samples[i];
    pkt.data.psnr.sse[i] = psnr.sse[i];
    pkt.data.psnr.psnr[i] = psnr.psnr[i];
  }

  if (in_bit_depth < bit_depth) {
    for (i = 0; i < 4; ++i) {
      pkt.data.psnr.samples_hbd[i] = psnr.samples_hbd[i];
      pkt.data.psnr.sse_hbd[i] = psnr.sse_hbd[i];
      pkt.data.psnr.psnr_hbd[i] = psnr.psnr_hbd[i];
    }
  }

  pkt.kind = AVM_CODEC_PSNR_PKT;
  avm_codec_pkt_list_add(cpi->output_pkt_list, &pkt);
}

int av2_use_as_reference(int *ext_ref_frame_flags, int ref_frame_flags) {
  if (ref_frame_flags > ((1 << INTER_REFS_PER_FRAME) - 1)) return -1;

  *ext_ref_frame_flags = ref_frame_flags;
  return 0;
}

int av2_copy_reference_enc(AV2_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd) {
  AV2_COMMON *const cm = &cpi->common;
  const int num_planes = av2_num_planes(cm);
  YV12_BUFFER_CONFIG *cfg = get_ref_frame(cm, idx);
  if (cfg) {
    avm_yv12_copy_frame(cfg, sd, num_planes);
    return 0;
  } else {
    return -1;
  }
}

int av2_set_reference_enc(AV2_COMP *cpi, int idx, YV12_BUFFER_CONFIG *sd) {
  AV2_COMMON *const cm = &cpi->common;
  const int num_planes = av2_num_planes(cm);
  YV12_BUFFER_CONFIG *cfg = get_ref_frame(cm, idx);
  if (cfg) {
    avm_yv12_copy_frame(sd, cfg, num_planes);
    return 0;
  } else {
    return -1;
  }
}

#ifdef OUTPUT_YUV_REC
void avm_write_one_yuv_frame(AV2_COMMON *cm, YV12_BUFFER_CONFIG *s) {
  uint16_t *src = s->y_buffer;
  int h = cm->height;
  if (yuv_rec_file == NULL) return;

  do {
    fwrite(src, s->y_width, 2, yuv_rec_file);
    src += s->y_stride;
  } while (--h);

  src = s->u_buffer;
  h = s->uv_height;

  do {
    fwrite(src, s->uv_width, 2, yuv_rec_file);
    src += s->uv_stride;
  } while (--h);

  src = s->v_buffer;
  h = s->uv_height;

  do {
    fwrite(src, s->uv_width, 2, yuv_rec_file);
    src += s->uv_stride;
  } while (--h);

  fflush(yuv_rec_file);
  return;
}
#endif  // OUTPUT_YUV_REC

static void set_mv_search_params(AV2_COMP *cpi) {
  const AV2_COMMON *const cm = &cpi->common;
  MotionVectorSearchParams *const mv_search_params = &cpi->mv_search_params;
  const int max_mv_def = AVMMAX(cm->width, cm->height);

  // Default based on max resolution.
  mv_search_params->mv_step_param =
      av2_init_search_range(max_mv_def, cpi->oxcf.tool_cfg.enable_high_motion);

  if (cpi->sf.mv_sf.auto_mv_step_size) {
    if (frame_is_intra_only(cm)) {
      // Initialize max_mv_magnitude for use in the first INTER frame
      // after a key/intra-only frame.
      mv_search_params->max_mv_magnitude = max_mv_def;
    } else {
      // Use cpi->max_mv_magnitude == -1 to exclude first pass case.
      if (cm->show_frame && mv_search_params->max_mv_magnitude != -1) {
        // Allow mv_steps to correspond to twice the max mv magnitude found
        // in the previous frame, capped by the default max_mv_magnitude based
        // on resolution.
        mv_search_params->mv_step_param = av2_init_search_range(
            AVMMIN(max_mv_def, 2 * mv_search_params->max_mv_magnitude),
            cpi->oxcf.tool_cfg.enable_high_motion);
      }
      mv_search_params->max_mv_magnitude = -1;
    }
  }
}

// counts_1: Counts of blocks with no more than color_thresh colors.
// counts_2: Counts of blocks with no more than color_thresh colors and
// variance larger than var_thresh.
static void set_hole_fill_decision(AV2_COMP *cpi, int width, int height,
                                   int blk_w, int blk_h, int counts_1,
                                   int counts_2) {
  (void)width;
  (void)height;
  (void)blk_w;
  (void)blk_h;
  (void)counts_1;
  (void)counts_2;
  AV2_COMMON *const cm = &cpi->common;
  cm->seq_params.enable_tip_hole_fill = 1;
}

static void subtract_average_c(uint16_t *src, int16_t *dst, int width,
                               int height, int round_offset, int num_pel_log2) {
  int sum = round_offset;
  const uint16_t *recon = src;
  for (int j = 0; j < height; ++j) {
    for (int i = 0; i < width; ++i) {
      sum += recon[i];
    }
    recon += CFL_BUF_LINE;
  }
  const int avg = sum / num_pel_log2;
  for (int j = 0; j < height; ++j) {
    for (int i = 0; i < width; ++i) {
      dst[i] = src[i] - avg;
      src[i] = avg;
    }
    src += CFL_BUF_LINE;
    dst += CFL_BUF_LINE;
  }
}

static int64_t compute_sad(const uint16_t *src, uint16_t *src2, int width,
                           int height, int round_offset, int src2_stride) {
  int sad = round_offset;
  for (int j = 0; j < height; ++j) {
    for (int i = 0; i < width; ++i) {
      sad += abs(src[i] - src2[i]);
    }
    src += CFL_BUF_LINE;
    src2 += src2_stride;
  }
  return sad;
}

static void av2_cfl_predict_hbd_pre_analysis(const int16_t *ac_buf_q3,
                                             uint16_t *dst, int dst_stride,
                                             int alpha_q3, int bit_depth,
                                             int width, int height) {
  for (int j = 0; j < height; ++j) {
    for (int i = 0; i < width; ++i) {
      dst[i] = clip_pixel_highbd(
          get_scaled_luma_q0(alpha_q3, ac_buf_q3[i]) + dst[i], bit_depth);
    }
    dst += dst_stride;
    ac_buf_q3 += CFL_BUF_LINE;
  }
}

static void av2_cfl_predict_hbd_dc(const uint16_t *src, uint16_t *dst,
                                   int src_stride, int width, int height) {
  int dc_val = 0;
  const uint16_t *chroma = src;
  for (int i = 0; i < width; ++i) {
    dc_val += src[i];
  }

  chroma += src_stride;
  for (int j = 0; j < height; ++j) {
    dc_val += chroma[-1];
    chroma += src_stride;
  }

  dc_val = dc_val / (width + height);
  for (int j = 0; j < height; ++j) {
    for (int i = 0; i < width; ++i) {
      dst[i] = dc_val;
    }
    dst += CFL_BUF_LINE;
  }
}

static void cfl_luma_subsampling_420_hbd_c(const uint16_t *input,
                                           int input_stride,
                                           uint16_t *output_q3, int width,
                                           int height) {
  for (int j = 0; j < height; j += 2) {
    for (int i = 0; i < width; i += 2) {
      const int bot = i + input_stride;
      output_q3[i >> 1] =
          (input[i] + input[i + 1] + input[bot] + input[bot + 1]) << 1;
    }
    input += input_stride << 1;
    output_q3 += CFL_BUF_LINE;
  }
}

void av2_set_downsample_filter_options(AV2_COMP *cpi) {
  AV2_COMMON *cm = &cpi->common;
  const uint16_t *src = cpi->unfiltered_source->y_buffer;
  uint16_t *src_chroma_u = cpi->unfiltered_source->u_buffer;
  uint16_t *src_chroma_v = cpi->unfiltered_source->v_buffer;
  assert(src != NULL);
  const int stride = cpi->unfiltered_source->y_stride;
  const int width = cpi->unfiltered_source->y_width;
  const int height = cpi->unfiltered_source->y_height;
  const int bd = cm->seq_params.bit_depth;

  const int chroma_stride = cpi->unfiltered_source->uv_stride;
  const int subsampling_x = cpi->unfiltered_source->subsampling_x;
  const int subsampling_y = cpi->unfiltered_source->subsampling_y;

  if (subsampling_x == 0 && subsampling_y == 0) {
    cm->seq_params.cfl_ds_filter_index =
        0;  // For 4:4:4 chroma format, downsampling filter is not used. There
            // is a redundant that the filter index is still signalled for
            // 4:4:4. Should we remove the index signalling for 4:4:4 with this
            // MR?
    return;
  }
  if (cpi->oxcf.tool_cfg.select_cfl_ds_filter < 3) {
    cm->seq_params.cfl_ds_filter_index =
        cpi->oxcf.tool_cfg.select_cfl_ds_filter;
    return;
  }
  const int blk_w = 16;
  const int blk_h = 16;

  uint16_t recon_buf_q3[CFL_BUF_SQUARE];
  uint16_t dc_buf_q3[CFL_BUF_SQUARE];
  // Q3 AC contributions (reconstructed luma pixels - tx block avg)
  int16_t ac_buf_q3[CFL_BUF_SQUARE];
  int64_t cost[3] = { 0, 0, 0 };
  for (int filter_type = 0; filter_type < 3; ++filter_type) {
    for (int comp = 0; comp < 2; comp++) {
      for (int r = 2; r + blk_h <= height - 2; r += blk_h) {
        for (int c = 2; c + blk_w <= width - 2; c += blk_w) {
          const uint16_t *const this_src = src + r * stride + c;
          uint16_t *this_src_chroma = src_chroma_u +
                                      (r >> subsampling_y) * chroma_stride +
                                      (c >> subsampling_x);
          if (comp) {
            this_src_chroma = src_chroma_v +
                              (r >> subsampling_y) * chroma_stride +
                              (c >> subsampling_x);
          }

          int alpha = 0;
          if (subsampling_x == 1 && subsampling_y == 0) {
            cfl_adaptive_luma_subsampling_422_hbd_c(
                this_src, stride, recon_buf_q3, blk_w, blk_h, filter_type);
          } else if (subsampling_x == 0 && subsampling_y == 0) {
            cfl_luma_subsampling_444_hbd_c(this_src, stride, recon_buf_q3,
                                           blk_w, blk_h);
          } else if (filter_type == 1) {
            cfl_luma_subsampling_420_hbd_121_c(this_src, stride, recon_buf_q3,
                                               blk_w, blk_h);
          } else if (filter_type == 2) {
            cfl_luma_subsampling_420_hbd_colocated_c(
                this_src, stride, recon_buf_q3, blk_w, blk_h);
          } else {
            cfl_luma_subsampling_420_hbd_c(this_src, stride, recon_buf_q3,
                                           blk_w, blk_h);
          }
          cfl_derive_block_implicit_scaling_factor(
              recon_buf_q3, this_src_chroma, blk_w >> subsampling_x,
              blk_h >> subsampling_y, CFL_BUF_LINE, chroma_stride, &alpha);
          subtract_average_c(
              recon_buf_q3, ac_buf_q3, blk_w >> subsampling_x,
              blk_h >> subsampling_y, 4,
              (blk_w >> subsampling_x) * (blk_h >> subsampling_y));
          av2_cfl_predict_hbd_dc(this_src_chroma - chroma_stride, dc_buf_q3,
                                 chroma_stride, blk_w >> subsampling_x,
                                 blk_h >> subsampling_y);
          av2_cfl_predict_hbd_pre_analysis(ac_buf_q3, dc_buf_q3, CFL_BUF_LINE,
                                           alpha, bd, blk_w >> subsampling_x,
                                           blk_h >> subsampling_y);
          int64_t filter_cost =
              compute_sad(dc_buf_q3, this_src_chroma, blk_w >> 1, blk_h >> 1, 2,
                          chroma_stride);
          cost[filter_type] = cost[filter_type] + filter_cost;
        }
      }
    }
  }
  int64_t min_cost = INT64_MAX;
  for (int i = 0; i < 3; ++i) {
    if (cost[i] < min_cost) {
      min_cost = cost[i];
      cm->seq_params.cfl_ds_filter_index = i;
    }
  }
}

void av2_set_screen_content_options(AV2_COMP *cpi, FeatureFlags *features) {
  const AV2_COMMON *const cm = &cpi->common;
  // Estimate if the source frame is screen content, based on the portion of
  // blocks that have few luma colors.
  const uint16_t *src = cpi->unfiltered_source->y_buffer;
  assert(src != NULL);
  const int stride = cpi->unfiltered_source->y_stride;
  const int width = cpi->unfiltered_source->y_width;
  const int height = cpi->unfiltered_source->y_height;
  const int bd = cm->seq_params.bit_depth;
  const int blk_w = 16;
  const int blk_h = 16;
  // These threshold values are selected experimentally.
  const int color_thresh = 4;
  const unsigned int var_thresh = 0;
  // Counts of blocks with no more than color_thresh colors.
  int counts_1 = 0;
  // Counts of blocks with no more than color_thresh colors and variance larger
  // than var_thresh.
  int counts_2 = 0;

  for (int r = 0; r + blk_h <= height; r += blk_h) {
    for (int c = 0; c + blk_w <= width; c += blk_w) {
      int count_buf[1 << 8];  // Maximum (1 << 8) bins for hbd path.
      const uint16_t *const this_src = src + r * stride + c;
      int n_colors;
      av2_count_colors_highbd(this_src, stride, blk_w, blk_h, bd, NULL,
                              count_buf, &n_colors, NULL);
      if (n_colors > 1 && n_colors <= color_thresh) {
        ++counts_1;
        struct buf_2d buf;
        buf.stride = stride;
        buf.buf = (uint16_t *)this_src;
        const unsigned int var =
            av2_high_get_sby_perpixel_variance(cpi, &buf, BLOCK_16X16, bd);
        if (var > var_thresh) ++counts_2;
      }
    }
  }

  const int col_factor = 11;
  const int var_factor = 12;

  // The threshold values are selected experimentally.
  features->allow_screen_content_tools =
      counts_1 * blk_h * blk_w * col_factor > width * height;
  // IntraBC would force loop filters off, so we use more strict rules that also
  // requires that the block has high variance.
  features->allow_intrabc =
      features->allow_screen_content_tools &&
      counts_2 * blk_h * blk_w * var_factor > width * height;

  features->is_scc_content_by_detector =
      features->allow_screen_content_tools &&
      counts_2 * blk_h * blk_w * var_factor > width * height;

  if (cpi->oxcf.tune_cfg.content == AVM_CONTENT_SCREEN) {
    features->allow_screen_content_tools = features->allow_intrabc =
        features->is_scc_content_by_detector = 1;
    return;
  }

  if (cm->seq_params.force_screen_content_tools > 0) {
    features->allow_intrabc = 1;
    return;
  }
  if (cm->seq_params.force_screen_content_tools != 2) {
    features->allow_screen_content_tools = features->allow_intrabc =
        cm->seq_params.force_screen_content_tools;
    return;
  }

  if (frame_is_intra_only(cm) && cm->seq_params.enable_tip) {
    set_hole_fill_decision(cpi, width, height, blk_w, blk_h, counts_1,
                           counts_2);
  }
}

// Function pointer to search site config initialization
// of different search method functions.
typedef void (*av2_init_search_site_config)(search_site_config *cfg,
                                            int enable_high_motion, int stride);

av2_init_search_site_config
    av2_init_motion_compensation[NUM_DISTINCT_SEARCH_METHODS] = {
      av2_init_dsmotion_compensation, av2_init_motion_compensation_nstep,
      av2_init_motion_compensation_hex, av2_init_motion_compensation_bigdia,
      av2_init_motion_compensation_square
    };

static void init_motion_estimation(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  MotionVectorSearchParams *const mv_search_params = &cpi->mv_search_params;
  const int y_stride = cpi->scaled_source.y_stride;
  const int y_stride_src = (cpi->oxcf.frm_dim_cfg.width != cm->width ||
                            cpi->oxcf.frm_dim_cfg.height != cm->height)
                               ? y_stride
                               : cpi->lookahead->buf->img.y_stride;
  int fpf_y_stride = cm->cur_frame != NULL ? cm->cur_frame->buf.y_stride
                                           : cpi->scaled_source.y_stride;

  // Update if search_site_cfg is uninitialized or the current frame has a new
  // stride
  const int should_update =
      !mv_search_params->search_site_cfg[SS_CFG_SRC][DIAMOND].stride ||
      !mv_search_params->search_site_cfg[SS_CFG_LOOKAHEAD][DIAMOND].stride ||
      (y_stride !=
       mv_search_params->search_site_cfg[SS_CFG_SRC][DIAMOND].stride);

  if (!should_update) {
    return;
  }

  // Initialization of search_site_cfg for NUM_DISTINCT_SEARCH_METHODS.
  for (SEARCH_METHODS i = DIAMOND; i < NUM_DISTINCT_SEARCH_METHODS; i++) {
    av2_init_motion_compensation[i](
        &mv_search_params->search_site_cfg[SS_CFG_SRC][i],
        cpi->oxcf.tool_cfg.enable_high_motion, y_stride);
    av2_init_motion_compensation[i](
        &mv_search_params->search_site_cfg[SS_CFG_LOOKAHEAD][i],
        cpi->oxcf.tool_cfg.enable_high_motion, y_stride_src);
  }

  // First pass search site config initialization.
  av2_init_motion_fpf(&mv_search_params->search_site_cfg[SS_CFG_FPF][DIAMOND],
                      cpi->oxcf.tool_cfg.enable_high_motion, fpf_y_stride);
  for (SEARCH_METHODS i = NSTEP; i < NUM_DISTINCT_SEARCH_METHODS; i++) {
    memcpy(&mv_search_params->search_site_cfg[SS_CFG_FPF][i],
           &mv_search_params->search_site_cfg[SS_CFG_FPF][DIAMOND],
           sizeof(search_site_config));
  }
}

static void init_ref_frame_bufs(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  int i;
  BufferPool *const pool = cm->buffer_pool;
  cm->cur_frame = NULL;
  for (i = 0; i < cm->seq_params.ref_frames; ++i) {
    cm->ref_frame_map[i] = NULL;
  }
  for (i = 0; i < FRAME_BUFFERS; ++i) {
    pool->frame_bufs[i].ref_count = 0;
  }
}

void av2_check_initial_width(AV2_COMP *cpi, int subsampling_x,
                             int subsampling_y) {
  AV2_COMMON *const cm = &cpi->common;
  SequenceHeader *const seq_params = &cm->seq_params;
  InitialDimensions *const initial_dimensions = &cpi->initial_dimensions;

  if (!initial_dimensions->width ||
      seq_params->subsampling_x != subsampling_x ||
      seq_params->subsampling_y != subsampling_y) {
    seq_params->subsampling_x = subsampling_x;
    seq_params->subsampling_y = subsampling_y;

    av2_set_speed_features_framesize_independent(cpi, cpi->oxcf.speed);
    av2_set_speed_features_framesize_dependent(cpi, cpi->oxcf.speed);

    if (!is_stat_generation_stage(cpi)) {
      alloc_altref_frame_buffer(cpi);
      alloc_util_frame_buffers(cpi);
    }
    init_ref_frame_bufs(cpi);

    init_motion_estimation(cpi);  // TODO(agrange) This can be removed.

    initial_dimensions->width = cm->width;
    initial_dimensions->height = cm->height;
    cpi->initial_mbs = cm->mi_params.MBs;
  }
}

// Returns 1 if the assigned width or height was <= 0.
int av2_set_size_literal(AV2_COMP *cpi, int width, int height) {
  AV2_COMMON *cm = &cpi->common;
  av2_check_initial_width(cpi, cm->seq_params.subsampling_x,
                          cm->seq_params.subsampling_y);

  if (width <= 0 || height <= 0) return 1;

  cm->width = width;
  cm->height = height;

  const BLOCK_SIZE old_sb_size = cm->sb_size;
  const BLOCK_SIZE sb_size = av2_select_sb_size(cpi);
  if (!cpi->seq_params_locked) {
    set_sb_size(cm, sb_size);
  } else {
    av2_set_frame_sb_size(cm, sb_size);
  }
  cpi->td.sb_size = cm->sb_size;

  if (cpi->alloc_width && cpi->alloc_height) {
    if (old_sb_size != cm->sb_size) {
      // Reallocate sb_size-dependent buffers if the sb_size has changed.
      reallocate_sb_size_dependent_buffers(cpi);
    } else if (cm->width > cpi->alloc_width || cm->height > cpi->alloc_height) {
      av2_free_context_buffers(cm);
      av2_free_shared_coeff_buffer(&cpi->td.shared_coeff_buf);
      av2_free_sms_tree(&cpi->td);
      av2_free_sms_bufs(&cpi->td);
#if CONFIG_ML_PART_SPLIT
      av2_part_prune_tflite_close(&(cpi->td.partition_model));
#endif  // CONFIG_ML_PART_SPLIT
#if CONFIG_DIP_EXT_PRUNING
      intra_dip_mode_prune_close(&(cpi->td.dip_pruning_model));
#endif  // CONFIG_DIP_EXT_PRUNING
      av2_free_pmc(cpi->td.firstpass_ctx, av2_num_planes(cm));
      cpi->td.firstpass_ctx = NULL;
      alloc_compressor_data(cpi);
      realloc_segmentation_maps(cpi);
    }
  }
  update_frame_size(cpi);

  return 0;
}

static void setup_tip_frame_size(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  RefCntBuffer *tip_frame = cm->tip_ref.tip_frame;
  // Reset the frame pointers to the current frame size.
  if (avm_realloc_frame_buffer(
          &tip_frame->buf, cm->width, cm->height, cm->seq_params.subsampling_x,
          cm->seq_params.subsampling_y, cpi->oxcf.border_in_pixels,
          cm->features.byte_alignment, NULL, NULL, NULL, false)) {
    avm_internal_error(&cm->error, AVM_CODEC_MEM_ERROR,
                       "Failed to allocate frame buffer");
  }

  tip_frame->frame_type = INTER_FRAME;

  tip_frame = cm->tip_ref.tmp_tip_frame;
  if (avm_realloc_frame_buffer(
          &tip_frame->buf, cm->width, cm->height, cm->seq_params.subsampling_x,
          cm->seq_params.subsampling_y, cpi->oxcf.border_in_pixels,
          cm->features.byte_alignment, NULL, NULL, NULL, false)) {
    avm_internal_error(&cm->error, AVM_CODEC_MEM_ERROR,
                       "Failed to allocate frame buffer");
  }
  tip_frame->frame_type = INTER_FRAME;
}

void av2_set_frame_size(AV2_COMP *cpi, int width, int height) {
  AV2_COMMON *const cm = &cpi->common;
  const SequenceHeader *const seq_params = &cm->seq_params;
  const int num_planes = av2_num_planes(cm);
  MACROBLOCKD *const xd = &cpi->td.mb.e_mbd;
  int ref_frame;

  if (width != cm->width || height != cm->height) {
    // There has been a change in the encoded frame size
    av2_set_size_literal(cpi, width, height);
    // Recalculate 'all_lossless' in case super-resolution was (un)selected.
    cm->features.all_lossless = cm->features.coded_lossless;

    av2_noise_estimate_init(&cpi->noise_estimate, cm->width, cm->height);
  }
  if (cm->bridge_frame_info.is_bridge_frame) {
    cm->bridge_frame_info.bridge_frame_max_height = cm->height;
    cm->bridge_frame_info.bridge_frame_max_width = cm->width;
  }
  set_mv_search_params(cpi);

  if (is_stat_consumption_stage(cpi)) {
    av2_set_target_rate(cpi, cm->width, cm->height);
  }

  alloc_frame_mvs(cm, cm->cur_frame);

  // Allocate above context buffers
  CommonContexts *const above_contexts = &cm->above_contexts;
  if (above_contexts->num_planes < av2_num_planes(cm) ||
      above_contexts->num_mi_cols < cm->mi_params.mi_cols ||
      above_contexts->num_tile_rows < cm->tiles.rows) {
    av2_free_above_context_buffers(above_contexts);
    if (av2_alloc_above_context_buffers(above_contexts, cm->tiles.rows,
                                        cm->mi_params.mi_cols,
                                        av2_num_planes(cm)))
      avm_internal_error(&cm->error, AVM_CODEC_MEM_ERROR,
                         "Failed to allocate context buffers");
  }

  // Reset the frame pointers to the current frame size.
  if (avm_realloc_frame_buffer(
          &cm->cur_frame->buf, cm->width, cm->height, seq_params->subsampling_x,
          seq_params->subsampling_y, cpi->oxcf.border_in_pixels,
          cm->features.byte_alignment, NULL, NULL, NULL, cpi->alloc_pyramid))
    avm_internal_error(&cm->error, AVM_CODEC_MEM_ERROR,
                       "Failed to allocate frame buffer");
  // Don't use cm->seq_params.enable_cdef because cm->seq_params.enable_cdef may
  // be changed to 0 when encoding the frame for single_picture_header_flag.
  const int use_cdef = cpi->oxcf.tool_cfg.enable_cdef;
  if (!is_stat_generation_stage(cpi) && use_cdef) {
    AV2CdefWorkerData *cdef_worker = NULL;
    AV2CdefSync cdef_sync = { 0 };
    av2_alloc_cdef_buffers(cm, &cdef_worker /* dummy */, &cdef_sync /* dummy */,
                           1);
  }

  const int frame_width = cm->width;
  const int frame_height = cm->height;
  set_restoration_unit_size(cm, frame_width, frame_height,
                            seq_params->subsampling_x,
                            seq_params->subsampling_y, cm->rst_info);
  for (int i = 0; i < num_planes; ++i)
    cm->rst_info[i].frame_restoration_type = RESTORE_NONE;

  av2_alloc_restoration_buffers(cm);
  if (!is_stat_generation_stage(cpi)) alloc_util_frame_buffers(cpi);
  init_motion_estimation(cpi);

  for (ref_frame = 0; ref_frame < INTER_REFS_PER_FRAME; ++ref_frame) {
    RefCntBuffer *const buf = get_ref_frame_buf(cm, ref_frame);
    if (buf != NULL) {
      struct scale_factors *sf = get_ref_scale_factors(cm, ref_frame);
      av2_setup_scale_factors_for_frame(sf, buf->buf.y_crop_width,
                                        buf->buf.y_crop_height, cm->width,
                                        cm->height);
      if (av2_is_scaled(sf)) avm_extend_frame_borders(&buf->buf, num_planes, 0);
    }
  }

  if (!is_stat_generation_stage(cpi) && cm->seq_params.enable_tip) {
    setup_tip_frame_size(cpi);
    RefCntBuffer *buf = get_ref_frame_buf(cm, TIP_FRAME);

    if (buf != NULL) {
      struct scale_factors *sf = get_ref_scale_factors(cm, TIP_FRAME);
      av2_setup_scale_factors_for_frame(sf, buf->buf.y_crop_width,
                                        buf->buf.y_crop_height, cm->width,
                                        cm->height);
      if (av2_is_scaled(sf)) avm_extend_frame_borders(&buf->buf, num_planes, 0);
    }
  }

  av2_setup_scale_factors_for_frame(&cm->sf_identity, cm->width, cm->height,
                                    cm->width, cm->height);

  set_ref_ptrs(cm, xd, 0, 0);
  realloc_bru_info(cm);
}

/*!\brief Function to perform rate-distortion optimization for GDF
 */
void gdf_optimizer(AV2_COMP *cpi, AV2_COMMON *cm) {
  uint16_t *org_pnt = cpi->source->y_buffer;
  const int org_stride = cpi->source->y_stride;

  uint16_t *rec_pnt = cm->cur_frame->buf.buffers[AVM_PLANE_Y];
  const int rec_height = cm->cur_frame->buf.y_height;
  const int rec_width = cm->cur_frame->buf.y_width;
  const int rec_stride = cm->cur_frame->buf.y_stride;

  const int bit_depth = cm->seq_params.bit_depth;
  const int pxl_max = (1 << cm->cur_frame->buf.bit_depth) - 1;
  const int pxl_shift = GDF_TEST_INP_PREC -
                        AVMMIN(cm->cur_frame->buf.bit_depth, GDF_TEST_INP_PREC);
  const int err_shift =
      GDF_RDO_SCALE_NUM_LOG2 + GDF_TEST_INP_PREC - cm->cur_frame->buf.bit_depth;
  const int err_shift_half_pow2 = err_shift > 0 ? 1 << (err_shift - 1) : 0;

  int ref_dst_idx = gdf_get_ref_dst_idx(cm);
  int qp_idx_base = gdf_get_qp_idx_base(cm);

  // init to zero
  int *bru_skip_blk =
      (int *)avm_calloc(cm->gdf_info.gdf_block_num, sizeof(int));

  int64_t *rec_pic_error;
  int64_t *flg_pic_error[GDF_RDO_SCALE_NUM][GDF_RDO_QP_NUM];
  rec_pic_error =
      (int64_t *)avm_calloc(cm->gdf_info.gdf_block_num, sizeof(int64_t));
  for (int scale_idx = 0; scale_idx < GDF_RDO_SCALE_NUM; scale_idx++) {
    for (int qp_idx = 0; qp_idx < GDF_RDO_QP_NUM; qp_idx++) {
      flg_pic_error[scale_idx][qp_idx] =
          (int64_t *)avm_calloc(cm->gdf_info.gdf_block_num, sizeof(int64_t));
    }
  }
  const int64_t rdmult =
      av2_compute_rd_mult_based_on_qindex(cpi, cm->quant_params.base_qindex);

  int *block_ids;
  block_ids = (int *)avm_calloc(cm->gdf_info.gdf_block_num, sizeof(int));
  int ctx_idx = 0, sb_size = cm->mib_size << MI_SIZE_LOG2;
  for (int y_pos = 0; y_pos < rec_height; y_pos += sb_size) {
    for (int x_pos = 0; x_pos < rec_width; x_pos += sb_size) {
      for (int v_pos = y_pos; v_pos < y_pos + sb_size && v_pos < rec_height;
           v_pos += 4) {
        for (int u_pos = x_pos; u_pos < x_pos + sb_size && u_pos < rec_width;
             u_pos += 4) {
          int this_blk_idx = gdf_get_block_idx(cm, v_pos, u_pos);
          if (this_blk_idx >= 0) {
            block_ids[ctx_idx++] = this_blk_idx;
          }
        }
      }
    }
  }
  const int num_tile_rows = cm->tiles.rows;
  const int num_tile_cols = cm->tiles.cols;
  int blk_idx = 0;
  int tile_blk_stripe0 = 0;
  for (int tile_row = 0; tile_row < num_tile_rows; ++tile_row) {
    TileInfo tile_info;
    av2_tile_init(&tile_info, cm, tile_row, 0);
    AV2PixelRect tile_rect = av2_get_tile_rect(&tile_info, cm, 0);
    const int tile_height = tile_rect.bottom - tile_rect.top;
    for (int y_pos = -GDF_TEST_STRIPE_OFF, blk_idx_h = 0; y_pos < tile_height;
         y_pos += cm->gdf_info.gdf_block_size, blk_idx_h++) {
      if (blk_idx_h == cm->gdf_info.gdf_vert_blks_per_tile[tile_row]) {
        blk_idx -= cm->gdf_info.gdf_block_num_w;
      }

      int blk_stripe = 0;
      for (int tile_col = 0; tile_col < num_tile_cols; ++tile_col) {
        av2_tile_init(&tile_info, cm, tile_row, tile_col);
        tile_rect = av2_get_tile_rect(&tile_info, cm, 0);
        const int tile_width = tile_rect.right - tile_rect.left;
        for (int x_pos = 0; x_pos < tile_width;
             x_pos += cm->gdf_info.gdf_block_size) {
          // mark skip flag for inactive FU
          if (bru_is_fu_skipped_mbmi(
                  cm, (x_pos + tile_rect.left) >> MI_SIZE_LOG2,
                  (AVMMIN(y_pos + GDF_TEST_STRIPE_OFF,
                          rec_height - GDF_TEST_FRAME_BOUNDARY_SIZE) +
                   tile_rect.left) >>
                      MI_SIZE_LOG2,
                  cm->gdf_info.gdf_block_size >> MI_SIZE_LOG2,
                  cm->gdf_info.gdf_block_size >> MI_SIZE_LOG2)) {
            bru_skip_blk[blk_idx] = 1;
            blk_idx++;
            continue;
          }
          blk_stripe = 0;
          for (int v_pos = y_pos; v_pos < y_pos + cm->gdf_info.gdf_block_size &&
                                  v_pos < tile_height;
               v_pos += cm->gdf_info.gdf_unit_size) {
            int i_min =
                AVMMAX(v_pos, GDF_TEST_FRAME_BOUNDARY_SIZE) + tile_rect.top;
            int i_max = AVMMIN(v_pos + cm->gdf_info.gdf_unit_size,
                               tile_height - GDF_TEST_FRAME_BOUNDARY_SIZE) +
                        tile_rect.top;

            int copy_above = 1, copy_below = 1;
            if (cm->seq_params.disable_loopfilters_across_tiles == 0) {
              // tile top but not picture top
              if (v_pos == -GDF_TEST_STRIPE_OFF && tile_row != 0)
                copy_above = 0;
              // tile bottom but not picture bottom
              if (v_pos + cm->gdf_info.gdf_unit_size >= tile_height &&
                  tile_row != num_tile_rows - 1)
                copy_below = 0;
            }
            gdf_setup_reference_lines(cm, i_min, i_max,
                                      tile_blk_stripe0 + blk_stripe, copy_above,
                                      copy_below);
            for (int u_pos = x_pos;
                 u_pos < x_pos + cm->gdf_info.gdf_block_size &&
                 u_pos < tile_width;
                 u_pos += cm->gdf_info.gdf_unit_size) {
              int j_min =
                  AVMMAX(u_pos, GDF_TEST_FRAME_BOUNDARY_SIZE) + tile_rect.left;
              int j_max = AVMMIN(u_pos + cm->gdf_info.gdf_unit_size,
                                 tile_width - GDF_TEST_FRAME_BOUNDARY_SIZE) +
                          tile_rect.left;
              // skip optimize on not active SB
              // only matter if SB < 128
              if (!bru_is_sb_active(cm, j_min >> MI_SIZE_LOG2,
                                    i_min >> MI_SIZE_LOG2)) {
                continue;
              }
              int tile_boundary_left =
                  cm->seq_params.disable_loopfilters_across_tiles
                      ? (j_min == tile_rect.left)
                      : (j_min == 0);
              int tile_boundary_right =
                  cm->seq_params.disable_loopfilters_across_tiles
                      ? (j_max == tile_rect.right)
                      : (j_max == cm->cur_frame->buf.y_width);

              gdf_setup_processing_stripe_leftright_boundary(
                  &cm->gdf_info, i_min, i_max, j_min, j_max, tile_boundary_left,
                  tile_boundary_right);
              int use_gdf_local =
                  gdf_block_adjust_and_validate(&i_min, &i_max, &j_min, &j_max);
              if (use_gdf_local) {
                gdf_set_lap_and_cls_unit(
                    i_min, i_max, j_min, j_max,
                    cm->gdf_info.inp_ptr +
                        cm->gdf_info.inp_stride * (i_min - 1) + (j_min - 1),
                    cm->gdf_info.inp_stride, bit_depth, cm->gdf_info.lap_ptr,
                    cm->gdf_info.lap_stride, cm->gdf_info.cls_ptr,
                    cm->gdf_info.cls_stride);
              }
              for (int qp_idx = 0; qp_idx < GDF_RDO_QP_NUM; qp_idx++) {
                if (use_gdf_local) {
                  gdf_inference_unit(
                      i_min, i_max, j_min, j_max, qp_idx + qp_idx_base,
                      cm->gdf_info.inp_ptr + cm->gdf_info.inp_stride * i_min +
                          j_min,
                      cm->gdf_info.inp_stride, cm->gdf_info.lap_ptr,
                      cm->gdf_info.lap_stride, cm->gdf_info.cls_ptr,
                      cm->gdf_info.cls_stride, cm->gdf_info.err_ptr,
                      cm->gdf_info.err_stride, pxl_shift, ref_dst_idx);
                }
                for (int i = i_min; i < i_max; i++) {
                  for (int j = j_min; j < j_max; j++) {
                    int rec_loc = i * rec_stride + j;
                    int org_loc = i * org_stride + j;
                    int err_loc =
                        (i - i_min) * cm->gdf_info.err_stride + (j - j_min);

                    if (qp_idx == 0) {
                      int64_t tmp_err = rec_pnt[rec_loc] - org_pnt[org_loc];
                      rec_pic_error[blk_idx] += tmp_err * tmp_err;
                    }

                    for (int scale_idx = 0; scale_idx < GDF_RDO_SCALE_NUM;
                         scale_idx++) {
                      if (!use_gdf_local) {
                        flg_pic_error[scale_idx][qp_idx][blk_idx] +=
                            rec_pic_error[blk_idx];
                        continue;
                      }
                      int32_t tmp_val =
                          (scale_idx + 1) * cm->gdf_info.err_ptr[err_loc];
                      if (tmp_val > 0) {
                        tmp_val = (tmp_val + err_shift_half_pow2) >> err_shift;
                      } else {
                        tmp_val =
                            -(((-tmp_val) + err_shift_half_pow2) >> err_shift);
                      }
                      tmp_val = CLIP(tmp_val + rec_pnt[rec_loc], 0, pxl_max) -
                                org_pnt[org_loc];
                      flg_pic_error[scale_idx][qp_idx][blk_idx] +=
                          (int64_t)tmp_val * tmp_val;
                    }
                  }
                }
              }
              gdf_restore_processing_stripe_leftright_boundary(
                  &cm->gdf_info, i_min, i_max, j_min, j_max, tile_boundary_left,
                  tile_boundary_right);
            }
            gdf_unset_reference_lines(cm, i_min, i_max, copy_above, copy_below);
            blk_stripe++;
          }  // v_pos
          blk_idx++;
        }  // x_pos
      }  // tile_col
      tile_blk_stripe0 += blk_stripe;
    }  // y_pos
  }  // tile_row

  int slice_rate = 1 << AV2_PROB_COST_SHIFT;
  int64_t slice_error = 0;
  for (blk_idx = 0; blk_idx < cm->gdf_info.gdf_block_num; blk_idx++) {
    slice_error += rec_pic_error[blk_idx];
  }
  double best_cost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
      rdmult, (double)slice_rate / 16, slice_error, bit_depth);
  cm->gdf_info.gdf_mode = 0;

  int *block_flags;
  block_flags = (int *)avm_calloc(cm->gdf_info.gdf_block_num, sizeof(int));
  int gdf_enable_max_plus_1 = (cm->gdf_info.gdf_block_num <= 1) ? 2 : 3;
  int gdf_block_enable_bit = 1;
  avm_cdf_prob gdf_cdf[CDF_SIZE(2)];
  // BRU frame does not allow mode 1
  for (int gdf_mode = cm->bru.enabled ? 2 : 1; gdf_mode < gdf_enable_max_plus_1;
       gdf_mode++) {
    for (int scale_idx = 0; scale_idx < GDF_RDO_SCALE_NUM; scale_idx++) {
      for (int qp_idx = 0; qp_idx < GDF_RDO_QP_NUM; qp_idx++) {
        slice_rate = (1 + gdf_block_enable_bit + GDF_RDO_QP_NUM_LOG2 +
                      GDF_RDO_SCALE_NUM_LOG2)
                     << AV2_PROB_COST_SHIFT;
        slice_error = 0;
        av2_copy(gdf_cdf, cm->fc->gdf_cdf);
        for (int ci = 0; ci < cm->gdf_info.gdf_block_num; ci++) {
          blk_idx = block_ids[ci];
          if (gdf_mode == 1) {
            slice_error += flg_pic_error[scale_idx][qp_idx][blk_idx];
          } else {
            double best_block_cost = DBL_MAX;
            int best_block_rate = 0;
            int64_t best_block_error = 0;
            int cost_from_cdf[2];
            av2_cost_tokens_from_cdf(cost_from_cdf, gdf_cdf, 2, NULL);
            // if bru_skip_blk[blk_idx] is set to 1, no need to check filter on
            // case.
            for (int block_flag = 0; block_flag < 2 - bru_skip_blk[blk_idx];
                 block_flag++) {
              int block_rate = cost_from_cdf[block_flag];
              int64_t block_error = 0;
              block_error += (block_flag == 0)
                                 ? rec_pic_error[blk_idx]
                                 : flg_pic_error[scale_idx][qp_idx][blk_idx];
              double block_cost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
                  rdmult, (double)block_rate / 16, block_error, bit_depth);
              if (block_cost < best_block_cost) {
                block_flags[blk_idx] = block_flag;
                best_block_rate = block_rate;
                best_block_error = block_error;
                best_block_cost = block_cost;
              }
            }
            slice_rate += best_block_rate;
            slice_error += best_block_error;
            update_cdf(gdf_cdf, block_flags[blk_idx], 2);
          }
        }
        double slice_cost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
            rdmult, (double)slice_rate / 16, slice_error, bit_depth);

        if (slice_cost < best_cost) {
          cm->gdf_info.gdf_mode = gdf_mode;
          cm->gdf_info.gdf_pic_qp_idx = qp_idx;
          cm->gdf_info.gdf_pic_scale_idx = scale_idx;
          if (gdf_mode == 2) {
            for (blk_idx = 0; blk_idx < cm->gdf_info.gdf_block_num; blk_idx++) {
              cm->gdf_info.gdf_block_flags[blk_idx] = block_flags[blk_idx];
            }
          }
          best_cost = slice_cost;
        }
      }
    }
  }
  avm_free(rec_pic_error);
  for (int scale_idx = 0; scale_idx < GDF_RDO_SCALE_NUM; scale_idx++) {
    for (int qp_idx = 0; qp_idx < GDF_RDO_QP_NUM; qp_idx++) {
      avm_free(flg_pic_error[scale_idx][qp_idx]);
    }
  }
  avm_free(block_flags);
  avm_free(bru_skip_blk);
  avm_free(block_ids);
}

/*!\brief Function to perform rate-distortion optimization for GDF
 *        and then apply the selected GDF parameteres to filter the current
 * frame
 */
void gdf_optimize_frame(AV2_COMP *cpi, AV2_COMMON *cm) {
  init_gdf(cm);
  alloc_gdf_buffers(&cm->gdf_info);
  gdf_optimizer(cpi, cm);
#if GDF_VERBOSE
  gdf_print_info(cm, "ENC", cm->current_frame.absolute_poc);
#endif  //
  if (is_gdf_enabled(cm)) {
    gdf_filter_frame(cm);
  }
}

/*!\brief Select and apply cdef filters and switchable restoration filters
 *
 * \ingroup high_level_algo
 */
static void cdef_restoration_frame(AV2_COMP *cpi, AV2_COMMON *cm,
                                   MACROBLOCKD *xd, int use_restoration,
                                   int use_cdef, int use_gdf) {
  uint16_t *rec_uv[CCSO_NUM_COMPONENTS];
  uint16_t *org_uv[CCSO_NUM_COMPONENTS];
  uint16_t *ext_rec_y = NULL;
  uint16_t *ref_buffer;
  const YV12_BUFFER_CONFIG *ref = cpi->source;
  int ref_stride;
  const int use_ccso =
      !cm->features.coded_lossless && !cm->bru.frame_inactive_flag &&
      !cm->bridge_frame_info.is_bridge_frame && cm->seq_params.enable_ccso;
  const int num_planes = av2_num_planes(cm);
  av2_setup_dst_planes(xd->plane, &cm->cur_frame->buf, 0, 0, 0, num_planes,
                       NULL);
  const int ccso_stride = xd->plane[0].dst.width;
  for (int pli = 0; pli < num_planes; pli++) {
    rec_uv[pli] = avm_malloc(sizeof(*rec_uv[pli]) * xd->plane[0].dst.height *
                             ccso_stride);
    org_uv[pli] = avm_malloc(sizeof(*org_uv[pli]) * xd->plane[0].dst.height *
                             ccso_stride);
  }
  if (use_ccso) {
    const int pic_height = cm->cur_frame->buf.y_height;
    const int pic_width = cm->cur_frame->buf.y_width;
    const int dst_stride = cm->cur_frame->buf.y_stride;
    const uint16_t *rec_y = cm->cur_frame->buf.y_buffer;
    const int ccso_stride_ext = pic_width + (CCSO_PADDING_SIZE << 1);
    ext_rec_y = avm_malloc(sizeof(*ext_rec_y) *
                           (pic_height + (CCSO_PADDING_SIZE << 1)) *
                           (pic_width + (CCSO_PADDING_SIZE << 1)));
    for (int r = 0; r < pic_height; ++r) {
      for (int c = 0; c < pic_width; ++c) {
        ext_rec_y[(r + CCSO_PADDING_SIZE) * ccso_stride_ext + c +
                  CCSO_PADDING_SIZE] = rec_y[r * dst_stride + c];
      }
    }
    extend_ccso_border(&cm->cur_frame->buf, ext_rec_y, CCSO_PADDING_SIZE);
  }

  use_gdf = (use_gdf & is_allow_gdf(cm));
  if (!use_gdf) {
    cm->gdf_info.gdf_mode = 0;
  }

  MultiThreadInfo *const mt_info = &cpi->mt_info;
  const int num_workers = mt_info->num_workers;
  if (use_restoration)
    av2_loop_restoration_save_boundary_lines(&cm->cur_frame->buf, cm, 0);
  else {
    if (use_gdf) save_tile_row_boundary_lines(&cm->cur_frame->buf, 0, cm, 0);
  }
  if (use_cdef) {
#if CONFIG_COLLECT_COMPONENT_TIMING
    start_timing(cpi, cdef_time);
#endif
    // Find CDEF parameters
    av2_cdef_search(&cm->cur_frame->buf, cpi->source, cm, xd,
#if CONFIG_ENTROPY_STATS
                    &cpi->td,
#endif  // CONFIG_ENTROPY_STATS
                    cpi->sf.lpf_sf.cdef_pick_method, cpi->td.mb.rdmult);

    // Apply the filter
    if (cm->cdef_info.cdef_frame_enable)
      av2_cdef_frame(&cm->cur_frame->buf, cm, xd, av2_cdef_init_fb_row);

#if CONFIG_COLLECT_COMPONENT_TIMING
    end_timing(cpi, cdef_time);
#endif
  } else {
    cm->cdef_info.cdef_frame_enable = 0;
    // if not use ccso, need to init
    cm->ccso_info.ccso_frame_flag = false;
    cm->ccso_info.ccso_enable[0] = cm->ccso_info.ccso_enable[1] =
        cm->ccso_info.ccso_enable[2] = 0;
    for (int plane = 0; plane < av2_num_planes(cm); plane++) {
      cm->cur_frame->ccso_info.ccso_enable[plane] = 0;
      cm->ccso_info.sb_reuse_ccso[plane] = false;
      cm->ccso_info.reuse_ccso[plane] = false;
    }
  }
  if (use_ccso) {
    av2_setup_dst_planes(xd->plane, &cm->cur_frame->buf, 0, 0, 0, num_planes,
                         NULL);
    // Reading original and reconstructed chroma samples as input
    for (int pli = 0; pli < num_planes; pli++) {
      const int pic_height = xd->plane[pli].dst.height;
      const int pic_width = xd->plane[pli].dst.width;
      const int dst_stride = xd->plane[pli].dst.stride;
      switch (pli) {
        case 0:
          ref_buffer = ref->y_buffer;
          ref_stride = ref->y_stride;
          break;
        case 1:
          ref_buffer = ref->u_buffer;
          ref_stride = ref->uv_stride;
          break;
        case 2:
          ref_buffer = ref->v_buffer;
          ref_stride = ref->uv_stride;
          break;
        default: ref_stride = 0;
      }
      for (int r = 0; r < pic_height; ++r) {
        for (int c = 0; c < pic_width; ++c) {
          rec_uv[pli][r * ccso_stride + c] =
              xd->plane[pli].dst.buf[r * dst_stride + c];
          org_uv[pli][r * ccso_stride + c] = ref_buffer[r * ref_stride + c];
        }
      }
    }
    ccso_search(cm, xd, cpi->td.mb.rdmult, ext_rec_y, rec_uv, org_uv,
                cpi->error_resilient_frame_seen
#if CONFIG_ENTROPY_STATS
                ,
                &cpi->td
#endif
    );
    ccso_frame(&cm->cur_frame->buf, cm, xd, ext_rec_y);
    avm_free(ext_rec_y);
  }
  for (int pli = 0; pli < num_planes; pli++) {
    avm_free(rec_uv[pli]);
    avm_free(org_uv[pli]);
  }

  if (use_gdf) {
    gdf_copy_guided_frame(cm);
  }

#if CONFIG_COLLECT_COMPONENT_TIMING
  start_timing(cpi, loop_restoration_time);
#endif

  if (use_restoration)
    av2_loop_restoration_save_boundary_lines(&cm->cur_frame->buf, cm, 1);
  else {
    if (use_gdf) save_tile_row_boundary_lines(&cm->cur_frame->buf, 0, cm, 1);
  }
  if (use_restoration) {
    av2_pick_filter_restoration(cpi->source, cpi);
    if (cm->rst_info[0].frame_restoration_type != RESTORE_NONE ||
        cm->rst_info[1].frame_restoration_type != RESTORE_NONE ||
        cm->rst_info[2].frame_restoration_type != RESTORE_NONE) {
      if (num_workers > 1 && !cm->seq_params.disable_loopfilters_across_tiles)
        av2_loop_restoration_filter_frame_mt(
            &cm->cur_frame->buf, cm, 0, mt_info->workers, num_workers,
            &mt_info->lr_row_sync, &cpi->lr_ctxt);
      else
        av2_loop_restoration_filter_frame(&cm->cur_frame->buf, cm, 0,
                                          &cpi->lr_ctxt);
    }
  } else {
    cm->rst_info[0].frame_restoration_type = RESTORE_NONE;
    cm->rst_info[1].frame_restoration_type = RESTORE_NONE;
    cm->rst_info[2].frame_restoration_type = RESTORE_NONE;
  }

  if (use_gdf) {
    gdf_optimize_frame(cpi, cm);
    gdf_free_guided_frame(cm);
  }

#if CONFIG_COLLECT_COMPONENT_TIMING
  end_timing(cpi, loop_restoration_time);
#endif
}

/*!\brief Select and apply in-loop deblocking filters, cdef filters, and
 * restoration filters
 *
 * \ingroup high_level_algo
 */
static void loopfilter_frame(AV2_COMP *cpi, AV2_COMMON *cm) {
  MultiThreadInfo *const mt_info = &cpi->mt_info;
  const int num_workers = mt_info->num_workers;
  const int num_planes = av2_num_planes(cm);
  MACROBLOCKD *xd = &cpi->td.mb.e_mbd;

  assert(IMPLIES(is_lossless_requested(&cpi->oxcf.rc_cfg),
                 cm->features.coded_lossless && cm->features.all_lossless));

  const int use_loopfilter = !cm->features.coded_lossless &&
                             !cm->bru.frame_inactive_flag &&
                             cpi->oxcf.tool_cfg.enable_deblocking;
  const int use_cdef =
      cm->seq_params.enable_cdef && !cm->bru.frame_inactive_flag &&
      !cm->bridge_frame_info.is_bridge_frame && !cm->features.coded_lossless;
  const int use_gdf =
      cm->seq_params.enable_gdf && !cm->bru.frame_inactive_flag &&
      !cm->bridge_frame_info.is_bridge_frame && !cm->features.all_lossless;
  const int use_restoration =
      cm->seq_params.enable_restoration && !cm->bru.frame_inactive_flag &&
      !cm->bridge_frame_info.is_bridge_frame && !cm->features.all_lossless;

  struct loopfilter *lf = &cm->lf;

#if CONFIG_COLLECT_COMPONENT_TIMING
  start_timing(cpi, loop_filter_time);
#endif
  if (use_loopfilter) {
    avm_clear_system_state();
    av2_pick_filter_level(cpi->source, cpi, cpi->sf.lpf_sf.lpf_pick);
  } else {
    lf->apply_deblocking_filter[0] = 0;
    lf->apply_deblocking_filter[1] = 0;
  }
  cpi->cur_mfh_params.mfh_apply_deblocking_filter[0] =
      lf->apply_deblocking_filter[0];
  cpi->cur_mfh_params.mfh_apply_deblocking_filter[1] =
      lf->apply_deblocking_filter[1];
  cpi->cur_mfh_params.mfh_apply_deblocking_filter[2] =
      lf->apply_deblocking_filter_u;
  cpi->cur_mfh_params.mfh_apply_deblocking_filter[3] =
      lf->apply_deblocking_filter_v;
  if (lf->apply_deblocking_filter[0] || lf->apply_deblocking_filter[1]) {
    if (num_workers > 1)
      av2_loop_filter_frame_mt(&cm->cur_frame->buf, cm, xd, 0, num_planes, 0,
                               mt_info->workers, num_workers,
                               &mt_info->lf_row_sync);
    else
      av2_loop_filter_frame(&cm->cur_frame->buf, cm, xd, 0, num_planes, 0);
  }
#if CONFIG_COLLECT_COMPONENT_TIMING
  end_timing(cpi, loop_filter_time);
#endif

  cdef_restoration_frame(cpi, cm, xd, use_restoration, use_cdef, use_gdf);
}

/*!\brief If the error resilience mode is turned on in the encoding, for frames
 * following the error resilient frame, use the last encoded frame as the
 * primary reference frame.
 *
 * \ingroup high_level_algo
 */
static void set_primary_ref_frame_for_error_resilient(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  const int intra_only = cm->current_frame.frame_type == KEY_FRAME ||
                         cm->current_frame.frame_type == INTRA_ONLY_FRAME;
  if (intra_only) {
    cpi->error_resilient_frame_seen = 0;
  } else if (cm->current_frame.frame_type == S_FRAME) {
    cpi->error_resilient_frame_seen = 1;
  }

  // The error resilient frame always use PRIMARY_REF_NONE. This is already
  // handled.
  if (cm->current_frame.frame_type == S_FRAME) return;
  if (cm->features.primary_ref_frame == PRIMARY_REF_NONE) return;

  if (cpi->error_resilient_frame_seen) {
    cm->features.primary_ref_frame = PRIMARY_REF_NONE;

    // Find the last encoded frame, and use it as the primary ref frame.
    const int n_refs = cm->ref_frames_info.num_total_refs;
    const RefFrameMapPair *ref_frame_map_pairs = cm->ref_frame_map_pairs;
    int i;

    for (i = 0; i < n_refs; i++) {
      // Get reference frame buffer
      RefFrameMapPair cur_ref =
          ref_frame_map_pairs[get_ref_frame_map_idx(cm, i)];
#if CONFIG_F322_OBUER_REFRESTRICT
      if (cur_ref.ref_frame_restricted) continue;
#endif  // CONFIG_F322_OBUER_REFRESTRICT
      if (cur_ref.ref_frame_for_inference == -1) continue;
      if (cur_ref.frame_type != INTER_FRAME) continue;

      if (cur_ref.disp_order == cpi->last_encoded_frame_order_hint) {
        cm->features.primary_ref_frame = i;
        break;
      }
    }
    cpi->signal_primary_ref_frame = cm->features.primary_ref_frame !=
                                    cm->features.derived_primary_ref_frame;
    if (cm->features.primary_ref_frame == PRIMARY_REF_NONE)
      av2_setup_past_independence(cm);
  }
}

/*!\brief Set the primary reference frame before encoding a frame.
 *
 * \ingroup high_level_algo
 */
static void set_primary_ref_frame(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  cpi->signal_primary_ref_frame = 0;
  // Got the derived_primary_ref_frame.
  int tmp_ref_frame[2] = { 0 };
  choose_primary_secondary_ref_frame(cm, tmp_ref_frame);
  cm->features.derived_primary_ref_frame = tmp_ref_frame[0];
  cm->features.derived_secondary_ref_frame = tmp_ref_frame[1];
  // The primary_ref_frame can be set to other refs other than the derived
  // one. If that is needed, disable primary_ref_frame search.
  cm->features.primary_ref_frame = cm->features.derived_primary_ref_frame;
  if (cpi->ext_flags.use_primary_ref_none) {
    cm->features.primary_ref_frame = PRIMARY_REF_NONE;
  }

  // Set primary reference frame while the error resilience mode is turned on.
  set_primary_ref_frame_for_error_resilient(cpi);

  if (cm->features.primary_ref_frame == PRIMARY_REF_NONE &&
      cm->features.derived_primary_ref_frame != PRIMARY_REF_NONE) {
    cm->features.derived_primary_ref_frame = PRIMARY_REF_NONE;
    cpi->signal_primary_ref_frame = 1;
  }
}

/*!\brief Encode a frame without the recode loop, usually used in one-pass
 * encoding.
 *
 * \ingroup high_level_algo
 *
 * \param[in]    cpi             Top-level encoder structure
 *
 * \return Returns a value to indicate if the encoding is done successfully.
 * \retval #AVM_CODEC_OK
 * \retval #AVM_CODEC_ERROR
 */
static int encode_without_recode(AV2_COMP *cpi) {
  AV2_COMMON *const cm = &cpi->common;
  const QuantizationCfg *const q_cfg = &cpi->oxcf.q_cfg;
  ResizePendingParams *const resize_pending_params =
      &cpi->resize_pending_params;
  const int resize_pending =
      (resize_pending_params->width && resize_pending_params->height &&
       (cpi->common.width != resize_pending_params->width ||
        cpi->common.height != resize_pending_params->height));

  int top_index = 0, bottom_index = 0, q = 0;
  YV12_BUFFER_CONFIG *unscaled = cpi->unscaled_source;
  InterpFilter filter_scaler = EIGHTTAP_SMOOTH;
  int phase_scaler = 0;

  set_size_independent_vars(cpi);
  av2_setup_frame_size(cpi);
  av2_set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);

  {
    phase_scaler = 8;
    // 2:1 scaling.
    if ((cm->width << 1) == unscaled->y_crop_width &&
        (cm->height << 1) == unscaled->y_crop_height) {
      filter_scaler = BILINEAR;
      // For lower resolutions use eighttap_smooth.
      if (cm->width * cm->height <= 320 * 180) filter_scaler = EIGHTTAP_SMOOTH;
    } else if ((cm->width << 2) == unscaled->y_crop_width &&
               (cm->height << 2) == unscaled->y_crop_height) {
      // 4:1 scaling.
      filter_scaler = EIGHTTAP_SMOOTH;
    } else if ((cm->width << 2) == 3 * unscaled->y_crop_width &&
               (cm->height << 2) == 3 * unscaled->y_crop_height) {
      // 4:3 scaling.
      // TODO(jianj): Neon optimization for 4:3 scaling for EIGHTTAP has issues.
      // See aomedia:2766.
      filter_scaler = BILINEAR;
    }
  }

  if (cm->current_frame.frame_type == KEY_FRAME) copy_frame_prob_info(cpi);

#if CONFIG_COLLECT_COMPONENT_TIMING
  printf("\n Encoding a frame:");
#endif

  avm_clear_system_state();

  cpi->source = av2_scale_if_required(cm, unscaled, &cpi->scaled_source,
                                      filter_scaler, phase_scaler, true);
  if (frame_is_intra_only(cm) || resize_pending != 0) {
    memset(cpi->consec_zero_mv, 0,
           ((cm->mi_params.mi_rows * cm->mi_params.mi_cols) >> 2) *
               sizeof(*cpi->consec_zero_mv));
  }

  if (cpi->unscaled_last_source != NULL) {
    cpi->last_source = av2_scale_if_required(cm, cpi->unscaled_last_source,
                                             &cpi->scaled_last_source,
                                             filter_scaler, phase_scaler, true);
  }

  // The code below turns across scale references off, which seems unnecessary.
  // So only enable this based on a speed-feature, and if superes_in_recode is
  // not allowed. Also consider dropping this segment completely.
  if (cpi->sf.hl_sf.disable_unequal_scale_refs) {
    const MV_REFERENCE_FRAME golden_frame = get_best_past_ref_index(cm);
    const MV_REFERENCE_FRAME altref_frame = get_furthest_future_ref_index(cm);
    if (golden_frame != NONE_FRAME &&
        cm->ref_frame_flags & (1 << golden_frame)) {
      const YV12_BUFFER_CONFIG *const ref =
          get_ref_frame_yv12_buf(cm, golden_frame);
      if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height)
        cm->ref_frame_flags ^= (1 << golden_frame);
    }
    if (altref_frame != NONE_FRAME &&
        cm->ref_frame_flags & (1 << altref_frame)) {
      const YV12_BUFFER_CONFIG *const ref =
          get_ref_frame_yv12_buf(cm, altref_frame);
      if (ref->y_crop_width != cm->width || ref->y_crop_height != cm->height)
        cm->ref_frame_flags ^= (1 << altref_frame);
    }
  }

  // For SVC the inter-layer/spatial prediction is not done for newmv
  // (zero_mode is forced), and since the scaled references are only
  // use for newmv search, we can avoid scaling here.
  if (!frame_is_intra_only(cm))
    av2_scale_references(cpi, filter_scaler, phase_scaler, 1);

  av2_set_quantizer(cpi, q_cfg->qm_minlevel, q_cfg->qm_maxlevel, q,
                    q_cfg->enable_chroma_deltaq);

  set_primary_ref_frame(cpi);

  av2_set_speed_features_qindex_dependent(cpi, cpi->oxcf.speed);

  av2_setup_frame(cpi);

  if (q_cfg->aq_mode == CYCLIC_REFRESH_AQ) {
    suppress_active_map(cpi);
    av2_cyclic_refresh_setup(cpi);
    av2_apply_active_map(cpi);
  }
  if (cm->seg.enabled) {
    if (!cm->seg.update_data && cm->prev_frame) {
      segfeatures_copy(&cm->seg, &cm->prev_frame->seg);
      cm->seg.enabled = cm->prev_frame->seg.enabled;
    } else {
      av2_calculate_segdata(&cm->seg);
    }
  } else {
    memset(&cm->seg, 0, sizeof(cm->seg));
  }
  cm->seg.enable_ext_seg = cm->seq_params.enable_ext_seg;
  segfeatures_copy(&cm->cur_frame->seg, &cm->seg);
  cm->cur_frame->seg.enabled = cm->seg.enabled;

#if CONFIG_COLLECT_COMPONENT_TIMING
  start_timing(cpi, av2_encode_frame_time);
#endif

  // Set the motion vector precision based on mv stats from the last coded
  // frame.
  if (!frame_is_intra_only(cm)) {
    av2_pick_and_set_high_precision_mv(cpi, q);
  } else {
    // TODO(chiyotsai@google.com): The frame level mv precision should be set to
    // MV_SUBPEL_NONE for more accurate intrabc search. But doing this right now
    // will cause an unwanted STATS_CHANGED. Fix this upstream instead.
    // av2_set_high_precision_mv(cpi, MV_PRECISION_ONE_PEL);
  }

  av2_set_lossless(cpi);
  av2_set_frame_tcq_mode(cpi);
  av2_enc_setup_ph_frame(cpi);
  av2_init_quantizer(&cm->seq_params, &cpi->enc_quant_dequant_params, cm);

  // transform / motion compensation build reconstruction frame
  av2_encode_frame(cpi);

  // Update some stats from cyclic refresh.
  if (q_cfg->aq_mode == CYCLIC_REFRESH_AQ && !frame_is_intra_only(cm))
    av2_cyclic_refresh_postencode(cpi);

#if CONFIG_COLLECT_COMPONENT_TIMING
  end_timing(cpi, av2_encode_frame_time);
#endif
#if CONFIG_INTERNAL_STATS
  ++cpi->tot_recode_hits;
#endif

  avm_clear_system_state();

  return AVM_CODEC_OK;
}

/*!\brief Recode loop for encoding one frame. the purpose of encoding one frame
 * for multiple times can be approaching a target bitrate or adjusting the usage
 * of global motions.
 *
 * \ingroup high_level_algo
 *
 * \param[in]    cpi             Top-level encoder structure
 * \param[in]    size            Bitstream size
 * \param[in]    dest            Bitstream output
 *
 * \return Returns a value to indicate if the encoding is done successfully.
 * \retval #AVM_CODEC_OK
 * \retval -1
 * \retval #AVM_CODEC_ERROR
 */
static int encode_with_recode_loop(AV2_COMP *cpi, size_t *size, uint8_t *dest) {
  AV2_COMMON *const cm = &cpi->common;
  RATE_CONTROL *const rc = &cpi->rc;
  GlobalMotionInfo *const gm_info = &cpi->gm_info;
  const AV2EncoderConfig *const oxcf = &cpi->oxcf;
  const QuantizationCfg *const q_cfg = &oxcf->q_cfg;
  const int allow_recode = (cpi->sf.hl_sf.recode_loop != DISALLOW_RECODE);
  // Must allow recode if minimum compression ratio is set.
  assert(IMPLIES(oxcf->rc_cfg.min_cr > 0, allow_recode));

  set_size_independent_vars(cpi);

  av2_setup_frame_size(cpi);

  int top_index = 0, bottom_index = 0;
  int q = 0, q_low = 0, q_high = 0;
  av2_set_size_dependent_vars(cpi, &q, &bottom_index, &top_index);
  q_low = bottom_index;
  q_high = top_index;

  if (cm->current_frame.frame_type == KEY_FRAME) copy_frame_prob_info(cpi);

#if CONFIG_COLLECT_COMPONENT_TIMING
  printf("\n Encoding a frame:");
#endif

  // Determine whether to use screen content tools using two fast encoding.
  av2_determine_sc_tools_with_encoding(cpi, q);

  if (cm->features.allow_intrabc) {
    set_max_bvp_drl_bits(cpi);
  }

  if (cm->features.allow_intrabc) {
    cm->features.allow_global_intrabc =
        (oxcf->kf_cfg.enable_intrabc_ext != 2) && frame_is_intra_only(cm);
    cm->features.allow_local_intrabc = !!oxcf->kf_cfg.enable_intrabc_ext;
  } else {
    cm->features.allow_global_intrabc = 0;
    cm->features.allow_local_intrabc = 0;
  }

#if CONFIG_USE_VMAF_RC
  if (oxcf->tune_cfg.tuning == AVM_TUNE_VMAF_NEG_MAX_GAIN) {
    av2_vmaf_neg_preprocessing(cpi, cpi->unscaled_source);
  }
#endif

  // Loop variables
  int loop = 0;
  int loop_count = 0;
  int overshoot_seen = 0;
  int undershoot_seen = 0;
  int low_cr_seen = 0;
  MvSubpelPrecision last_loop_mv_prec = cm->features.fr_mv_precision;
  do {
    loop = 0;
    avm_clear_system_state();

    // if frame was scaled calculate global_motion_search again if already
    // done
    if (loop_count > 0 && cpi->source && gm_info->search_done) {
      if (cpi->source->y_crop_width != cm->width ||
          cpi->source->y_crop_height != cm->height) {
        gm_info->search_done = 0;
      }
    }
    cpi->source =
        av2_scale_if_required(cm, cpi->unscaled_source, &cpi->scaled_source,
                              EIGHTTAP_REGULAR, 0, false);

    if (cpi->unscaled_last_source != NULL) {
      cpi->last_source = av2_scale_if_required(cm, cpi->unscaled_last_source,
                                               &cpi->scaled_last_source,
                                               EIGHTTAP_REGULAR, 0, false);
    }

    if (!frame_is_intra_only(cm)) {
      if (loop_count > 0) {
        release_scaled_references(cpi);
      }
      av2_scale_references(cpi, EIGHTTAP_REGULAR, 0, 0);
    }
#if CONFIG_TUNE_VMAF
    if (oxcf->tune_cfg.tuning >= AVM_TUNE_VMAF_WITH_PREPROCESSING &&
        oxcf->tune_cfg.tuning <= AVM_TUNE_VMAF_NEG_MAX_GAIN) {
      cpi->vmaf_info.original_qindex = q;
      q = av2_get_vmaf_base_qindex(cpi, q);
    }
#endif

    if (cpi->oxcf.unit_test_cfg.frame_multi_qmatrix_unit_test > 0) {
      /* Prepare testing of qm_index by enabling segmentation */
      av2_enable_segmentation(&cm->seg);
      av2_apply_active_map(cpi);
    }

    av2_set_quantizer(cpi, q_cfg->qm_minlevel, q_cfg->qm_maxlevel, q,
                      q_cfg->enable_chroma_deltaq);

    set_primary_ref_frame(cpi);

    av2_set_speed_features_qindex_dependent(cpi, oxcf->speed);

    if (loop_count == 0) {
      av2_setup_frame(cpi);
    } else if (get_primary_ref_frame_buf(cm, cm->features.primary_ref_frame) ==
               NULL) {
      // Base q-index may have changed, so we need to assign proper default coef
      // probs before every iteration.
      av2_default_coef_probs(cm);
      av2_setup_frame_contexts(cm);
    }

    if (q_cfg->aq_mode == VARIANCE_AQ) {
      av2_vaq_frame_setup(cpi);
    } else if (q_cfg->aq_mode == COMPLEXITY_AQ) {
      av2_setup_in_frame_q_adj(cpi);
    }

    if (cm->seg.enabled) {
      if (!cm->seg.update_data && cm->prev_frame) {
        segfeatures_copy(&cm->seg, &cm->prev_frame->seg);
        cm->seg.enabled = cm->prev_frame->seg.enabled;
      } else {
        av2_calculate_segdata(&cm->seg);
      }
    } else {
      memset(&cm->seg, 0, sizeof(cm->seg));
    }
    cm->seg.enable_ext_seg = cm->seq_params.enable_ext_seg;
    segfeatures_copy(&cm->cur_frame->seg, &cm->seg);
    cm->cur_frame->seg.enabled = cm->seg.enabled;

#if CONFIG_COLLECT_COMPONENT_TIMING
    start_timing(cpi, av2_encode_frame_time);
#endif
    // Set the motion vector precision based on mv stats from the last coded
    // frame.
    if (!frame_is_intra_only(cm)) {
      av2_pick_and_set_high_precision_mv(cpi, q);

      // If the precision has changed during different iteration of the loop,
      // then we need to reset the global motion vectors
      if (loop_count > 0 && cm->features.fr_mv_precision != last_loop_mv_prec) {
        gm_info->search_done = 0;
      }
      last_loop_mv_prec = cm->features.fr_mv_precision;
    } else {
      // TODO(chiyotsai@google.com): The frame level mv precision should be set
      // to MV_SUBPEL_NONE for more accurate intrabc search. But doing this
      // right now will cause an unwanted STATS_CHANGED. Fix this upstream
      // instead.
      // av2_set_high_precision_mv(cpi, MV_PRECISION_ONE_PEL);
    }

    av2_set_lossless(cpi);
    av2_set_frame_tcq_mode(cpi);
    av2_enc_setup_ph_frame(cpi);
    av2_init_quantizer(&cm->seq_params, &cpi->enc_quant_dequant_params, cm);

    // transform / motion compensation build reconstruction frame
    av2_encode_frame(cpi);

    // Reset the mv_stats in case we are interrupted by an intraframe or an
    // overlay frame.
    if (cpi->mv_stats.valid) {
      av2_zero(cpi->mv_stats);
    }

    // Gather the mv_stats for the next frame
    if (cpi->sf.hl_sf.high_precision_mv_usage == LAST_MV_DATA &&
        av2_frame_allows_smart_mv(cpi)) {
      av2_collect_mv_stats(cpi, q);
    }

#if CONFIG_COLLECT_COMPONENT_TIMING
    end_timing(cpi, av2_encode_frame_time);
#endif

    avm_clear_system_state();

    // Dummy pack of the bitstream using up to date stats to get an
    // accurate estimate of output frame size to determine if we need
    // to recode.
    const int do_dummy_pack =
        (cpi->sf.hl_sf.recode_loop >= ALLOW_RECODE_KFARFGF &&
         oxcf->rc_cfg.mode != AVM_Q) ||
        oxcf->rc_cfg.min_cr > 0;
    if (do_dummy_pack) {
      av2_finalize_encoded_frame(cpi);
      int largest_tile_id = 0;  // Output from bitstream: unused here
      if (av2_pack_bitstream(cpi, dest, size, &largest_tile_id) !=
          AVM_CODEC_OK) {
        return AVM_CODEC_ERROR;
      }

      rc->projected_frame_size = (int)(*size) << 3;
    }

#if CONFIG_TUNE_VMAF
    if (oxcf->tune_cfg.tuning >= AVM_TUNE_VMAF_WITH_PREPROCESSING &&
        oxcf->tune_cfg.tuning <= AVM_TUNE_VMAF_NEG_MAX_GAIN) {
      q = cpi->vmaf_info.original_qindex;
    }
#endif
    if (allow_recode) {
      // Update q and decide whether to do a recode loop
      recode_loop_update_q(cpi, &loop, &q, &q_low, &q_high, top_index,
                           bottom_index, &undershoot_seen, &overshoot_seen,
                           &low_cr_seen, loop_count);
    }

    // Special case for overlay frame.
    if (loop && rc->is_src_frame_alt_ref &&
        rc->projected_frame_size < rc->max_frame_bandwidth) {
      loop = 0;
    }

    if (loop) {
      ++loop_count;

#if CONFIG_INTERNAL_STATS
      ++cpi->tot_recode_hits;
#endif
    }
#if CONFIG_COLLECT_COMPONENT_TIMING
    if (loop) printf("\n Recoding:");
#endif
  } while (loop);

  return AVM_CODEC_OK;
}

static INLINE bool allow_tip_direct_output(AV2_COMMON *const cm) {
  if (!frame_is_intra_only(cm) &&
#if !CONFIG_F024_KEYOBU
      !encode_show_existing_frame(cm) &&
#endif
      cm->seq_params.enable_tip == 1 && cm->features.tip_frame_mode &&
      !cm->bru.enabled) {
    return true;
  }

  return false;
}

static INLINE int compute_tip_direct_output_mode_RD(AV2_COMP *cpi,
                                                    uint8_t *dest, size_t *size,
                                                    int64_t *sse, int64_t *rate,
                                                    int *largest_tile_id) {
  AV2_COMMON *const cm = &cpi->common;

  if (allow_tip_direct_output(cm)) {
    cm->features.tip_frame_mode = TIP_FRAME_AS_OUTPUT;

    ThreadData *const td = &cpi->td;
    av2_setup_tip_frame(cm, &td->mb.e_mbd, NULL, td->mb.tmp_conv_dst,
                        av2_enc_calc_subpel_params, 0 /* copy_refined_mvs */
    );

    const int64_t rdmult =
        av2_compute_rd_mult(cpi, cm->quant_params.base_qindex);

    if (cm->seq_params.enable_lf_sub_pu && cm->features.allow_lf_sub_pu) {
      const int u_ac_delta_q_backup = cm->quant_params.u_ac_delta_q;
      const int v_ac_delta_q_backup = cm->quant_params.v_ac_delta_q;
      const int base_qindex_backup = cm->quant_params.base_qindex;
      if (cm->seq_params.enable_tip_explicit_qp == 0) {
        const int avg_u_ac_delta_q =
            (cm->tip_ref.ref_frame_buffer[0]->u_ac_delta_q +
             cm->tip_ref.ref_frame_buffer[1]->u_ac_delta_q + 1) >>
            1;
        const int avg_v_ac_delta_q =
            (cm->tip_ref.ref_frame_buffer[0]->v_ac_delta_q +
             cm->tip_ref.ref_frame_buffer[1]->v_ac_delta_q + 1) >>
            1;
        const int avg_base_qindex =
            (cm->tip_ref.ref_frame_buffer[0]->base_qindex +
             cm->tip_ref.ref_frame_buffer[1]->base_qindex + 1) >>
            1;
        cm->cur_frame->u_ac_delta_q = cm->quant_params.u_ac_delta_q =
            avg_u_ac_delta_q;
        cm->cur_frame->v_ac_delta_q = cm->quant_params.v_ac_delta_q =
            avg_v_ac_delta_q;
        cm->cur_frame->base_qindex = cm->quant_params.base_qindex =
            avg_base_qindex;
      }
      search_tip_filter_level(cpi, cm);
      init_tip_lf_parameter(cm, 0, av2_num_planes(cm));
      loop_filter_tip_frame(cm, 0, av2_num_planes(cm));
      if (cm->seq_params.enable_tip_explicit_qp == 0) {
        cm->cur_frame->u_ac_delta_q = cm->quant_params.u_ac_delta_q =
            u_ac_delta_q_backup;
        cm->cur_frame->v_ac_delta_q = cm->quant_params.v_ac_delta_q =
            v_ac_delta_q_backup;
        cm->cur_frame->base_qindex = cm->quant_params.base_qindex =
            base_qindex_backup;
      }
      avm_extend_frame_borders(&cm->tip_ref.tip_frame->buf, av2_num_planes(cm),
                               0);
    }

    // Compute sse and rate.
    YV12_BUFFER_CONFIG *tip_frame_buf = &cm->tip_ref.tip_frame->buf;
    cm->tip_interp_filter = MULTITAP_SHARP;
    const int search_dir[8][2] = {
      { -1, -1 }, { -1, 0 }, { -1, 1 }, { 0, -1 },
      { 0, 1 },   { 1, -1 }, { 1, 0 },  { 1, 1 },
    };
    int64_t best_sse = avm_highbd_get_y_sse(cpi->source, tip_frame_buf);
    best_sse +=
        avm_highbd_sse(cpi->source->u_buffer, cpi->source->uv_stride,
                       tip_frame_buf->u_buffer, tip_frame_buf->uv_stride,
                       cpi->source->uv_width, cpi->source->uv_height);
    best_sse +=
        avm_highbd_sse(cpi->source->v_buffer, cpi->source->uv_stride,
                       tip_frame_buf->v_buffer, tip_frame_buf->uv_stride,
                       cpi->source->uv_width, cpi->source->uv_height);
    int_mv ref_mv;
    ref_mv.as_int = 0;

    int sym_rate_cost = 1;
    int_mv best_mv = ref_mv;
    best_sse = (int64_t)RDCOST_DBL_WITH_NATIVE_BD_DIST(
        rdmult, (sym_rate_cost << 5), best_sse, cm->seq_params.bit_depth);
    int best_center[2] = { 0, 0 };

    int search_step = 8;
    while (search_step > 0) {
      for (int idx = 0; idx < 8; ++idx) {
        ref_mv.as_mv.row = best_center[0] + search_dir[idx][0] * search_step;
        ref_mv.as_mv.col = best_center[1] + search_dir[idx][1] * search_step;

        if (abs(ref_mv.as_mv.row) > 15 || abs(ref_mv.as_mv.col) > 15) continue;

        cm->tip_global_motion.as_int = ref_mv.as_int;
        av2_setup_tip_frame(cm, &td->mb.e_mbd, NULL, td->mb.tmp_conv_dst,
                            av2_enc_calc_subpel_params, 0 /* copy_refined_mvs */
        );
        if (cm->seq_params.enable_lf_sub_pu && cm->features.allow_lf_sub_pu) {
          loop_filter_tip_frame(cm, 0, av2_num_planes(cm));
        }

        int64_t this_sse = avm_highbd_get_y_sse(cpi->source, tip_frame_buf);
        this_sse +=
            avm_highbd_sse(cpi->source->u_buffer, cpi->source->uv_stride,
                           tip_frame_buf->u_buffer, tip_frame_buf->uv_stride,
                           cpi->source->uv_width, cpi->source->uv_height);
        this_sse +=
            avm_highbd_sse(cpi->source->v_buffer, cpi->source->uv_stride,
                           tip_frame_buf->v_buffer, tip_frame_buf->uv_stride,
                           cpi->source->uv_width, cpi->source->uv_height);

        sym_rate_cost = 13;
        this_sse = (int64_t)RDCOST_DBL_WITH_NATIVE_BD_DIST(
            rdmult, (sym_rate_cost << 5), this_sse, cm->seq_params.bit_depth);
        if (this_sse < best_sse) {
          best_mv = ref_mv;
          best_sse = this_sse;
        }
      }
      best_center[0] = best_mv.as_mv.row;
      best_center[1] = best_mv.as_mv.col;
      search_step >>= 1;
    }

    cm->tip_global_motion = best_mv;

    best_sse = INT64_MAX;
    InterpFilter best_interp_filter = MULTITAP_SHARP;

    for (InterpFilter interp_filter = EIGHTTAP_REGULAR;
         interp_filter <= MULTITAP_SHARP; ++interp_filter) {
      cm->tip_interp_filter = interp_filter;
      av2_setup_tip_frame(cm, &td->mb.e_mbd, NULL, td->mb.tmp_conv_dst,
                          av2_enc_calc_subpel_params, 0 /* copy_refined_mvs */
      );
      if (cm->seq_params.enable_lf_sub_pu && cm->features.allow_lf_sub_pu) {
        loop_filter_tip_frame(cm, 0, av2_num_planes(cm));
      }

      int64_t this_sse = avm_highbd_get_y_sse(cpi->source, tip_frame_buf);
      this_sse +=
          avm_highbd_sse(cpi->source->u_buffer, cpi->source->uv_stride,
                         tip_frame_buf->u_buffer, tip_frame_buf->uv_stride,
                         cpi->source->uv_width, cpi->source->uv_height);

      this_sse +=
          avm_highbd_sse(cpi->source->v_buffer, cpi->source->uv_stride,
                         tip_frame_buf->v_buffer, tip_frame_buf->uv_stride,
                         cpi->source->uv_width, cpi->source->uv_height);

      if (this_sse < best_sse) {
        best_interp_filter = interp_filter;
        best_sse = this_sse;
      }
    }
    cm->tip_interp_filter = best_interp_filter;
    av2_finalize_encoded_frame(cpi);
    if (av2_pack_bitstream(cpi, dest, size, largest_tile_id) != AVM_CODEC_OK)
      return AVM_CODEC_ERROR;

    *sse = best_sse;

    const int64_t bits = (*size << 3);
    *rate = (bits << 5);  // To match scale.
    cm->features.tip_frame_mode = TIP_FRAME_AS_REF;
  }

  return AVM_CODEC_OK;
}

static INLINE int finalize_tip_mode(AV2_COMP *cpi, uint8_t *dest, size_t *size,
                                    int64_t *sse, int64_t *rate,
                                    int64_t tip_as_output_sse,
                                    int64_t tip_as_output_rate,
                                    int *largest_tile_id) {
  AV2_COMMON *const cm = &cpi->common;

  int64_t tip_as_ref_sse = INT64_MAX;
  int64_t tip_as_ref_rate = INT64_MAX;
  if (sse != NULL && rate != NULL) {
    tip_as_ref_sse = *sse;
    tip_as_ref_rate = *rate;
  } else {
    tip_as_ref_sse = avm_highbd_get_y_sse(cpi->source, &cm->cur_frame->buf);
    tip_as_ref_sse += avm_highbd_sse(
        cpi->source->u_buffer, cpi->source->uv_stride,
        cm->cur_frame->buf.u_buffer, cm->cur_frame->buf.uv_stride,
        cpi->source->uv_width, cpi->source->uv_height);
    tip_as_ref_sse += avm_highbd_sse(
        cpi->source->v_buffer, cpi->source->uv_stride,
        cm->cur_frame->buf.v_buffer, cm->cur_frame->buf.uv_stride,
        cpi->source->uv_width, cpi->source->uv_height);

    const int64_t bits = (*size << 3);
    tip_as_ref_rate = (bits << 5);  // To match scale.
  }

  const int64_t rdmult = av2_compute_rd_mult(cpi, cm->quant_params.base_qindex);

  const double normal_coding_rdcost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
      rdmult, tip_as_ref_rate, tip_as_ref_sse, cm->seq_params.bit_depth);
  const double tip_direct_output_rdcost = RDCOST_DBL_WITH_NATIVE_BD_DIST(
      rdmult, tip_as_output_rate, tip_as_output_sse, cm->seq_params.bit_depth);
  if (tip_direct_output_rdcost < normal_coding_rdcost &&
      (!cm->features.coded_lossless || tip_as_output_sse == 0)) {
    cm->features.tip_frame_mode = TIP_FRAME_AS_OUTPUT;
    for (int plane = 0; plane < av2_num_planes(cm); plane++) {
      cm->cur_frame->ccso_info.ccso_enable[plane] = 0;
    }
    const int cur_order_hint = cm->current_frame.display_order_hint;
    if (!cm->has_both_sides_refs && cur_order_hint < INTER_REFS_PER_FRAME) {
      const int mvs_rows = cm->mi_params.mi_rows;
      const int mvs_cols = cm->mi_params.mi_cols;
      cpi->tip_mode_count[cur_order_hint] = mvs_rows * mvs_cols;
    }

    if (cm->seq_params.enable_tip_explicit_qp == 0) {
      const int avg_u_ac_delta_q =
          (cm->tip_ref.ref_frame_buffer[0]->u_ac_delta_q +
           cm->tip_ref.ref_frame_buffer[1]->u_ac_delta_q + 1) >>
          1;
      const int avg_v_ac_delta_q =
          (cm->tip_ref.ref_frame_buffer[0]->v_ac_delta_q +
           cm->tip_ref.ref_frame_buffer[1]->v_ac_delta_q + 1) >>
          1;
      const int avg_base_qindex =
          (cm->tip_ref.ref_frame_buffer[0]->base_qindex +
           cm->tip_ref.ref_frame_buffer[1]->base_qindex + 1) >>
          1;
      cm->cur_frame->u_ac_delta_q = cm->quant_params.u_ac_delta_q =
          avg_u_ac_delta_q;
      cm->cur_frame->v_ac_delta_q = cm->quant_params.v_ac_delta_q =
          avg_v_ac_delta_q;
      cm->cur_frame->base_qindex = cm->quant_params.base_qindex =
          avg_base_qindex;
    }

    set_primary_ref_frame(cpi);
    if (cm->features.primary_ref_frame == PRIMARY_REF_NONE ||
        cm->features.cross_frame_context == CROSS_FRAME_CONTEXT_DISABLED) {
      // use the default frame context values
      *cm->fc = *cm->default_frame_context;
    } else {
      *cm->fc = get_primary_ref_frame_buf(cm, cm->features.primary_ref_frame)
                    ->frame_context;
    }
    if (!cm->fc->initialized)
      avm_internal_error(&cm->error, AVM_CODEC_CORRUPT_FRAME,
                         "Uninitialized entropy context.");

    cm->cur_frame->frame_context = *cm->fc;
    const int num_planes = av2_num_planes(cm);
    ThreadData *const td = &cpi->td;
    av2_setup_tip_frame(cm, &td->mb.e_mbd, NULL, td->mb.tmp_conv_dst,
                        av2_enc_calc_subpel_params, 1 /* copy_refined_mvs */
    );
    if (cm->seq_params.enable_lf_sub_pu && cm->features.allow_lf_sub_pu) {
      init_tip_lf_parameter(cm, 0, av2_num_planes(cm));
      loop_filter_tip_frame(cm, 0, av2_num_planes(cm));
      avm_extend_frame_borders(&cm->tip_ref.tip_frame->buf, av2_num_planes(cm),
                               0);
    }
    avm_yv12_copy_frame(&cm->tip_ref.tip_frame->buf, &cm->cur_frame->buf,
                        num_planes);

    cm->lf.apply_deblocking_filter[0] = 0;
    cm->lf.apply_deblocking_filter[1] = 0;
    cm->cdef_info.cdef_frame_enable = 0;
    cm->rst_info[0].frame_restoration_type = RESTORE_NONE;
    cm->rst_info[1].frame_restoration_type = RESTORE_NONE;
    cm->rst_info[2].frame_restoration_type = RESTORE_NONE;

    for (int p = 0; p < num_planes; ++p) {
      cm->rst_info[p].frame_filters_on = 0;
      cm->rst_info[p].temporal_pred_flag = 0;
      cm->cur_frame->rst_info[p].frame_filters_on = 0;
      cm->cur_frame->rst_info[p].temporal_pred_flag = 0;
    }

    for (int i = 0; i < INTER_REFS_PER_FRAME; ++i) {
      cm->global_motion[i] = default_warp_params;
      cm->cur_frame->global_motion[i] = default_warp_params;
    }
    cpi->gm_info.search_done = 0;
    av2_finalize_encoded_frame(cpi);
    if (av2_pack_bitstream(cpi, dest, size, largest_tile_id) != AVM_CODEC_OK)
      return AVM_CODEC_ERROR;

    if (sse != NULL) {
      *sse = tip_as_output_sse;
    }
    if (rate != NULL) {
      *rate = tip_as_output_rate;
    }
  } else {
    cm->tip_global_motion.as_int = 0;
    cm->tip_interp_filter = MULTITAP_SHARP;
  }

  return AVM_CODEC_OK;
}

/*!\brief Parameters for representing LR flexible syntax.
 */
typedef struct {
  /*!\brief Mask of lr tool(s) to disable */
  uint8_t lr_tools_disable_mask[MAX_MB_PLANE];
  /*!\brief Number of lr tools enabled */
  int lr_tools_count[MAX_MB_PLANE];
  /*!\brief Number of lr options in switchable mode */
  int lr_switchable_tools_count[MAX_MB_PLANE];
  /*!\brief Number of lr modes available at frame level */
  int lr_frame_tools_count[MAX_MB_PLANE];
} LrParams;

static void store_lr_parameters(AV2_COMMON *const cm, LrParams *lr_params) {
  const int num_planes = av2_num_planes(cm);
  FeatureFlags *const fea_params = &cm->features;

  for (int i = 0; i < num_planes; ++i) {
    lr_params->lr_tools_disable_mask[i] = fea_params->lr_tools_disable_mask[i];
    lr_params->lr_tools_count[i] = fea_params->lr_tools_count[i];
    lr_params->lr_switchable_tools_count[i] =
        fea_params->lr_switchable_tools_count[i];
    lr_params->lr_frame_tools_count[i] = fea_params->lr_frame_tools_count[i];
  }
}

static void restore_lr_parameters(AV2_COMMON *const cm,
                                  const LrParams *lr_params) {
  const int num_planes = av2_num_planes(cm);
  FeatureFlags *const fea_params = &cm->features;

  for (int i = 0; i < num_planes; ++i) {
    fea_params->lr_tools_disable_mask[i] = lr_params->lr_tools_disable_mask[i];
    fea_params->lr_tools_count[i] = lr_params->lr_tools_count[i];
    fea_params->lr_switchable_tools_count[i] =
        lr_params->lr_switchable_tools_count[i];
    fea_params->lr_frame_tools_count[i] = lr_params->lr_frame_tools_count[i];
  }
}

/*!\brief Recode loop or a single loop for encoding one frame, followed by
 * in-loop deblocking filters, CDEF filters, and restoration filters.
 *
 * \ingroup high_level_algo
 * \callgraph
 * \callergraph
 *
 * \param[in]    cpi             Top-level encoder structure
 * \param[in]    size            Bitstream size
 * \param[in]    dest            Bitstream output
 * \param[in]    sse             Total distortion of the frame
 * \param[in]    rate            Total rate of the frame
 * \param[in]    largest_tile_id Tile id of the last tile
 *
 * \return Returns a value to indicate if the encoding is done successfully.
 * \retval #AVM_CODEC_OK
 * \retval #AVM_CODEC_ERROR
 */
static int encode_with_recode_loop_and_filter(AV2_COMP *cpi, size_t *size,
                                              uint8_t *dest, int64_t *sse,
                                              int64_t *rate,
                                              int *largest_tile_id) {
#if CONFIG_COLLECT_COMPONENT_TIMING
  start_timing(cpi, encode_with_recode_loop_time);
#endif
  int err;

  AV2_COMMON *const cm = &cpi->common;

  if (cpi->sf.hl_sf.recode_loop == DISALLOW_RECODE)
    err = encode_without_recode(cpi);
  else
    err = encode_with_recode_loop(cpi, size, dest);
#if CONFIG_COLLECT_COMPONENT_TIMING
  end_timing(cpi, encode_with_recode_loop_time);
#endif
  if (err != AVM_CODEC_OK) {
    if (err == -1) {
      // special case as described in encode_with_recode_loop().
      // Encoding was skipped.
      err = AVM_CODEC_OK;
      if (sse != NULL) *sse = INT64_MAX;
      if (rate != NULL) *rate = INT64_MAX;
      *largest_tile_id = 0;
    }
    return err;
  }

  SequenceHeader *const seq_params = &cm->seq_params;
#if CONFIG_CWG_F270_CI_OBU
  ColorInfo *const color_info = &cm->ci_params_encoder.color_info;
#endif  // CONFIG_CWG_F270_CI_OBU
  if (cm->bru.enabled && cm->current_frame.frame_type != KEY_FRAME) {
    enc_bru_swap_stage(cpi);
  }

  const int num_planes = av2_num_planes(cm);
  for (int p = 0; p < num_planes; ++p) {
    cm->cur_frame->rst_info[p].frame_filters_on = 0;
  }

  // Special case code to reduce pulsing when key frames are forced at a
  // fixed interval. Note the reconstruction error if it is the frame before
  // the force key frame
  if (cpi->rc.next_key_frame_forced && cpi->rc.frames_to_key == 1) {
    cpi->ambient_err = avm_highbd_get_y_sse(cpi->source, &cm->cur_frame->buf);
  }

#if CONFIG_CWG_F270_CI_OBU
  cm->cur_frame->buf.color_primaries = color_info->color_primaries;
  cm->cur_frame->buf.transfer_characteristics =
      color_info->transfer_characteristics;
  cm->cur_frame->buf.matrix_coefficients = color_info->matrix_coefficients;
#else
  cm->cur_frame->buf.color_primaries = seq_params->color_primaries;
  cm->cur_frame->buf.transfer_characteristics =
      seq_params->transfer_characteristics;
  cm->cur_frame->buf.matrix_coefficients = seq_params->matrix_coefficients;
#endif  // CONFIG_CWG_F270_CI_OBU
  cm->cur_frame->buf.monochrome = seq_params->monochrome;
#if CONFIG_CWG_F270_CI_OBU
  cm->cur_frame->buf.chroma_sample_position =
      cm->ci_params_encoder.ci_chroma_sample_position[0];
  cm->cur_frame->buf.color_range = color_info->full_range_flag;
#else
  cm->cur_frame->buf.chroma_sample_position =
      seq_params->chroma_sample_position;
  cm->cur_frame->buf.color_range = seq_params->color_range;
#endif  // CONFIG_CWG_F270_CI_OBU
  cm->cur_frame->buf.render_width = cm->render_width;
  cm->cur_frame->buf.render_height = cm->render_height;
  cm->cur_frame->buf.bit_depth = (unsigned int)seq_params->bit_depth;

  uint8_t master_lr_tools_disable_mask[2] = {
    cm->seq_params.lr_tools_disable_mask[0],
    cm->seq_params.lr_tools_disable_mask[1]
  };
  av2_set_lr_tools(master_lr_tools_disable_mask[0], 0, &cm->features);
  av2_set_lr_tools(master_lr_tools_disable_mask[1], 1, &cm->features);
  av2_set_lr_tools(master_lr_tools_disable_mask[1], 2, &cm->features);

  // Pick the loop filter level for the frame.
  if (!cm->bru.frame_inactive_flag && !cm->bridge_frame_info.is_bridge_frame)
    loopfilter_frame(cpi, cm);
  int64_t tip_as_output_sse = INT64_MAX;
  int64_t tip_as_output_rate = INT64_MAX;

  compute_tip_direct_output_mode_RD(cpi, dest, size, &tip_as_output_sse,
                                    &tip_as_output_rate, largest_tile_id);

  // TODO(debargha): Fix mv search range on encoder side
  // avm_extend_frame_inner_borders(&cm->cur_frame->buf, av2_num_planes(cm));
  avm_extend_frame_borders(&cm->cur_frame->buf, av2_num_planes(cm), 0);

#ifdef OUTPUT_YUV_REC
  avm_write_one_yuv_frame(cm, &cm->cur_frame->buf);
#endif

  // For primary_ref_frame and derived_primary_ref_frame, if one of them is
  // PRIMARY_REF_NONE, the other one is also PRIMARY_REF_NONE.
  assert(IMPLIES(cm->features.derived_primary_ref_frame == PRIMARY_REF_NONE,
                 cm->features.primary_ref_frame == PRIMARY_REF_NONE));
  assert(IMPLIES(cm->features.primary_ref_frame == PRIMARY_REF_NONE,
                 cm->features.derived_primary_ref_frame == PRIMARY_REF_NONE));

  if (cm->features.primary_ref_frame != PRIMARY_REF_NONE &&
      !cpi->error_resilient_frame_seen) {
    const int n_refs = cm->ref_frames_info.num_total_refs;
    //    int frame_size[REF_FRAMES];
    int best_ref_idx = -1;
    int best_frame_size = INT32_MAX;
    int cur_frame_size = INT32_MAX;
    // Save LR parameters
    LrParams lr_params = { { 0 }, { 0 }, { 0 }, { 0 } };
    store_lr_parameters(cm, &lr_params);
    int obu_written_status = cpi->obu_is_written;
    cpi->obu_is_written = true;

    for (int i = 0; i < n_refs; ++i) {
      const int temp_map_idx = get_ref_frame_map_idx(cm, i);
      const RefCntBuffer *const temp_ref_buf = cm->ref_frame_map[temp_map_idx];
#if CONFIG_F322_OBUER_REFRESTRICT
      assert(temp_ref_buf != NULL);
      if (temp_ref_buf != NULL && temp_ref_buf->is_restricted) continue;
#endif  // CONFIG_F322_OBUER_REFRESTRICT
      if (temp_ref_buf->frame_type != INTER_FRAME) continue;
      if (cm->bru.enabled && i == cm->bru.update_ref_idx) continue;

      *cm->fc = temp_ref_buf->frame_context;

      if (!cm->fc->initialized)
        avm_internal_error(&cm->error, AVM_CODEC_CORRUPT_FRAME,
                           "Uninitialized entropy context.");
      av2_finalize_encoded_frame(cpi);
      // Storing/restoring cm->features.primary_ref_frame isn't needed here
      // since it always takes 3 bits for primary_ref_frame signaling.
      // For cases allowing primary_ref_frame search, cpi->signal_primary_ref_
      // frame should be 0 before primary_ref_frame search. Here no need to
      // store previous cpi->signal_primary_ref_frame value.
      // cpi->signal_primary_ref_frame =
      //     cm->features.derived_primary_ref_frame != i;
      size_t temp_size;
      int temp_largest_tile_id = 0;  // Output from bitstream: unused here
      if (av2_pack_bitstream(cpi, dest, &temp_size, &temp_largest_tile_id) !=
          AVM_CODEC_OK) {
        return AVM_CODEC_ERROR;
      }
      restore_lr_parameters(cm, &lr_params);

      const int frame_size = (int)(temp_size);
      if (cm->features.primary_ref_frame == i) cur_frame_size = frame_size;
      if (frame_size < best_frame_size) {
        best_frame_size = frame_size;
        best_ref_idx = i;
      }
    }
    // recover the obu_is_written status
    cpi->obu_is_written = obu_written_status;
    if (cm->features.primary_ref_frame != best_ref_idx &&
        best_frame_size < cur_frame_size) {
      cm->features.primary_ref_frame = best_ref_idx;
    }
    cpi->signal_primary_ref_frame = cm->features.derived_primary_ref_frame !=
                                    cm->features.primary_ref_frame;

    const int map_idx =
        get_ref_frame_map_idx(cm, cm->features.primary_ref_frame);
    const RefCntBuffer *const ref_buf = cm->ref_frame_map[map_idx];
    if (cm->bru.enabled &&
        cm->features.primary_ref_frame == cm->bru.update_ref_idx)
      *cm->fc = cm->bru.update_ref_fc;
    else
      *cm->fc = ref_buf->frame_context;
    if (!cm->fc->initialized)
      avm_internal_error(&cm->error, AVM_CODEC_CORRUPT_FRAME,
                         "Uninitialized entropy context.");
    if (cm->features.cross_frame_context == CROSS_FRAME_CONTEXT_DISABLED) {
      av2_set_default_frame_contexts(cm);
    } else {
      int ref_frame_used = PRIMARY_REF_NONE;
      int secondary_map_idx = INVALID_IDX;
      get_secondary_reference_frame_idx(cm, &ref_frame_used,
                                        &secondary_map_idx);
      if (!cm->bru.enabled || ref_frame_used != cm->bru.update_ref_idx) {
        avg_primary_secondary_references(cm, ref_frame_used, secondary_map_idx);
      } else {
        if ((map_idx != INVALID_IDX) &&
            (ref_frame_used != cm->features.primary_ref_frame) &&
            (!cm->bru.frame_inactive_flag) &&
            (!cm->bridge_frame_info.is_bridge_frame) &&
            (cm->seq_params.enable_avg_cdf && !cm->seq_params.avg_cdf_type) &&
            !frame_is_sframe(cm) && (ref_frame_used != PRIMARY_REF_NONE)) {
          av2_avg_cdf_symbols(cm->fc, &cm->bru.update_ref_fc,
                              AVG_CDF_WEIGHT_PRIMARY,
                              AVG_CDF_WEIGHT_NON_PRIMARY);
        }
      }
    }
  }

  av2_finalize_encoded_frame(cpi);
  // Build the bitstream
#if CONFIG_COLLECT_COMPONENT_TIMING
  start_timing(cpi, av2_pack_bitstream_final_time);
#endif
  if (av2_pack_bitstream(cpi, dest, size, largest_tile_id) != AVM_CODEC_OK)
    return AVM_CODEC_ERROR;
#if CONFIG_COLLECT_COMPONENT_TIMING
  end_timing(cpi, av2_pack_bitstream_final_time);
#endif
  // if bru enabled, remove the source associated with the bru_ref
  if (cm->bru.enabled) {
    av2_lookahead_leave(cpi->lookahead, cm->bru.ref_disp_order, ENCODE_STAGE);
    // get current frame
    for (int i = 0; i < cpi->lookahead->max_sz - 1; i++) {
      if (cpi->lookahead->buf[i].disp_order_hint ==
          (int)cm->cur_frame->display_order_hint) {
        cpi->unfiltered_source = &cpi->lookahead->buf[i].img;
        cpi->source = &cpi->lookahead->buf[i].img;
        break;
      }
    }
  }

  // Compute sse and rate.
  if (sse != NULL) {
    int64_t tip_as_ref_sse =
        avm_highbd_get_y_sse(cpi->source, &cm->cur_frame->buf);
    tip_as_ref_sse += avm_highbd_sse(
        cpi->source->u_buffer, cpi->source->uv_stride,
        cm->cur_frame->buf.u_buffer, cm->cur_frame->buf.uv_stride,
        cpi->source->uv_width, cpi->source->uv_height);
    tip_as_ref_sse += avm_highbd_sse(
        cpi->source->v_buffer, cpi->source->uv_stride,
        cm->cur_frame->buf.v_buffer, cm->cur_frame->buf.uv_stride,
        cpi->source->uv_width, cpi->source->uv_height);
    *sse = tip_as_ref_sse;
  }
  if (rate != NULL) {
    const int64_t bits = (*size << 3);
    *rate = (bits << 5);  // To match scale.
  }

  if (allow_tip_direct_output(cm)) {
    finalize_tip_mode(cpi, dest, size, sse, rate, tip_as_output_sse,
                      tip_as_output_rate, largest_tile_id);
  }

  cpi->last_encoded_frame_order_hint = cm->current_frame.display_order_hint;
  return AVM_CODEC_OK;
}

// 1) For multiple tiles-based coding, calculate the average CDFs from the
// allowed tiles, and use the average CDFs of the tiles as the frame's CDFs
// 2) For one tile coding, directly use that tile's CDFs as the frame's CDFs
void encoder_avg_tiles_cdfs(AV2_COMP *const cpi) {
  AV2_COMMON *const cm = &cpi->common;
  const CommonTileParams *const tiles = &cm->tiles;
  const int total_tiles = tiles->rows * tiles->cols;
  if (total_tiles == 1) {
    *cm->fc = cpi->tile_data[0].tctx;
  } else {
    const unsigned int total_tiles_log2 = av2_compute_allowed_tiles_log2(cm);
    const unsigned int used_tiles = (1 << total_tiles_log2);
    *cm->fc = cpi->tile_data[0].tctx;
    av2_shift_cdf_symbols(cm->fc, total_tiles_log2);
    for (unsigned int tile_idx = 1; tile_idx < used_tiles; ++tile_idx) {
      av2_cumulative_avg_cdf_symbols(cm->fc, &cpi->tile_data[tile_idx].tctx,
                                     total_tiles_log2);
    }
  }
}
/*!\brief Run the final pass encoding for 1-pass/2-pass encoding mode, and pack
 * the bitstream
 *
 * \ingroup high_level_algo
 * \callgraph
 * \callergraph
 *
 * \param[in]    cpi             Top-level encoder structure
 * \param[in]    size            Bitstream size
 * \param[in]    dest            Bitstream output
 *
 * \return Returns a value to indicate if the encoding is done successfully.
 * \retval #AVM_CODEC_OK
 * \retval #AVM_CODEC_ERROR
 */
static int encode_frame_to_data_rate(AV2_COMP *cpi, size_t *size,
                                     uint8_t *dest) {
  AV2_COMMON *const cm = &cpi->common;
  SequenceHeader *const seq_params = &cm->seq_params;
  CurrentFrame *const current_frame = &cm->current_frame;
  const AV2EncoderConfig *const oxcf = &cpi->oxcf;
  struct segmentation *const seg = &cm->seg;
  FeatureFlags *const features = &cm->features;
  const TileConfig *const tile_cfg = &oxcf->tile_cfg;

#if CONFIG_COLLECT_COMPONENT_TIMING
  start_timing(cpi, encode_frame_to_data_rate_time);
#endif
  av2_set_screen_content_options(cpi, features);
  if (cm->current_frame.frame_type != KEY_FRAME) {
    // the current kf_allow_sc_tools will be considered when we set
    // allow_screen_content_tools flag for arf frames, in order to reduce
    // the chances that could be missed detection as screen content.
    if (frame_is_kf_gf_arf(cpi)) {
      features->allow_screen_content_tools |= features->kf_allow_sc_tools;
    }
  } else {
    features->kf_allow_sc_tools = features->allow_screen_content_tools;
  }
  cpi->is_screen_content_type = features->allow_screen_content_tools;
  if (cm->features.allow_intrabc) {
    cm->features.allow_global_intrabc =
        (oxcf->kf_cfg.enable_intrabc_ext != 2) && frame_is_intra_only(cm);

    cm->features.allow_local_intrabc = !!oxcf->kf_cfg.enable_intrabc_ext;
    set_max_bvp_drl_bits(cpi);
  } else {
    cm->features.allow_global_intrabc = 0;
    cm->features.allow_local_intrabc = 0;
  }
#if CONFIG_F024_KEYOBU
  const bool compute_ds_filter =
      cpi->common.current_frame.cm_obu_type == OBU_CLK;
#else
  const bool compute_ds_filter =
      av2_is_shown_keyframe(cpi, cm->current_frame.frame_type) &&
      !cpi->common.show_existing_frame;
#endif  // CONFIG_F024_KEYOBU
  if (compute_ds_filter) {
    av2_set_downsample_filter_options(cpi);
  }
  // frame type has been decided outside of this function call
  cm->cur_frame->frame_type = current_frame->frame_type;

  features->allow_ref_frame_mvs &= frame_might_allow_ref_frame_mvs(cm);

  features->allow_warpmv_mode = features->enabled_motion_modes;
  // temporal set of frame level enable_bawp flag.
  features->enable_bawp = seq_params->enable_bawp;
  features->enable_intra_bawp = seq_params->enable_bawp;
  features->enable_cwp = seq_params->enable_cwp;

  features->enable_imp_msk_bld = seq_params->enable_imp_msk_bld;

  features->enable_ext_seg = seq_params->enable_ext_seg;
  cm->seg.enable_ext_seg = seq_params->enable_ext_seg;
  // TODO: Does it need to keep GF_UPDATE?
#if !CONFIG_F322_OBUER_REFRESTRICT
  if (frame_is_sframe(cm)) {
    GF_GROUP *gf_group = &cpi->gf_group;
    // S frame will wipe out any previously encoded altref so we cannot place
    // an overlay frame
    gf_group->update_type[gf_group->size] = GF_UPDATE;
  }
#endif  // CONFIG_F322_OBUER_REFRESTRICT

#if CONFIG_F024_KEYOBU
  if (!cpi->oxcf.ref_frm_cfg.enable_generation_sef_obu &&
      cpi->update_type_was_overlay) {
    assign_frame_buffer_p(&cm->cur_frame,
                          cm->ref_frame_map[cpi->fb_idx_for_overlay]);
    int enc_olk_fb_idx = 0;
    for (int ref_pos = 0; ref_pos < seq_params->ref_frames; ref_pos++) {
      if ((cm->olk_refresh_frame_flags[cm->mlayer_id] >> ref_pos) & 1) {
        enc_olk_fb_idx = ref_pos;
        break;
      }
    }
    if (cpi->olk_encountered &&
        cm->olk_refresh_frame_flags[cm->mlayer_id] != INVALID_IDX &&
        enc_olk_fb_idx == cpi->fb_idx_for_overlay) {
      int ref_flags_to_keep = 0;
      for (int layer = 0; layer <= seq_params->max_mlayer_id; layer++) {
        ref_flags_to_keep |= cm->olk_refresh_frame_flags[cm->mlayer_id];
      }
      for (int ref_index = 0; ref_index < cm->seq_params.ref_frames;
           ref_index++) {
        if (!((ref_flags_to_keep >> ref_index) & 1u)) {
          if (cm->ref_frame_map[ref_index] != NULL) {
            --cm->ref_frame_map[ref_index]->ref_count;
            cm->ref_frame_map[ref_index] = NULL;
          }
        }
      }
      cpi->is_olk_overlay = 1;
    }  // cpi->olk_encountered
    else {
      cpi->is_olk_overlay = 0;
    }
    cpi->seq_params_locked = 1;
    if (cm->show_frame) cpi->last_show_frame_buf = cm->cur_frame;

    // current_frame->frame_number is incremented already for
    // keyframe overlays.
    if (!av2_check_keyframe_overlay(cpi->gf_group.index, &cpi->gf_group,
                                    cpi->rc.frames_since_key))
      ++current_frame->frame_number;
    return AVM_CODEC_OK;
  }  // if(cpi->update_type_was_overlay)

  if (cpi->oxcf.ref_frm_cfg.enable_generation_sef_obu &&
      cm->show_existing_frame) {
    av2_finalize_encoded_frame(cpi);
    // Build the bitstream
    int largest_tile_id = 0;  // Output from bitstream: unused here
    if (av2_pack_bitstream(cpi, dest, size, &largest_tile_id) != AVM_CODEC_OK)
      return AVM_CODEC_ERROR;
    if (cpi->increase_fgm_counter) {
      assert(cm->fgm_id >= 0 && cm->fgm_id < MAX_FGM_NUM &&
             cpi->fgm.fgm_chroma_idc >= 0 && cpi->fgm.fgm_chroma_idc < 4);
      int fgm_pos = cpi->written_fgm_num % MAX_FGM_NUM;
      int valid_fgm_num = AVMMIN(cpi->written_fgm_num, MAX_FGM_NUM);
      for (int i = 0; i < valid_fgm_num; i++) {
        if (cpi->fgm_list[i].fgm_id == cm->fgm_id) {
          fgm_pos = i;
          break;
        }
      }
      cpi->fgm_list[fgm_pos] = cpi->fgm;
      cpi->written_fgm_num += 1;
    }

    cpi->seq_params_locked = 1;

    // NOTE: Save the new show frame buffer index for --test-code=warn, i.e.,
    //       for the purpose to verify no mismatch between encoder and decoder.
    if (cm->derive_sef_order_hint)
      cpi->last_show_frame_buf = cm->cur_frame;
    else
      cpi->last_show_frame_buf = cm->ref_frame_map[cm->sef_ref_fb_idx];
    refresh_reference_frames(cpi);

    // Since we allocate a spot for the OVERLAY frame in the gf group, we need
    // to do post-encoding update accordingly.
    if (cpi->rc.is_src_frame_alt_ref) {
      av2_set_target_rate(cpi, cm->width, cm->height);
      av2_rc_postencode_update(cpi, *size);
    }

    if (is_psnr_calc_enabled(cpi)) {
      int y_crop_width =
          !cm->derive_sef_order_hint
              ? cm->ref_frame_map[cm->sef_ref_fb_idx]->buf.y_crop_width
              : cm->cur_frame->buf.y_crop_width;
      int y_crop_height =
          !cm->derive_sef_order_hint
              ? cm->ref_frame_map[cm->sef_ref_fb_idx]->buf.y_crop_height
              : cm->cur_frame->buf.y_crop_height;
      cpi->source = realloc_and_scale_source(cpi, y_crop_width, y_crop_height);
    }

    ++current_frame->frame_number;

    return AVM_CODEC_OK;
  }
#else   // CONFIG_F024_KEYOBU
  const int encode_show_existing = encode_show_existing_frame(cm);
  if (encode_show_existing || cm->show_existing_frame) {
    av2_finalize_encoded_frame(cpi);
    if (encode_show_existing || !cm->derive_sef_order_hint) {
      // Build the bitstream
      int largest_tile_id = 0;  // Output from bitstream: unused here
      if (av2_pack_bitstream(cpi, dest, size, &largest_tile_id) != AVM_CODEC_OK)
        return AVM_CODEC_ERROR;
      if (cpi->increase_fgm_counter) {
        assert(cm->fgm_id >= 0 && cm->fgm_id < MAX_FGM_NUM &&
               cpi->fgm->fgm_chroma_idc >= 0 && cpi->fgm->fgm_chroma_idc < 4);
        int fgm_pos = cpi->written_fgm_num % MAX_FGM_NUM;
        int valid_fgm_num = AVMMIN(cpi->written_fgm_num, MAX_FGM_NUM);
        for (int i = 0; i < valid_fgm_num; i++) {
          if (cpi->fgm_list[i].fgm_id == cm->fgm_id) {
            fgm_pos = i;
            break;
          }
        }
        cpi->fgm_list[fgm_pos] = cpi->fgm;
        cpi->written_fgm_num += 1;
      }
    }

    cpi->seq_params_locked = 1;

    // NOTE: Save the new show frame buffer index for --test-code=warn, i.e.,
    //       for the purpose to verify no mismatch between encoder and decoder.
    if (cm->show_frame) cpi->last_show_frame_buf = cm->cur_frame;
    if (cm->show_frame && !cm->derive_sef_order_hint) {
      cpi->last_show_frame_buf =
          cm->ref_frame_map[cpi->existing_fb_idx_to_show];
    }
    refresh_reference_frames(cpi);

    // Since we allocate a spot for the OVERLAY frame in the gf group, we need
    // to do post-encoding update accordingly.
    if (cpi->rc.is_src_frame_alt_ref) {
      av2_set_target_rate(cpi, cm->width, cm->height);
      av2_rc_postencode_update(cpi, *size);
    }

    if (is_psnr_calc_enabled(cpi)) {
      int y_crop_width = !cm->derive_sef_order_hint
                             ? cm->ref_frame_map[cpi->existing_fb_idx_to_show]
                                   ->buf.y_crop_width
                             : cm->cur_frame->buf.y_crop_width;
      int y_crop_height = !cm->derive_sef_order_hint
                              ? cm->ref_frame_map[cpi->existing_fb_idx_to_show]
                                    ->buf.y_crop_height
                              : cm->cur_frame->buf.y_crop_height;
      cpi->source = realloc_and_scale_source(cpi, y_crop_width, y_crop_height);
    }

    ++current_frame->frame_number;

    return AVM_CODEC_OK;
  }
#endif  // CONFIG_F024_KEYOBU

#if CONFIG_F024_KEYOBU
  if (current_frame->frame_type == KEY_FRAME) {
    cm->is_leading_picture = -1;
    if (cpi->no_show_fwd_kf) {
      cpi->olk_encountered = 1;
      cm->last_olk_order_hint[cm->mlayer_id] = cm->current_frame.order_hint;
      cm->last_olk_disp_order_hint[cm->mlayer_id] =
          cm->current_frame.display_order_hint;
    } else {
      cpi->olk_encountered = 0;
    }
  } else {
    if (cm->last_olk_disp_order_hint[cm->mlayer_id] >
        cm->current_frame.display_order_hint)
      cm->is_leading_picture = 1;
    else {
      cm->is_leading_picture = 0;
    }  // !leading_picture
  }  // !KEYFRAME
#endif  // CONFIG_F024_KEYOBU

  // Work out whether to force_integer_mv this frame
  if (!is_stat_generation_stage(cpi) &&
      cpi->common.features.allow_screen_content_tools &&
      !frame_is_intra_only(cm)) {
    if (cpi->common.seq_params.force_integer_mv == 2) {
      // Adaptive mode: see what previous frame encoded did
      if (cpi->unscaled_last_source != NULL) {
        features->cur_frame_force_integer_mv = av2_is_integer_mv(
            cpi->source, cpi->unscaled_last_source, &cpi->force_intpel_info);
      } else {
        cpi->common.features.cur_frame_force_integer_mv = 0;
      }
    } else {
      cpi->common.features.cur_frame_force_integer_mv =
          cpi->common.seq_params.force_integer_mv;
    }
  } else {
    cpi->common.features.cur_frame_force_integer_mv = 0;
  }
  set_max_drl_bits(cpi);

  // Set various flags etc to special state if it is a key frame.
  if (frame_is_intra_only(cm) || frame_is_sframe(cm)) {
    // Reset the loop filter deltas and segmentation map.
    av2_reset_segment_features(cm);

    // If segmentation is enabled force a map update for key frames.
    if (seg->enabled) {
      seg->update_map = 1;
      seg->update_data = 1;
    }
  }
  if (tile_cfg->mtu == 0) {
    cpi->num_tg = tile_cfg->num_tile_groups;
  } else {
    // Use a default value for the purposes of weighting costs in probability
    // updates
    cpi->num_tg = DEFAULT_MAX_NUM_TG;
  }

  // For 1 pass CBR, check if we are dropping this frame.
  // Never drop on key frame.
  if (has_no_stats_stage(cpi) && oxcf->rc_cfg.mode == AVM_CBR &&
      current_frame->frame_type != KEY_FRAME) {
    if (av2_rc_drop_frame(cpi)) {
      av2_setup_frame_size(cpi);
      av2_rc_postencode_update_drop_frame(cpi);
      release_scaled_references(cpi);
      return AVM_CODEC_OK;
    }
  }

  if (oxcf->tune_cfg.tuning == AVM_TUNE_SSIM)
    av2_set_mb_ssim_rdmult_scaling(cpi);

#if CONFIG_TUNE_VMAF
  if (oxcf->tune_cfg.tuning == AVM_TUNE_VMAF_WITHOUT_PREPROCESSING ||
      oxcf->tune_cfg.tuning == AVM_TUNE_VMAF_MAX_GAIN ||
      oxcf->tune_cfg.tuning == AVM_TUNE_VMAF_NEG_MAX_GAIN) {
    av2_set_mb_vmaf_rdmult_scaling(cpi);
  }
#endif

  avm_clear_system_state();

  switch (oxcf->algo_cfg.cdf_update_mode) {
    case 0:  // No CDF update for any frames(4~6% compression loss).
      features->disable_cdf_update = 1;
      break;
    case 1:  // Enable CDF update for all frames.
      features->disable_cdf_update = 0;
      break;
    case 2:
      // Strategically determine at which frames to do CDF update.
      // Currently only enable CDF update for all-intra and no-show frames(1.5%
      // compression loss).
      // TODO(huisu@google.com): design schemes for various trade-offs between
      // compression quality and decoding speed.
      features->disable_cdf_update =
          (frame_is_intra_only(cm) || !cm->show_frame) ? 0 : 1;
      break;
  }
#if CONFIG_CWG_F270_CI_OBU
  cm->ci_params_encoder.ci_timing_info_present_flag &=
      !seq_params->single_picture_header_flag;
#else
  seq_params->timing_info_present &= !seq_params->single_picture_header_flag;
#endif  // CONFIG_CWG_F270_CI_OBU
  switch (oxcf->algo_cfg.cross_frame_cdf_init_mode) {
    case 0:  // Disable cross frame CDF initialization
      features->cross_frame_context = CROSS_FRAME_CONTEXT_DISABLED;
      break;
    case 1:  // Enable cross frame CDF initialization
    default: features->cross_frame_context = CROSS_FRAME_CONTEXT_FORWARD; break;
  }

  if (cpi->oxcf.tool_cfg.enable_global_motion && !frame_is_intra_only(cm)) {
    // Flush any stale global motion information, which may be left over
    // from a previous frame
    avm_invalidate_pyramid(cpi->source->y_pyramid);
    av2_invalidate_corner_list(cpi->source->corners);
  }
  int largest_tile_id = 0;
  if (encode_with_recode_loop_and_filter(cpi, size, dest, NULL, NULL,
                                         &largest_tile_id) != AVM_CODEC_OK) {
    return AVM_CODEC_ERROR;
  }

  cpi->seq_params_locked = 1;
  if (cpi->increase_fgm_counter) {
    assert(cm->fgm_id >= 0 && cm->fgm_id < MAX_FGM_NUM &&
           cpi->fgm.fgm_chroma_idc >= 0 && cpi->fgm.fgm_chroma_idc < 4);
    int fgm_pos = cpi->written_fgm_num % MAX_FGM_NUM;
    int valid_fgm_num = AVMMIN(cpi->written_fgm_num, MAX_FGM_NUM);
    for (int i = 0; i < valid_fgm_num; i++) {
      if (cpi->fgm_list[i].fgm_id == cm->fgm_id) {
        fgm_pos = i;
        break;
      }
    }
    cpi->fgm_list[fgm_pos] = cpi->fgm;
    cpi->written_fgm_num += 1;
  }

  if (cm->seg.enabled) {
    if (cm->seg.update_map) {
      update_reference_segmentation_map(cpi);
    } else if (cm->last_frame_seg_map) {
      memcpy(cm->cur_frame->seg_map, cm->last_frame_seg_map,
             cm->cur_frame->mi_cols * cm->cur_frame->mi_rows *
                 sizeof(*cm->cur_frame->seg_map));
    }
  }
  if (frame_is_intra_only(cm) == 0) {
    release_scaled_references(cpi);
  }

  // NOTE: Save the new show frame buffer index for --test-code=warn, i.e.,
  //       for the purpose to verify no mismatch between encoder and decoder.
  if (cm->show_frame) cpi->last_show_frame_buf = cm->cur_frame;
  if (cm->seq_params.enable_bru && !cm->bru.enabled &&
      cm->current_frame.frame_type == INTER_FRAME) {
    bru_lookahead_buf_refresh(cpi->lookahead,
                              cm->current_frame.refresh_frame_flags,
                              cm->ref_frame_map, ENCODE_STAGE);
  }

  refresh_reference_frames(cpi);
#if CONFIG_ENTROPY_STATS
  av2_accumulate_frame_counts(&aggregate_fc, &cpi->counts);
#endif  // CONFIG_ENTROPY_STATS
  if (!(features->tip_frame_mode == TIP_FRAME_AS_OUTPUT) &&
      !cm->bru.frame_inactive_flag && !cm->bridge_frame_info.is_bridge_frame) {
    if (cm->seq_params.enable_avg_cdf && cm->seq_params.avg_cdf_type &&
        cm->tiles.rows * cm->tiles.cols > 1) {
      encoder_avg_tiles_cdfs(cpi);
    } else {
      *cm->fc = cpi->tile_data[largest_tile_id].tctx;
    }
    av2_reset_cdf_symbol_counters(cm->fc);
  }

  cm->cur_frame->frame_context = *cm->fc;

#if CONFIG_COLLECT_COMPONENT_TIMING
  end_timing(cpi, encode_frame_to_data_rate_time);

  // Print out timing information.
  int i;
  fprintf(stderr, "\n Frame number: %d, Frame type: %s, Show Frame: %d\n",
          cm->current_frame.frame_number,
          get_frame_type_enum(cm->current_frame.frame_type), cm->show_frame);
  for (i = 0; i < kTimingComponents; i++) {
    cpi->component_time[i] += cpi->frame_component_time[i];
    fprintf(stderr, " %s:  %" PRId64 " us (total: %" PRId64 " us)\n",
            get_component_name(i), cpi->frame_component_time[i],
            cpi->component_time[i]);
    cpi->frame_component_time[i] = 0;
  }
#endif

  av2_rc_postencode_update(cpi, *size);

  // Clear the one shot update flags for segmentation map and mode/ref loop
  // filter deltas.
  cm->seg.update_map = 0;
  cm->seg.update_data = 0;

  // A droppable frame might not be shown but it always
  // takes a space in the gf group. Therefore, even when
  // it is not shown, we still need update the count down.
  if (cm->show_frame) {
    ++current_frame->frame_number;
  }

  // after change the tile info in the bru frame_inactive, reset the flag to
  // default and reset the tile info
  if (cm->bru.enabled && cm->bru.frame_inactive_flag) {
    cm->bru.frame_inactive_flag = 0;
    av2_set_tile_info(cm, &cpi->oxcf.tile_cfg);
  }

  return AVM_CODEC_OK;
}

int av2_encode(AV2_COMP *const cpi, uint8_t *const dest,
               const EncodeFrameInput *const frame_input,
               const EncodeFrameParams *const frame_params,
               EncodeFrameResults *const frame_results) {
  AV2_COMMON *const cm = &cpi->common;
  CurrentFrame *const current_frame = &cm->current_frame;

  cpi->unscaled_source = frame_input->source;
  cpi->source = frame_input->source;
  cpi->unscaled_last_source = frame_input->last_source;

  current_frame->refresh_frame_flags = frame_params->refresh_frame_flags;
  cm->current_frame.frame_type = frame_params->frame_type;
  cm->show_frame = frame_params->show_frame;
  cm->ref_frame_flags = frame_params->ref_frame_flags;
  cpi->speed = frame_params->speed;
#if CONFIG_F024_KEYOBU
  cpi->update_type_was_overlay =
      frame_params->frame_params_update_type_was_overlay;
  cpi->fb_idx_for_overlay = frame_params->fb_idx_for_overlay;
  cm->show_existing_frame = 0;
  cm->sef_ref_fb_idx = 0;
#else
  cm->show_existing_frame = frame_params->show_existing_frame;
  cpi->existing_fb_idx_to_show = frame_params->existing_fb_idx_to_show;
#endif
  memcpy(cm->remapped_ref_idx, frame_params->remapped_ref_idx,
         INTER_REFS_PER_FRAME * sizeof(*cm->remapped_ref_idx));

  // NOTE: frame_number is reset only for the CLK
  if (av2_is_shown_keyframe(cpi, current_frame->frame_type)
#if CONFIG_F024_KEYOBU
      && !cpi->update_type_was_overlay
#endif  // CONFIG_F024_KEYOBU
  ) {
    current_frame->key_frame_number += current_frame->frame_number;
    current_frame->frame_number = 0;
  }

  if (cpi->oxcf.kf_cfg.key_freq_min == 0 &&
      cpi->oxcf.kf_cfg.key_freq_max == 0 &&
      cpi->oxcf.unit_test_cfg.multi_seq_header_test)
    cm->seq_params.seq_header_id =
        current_frame->key_frame_number % MAX_SEQ_NUM;

#if CONFIG_F024_KEYOBU
  cm->current_frame.cm_obu_type = frame_params->frame_params_obu_type;
#endif  // CONFIG_F024_KEYOBU

  current_frame->order_hint =
      current_frame->frame_number + frame_params->order_offset;
  current_frame->display_order_hint = current_frame->order_hint;
  if (cpi->oxcf.ref_frm_cfg.enable_generation_sef_obu) {
    cm->show_existing_frame =
        frame_params->frame_params_update_type_was_overlay;
    cm->sef_ref_fb_idx = cpi->fb_idx_for_overlay;
  } else {
    cm->show_existing_frame = frame_params->duplicate_existing_frame;
  }
  // scan the reference list. if all the display_order_hint of the reference
  // frame is smaller than the current display_order_hint,
  // duplicate_existing_frame is not applicable.
  cm->derive_sef_order_hint = false;
  if (cm->show_existing_frame) {
    bool valid_duplicate_existing_frame = false;
    for (int ref_idx = 0; ref_idx < cm->seq_params.ref_frames; ref_idx++) {
      if (cm->ref_frame_map[ref_idx] != NULL) {
        if (!is_tlayer_scalable_and_dependent(
                &cm->seq_params, current_frame->temporal_layer_id,
                cm->ref_frame_map[ref_idx]->temporal_layer_id))
          continue;
        if (!is_mlayer_scalable_and_dependent(
                &cm->seq_params, current_frame->mlayer_id,
                cm->ref_frame_map[ref_idx]->mlayer_id))
          continue;
        if (cm->ref_frame_map[ref_idx]->display_order_hint >=
            current_frame->display_order_hint) {
          valid_duplicate_existing_frame = true;
          break;
        }
      }
    }
    if (!valid_duplicate_existing_frame) cm->show_existing_frame = 0;
  }

  if (cpi->oxcf.unit_test_cfg.sef_with_order_hint_test &&
      cm->show_existing_frame) {
    cm->sef_ref_fb_idx = 1;
  }

#if CONFIG_F322_OBUER_REFRESTRICT
  current_frame->display_order_hint_restricted = current_frame->order_hint;
#endif  // CONFIG_F322_OBUER_REFRESTRICT

  current_frame->pyramid_level = get_true_pyr_level(
      cpi->gf_group.layer_depth[cpi->gf_group.index],
#if CONFIG_F024_KEYOBU
      current_frame->frame_type == KEY_FRAME,
#else
      current_frame->display_order_hint,
#endif  // CONFIG_F024_KEYOBU
      cpi->gf_group.max_layer_depth,
      cpi->gf_group.update_type[cpi->gf_group.index] == KFFLT_OVERLAY_UPDATE);

  cm->tlayer_id = 0;
  current_frame->temporal_layer_id = cm->tlayer_id;
#if CONFIG_F322_OBUER_REFRESTRICT
  cm->restricted_prediction_switch =
      cpi->oxcf.kf_cfg.sframe_dist != 0 && cpi->oxcf.kf_cfg.sframe_mode == 0;
  if (current_frame->frame_type == KEY_FRAME) {
    for (int i = 0; i < cm->seq_params.ref_frames; i++) {
      if (cm->ref_frame_map[i] != NULL)
        cm->ref_frame_map[i]->is_restricted = false;
    }
  }

  if (cm->restricted_prediction_switch) {
    if (current_frame->frame_type == S_FRAME) {
      for (int i = 0; i < cm->seq_params.ref_frames; i++) {
        if (cm->ref_frame_map[i] != NULL)
          cm->ref_frame_map[i]->is_restricted = true;
      }
    }

    int ref_frame_safe_to_use = 0;
    // todo: check ref_frame_restricted how did it be used
    for (int i = 0; i < cm->seq_params.ref_frames; i++) {
      if (cm->ref_frame_map[i] != NULL) {
        bool ref_unrestricted = (current_frame->frame_type == S_FRAME ||
                                 current_frame->frame_type == KEY_FRAME ||
                                 current_frame->frame_type == INTRA_ONLY_FRAME)
                                    ? false
                                    : !cm->ref_frame_map[i]->is_restricted;
        ref_frame_safe_to_use |= ref_unrestricted << i;
      }
    }
    cm->ref_frame_flags &= ref_frame_safe_to_use;
  }
#endif  // CONFIG_F322_OBUER_REFRESTRICT
  const int order_offset = cpi->gf_group.arf_src_offset[cpi->gf_group.index];
  const int cur_frame_disp =
      cpi->common.current_frame.frame_number + order_offset;

  init_ref_map_pair(&cpi->common, cm->ref_frame_map_pairs,
                    current_frame->frame_type == KEY_FRAME,
                    cpi->switch_frame_mode == 1);
  if (cm->seq_params.enable_explicit_ref_frame_map || frame_is_sframe(cm)) {
    av2_get_ref_frames_enc(cpi, cur_frame_disp, cm->ref_frame_map_pairs);
  } else {
    // Derive reference mapping in a resolution independent manner to generate
    // parameters needed in write_frame_size_with_refs
    av2_get_ref_frames(cm, cur_frame_disp, 0, 0, cm->ref_frame_map_pairs);
    av2_get_ref_frames(cm, cur_frame_disp, 1, 0, cm->ref_frame_map_pairs);
  }
  current_frame->absolute_poc =
      current_frame->key_frame_number + current_frame->display_order_hint;
  if (current_frame->frame_type == KEY_FRAME) {
    current_frame->long_term_id = 0;
  } else {
    current_frame->long_term_id = -1;
  }
  current_frame->order_hint %=
      (1 << (cm->seq_params.order_hint_info.order_hint_bits_minus_1 + 1));

#if CONFIG_F322_OBUER_REFRESTRICT
  // Note this is placed here to keep the same pyramid_level
  if (current_frame->frame_type == S_FRAME) {
    current_frame->display_order_hint = current_frame->order_hint;
    current_frame->display_order_hint_restricted = current_frame->order_hint;
  }
#endif  // CONFIG_F322_OBUER_REFRESTRICT
  if (is_stat_generation_stage(cpi)) {
    av2_first_pass(cpi, frame_input->ts_duration);
  } else {
#if CONFIG_BITSTREAM_DEBUG
    assert(cpi->oxcf.max_threads <= 1 &&
           "bitstream debug tool does not support multithreading");
    bitstream_queue_record_write();
    avm_bitstream_queue_set_frame_write(
        (int)(derive_output_order_idx(cm, cm->cur_frame) * 2 + cm->show_frame));
#endif  // CONFIG_BITSTREAM_DEBUG
    const ResizeCfg *resize_cfg = &cpi->oxcf.resize_cfg;
    FeatureFlags *const features = &cm->features;
    const int current_frame_frame_number = cm->current_frame.frame_number;
    const bool current_disable_cdf_update = features->disable_cdf_update;
    const bool current_allow_lf_sub_pu = features->allow_lf_sub_pu;
    const bool current_allow_ref_frame_mvs = features->allow_ref_frame_mvs;
    const bool current_all_lossless = features->all_lossless;
    const OPTFLOW_REFINE_TYPE current_opfl_refine_type =
        features->opfl_refine_type;
    cm->bridge_frame_info.is_bridge_frame = 0;
    cm->bridge_frame_info.print_bridge_frame_in_log = 0;
    if ((resize_cfg->resize_mode == RESIZE_BRIDGE_FRAME_PATTERN) &&
        (cpi->gf_group.update_type[cpi->gf_group.index] != OVERLAY_UPDATE)) {
      int chunk_size = cm->bridge_frame_info.frame_count;
      if (chunk_size == 1) {
        cm->bridge_frame_info.is_bridge_frame = 1;
        cm->current_frame.display_order_hint = 0;
        cm->current_frame.absolute_poc = 0;
        cm->show_frame = 0;
        cm->showable_frame = 0;
        cm->show_existing_frame = 0;
#if CONFIG_F024_KEYOBU
        cm->sef_ref_fb_idx = 0;
#endif  // CONFIG_F024_KEYOBU
        cm->current_frame.order_hint = 0;
        cm->current_frame.frame_number = 0;
        cm->bridge_frame_info.bridge_frame_ref_idx = INVALID_IDX;
        cm->bridge_frame_info.bridge_frame_ref_idx_remapped = INVALID_IDX;
        cm->bridge_frame_info.print_bridge_frame_in_log = 1;
        features->allow_lf_sub_pu = false;
        features->disable_cdf_update = true;
        features->allow_ref_frame_mvs = false;
        features->all_lossless = false;
        features->opfl_refine_type = REFINE_NONE;
        for (int map_idx = 0; map_idx < cm->seq_params.ref_frames; map_idx++) {
          // Get reference frame buffer
          const RefCntBuffer *const buf = cm->ref_frame_map[map_idx];
#if CONFIG_F322_OBUER_REFRESTRICT
          if (buf != NULL && cm->ref_frame_map[map_idx]->is_restricted)
            continue;
#endif  // CONFIG_F322_OBUER_REFRESTRICT
          if (buf != NULL && buf->display_order_hint == 0) {
            cm->bridge_frame_info.bridge_frame_ref_idx = map_idx;

            cm->quant_params.base_qindex = buf->base_qindex;
            if (av2_num_planes(cm) > 1) {
              cm->quant_params.u_ac_delta_q = buf->u_ac_delta_q;
              cm->quant_params.v_ac_delta_q = buf->v_ac_delta_q;
            } else {
              cm->quant_params.v_ac_delta_q = cm->quant_params.u_ac_delta_q = 0;
            }
            cm->cur_frame->base_qindex = cm->quant_params.base_qindex;
            cm->cur_frame->u_ac_delta_q = cm->quant_params.u_ac_delta_q;
            cm->cur_frame->v_ac_delta_q = cm->quant_params.v_ac_delta_q;

            break;
          }
        }
        if (cm->bridge_frame_info.bridge_frame_ref_idx == INVALID_IDX) {
          avm_internal_error(&cm->error, AVM_CODEC_CORRUPT_FRAME,
                             "Cannot find bridge frame reference frame");
          return AVM_CODEC_ERROR;
        }
        cm->bridge_frame_info.bridge_frame_overwrite_flag = 1;
        cm->current_frame.refresh_frame_flags =
            (1 << cm->bridge_frame_info.bridge_frame_ref_idx);

        init_ref_map_pair(&cpi->common, cm->ref_frame_map_pairs,
                          current_frame->frame_type == KEY_FRAME,
                          cpi->switch_frame_mode == 1);

        // Derive reference mapping in a resolution independent manner to
        // generate parameters needed in write_frame_size_with_refs
        av2_get_ref_frames(cm, cur_frame_disp, 0, 0, cm->ref_frame_map_pairs);
        av2_get_ref_frames(cm, cur_frame_disp, 1, 0, cm->ref_frame_map_pairs);
      }
    }

    if (encode_frame_to_data_rate(cpi, &frame_results->size, dest) !=
        AVM_CODEC_OK) {
      return AVM_CODEC_ERROR;
    }
    cm->bridge_frame_info.frame_count++;
    if (cm->bridge_frame_info.is_bridge_frame) {
      features->disable_cdf_update = current_disable_cdf_update;
      features->allow_lf_sub_pu = current_allow_lf_sub_pu;
      features->allow_ref_frame_mvs = current_allow_ref_frame_mvs;
      features->all_lossless = current_all_lossless;
      features->opfl_refine_type = current_opfl_refine_type;
      cm->current_frame.frame_number = current_frame_frame_number;
      cm->bridge_frame_info.is_bridge_frame = 0;
    }
  }
  return AVM_CODEC_OK;
}

#if CONFIG_DENOISE
static int apply_denoise_2d(AV2_COMP *cpi, YV12_BUFFER_CONFIG *sd,
                            int block_size, float noise_level,
                            int64_t time_stamp, int64_t end_time) {
  AV2_COMMON *const cm = &cpi->common;
  if (!cpi->denoise_and_model) {
    cpi->denoise_and_model = avm_denoise_and_model_alloc(
        cm->seq_params.bit_depth, block_size, noise_level);
    if (!cpi->denoise_and_model) {
      avm_internal_error(&cm->error, AVM_CODEC_MEM_ERROR,
                         "Error allocating denoise and model");
      return -1;
    }
  }
  if (!cpi->film_grain_table) {
    cpi->film_grain_table = avm_malloc(sizeof(*cpi->film_grain_table));
    if (!cpi->film_grain_table) {
      avm_internal_error(&cm->error, AVM_CODEC_MEM_ERROR,
                         "Error allocating grain table");
      return -1;
    }
    memset(cpi->film_grain_table, 0, sizeof(*cpi->film_grain_table));
  }
  if (avm_denoise_and_model_run(cpi->denoise_and_model, sd,
                                &cm->film_grain_params)) {
    if (cm->film_grain_params.apply_grain) {
      cm->film_grain_params.block_size =
          cpi->oxcf.tune_cfg.film_grain_block_size;
      avm_film_grain_table_append(cpi->film_grain_table, time_stamp, end_time,
                                  &cm->film_grain_params);
    }
  }
  return 0;
}
#endif

int av2_receive_raw_frame(AV2_COMP *cpi, avm_enc_frame_flags_t frame_flags,
                          YV12_BUFFER_CONFIG *sd, int64_t time_stamp,
                          int64_t end_time) {
  AV2_COMMON *const cm = &cpi->common;
  const SequenceHeader *const seq_params = &cm->seq_params;
  int res = 0;
  const int subsampling_x = sd->subsampling_x;
  const int subsampling_y = sd->subsampling_y;

#if CONFIG_TUNE_VMAF
  if (!is_stat_generation_stage(cpi) &&
      cpi->oxcf.tune_cfg.tuning == AVM_TUNE_VMAF_WITH_PREPROCESSING) {
    av2_vmaf_frame_preprocessing(cpi, sd);
  }
  if (!is_stat_generation_stage(cpi) &&
      cpi->oxcf.tune_cfg.tuning == AVM_TUNE_VMAF_MAX_GAIN) {
    av2_vmaf_blk_preprocessing(cpi, sd);
  }
#endif

#if CONFIG_INTERNAL_STATS
  struct avm_usec_timer timer;
  avm_usec_timer_start(&timer);
#endif
#if CONFIG_DENOISE
  if (cpi->oxcf.noise_level > 0)
    if (apply_denoise_2d(cpi, sd, cpi->oxcf.noise_block_size,
                         cpi->oxcf.noise_level, time_stamp, end_time) < 0)
      res = -1;
#endif  //  CONFIG_DENOISE

  const int order_offset = cpi->gf_group.arf_src_offset[cpi->gf_group.index];
  const int disp_order_hint = (cm->current_frame.frame_number + order_offset);
  if (av2_lookahead_push(cpi->lookahead, sd, time_stamp, end_time,
                         disp_order_hint, frame_flags, cpi->alloc_pyramid))
    res = -1;
#if CONFIG_INTERNAL_STATS
  avm_usec_timer_mark(&timer);
  cpi->time_receive_data += avm_usec_timer_elapsed(&timer);
#endif
  // Note: Regarding profile setting, the following checks are added to help
  // choose a proper profile for the input video. The criterion is that all
  // bitstreams must be designated as the lowest profile that match its content.
  // E.G. A bitstream that contains 4:4:4 video must be designated as High
  // Profile in the seq header, and likewise a bitstream that contains 4:2:2
  // bitstream must be designated as Professional Profile in the sequence
  // header.
  if ((seq_params->profile == PROFILE_0) && !seq_params->monochrome &&
      (subsampling_x != 1 || subsampling_y != 1)) {
    avm_internal_error(&cm->error, AVM_CODEC_INVALID_PARAM,
                       "Non-4:2:0 color format requires profile 1 or 2");
    res = -1;
  }
  if ((seq_params->profile == PROFILE_1) &&
      !(subsampling_x == 0 && subsampling_y == 0)) {
    avm_internal_error(&cm->error, AVM_CODEC_INVALID_PARAM,
                       "Profile 1 requires 4:4:4 color format");
    res = -1;
  }
  if ((seq_params->profile == PROFILE_2) &&
      (seq_params->bit_depth <= AVM_BITS_10) &&
      !(subsampling_x == 1 && subsampling_y == 0)) {
    avm_internal_error(&cm->error, AVM_CODEC_INVALID_PARAM,
                       "Profile 2 bit-depth <= 10 requires 4:2:2 color format");
    res = -1;
  }

  return res;
}

#if CONFIG_INTERNAL_STATS
extern double av2_get_blockiness(const unsigned char *img1, int img1_pitch,
                                 const unsigned char *img2, int img2_pitch,
                                 int width, int height);

static void adjust_image_stat(double y, double u, double v, double all,
                              ImageStat *s) {
  s->stat[STAT_Y] += y;
  s->stat[STAT_U] += u;
  s->stat[STAT_V] += v;
  s->stat[STAT_ALL] += all;
  s->worst = AVMMIN(s->worst, all);
}

static void compute_internal_stats(AV2_COMP *cpi, int frame_bytes) {
  AV2_COMMON *const cm = &cpi->common;
  const uint32_t in_bit_depth = cpi->oxcf.input_cfg.input_bit_depth;
  const uint32_t bit_depth = cpi->td.mb.e_mbd.bd;

#if CONFIG_INTER_STATS_ONLY
  if (cm->current_frame.frame_type == KEY_FRAME) return;  // skip key frame
#endif
  cpi->bytes += frame_bytes;
  if (cm->show_frame) {
    const YV12_BUFFER_CONFIG *orig = cpi->source;
    const YV12_BUFFER_CONFIG *recon =
        cpi->common.show_existing_frame
            ? &cpi->common.ref_frame_map[cpi->common.sef_ref_fb_idx]->buf
            : &cpi->common.cur_frame->buf;
    double y, u, v, frame_all;

    cpi->count[0]++;
    cpi->count[1]++;
    if (cpi->b_calculate_psnr) {
      PSNR_STATS psnr;
      double frame_ssim2 = 0.0, weight = 0.0;
      avm_clear_system_state();
      avm_calc_highbd_psnr(orig, recon, &psnr, bit_depth, in_bit_depth,
                           is_lossless_requested(&cpi->oxcf.rc_cfg));
      adjust_image_stat(psnr.psnr[1], psnr.psnr[2], psnr.psnr[3], psnr.psnr[0],
                        &(cpi->psnr[0]));
      cpi->total_sq_error[0] += psnr.sse[0];
      cpi->total_samples[0] += psnr.samples[0];
      frame_ssim2 =
          avm_highbd_calc_ssim(orig, recon, &weight, bit_depth, in_bit_depth);

      cpi->worst_ssim = AVMMIN(cpi->worst_ssim, frame_ssim2);
      cpi->summed_quality += frame_ssim2 * weight;
      cpi->summed_weights += weight;

      // Compute PSNR based on stream bit depth
      if (in_bit_depth < bit_depth) {
        adjust_image_stat(psnr.psnr_hbd[1], psnr.psnr_hbd[2], psnr.psnr_hbd[3],
                          psnr.psnr_hbd[0], &cpi->psnr[1]);
        cpi->total_sq_error[1] += psnr.sse_hbd[0];
        cpi->total_samples[1] += psnr.samples_hbd[0];
      }
    }

    frame_all =
        avm_calc_fastssim(orig, recon, &y, &u, &v, bit_depth, in_bit_depth);
    adjust_image_stat(y, u, v, frame_all, &cpi->fastssim);
    frame_all = avm_psnrhvs(orig, recon, &y, &u, &v, bit_depth, in_bit_depth);
    adjust_image_stat(y, u, v, frame_all, &cpi->psnrhvs);
  }
}
#endif  // CONFIG_INTERNAL_STATS

int av2_get_compressed_data(AV2_COMP *cpi, unsigned int *frame_flags,
                            size_t *size, uint8_t *dest, int64_t *time_stamp,
                            int64_t *time_end, int flush,
                            const avm_rational64_t *timestamp_ratio) {
  const AV2EncoderConfig *const oxcf = &cpi->oxcf;
  AV2_COMMON *const cm = &cpi->common;
  cm->cur_mfh_id = oxcf->tool_cfg.enable_mfh_obu_signaling ? 1 : 0;
  cm->showable_frame = 0;
  *size = 0;
#if CONFIG_INTERNAL_STATS
  struct avm_usec_timer cmptimer;
  avm_usec_timer_start(&cmptimer);
#endif

  av2_set_high_precision_mv(cpi, MV_PRECISION_ONE_EIGHTH_PEL);

  // Normal defaults
  cm->features.cross_frame_context =
      (oxcf->tool_cfg.frame_parallel_decoding_mode)
          ? CROSS_FRAME_CONTEXT_DISABLED
          : CROSS_FRAME_CONTEXT_FORWARD;

  // Initialize fields related to forward keyframes
  cpi->no_show_fwd_kf = 0;
  check_ref_count_status_enc(cpi);
  if (assign_cur_frame_new_fb(cm) == NULL) return AVM_CODEC_ERROR;

  const int result =
      av2_encode_strategy(cpi, size, dest, frame_flags, time_stamp, time_end,
                          timestamp_ratio, flush);
  if (result == -1) {
    // Returning -1 indicates no frame encoded; more input is required
    return -1;
  }
  if (result != AVM_CODEC_OK) {
    return AVM_CODEC_ERROR;
  }
#if CONFIG_INTERNAL_STATS
  avm_usec_timer_mark(&cmptimer);
  cpi->time_compress_data += avm_usec_timer_elapsed(&cmptimer);
#endif  // CONFIG_INTERNAL_STATS
  if (cpi->b_calculate_psnr) {
    if (
#if CONFIG_F024_KEYOBU
        cpi->update_type_was_overlay ||
#else
        cm->show_existing_frame ||
#endif
        (*size > 0 && !is_stat_generation_stage(cpi) && cm->show_frame)) {
      generate_psnr_packet(cpi);
    }
  }

  if (cpi->level_params.keep_level_stats && !is_stat_generation_stage(cpi)) {
    // Initialize level info. at the beginning of each sequence.
    if (av2_is_shown_keyframe(cpi, cm->current_frame.frame_type)) {
      av2_init_level_info(cpi);
    }
    av2_update_level_info(cpi, *size, *time_stamp, *time_end);
  }

#if CONFIG_INTERNAL_STATS
  if (!is_stat_generation_stage(cpi)) {
    compute_internal_stats(cpi, (int)(*size));
  }
#endif  // CONFIG_INTERNAL_STATS
#if CONFIG_SPEED_STATS
  if (!is_stat_generation_stage(cpi) && !cm->show_existing_frame) {
    cpi->tx_search_count += cpi->td.mb.txfm_search_info.tx_search_count;
    cpi->td.mb.txfm_search_info.tx_search_count = 0;
  }
#endif  // CONFIG_SPEED_STATS

  avm_clear_system_state();

  return AVM_CODEC_OK;
}

int av2_get_preview_raw_frame(AV2_COMP *cpi, YV12_BUFFER_CONFIG *dest) {
  AV2_COMMON *cm = &cpi->common;
  if (!cm->show_frame) {
    return -1;
  } else {
    int ret;
    if (cm->cur_frame != NULL) {
      *dest = cm->cur_frame->buf;
      dest->y_width = cm->width;
      dest->y_height = cm->height;
      dest->uv_width = cm->width >> cm->seq_params.subsampling_x;
      dest->uv_height = cm->height >> cm->seq_params.subsampling_y;
      ret = 0;
    } else {
      ret = -1;
    }
    avm_clear_system_state();
    return ret;
  }
}

int av2_get_last_show_frame(AV2_COMP *cpi, YV12_BUFFER_CONFIG *frame) {
  if (cpi->last_show_frame_buf == NULL) return -1;

  *frame = cpi->last_show_frame_buf->buf;
  return 0;
}

avm_codec_err_t av2_copy_new_frame_enc(AV2_COMMON *cm,
                                       YV12_BUFFER_CONFIG *new_frame,
                                       YV12_BUFFER_CONFIG *sd) {
  const int num_planes = av2_num_planes(cm);
  if (!equal_dimensions_and_border(new_frame, sd))
    avm_internal_error(&cm->error, AVM_CODEC_ERROR,
                       "Incorrect buffer dimensions");
  else
    avm_yv12_copy_frame(new_frame, sd, num_planes);

  return cm->error.error_code;
}

int av2_set_internal_size(AV2EncoderConfig *const oxcf,
                          ResizePendingParams *resize_pending_params,
                          AVM_SCALING horiz_mode, AVM_SCALING vert_mode) {
  int hr = 0, hs = 0, vr = 0, vs = 0;

  if (horiz_mode > ONETWO || vert_mode > ONETWO) return -1;

  Scale2Ratio(horiz_mode, &hr, &hs);
  Scale2Ratio(vert_mode, &vr, &vs);

  // always go to the next whole number
  resize_pending_params->width = (hs - 1 + oxcf->frm_dim_cfg.width * hr) / hs;
  resize_pending_params->height = (vs - 1 + oxcf->frm_dim_cfg.height * vr) / vs;

  if (horiz_mode != NORMAL || vert_mode != NORMAL) {
    oxcf->resize_cfg.resize_mode = RESIZE_FIXED;
    oxcf->algo_cfg.enable_tpl_model = 0;
  }
  return 0;
}

int av2_get_quantizer(AV2_COMP *cpi) {
  return cpi->common.quant_params.base_qindex;
}

int av2_convert_sect5obus_to_annexb(uint8_t *buffer, size_t *frame_size) {
  size_t output_size = 0;
  size_t total_bytes_read = 0;
  size_t remaining_size = *frame_size;
  uint8_t *buff_ptr = buffer;

  // go through each OBUs
  while (total_bytes_read < *frame_size) {
    uint8_t saved_obu_header[2];
    uint64_t obu_payload_size;
    size_t length_of_payload_size;
    size_t length_of_obu_size;
    uint32_t obu_header_size = (buff_ptr[0] >> 7) & 0x1 ? 2 : 1;
    size_t obu_bytes_read = obu_header_size;  // bytes read for current obu

    // save the obu header (1 or 2 bytes)
    memmove(saved_obu_header, buff_ptr, obu_header_size);

    // get the payload_size and length of payload_size
    if (avm_uleb_decode(buff_ptr + obu_header_size, remaining_size,
                        &obu_payload_size, &length_of_payload_size) != 0) {
      return AVM_CODEC_ERROR;
    }
    obu_bytes_read += length_of_payload_size;

    // calculate the length of size of the obu header plus payload
    length_of_obu_size =
        avm_uleb_size_in_bytes((uint64_t)(obu_header_size + obu_payload_size));

    // move the rest of data to new location
    memmove(buff_ptr + length_of_obu_size + obu_header_size,
            buff_ptr + obu_bytes_read, remaining_size - obu_bytes_read);
    obu_bytes_read += (size_t)obu_payload_size;

    // write the new obu size
    const uint64_t obu_size = obu_header_size + obu_payload_size;
    size_t coded_obu_size;
    if (avm_uleb_encode(obu_size, sizeof(obu_size), buff_ptr,
                        &coded_obu_size) != 0) {
      return AVM_CODEC_ERROR;
    }

    // write the saved (modified) obu_header following obu size
    memmove(buff_ptr + length_of_obu_size, saved_obu_header, obu_header_size);

    total_bytes_read += obu_bytes_read;
    remaining_size -= obu_bytes_read;
    buff_ptr += length_of_obu_size + obu_size;
    output_size += length_of_obu_size + (size_t)obu_size;
  }

  *frame_size = output_size;
  return AVM_CODEC_OK;
}

void av2_apply_encoding_flags(AV2_COMP *cpi, avm_enc_frame_flags_t flags) {
  // TODO(yunqingwang): For what references to use, external encoding flags
  // should be consistent with internal reference frame selection. Need to
  // ensure that there is not conflict between the two. In AV2 encoder, the
  // priority rank for 7 reference frames are: LAST, ALTREF, LAST2, LAST3,
  // GOLDEN, BWDREF, ALTREF2.

  ExternalFlags *const ext_flags = &cpi->ext_flags;
  ExtRefreshFrameFlagsInfo *const ext_refresh_frame_flags =
      &ext_flags->refresh_frame;
  ext_flags->ref_frame_flags = AVM_REFFRAME_ALL;

  if (flags & AVM_EFLAG_NO_UPD_ALL) {
    ext_refresh_frame_flags->all_ref_frames = 0;
    ext_refresh_frame_flags->update_pending = 1;
  } else {
    ext_refresh_frame_flags->all_ref_frames = 1;
    ext_refresh_frame_flags->update_pending = 0;
  }

  ext_flags->use_ref_frame_mvs = cpi->oxcf.tool_cfg.enable_ref_frame_mvs &
                                 ((flags & AVM_EFLAG_NO_REF_FRAME_MVS) == 0);
  ext_flags->use_s_frame =
      cpi->oxcf.kf_cfg.enable_sframe | ((flags & AVM_EFLAG_SET_S_FRAME) != 0);
  ext_flags->use_primary_ref_none =
      (flags & AVM_EFLAG_SET_PRIMARY_REF_NONE) != 0;
}

avm_fixed_buf_t *av2_get_global_headers(AV2_COMP *cpi) {
  if (!cpi) return NULL;

  uint8_t header_buf[512] = { 0 };
  const uint32_t sequence_header_size =
      av2_write_sequence_header_obu(&cpi->common.seq_params, &header_buf[0]);
  assert(sequence_header_size <= sizeof(header_buf));
  if (sequence_header_size == 0) return NULL;

  uint8_t obu_header[2];
  const uint32_t obu_header_size = av2_write_obu_header(
      &cpi->level_params, OBU_SEQUENCE_HEADER, 0, 0, &obu_header[0]);
  const uint32_t obu_size = obu_header_size + sequence_header_size;
  const size_t size_field_size = avm_uleb_size_in_bytes(obu_size);
  const size_t payload_offset = size_field_size + obu_header_size;

  if (payload_offset + sequence_header_size > sizeof(header_buf)) return NULL;
  memmove(&header_buf[payload_offset], &header_buf[0], sequence_header_size);
  memcpy(&header_buf[size_field_size], &obu_header[0], obu_header_size);

  size_t coded_size_field_size = 0;
  if (avm_uleb_encode(obu_size, size_field_size, &header_buf[0],
                      &coded_size_field_size) != 0) {
    return NULL;
  }
  assert(coded_size_field_size == size_field_size);

  avm_fixed_buf_t *global_headers =
      (avm_fixed_buf_t *)malloc(sizeof(*global_headers));
  if (!global_headers) return NULL;

  const size_t global_header_buf_size =
      obu_header_size + size_field_size + sequence_header_size;

  global_headers->buf = malloc(global_header_buf_size);
  if (!global_headers->buf) {
    free(global_headers);
    return NULL;
  }

  memcpy(global_headers->buf, &header_buf[0], global_header_buf_size);
  global_headers->sz = global_header_buf_size;
  return global_headers;
}

void enc_bru_swap_ref(AV2_COMMON *const cm) {
  RefScoreData *scores = (RefScoreData *)cm->bru.ref_scores;
  // restrict ref by bru ref_idx
  int replaced_bru_ref_idx = -1;
  const int num_past_refs = cm->ref_frames_info.num_past_refs;
  if (cm->seq_params.enable_bru) {
    if (cm->bru.enabled) {
      if (cm->bru.ref_disp_order >= 0) {
        cm->bru.update_ref_idx = -1;
        cm->bru.explicit_ref_idx = -1;
        for (int i = 0; i < num_past_refs; i++) {
          const int ref_list_disp_order =
              cm->ref_frame_map[cm->remapped_ref_idx[i]]->display_order_hint;
          if (ref_list_disp_order == cm->bru.ref_disp_order) {
            cm->bru.update_ref_idx = i;
            cm->bru.explicit_ref_idx = cm->remapped_ref_idx[i];
            break;
          }
        }
        // happend in encoder only, decoder do not know bru.ref_order yet
        if (cm->bru.update_ref_idx == -1) {
          for (int i = num_past_refs; i < REF_FRAMES; i++) {
            const int ref_list_disp_order =
                cm->ref_frame_map[scores[i].index]->display_order_hint;
            if (ref_list_disp_order == cm->bru.ref_disp_order) {
              replaced_bru_ref_idx = i;
              break;
            }
          }
        }
      }

      // start to swap
      if (replaced_bru_ref_idx >= 0) {
        cm->remapped_ref_idx[cm->ref_frames_info.num_total_refs - 1] =
            scores[replaced_bru_ref_idx].index;
        cm->ref_frames_info
            .ref_frame_distance[cm->ref_frames_info.num_total_refs - 1] =
            scores[replaced_bru_ref_idx].distance;
        RefScoreData tmp_score = scores[cm->ref_frames_info.num_total_refs - 1];
        scores[cm->ref_frames_info.num_total_refs - 1] =
            scores[replaced_bru_ref_idx];
        scores[replaced_bru_ref_idx] = tmp_score;
        cm->bru.update_ref_idx = cm->ref_frames_info.num_total_refs - 1;
        cm->bru.explicit_ref_idx =
            cm->remapped_ref_idx[cm->ref_frames_info.num_total_refs - 1];
        av2_get_past_future_cur_ref_lists(cm, cm->bru.ref_scores);
        assert(cm->bru.explicit_ref_idx >= 0 && cm->bru.update_ref_idx >= 0);
      }
    }

    // Fill any slots that are empty (should only happen for the first 7 frames)
    for (int i = 0; i < INTER_REFS_PER_FRAME; i++) {
      if (cm->remapped_ref_idx[i] == INVALID_IDX) cm->remapped_ref_idx[i] = 0;
    }
  }
}

void enc_bru_swap_stage(AV2_COMP *cpi) {
  AV2_COMMON *cm = &cpi->common;
  if (cm->bru.enabled) {
    if (bru_swap_common(cm) == NULL) {
      avm_internal_error(&cm->error, AVM_CODEC_ERROR,
                         "Encoder BRU swap stage error");
    } else {
      // here need to update refresh flag for all the pointer to bru ref
      int refresh_mask = 0;
      for (int idx = 0; idx < cpi->common.seq_params.ref_frames; ++idx) {
        if (cm->ref_frame_map_pairs[idx].disp_order == cm->bru.ref_disp_order) {
          refresh_mask |= (1 << idx);
        }
      }
      cm->current_frame.refresh_frame_flags |= refresh_mask;
      // add additional assignment for the encoder to avoid issues
      for (int plane = 0; plane < CCSO_NUM_COMPONENTS; plane++) {
        if (cm->bru.frame_inactive_flag) {
          cm->ccso_info.reuse_ccso[plane] = 0;
          cm->ccso_info.sb_reuse_ccso[plane] = 0;
          cm->ccso_info.ccso_ref_idx[plane] = UINT8_MAX;
          cm->ccso_info.ccso_enable[plane] = 0;
          cm->cur_frame->ccso_info.reuse_ccso[plane] = 0;
          cm->cur_frame->ccso_info.sb_reuse_ccso[plane] = 0;
          cm->cur_frame->ccso_info.ccso_ref_idx[plane] = UINT8_MAX;
          cm->cur_frame->ccso_info.ccso_enable[plane] = 0;
          continue;
        }
      }
    }
  }
}
