xref: /aosp_15_r20/external/libvpx/vp9/encoder/vp9_block.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP9_ENCODER_VP9_BLOCK_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP9_ENCODER_VP9_BLOCK_H_
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_blockd.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropymv.h"
16*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_entropy.h"
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
19*fb1b10abSAndroid Build Coastguard Worker extern "C" {
20*fb1b10abSAndroid Build Coastguard Worker #endif
21*fb1b10abSAndroid Build Coastguard Worker 
22*fb1b10abSAndroid Build Coastguard Worker typedef struct {
23*fb1b10abSAndroid Build Coastguard Worker   unsigned int sse;
24*fb1b10abSAndroid Build Coastguard Worker   int sum;
25*fb1b10abSAndroid Build Coastguard Worker   unsigned int var;
26*fb1b10abSAndroid Build Coastguard Worker } Diff;
27*fb1b10abSAndroid Build Coastguard Worker 
28*fb1b10abSAndroid Build Coastguard Worker struct macroblock_plane {
29*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, int16_t, src_diff[64 * 64]);
30*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *qcoeff;
31*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *coeff;
32*fb1b10abSAndroid Build Coastguard Worker   uint16_t *eobs;
33*fb1b10abSAndroid Build Coastguard Worker   struct buf_2d src;
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker   // Quantizer settings
36*fb1b10abSAndroid Build Coastguard Worker   int16_t *round_fp;
37*fb1b10abSAndroid Build Coastguard Worker   int16_t *quant_fp;
38*fb1b10abSAndroid Build Coastguard Worker   int16_t *quant;
39*fb1b10abSAndroid Build Coastguard Worker   int16_t *quant_shift;
40*fb1b10abSAndroid Build Coastguard Worker   int16_t *zbin;
41*fb1b10abSAndroid Build Coastguard Worker   int16_t *round;
42*fb1b10abSAndroid Build Coastguard Worker 
43*fb1b10abSAndroid Build Coastguard Worker   int64_t quant_thred[2];
44*fb1b10abSAndroid Build Coastguard Worker };
45*fb1b10abSAndroid Build Coastguard Worker 
46*fb1b10abSAndroid Build Coastguard Worker /* The [2] dimension is for whether we skip the EOB node (i.e. if previous
47*fb1b10abSAndroid Build Coastguard Worker  * coefficient in this block was zero) or not. */
48*fb1b10abSAndroid Build Coastguard Worker typedef unsigned int vp9_coeff_cost[PLANE_TYPES][REF_TYPES][COEF_BANDS][2]
49*fb1b10abSAndroid Build Coastguard Worker                                    [COEFF_CONTEXTS][ENTROPY_TOKENS];
50*fb1b10abSAndroid Build Coastguard Worker 
51*fb1b10abSAndroid Build Coastguard Worker typedef struct {
52*fb1b10abSAndroid Build Coastguard Worker   int_mv ref_mvs[MAX_REF_FRAMES][MAX_MV_REF_CANDIDATES];
53*fb1b10abSAndroid Build Coastguard Worker   uint8_t mode_context[MAX_REF_FRAMES];
54*fb1b10abSAndroid Build Coastguard Worker } MB_MODE_INFO_EXT;
55*fb1b10abSAndroid Build Coastguard Worker 
56*fb1b10abSAndroid Build Coastguard Worker typedef struct {
57*fb1b10abSAndroid Build Coastguard Worker   int col_min;
58*fb1b10abSAndroid Build Coastguard Worker   int col_max;
59*fb1b10abSAndroid Build Coastguard Worker   int row_min;
60*fb1b10abSAndroid Build Coastguard Worker   int row_max;
61*fb1b10abSAndroid Build Coastguard Worker } MvLimits;
62*fb1b10abSAndroid Build Coastguard Worker 
63*fb1b10abSAndroid Build Coastguard Worker typedef struct macroblock MACROBLOCK;
64*fb1b10abSAndroid Build Coastguard Worker struct macroblock {
65*fb1b10abSAndroid Build Coastguard Worker // cf. https://bugs.chromium.org/p/webm/issues/detail?id=1054
66*fb1b10abSAndroid Build Coastguard Worker #if defined(_MSC_VER) && _MSC_VER < 1900
67*fb1b10abSAndroid Build Coastguard Worker   int64_t bsse[MAX_MB_PLANE << 2];
68*fb1b10abSAndroid Build Coastguard Worker #endif
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker   struct macroblock_plane plane[MAX_MB_PLANE];
71*fb1b10abSAndroid Build Coastguard Worker 
72*fb1b10abSAndroid Build Coastguard Worker   MACROBLOCKD e_mbd;
73*fb1b10abSAndroid Build Coastguard Worker   MB_MODE_INFO_EXT *mbmi_ext;
74*fb1b10abSAndroid Build Coastguard Worker   MB_MODE_INFO_EXT *mbmi_ext_base;
75*fb1b10abSAndroid Build Coastguard Worker   int skip_block;
76*fb1b10abSAndroid Build Coastguard Worker   int select_tx_size;
77*fb1b10abSAndroid Build Coastguard Worker   int skip_recode;
78*fb1b10abSAndroid Build Coastguard Worker   int skip_optimize;
79*fb1b10abSAndroid Build Coastguard Worker   int q_index;
80*fb1b10abSAndroid Build Coastguard Worker   double log_block_src_var;
81*fb1b10abSAndroid Build Coastguard Worker   int block_tx_domain;
82*fb1b10abSAndroid Build Coastguard Worker 
83*fb1b10abSAndroid Build Coastguard Worker   // The equivalent error at the current rdmult of one whole bit (not one
84*fb1b10abSAndroid Build Coastguard Worker   // bitcost unit).
85*fb1b10abSAndroid Build Coastguard Worker   int errorperbit;
86*fb1b10abSAndroid Build Coastguard Worker   // The equivalent SAD error of one (whole) bit at the current quantizer
87*fb1b10abSAndroid Build Coastguard Worker   // for large blocks.
88*fb1b10abSAndroid Build Coastguard Worker   int sadperbit16;
89*fb1b10abSAndroid Build Coastguard Worker   // The equivalent SAD error of one (whole) bit at the current quantizer
90*fb1b10abSAndroid Build Coastguard Worker   // for sub-8x8 blocks.
91*fb1b10abSAndroid Build Coastguard Worker   int sadperbit4;
92*fb1b10abSAndroid Build Coastguard Worker   int rddiv;
93*fb1b10abSAndroid Build Coastguard Worker   int rdmult;
94*fb1b10abSAndroid Build Coastguard Worker   int cb_rdmult;
95*fb1b10abSAndroid Build Coastguard Worker   int segment_id;
96*fb1b10abSAndroid Build Coastguard Worker   int mb_energy;
97*fb1b10abSAndroid Build Coastguard Worker 
98*fb1b10abSAndroid Build Coastguard Worker   // These are set to their default values at the beginning, and then adjusted
99*fb1b10abSAndroid Build Coastguard Worker   // further in the encoding process.
100*fb1b10abSAndroid Build Coastguard Worker   BLOCK_SIZE min_partition_size;
101*fb1b10abSAndroid Build Coastguard Worker   BLOCK_SIZE max_partition_size;
102*fb1b10abSAndroid Build Coastguard Worker 
103*fb1b10abSAndroid Build Coastguard Worker   int mv_best_ref_index[MAX_REF_FRAMES];
104*fb1b10abSAndroid Build Coastguard Worker   unsigned int max_mv_context[MAX_REF_FRAMES];
105*fb1b10abSAndroid Build Coastguard Worker   unsigned int source_variance;
106*fb1b10abSAndroid Build Coastguard Worker   unsigned int pred_sse[MAX_REF_FRAMES];
107*fb1b10abSAndroid Build Coastguard Worker   int pred_mv_sad[MAX_REF_FRAMES];
108*fb1b10abSAndroid Build Coastguard Worker 
109*fb1b10abSAndroid Build Coastguard Worker   int nmvjointcost[MV_JOINTS];
110*fb1b10abSAndroid Build Coastguard Worker   int *nmvcost[2];
111*fb1b10abSAndroid Build Coastguard Worker   int *nmvcost_hp[2];
112*fb1b10abSAndroid Build Coastguard Worker   int **mvcost;
113*fb1b10abSAndroid Build Coastguard Worker 
114*fb1b10abSAndroid Build Coastguard Worker   int nmvjointsadcost[MV_JOINTS];
115*fb1b10abSAndroid Build Coastguard Worker   int *nmvsadcost[2];
116*fb1b10abSAndroid Build Coastguard Worker   int *nmvsadcost_hp[2];
117*fb1b10abSAndroid Build Coastguard Worker   int **mvsadcost;
118*fb1b10abSAndroid Build Coastguard Worker 
119*fb1b10abSAndroid Build Coastguard Worker   // sharpness is used to disable skip mode and change rd_mult
120*fb1b10abSAndroid Build Coastguard Worker   int sharpness;
121*fb1b10abSAndroid Build Coastguard Worker 
122*fb1b10abSAndroid Build Coastguard Worker   // aq mode is used to adjust rd based on segment.
123*fb1b10abSAndroid Build Coastguard Worker   int adjust_rdmult_by_segment;
124*fb1b10abSAndroid Build Coastguard Worker 
125*fb1b10abSAndroid Build Coastguard Worker   // These define limits to motion vector components to prevent them
126*fb1b10abSAndroid Build Coastguard Worker   // from extending outside the UMV borders
127*fb1b10abSAndroid Build Coastguard Worker   MvLimits mv_limits;
128*fb1b10abSAndroid Build Coastguard Worker 
129*fb1b10abSAndroid Build Coastguard Worker   // Notes transform blocks where no coefficients are coded.
130*fb1b10abSAndroid Build Coastguard Worker   // Set during mode selection. Read during block encoding.
131*fb1b10abSAndroid Build Coastguard Worker   uint8_t zcoeff_blk[TX_SIZES][256];
132*fb1b10abSAndroid Build Coastguard Worker 
133*fb1b10abSAndroid Build Coastguard Worker   // Accumulate the tx block eobs in a partition block.
134*fb1b10abSAndroid Build Coastguard Worker   int32_t sum_y_eobs[TX_SIZES];
135*fb1b10abSAndroid Build Coastguard Worker 
136*fb1b10abSAndroid Build Coastguard Worker   int skip;
137*fb1b10abSAndroid Build Coastguard Worker 
138*fb1b10abSAndroid Build Coastguard Worker   int encode_breakout;
139*fb1b10abSAndroid Build Coastguard Worker 
140*fb1b10abSAndroid Build Coastguard Worker   // note that token_costs is the cost when eob node is skipped
141*fb1b10abSAndroid Build Coastguard Worker   vp9_coeff_cost token_costs[TX_SIZES];
142*fb1b10abSAndroid Build Coastguard Worker 
143*fb1b10abSAndroid Build Coastguard Worker   int optimize;
144*fb1b10abSAndroid Build Coastguard Worker 
145*fb1b10abSAndroid Build Coastguard Worker   // indicate if it is in the rd search loop or encoding process
146*fb1b10abSAndroid Build Coastguard Worker   int use_lp32x32fdct;
147*fb1b10abSAndroid Build Coastguard Worker   int skip_encode;
148*fb1b10abSAndroid Build Coastguard Worker 
149*fb1b10abSAndroid Build Coastguard Worker   // In first pass, intra prediction is done based on source pixels
150*fb1b10abSAndroid Build Coastguard Worker   // at tile boundaries
151*fb1b10abSAndroid Build Coastguard Worker   int fp_src_pred;
152*fb1b10abSAndroid Build Coastguard Worker 
153*fb1b10abSAndroid Build Coastguard Worker   // use fast quantization process
154*fb1b10abSAndroid Build Coastguard Worker   int quant_fp;
155*fb1b10abSAndroid Build Coastguard Worker 
156*fb1b10abSAndroid Build Coastguard Worker   // skip forward transform and quantization
157*fb1b10abSAndroid Build Coastguard Worker   uint8_t skip_txfm[MAX_MB_PLANE << 2];
158*fb1b10abSAndroid Build Coastguard Worker #define SKIP_TXFM_NONE 0
159*fb1b10abSAndroid Build Coastguard Worker // TODO(chengchen): consider remove SKIP_TXFM_AC_DC from vp9 completely
160*fb1b10abSAndroid Build Coastguard Worker // since it increases risks of bad perceptual quality.
161*fb1b10abSAndroid Build Coastguard Worker // https://crbug.com/webm/1729
162*fb1b10abSAndroid Build Coastguard Worker #define SKIP_TXFM_AC_DC 1
163*fb1b10abSAndroid Build Coastguard Worker #define SKIP_TXFM_AC_ONLY 2
164*fb1b10abSAndroid Build Coastguard Worker 
165*fb1b10abSAndroid Build Coastguard Worker // cf. https://bugs.chromium.org/p/webm/issues/detail?id=1054
166*fb1b10abSAndroid Build Coastguard Worker #if !defined(_MSC_VER) || _MSC_VER >= 1900
167*fb1b10abSAndroid Build Coastguard Worker   int64_t bsse[MAX_MB_PLANE << 2];
168*fb1b10abSAndroid Build Coastguard Worker #endif
169*fb1b10abSAndroid Build Coastguard Worker 
170*fb1b10abSAndroid Build Coastguard Worker   // Used to store sub partition's choices.
171*fb1b10abSAndroid Build Coastguard Worker   MV pred_mv[MAX_REF_FRAMES];
172*fb1b10abSAndroid Build Coastguard Worker 
173*fb1b10abSAndroid Build Coastguard Worker   // Strong color activity detection. Used in RTC coding mode to enhance
174*fb1b10abSAndroid Build Coastguard Worker   // the visual quality at the boundary of moving color objects.
175*fb1b10abSAndroid Build Coastguard Worker   uint8_t color_sensitivity[2];
176*fb1b10abSAndroid Build Coastguard Worker 
177*fb1b10abSAndroid Build Coastguard Worker   uint8_t sb_is_skin;
178*fb1b10abSAndroid Build Coastguard Worker 
179*fb1b10abSAndroid Build Coastguard Worker   uint8_t skip_low_source_sad;
180*fb1b10abSAndroid Build Coastguard Worker 
181*fb1b10abSAndroid Build Coastguard Worker   uint8_t lowvar_highsumdiff;
182*fb1b10abSAndroid Build Coastguard Worker 
183*fb1b10abSAndroid Build Coastguard Worker   uint8_t last_sb_high_content;
184*fb1b10abSAndroid Build Coastguard Worker 
185*fb1b10abSAndroid Build Coastguard Worker   int sb_use_mv_part;
186*fb1b10abSAndroid Build Coastguard Worker 
187*fb1b10abSAndroid Build Coastguard Worker   int sb_mvcol_part;
188*fb1b10abSAndroid Build Coastguard Worker 
189*fb1b10abSAndroid Build Coastguard Worker   int sb_mvrow_part;
190*fb1b10abSAndroid Build Coastguard Worker 
191*fb1b10abSAndroid Build Coastguard Worker   int sb_pickmode_part;
192*fb1b10abSAndroid Build Coastguard Worker 
193*fb1b10abSAndroid Build Coastguard Worker   int zero_temp_sad_source;
194*fb1b10abSAndroid Build Coastguard Worker 
195*fb1b10abSAndroid Build Coastguard Worker   // For each superblock: saves the content value (e.g., low/high sad/sumdiff)
196*fb1b10abSAndroid Build Coastguard Worker   // based on source sad, prior to encoding the frame.
197*fb1b10abSAndroid Build Coastguard Worker   uint8_t content_state_sb;
198*fb1b10abSAndroid Build Coastguard Worker 
199*fb1b10abSAndroid Build Coastguard Worker   // Used to save the status of whether a block has a low variance in
200*fb1b10abSAndroid Build Coastguard Worker   // choose_partitioning. 0 for 64x64, 1~2 for 64x32, 3~4 for 32x64, 5~8 for
201*fb1b10abSAndroid Build Coastguard Worker   // 32x32, 9~24 for 16x16.
202*fb1b10abSAndroid Build Coastguard Worker   uint8_t variance_low[25];
203*fb1b10abSAndroid Build Coastguard Worker 
204*fb1b10abSAndroid Build Coastguard Worker   uint8_t arf_frame_usage;
205*fb1b10abSAndroid Build Coastguard Worker   uint8_t lastgolden_frame_usage;
206*fb1b10abSAndroid Build Coastguard Worker 
207*fb1b10abSAndroid Build Coastguard Worker   void (*fwd_txfm4x4)(const int16_t *input, tran_low_t *output, int stride);
208*fb1b10abSAndroid Build Coastguard Worker   void (*inv_txfm_add)(const tran_low_t *input, uint8_t *dest, int stride,
209*fb1b10abSAndroid Build Coastguard Worker                        int eob);
210*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_HIGHBITDEPTH
211*fb1b10abSAndroid Build Coastguard Worker   void (*highbd_inv_txfm_add)(const tran_low_t *input, uint16_t *dest,
212*fb1b10abSAndroid Build Coastguard Worker                               int stride, int eob, int bd);
213*fb1b10abSAndroid Build Coastguard Worker #endif
214*fb1b10abSAndroid Build Coastguard Worker   DECLARE_ALIGNED(16, uint8_t, est_pred[64 * 64]);
215*fb1b10abSAndroid Build Coastguard Worker 
216*fb1b10abSAndroid Build Coastguard Worker   struct scale_factors *me_sf;
217*fb1b10abSAndroid Build Coastguard Worker };
218*fb1b10abSAndroid Build Coastguard Worker 
219*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
220*fb1b10abSAndroid Build Coastguard Worker }  // extern "C"
221*fb1b10abSAndroid Build Coastguard Worker #endif
222*fb1b10abSAndroid Build Coastguard Worker 
223*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VP9_ENCODER_VP9_BLOCK_H_
224