blob: 5d5a7c92d50cc4202231717a7e30abb3dbbcd5a9 [file] [log] [blame]
/*
* 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;
int ref_frame_coding_indexes[3];
int ref_frame_valid_list[3];
} 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_