/* * Copyright (c) 2020 The WebM project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef VPX_VPX_VPX_EXT_RATECTRL_H_ #define VPX_VPX_VPX_EXT_RATECTRL_H_ #ifdef __cplusplus extern "C" { #endif #include "./vpx_integer.h" /*!\cond TODO(angiebird): document these structures and fields to clear doxygen warnings.*/ typedef void *vpx_rc_model_t; typedef struct vpx_rc_encodeframe_decision { int q_index; } vpx_rc_encodeframe_decision_t; typedef struct vpx_rc_encodeframe_info { int frame_type; int show_index; int coding_index; } vpx_rc_encodeframe_info_t; typedef struct vpx_rc_encodeframe_result { int64_t sse; int64_t bit_count; int64_t pixel_count; } vpx_rc_encodeframe_result_t; typedef enum vpx_rc_status { vpx_rc_ok = 0, vpx_rc_error = 1, } vpx_rc_status_t; // This is a mirror of vp9's FIRSTPASS_STATS // Only spatial_layer_id is omitted typedef struct vpx_rc_frame_stats { double frame; double weight; double intra_error; double coded_error; double sr_coded_error; double frame_noise_energy; double pcnt_inter; double pcnt_motion; double pcnt_second_ref; double pcnt_neutral; double pcnt_intra_low; double pcnt_intra_high; double intra_skip_pct; double intra_smooth_pct; double inactive_zone_rows; double inactive_zone_cols; double MVr; double mvr_abs; double MVc; double mvc_abs; double MVrv; double MVcv; double mv_in_out_count; double duration; double count; } vpx_rc_frame_stats_t; typedef struct vpx_rc_firstpass_stats { vpx_rc_frame_stats_t *frame_stats; int num_frames; } vpx_rc_firstpass_stats_t; typedef struct vpx_rc_config { int frame_width; int frame_height; int show_frame_count; int target_bitrate_kbps; int frame_rate_num; int frame_rate_den; } vpx_rc_config_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 vpx_rc_config_t * \param[out] rate_ctrl_model_pt Pointer to vpx_rc_model_t */ typedef vpx_rc_status_t (*vpx_rc_create_model_cb_fn_t)( void *priv, const vpx_rc_config_t *ratectrl_config, vpx_rc_model_t *rate_ctrl_model_pt); /*!\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 vpx_rc_status_t (*vpx_rc_send_firstpass_stats_cb_fn_t)( vpx_rc_model_t rate_ctrl_model, const vpx_rc_firstpass_stats_t *first_pass_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] encode_frame_info information of the coding frame * \param[out] frame_decision encode decision of the coding frame */ typedef vpx_rc_status_t (*vpx_rc_get_encodeframe_decision_cb_fn_t)( vpx_rc_model_t rate_ctrl_model, const vpx_rc_encodeframe_info_t *encode_frame_info, vpx_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 vpx_rc_status_t (*vpx_rc_update_encodeframe_result_cb_fn_t)( vpx_rc_model_t rate_ctrl_model, const vpx_rc_encodeframe_result_t *encode_frame_result); /*!\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 vpx_rc_status_t (*vpx_rc_delete_model_cb_fn_t)( vpx_rc_model_t rate_ctrl_model); typedef struct vpx_rc_funcs { vpx_rc_create_model_cb_fn_t create_model; vpx_rc_send_firstpass_stats_cb_fn_t send_firstpass_stats; vpx_rc_get_encodeframe_decision_cb_fn_t get_encodeframe_decision; vpx_rc_update_encodeframe_result_cb_fn_t update_encodeframe_result; vpx_rc_delete_model_cb_fn_t delete_model; void *priv; } vpx_rc_funcs_t; /*!\endcond TODO(angiebird): document these structures and fields to clear doxygen warnings.*/ #ifdef __cplusplus } // extern "C" #endif #endif // VPX_VPX_VPX_EXT_RATECTRL_H_