summaryrefslogtreecommitdiff
path: root/vpx/vpx_ext_ratectrl.h
blob: 940227ac296e784fb49fd71586fdf64d2d59b892 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
/*
 *  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;

// 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 int (*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 int (*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 int (*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 int (*vpx_rc_update_encodeframe_result_cb_fn_t)(
    vpx_rc_model_t rate_ctrl_model,
    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 int (*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_