tor-browser

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

encodetxb.h (11074B)


      1 /*
      2 * Copyright (c) 2017, 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_ENCODETXB_H_
     13 #define AOM_AV1_ENCODER_ENCODETXB_H_
     14 
     15 #include "config/aom_config.h"
     16 
     17 #include "av1/common/av1_common_int.h"
     18 #include "av1/common/blockd.h"
     19 #include "av1/common/txb_common.h"
     20 #include "av1/encoder/block.h"
     21 #include "av1/encoder/encoder.h"
     22 #include "aom_dsp/bitwriter.h"
     23 #ifdef __cplusplus
     24 extern "C" {
     25 #endif
     26 
     27 /*!\cond */
     28 #define TXB_SKIP_CTX_MASK 15
     29 #define DC_SIGN_CTX_SHIFT 4
     30 #define DC_SIGN_CTX_MASK 3
     31 
     32 int av1_get_eob_pos_token(const int eob, int *const extra);
     33 
     34 /*!\endcond */
     35 /*!\brief Allocate the memory resources for all the macro blocks in the current
     36 * coding frame.
     37 * \ingroup coefficient_coding
     38 *
     39 * Each macro block will need a \ref CB_COEFF_BUFFER to store information for
     40 * rate-distortion optimization and entropy coding of transform coefficients.
     41 *
     42 * \param[in]    cpi            Top-level encoder structure
     43 */
     44 void av1_alloc_txb_buf(AV1_COMP *cpi);
     45 /*!\brief Free the memory resources for all the macro blocks in the current
     46 * coding frame.
     47 * \ingroup coefficient_coding
     48 *
     49 * See \ref av1_alloc_txb_buf and \ref CB_COEFF_BUFFER for more details.
     50 *
     51 * \param[in]    cpi            Top-level encoder structure
     52 */
     53 void av1_free_txb_buf(AV1_COMP *cpi);
     54 
     55 /*!\brief Write quantized coefficients in a transform block into bitstream using
     56 * entropy coding.
     57 *
     58 * \ingroup coefficient_coding
     59 *
     60 * This function will write the quantized coefficients in a transform block into
     61 * the bitstream using entropy coding.
     62 *
     63 * The coding steps are as follows.
     64 *
     65 * 1) Code the end of block position "eob", which is the scan index of the
     66 * last non-zero coefficient plus one.
     67 *
     68 * 2) Code the lower magnitude level (<= COEFF_BASE_RANGE + NUM_BASE_LEVELS)
     69 * for each coefficient in reversed scan order.
     70 *
     71 * 3) Code the sign and higher magnitude level
     72 * (> COEFF_BASE_RANGE + NUM_BASE_LEVELS) in forward scan order.
     73 *
     74 * \param[in]    cm             Top-level structure shared by encoder and
     75 * decoder
     76 * \param[in]    x              Pointer to structure holding the data for the
     77                                current encoding macroblock
     78 * \param[in]    w              Entropy coding write pointer
     79 * \param[in]    blk_row      The row index of the current transform block
     80 * in the macroblock. Each unit has 4 pixels in y plane
     81 * \param[in]    blk_col      The col index of the current transform block
     82 * in the macroblock. Each unit has 4 pixels in y plane
     83 * \param[in]    plane          The index of the current plane
     84 * \param[in]    block          The index of the current transform block in the
     85 * macroblock. It's defined by number of 4x4 units that have been coded before
     86 * the currernt transform block
     87 * \param[in]    tx_size        The given transform size
     88 */
     89 void av1_write_coeffs_txb(const AV1_COMMON *const cm, MACROBLOCK *const x,
     90                          aom_writer *w, int blk_row, int blk_col, int plane,
     91                          int block, TX_SIZE tx_size);
     92 
     93 /*!\brief Write quantized coefficients of all transform blocks in an intra
     94 * macroblock into the bitstream using entropy coding.
     95 *
     96 * \ingroup coefficient_coding
     97 *
     98 * All transform blocks in the intra macroblock share the same transform size.
     99 *
    100 * This function use \ref av1_write_coeffs_txb() to code each transform block in
    101 * raster order.
    102 *
    103 * \param[in]    cm             Top-level structure shared by encoder and
    104 * decoder
    105 * \param[in]    x              Pointer to structure holding the data for the
    106                                current encoding macroblock
    107 * \param[in]    w              Entropy coding write pointer
    108 * \param[in]    bsize          Block size of the current macroblock
    109 */
    110 void av1_write_intra_coeffs_mb(const AV1_COMMON *const cm, MACROBLOCK *x,
    111                               aom_writer *w, BLOCK_SIZE bsize);
    112 
    113 /*!\brief Pack the context info of the current transform block into an uint8_t.
    114 * \ingroup coefficient_coding
    115 *
    116 * This context info will be collected and consolidated by its neighbor
    117 * transform blocks for coding transform block skip flag (tx_skip) and
    118 * the sign of DC coefficient (dc_sign).
    119 *
    120 * \param[in]    qcoeff         Buffer of quantized coefficients
    121 * \param[in]    scan_order     Coding order of coefficients in the transform
    122 * block
    123 * \param[in]    eob            The scan index of last non-zero coefficient plus
    124 * one
    125 */
    126 uint8_t av1_get_txb_entropy_context(const tran_low_t *qcoeff,
    127                                    const SCAN_ORDER *scan_order, int eob);
    128 
    129 /*!\brief Update the probability model (cdf) and the entropy context related to
    130 * coefficient coding for all transform blocks in the intra macroblock.
    131 *
    132 * \ingroup coefficient_coding
    133 *
    134 * This function will go through each transform block in the intra macorblock
    135 * and call \ref av1_update_and_record_txb_context to update the probability
    136 * model and entropy context properly.
    137 *
    138 * \param[in]    cpi               Top-level encoder structure
    139 * \param[in]    td                Top-level multithreading structure
    140 * \param[in]    dry_run           Whether this is a dry run.
    141 * \param[in]    bsize             Block size of the current macroblock
    142 * \param[in]    allow_update_cdf  Allowed to update probability model (cdf) or
    143 * not.
    144 */
    145 void av1_update_intra_mb_txb_context(const AV1_COMP *cpi, ThreadData *td,
    146                                     RUN_TYPE dry_run, BLOCK_SIZE bsize,
    147                                     uint8_t allow_update_cdf);
    148 
    149 /*!\brief Update the probability model (cdf) and the entropy context related to
    150 * coefficient coding for a transform block.
    151 *
    152 * \ingroup coefficient_coding
    153 *
    154 * There are regular mode and dry run for this funtion.
    155 *
    156 * Regular mode:
    157 *
    158 * The probability model (cdf) for each coding symbol in the
    159 * transform block will be updated.
    160 *
    161 * The entropy context of this transform block will be updated.
    162 *
    163 * Dry run:
    164 *
    165 * The probability model update will be skipped.
    166 *
    167 * The entropy context of this transform block will be updated.
    168 *
    169 * \param[in]    plane        The index of the current plane.
    170 * \param[in]    block        The index of the current transform block in the
    171 * macroblock. It's defined by number of 4x4 units that have been coded before
    172 * the currernt transform block.
    173 * \param[in]    blk_row      The row index of the current transform block
    174 * in the macroblock. Each unit has 4 pixels in y plane.
    175 * \param[in]    blk_col      The col index of the current transform block
    176 * in the macroblock. Each unit has 4 pixels in y plane.
    177 * \param[in]    plane_bsize  Block size for this plane. When the video source
    178 * uses chroma subsampling, the block size of UV planes will be smaller than the
    179 * block size of Y plane.
    180 * \param[in]    tx_size      The given transform size.
    181 * \param[in]    arg          This parameter will be translated into
    182 * tokenize_b_args, in which RUN_TYPE indicates using regular mode or dry run.
    183 */
    184 void av1_update_and_record_txb_context(int plane, int block, int blk_row,
    185                                       int blk_col, BLOCK_SIZE plane_bsize,
    186                                       TX_SIZE tx_size, void *arg);
    187 
    188 /*!\brief Update the entropy context related to coefficient coding for a
    189 * transform block.
    190 *
    191 * \ingroup coefficient_coding
    192 *
    193 * There are regular mode and dry run for this function.
    194 *
    195 * Regular mode:
    196 *
    197 * The entropy context of this transform block will be updated.
    198 *
    199 * Dry run:
    200 *
    201 * The probability model update will be skipped.
    202 *
    203 * The entropy context of this transform block will be updated.
    204 *
    205 * \param[in]    plane        The index of the current plane.
    206 * \param[in]    block        The index of the current transform block in the
    207 * macroblock. It's defined by number of 4x4 units that have been coded before
    208 * the currernt transform block.
    209 * \param[in]    blk_row      The row index of the current transform block
    210 * in the macroblock. Each unit has 4 pixels in y plane.
    211 * \param[in]    blk_col      The col index of the current transform block
    212 * in the macroblock. Each unit has 4 pixels in y plane.
    213 * \param[in]    plane_bsize  Block size for this plane. When the video source
    214 * uses chroma subsampling, the block size of UV planes will be smaller than the
    215 * block size of Y plane.
    216 * \param[in]    tx_size      The given transform size.
    217 * \param[in]    arg          This parameter will be translated into
    218 * tokenize_b_args, in which RUN_TYPE indicates using regular mode or dry run.
    219 */
    220 void av1_record_txb_context(int plane, int block, int blk_row, int blk_col,
    221                            BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg);
    222 
    223 /*!\brief Get the corresponding \ref CB_COEFF_BUFFER of the current macro block.
    224 *
    225 * \ingroup coefficient_coding
    226 *
    227 * The macroblock's location is described by mi_row and mi_col, row and column
    228 * mi indexes in the coding frame.
    229 *
    230 * Each mi unit is a 4x4 pixel block.
    231 *
    232 * \param[in]    cpi               Top-level encoder structure.
    233 * \param[in]    mi_row            Row mi index of the current transform block
    234 * in the frame.
    235 * \param[in]    mi_col           Column mi index of the current transform
    236 * block in the frame.
    237 * \return       CB_COEFF_BUFFER*  Pointer of \ref CB_COEFF_BUFFER associated
    238 * to this macroblock.
    239 */
    240 CB_COEFF_BUFFER *av1_get_cb_coeff_buffer(const struct AV1_COMP *cpi, int mi_row,
    241                                         int mi_col);
    242 
    243 /*!\brief Returns the entropy cost associated with skipping the current
    244 * transform block.
    245 *
    246 * \ingroup coefficient_coding
    247 *
    248 * \param[in]    coeff_costs    Table of entropy cost for coefficient coding.
    249 * \param[in]    txb_ctx        Context info for entropy coding transform block
    250 * skip flag (tx_skip) and the sign of DC coefficient (dc_sign).
    251 * \param[in]    plane          The index of the current plane
    252 * \param[in]    tx_size        The transform size
    253 */
    254 static inline int av1_cost_skip_txb(const CoeffCosts *coeff_costs,
    255                                    const TXB_CTX *const txb_ctx, int plane,
    256                                    TX_SIZE tx_size) {
    257  const TX_SIZE txs_ctx = get_txsize_entropy_ctx(tx_size);
    258  const PLANE_TYPE plane_type = get_plane_type(plane);
    259  const LV_MAP_COEFF_COST *const coeff_costs_ =
    260      &coeff_costs->coeff_costs[txs_ctx][plane_type];
    261  return coeff_costs_->txb_skip_cost[txb_ctx->txb_skip_ctx][1];
    262 }
    263 
    264 /*!\cond */
    265 // These numbers are empirically obtained.
    266 static const int plane_rd_mult[REF_TYPES][PLANE_TYPES] = {
    267  { 17, 13 },
    268  { 16, 10 },
    269 };
    270 /*!\endcond */
    271 
    272 #ifdef __cplusplus
    273 }
    274 #endif
    275 
    276 #endif  // AOM_AV1_ENCODER_ENCODETXB_H_