xref: /aosp_15_r20/external/libvpx/vpx/vpx_ext_ratectrl.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2020 The WebM project authors. All Rights Reserved.
3*fb1b10abSAndroid Build Coastguard Worker  *
4*fb1b10abSAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*fb1b10abSAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*fb1b10abSAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*fb1b10abSAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*fb1b10abSAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*fb1b10abSAndroid Build Coastguard Worker  */
10*fb1b10abSAndroid Build Coastguard Worker 
11*fb1b10abSAndroid Build Coastguard Worker /*!\file
12*fb1b10abSAndroid Build Coastguard Worker  * \brief Defines structs and callbacks needed for external rate control.
13*fb1b10abSAndroid Build Coastguard Worker  *
14*fb1b10abSAndroid Build Coastguard Worker  */
15*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VPX_VPX_EXT_RATECTRL_H_
16*fb1b10abSAndroid Build Coastguard Worker #define VPX_VPX_VPX_EXT_RATECTRL_H_
17*fb1b10abSAndroid Build Coastguard Worker 
18*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
19*fb1b10abSAndroid Build Coastguard Worker extern "C" {
20*fb1b10abSAndroid Build Coastguard Worker #endif
21*fb1b10abSAndroid Build Coastguard Worker 
22*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_integer.h"
23*fb1b10abSAndroid Build Coastguard Worker #include "./vpx_tpl.h"
24*fb1b10abSAndroid Build Coastguard Worker 
25*fb1b10abSAndroid Build Coastguard Worker /*!\brief Current ABI version number
26*fb1b10abSAndroid Build Coastguard Worker  *
27*fb1b10abSAndroid Build Coastguard Worker  * \internal
28*fb1b10abSAndroid Build Coastguard Worker  * If this file is altered in any way that changes the ABI, this value
29*fb1b10abSAndroid Build Coastguard Worker  * must be bumped. Examples include, but are not limited to, changing
30*fb1b10abSAndroid Build Coastguard Worker  * types, removing or reassigning enums, adding/removing/rearranging
31*fb1b10abSAndroid Build Coastguard Worker  * fields to structures.
32*fb1b10abSAndroid Build Coastguard Worker  */
33*fb1b10abSAndroid Build Coastguard Worker #define VPX_EXT_RATECTRL_ABI_VERSION (5 + VPX_TPL_ABI_VERSION)
34*fb1b10abSAndroid Build Coastguard Worker 
35*fb1b10abSAndroid Build Coastguard Worker /*!\brief Corresponds to MAX_STATIC_GF_GROUP_LENGTH defined in vp9_ratectrl.h
36*fb1b10abSAndroid Build Coastguard Worker  */
37*fb1b10abSAndroid Build Coastguard Worker #define VPX_RC_MAX_STATIC_GF_GROUP_LENGTH 250
38*fb1b10abSAndroid Build Coastguard Worker 
39*fb1b10abSAndroid Build Coastguard Worker /*!\brief Max number of ref frames returned by the external RC.
40*fb1b10abSAndroid Build Coastguard Worker  *
41*fb1b10abSAndroid Build Coastguard Worker  * Corresponds to MAX_REF_FRAMES defined in vp9_blockd.h.
42*fb1b10abSAndroid Build Coastguard Worker  */
43*fb1b10abSAndroid Build Coastguard Worker #define VPX_RC_MAX_REF_FRAMES 4
44*fb1b10abSAndroid Build Coastguard Worker 
45*fb1b10abSAndroid Build Coastguard Worker /*!\brief The type of the external rate control.
46*fb1b10abSAndroid Build Coastguard Worker  *
47*fb1b10abSAndroid Build Coastguard Worker  * This controls what encoder parameters are determined by the external rate
48*fb1b10abSAndroid Build Coastguard Worker  * control.
49*fb1b10abSAndroid Build Coastguard Worker  */
50*fb1b10abSAndroid Build Coastguard Worker typedef enum vpx_rc_type {
51*fb1b10abSAndroid Build Coastguard Worker   /*!
52*fb1b10abSAndroid Build Coastguard Worker    * The external rate control doesn't determine anything.
53*fb1b10abSAndroid Build Coastguard Worker    * This mode is used as baseline.
54*fb1b10abSAndroid Build Coastguard Worker    */
55*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_NONE = 0,
56*fb1b10abSAndroid Build Coastguard Worker   /*!
57*fb1b10abSAndroid Build Coastguard Worker    * The external rate control model determines the quantization parameter (QP)
58*fb1b10abSAndroid Build Coastguard Worker    * for each frame.
59*fb1b10abSAndroid Build Coastguard Worker    */
60*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_QP = 1 << 0,
61*fb1b10abSAndroid Build Coastguard Worker   /*!
62*fb1b10abSAndroid Build Coastguard Worker    * The external rate control model determines the group of picture (GOP) of
63*fb1b10abSAndroid Build Coastguard Worker    * the video sequence.
64*fb1b10abSAndroid Build Coastguard Worker    */
65*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_GOP = 1 << 1,
66*fb1b10abSAndroid Build Coastguard Worker   /*!
67*fb1b10abSAndroid Build Coastguard Worker    * The external rate control model determines the rate-distortion multiplier
68*fb1b10abSAndroid Build Coastguard Worker    * (rdmult) for the current frame.
69*fb1b10abSAndroid Build Coastguard Worker    */
70*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_RDMULT = 1 << 2,
71*fb1b10abSAndroid Build Coastguard Worker   /*!
72*fb1b10abSAndroid Build Coastguard Worker    * The external rate control model determines both QP and GOP.
73*fb1b10abSAndroid Build Coastguard Worker    */
74*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_GOP_QP = VPX_RC_QP | VPX_RC_GOP,
75*fb1b10abSAndroid Build Coastguard Worker   /*!
76*fb1b10abSAndroid Build Coastguard Worker    * The external rate control model determines the QP, GOP and the rdmult.
77*fb1b10abSAndroid Build Coastguard Worker    */
78*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_GOP_QP_RDMULT = VPX_RC_QP | VPX_RC_GOP | VPX_RC_RDMULT
79*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_type_t;
80*fb1b10abSAndroid Build Coastguard Worker 
81*fb1b10abSAndroid Build Coastguard Worker /*!\brief The rate control mode for the external rate control model.
82*fb1b10abSAndroid Build Coastguard Worker  */
83*fb1b10abSAndroid Build Coastguard Worker typedef enum vpx_ext_rc_mode {
84*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_QMODE = 0,
85*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_VBR = 1,
86*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_CQ = 2,
87*fb1b10abSAndroid Build Coastguard Worker } vpx_ext_rc_mode_t;
88*fb1b10abSAndroid Build Coastguard Worker 
89*fb1b10abSAndroid Build Coastguard Worker /*!\brief Corresponds to FRAME_UPDATE_TYPE defined in vp9_firstpass.h.
90*fb1b10abSAndroid Build Coastguard Worker  */
91*fb1b10abSAndroid Build Coastguard Worker typedef enum vpx_rc_frame_update_type {
92*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_INVALID_UPDATE_TYPE = -1,
93*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_KF_UPDATE = 0,
94*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_LF_UPDATE = 1,
95*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_GF_UPDATE = 2,
96*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_ARF_UPDATE = 3,
97*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_OVERLAY_UPDATE = 4,
98*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_MID_OVERLAY_UPDATE = 5,
99*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_USE_BUF_FRAME = 6,
100*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_frame_update_type_t;
101*fb1b10abSAndroid Build Coastguard Worker 
102*fb1b10abSAndroid Build Coastguard Worker /*!\brief Name for the ref frames returned by the external RC.
103*fb1b10abSAndroid Build Coastguard Worker  *
104*fb1b10abSAndroid Build Coastguard Worker  * Corresponds to the ref frames defined in vp9_blockd.h.
105*fb1b10abSAndroid Build Coastguard Worker  */
106*fb1b10abSAndroid Build Coastguard Worker typedef enum vpx_rc_ref_name {
107*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_INVALID_REF_FRAME = -1,
108*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_INTRA_FRAME = 0,
109*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_LAST_FRAME = 1,
110*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_GOLDEN_FRAME = 2,
111*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_ALTREF_FRAME = 3,
112*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_ref_name_t;
113*fb1b10abSAndroid Build Coastguard Worker 
114*fb1b10abSAndroid Build Coastguard Worker /*!\brief Abstract rate control model handler
115*fb1b10abSAndroid Build Coastguard Worker  *
116*fb1b10abSAndroid Build Coastguard Worker  * The encoder will receive the model handler from
117*fb1b10abSAndroid Build Coastguard Worker  * vpx_rc_funcs_t::create_model().
118*fb1b10abSAndroid Build Coastguard Worker  */
119*fb1b10abSAndroid Build Coastguard Worker typedef void *vpx_rc_model_t;
120*fb1b10abSAndroid Build Coastguard Worker 
121*fb1b10abSAndroid Build Coastguard Worker /*!\brief A reserved value for the q index.
122*fb1b10abSAndroid Build Coastguard Worker  * If the external rate control model returns this value,
123*fb1b10abSAndroid Build Coastguard Worker  * the encoder will use the default q selected by libvpx's rate control
124*fb1b10abSAndroid Build Coastguard Worker  * system.
125*fb1b10abSAndroid Build Coastguard Worker  */
126*fb1b10abSAndroid Build Coastguard Worker #define VPX_DEFAULT_Q -1
127*fb1b10abSAndroid Build Coastguard Worker 
128*fb1b10abSAndroid Build Coastguard Worker /*!\brief A reserved value for the rdmult.
129*fb1b10abSAndroid Build Coastguard Worker  * If the external rate control model returns this value,
130*fb1b10abSAndroid Build Coastguard Worker  * the encoder will use the default rdmult selected by libvpx's rate control
131*fb1b10abSAndroid Build Coastguard Worker  * system.
132*fb1b10abSAndroid Build Coastguard Worker  */
133*fb1b10abSAndroid Build Coastguard Worker #define VPX_DEFAULT_RDMULT -1
134*fb1b10abSAndroid Build Coastguard Worker 
135*fb1b10abSAndroid Build Coastguard Worker /*!\brief Encode frame decision made by the external rate control model
136*fb1b10abSAndroid Build Coastguard Worker  *
137*fb1b10abSAndroid Build Coastguard Worker  * The encoder will receive the decision from the external rate control model
138*fb1b10abSAndroid Build Coastguard Worker  * through vpx_rc_funcs_t::get_encodeframe_decision().
139*fb1b10abSAndroid Build Coastguard Worker  */
140*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_encodeframe_decision {
141*fb1b10abSAndroid Build Coastguard Worker   int q_index; /**< Quantizer step index [0..255]*/
142*fb1b10abSAndroid Build Coastguard Worker   int rdmult;  /**< Frame level Lagrangian multiplier*/
143*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_encodeframe_decision_t;
144*fb1b10abSAndroid Build Coastguard Worker 
145*fb1b10abSAndroid Build Coastguard Worker /*!\brief Information for the frame to be encoded.
146*fb1b10abSAndroid Build Coastguard Worker  *
147*fb1b10abSAndroid Build Coastguard Worker  * The encoder will send the information to external rate control model through
148*fb1b10abSAndroid Build Coastguard Worker  * vpx_rc_funcs_t::get_encodeframe_decision().
149*fb1b10abSAndroid Build Coastguard Worker  *
150*fb1b10abSAndroid Build Coastguard Worker  */
151*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_encodeframe_info {
152*fb1b10abSAndroid Build Coastguard Worker   /*!
153*fb1b10abSAndroid Build Coastguard Worker    * 0: Key frame
154*fb1b10abSAndroid Build Coastguard Worker    * 1: Inter frame
155*fb1b10abSAndroid Build Coastguard Worker    * 2: Alternate reference frame
156*fb1b10abSAndroid Build Coastguard Worker    * 3: Overlay frame
157*fb1b10abSAndroid Build Coastguard Worker    * 4: Golden frame
158*fb1b10abSAndroid Build Coastguard Worker    */
159*fb1b10abSAndroid Build Coastguard Worker   int frame_type;
160*fb1b10abSAndroid Build Coastguard Worker   int show_index;   /**< display index, starts from zero*/
161*fb1b10abSAndroid Build Coastguard Worker   int coding_index; /**< coding index, starts from zero*/
162*fb1b10abSAndroid Build Coastguard Worker   /*!
163*fb1b10abSAndroid Build Coastguard Worker    * index of the current frame in this group of picture, starts from zero.
164*fb1b10abSAndroid Build Coastguard Worker    */
165*fb1b10abSAndroid Build Coastguard Worker   int gop_index;
166*fb1b10abSAndroid Build Coastguard Worker   int ref_frame_coding_indexes[3]; /**< three reference frames' coding indices*/
167*fb1b10abSAndroid Build Coastguard Worker   /*!
168*fb1b10abSAndroid Build Coastguard Worker    * The validity of the three reference frames.
169*fb1b10abSAndroid Build Coastguard Worker    * 0: Invalid
170*fb1b10abSAndroid Build Coastguard Worker    * 1: Valid
171*fb1b10abSAndroid Build Coastguard Worker    */
172*fb1b10abSAndroid Build Coastguard Worker   int ref_frame_valid_list[3];
173*fb1b10abSAndroid Build Coastguard Worker   /*!
174*fb1b10abSAndroid Build Coastguard Worker    * The length of the current GOP.
175*fb1b10abSAndroid Build Coastguard Worker    */
176*fb1b10abSAndroid Build Coastguard Worker   int gop_size;
177*fb1b10abSAndroid Build Coastguard Worker   /*!
178*fb1b10abSAndroid Build Coastguard Worker    * Whether the current GOP uses an alt ref.
179*fb1b10abSAndroid Build Coastguard Worker    */
180*fb1b10abSAndroid Build Coastguard Worker   int use_alt_ref;
181*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_encodeframe_info_t;
182*fb1b10abSAndroid Build Coastguard Worker 
183*fb1b10abSAndroid Build Coastguard Worker /*!\brief Frame coding result
184*fb1b10abSAndroid Build Coastguard Worker  *
185*fb1b10abSAndroid Build Coastguard Worker  * The encoder will send the result to the external rate control model through
186*fb1b10abSAndroid Build Coastguard Worker  * vpx_rc_funcs_t::update_encodeframe_result().
187*fb1b10abSAndroid Build Coastguard Worker  */
188*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_encodeframe_result {
189*fb1b10abSAndroid Build Coastguard Worker   int64_t bit_count;          /**< number of bits spent on coding the frame*/
190*fb1b10abSAndroid Build Coastguard Worker   int actual_encoding_qindex; /**< the actual qindex used to encode the frame*/
191*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_encodeframe_result_t;
192*fb1b10abSAndroid Build Coastguard Worker 
193*fb1b10abSAndroid Build Coastguard Worker /*!\brief Status returned by rate control callback functions.
194*fb1b10abSAndroid Build Coastguard Worker  */
195*fb1b10abSAndroid Build Coastguard Worker typedef enum vpx_rc_status {
196*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_OK = 0,
197*fb1b10abSAndroid Build Coastguard Worker   VPX_RC_ERROR = 1,
198*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_status_t;
199*fb1b10abSAndroid Build Coastguard Worker 
200*fb1b10abSAndroid Build Coastguard Worker /*!\brief First pass frame stats
201*fb1b10abSAndroid Build Coastguard Worker  * This is a mirror of vp9's FIRSTPASS_STATS except that spatial_layer_id is
202*fb1b10abSAndroid Build Coastguard Worker  * omitted
203*fb1b10abSAndroid Build Coastguard Worker  */
204*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_frame_stats {
205*fb1b10abSAndroid Build Coastguard Worker   /*!
206*fb1b10abSAndroid Build Coastguard Worker    * Frame number in display order, if stats are for a single frame.
207*fb1b10abSAndroid Build Coastguard Worker    * No real meaning for a collection of frames.
208*fb1b10abSAndroid Build Coastguard Worker    */
209*fb1b10abSAndroid Build Coastguard Worker   double frame;
210*fb1b10abSAndroid Build Coastguard Worker   /*!
211*fb1b10abSAndroid Build Coastguard Worker    * Weight assigned to this frame (or total weight for the collection of
212*fb1b10abSAndroid Build Coastguard Worker    * frames) currently based on intra factor and brightness factor. This is used
213*fb1b10abSAndroid Build Coastguard Worker    * to distribute bits between easier and harder frames.
214*fb1b10abSAndroid Build Coastguard Worker    */
215*fb1b10abSAndroid Build Coastguard Worker   double weight;
216*fb1b10abSAndroid Build Coastguard Worker   /*!
217*fb1b10abSAndroid Build Coastguard Worker    * Intra prediction error.
218*fb1b10abSAndroid Build Coastguard Worker    */
219*fb1b10abSAndroid Build Coastguard Worker   double intra_error;
220*fb1b10abSAndroid Build Coastguard Worker   /*!
221*fb1b10abSAndroid Build Coastguard Worker    * Best of intra pred error and inter pred error using last frame as ref.
222*fb1b10abSAndroid Build Coastguard Worker    */
223*fb1b10abSAndroid Build Coastguard Worker   double coded_error;
224*fb1b10abSAndroid Build Coastguard Worker   /*!
225*fb1b10abSAndroid Build Coastguard Worker    * Best of intra pred error and inter pred error using golden frame as ref.
226*fb1b10abSAndroid Build Coastguard Worker    */
227*fb1b10abSAndroid Build Coastguard Worker   double sr_coded_error;
228*fb1b10abSAndroid Build Coastguard Worker   /*!
229*fb1b10abSAndroid Build Coastguard Worker    * Estimate the noise energy of the current frame.
230*fb1b10abSAndroid Build Coastguard Worker    */
231*fb1b10abSAndroid Build Coastguard Worker   double frame_noise_energy;
232*fb1b10abSAndroid Build Coastguard Worker   /*!
233*fb1b10abSAndroid Build Coastguard Worker    * Percentage of blocks with inter pred error < intra pred error.
234*fb1b10abSAndroid Build Coastguard Worker    */
235*fb1b10abSAndroid Build Coastguard Worker   double pcnt_inter;
236*fb1b10abSAndroid Build Coastguard Worker   /*!
237*fb1b10abSAndroid Build Coastguard Worker    * Percentage of blocks using (inter prediction and) non-zero motion vectors.
238*fb1b10abSAndroid Build Coastguard Worker    */
239*fb1b10abSAndroid Build Coastguard Worker   double pcnt_motion;
240*fb1b10abSAndroid Build Coastguard Worker   /*!
241*fb1b10abSAndroid Build Coastguard Worker    * Percentage of blocks where golden frame was better than last or intra:
242*fb1b10abSAndroid Build Coastguard Worker    * inter pred error using golden frame < inter pred error using last frame and
243*fb1b10abSAndroid Build Coastguard Worker    * inter pred error using golden frame < intra pred error
244*fb1b10abSAndroid Build Coastguard Worker    */
245*fb1b10abSAndroid Build Coastguard Worker   double pcnt_second_ref;
246*fb1b10abSAndroid Build Coastguard Worker   /*!
247*fb1b10abSAndroid Build Coastguard Worker    * Percentage of blocks where intra and inter prediction errors were very
248*fb1b10abSAndroid Build Coastguard Worker    * close.
249*fb1b10abSAndroid Build Coastguard Worker    */
250*fb1b10abSAndroid Build Coastguard Worker   double pcnt_neutral;
251*fb1b10abSAndroid Build Coastguard Worker   /*!
252*fb1b10abSAndroid Build Coastguard Worker    * Percentage of blocks that have intra error < inter error and inter error <
253*fb1b10abSAndroid Build Coastguard Worker    * LOW_I_THRESH
254*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 8: LOW_I_THRESH = 24000
255*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 10: LOW_I_THRESH = 24000 << 4
256*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 12: LOW_I_THRESH = 24000 << 8
257*fb1b10abSAndroid Build Coastguard Worker    */
258*fb1b10abSAndroid Build Coastguard Worker   double pcnt_intra_low;
259*fb1b10abSAndroid Build Coastguard Worker   /*!
260*fb1b10abSAndroid Build Coastguard Worker    * Percentage of blocks that have intra error < inter error and intra error <
261*fb1b10abSAndroid Build Coastguard Worker    * LOW_I_THRESH but inter error >= LOW_I_THRESH LOW_I_THRESH
262*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 8: LOW_I_THRESH = 24000
263*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 10: LOW_I_THRESH = 24000 << 4
264*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 12: LOW_I_THRESH = 24000 << 8
265*fb1b10abSAndroid Build Coastguard Worker    */
266*fb1b10abSAndroid Build Coastguard Worker   double pcnt_intra_high;
267*fb1b10abSAndroid Build Coastguard Worker   /*!
268*fb1b10abSAndroid Build Coastguard Worker    * Percentage of blocks that have almost no intra error residual
269*fb1b10abSAndroid Build Coastguard Worker    * (i.e. are in effect completely flat and untextured in the intra
270*fb1b10abSAndroid Build Coastguard Worker    * domain). In natural videos this is uncommon, but it is much more
271*fb1b10abSAndroid Build Coastguard Worker    * common in animations, graphics and screen content, so may be used
272*fb1b10abSAndroid Build Coastguard Worker    * as a signal to detect these types of content.
273*fb1b10abSAndroid Build Coastguard Worker    */
274*fb1b10abSAndroid Build Coastguard Worker   double intra_skip_pct;
275*fb1b10abSAndroid Build Coastguard Worker   /*!
276*fb1b10abSAndroid Build Coastguard Worker    * Percentage of blocks that have intra error < SMOOTH_INTRA_THRESH
277*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 8:  SMOOTH_INTRA_THRESH = 4000
278*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 10: SMOOTH_INTRA_THRESH = 4000 << 4
279*fb1b10abSAndroid Build Coastguard Worker    * - bit_depth 12: SMOOTH_INTRA_THRESH = 4000 << 8
280*fb1b10abSAndroid Build Coastguard Worker    */
281*fb1b10abSAndroid Build Coastguard Worker   double intra_smooth_pct;
282*fb1b10abSAndroid Build Coastguard Worker   /*!
283*fb1b10abSAndroid Build Coastguard Worker    * Image mask rows top and bottom.
284*fb1b10abSAndroid Build Coastguard Worker    */
285*fb1b10abSAndroid Build Coastguard Worker   double inactive_zone_rows;
286*fb1b10abSAndroid Build Coastguard Worker   /*!
287*fb1b10abSAndroid Build Coastguard Worker    * Image mask columns at left and right edges.
288*fb1b10abSAndroid Build Coastguard Worker    */
289*fb1b10abSAndroid Build Coastguard Worker   double inactive_zone_cols;
290*fb1b10abSAndroid Build Coastguard Worker   /*!
291*fb1b10abSAndroid Build Coastguard Worker    * Mean of row motion vectors.
292*fb1b10abSAndroid Build Coastguard Worker    */
293*fb1b10abSAndroid Build Coastguard Worker   double MVr;
294*fb1b10abSAndroid Build Coastguard Worker   /*!
295*fb1b10abSAndroid Build Coastguard Worker    * Mean of absolute value of row motion vectors.
296*fb1b10abSAndroid Build Coastguard Worker    */
297*fb1b10abSAndroid Build Coastguard Worker   double mvr_abs;
298*fb1b10abSAndroid Build Coastguard Worker   /*!
299*fb1b10abSAndroid Build Coastguard Worker    * Mean of column motion vectors.
300*fb1b10abSAndroid Build Coastguard Worker    */
301*fb1b10abSAndroid Build Coastguard Worker   double MVc;
302*fb1b10abSAndroid Build Coastguard Worker   /*!
303*fb1b10abSAndroid Build Coastguard Worker    * Mean of absolute value of column motion vectors.
304*fb1b10abSAndroid Build Coastguard Worker    */
305*fb1b10abSAndroid Build Coastguard Worker   double mvc_abs;
306*fb1b10abSAndroid Build Coastguard Worker   /*!
307*fb1b10abSAndroid Build Coastguard Worker    * Variance of row motion vectors.
308*fb1b10abSAndroid Build Coastguard Worker    */
309*fb1b10abSAndroid Build Coastguard Worker   double MVrv;
310*fb1b10abSAndroid Build Coastguard Worker   /*!
311*fb1b10abSAndroid Build Coastguard Worker    * Variance of column motion vectors.
312*fb1b10abSAndroid Build Coastguard Worker    */
313*fb1b10abSAndroid Build Coastguard Worker   double MVcv;
314*fb1b10abSAndroid Build Coastguard Worker   /*!
315*fb1b10abSAndroid Build Coastguard Worker    * Value in range [-1,1] indicating fraction of row and column motion vectors
316*fb1b10abSAndroid Build Coastguard Worker    * that point inwards (negative MV value) or outwards (positive MV value).
317*fb1b10abSAndroid Build Coastguard Worker    * For example, value of 1 indicates, all row/column MVs are inwards.
318*fb1b10abSAndroid Build Coastguard Worker    */
319*fb1b10abSAndroid Build Coastguard Worker   double mv_in_out_count;
320*fb1b10abSAndroid Build Coastguard Worker   /*!
321*fb1b10abSAndroid Build Coastguard Worker    * Duration of the frame / collection of frames.
322*fb1b10abSAndroid Build Coastguard Worker    */
323*fb1b10abSAndroid Build Coastguard Worker   double duration;
324*fb1b10abSAndroid Build Coastguard Worker   /*!
325*fb1b10abSAndroid Build Coastguard Worker    * 1.0 if stats are for a single frame, or
326*fb1b10abSAndroid Build Coastguard Worker    * number of frames whose stats are accumulated.
327*fb1b10abSAndroid Build Coastguard Worker    */
328*fb1b10abSAndroid Build Coastguard Worker   double count;
329*fb1b10abSAndroid Build Coastguard Worker   /*!
330*fb1b10abSAndroid Build Coastguard Worker    * Number of new mv in a frame.
331*fb1b10abSAndroid Build Coastguard Worker    */
332*fb1b10abSAndroid Build Coastguard Worker   double new_mv_count;
333*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_frame_stats_t;
334*fb1b10abSAndroid Build Coastguard Worker 
335*fb1b10abSAndroid Build Coastguard Worker /*!\brief Collection of first pass frame stats
336*fb1b10abSAndroid Build Coastguard Worker  */
337*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_firstpass_stats {
338*fb1b10abSAndroid Build Coastguard Worker   /*!
339*fb1b10abSAndroid Build Coastguard Worker    * Pointer to first pass frame stats.
340*fb1b10abSAndroid Build Coastguard Worker    * The pointed array of vpx_rc_frame_stats_t should have length equal to
341*fb1b10abSAndroid Build Coastguard Worker    * number of show frames in the video.
342*fb1b10abSAndroid Build Coastguard Worker    */
343*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_frame_stats_t *frame_stats;
344*fb1b10abSAndroid Build Coastguard Worker   /*!
345*fb1b10abSAndroid Build Coastguard Worker    * Number of show frames in the video.
346*fb1b10abSAndroid Build Coastguard Worker    */
347*fb1b10abSAndroid Build Coastguard Worker   int num_frames;
348*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_firstpass_stats_t;
349*fb1b10abSAndroid Build Coastguard Worker 
350*fb1b10abSAndroid Build Coastguard Worker /*!\brief Encode config sent to external rate control model
351*fb1b10abSAndroid Build Coastguard Worker  */
352*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_config {
353*fb1b10abSAndroid Build Coastguard Worker   int frame_width;      /**< frame width */
354*fb1b10abSAndroid Build Coastguard Worker   int frame_height;     /**< frame height */
355*fb1b10abSAndroid Build Coastguard Worker   int show_frame_count; /**< number of visible frames in the video */
356*fb1b10abSAndroid Build Coastguard Worker   int max_gf_interval;  /**< max GOP size in number of show frames */
357*fb1b10abSAndroid Build Coastguard Worker   int min_gf_interval;  /**< min GOP size in number of show frames */
358*fb1b10abSAndroid Build Coastguard Worker   /*!
359*fb1b10abSAndroid Build Coastguard Worker    * Target bitrate in kilobytes per second
360*fb1b10abSAndroid Build Coastguard Worker    */
361*fb1b10abSAndroid Build Coastguard Worker   int target_bitrate_kbps;
362*fb1b10abSAndroid Build Coastguard Worker   int frame_rate_num; /**< numerator of frame rate */
363*fb1b10abSAndroid Build Coastguard Worker   int frame_rate_den; /**< denominator of frame rate */
364*fb1b10abSAndroid Build Coastguard Worker   /*!
365*fb1b10abSAndroid Build Coastguard Worker    * The following fields are only for external rate control models that support
366*fb1b10abSAndroid Build Coastguard Worker    * different rate control modes.
367*fb1b10abSAndroid Build Coastguard Worker    */
368*fb1b10abSAndroid Build Coastguard Worker   vpx_ext_rc_mode_t rc_mode; /**< Q mode or VBR mode */
369*fb1b10abSAndroid Build Coastguard Worker   int overshoot_percent;     /**< for VBR mode only */
370*fb1b10abSAndroid Build Coastguard Worker   int undershoot_percent;    /**< for VBR mode only */
371*fb1b10abSAndroid Build Coastguard Worker   int min_base_q_index;      /**< for VBR mode only */
372*fb1b10abSAndroid Build Coastguard Worker   int max_base_q_index;      /**< for VBR mode only */
373*fb1b10abSAndroid Build Coastguard Worker   int base_qp;               /**< base QP for leaf frames, 0-255 */
374*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_config_t;
375*fb1b10abSAndroid Build Coastguard Worker 
376*fb1b10abSAndroid Build Coastguard Worker /*!\brief Control what ref frame to use and its index.
377*fb1b10abSAndroid Build Coastguard Worker  */
378*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_ref_frame {
379*fb1b10abSAndroid Build Coastguard Worker   /*!
380*fb1b10abSAndroid Build Coastguard Worker    * Ref frame index. Corresponding to |lst_fb_idx|, |gld_fb_idx| or
381*fb1b10abSAndroid Build Coastguard Worker    * |alt_fb_idx| in VP9_COMP depending on the ref frame #name.
382*fb1b10abSAndroid Build Coastguard Worker    */
383*fb1b10abSAndroid Build Coastguard Worker   int index[VPX_RC_MAX_REF_FRAMES];
384*fb1b10abSAndroid Build Coastguard Worker   /*!
385*fb1b10abSAndroid Build Coastguard Worker    * Ref frame name. This decides whether the #index is used as
386*fb1b10abSAndroid Build Coastguard Worker    * |lst_fb_idx|, |gld_fb_idx| or |alt_fb_idx| in VP9_COMP.
387*fb1b10abSAndroid Build Coastguard Worker    *
388*fb1b10abSAndroid Build Coastguard Worker    */
389*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_ref_name_t name[VPX_RC_MAX_REF_FRAMES];
390*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_ref_frame_t;
391*fb1b10abSAndroid Build Coastguard Worker 
392*fb1b10abSAndroid Build Coastguard Worker /*!\brief The decision made by the external rate control model to set the
393*fb1b10abSAndroid Build Coastguard Worker  * group of picture.
394*fb1b10abSAndroid Build Coastguard Worker  */
395*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_gop_decision {
396*fb1b10abSAndroid Build Coastguard Worker   int gop_coding_frames; /**< The number of frames of this GOP */
397*fb1b10abSAndroid Build Coastguard Worker   int use_alt_ref;       /**< Whether to use alt ref for this GOP */
398*fb1b10abSAndroid Build Coastguard Worker   int use_key_frame;     /**< Whether to set key frame for this GOP */
399*fb1b10abSAndroid Build Coastguard Worker   /*!
400*fb1b10abSAndroid Build Coastguard Worker    * Frame type for each frame in this GOP.
401*fb1b10abSAndroid Build Coastguard Worker    * This will be populated to |update_type| in GF_GROUP defined in
402*fb1b10abSAndroid Build Coastguard Worker    * vp9_firstpass.h
403*fb1b10abSAndroid Build Coastguard Worker    */
404*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_frame_update_type_t update_type[VPX_RC_MAX_STATIC_GF_GROUP_LENGTH + 2];
405*fb1b10abSAndroid Build Coastguard Worker   /*! Ref frame buffer index to be updated for each frame in this GOP. */
406*fb1b10abSAndroid Build Coastguard Worker   int update_ref_index[VPX_RC_MAX_STATIC_GF_GROUP_LENGTH + 2];
407*fb1b10abSAndroid Build Coastguard Worker   /*! Ref frame list to be used for each frame in this GOP. */
408*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_ref_frame_t ref_frame_list[VPX_RC_MAX_STATIC_GF_GROUP_LENGTH + 2];
409*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_gop_decision_t;
410*fb1b10abSAndroid Build Coastguard Worker 
411*fb1b10abSAndroid Build Coastguard Worker /*!\brief The decision made by the external rate control model to set the
412*fb1b10abSAndroid Build Coastguard Worker  * key frame location and the show frame count in the key frame group
413*fb1b10abSAndroid Build Coastguard Worker  */
414*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_key_frame_decision {
415*fb1b10abSAndroid Build Coastguard Worker   int key_frame_show_index; /**< This key frame's show index in the video */
416*fb1b10abSAndroid Build Coastguard Worker   int key_frame_group_size; /**< Show frame count of this key frame group */
417*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_key_frame_decision_t;
418*fb1b10abSAndroid Build Coastguard Worker 
419*fb1b10abSAndroid Build Coastguard Worker /*!\brief Create an external rate control model callback prototype
420*fb1b10abSAndroid Build Coastguard Worker  *
421*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to create an external rate control
422*fb1b10abSAndroid Build Coastguard Worker  * model.
423*fb1b10abSAndroid Build Coastguard Worker  *
424*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  priv                Callback's private data
425*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  ratectrl_config     Pointer to vpx_rc_config_t
426*fb1b10abSAndroid Build Coastguard Worker  * \param[out] rate_ctrl_model_ptr Pointer to vpx_rc_model_t
427*fb1b10abSAndroid Build Coastguard Worker  */
428*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_create_model_cb_fn_t)(
429*fb1b10abSAndroid Build Coastguard Worker     void *priv, const vpx_rc_config_t *ratectrl_config,
430*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t *rate_ctrl_model_ptr);
431*fb1b10abSAndroid Build Coastguard Worker 
432*fb1b10abSAndroid Build Coastguard Worker /*!\brief Send first pass stats to the external rate control model callback
433*fb1b10abSAndroid Build Coastguard Worker  * prototype
434*fb1b10abSAndroid Build Coastguard Worker  *
435*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to send first pass stats to the
436*fb1b10abSAndroid Build Coastguard Worker  * external rate control model.
437*fb1b10abSAndroid Build Coastguard Worker  *
438*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  rate_ctrl_model    rate control model
439*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  first_pass_stats   first pass stats
440*fb1b10abSAndroid Build Coastguard Worker  */
441*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_send_firstpass_stats_cb_fn_t)(
442*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t rate_ctrl_model,
443*fb1b10abSAndroid Build Coastguard Worker     const vpx_rc_firstpass_stats_t *first_pass_stats);
444*fb1b10abSAndroid Build Coastguard Worker 
445*fb1b10abSAndroid Build Coastguard Worker /*!\brief Send TPL stats for the current GOP to the external rate control model
446*fb1b10abSAndroid Build Coastguard Worker  * callback prototype
447*fb1b10abSAndroid Build Coastguard Worker  *
448*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to send TPL stats for the GOP to the
449*fb1b10abSAndroid Build Coastguard Worker  * external rate control model.
450*fb1b10abSAndroid Build Coastguard Worker  *
451*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  rate_ctrl_model  rate control model
452*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  tpl_gop_stats    TPL stats for current GOP
453*fb1b10abSAndroid Build Coastguard Worker  */
454*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_send_tpl_gop_stats_cb_fn_t)(
455*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t rate_ctrl_model, const VpxTplGopStats *tpl_gop_stats);
456*fb1b10abSAndroid Build Coastguard Worker 
457*fb1b10abSAndroid Build Coastguard Worker /*!\brief Receive encode frame decision callback prototype
458*fb1b10abSAndroid Build Coastguard Worker  *
459*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to receive encode frame decision from
460*fb1b10abSAndroid Build Coastguard Worker  * the external rate control model.
461*fb1b10abSAndroid Build Coastguard Worker  *
462*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  rate_ctrl_model    rate control model
463*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  frame_gop_index    index of the frame in current gop
464*fb1b10abSAndroid Build Coastguard Worker  * \param[out] frame_decision     encode decision of the coding frame
465*fb1b10abSAndroid Build Coastguard Worker  */
466*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_get_encodeframe_decision_cb_fn_t)(
467*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t rate_ctrl_model, const int frame_gop_index,
468*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_encodeframe_decision_t *frame_decision);
469*fb1b10abSAndroid Build Coastguard Worker 
470*fb1b10abSAndroid Build Coastguard Worker /*!\brief Update encode frame result callback prototype
471*fb1b10abSAndroid Build Coastguard Worker  *
472*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to update encode frame result to the
473*fb1b10abSAndroid Build Coastguard Worker  * external rate control model.
474*fb1b10abSAndroid Build Coastguard Worker  *
475*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  rate_ctrl_model     rate control model
476*fb1b10abSAndroid Build Coastguard Worker  * \param[out] encode_frame_result encode result of the coding frame
477*fb1b10abSAndroid Build Coastguard Worker  */
478*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_update_encodeframe_result_cb_fn_t)(
479*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t rate_ctrl_model,
480*fb1b10abSAndroid Build Coastguard Worker     const vpx_rc_encodeframe_result_t *encode_frame_result);
481*fb1b10abSAndroid Build Coastguard Worker 
482*fb1b10abSAndroid Build Coastguard Worker /*!\brief Get the key frame decision from the external rate control model.
483*fb1b10abSAndroid Build Coastguard Worker  *
484*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to get key frame decision from
485*fb1b10abSAndroid Build Coastguard Worker  * the external rate control model.
486*fb1b10abSAndroid Build Coastguard Worker  *
487*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  rate_ctrl_model    rate control model
488*fb1b10abSAndroid Build Coastguard Worker  * \param[out] key_frame_decision key frame decision from the model
489*fb1b10abSAndroid Build Coastguard Worker  */
490*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_get_key_frame_decision_cb_fn_t)(
491*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t rate_ctrl_model,
492*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_key_frame_decision_t *key_frame_decision);
493*fb1b10abSAndroid Build Coastguard Worker 
494*fb1b10abSAndroid Build Coastguard Worker /*!\brief Get the GOP structure from the external rate control model.
495*fb1b10abSAndroid Build Coastguard Worker  *
496*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to get GOP decisions from
497*fb1b10abSAndroid Build Coastguard Worker  * the external rate control model.
498*fb1b10abSAndroid Build Coastguard Worker  *
499*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  rate_ctrl_model  rate control model
500*fb1b10abSAndroid Build Coastguard Worker  * \param[out] gop_decision     GOP decision from the model
501*fb1b10abSAndroid Build Coastguard Worker  */
502*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_get_gop_decision_cb_fn_t)(
503*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t rate_ctrl_model, vpx_rc_gop_decision_t *gop_decision);
504*fb1b10abSAndroid Build Coastguard Worker 
505*fb1b10abSAndroid Build Coastguard Worker /*!\brief Get the frame rdmult from the external rate control model.
506*fb1b10abSAndroid Build Coastguard Worker  *
507*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to get rdmult from
508*fb1b10abSAndroid Build Coastguard Worker  * the external rate control model.
509*fb1b10abSAndroid Build Coastguard Worker  *
510*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  rate_ctrl_model  rate control model
511*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  frame_info       information collected from the encoder
512*fb1b10abSAndroid Build Coastguard Worker  * \param[out] rdmult           frame rate-distortion multiplier from the model
513*fb1b10abSAndroid Build Coastguard Worker  */
514*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_get_frame_rdmult_cb_fn_t)(
515*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t rate_ctrl_model, const vpx_rc_encodeframe_info_t *frame_info,
516*fb1b10abSAndroid Build Coastguard Worker     int *rdmult);
517*fb1b10abSAndroid Build Coastguard Worker 
518*fb1b10abSAndroid Build Coastguard Worker /*!\brief Delete the external rate control model callback prototype
519*fb1b10abSAndroid Build Coastguard Worker  *
520*fb1b10abSAndroid Build Coastguard Worker  * This callback is invoked by the encoder to delete the external rate control
521*fb1b10abSAndroid Build Coastguard Worker  * model.
522*fb1b10abSAndroid Build Coastguard Worker  *
523*fb1b10abSAndroid Build Coastguard Worker  * \param[in]  rate_ctrl_model     rate control model
524*fb1b10abSAndroid Build Coastguard Worker  */
525*fb1b10abSAndroid Build Coastguard Worker typedef vpx_rc_status_t (*vpx_rc_delete_model_cb_fn_t)(
526*fb1b10abSAndroid Build Coastguard Worker     vpx_rc_model_t rate_ctrl_model);
527*fb1b10abSAndroid Build Coastguard Worker 
528*fb1b10abSAndroid Build Coastguard Worker /*!\brief Callback function set for external rate control.
529*fb1b10abSAndroid Build Coastguard Worker  *
530*fb1b10abSAndroid Build Coastguard Worker  * The user can enable external rate control by registering
531*fb1b10abSAndroid Build Coastguard Worker  * a set of callback functions with the codec control flag
532*fb1b10abSAndroid Build Coastguard Worker  * #VP9E_SET_EXTERNAL_RATE_CONTROL.
533*fb1b10abSAndroid Build Coastguard Worker  */
534*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_rc_funcs {
535*fb1b10abSAndroid Build Coastguard Worker   /*!
536*fb1b10abSAndroid Build Coastguard Worker    * The rate control type of this API.
537*fb1b10abSAndroid Build Coastguard Worker    */
538*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_type_t rc_type;
539*fb1b10abSAndroid Build Coastguard Worker   /*!
540*fb1b10abSAndroid Build Coastguard Worker    * Create an external rate control model.
541*fb1b10abSAndroid Build Coastguard Worker    */
542*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_create_model_cb_fn_t create_model;
543*fb1b10abSAndroid Build Coastguard Worker   /*!
544*fb1b10abSAndroid Build Coastguard Worker    * Send first pass stats to the external rate control model.
545*fb1b10abSAndroid Build Coastguard Worker    */
546*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_send_firstpass_stats_cb_fn_t send_firstpass_stats;
547*fb1b10abSAndroid Build Coastguard Worker   /*!
548*fb1b10abSAndroid Build Coastguard Worker    * Send TPL stats for current GOP to the external rate control model.
549*fb1b10abSAndroid Build Coastguard Worker    */
550*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_send_tpl_gop_stats_cb_fn_t send_tpl_gop_stats;
551*fb1b10abSAndroid Build Coastguard Worker   /*!
552*fb1b10abSAndroid Build Coastguard Worker    * Get encodeframe decision from the external rate control model.
553*fb1b10abSAndroid Build Coastguard Worker    */
554*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_get_encodeframe_decision_cb_fn_t get_encodeframe_decision;
555*fb1b10abSAndroid Build Coastguard Worker   /*!
556*fb1b10abSAndroid Build Coastguard Worker    * Update encodeframe result to the external rate control model.
557*fb1b10abSAndroid Build Coastguard Worker    */
558*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_update_encodeframe_result_cb_fn_t update_encodeframe_result;
559*fb1b10abSAndroid Build Coastguard Worker   /*!
560*fb1b10abSAndroid Build Coastguard Worker    * Get key frame decision from the external rate control model.
561*fb1b10abSAndroid Build Coastguard Worker    */
562*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_get_key_frame_decision_cb_fn_t get_key_frame_decision;
563*fb1b10abSAndroid Build Coastguard Worker   /*!
564*fb1b10abSAndroid Build Coastguard Worker    * Get GOP decisions from the external rate control model.
565*fb1b10abSAndroid Build Coastguard Worker    */
566*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_get_gop_decision_cb_fn_t get_gop_decision;
567*fb1b10abSAndroid Build Coastguard Worker   /*!
568*fb1b10abSAndroid Build Coastguard Worker    * Get rdmult for the frame from the external rate control model.
569*fb1b10abSAndroid Build Coastguard Worker    */
570*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_get_frame_rdmult_cb_fn_t get_frame_rdmult;
571*fb1b10abSAndroid Build Coastguard Worker   /*!
572*fb1b10abSAndroid Build Coastguard Worker    * Delete the external rate control model.
573*fb1b10abSAndroid Build Coastguard Worker    */
574*fb1b10abSAndroid Build Coastguard Worker   vpx_rc_delete_model_cb_fn_t delete_model;
575*fb1b10abSAndroid Build Coastguard Worker 
576*fb1b10abSAndroid Build Coastguard Worker   /*!
577*fb1b10abSAndroid Build Coastguard Worker    * Rate control log path.
578*fb1b10abSAndroid Build Coastguard Worker    */
579*fb1b10abSAndroid Build Coastguard Worker   const char *rate_ctrl_log_path;
580*fb1b10abSAndroid Build Coastguard Worker   /*!
581*fb1b10abSAndroid Build Coastguard Worker    * Private data for the external rate control model.
582*fb1b10abSAndroid Build Coastguard Worker    */
583*fb1b10abSAndroid Build Coastguard Worker   void *priv;
584*fb1b10abSAndroid Build Coastguard Worker } vpx_rc_funcs_t;
585*fb1b10abSAndroid Build Coastguard Worker 
586*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
587*fb1b10abSAndroid Build Coastguard Worker }  // extern "C"
588*fb1b10abSAndroid Build Coastguard Worker #endif
589*fb1b10abSAndroid Build Coastguard Worker 
590*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VPX_VPX_EXT_RATECTRL_H_
591