tor-browser

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

aq_cyclicrefresh.h (10737B)


      1 /*
      2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved.
      3 *
      4 * This source code is subject to the terms of the BSD 2 Clause License and
      5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
      6 * was not distributed with this source code in the LICENSE file, you can
      7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open
      8 * Media Patent License 1.0 was not distributed with this source code in the
      9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
     10 */
     11 
     12 #ifndef AOM_AV1_ENCODER_AQ_CYCLICREFRESH_H_
     13 #define AOM_AV1_ENCODER_AQ_CYCLICREFRESH_H_
     14 
     15 #include "av1/common/blockd.h"
     16 #include "av1/encoder/block.h"
     17 #include "av1/encoder/tokenize.h"
     18 
     19 #ifdef __cplusplus
     20 extern "C" {
     21 #endif
     22 
     23 // The segment ids used in cyclic refresh: from base (no boost) to increasing
     24 // boost (higher delta-qp).
     25 #define CR_SEGMENT_ID_BASE 0
     26 #define CR_SEGMENT_ID_BOOST1 1
     27 #define CR_SEGMENT_ID_BOOST2 2
     28 
     29 // Maximum rate target ratio for setting segment delta-qp.
     30 #define CR_MAX_RATE_TARGET_RATIO 4.0
     31 
     32 /*!
     33 * \brief The stucture of CYCLIC_REFRESH.
     34 * \ingroup cyclic_refresh
     35 */
     36 struct CYCLIC_REFRESH {
     37  /*!
     38   * Percentage of blocks per frame that are targeted as candidates
     39   * for cyclic refresh.
     40   */
     41  int percent_refresh;
     42 
     43  /*!
     44   * Active adjustment delta for cyclic refresh for rate control.
     45   */
     46  int percent_refresh_adjustment;
     47 
     48  /*!
     49   * Maximum q-delta as percentage of base q.
     50   */
     51  int max_qdelta_perc;
     52  /*!
     53   *Superblock starting index for cycling through the frame.
     54   */
     55  int sb_index;
     56  /*!
     57   *Superblock index cyclic refresh index last frame
     58   */
     59  int last_sb_index;
     60  /*!
     61   * Controls how long block will need to wait to be refreshed again, in
     62   * excess of the cycle time, i.e., in the case of all zero motion, block
     63   * will be refreshed every (100/percent_refresh + time_for_refresh) frames.
     64   */
     65  int time_for_refresh;
     66  /*!
     67   * Target number of (4x4) blocks that are set for delta-q.
     68   */
     69  int target_num_seg_blocks;
     70  /*!
     71   * Actual number of (4x4) blocks that were applied delta-q,
     72   * for segment 1.
     73   */
     74  int actual_num_seg1_blocks;
     75  /*!
     76   * Actual number of (4x4) blocks that were applied delta-q,
     77   * for segment 2.
     78   */
     79  int actual_num_seg2_blocks;
     80  /*!
     81   * RD mult. parameters for segment 1.
     82   */
     83  int rdmult;
     84  /*!
     85   * Cyclic refresh map.
     86   */
     87  int8_t *map;
     88  /*!
     89   * Threshold applied to the projected rate of the coding block,
     90   * when deciding whether block should be refreshed.
     91   */
     92  int64_t thresh_rate_sb;
     93  /*!
     94   * Threshold applied to the projected distortion of the coding block,
     95   * when deciding whether block should be refreshed.
     96   */
     97  int64_t thresh_dist_sb;
     98  /*!
     99   * Threshold applied to the motion vector (in units of 1/8 pel) of the
    100   * coding block, when deciding whether block should be refreshed.
    101   */
    102  int16_t motion_thresh;
    103  /*!
    104   * Rate target ratio to set q delta.
    105   */
    106  double rate_ratio_qdelta;
    107 
    108  /*!
    109   * Active adjustment of qdelta rate ratio for enhanced rate control
    110   */
    111  double rate_ratio_qdelta_adjustment;
    112 
    113  /*!
    114   * Boost factor for rate target ratio, for segment CR_SEGMENT_ID_BOOST2.
    115   */
    116  int rate_boost_fac;
    117 
    118  /*!\cond */
    119  int qindex_delta[3];
    120  int apply_cyclic_refresh;
    121  int skip_over4x4;
    122  int counter_encode_maxq_scene_change;
    123  int use_block_sad_scene_det;
    124  /*!\endcond */
    125 };
    126 
    127 struct AV1_COMP;
    128 
    129 typedef struct CYCLIC_REFRESH CYCLIC_REFRESH;
    130 
    131 CYCLIC_REFRESH *av1_cyclic_refresh_alloc(int mi_rows, int mi_cols);
    132 
    133 void av1_cyclic_refresh_free(CYCLIC_REFRESH *cr);
    134 
    135 /*!\brief Estimate the bits, incorporating the delta-q from the segments.
    136 *
    137 * For the just encoded frame, estimate the bits, incorporating the delta-q
    138 * from non-base segment(s). Note this function is called in the postencode
    139 * (called from rc_update_rate_correction_factors()).
    140 *
    141 * \ingroup cyclic_refresh
    142 * \callgraph
    143 * \callergraph
    144 *
    145 * \param[in]       cpi               Top level encoder structure
    146 * \param[in]       correction_factor rate correction factor
    147 *
    148 * \return Return the estimated bits at given q.
    149 */
    150 int av1_cyclic_refresh_estimate_bits_at_q(const struct AV1_COMP *cpi,
    151                                          double correction_factor);
    152 
    153 /*!\brief Estimate the bits per mb, for given q = i and delta-q.
    154 *
    155 * Prior to encoding the frame, estimate the bits per mb, for a given q = i and
    156 * a corresponding delta-q (for segment 1). This function is called in the
    157 * rc_regulate_q() to set the base qp index. Note: the segment map is set to
    158 * either 0/CR_SEGMENT_ID_BASE (no refresh) or to 1/CR_SEGMENT_ID_BOOST1
    159 * (refresh) for each superblock, prior to encoding.
    160 *
    161 * \ingroup cyclic_refresh
    162 * \callgraph
    163 * \callergraph
    164 *
    165 * \param[in]       cpi               Top level encoder structure
    166 * \param[in]       i                 q index
    167 * \param[in]       correction_factor rate correction factor
    168 *
    169 * \return Return the estimated bits for q = i and delta-q (segment 1).
    170 */
    171 int av1_cyclic_refresh_rc_bits_per_mb(const struct AV1_COMP *cpi, int i,
    172                                      double correction_factor);
    173 
    174 /*!\brief Update segment_id for blocks are skipped.
    175 *
    176 * After encoding a given prediction block, of size bsize at (mi_row, mi_col),
    177 * check if we should reset the segment_id based on skip_txfm,
    178 * and update the cyclic_refresh map and segmentation counters.
    179 *
    180 * \ingroup cyclic_refresh
    181 * \callgraph
    182 * \callergraph
    183 *
    184 * \param[in]   cpi       Top level encoder structure
    185 * \param[in]   x         Pointer to MACROBLOCK structure
    186 * \param[in]   mi_row    Row coordinate of the block in a step size of MI_SIZE
    187 * \param[in]   mi_col    Col coordinate of the block in a step size of MI_SIZE
    188 * \param[in]   bsize     Block size
    189 * \param[in]   dry_run   A code indicating whether it is part of the final
    190 *                        pass for reconstructing the superblock
    191 *
    192 * \remark Update the \c mbmi->segment_id, the \c cpi->cyclic_refresh and
    193 * the \c cm->cpi->enc_seg.map.
    194 */
    195 
    196 void av1_cyclic_reset_segment_skip(const struct AV1_COMP *cpi,
    197                                   MACROBLOCK *const x, int mi_row, int mi_col,
    198                                   BLOCK_SIZE bsize, RUN_TYPE dry_run);
    199 
    200 /*!\brief Update segment_id for block based on mode selected.
    201 *
    202 * Prior to coding a given prediction block, of size bsize at (mi_row, mi_col),
    203 * check if we should reset the segment_id (based on mode/motion/skip selected
    204 * for that block) and update the cyclic_refresh map and segmentation map.
    205 *
    206 * \ingroup cyclic_refresh
    207 * \callgraph
    208 * \callergraph
    209 *
    210 * \param[in]   cpi       Top level encoder structure
    211 * \param[in]   x         Pointer to MACROBLOCK structure
    212 * \param[in]   mi_row    Row coordinate of the block in a step size of MI_SIZE
    213 * \param[in]   mi_col    Col coordinate of the block in a step size of MI_SIZE
    214 * \param[in]   bsize     Block size
    215 * \param[in]   rate      Projected block rate from pickmode
    216 * \param[in]   dist      Projected block dist from pickmode
    217 * \param[in]   skip      Skip flag set from picmode
    218 * \param[in]   dry_run   A code indicating whether it is part of the final
    219 *                         pass for reconstructing the superblock
    220 *
    221 * \remark Update the \c mbmi->segment_id, the \c cpi->cyclic_refresh and
    222 * the \c cm->cpi->enc_seg.map.
    223 */
    224 void av1_cyclic_refresh_update_segment(const struct AV1_COMP *cpi,
    225                                       MACROBLOCK *const x, int mi_row,
    226                                       int mi_col, BLOCK_SIZE bsize,
    227                                       int64_t rate, int64_t dist, int skip,
    228                                       RUN_TYPE dry_run);
    229 
    230 /*!\brief Initialize counters used for cyclic refresh.
    231 *
    232 * Initializes cyclic refresh counters actual_num_seg1_blocks and
    233 * actual_num_seg2_blocks.
    234 *
    235 * \ingroup cyclic_refresh
    236 * \callgraph
    237 * \callergraph
    238 *
    239 * \param[in]   x         Pointer to MACROBLOCK structure
    240 *
    241 * \remark Update the \c x->actual_num_seg1_blocks and the
    242 * \c x->actual_num_seg2_blocks.
    243 */
    244 void av1_init_cyclic_refresh_counters(MACROBLOCK *const x);
    245 
    246 /*!\brief Accumulate cyclic refresh counters.
    247 *
    248 * Accumulates cyclic refresh counters actual_num_seg1_blocks and
    249 * actual_num_seg2_blocks from MACROBLOCK strcture to CYCLIC_REFRESH strcture.
    250 *
    251 * \ingroup cyclic_refresh
    252 * \callgraph
    253 * \callergraph
    254 *
    255 * \param[in]   cyclic_refresh Pointer to CYCLIC_REFRESH structure
    256 * \param[in]   x              Pointer to MACROBLOCK structure
    257 *
    258 * \remark Update the \c cyclic_refresh->actual_num_seg1_blocks and the
    259 * \c cyclic_refresh->actual_num_seg2_blocks.
    260 */
    261 void av1_accumulate_cyclic_refresh_counters(
    262    CYCLIC_REFRESH *const cyclic_refresh, const MACROBLOCK *const x);
    263 
    264 /*!\brief Set golden frame update interval nased on cyclic refresh.
    265 *
    266 * \ingroup cyclic_refresh
    267 * \callgraph
    268 * \callergraph
    269 *
    270 * \param[in]   cpi       Top level encoder structure
    271 *
    272 * \remark Returns the interval in \c cpi->rc.baseline_gf_interval.
    273 */
    274 void av1_cyclic_refresh_set_golden_update(struct AV1_COMP *const cpi);
    275 
    276 /*!\brief Set the global/frame level parameters for cyclic refresh.
    277 *
    278 * First call to the cyclic refresh, before encoding the frame.
    279 * Sets the flag on whether cyclic refresh should be applied, sets
    280 * the amount/percent of refresh, and the amount of boost applied to
    281 * the two segments (set by rate_ratio_qdelta and rate_boost_fac).
    282 *
    283 * \ingroup cyclic_refresh
    284 * \callgraph
    285 * \callergraph
    286 *
    287 * \param[in]       cpi          Top level encoder structure
    288 *
    289 * \remark Updates the \c cpi->cyclic_refresh with the settings.
    290 */
    291 void av1_cyclic_refresh_update_parameters(struct AV1_COMP *const cpi);
    292 
    293 /*!\brief Setup the cyclic background refresh.
    294 *
    295 * Set the delta q for the segment(s), and set the segmentation map.
    296 *
    297 * \ingroup cyclic_refresh
    298 * \callgraph
    299 * \callergraph
    300 *
    301 * \param[in]       cpi          Top level encoder structure
    302 *
    303 * \remark Updates the \c cpi->cyclic_refresh with the cyclic refresh
    304 * parameters and the \c cm->seg with the segmentation data.
    305 */
    306 void av1_cyclic_refresh_setup(struct AV1_COMP *const cpi);
    307 
    308 int av1_cyclic_refresh_get_rdmult(const CYCLIC_REFRESH *cr);
    309 
    310 int av1_cyclic_refresh_disable_lf_cdef(struct AV1_COMP *const cpi);
    311 
    312 static inline int cyclic_refresh_segment_id_boosted(int segment_id) {
    313  return segment_id == CR_SEGMENT_ID_BOOST1 ||
    314         segment_id == CR_SEGMENT_ID_BOOST2;
    315 }
    316 
    317 static inline int cyclic_refresh_segment_id(int segment_id) {
    318  if (segment_id == CR_SEGMENT_ID_BOOST1)
    319    return CR_SEGMENT_ID_BOOST1;
    320  else if (segment_id == CR_SEGMENT_ID_BOOST2)
    321    return CR_SEGMENT_ID_BOOST2;
    322  else
    323    return CR_SEGMENT_ID_BASE;
    324 }
    325 
    326 #ifdef __cplusplus
    327 }  // extern "C"
    328 #endif
    329 
    330 #endif  // AOM_AV1_ENCODER_AQ_CYCLICREFRESH_H_