1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
/*
* 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_
|