xref: /aosp_15_r20/external/libaom/aom/aom_external_partition.h (revision 77c1e3ccc04c968bd2bc212e87364f250e820521)
1*77c1e3ccSAndroid Build Coastguard Worker /*
2*77c1e3ccSAndroid Build Coastguard Worker  * Copyright (c) 2021, Alliance for Open Media. All rights reserved.
3*77c1e3ccSAndroid Build Coastguard Worker  *
4*77c1e3ccSAndroid Build Coastguard Worker  * This source code is subject to the terms of the BSD 2 Clause License and
5*77c1e3ccSAndroid Build Coastguard Worker  * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License
6*77c1e3ccSAndroid Build Coastguard Worker  * was not distributed with this source code in the LICENSE file, you can
7*77c1e3ccSAndroid Build Coastguard Worker  * obtain it at www.aomedia.org/license/software. If the Alliance for Open
8*77c1e3ccSAndroid Build Coastguard Worker  * Media Patent License 1.0 was not distributed with this source code in the
9*77c1e3ccSAndroid Build Coastguard Worker  * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
10*77c1e3ccSAndroid Build Coastguard Worker  */
11*77c1e3ccSAndroid Build Coastguard Worker #ifndef AOM_AOM_AOM_EXTERNAL_PARTITION_H_
12*77c1e3ccSAndroid Build Coastguard Worker #define AOM_AOM_AOM_EXTERNAL_PARTITION_H_
13*77c1e3ccSAndroid Build Coastguard Worker 
14*77c1e3ccSAndroid Build Coastguard Worker /*!\defgroup aom_encoder AOMedia AOM/AV1 Encoder
15*77c1e3ccSAndroid Build Coastguard Worker  * \ingroup aom
16*77c1e3ccSAndroid Build Coastguard Worker  *
17*77c1e3ccSAndroid Build Coastguard Worker  * @{
18*77c1e3ccSAndroid Build Coastguard Worker  */
19*77c1e3ccSAndroid Build Coastguard Worker #include <stdint.h>
20*77c1e3ccSAndroid Build Coastguard Worker 
21*77c1e3ccSAndroid Build Coastguard Worker /*!\file
22*77c1e3ccSAndroid Build Coastguard Worker  * \brief Provides function pointer definitions for the external partition.
23*77c1e3ccSAndroid Build Coastguard Worker  *
24*77c1e3ccSAndroid Build Coastguard Worker  * \note The external partition API should be considered experimental. Until the
25*77c1e3ccSAndroid Build Coastguard Worker  * external partition API is declared stable, breaking changes may be made to
26*77c1e3ccSAndroid Build Coastguard Worker  * this API in a future libaom release.
27*77c1e3ccSAndroid Build Coastguard Worker  */
28*77c1e3ccSAndroid Build Coastguard Worker 
29*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Current ABI version number
30*77c1e3ccSAndroid Build Coastguard Worker  *
31*77c1e3ccSAndroid Build Coastguard Worker  * \internal
32*77c1e3ccSAndroid Build Coastguard Worker  * If this file is altered in any way that changes the ABI, this value
33*77c1e3ccSAndroid Build Coastguard Worker  * must be bumped. Examples include, but are not limited to, changing
34*77c1e3ccSAndroid Build Coastguard Worker  * types, removing or reassigning enums, adding/removing/rearranging
35*77c1e3ccSAndroid Build Coastguard Worker  * fields to structures.
36*77c1e3ccSAndroid Build Coastguard Worker  */
37*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_ABI_VERSION 8
38*77c1e3ccSAndroid Build Coastguard Worker 
39*77c1e3ccSAndroid Build Coastguard Worker #ifdef __cplusplus
40*77c1e3ccSAndroid Build Coastguard Worker extern "C" {
41*77c1e3ccSAndroid Build Coastguard Worker #endif
42*77c1e3ccSAndroid Build Coastguard Worker 
43*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Abstract external partition model handler
44*77c1e3ccSAndroid Build Coastguard Worker  */
45*77c1e3ccSAndroid Build Coastguard Worker typedef void *aom_ext_part_model_t;
46*77c1e3ccSAndroid Build Coastguard Worker 
47*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Number of features to determine whether to skip partition none and
48*77c1e3ccSAndroid Build Coastguard Worker  * do partition split directly. The same as "FEATURE_SIZE_SMS_SPLIT".
49*77c1e3ccSAndroid Build Coastguard Worker  */
50*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_SIZE_DIRECT_SPLIT 17
51*77c1e3ccSAndroid Build Coastguard Worker 
52*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Number of features to use simple motion search to prune out
53*77c1e3ccSAndroid Build Coastguard Worker  * rectangular partition in some direction. The same as
54*77c1e3ccSAndroid Build Coastguard Worker  * "FEATURE_SIZE_SMS_PRUNE_PART".
55*77c1e3ccSAndroid Build Coastguard Worker  */
56*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_SIZE_PRUNE_PART 25
57*77c1e3ccSAndroid Build Coastguard Worker 
58*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Number of features to prune split and rectangular partition
59*77c1e3ccSAndroid Build Coastguard Worker  * after PARTITION_NONE.
60*77c1e3ccSAndroid Build Coastguard Worker  */
61*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_SIZE_PRUNE_NONE 4
62*77c1e3ccSAndroid Build Coastguard Worker 
63*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Number of features to terminates partition after partition none using
64*77c1e3ccSAndroid Build Coastguard Worker  * simple_motion_search features and the rate, distortion, and rdcost of
65*77c1e3ccSAndroid Build Coastguard Worker  * PARTITION_NONE. The same as "FEATURE_SIZE_SMS_TERM_NONE".
66*77c1e3ccSAndroid Build Coastguard Worker  */
67*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_SIZE_TERM_NONE 28
68*77c1e3ccSAndroid Build Coastguard Worker 
69*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Number of features to terminates partition after partition split.
70*77c1e3ccSAndroid Build Coastguard Worker  */
71*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_SIZE_TERM_SPLIT 31
72*77c1e3ccSAndroid Build Coastguard Worker 
73*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Number of features to prune rectangular partition using stats
74*77c1e3ccSAndroid Build Coastguard Worker  * collected after partition split.
75*77c1e3ccSAndroid Build Coastguard Worker  */
76*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_SIZE_PRUNE_RECT 9
77*77c1e3ccSAndroid Build Coastguard Worker 
78*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Number of features to prune AB partition using stats
79*77c1e3ccSAndroid Build Coastguard Worker  * collected after rectangular partition..
80*77c1e3ccSAndroid Build Coastguard Worker  */
81*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_SIZE_PRUNE_AB 10
82*77c1e3ccSAndroid Build Coastguard Worker 
83*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Number of features to prune 4-way partition using stats
84*77c1e3ccSAndroid Build Coastguard Worker  * collected after AB partition.
85*77c1e3ccSAndroid Build Coastguard Worker  */
86*77c1e3ccSAndroid Build Coastguard Worker #define AOM_EXT_PART_SIZE_PRUNE_4_WAY 18
87*77c1e3ccSAndroid Build Coastguard Worker 
88*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Decision mode of the external partition model.
89*77c1e3ccSAndroid Build Coastguard Worker  * AOM_EXT_PART_WHOLE_TREE: the external partition model should provide the
90*77c1e3ccSAndroid Build Coastguard Worker  * whole partition tree for the superblock.
91*77c1e3ccSAndroid Build Coastguard Worker  *
92*77c1e3ccSAndroid Build Coastguard Worker  * AOM_EXT_PART_RECURSIVE: the external partition model provides the partition
93*77c1e3ccSAndroid Build Coastguard Worker  * decision of the current block only. The decision process starts from
94*77c1e3ccSAndroid Build Coastguard Worker  * the superblock size, down to the smallest block size (4x4) recursively.
95*77c1e3ccSAndroid Build Coastguard Worker  */
96*77c1e3ccSAndroid Build Coastguard Worker typedef enum aom_ext_part_decision_mode {
97*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_WHOLE_TREE = 0,
98*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_RECURSIVE = 1,
99*77c1e3ccSAndroid Build Coastguard Worker } aom_ext_part_decision_mode_t;
100*77c1e3ccSAndroid Build Coastguard Worker 
101*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Config information sent to the external partition model.
102*77c1e3ccSAndroid Build Coastguard Worker  *
103*77c1e3ccSAndroid Build Coastguard Worker  * For example, the maximum superblock size determined by the sequence header.
104*77c1e3ccSAndroid Build Coastguard Worker  */
105*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_ext_part_config {
106*77c1e3ccSAndroid Build Coastguard Worker   int superblock_size;  ///< super block size (either 64x64 or 128x128)
107*77c1e3ccSAndroid Build Coastguard Worker } aom_ext_part_config_t;
108*77c1e3ccSAndroid Build Coastguard Worker 
109*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features pass to the external model to make partition decisions.
110*77c1e3ccSAndroid Build Coastguard Worker  * Specifically, features collected before NONE partition.
111*77c1e3ccSAndroid Build Coastguard Worker  * Features "f" are used to determine:
112*77c1e3ccSAndroid Build Coastguard Worker  * partition_none_allowed, partition_horz_allowed, partition_vert_allowed,
113*77c1e3ccSAndroid Build Coastguard Worker  * do_rectangular_split, do_square_split
114*77c1e3ccSAndroid Build Coastguard Worker  * Features "f_part2" are used to determine:
115*77c1e3ccSAndroid Build Coastguard Worker  * prune_horz, prune_vert.
116*77c1e3ccSAndroid Build Coastguard Worker  */
117*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_partition_features_before_none {
118*77c1e3ccSAndroid Build Coastguard Worker   /*! features to determine whether skip partition none and do split directly */
119*77c1e3ccSAndroid Build Coastguard Worker   float f[AOM_EXT_PART_SIZE_DIRECT_SPLIT];
120*77c1e3ccSAndroid Build Coastguard Worker   /*! features to determine whether to prune rectangular partition */
121*77c1e3ccSAndroid Build Coastguard Worker   float f_part2[AOM_EXT_PART_SIZE_PRUNE_PART];
122*77c1e3ccSAndroid Build Coastguard Worker } aom_partition_features_before_none_t;
123*77c1e3ccSAndroid Build Coastguard Worker 
124*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features pass to the external model to make partition decisions.
125*77c1e3ccSAndroid Build Coastguard Worker  * Specifically, features collected after NONE partition.
126*77c1e3ccSAndroid Build Coastguard Worker  */
127*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_partition_features_none {
128*77c1e3ccSAndroid Build Coastguard Worker   /*! features to prune split and rectangular partition */
129*77c1e3ccSAndroid Build Coastguard Worker   float f[AOM_EXT_PART_SIZE_PRUNE_NONE];
130*77c1e3ccSAndroid Build Coastguard Worker   /*! features to determine termination of partition */
131*77c1e3ccSAndroid Build Coastguard Worker   float f_terminate[AOM_EXT_PART_SIZE_TERM_NONE];
132*77c1e3ccSAndroid Build Coastguard Worker } aom_partition_features_none_t;
133*77c1e3ccSAndroid Build Coastguard Worker 
134*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features pass to the external model to make partition decisions.
135*77c1e3ccSAndroid Build Coastguard Worker  * Specifically, features collected after SPLIT partition.
136*77c1e3ccSAndroid Build Coastguard Worker  */
137*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_partition_features_split {
138*77c1e3ccSAndroid Build Coastguard Worker   /*! features to determine termination of  partition */
139*77c1e3ccSAndroid Build Coastguard Worker   float f_terminate[AOM_EXT_PART_SIZE_TERM_SPLIT];
140*77c1e3ccSAndroid Build Coastguard Worker   /*! features to determine pruning rect partition */
141*77c1e3ccSAndroid Build Coastguard Worker   float f_prune_rect[AOM_EXT_PART_SIZE_PRUNE_RECT];
142*77c1e3ccSAndroid Build Coastguard Worker } aom_partition_features_split_t;
143*77c1e3ccSAndroid Build Coastguard Worker 
144*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features pass to the external model to make partition decisions.
145*77c1e3ccSAndroid Build Coastguard Worker  * Specifically, features collected after RECTANGULAR partition.
146*77c1e3ccSAndroid Build Coastguard Worker  */
147*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_partition_features_rect {
148*77c1e3ccSAndroid Build Coastguard Worker   /*! features to determine pruning AB partition */
149*77c1e3ccSAndroid Build Coastguard Worker   float f[AOM_EXT_PART_SIZE_PRUNE_AB];
150*77c1e3ccSAndroid Build Coastguard Worker } aom_partition_features_rect_t;
151*77c1e3ccSAndroid Build Coastguard Worker 
152*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features pass to the external model to make partition decisions.
153*77c1e3ccSAndroid Build Coastguard Worker  * Specifically, features collected after AB partition: HORZ_A, HORZ_B, VERT_A,
154*77c1e3ccSAndroid Build Coastguard Worker  * VERT_B.
155*77c1e3ccSAndroid Build Coastguard Worker  */
156*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_partition_features_ab {
157*77c1e3ccSAndroid Build Coastguard Worker   /*! features to determine pruning 4-way partition */
158*77c1e3ccSAndroid Build Coastguard Worker   float f[AOM_EXT_PART_SIZE_PRUNE_4_WAY];
159*77c1e3ccSAndroid Build Coastguard Worker } aom_partition_features_ab_t;
160*77c1e3ccSAndroid Build Coastguard Worker 
161*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Feature id to tell the external model the current stage in partition
162*77c1e3ccSAndroid Build Coastguard Worker  * pruning and what features to use to make decisions accordingly.
163*77c1e3ccSAndroid Build Coastguard Worker  */
164*77c1e3ccSAndroid Build Coastguard Worker typedef enum {
165*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_BEFORE_NONE,
166*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_BEFORE_NONE_PART2,
167*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_AFTER_NONE,
168*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_AFTER_NONE_PART2,
169*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_AFTER_SPLIT,
170*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_AFTER_SPLIT_PART2,
171*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_AFTER_RECT,
172*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_AFTER_AB
173*77c1e3ccSAndroid Build Coastguard Worker } AOM_EXT_PART_FEATURE_ID;
174*77c1e3ccSAndroid Build Coastguard Worker 
175*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features collected from the tpl process.
176*77c1e3ccSAndroid Build Coastguard Worker  *
177*77c1e3ccSAndroid Build Coastguard Worker  * The tpl process collects information that help measure the inter-frame
178*77c1e3ccSAndroid Build Coastguard Worker  * dependency.
179*77c1e3ccSAndroid Build Coastguard Worker  * The tpl process is computed in the unit of tpl_bsize_1d (16x16).
180*77c1e3ccSAndroid Build Coastguard Worker  * Therefore, the max number of units inside a superblock is
181*77c1e3ccSAndroid Build Coastguard Worker  * 128x128 / (16x16) = 64. Change it if the tpl process changes.
182*77c1e3ccSAndroid Build Coastguard Worker  */
183*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_sb_tpl_features {
184*77c1e3ccSAndroid Build Coastguard Worker   int available;        ///< If tpl stats are available
185*77c1e3ccSAndroid Build Coastguard Worker   int tpl_unit_length;  ///< The block length of tpl process
186*77c1e3ccSAndroid Build Coastguard Worker   int num_units;        ///< The number of units inside the current superblock
187*77c1e3ccSAndroid Build Coastguard Worker   int64_t intra_cost[64];   ///< The intra cost of each unit
188*77c1e3ccSAndroid Build Coastguard Worker   int64_t inter_cost[64];   ///< The inter cost of each unit
189*77c1e3ccSAndroid Build Coastguard Worker   int64_t mc_dep_cost[64];  ///< The motion compensated dependency cost
190*77c1e3ccSAndroid Build Coastguard Worker } aom_sb_tpl_features_t;
191*77c1e3ccSAndroid Build Coastguard Worker 
192*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features collected from the simple motion process.
193*77c1e3ccSAndroid Build Coastguard Worker  *
194*77c1e3ccSAndroid Build Coastguard Worker  * The simple motion process collects information by applying motion compensated
195*77c1e3ccSAndroid Build Coastguard Worker  * prediction on each block.
196*77c1e3ccSAndroid Build Coastguard Worker  * The block size is 16x16, which could be changed. If it is changed, update
197*77c1e3ccSAndroid Build Coastguard Worker  * comments and the array size here.
198*77c1e3ccSAndroid Build Coastguard Worker  */
199*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_sb_simple_motion_features {
200*77c1e3ccSAndroid Build Coastguard Worker   int unit_length;    ///< The block length of the simple motion process
201*77c1e3ccSAndroid Build Coastguard Worker   int num_units;      ///< The number of units inside the current superblock
202*77c1e3ccSAndroid Build Coastguard Worker   int block_sse[64];  ///< Sum of squared error of each unit
203*77c1e3ccSAndroid Build Coastguard Worker   int block_var[64];  ///< Variance of each unit
204*77c1e3ccSAndroid Build Coastguard Worker } aom_sb_simple_motion_features_t;
205*77c1e3ccSAndroid Build Coastguard Worker 
206*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features of each super block.
207*77c1e3ccSAndroid Build Coastguard Worker  *
208*77c1e3ccSAndroid Build Coastguard Worker  * Features collected for each super block before partition search.
209*77c1e3ccSAndroid Build Coastguard Worker  */
210*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_sb_features {
211*77c1e3ccSAndroid Build Coastguard Worker   /*! Features from motion search */
212*77c1e3ccSAndroid Build Coastguard Worker   aom_sb_simple_motion_features_t motion_features;
213*77c1e3ccSAndroid Build Coastguard Worker   /*! Features from tpl process */
214*77c1e3ccSAndroid Build Coastguard Worker   aom_sb_tpl_features_t tpl_features;
215*77c1e3ccSAndroid Build Coastguard Worker } aom_sb_features_t;
216*77c1e3ccSAndroid Build Coastguard Worker 
217*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Features pass to the external model to make partition decisions.
218*77c1e3ccSAndroid Build Coastguard Worker  *
219*77c1e3ccSAndroid Build Coastguard Worker  * The encoder sends these features to the external model through
220*77c1e3ccSAndroid Build Coastguard Worker  * "func()" defined in .....
221*77c1e3ccSAndroid Build Coastguard Worker  *
222*77c1e3ccSAndroid Build Coastguard Worker  * NOTE: new member variables may be added to this structure in the future.
223*77c1e3ccSAndroid Build Coastguard Worker  * Once new features are finalized, bump the major version of libaom.
224*77c1e3ccSAndroid Build Coastguard Worker  */
225*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_partition_features {
226*77c1e3ccSAndroid Build Coastguard Worker   // Features for the current supervised multi-stage ML model.
227*77c1e3ccSAndroid Build Coastguard Worker   /*! Feature ID to indicate active features */
228*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_FEATURE_ID id;
229*77c1e3ccSAndroid Build Coastguard Worker   /*! Features collected before NONE partition */
230*77c1e3ccSAndroid Build Coastguard Worker   aom_partition_features_before_none_t before_part_none;
231*77c1e3ccSAndroid Build Coastguard Worker   /*! Features collected after NONE partition */
232*77c1e3ccSAndroid Build Coastguard Worker   aom_partition_features_none_t after_part_none;
233*77c1e3ccSAndroid Build Coastguard Worker   /*! Features collected after SPLIT partition */
234*77c1e3ccSAndroid Build Coastguard Worker   aom_partition_features_split_t after_part_split;
235*77c1e3ccSAndroid Build Coastguard Worker   /*! Features collected after RECTANGULAR partition */
236*77c1e3ccSAndroid Build Coastguard Worker   aom_partition_features_rect_t after_part_rect;
237*77c1e3ccSAndroid Build Coastguard Worker   /*! Features collected after AB partition */
238*77c1e3ccSAndroid Build Coastguard Worker   aom_partition_features_ab_t after_part_ab;
239*77c1e3ccSAndroid Build Coastguard Worker 
240*77c1e3ccSAndroid Build Coastguard Worker   // Features for a new ML model.
241*77c1e3ccSAndroid Build Coastguard Worker   aom_sb_features_t sb_features;  ///< Features collected for the super block
242*77c1e3ccSAndroid Build Coastguard Worker   int mi_row;                     ///< Mi_row position of the block
243*77c1e3ccSAndroid Build Coastguard Worker   int mi_col;                     ///< Mi_col position of the block
244*77c1e3ccSAndroid Build Coastguard Worker   int frame_width;                ///< Frame width
245*77c1e3ccSAndroid Build Coastguard Worker   int frame_height;               ///< Frame height
246*77c1e3ccSAndroid Build Coastguard Worker   int block_size;                 ///< As "BLOCK_SIZE" in av1/common/enums.h
247*77c1e3ccSAndroid Build Coastguard Worker   /*!
248*77c1e3ccSAndroid Build Coastguard Worker    * Valid partition types. A bitmask is used.  "1" represents the
249*77c1e3ccSAndroid Build Coastguard Worker    * corresponding type is valid. The bitmask follows the enum order for
250*77c1e3ccSAndroid Build Coastguard Worker    * PARTITION_TYPE in "enums.h" to represent one partition type at a bit.
251*77c1e3ccSAndroid Build Coastguard Worker    * For example, 0x01 stands for only PARTITION_NONE is valid,
252*77c1e3ccSAndroid Build Coastguard Worker    * 0x09 (00...001001) stands for PARTITION_NONE and PARTITION_SPLIT are valid.
253*77c1e3ccSAndroid Build Coastguard Worker    */
254*77c1e3ccSAndroid Build Coastguard Worker   int valid_partition_types;
255*77c1e3ccSAndroid Build Coastguard Worker   int update_type;    ///< Frame update type, defined in ratectrl.h
256*77c1e3ccSAndroid Build Coastguard Worker   int qindex;         ///< Quantization index, range: [0, 255]
257*77c1e3ccSAndroid Build Coastguard Worker   int rdmult;         ///< Rate-distortion multiplier
258*77c1e3ccSAndroid Build Coastguard Worker   int pyramid_level;  ///< The level of this frame in the hierarchical structure
259*77c1e3ccSAndroid Build Coastguard Worker   int has_above_block;     ///< Has above neighbor block
260*77c1e3ccSAndroid Build Coastguard Worker   int above_block_width;   ///< Width of the above block, -1 if not exist
261*77c1e3ccSAndroid Build Coastguard Worker   int above_block_height;  ///< Height of the above block, -1 if not exist
262*77c1e3ccSAndroid Build Coastguard Worker   int has_left_block;      ///< Has left neighbor block
263*77c1e3ccSAndroid Build Coastguard Worker   int left_block_width;    ///< Width of the left block, -1 if not exist
264*77c1e3ccSAndroid Build Coastguard Worker   int left_block_height;   ///< Height of the left block, -1 if not exist
265*77c1e3ccSAndroid Build Coastguard Worker   /*!
266*77c1e3ccSAndroid Build Coastguard Worker    * The following parameters are collected from applying simple motion search.
267*77c1e3ccSAndroid Build Coastguard Worker    * Sum of squared error (SSE) and variance of motion compensated residual
268*77c1e3ccSAndroid Build Coastguard Worker    * are good indicators of block partitioning.
269*77c1e3ccSAndroid Build Coastguard Worker    * If a block is a square, we also apply motion search for its 4 sub blocks.
270*77c1e3ccSAndroid Build Coastguard Worker    * If not a square, their values are -1.
271*77c1e3ccSAndroid Build Coastguard Worker    * If a block is able to split horizontally, we apply motion search and get
272*77c1e3ccSAndroid Build Coastguard Worker    * stats for horizontal blocks. If not, their values are -1.
273*77c1e3ccSAndroid Build Coastguard Worker    * If a block is able to split vertically, we apply motion search and get
274*77c1e3ccSAndroid Build Coastguard Worker    * stats for vertical blocks. If not, their values are -1.
275*77c1e3ccSAndroid Build Coastguard Worker    */
276*77c1e3ccSAndroid Build Coastguard Worker   unsigned int block_sse;          ///< SSE of motion compensated residual
277*77c1e3ccSAndroid Build Coastguard Worker   unsigned int block_var;          ///< Variance of motion compensated residual
278*77c1e3ccSAndroid Build Coastguard Worker   unsigned int sub_block_sse[4];   ///< SSE of sub blocks.
279*77c1e3ccSAndroid Build Coastguard Worker   unsigned int sub_block_var[4];   ///< Variance of sub blocks.
280*77c1e3ccSAndroid Build Coastguard Worker   unsigned int horz_block_sse[2];  ///< SSE of horz sub blocks
281*77c1e3ccSAndroid Build Coastguard Worker   unsigned int horz_block_var[2];  ///< Variance of horz sub blocks
282*77c1e3ccSAndroid Build Coastguard Worker   unsigned int vert_block_sse[2];  ///< SSE of vert sub blocks
283*77c1e3ccSAndroid Build Coastguard Worker   unsigned int vert_block_var[2];  ///< Variance of vert sub blocks
284*77c1e3ccSAndroid Build Coastguard Worker   /*!
285*77c1e3ccSAndroid Build Coastguard Worker    * The following parameters are calculated from tpl model.
286*77c1e3ccSAndroid Build Coastguard Worker    * If tpl model is not available, their values are -1.
287*77c1e3ccSAndroid Build Coastguard Worker    */
288*77c1e3ccSAndroid Build Coastguard Worker   int64_t tpl_intra_cost;   ///< Intra cost, ref to "TplDepStats" in tpl_model.h
289*77c1e3ccSAndroid Build Coastguard Worker   int64_t tpl_inter_cost;   ///< Inter cost in tpl model
290*77c1e3ccSAndroid Build Coastguard Worker   int64_t tpl_mc_dep_cost;  ///< Motion compensated dependency cost in tpl model
291*77c1e3ccSAndroid Build Coastguard Worker } aom_partition_features_t;
292*77c1e3ccSAndroid Build Coastguard Worker 
293*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Partition decisions received from the external model.
294*77c1e3ccSAndroid Build Coastguard Worker  *
295*77c1e3ccSAndroid Build Coastguard Worker  * The encoder receives partition decisions and encodes the superblock
296*77c1e3ccSAndroid Build Coastguard Worker  * with the given partition type.
297*77c1e3ccSAndroid Build Coastguard Worker  * The encoder receives it from "func()" define in ....
298*77c1e3ccSAndroid Build Coastguard Worker  *
299*77c1e3ccSAndroid Build Coastguard Worker  * NOTE: new member variables may be added to this structure in the future.
300*77c1e3ccSAndroid Build Coastguard Worker  * Once new features are finalized, bump the major version of libaom.
301*77c1e3ccSAndroid Build Coastguard Worker  */
302*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_partition_decision {
303*77c1e3ccSAndroid Build Coastguard Worker   // Decisions for directly set partition types
304*77c1e3ccSAndroid Build Coastguard Worker   int is_final_decision;         ///< The flag whether it's the final decision
305*77c1e3ccSAndroid Build Coastguard Worker   int num_nodes;                 ///< The number of leaf nodes
306*77c1e3ccSAndroid Build Coastguard Worker   int partition_decision[2048];  ///< Partition decisions
307*77c1e3ccSAndroid Build Coastguard Worker   int current_decision;          ///< Partition decision for the current block
308*77c1e3ccSAndroid Build Coastguard Worker 
309*77c1e3ccSAndroid Build Coastguard Worker   // Decisions for partition type pruning
310*77c1e3ccSAndroid Build Coastguard Worker   int terminate_partition_search;  ///< Terminate further partition search
311*77c1e3ccSAndroid Build Coastguard Worker   int partition_none_allowed;      ///< Allow partition none type
312*77c1e3ccSAndroid Build Coastguard Worker   int partition_rect_allowed[2];   ///< Allow rectangular partitions
313*77c1e3ccSAndroid Build Coastguard Worker   int do_rectangular_split;        ///< Try rectangular split partition
314*77c1e3ccSAndroid Build Coastguard Worker   int do_square_split;             ///< Try square split partition
315*77c1e3ccSAndroid Build Coastguard Worker   int prune_rect_part[2];          ///< Prune rectangular partition
316*77c1e3ccSAndroid Build Coastguard Worker   int horza_partition_allowed;     ///< Allow HORZ_A partition
317*77c1e3ccSAndroid Build Coastguard Worker   int horzb_partition_allowed;     ///< Allow HORZ_B partition
318*77c1e3ccSAndroid Build Coastguard Worker   int verta_partition_allowed;     ///< Allow VERT_A partition
319*77c1e3ccSAndroid Build Coastguard Worker   int vertb_partition_allowed;     ///< Allow VERT_B partition
320*77c1e3ccSAndroid Build Coastguard Worker   int partition_horz4_allowed;     ///< Allow HORZ4 partition
321*77c1e3ccSAndroid Build Coastguard Worker   int partition_vert4_allowed;     ///< Allow VERT4 partition
322*77c1e3ccSAndroid Build Coastguard Worker } aom_partition_decision_t;
323*77c1e3ccSAndroid Build Coastguard Worker 
324*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Encoding stats for the given partition decision.
325*77c1e3ccSAndroid Build Coastguard Worker  *
326*77c1e3ccSAndroid Build Coastguard Worker  * The encoding stats collected by encoding the superblock with the
327*77c1e3ccSAndroid Build Coastguard Worker  * given partition types.
328*77c1e3ccSAndroid Build Coastguard Worker  * The encoder sends the stats to the external model for training
329*77c1e3ccSAndroid Build Coastguard Worker  * or inference through "func()" defined in ....
330*77c1e3ccSAndroid Build Coastguard Worker  */
331*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_partition_stats {
332*77c1e3ccSAndroid Build Coastguard Worker   int rate;        ///< Rate cost of the block
333*77c1e3ccSAndroid Build Coastguard Worker   int64_t dist;    ///< Distortion of the block
334*77c1e3ccSAndroid Build Coastguard Worker   int64_t rdcost;  ///< Rate-distortion cost of the block
335*77c1e3ccSAndroid Build Coastguard Worker } aom_partition_stats_t;
336*77c1e3ccSAndroid Build Coastguard Worker 
337*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Enum for return status.
338*77c1e3ccSAndroid Build Coastguard Worker  */
339*77c1e3ccSAndroid Build Coastguard Worker typedef enum aom_ext_part_status {
340*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_OK = 0,     ///< Status of success
341*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_ERROR = 1,  ///< Status of failure
342*77c1e3ccSAndroid Build Coastguard Worker   AOM_EXT_PART_TEST = 2,   ///< Status used for tests
343*77c1e3ccSAndroid Build Coastguard Worker } aom_ext_part_status_t;
344*77c1e3ccSAndroid Build Coastguard Worker 
345*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Callback of creating an external partition model.
346*77c1e3ccSAndroid Build Coastguard Worker  *
347*77c1e3ccSAndroid Build Coastguard Worker  * The callback is invoked by the encoder to create an external partition
348*77c1e3ccSAndroid Build Coastguard Worker  * model.
349*77c1e3ccSAndroid Build Coastguard Worker  *
350*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] priv Callback's private data
351*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] part_config Config information pointer for model creation
352*77c1e3ccSAndroid Build Coastguard Worker  * \param[out] ext_part_model Pointer to the model
353*77c1e3ccSAndroid Build Coastguard Worker  */
354*77c1e3ccSAndroid Build Coastguard Worker typedef aom_ext_part_status_t (*aom_ext_part_create_model_fn_t)(
355*77c1e3ccSAndroid Build Coastguard Worker     void *priv, const aom_ext_part_config_t *part_config,
356*77c1e3ccSAndroid Build Coastguard Worker     aom_ext_part_model_t *ext_part_model);
357*77c1e3ccSAndroid Build Coastguard Worker 
358*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Callback of sending features to the external partition model.
359*77c1e3ccSAndroid Build Coastguard Worker  *
360*77c1e3ccSAndroid Build Coastguard Worker  * The callback is invoked by the encoder to send features to the external
361*77c1e3ccSAndroid Build Coastguard Worker  * partition model.
362*77c1e3ccSAndroid Build Coastguard Worker  *
363*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] ext_part_model The external model
364*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] part_features Pointer to the features
365*77c1e3ccSAndroid Build Coastguard Worker  */
366*77c1e3ccSAndroid Build Coastguard Worker typedef aom_ext_part_status_t (*aom_ext_part_send_features_fn_t)(
367*77c1e3ccSAndroid Build Coastguard Worker     aom_ext_part_model_t ext_part_model,
368*77c1e3ccSAndroid Build Coastguard Worker     const aom_partition_features_t *part_features);
369*77c1e3ccSAndroid Build Coastguard Worker 
370*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Callback of receiving partition decisions from the external
371*77c1e3ccSAndroid Build Coastguard Worker  * partition model.
372*77c1e3ccSAndroid Build Coastguard Worker  *
373*77c1e3ccSAndroid Build Coastguard Worker  * The callback is invoked by the encoder to receive partition decisions from
374*77c1e3ccSAndroid Build Coastguard Worker  * the external partition model.
375*77c1e3ccSAndroid Build Coastguard Worker  *
376*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] ext_part_model The external model
377*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] ext_part_decision Pointer to the partition decisions
378*77c1e3ccSAndroid Build Coastguard Worker  */
379*77c1e3ccSAndroid Build Coastguard Worker typedef aom_ext_part_status_t (*aom_ext_part_get_decision_fn_t)(
380*77c1e3ccSAndroid Build Coastguard Worker     aom_ext_part_model_t ext_part_model,
381*77c1e3ccSAndroid Build Coastguard Worker     aom_partition_decision_t *ext_part_decision);
382*77c1e3ccSAndroid Build Coastguard Worker 
383*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Callback of sending stats to the external partition model.
384*77c1e3ccSAndroid Build Coastguard Worker  *
385*77c1e3ccSAndroid Build Coastguard Worker  * The callback is invoked by the encoder to send encoding stats to
386*77c1e3ccSAndroid Build Coastguard Worker  * the external partition model.
387*77c1e3ccSAndroid Build Coastguard Worker  *
388*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] ext_part_model The external model
389*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] ext_part_stats Pointer to the encoding stats
390*77c1e3ccSAndroid Build Coastguard Worker  */
391*77c1e3ccSAndroid Build Coastguard Worker typedef aom_ext_part_status_t (*aom_ext_part_send_partition_stats_fn_t)(
392*77c1e3ccSAndroid Build Coastguard Worker     aom_ext_part_model_t ext_part_model,
393*77c1e3ccSAndroid Build Coastguard Worker     const aom_partition_stats_t *ext_part_stats);
394*77c1e3ccSAndroid Build Coastguard Worker 
395*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Callback of deleting the external partition model.
396*77c1e3ccSAndroid Build Coastguard Worker  *
397*77c1e3ccSAndroid Build Coastguard Worker  * The callback is invoked by the encoder to delete the external partition
398*77c1e3ccSAndroid Build Coastguard Worker  * model.
399*77c1e3ccSAndroid Build Coastguard Worker  *
400*77c1e3ccSAndroid Build Coastguard Worker  * \param[in] ext_part_model The external model
401*77c1e3ccSAndroid Build Coastguard Worker  */
402*77c1e3ccSAndroid Build Coastguard Worker typedef aom_ext_part_status_t (*aom_ext_part_delete_model_fn_t)(
403*77c1e3ccSAndroid Build Coastguard Worker     aom_ext_part_model_t ext_part_model);
404*77c1e3ccSAndroid Build Coastguard Worker 
405*77c1e3ccSAndroid Build Coastguard Worker /*!\brief Callback function set for external partition model.
406*77c1e3ccSAndroid Build Coastguard Worker  *
407*77c1e3ccSAndroid Build Coastguard Worker  * Uses can enable external partition model by registering a set of
408*77c1e3ccSAndroid Build Coastguard Worker  * callback functions with the flag: AV1E_SET_EXTERNAL_PARTITION_MODEL
409*77c1e3ccSAndroid Build Coastguard Worker  */
410*77c1e3ccSAndroid Build Coastguard Worker typedef struct aom_ext_part_funcs {
411*77c1e3ccSAndroid Build Coastguard Worker   /*!
412*77c1e3ccSAndroid Build Coastguard Worker    * Create an external partition model.
413*77c1e3ccSAndroid Build Coastguard Worker    */
414*77c1e3ccSAndroid Build Coastguard Worker   aom_ext_part_create_model_fn_t create_model;
415*77c1e3ccSAndroid Build Coastguard Worker 
416*77c1e3ccSAndroid Build Coastguard Worker   /*!
417*77c1e3ccSAndroid Build Coastguard Worker    * Send features to the external partition model to make partition decisions.
418*77c1e3ccSAndroid Build Coastguard Worker    */
419*77c1e3ccSAndroid Build Coastguard Worker   aom_ext_part_send_features_fn_t send_features;
420*77c1e3ccSAndroid Build Coastguard Worker 
421*77c1e3ccSAndroid Build Coastguard Worker   /*!
422*77c1e3ccSAndroid Build Coastguard Worker    * Get partition decisions from the external partition model.
423*77c1e3ccSAndroid Build Coastguard Worker    */
424*77c1e3ccSAndroid Build Coastguard Worker   aom_ext_part_get_decision_fn_t get_partition_decision;
425*77c1e3ccSAndroid Build Coastguard Worker 
426*77c1e3ccSAndroid Build Coastguard Worker   /*!
427*77c1e3ccSAndroid Build Coastguard Worker    * Send stats of the current partition to the external model.
428*77c1e3ccSAndroid Build Coastguard Worker    */
429*77c1e3ccSAndroid Build Coastguard Worker   aom_ext_part_send_partition_stats_fn_t send_partition_stats;
430*77c1e3ccSAndroid Build Coastguard Worker 
431*77c1e3ccSAndroid Build Coastguard Worker   /*!
432*77c1e3ccSAndroid Build Coastguard Worker    * Delete the external partition model.
433*77c1e3ccSAndroid Build Coastguard Worker    */
434*77c1e3ccSAndroid Build Coastguard Worker   aom_ext_part_delete_model_fn_t delete_model;
435*77c1e3ccSAndroid Build Coastguard Worker 
436*77c1e3ccSAndroid Build Coastguard Worker   /*!
437*77c1e3ccSAndroid Build Coastguard Worker    * The decision mode of the model.
438*77c1e3ccSAndroid Build Coastguard Worker    */
439*77c1e3ccSAndroid Build Coastguard Worker   aom_ext_part_decision_mode_t decision_mode;
440*77c1e3ccSAndroid Build Coastguard Worker 
441*77c1e3ccSAndroid Build Coastguard Worker   /*!
442*77c1e3ccSAndroid Build Coastguard Worker    * Private data for the external partition model.
443*77c1e3ccSAndroid Build Coastguard Worker    */
444*77c1e3ccSAndroid Build Coastguard Worker   void *priv;
445*77c1e3ccSAndroid Build Coastguard Worker } aom_ext_part_funcs_t;
446*77c1e3ccSAndroid Build Coastguard Worker 
447*77c1e3ccSAndroid Build Coastguard Worker /*!@} - end defgroup aom_encoder*/
448*77c1e3ccSAndroid Build Coastguard Worker #ifdef __cplusplus
449*77c1e3ccSAndroid Build Coastguard Worker }  // extern "C"
450*77c1e3ccSAndroid Build Coastguard Worker #endif
451*77c1e3ccSAndroid Build Coastguard Worker 
452*77c1e3ccSAndroid Build Coastguard Worker #endif  // AOM_AOM_AOM_EXTERNAL_PARTITION_H_
453