| /* |
| * Copyright (c) 2025, 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. |
| */ |
| |
| /*!\file |
| * \brief Defines structs and callbacks needed for external rate control. |
| * |
| */ |
| #ifndef AOM_AOM_AOM_EXT_RATECTRL_H_ |
| #define AOM_AOM_AOM_EXT_RATECTRL_H_ |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include "./aom_integer.h" |
| #include "./aom_tpl.h" |
| |
| /*!\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_RATECTRL_ABI_VERSION (2 + AOM_TPL_ABI_VERSION) |
| |
| /*!\brief Corresponds to MAX_STATIC_GF_GROUP_LENGTH defined in ratectrl.h |
| */ |
| #define AOM_RC_MAX_STATIC_GF_GROUP_LENGTH 250 |
| |
| /*!\brief Max number of ref frames returned by the external RC. |
| * |
| * Corresponds to REF_FRAMES defined in enums.h. |
| */ |
| #define AOM_RC_MAX_REF_FRAMES 8 |
| |
| /*!\brief Max layer depth. |
| * |
| * Corresponds to MAX_ARF_LAYERS defined in ratectrl.h. |
| */ |
| #define AOM_RC_MAX_ARF_LAYERS 6 |
| |
| /*!\brief The type of the external rate control. |
| * |
| * This controls what encoder parameters are determined by the external rate |
| * control. |
| */ |
| typedef enum aom_rc_type { |
| /*! |
| * The external rate control doesn't determine anything. |
| * This mode is used as baseline. |
| */ |
| AOM_RC_NONE = 0, |
| /*! |
| * The external rate control model determines the quantization parameter (QP) |
| * for each frame. |
| */ |
| AOM_RC_QP = 1 << 0, |
| /*! |
| * The external rate control model determines the group of picture (GOP) of |
| * the video sequence. |
| */ |
| AOM_RC_GOP = 1 << 1, |
| /*! |
| * The external rate control model determines the rate-distortion multiplier |
| * (rdmult) for the current frame. |
| */ |
| AOM_RC_RDMULT = 1 << 2, |
| /*! |
| * The external rate control model determines both QP and GOP. |
| */ |
| AOM_RC_GOP_QP = AOM_RC_QP | AOM_RC_GOP, |
| /*! |
| * The external rate control model determines the QP, GOP and the rdmult. |
| */ |
| AOM_RC_GOP_QP_RDMULT = AOM_RC_QP | AOM_RC_GOP | AOM_RC_RDMULT |
| } aom_rc_type_t; |
| |
| /*!\brief The rate control mode for the external rate control model. |
| */ |
| typedef enum aom_ext_rc_mode { |
| AOM_RC_QMODE = 0, |
| AOM_RC_VBR = 1, |
| AOM_RC_CQ = 2, |
| } aom_ext_rc_mode_t; |
| |
| /*!\brief Corresponds to FRAME_UPDATE_TYPE defined in ratectrl.h. |
| */ |
| typedef enum aom_rc_frame_update_type { |
| AOM_RC_INVALID_UPDATE_TYPE = -1, |
| AOM_RC_KF_UPDATE = 0, |
| AOM_RC_LF_UPDATE = 1, |
| AOM_RC_GF_UPDATE = 2, |
| AOM_RC_ARF_UPDATE = 3, |
| AOM_RC_OVERLAY_UPDATE = 4, |
| AOM_RC_INTNL_OVERLAY_UPDATE = 5, // Internal Overlay Frame |
| AOM_RC_INTNL_ARF_UPDATE = 6, // Internal Altref Frame |
| } aom_rc_frame_update_type_t; |
| |
| /*!\brief Name for the ref frames returned by the external RC. |
| * |
| * Corresponds to the ref frames defined in enums.h. |
| */ |
| typedef enum aom_rc_ref_name { |
| AOM_RC_INVALID_REF_FRAME = -1, |
| AOM_RC_INTRA_FRAME, |
| AOM_RC_LAST_FRAME, |
| AOM_RC_LAST2_FRAME, |
| AOM_RC_LAST3_FRAME, |
| AOM_RC_GOLDEN_FRAME, |
| AOM_RC_BWDREF_FRAME, |
| AOM_RC_ALTREF2_FRAME, |
| AOM_RC_ALTREF_FRAME, |
| } aom_rc_ref_name_t; |
| |
| /*!\brief Abstract rate control model handler |
| * |
| * The encoder will receive the model handler from |
| * aom_rc_funcs_t::create_model(). |
| */ |
| typedef void *aom_rc_model_t; |
| |
| /*!\brief A reserved value for the q index. |
| * If the external rate control model returns this value, |
| * the encoder will use the default q selected by libaom's rate control |
| * system. |
| */ |
| #define AOM_DEFAULT_Q -1 |
| |
| /*!\brief A reserved value for the rdmult. |
| * If the external rate control model returns this value, |
| * the encoder will use the default rdmult selected by libaom's rate control |
| * system. |
| */ |
| #define AOM_DEFAULT_RDMULT -1 |
| |
| /*!\brief Superblock quantization parameters |
| * Store the superblock quantiztaion parameters |
| */ |
| typedef struct aom_sb_parameters { |
| int q_index; /**< Quantizer step index [0..255]*/ |
| int rdmult; /**< Superblock level Lagrangian multiplier*/ |
| } aom_sb_params; |
| |
| /*!\brief Encode frame decision made by the external rate control model |
| * |
| * The encoder will receive the decision from the external rate control model |
| * through aom_rc_funcs_t::get_encodeframe_decision(). |
| */ |
| typedef struct aom_rc_encodeframe_decision { |
| int q_index; /**< Required: Quantizer step index [0..255]*/ |
| int rdmult; /**< Required: Frame level Lagrangian multiplier*/ |
| /*! |
| * Optional: Superblock quantization parameters |
| * It is zero initialized by default. It will be set for key and ARF frames |
| * but not leaf frames. |
| */ |
| aom_sb_params *sb_params_list; |
| } aom_rc_encodeframe_decision_t; |
| |
| /*!\brief Information for the frame to be encoded. |
| * |
| * The encoder will send the information to external rate control model through |
| * aom_rc_funcs_t::get_encodeframe_decision(). |
| * |
| */ |
| typedef struct aom_rc_encodeframe_info { |
| /*! |
| * 0: Key frame |
| * 1: Inter frame |
| * 2: Alternate reference frame |
| * 3: Overlay frame |
| * 4: Golden frame |
| */ |
| int frame_type; |
| int show_index; /**< display index, starts from zero*/ |
| int coding_index; /**< coding index, starts from zero*/ |
| /*! |
| * index of the current frame in this group of picture, starts from zero. |
| */ |
| int gop_index; |
| int ref_frame_coding_indexes[AOM_RC_MAX_REF_FRAMES]; /**< reference frames' |
| coding indices*/ |
| /*! |
| * The validity of the three reference frames. |
| * 0: Invalid |
| * 1: Valid |
| */ |
| int ref_frame_valid_list[AOM_RC_MAX_REF_FRAMES]; |
| /*! |
| * The length of the current GOP. |
| */ |
| int gop_size; |
| /*! |
| * Whether the current GOP uses an alt ref. |
| */ |
| int use_alt_ref; |
| } aom_rc_encodeframe_info_t; |
| |
| /*!\brief Frame coding result |
| * |
| * The encoder will send the result to the external rate control model through |
| * aom_rc_funcs_t::update_encodeframe_result(). |
| */ |
| typedef struct aom_rc_encodeframe_result { |
| int64_t bit_count; /**< number of bits spent on coding the frame*/ |
| int actual_encoding_qindex; /**< the actual qindex used to encode the frame*/ |
| } aom_rc_encodeframe_result_t; |
| |
| /*!\brief Status returned by rate control callback functions. |
| */ |
| typedef enum aom_rc_status { |
| AOM_RC_OK = 0, |
| AOM_RC_ERROR = 1, |
| } aom_rc_status_t; |
| |
| /*!\brief First pass frame stats |
| * This is a mirror of FIRSTPASS_STATS in firstpass.h |
| */ |
| typedef struct aom_rc_frame_stats { |
| /*! |
| * Frame number in display order, if stats are for a single frame. |
| * No real meaning for a collection of frames. |
| */ |
| double frame; |
| /*! |
| * Weight assigned to this frame (or total weight for the collection of |
| * frames) currently based on intra factor and brightness factor. This is used |
| * to distribute bits betweeen easier and harder frames. |
| */ |
| double weight; |
| /*! |
| * Intra prediction error. |
| */ |
| double intra_error; |
| /*! |
| * Average wavelet energy computed using Discrete Wavelet Transform (DWT). |
| */ |
| double frame_avg_wavelet_energy; |
| /*! |
| * Best of intra pred error and inter pred error using last frame as ref. |
| */ |
| double coded_error; |
| /*! |
| * Best of intra pred error and inter pred error using golden frame as ref. |
| */ |
| double sr_coded_error; |
| /*! |
| * Percentage of blocks with inter pred error < intra pred error. |
| */ |
| double pcnt_inter; |
| /*! |
| * Percentage of blocks using (inter prediction and) non-zero motion vectors. |
| */ |
| double pcnt_motion; |
| /*! |
| * Percentage of blocks where golden frame was better than last or intra: |
| * inter pred error using golden frame < inter pred error using last frame and |
| * inter pred error using golden frame < intra pred error |
| */ |
| double pcnt_second_ref; |
| /*! |
| * Percentage of blocks where intra and inter prediction errors were very |
| * close. Note that this is a 'weighted count', that is, the so blocks may be |
| * weighted by how close the two errors were. |
| */ |
| double pcnt_neutral; |
| /*! |
| * Percentage of blocks that have almost no intra error residual |
| * (i.e. are in effect completely flat and untextured in the intra |
| * domain). In natural videos this is uncommon, but it is much more |
| * common in animations, graphics and screen content, so may be used |
| * as a signal to detect these types of content. |
| */ |
| double intra_skip_pct; |
| /*! |
| * Image mask rows top and bottom. |
| */ |
| double inactive_zone_rows; |
| /*! |
| * Image mask columns at left and right edges. |
| */ |
| double inactive_zone_cols; |
| /*! |
| * Average of row motion vectors. |
| */ |
| double MVr; |
| /*! |
| * Mean of absolute value of row motion vectors. |
| */ |
| double mvr_abs; |
| /*! |
| * Mean of column motion vectors. |
| */ |
| double MVc; |
| /*! |
| * Mean of absolute value of column motion vectors. |
| */ |
| double mvc_abs; |
| /*! |
| * Variance of row motion vectors. |
| */ |
| double MVrv; |
| /*! |
| * Variance of column motion vectors. |
| */ |
| double MVcv; |
| /*! |
| * Value in range [-1,1] indicating fraction of row and column motion vectors |
| * that point inwards (negative MV value) or outwards (positive MV value). |
| * For example, value of 1 indicates, all row/column MVs are inwards. |
| */ |
| double mv_in_out_count; |
| /*! |
| * Count of unique non-zero motion vectors. |
| */ |
| double new_mv_count; |
| /*! |
| * Duration of the frame / collection of frames. |
| */ |
| double duration; |
| /*! |
| * 1.0 if stats are for a single frame, OR |
| * Number of frames in this collection for which the stats are accumulated. |
| */ |
| double count; |
| /*! |
| * standard deviation for (0, 0) motion prediction error |
| */ |
| double raw_error_stdev; |
| /*! |
| * Whether the frame contains a flash |
| */ |
| int64_t is_flash; |
| /*! |
| * Estimated noise variance |
| */ |
| double noise_var; |
| /*! |
| * Correlation coefficient with the previous frame |
| */ |
| double cor_coeff; |
| /*! |
| * log of intra_error |
| */ |
| double log_intra_error; |
| /*! |
| * log of coded_error |
| */ |
| double log_coded_error; |
| } aom_rc_frame_stats_t; |
| |
| /*!\brief Collection of first pass frame stats |
| */ |
| typedef struct aom_rc_firstpass_stats { |
| /*! |
| * Pointer to first pass frame stats. |
| * The pointed array of aom_rc_frame_stats_t should have length equal to |
| * number of show frames in the video. |
| */ |
| aom_rc_frame_stats_t *frame_stats; |
| /*! |
| * Number of show frames in the video. |
| */ |
| int num_frames; |
| } aom_rc_firstpass_stats_t; |
| |
| /*!\brief Encode config sent to external rate control model |
| */ |
| typedef struct aom_rc_config { |
| int frame_width; /**< frame width */ |
| int frame_height; /**< frame height */ |
| int show_frame_count; /**< number of visible frames in the video */ |
| int max_gf_interval; /**< max GOP size in number of show frames */ |
| int min_gf_interval; /**< min GOP size in number of show frames */ |
| /*! |
| * Target bitrate in kilobytes per second |
| */ |
| int target_bitrate_kbps; |
| int frame_rate_num; /**< numerator of frame rate */ |
| int frame_rate_den; /**< denominator of frame rate */ |
| /*! |
| * The following fields are only for external rate control models that support |
| * different rate control modes. |
| */ |
| aom_ext_rc_mode_t rc_mode; /**< Q mode or VBR mode */ |
| int overshoot_percent; /**< for VBR mode only */ |
| int undershoot_percent; /**< for VBR mode only */ |
| int min_base_q_index; /**< for VBR mode only */ |
| int max_base_q_index; /**< for VBR mode only */ |
| int base_qp; /**< base QP for leaf frames, 0-255 */ |
| int superblock_size; /**< 64 or 128 */ |
| } aom_rc_config_t; |
| |
| /*!\brief Control what ref frame to use and its index. |
| */ |
| typedef struct aom_rc_ref_frame { |
| /*! |
| * Ref frame index. |
| */ |
| int index[AOM_RC_MAX_REF_FRAMES]; |
| /*! |
| * Ref frame name. |
| */ |
| aom_rc_ref_name_t name[AOM_RC_MAX_REF_FRAMES]; |
| } aom_rc_ref_frame_t; |
| |
| /*!\brief A single reference frame. |
| */ |
| typedef struct aom_rc_single_ref_frame { |
| int index; /**< Ref frame index. */ |
| aom_rc_ref_name_t name; /**< Ref frame name. */ |
| } aom_rc_single_ref_frame_t; |
| |
| /*!\brief A single frame in the GOP. |
| */ |
| typedef struct aom_rc_gop_frame { |
| // Basic info |
| int order_idx; /**< Index in display order within a GOP, starting at 0. */ |
| int coding_idx; /**< Index in coding order within a GOP, starting at 0. */ |
| int display_idx; /**< The number of displayed frames preceding this frame in a |
| GOP. */ |
| int order_hint; /**< Index in display order since a key frame. */ |
| int global_order_idx; /**< Index in display order in the whole video chunk. */ |
| int global_coding_idx; /**< Index in coding order in the whole video chunk. */ |
| int is_key_frame; /**< Whether this frame is a key frame. */ |
| aom_rc_frame_update_type_t update_type; /**< The type of frame. */ |
| |
| // Reference frame info |
| /** |
| * For an overlay or show_existing frame: index of primary reference frame; |
| * otherwise -1. |
| */ |
| int colocated_ref_idx; |
| /** |
| * The reference index that this frame should be updated to. -1 when this |
| * frame will not serve as a reference frame. |
| */ |
| int update_ref_idx; |
| /** |
| * Additional bits to set in refresh_frame_flags, to allow extra frames to be |
| * evicted from the DPB. -1 for not set. |
| */ |
| int extra_refresh_frame_flags; |
| /** |
| * Candidate reference frames which may be used for coding the current frame. |
| */ |
| aom_rc_ref_frame_t ref_frame_list; |
| int layer_depth; /**< Layer depth in the GOP structure. */ |
| /** |
| * Primary reference frame (used to update current frame's initial probability |
| * model). |
| */ |
| aom_rc_single_ref_frame_t primary_ref_frame; |
| } aom_rc_gop_frame_t; |
| |
| /*!\brief The decision made by the external rate control model to set the |
| * group of picture. This struct represents a list of GOPs. |
| */ |
| typedef struct aom_rc_gop_decision { |
| int show_frame_count; /**< Number of visible frames in this GOP. */ |
| int order_hint_offset; /**< Order hint offset for this GOP. */ |
| int global_order_idx_offset; /**< Global order index offset for this GOP. */ |
| int global_coding_idx_offset; /**< Global coding index offset for this GOP. */ |
| int is_scene_cut; /**< Whether this GOP starts with a scene cut. */ |
| /** |
| * The adjustment ratio, based on which the base QP index of this GOP will be |
| * adjusted from RateControlParam::base_q_index. |
| */ |
| double base_q_ratio; |
| aom_rc_gop_frame_t *gop_frame_list; /**< List of frames in this GOP. */ |
| int gop_frame_count; |
| } aom_rc_gop_decision_t; |
| |
| /*!\brief The decision made by the external rate control model to set the |
| * key frame location and the show frame count in the key frame group |
| */ |
| typedef struct aom_rc_key_frame_decision { |
| int key_frame_show_index; /**< This key frame's show index in the video */ |
| int key_frame_group_size; /**< Show frame count of this key frame group */ |
| } aom_rc_key_frame_decision_t; |
| |
| /*!\brief Create an external rate control model callback prototype |
| * |
| * This callback is invoked by the encoder to create an external rate control |
| * model. |
| * |
| * \param[in] priv Callback's private data |
| * \param[in] ratectrl_config Pointer to aom_rc_config_t |
| * \param[out] rate_ctrl_model_ptr Pointer to aom_rc_model_t |
| */ |
| typedef aom_rc_status_t (*aom_rc_create_model_cb_fn_t)( |
| void *priv, const aom_rc_config_t *ratectrl_config, |
| aom_rc_model_t *rate_ctrl_model_ptr); |
| |
| /*!\brief Send first pass stats to the external rate control model callback |
| * prototype |
| * |
| * This callback is invoked by the encoder to send first pass stats to the |
| * external rate control model. |
| * |
| * \param[in] rate_ctrl_model rate control model |
| * \param[in] first_pass_stats first pass stats |
| */ |
| typedef aom_rc_status_t (*aom_rc_send_firstpass_stats_cb_fn_t)( |
| aom_rc_model_t rate_ctrl_model, |
| const aom_rc_firstpass_stats_t *first_pass_stats); |
| |
| /*!\brief Send TPL stats for the current GOP to the external rate control model |
| * callback prototype |
| * |
| * This callback is invoked by the encoder to send TPL stats for the GOP to the |
| * external rate control model. |
| * |
| * \param[in] rate_ctrl_model rate control model |
| * \param[in] tpl_gop_stats TPL stats for current GOP |
| */ |
| typedef aom_rc_status_t (*aom_rc_send_tpl_gop_stats_cb_fn_t)( |
| aom_rc_model_t rate_ctrl_model, const AomTplGopStats *extrc_tpl_gop_stats); |
| |
| /*!\brief Receive encode frame decision callback prototype |
| * |
| * This callback is invoked by the encoder to receive encode frame decision from |
| * the external rate control model. |
| * |
| * \param[in] rate_ctrl_model rate control model |
| * \param[in] frame_gop_index index of the frame in current gop |
| * \param[out] frame_decision encode decision of the coding frame |
| */ |
| typedef aom_rc_status_t (*aom_rc_get_encodeframe_decision_cb_fn_t)( |
| aom_rc_model_t rate_ctrl_model, const int frame_gop_index, |
| aom_rc_encodeframe_decision_t *frame_decision); |
| |
| /*!\brief Update encode frame result callback prototype |
| * |
| * This callback is invoked by the encoder to update encode frame result to the |
| * external rate control model. |
| * |
| * \param[in] rate_ctrl_model rate control model |
| * \param[out] encode_frame_result encode result of the coding frame |
| */ |
| typedef aom_rc_status_t (*aom_rc_update_encodeframe_result_cb_fn_t)( |
| aom_rc_model_t rate_ctrl_model, |
| const aom_rc_encodeframe_result_t *encode_frame_result); |
| |
| /*!\brief Get the key frame decision from the external rate control model. |
| * |
| * This callback is invoked by the encoder to get key frame decision from |
| * the external rate control model. |
| * |
| * \param[in] rate_ctrl_model rate control model |
| * \param[out] key_frame_decision key frame decision from the model |
| */ |
| typedef aom_rc_status_t (*aom_rc_get_key_frame_decision_cb_fn_t)( |
| aom_rc_model_t rate_ctrl_model, |
| aom_rc_key_frame_decision_t *key_frame_decision); |
| |
| /*!\brief Get the GOP structure from the external rate control model. |
| * |
| * This callback is invoked by the encoder to get GOP decisions from |
| * the external rate control model. |
| * |
| * \param[in] rate_ctrl_model rate control model |
| * \param[out] gop_decision GOP decision from the model |
| */ |
| typedef aom_rc_status_t (*aom_rc_get_gop_decision_cb_fn_t)( |
| aom_rc_model_t rate_ctrl_model, aom_rc_gop_decision_t *gop_decision); |
| |
| /*!\brief Get the frame rdmult from the external rate control model. |
| * |
| * This callback is invoked by the encoder to get rdmult from |
| * the external rate control model. |
| * |
| * \param[in] rate_ctrl_model rate control model |
| * \param[in] frame_info information collected from the encoder |
| * \param[out] rdmult frame rate-distortion multiplier from the model |
| */ |
| typedef aom_rc_status_t (*aom_rc_get_frame_rdmult_cb_fn_t)( |
| aom_rc_model_t rate_ctrl_model, const aom_rc_encodeframe_info_t *frame_info, |
| int *rdmult); |
| |
| /*!\brief Delete the external rate control model callback prototype |
| * |
| * This callback is invoked by the encoder to delete the external rate control |
| * model. |
| * |
| * \param[in] rate_ctrl_model rate control model |
| */ |
| typedef aom_rc_status_t (*aom_rc_delete_model_cb_fn_t)( |
| aom_rc_model_t rate_ctrl_model); |
| |
| /*!\brief Callback function set for external rate control. |
| * |
| * The user can enable external rate control by registering |
| * a set of callback functions with the codec control flag |
| * #AOME_SET_EXTERNAL_RATE_CONTROL. |
| */ |
| typedef struct aom_rc_funcs { |
| /*! |
| * The rate control type of this API. |
| */ |
| aom_rc_type_t rc_type; |
| /*! |
| * Create an external rate control model. |
| */ |
| aom_rc_create_model_cb_fn_t create_model; |
| /*! |
| * Send first pass stats to the external rate control model. |
| */ |
| aom_rc_send_firstpass_stats_cb_fn_t send_firstpass_stats; |
| /*! |
| * Send TPL stats for current GOP to the external rate control model. |
| */ |
| aom_rc_send_tpl_gop_stats_cb_fn_t send_tpl_gop_stats; |
| /*! |
| * Get encodeframe decision from the external rate control model. |
| */ |
| aom_rc_get_encodeframe_decision_cb_fn_t get_encodeframe_decision; |
| /*! |
| * Update encodeframe result to the external rate control model. |
| */ |
| aom_rc_update_encodeframe_result_cb_fn_t update_encodeframe_result; |
| /*! |
| * Get key frame decision from the external rate control model. |
| */ |
| aom_rc_get_key_frame_decision_cb_fn_t get_key_frame_decision; |
| /*! |
| * Get GOP decisions from the external rate control model. |
| */ |
| aom_rc_get_gop_decision_cb_fn_t get_gop_decision; |
| /*! |
| * Get rdmult for the frame from the external rate control model. |
| */ |
| aom_rc_get_frame_rdmult_cb_fn_t get_frame_rdmult; |
| /*! |
| * Delete the external rate control model. |
| */ |
| aom_rc_delete_model_cb_fn_t delete_model; |
| /*! |
| * Private data for the external rate control model. |
| */ |
| void *priv; |
| } aom_rc_funcs_t; |
| |
| #ifdef __cplusplus |
| } // extern "C" |
| #endif |
| |
| #endif // AOM_AOM_AOM_EXT_RATECTRL_H_ |