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