| /* |
| * Copyright (c) 2021, Alliance for Open Media. All rights reserved. |
| * |
| * This source code is subject to the terms of the BSD 2 Clause License and |
| * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| * was not distributed with this source code in the LICENSE file, you can |
| * obtain it at www.aomedia.org/license/software. 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 www.aomedia.org/license/patent. |
| */ |
| |
| #ifndef AOM_AV1_ENCODER_TXB_RDOPT_H_ |
| #define AOM_AV1_ENCODER_TXB_RDOPT_H_ |
| |
| #include "av1/common/blockd.h" |
| #include "av1/common/txb_common.h" |
| #include "av1/encoder/encoder.h" |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| /*!\brief Adjust the magnitude of quantized coefficients to achieve better |
| * rate-distortion (RD) trade-off. |
| * |
| * \ingroup coefficient_coding |
| * |
| * This function goes through each coefficient and greedily choose to lower |
| * the coefficient magnitude by 1 or not based on the RD score. |
| * |
| * The coefficients are processing in reversed scan order. |
| * |
| * Note that, the end of block position (eob) may change if the original last |
| * coefficient is lowered to zero. |
| * |
| * \param[in] cpi Top-level encoder structure |
| * \param[in] x Pointer to structure holding the data for the |
| current encoding macroblock |
| * \param[in] plane The index of the current plane |
| * \param[in] block The index of the current transform block in the |
| * \param[in] tx_size The transform size |
| * \param[in] tx_type The transform type |
| * \param[in] txb_ctx Context info for entropy coding transform block |
| * skip flag (tx_skip) and the sign of DC coefficient (dc_sign). |
| * \param[out] rate_cost The entropy cost of coding the transform block |
| * after adjustment of coefficients. |
| * \param[in] sharpness When sharpness > 0, the function will be less |
| * aggressive towards lowering the magnitude of coefficients. |
| * In this way, the transform block will contain more high-frequency |
| * coefficients and therefore will preserve the sharpness of the reconstructed |
| * block. |
| */ |
| int av1_optimize_txb(const struct AV1_COMP *cpi, MACROBLOCK *x, int plane, |
| int block, TX_SIZE tx_size, TX_TYPE tx_type, |
| const TXB_CTX *const txb_ctx, int *rate_cost, |
| int sharpness); |
| |
| /*!\brief Compute the entropy cost of coding coefficients in a transform block. |
| * |
| * \ingroup coefficient_coding |
| * |
| * \param[in] x Pointer to structure holding the data for |
| the current encoding macroblock. |
| * \param[in] plane The index of the current plane. |
| * \param[in] block The index of the current transform block |
| in the |
| * macroblock. It's defined by number of 4x4 units that have been coded before |
| * the currernt transform block. |
| * \param[in] tx_size The transform size. |
| * \param[in] tx_type The transform type. |
| * \param[in] txb_ctx Context info for entropy coding transform |
| block |
| * skip flag (tx_skip) and the sign of DC coefficient (dc_sign). |
| * \param[in] reduced_tx_set_used Whether the transform type is chosen from |
| * a reduced set. |
| */ |
| int av1_cost_coeffs_txb(const MACROBLOCK *x, const int plane, const int block, |
| const TX_SIZE tx_size, const TX_TYPE tx_type, |
| const TXB_CTX *const txb_ctx, int reduced_tx_set_used); |
| |
| /*!\brief Estimate the entropy cost of coding a transform block using Laplacian |
| * distribution. |
| * |
| * \ingroup coefficient_coding |
| * |
| * This function compute the entropy costs of the end of block position (eob) |
| * and the transform type (tx_type) precisely. |
| * |
| * Then using \ref av1_cost_coeffs_txb_estimate to estimate the entropy costs |
| * of coefficients in the transform block. |
| * |
| * In the end, the function returns the sum of entropy costs of end of block |
| * position (eob), transform type (tx_type) and coefficients. |
| * |
| * Compared to \ref av1_cost_coeffs_txb, this function is much faster but less |
| * accurate. |
| * |
| * \param[in] x Pointer to structure holding the data for the |
| current encoding macroblock |
| * \param[in] plane The index of the current plane |
| * \param[in] block The index of the current transform block in the |
| * macroblock. It's defined by number of 4x4 units that have been coded before |
| * the currernt transform block |
| * \param[in] tx_size The transform size |
| * \param[in] tx_type The transform type |
| * \param[in] txb_ctx Context info for entropy coding transform block |
| * skip flag (tx_skip) and the sign of DC coefficient (dc_sign). |
| * \param[in] reduced_tx_set_used Whether the transform type is chosen from |
| * a reduced set. |
| * \param[in] adjust_eob Whether to adjust the end of block position |
| (eob) |
| * or not. |
| * \return int Estimated entropy cost of coding the transform |
| block. |
| */ |
| int av1_cost_coeffs_txb_laplacian(const MACROBLOCK *x, const int plane, |
| const int block, const TX_SIZE tx_size, |
| const TX_TYPE tx_type, |
| const TXB_CTX *const txb_ctx, |
| const int reduced_tx_set_used, |
| const int adjust_eob); |
| |
| /*!\brief Estimate the entropy cost of transform coefficients using Laplacian |
| * distribution. |
| * |
| * \ingroup coefficient_coding |
| * |
| * This function assumes each transform coefficient is of its own Laplacian |
| * distribution and the coefficient is the only observation of the Laplacian |
| * distribution. |
| * |
| * Based on that, each coefficient's coding cost can be estimated by computing |
| * the entropy of the corresponding Laplacian distribution. |
| * |
| * This function then return the sum of the estimated entropy cost for all |
| * coefficients in the transform block. |
| * |
| * Note that the entropy cost of end of block (eob) and transform type (tx_type) |
| * are not included. |
| * |
| * \param[in] x Pointer to structure holding the data for the |
| current encoding macroblock |
| * \param[in] plane The index of the current plane |
| * \param[in] block The index of the current transform block in the |
| * macroblock. It's defined by number of 4x4 units that have been coded before |
| * the currernt transform block |
| * \param[in] tx_size The transform size |
| * \param[in] tx_type The transform type |
| * \return int Estimated entropy cost of coefficients in the |
| * transform block. |
| */ |
| int av1_cost_coeffs_txb_estimate(const MACROBLOCK *x, const int plane, |
| const int block, const TX_SIZE tx_size, |
| const TX_TYPE tx_type); |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif // AOM_AV1_ENCODER_TXB_RDOPT_H_ |