blob: 12168c1a612b50496c3826263b777069d943e4a0 [file] [log] [blame]
/*
* 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_