/* * Copyright (c) 2021, Alliance for Open Media. All rights reserved. * * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent.
*/ #ifndef AOM_AOM_AOM_EXTERNAL_PARTITION_H_ #define AOM_AOM_AOM_EXTERNAL_PARTITION_H_
/*!\file * \brief Provides function pointer definitions for the external partition. * * \note The external partition API should be considered experimental. Until the * external partition API is declared stable, breaking changes may be made to * this API in a future libaom release.
*/
/*!\brief Current ABI version number * * \internal * If this file is altered in any way that changes the ABI, this value * must be bumped. Examples include, but are not limited to, changing * types, removing or reassigning enums, adding/removing/rearranging * fields to structures.
*/ #define AOM_EXT_PART_ABI_VERSION 8
#ifdef __cplusplus extern"C" { #endif
/*!\brief Abstract external partition model handler
*/ typedefvoid *aom_ext_part_model_t;
/*!\brief Number of features to determine whether to skip partition none and * do partition split directly. The same as "FEATURE_SIZE_SMS_SPLIT".
*/ #define AOM_EXT_PART_SIZE_DIRECT_SPLIT 17
/*!\brief Number of features to use simple motion search to prune out * rectangular partition in some direction. The same as * "FEATURE_SIZE_SMS_PRUNE_PART".
*/ #define AOM_EXT_PART_SIZE_PRUNE_PART 25
/*!\brief Number of features to prune split and rectangular partition * after PARTITION_NONE.
*/ #define AOM_EXT_PART_SIZE_PRUNE_NONE 4
/*!\brief Number of features to terminates partition after partition none using * simple_motion_search features and the rate, distortion, and rdcost of * PARTITION_NONE. The same as "FEATURE_SIZE_SMS_TERM_NONE".
*/ #define AOM_EXT_PART_SIZE_TERM_NONE 28
/*!\brief Number of features to terminates partition after partition split.
*/ #define AOM_EXT_PART_SIZE_TERM_SPLIT 31
/*!\brief Number of features to prune rectangular partition using stats * collected after partition split.
*/ #define AOM_EXT_PART_SIZE_PRUNE_RECT 9
/*!\brief Number of features to prune AB partition using stats * collected after rectangular partition..
*/ #define AOM_EXT_PART_SIZE_PRUNE_AB 10
/*!\brief Number of features to prune 4-way partition using stats * collected after AB partition.
*/ #define AOM_EXT_PART_SIZE_PRUNE_4_WAY 18
/*!\brief Decision mode of the external partition model. * AOM_EXT_PART_WHOLE_TREE: the external partition model should provide the * whole partition tree for the superblock. * * AOM_EXT_PART_RECURSIVE: the external partition model provides the partition * decision of the current block only. The decision process starts from * the superblock size, down to the smallest block size (4x4) recursively.
*/ typedefenum aom_ext_part_decision_mode {
AOM_EXT_PART_WHOLE_TREE = 0,
AOM_EXT_PART_RECURSIVE = 1,
} aom_ext_part_decision_mode_t;
/*!\brief Config information sent to the external partition model. * * For example, the maximum superblock size determined by the sequence header.
*/ typedefstruct aom_ext_part_config { int superblock_size; ///< super block size (either 64x64 or 128x128)
} aom_ext_part_config_t;
/*!\brief Features pass to the external model to make partition decisions. * Specifically, features collected before NONE partition. * Features "f" are used to determine: * partition_none_allowed, partition_horz_allowed, partition_vert_allowed, * do_rectangular_split, do_square_split * Features "f_part2" are used to determine: * prune_horz, prune_vert.
*/ typedefstruct aom_partition_features_before_none { /*! features to determine whether skip partition none and do split directly */ float f[AOM_EXT_PART_SIZE_DIRECT_SPLIT]; /*! features to determine whether to prune rectangular partition */ float f_part2[AOM_EXT_PART_SIZE_PRUNE_PART];
} aom_partition_features_before_none_t;
/*!\brief Features pass to the external model to make partition decisions. * Specifically, features collected after NONE partition.
*/ typedefstruct aom_partition_features_none { /*! features to prune split and rectangular partition */ float f[AOM_EXT_PART_SIZE_PRUNE_NONE]; /*! features to determine termination of partition */ float f_terminate[AOM_EXT_PART_SIZE_TERM_NONE];
} aom_partition_features_none_t;
/*!\brief Features pass to the external model to make partition decisions. * Specifically, features collected after SPLIT partition.
*/ typedefstruct aom_partition_features_split { /*! features to determine termination of partition */ float f_terminate[AOM_EXT_PART_SIZE_TERM_SPLIT]; /*! features to determine pruning rect partition */ float f_prune_rect[AOM_EXT_PART_SIZE_PRUNE_RECT];
} aom_partition_features_split_t;
/*!\brief Features pass to the external model to make partition decisions. * Specifically, features collected after RECTANGULAR partition.
*/ typedefstruct aom_partition_features_rect { /*! features to determine pruning AB partition */ float f[AOM_EXT_PART_SIZE_PRUNE_AB];
} aom_partition_features_rect_t;
/*!\brief Features pass to the external model to make partition decisions. * Specifically, features collected after AB partition: HORZ_A, HORZ_B, VERT_A, * VERT_B.
*/ typedefstruct aom_partition_features_ab { /*! features to determine pruning 4-way partition */ float f[AOM_EXT_PART_SIZE_PRUNE_4_WAY];
} aom_partition_features_ab_t;
/*!\brief Feature id to tell the external model the current stage in partition * pruning and what features to use to make decisions accordingly.
*/ typedefenum {
AOM_EXT_PART_FEATURE_BEFORE_NONE,
AOM_EXT_PART_FEATURE_BEFORE_NONE_PART2,
AOM_EXT_PART_FEATURE_AFTER_NONE,
AOM_EXT_PART_FEATURE_AFTER_NONE_PART2,
AOM_EXT_PART_FEATURE_AFTER_SPLIT,
AOM_EXT_PART_FEATURE_AFTER_SPLIT_PART2,
AOM_EXT_PART_FEATURE_AFTER_RECT,
AOM_EXT_PART_FEATURE_AFTER_AB
} AOM_EXT_PART_FEATURE_ID;
/*!\brief Features collected from the tpl process. * * The tpl process collects information that help measure the inter-frame * dependency. * The tpl process is computed in the unit of tpl_bsize_1d (16x16). * Therefore, the max number of units inside a superblock is * 128x128 / (16x16) = 64. Change it if the tpl process changes.
*/ typedefstruct aom_sb_tpl_features { int available; ///< If tpl stats are available int tpl_unit_length; ///< The block length of tpl process int num_units; ///< The number of units inside the current superblock
int64_t intra_cost[64]; ///< The intra cost of each unit
int64_t inter_cost[64]; ///< The inter cost of each unit
int64_t mc_dep_cost[64]; ///< The motion compensated dependency cost
} aom_sb_tpl_features_t;
/*!\brief Features collected from the simple motion process. * * The simple motion process collects information by applying motion compensated * prediction on each block. * The block size is 16x16, which could be changed. If it is changed, update * comments and the array size here.
*/ typedefstruct aom_sb_simple_motion_features { int unit_length; ///< The block length of the simple motion process int num_units; ///< The number of units inside the current superblock int block_sse[64]; ///< Sum of squared error of each unit int block_var[64]; ///< Variance of each unit
} aom_sb_simple_motion_features_t;
/*!\brief Features of each super block. * * Features collected for each super block before partition search.
*/ typedefstruct aom_sb_features { /*! Features from motion search */
aom_sb_simple_motion_features_t motion_features; /*! Features from tpl process */
aom_sb_tpl_features_t tpl_features;
} aom_sb_features_t;
/*!\brief Features pass to the external model to make partition decisions. * * The encoder sends these features to the external model through * "func()" defined in ..... * * NOTE: new member variables may be added to this structure in the future. * Once new features are finalized, bump the major version of libaom.
*/ typedefstruct aom_partition_features { // Features for the current supervised multi-stage ML model. /*! Feature ID to indicate active features */
AOM_EXT_PART_FEATURE_ID id; /*! Features collected before NONE partition */
aom_partition_features_before_none_t before_part_none; /*! Features collected after NONE partition */
aom_partition_features_none_t after_part_none; /*! Features collected after SPLIT partition */
aom_partition_features_split_t after_part_split; /*! Features collected after RECTANGULAR partition */
aom_partition_features_rect_t after_part_rect; /*! Features collected after AB partition */
aom_partition_features_ab_t after_part_ab;
// Features for a new ML model.
aom_sb_features_t sb_features; ///< Features collected for the super block int mi_row; ///< Mi_row position of the block int mi_col; ///< Mi_col position of the block int frame_width; ///< Frame width int frame_height; ///< Frame height int block_size; ///< As "BLOCK_SIZE" in av1/common/enums.h /*! * Valid partition types. A bitmask is used. "1" represents the * corresponding type is valid. The bitmask follows the enum order for * PARTITION_TYPE in "enums.h" to represent one partition type at a bit. * For example, 0x01 stands for only PARTITION_NONE is valid, * 0x09 (00...001001) stands for PARTITION_NONE and PARTITION_SPLIT are valid.
*/ int valid_partition_types; int update_type; ///< Frame update type, defined in ratectrl.h int qindex; ///< Quantization index, range: [0, 255] int rdmult; ///< Rate-distortion multiplier int pyramid_level; ///< The level of this frame in the hierarchical structure int has_above_block; ///< Has above neighbor block int above_block_width; ///< Width of the above block, -1 if not exist int above_block_height; ///< Height of the above block, -1 if not exist int has_left_block; ///< Has left neighbor block int left_block_width; ///< Width of the left block, -1 if not exist int left_block_height; ///< Height of the left block, -1 if not exist /*! * The following parameters are collected from applying simple motion search. * Sum of squared error (SSE) and variance of motion compensated residual * are good indicators of block partitioning. * If a block is a square, we also apply motion search for its 4 sub blocks. * If not a square, their values are -1. * If a block is able to split horizontally, we apply motion search and get * stats for horizontal blocks. If not, their values are -1. * If a block is able to split vertically, we apply motion search and get * stats for vertical blocks. If not, their values are -1.
*/ unsignedint block_sse; ///< SSE of motion compensated residual unsignedint block_var; ///< Variance of motion compensated residual unsignedint sub_block_sse[4]; ///< SSE of sub blocks. unsignedint sub_block_var[4]; ///< Variance of sub blocks. unsignedint horz_block_sse[2]; ///< SSE of horz sub blocks unsignedint horz_block_var[2]; ///< Variance of horz sub blocks unsignedint vert_block_sse[2]; ///< SSE of vert sub blocks unsignedint vert_block_var[2]; ///< Variance of vert sub blocks /*! * The following parameters are calculated from tpl model. * If tpl model is not available, their values are -1.
*/
int64_t tpl_intra_cost; ///< Intra cost, ref to "TplDepStats" in tpl_model.h
int64_t tpl_inter_cost; ///< Inter cost in tpl model
int64_t tpl_mc_dep_cost; ///< Motion compensated dependency cost in tpl model
} aom_partition_features_t;
/*!\brief Partition decisions received from the external model. * * The encoder receives partition decisions and encodes the superblock * with the given partition type. * The encoder receives it from "func()" define in .... * * NOTE: new member variables may be added to this structure in the future. * Once new features are finalized, bump the major version of libaom.
*/ typedefstruct aom_partition_decision { // Decisions for directly set partition types int is_final_decision; ///< The flag whether it's the final decision int num_nodes; ///< The number of leaf nodes int partition_decision[2048]; ///< Partition decisions int current_decision; ///< Partition decision for the current block
// Decisions for partition type pruning int terminate_partition_search; ///< Terminate further partition search int partition_none_allowed; ///< Allow partition none type int partition_rect_allowed[2]; ///< Allow rectangular partitions int do_rectangular_split; ///< Try rectangular split partition int do_square_split; ///< Try square split partition int prune_rect_part[2]; ///< Prune rectangular partition int horza_partition_allowed; ///< Allow HORZ_A partition int horzb_partition_allowed; ///< Allow HORZ_B partition int verta_partition_allowed; ///< Allow VERT_A partition int vertb_partition_allowed; ///< Allow VERT_B partition int partition_horz4_allowed; ///< Allow HORZ4 partition int partition_vert4_allowed; ///< Allow VERT4 partition
} aom_partition_decision_t;
/*!\brief Encoding stats for the given partition decision. * * The encoding stats collected by encoding the superblock with the * given partition types. * The encoder sends the stats to the external model for training * or inference through "func()" defined in ....
*/ typedefstruct aom_partition_stats { int rate; ///< Rate cost of the block
int64_t dist; ///< Distortion of the block
int64_t rdcost; ///< Rate-distortion cost of the block
} aom_partition_stats_t;
/*!\brief Enum for return status.
*/ typedefenum aom_ext_part_status {
AOM_EXT_PART_OK = 0, ///< Status of success
AOM_EXT_PART_ERROR = 1, ///< Status of failure
AOM_EXT_PART_TEST = 2, ///< Status used for tests
} aom_ext_part_status_t;
/*!\brief Callback of creating an external partition model. * * The callback is invoked by the encoder to create an external partition * model. * * \param[in] priv Callback's private data * \param[in] part_config Config information pointer for model creation * \param[out] ext_part_model Pointer to the model
*/ typedef aom_ext_part_status_t (*aom_ext_part_create_model_fn_t)( void *priv, const aom_ext_part_config_t *part_config,
aom_ext_part_model_t *ext_part_model);
/*!\brief Callback of sending features to the external partition model. * * The callback is invoked by the encoder to send features to the external * partition model. * * \param[in] ext_part_model The external model * \param[in] part_features Pointer to the features
*/ typedef aom_ext_part_status_t (*aom_ext_part_send_features_fn_t)(
aom_ext_part_model_t ext_part_model, const aom_partition_features_t *part_features);
/*!\brief Callback of receiving partition decisions from the external * partition model. * * The callback is invoked by the encoder to receive partition decisions from * the external partition model. * * \param[in] ext_part_model The external model * \param[in] ext_part_decision Pointer to the partition decisions
*/ typedef aom_ext_part_status_t (*aom_ext_part_get_decision_fn_t)(
aom_ext_part_model_t ext_part_model,
aom_partition_decision_t *ext_part_decision);
/*!\brief Callback of sending stats to the external partition model. * * The callback is invoked by the encoder to send encoding stats to * the external partition model. * * \param[in] ext_part_model The external model * \param[in] ext_part_stats Pointer to the encoding stats
*/ typedef aom_ext_part_status_t (*aom_ext_part_send_partition_stats_fn_t)(
aom_ext_part_model_t ext_part_model, const aom_partition_stats_t *ext_part_stats);
/*!\brief Callback of deleting the external partition model. * * The callback is invoked by the encoder to delete the external partition * model. * * \param[in] ext_part_model The external model
*/ typedef aom_ext_part_status_t (*aom_ext_part_delete_model_fn_t)(
aom_ext_part_model_t ext_part_model);
/*!\brief Callback function set for external partition model. * * Uses can enable external partition model by registering a set of * callback functions with the flag: AV1E_SET_EXTERNAL_PARTITION_MODEL
*/ typedefstruct aom_ext_part_funcs { /*! * Create an external partition model.
*/
aom_ext_part_create_model_fn_t create_model;
/*! * Send features to the external partition model to make partition decisions.
*/
aom_ext_part_send_features_fn_t send_features;
/*! * Get partition decisions from the external partition model.
*/
aom_ext_part_get_decision_fn_t get_partition_decision;
/*! * Send stats of the current partition to the external model.
*/
aom_ext_part_send_partition_stats_fn_t send_partition_stats;
/*! * Delete the external partition model.
*/
aom_ext_part_delete_model_fn_t delete_model;
/*! * The decision mode of the model.
*/
aom_ext_part_decision_mode_t decision_mode;
/*! * Private data for the external partition model.
*/ void *priv;
} aom_ext_part_funcs_t;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.