xref: /aosp_15_r20/external/libvpx/vp9/encoder/vp9_context_tree.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2014 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_CONTEXT_TREE_H_
12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP9_ENCODER_VP9_CONTEXT_TREE_H_
13*fb1b10abSAndroid Build Coastguard Worker 
14*fb1b10abSAndroid Build Coastguard Worker #include "vp9/common/vp9_blockd.h"
15*fb1b10abSAndroid Build Coastguard Worker #include "vp9/encoder/vp9_block.h"
16*fb1b10abSAndroid Build Coastguard Worker 
17*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
18*fb1b10abSAndroid Build Coastguard Worker extern "C" {
19*fb1b10abSAndroid Build Coastguard Worker #endif
20*fb1b10abSAndroid Build Coastguard Worker 
21*fb1b10abSAndroid Build Coastguard Worker struct VP9_COMP;
22*fb1b10abSAndroid Build Coastguard Worker struct VP9Common;
23*fb1b10abSAndroid Build Coastguard Worker struct ThreadData;
24*fb1b10abSAndroid Build Coastguard Worker 
25*fb1b10abSAndroid Build Coastguard Worker // Structure to hold snapshot of coding context during the mode picking process
26*fb1b10abSAndroid Build Coastguard Worker typedef struct {
27*fb1b10abSAndroid Build Coastguard Worker   MODE_INFO mic;
28*fb1b10abSAndroid Build Coastguard Worker   MB_MODE_INFO_EXT mbmi_ext;
29*fb1b10abSAndroid Build Coastguard Worker   uint8_t *zcoeff_blk;
30*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *coeff[MAX_MB_PLANE][3];
31*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *qcoeff[MAX_MB_PLANE][3];
32*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *dqcoeff[MAX_MB_PLANE][3];
33*fb1b10abSAndroid Build Coastguard Worker   uint16_t *eobs[MAX_MB_PLANE][3];
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker   // dual buffer pointers, 0: in use, 1: best in store
36*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *coeff_pbuf[MAX_MB_PLANE][3];
37*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *qcoeff_pbuf[MAX_MB_PLANE][3];
38*fb1b10abSAndroid Build Coastguard Worker   tran_low_t *dqcoeff_pbuf[MAX_MB_PLANE][3];
39*fb1b10abSAndroid Build Coastguard Worker   uint16_t *eobs_pbuf[MAX_MB_PLANE][3];
40*fb1b10abSAndroid Build Coastguard Worker 
41*fb1b10abSAndroid Build Coastguard Worker   int is_coded;
42*fb1b10abSAndroid Build Coastguard Worker   int num_4x4_blk;
43*fb1b10abSAndroid Build Coastguard Worker   int skip;
44*fb1b10abSAndroid Build Coastguard Worker   int pred_pixel_ready;
45*fb1b10abSAndroid Build Coastguard Worker   // For current partition, only if all Y, U, and V transform blocks'
46*fb1b10abSAndroid Build Coastguard Worker   // coefficients are quantized to 0, skippable is set to 0.
47*fb1b10abSAndroid Build Coastguard Worker   int skippable;
48*fb1b10abSAndroid Build Coastguard Worker   uint8_t skip_txfm[MAX_MB_PLANE << 2];
49*fb1b10abSAndroid Build Coastguard Worker   int best_mode_index;
50*fb1b10abSAndroid Build Coastguard Worker   int hybrid_pred_diff;
51*fb1b10abSAndroid Build Coastguard Worker   int comp_pred_diff;
52*fb1b10abSAndroid Build Coastguard Worker   int single_pred_diff;
53*fb1b10abSAndroid Build Coastguard Worker   int64_t best_filter_diff[SWITCHABLE_FILTER_CONTEXTS];
54*fb1b10abSAndroid Build Coastguard Worker 
55*fb1b10abSAndroid Build Coastguard Worker   // TODO(jingning) Use RD_COST struct here instead. This involves a boarder
56*fb1b10abSAndroid Build Coastguard Worker   // scope of refactoring.
57*fb1b10abSAndroid Build Coastguard Worker   int rate;
58*fb1b10abSAndroid Build Coastguard Worker   int64_t dist;
59*fb1b10abSAndroid Build Coastguard Worker   int64_t rdcost;
60*fb1b10abSAndroid Build Coastguard Worker 
61*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_VP9_TEMPORAL_DENOISING
62*fb1b10abSAndroid Build Coastguard Worker   unsigned int newmv_sse;
63*fb1b10abSAndroid Build Coastguard Worker   unsigned int zeromv_sse;
64*fb1b10abSAndroid Build Coastguard Worker   unsigned int zeromv_lastref_sse;
65*fb1b10abSAndroid Build Coastguard Worker   PREDICTION_MODE best_sse_inter_mode;
66*fb1b10abSAndroid Build Coastguard Worker   int_mv best_sse_mv;
67*fb1b10abSAndroid Build Coastguard Worker   MV_REFERENCE_FRAME best_reference_frame;
68*fb1b10abSAndroid Build Coastguard Worker   MV_REFERENCE_FRAME best_zeromv_reference_frame;
69*fb1b10abSAndroid Build Coastguard Worker   int sb_skip_denoising;
70*fb1b10abSAndroid Build Coastguard Worker #endif
71*fb1b10abSAndroid Build Coastguard Worker 
72*fb1b10abSAndroid Build Coastguard Worker   // motion vector cache for adaptive motion search control in partition
73*fb1b10abSAndroid Build Coastguard Worker   // search loop
74*fb1b10abSAndroid Build Coastguard Worker   MV pred_mv[MAX_REF_FRAMES];
75*fb1b10abSAndroid Build Coastguard Worker   INTERP_FILTER pred_interp_filter;
76*fb1b10abSAndroid Build Coastguard Worker 
77*fb1b10abSAndroid Build Coastguard Worker   // Used for the machine learning-based early termination
78*fb1b10abSAndroid Build Coastguard Worker   int32_t sum_y_eobs;
79*fb1b10abSAndroid Build Coastguard Worker   // Skip certain ref frames during RD search of rectangular partitions.
80*fb1b10abSAndroid Build Coastguard Worker   uint8_t skip_ref_frame_mask;
81*fb1b10abSAndroid Build Coastguard Worker } PICK_MODE_CONTEXT;
82*fb1b10abSAndroid Build Coastguard Worker 
83*fb1b10abSAndroid Build Coastguard Worker typedef struct PC_TREE {
84*fb1b10abSAndroid Build Coastguard Worker   int index;
85*fb1b10abSAndroid Build Coastguard Worker   PARTITION_TYPE partitioning;
86*fb1b10abSAndroid Build Coastguard Worker   BLOCK_SIZE block_size;
87*fb1b10abSAndroid Build Coastguard Worker   PICK_MODE_CONTEXT none;
88*fb1b10abSAndroid Build Coastguard Worker   PICK_MODE_CONTEXT horizontal[2];
89*fb1b10abSAndroid Build Coastguard Worker   PICK_MODE_CONTEXT vertical[2];
90*fb1b10abSAndroid Build Coastguard Worker   union {
91*fb1b10abSAndroid Build Coastguard Worker     struct PC_TREE *split[4];
92*fb1b10abSAndroid Build Coastguard Worker     PICK_MODE_CONTEXT *leaf_split[4];
93*fb1b10abSAndroid Build Coastguard Worker   } u;
94*fb1b10abSAndroid Build Coastguard Worker   // Obtained from a simple motion search. Used by the ML based partition search
95*fb1b10abSAndroid Build Coastguard Worker   // speed feature.
96*fb1b10abSAndroid Build Coastguard Worker   MV mv;
97*fb1b10abSAndroid Build Coastguard Worker } PC_TREE;
98*fb1b10abSAndroid Build Coastguard Worker 
99*fb1b10abSAndroid Build Coastguard Worker void vp9_setup_pc_tree(struct VP9Common *cm, struct ThreadData *td);
100*fb1b10abSAndroid Build Coastguard Worker void vp9_free_pc_tree(struct ThreadData *td);
101*fb1b10abSAndroid Build Coastguard Worker 
102*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
103*fb1b10abSAndroid Build Coastguard Worker }  // extern "C"
104*fb1b10abSAndroid Build Coastguard Worker #endif
105*fb1b10abSAndroid Build Coastguard Worker 
106*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VP9_ENCODER_VP9_CONTEXT_TREE_H_
107