/* | |

* 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_ |