xref: /aosp_15_r20/external/libvpx/vpx/internal/vpx_codec_internal.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
1*fb1b10abSAndroid Build Coastguard Worker /*
2*fb1b10abSAndroid Build Coastguard Worker  *  Copyright (c) 2010 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 Describes the decoder algorithm interface for algorithm
13*fb1b10abSAndroid Build Coastguard Worker  *        implementations.
14*fb1b10abSAndroid Build Coastguard Worker  *
15*fb1b10abSAndroid Build Coastguard Worker  * This file defines the private structures and data types that are only
16*fb1b10abSAndroid Build Coastguard Worker  * relevant to implementing an algorithm, as opposed to using it.
17*fb1b10abSAndroid Build Coastguard Worker  *
18*fb1b10abSAndroid Build Coastguard Worker  * To create a decoder algorithm class, an interface structure is put
19*fb1b10abSAndroid Build Coastguard Worker  * into the global namespace:
20*fb1b10abSAndroid Build Coastguard Worker  *     <pre>
21*fb1b10abSAndroid Build Coastguard Worker  *     my_codec.c:
22*fb1b10abSAndroid Build Coastguard Worker  *       vpx_codec_iface_t my_codec = {
23*fb1b10abSAndroid Build Coastguard Worker  *           "My Codec v1.0",
24*fb1b10abSAndroid Build Coastguard Worker  *           VPX_CODEC_ALG_ABI_VERSION,
25*fb1b10abSAndroid Build Coastguard Worker  *           ...
26*fb1b10abSAndroid Build Coastguard Worker  *       };
27*fb1b10abSAndroid Build Coastguard Worker  *     </pre>
28*fb1b10abSAndroid Build Coastguard Worker  *
29*fb1b10abSAndroid Build Coastguard Worker  * An application instantiates a specific decoder instance by using
30*fb1b10abSAndroid Build Coastguard Worker  * vpx_codec_dec_init() and a pointer to the algorithm's interface structure:
31*fb1b10abSAndroid Build Coastguard Worker  *     <pre>
32*fb1b10abSAndroid Build Coastguard Worker  *     my_app.c:
33*fb1b10abSAndroid Build Coastguard Worker  *       extern vpx_codec_iface_t my_codec;
34*fb1b10abSAndroid Build Coastguard Worker  *       {
35*fb1b10abSAndroid Build Coastguard Worker  *           vpx_codec_ctx_t algo;
36*fb1b10abSAndroid Build Coastguard Worker  *           int threads = 4;
37*fb1b10abSAndroid Build Coastguard Worker  *           vpx_codec_dec_cfg_t cfg = { threads, 0, 0 };
38*fb1b10abSAndroid Build Coastguard Worker  *           res = vpx_codec_dec_init(&algo, &my_codec, &cfg, 0);
39*fb1b10abSAndroid Build Coastguard Worker  *       }
40*fb1b10abSAndroid Build Coastguard Worker  *     </pre>
41*fb1b10abSAndroid Build Coastguard Worker  *
42*fb1b10abSAndroid Build Coastguard Worker  * Once initialized, the instance is manged using other functions from
43*fb1b10abSAndroid Build Coastguard Worker  * the vpx_codec_* family.
44*fb1b10abSAndroid Build Coastguard Worker  */
45*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VPX_INTERNAL_VPX_CODEC_INTERNAL_H_
46*fb1b10abSAndroid Build Coastguard Worker #define VPX_VPX_INTERNAL_VPX_CODEC_INTERNAL_H_
47*fb1b10abSAndroid Build Coastguard Worker #include "../vpx_decoder.h"
48*fb1b10abSAndroid Build Coastguard Worker #include "../vpx_encoder.h"
49*fb1b10abSAndroid Build Coastguard Worker #include <stdarg.h>
50*fb1b10abSAndroid Build Coastguard Worker 
51*fb1b10abSAndroid Build Coastguard Worker #include "vpx_config.h"
52*fb1b10abSAndroid Build Coastguard Worker 
53*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
54*fb1b10abSAndroid Build Coastguard Worker extern "C" {
55*fb1b10abSAndroid Build Coastguard Worker #endif
56*fb1b10abSAndroid Build Coastguard Worker 
57*fb1b10abSAndroid Build Coastguard Worker /*!\brief Current ABI version number
58*fb1b10abSAndroid Build Coastguard Worker  *
59*fb1b10abSAndroid Build Coastguard Worker  * \internal
60*fb1b10abSAndroid Build Coastguard Worker  * If this file is altered in any way that changes the ABI, this value
61*fb1b10abSAndroid Build Coastguard Worker  * must be bumped.  Examples include, but are not limited to, changing
62*fb1b10abSAndroid Build Coastguard Worker  * types, removing or reassigning enums, adding/removing/rearranging
63*fb1b10abSAndroid Build Coastguard Worker  * fields to structures
64*fb1b10abSAndroid Build Coastguard Worker  */
65*fb1b10abSAndroid Build Coastguard Worker #define VPX_CODEC_INTERNAL_ABI_VERSION (5) /**<\hideinitializer*/
66*fb1b10abSAndroid Build Coastguard Worker 
67*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_codec_alg_priv vpx_codec_alg_priv_t;
68*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_codec_priv_enc_mr_cfg vpx_codec_priv_enc_mr_cfg_t;
69*fb1b10abSAndroid Build Coastguard Worker 
70*fb1b10abSAndroid Build Coastguard Worker /*!\brief init function pointer prototype
71*fb1b10abSAndroid Build Coastguard Worker  *
72*fb1b10abSAndroid Build Coastguard Worker  * Performs algorithm-specific initialization of the decoder context. This
73*fb1b10abSAndroid Build Coastguard Worker  * function is called by vpx_codec_dec_init() and vpx_codec_enc_init(), so
74*fb1b10abSAndroid Build Coastguard Worker  * plugins implementing this interface may trust the input parameters to be
75*fb1b10abSAndroid Build Coastguard Worker  * properly initialized.
76*fb1b10abSAndroid Build Coastguard Worker  *
77*fb1b10abSAndroid Build Coastguard Worker  * \param[in] ctx   Pointer to this instance's context
78*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_OK
79*fb1b10abSAndroid Build Coastguard Worker  *     The input stream was recognized and decoder initialized.
80*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_MEM_ERROR
81*fb1b10abSAndroid Build Coastguard Worker  *     Memory operation failed.
82*fb1b10abSAndroid Build Coastguard Worker  */
83*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_init_fn_t)(
84*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_ctx_t *ctx, vpx_codec_priv_enc_mr_cfg_t *data);
85*fb1b10abSAndroid Build Coastguard Worker 
86*fb1b10abSAndroid Build Coastguard Worker /*!\brief destroy function pointer prototype
87*fb1b10abSAndroid Build Coastguard Worker  *
88*fb1b10abSAndroid Build Coastguard Worker  * Performs algorithm-specific destruction of the decoder context. This
89*fb1b10abSAndroid Build Coastguard Worker  * function is called by the generic vpx_codec_destroy() wrapper function,
90*fb1b10abSAndroid Build Coastguard Worker  * so plugins implementing this interface may trust the input parameters
91*fb1b10abSAndroid Build Coastguard Worker  * to be properly initialized.
92*fb1b10abSAndroid Build Coastguard Worker  *
93*fb1b10abSAndroid Build Coastguard Worker  * \param[in] ctx   Pointer to this instance's context
94*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_OK
95*fb1b10abSAndroid Build Coastguard Worker  *     The input stream was recognized and decoder initialized.
96*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_MEM_ERROR
97*fb1b10abSAndroid Build Coastguard Worker  *     Memory operation failed.
98*fb1b10abSAndroid Build Coastguard Worker  */
99*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_destroy_fn_t)(vpx_codec_alg_priv_t *ctx);
100*fb1b10abSAndroid Build Coastguard Worker 
101*fb1b10abSAndroid Build Coastguard Worker /*!\brief parse stream info function pointer prototype
102*fb1b10abSAndroid Build Coastguard Worker  *
103*fb1b10abSAndroid Build Coastguard Worker  * Performs high level parsing of the bitstream. This function is called by the
104*fb1b10abSAndroid Build Coastguard Worker  * generic vpx_codec_peek_stream_info() wrapper function, so plugins
105*fb1b10abSAndroid Build Coastguard Worker  * implementing this interface may trust the input parameters to be properly
106*fb1b10abSAndroid Build Coastguard Worker  * initialized.
107*fb1b10abSAndroid Build Coastguard Worker  *
108*fb1b10abSAndroid Build Coastguard Worker  * \param[in]      data    Pointer to a block of data to parse
109*fb1b10abSAndroid Build Coastguard Worker  * \param[in]      data_sz Size of the data buffer
110*fb1b10abSAndroid Build Coastguard Worker  * \param[in,out]  si      Pointer to stream info to update. The size member
111*fb1b10abSAndroid Build Coastguard Worker  *                         \ref MUST be properly initialized, but \ref MAY be
112*fb1b10abSAndroid Build Coastguard Worker  *                         clobbered by the algorithm. This parameter \ref MAY
113*fb1b10abSAndroid Build Coastguard Worker  *                         be NULL.
114*fb1b10abSAndroid Build Coastguard Worker  *
115*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_OK
116*fb1b10abSAndroid Build Coastguard Worker  *     Bitstream is parsable and stream information updated
117*fb1b10abSAndroid Build Coastguard Worker  */
118*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_peek_si_fn_t)(const uint8_t *data,
119*fb1b10abSAndroid Build Coastguard Worker                                                   unsigned int data_sz,
120*fb1b10abSAndroid Build Coastguard Worker                                                   vpx_codec_stream_info_t *si);
121*fb1b10abSAndroid Build Coastguard Worker 
122*fb1b10abSAndroid Build Coastguard Worker /*!\brief Return information about the current stream.
123*fb1b10abSAndroid Build Coastguard Worker  *
124*fb1b10abSAndroid Build Coastguard Worker  * Returns information about the stream that has been parsed during decoding.
125*fb1b10abSAndroid Build Coastguard Worker  *
126*fb1b10abSAndroid Build Coastguard Worker  * \param[in]      ctx     Pointer to this instance's context
127*fb1b10abSAndroid Build Coastguard Worker  * \param[in,out]  si      Pointer to stream info to update. The size member
128*fb1b10abSAndroid Build Coastguard Worker  *                         \ref MUST be properly initialized, but \ref MAY be
129*fb1b10abSAndroid Build Coastguard Worker  *                         clobbered by the algorithm. This parameter \ref MAY
130*fb1b10abSAndroid Build Coastguard Worker  *                         be NULL.
131*fb1b10abSAndroid Build Coastguard Worker  *
132*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_OK
133*fb1b10abSAndroid Build Coastguard Worker  *     Bitstream is parsable and stream information updated
134*fb1b10abSAndroid Build Coastguard Worker  */
135*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_get_si_fn_t)(vpx_codec_alg_priv_t *ctx,
136*fb1b10abSAndroid Build Coastguard Worker                                                  vpx_codec_stream_info_t *si);
137*fb1b10abSAndroid Build Coastguard Worker 
138*fb1b10abSAndroid Build Coastguard Worker /*!\brief control function pointer prototype
139*fb1b10abSAndroid Build Coastguard Worker  *
140*fb1b10abSAndroid Build Coastguard Worker  * This function is used to exchange algorithm specific data with the decoder
141*fb1b10abSAndroid Build Coastguard Worker  * instance. This can be used to implement features specific to a particular
142*fb1b10abSAndroid Build Coastguard Worker  * algorithm.
143*fb1b10abSAndroid Build Coastguard Worker  *
144*fb1b10abSAndroid Build Coastguard Worker  * This function is called by the generic vpx_codec_control() wrapper
145*fb1b10abSAndroid Build Coastguard Worker  * function, so plugins implementing this interface may trust the input
146*fb1b10abSAndroid Build Coastguard Worker  * parameters to be properly initialized. However,  this interface does not
147*fb1b10abSAndroid Build Coastguard Worker  * provide type safety for the exchanged data or assign meanings to the
148*fb1b10abSAndroid Build Coastguard Worker  * control codes. Those details should be specified in the algorithm's
149*fb1b10abSAndroid Build Coastguard Worker  * header file. In particular, the ctrl_id parameter is guaranteed to exist
150*fb1b10abSAndroid Build Coastguard Worker  * in the algorithm's control mapping table, and the data parameter may be NULL.
151*fb1b10abSAndroid Build Coastguard Worker  *
152*fb1b10abSAndroid Build Coastguard Worker  *
153*fb1b10abSAndroid Build Coastguard Worker  * \param[in]     ctx              Pointer to this instance's context
154*fb1b10abSAndroid Build Coastguard Worker  * \param[in]     ctrl_id          Algorithm specific control identifier
155*fb1b10abSAndroid Build Coastguard Worker  * \param[in,out] data             Data to exchange with algorithm instance.
156*fb1b10abSAndroid Build Coastguard Worker  *
157*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_OK
158*fb1b10abSAndroid Build Coastguard Worker  *     The internal state data was deserialized.
159*fb1b10abSAndroid Build Coastguard Worker  */
160*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_control_fn_t)(vpx_codec_alg_priv_t *ctx,
161*fb1b10abSAndroid Build Coastguard Worker                                                   va_list ap);
162*fb1b10abSAndroid Build Coastguard Worker 
163*fb1b10abSAndroid Build Coastguard Worker /*!\brief control function pointer mapping
164*fb1b10abSAndroid Build Coastguard Worker  *
165*fb1b10abSAndroid Build Coastguard Worker  * This structure stores the mapping between control identifiers and
166*fb1b10abSAndroid Build Coastguard Worker  * implementing functions. Each algorithm provides a list of these
167*fb1b10abSAndroid Build Coastguard Worker  * mappings. This list is searched by the vpx_codec_control() wrapper
168*fb1b10abSAndroid Build Coastguard Worker  * function to determine which function to invoke. The special
169*fb1b10abSAndroid Build Coastguard Worker  * value {0, NULL} is used to indicate end-of-list, and must be
170*fb1b10abSAndroid Build Coastguard Worker  * present. The special value {0, <non-null>} can be used as a catch-all
171*fb1b10abSAndroid Build Coastguard Worker  * mapping. This implies that ctrl_id values chosen by the algorithm
172*fb1b10abSAndroid Build Coastguard Worker  * \ref MUST be non-zero.
173*fb1b10abSAndroid Build Coastguard Worker  */
174*fb1b10abSAndroid Build Coastguard Worker typedef const struct vpx_codec_ctrl_fn_map {
175*fb1b10abSAndroid Build Coastguard Worker   int ctrl_id;
176*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_control_fn_t fn;
177*fb1b10abSAndroid Build Coastguard Worker } vpx_codec_ctrl_fn_map_t;
178*fb1b10abSAndroid Build Coastguard Worker 
179*fb1b10abSAndroid Build Coastguard Worker /*!\brief decode data function pointer prototype
180*fb1b10abSAndroid Build Coastguard Worker  *
181*fb1b10abSAndroid Build Coastguard Worker  * Processes a buffer of coded data. If the processing results in a new
182*fb1b10abSAndroid Build Coastguard Worker  * decoded frame becoming available, put_slice and put_frame callbacks
183*fb1b10abSAndroid Build Coastguard Worker  * are invoked as appropriate. This function is called by the generic
184*fb1b10abSAndroid Build Coastguard Worker  * vpx_codec_decode() wrapper function, so plugins implementing this
185*fb1b10abSAndroid Build Coastguard Worker  * interface may trust the input parameters to be properly initialized.
186*fb1b10abSAndroid Build Coastguard Worker  *
187*fb1b10abSAndroid Build Coastguard Worker  * \param[in] ctx          Pointer to this instance's context
188*fb1b10abSAndroid Build Coastguard Worker  * \param[in] data         Pointer to this block of new coded data. If
189*fb1b10abSAndroid Build Coastguard Worker  *                         NULL, the put_frame callback is invoked for
190*fb1b10abSAndroid Build Coastguard Worker  *                         the previously decoded frame.
191*fb1b10abSAndroid Build Coastguard Worker  * \param[in] data_sz      Size of the coded data, in bytes.
192*fb1b10abSAndroid Build Coastguard Worker  *
193*fb1b10abSAndroid Build Coastguard Worker  * \return Returns #VPX_CODEC_OK if the coded data was processed completely
194*fb1b10abSAndroid Build Coastguard Worker  *         and future pictures can be decoded without error. Otherwise,
195*fb1b10abSAndroid Build Coastguard Worker  *         see the descriptions of the other error codes in ::vpx_codec_err_t
196*fb1b10abSAndroid Build Coastguard Worker  *         for recoverability capabilities.
197*fb1b10abSAndroid Build Coastguard Worker  */
198*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_decode_fn_t)(vpx_codec_alg_priv_t *ctx,
199*fb1b10abSAndroid Build Coastguard Worker                                                  const uint8_t *data,
200*fb1b10abSAndroid Build Coastguard Worker                                                  unsigned int data_sz,
201*fb1b10abSAndroid Build Coastguard Worker                                                  void *user_priv);
202*fb1b10abSAndroid Build Coastguard Worker 
203*fb1b10abSAndroid Build Coastguard Worker /*!\brief Decoded frames iterator
204*fb1b10abSAndroid Build Coastguard Worker  *
205*fb1b10abSAndroid Build Coastguard Worker  * Iterates over a list of the frames available for display. The iterator
206*fb1b10abSAndroid Build Coastguard Worker  * storage should be initialized to NULL to start the iteration. Iteration is
207*fb1b10abSAndroid Build Coastguard Worker  * complete when this function returns NULL.
208*fb1b10abSAndroid Build Coastguard Worker  *
209*fb1b10abSAndroid Build Coastguard Worker  * The list of available frames becomes valid upon completion of the
210*fb1b10abSAndroid Build Coastguard Worker  * vpx_codec_decode call, and remains valid until the next call to
211*fb1b10abSAndroid Build Coastguard Worker  * vpx_codec_decode.
212*fb1b10abSAndroid Build Coastguard Worker  *
213*fb1b10abSAndroid Build Coastguard Worker  * \param[in]     ctx      Pointer to this instance's context
214*fb1b10abSAndroid Build Coastguard Worker  * \param[in out] iter     Iterator storage, initialized to NULL
215*fb1b10abSAndroid Build Coastguard Worker  *
216*fb1b10abSAndroid Build Coastguard Worker  * \return Returns a pointer to an image, if one is ready for display. Frames
217*fb1b10abSAndroid Build Coastguard Worker  *         produced will always be in PTS (presentation time stamp) order.
218*fb1b10abSAndroid Build Coastguard Worker  */
219*fb1b10abSAndroid Build Coastguard Worker typedef vpx_image_t *(*vpx_codec_get_frame_fn_t)(vpx_codec_alg_priv_t *ctx,
220*fb1b10abSAndroid Build Coastguard Worker                                                  vpx_codec_iter_t *iter);
221*fb1b10abSAndroid Build Coastguard Worker 
222*fb1b10abSAndroid Build Coastguard Worker /*!\brief Pass in external frame buffers for the decoder to use.
223*fb1b10abSAndroid Build Coastguard Worker  *
224*fb1b10abSAndroid Build Coastguard Worker  * Registers functions to be called when libvpx needs a frame buffer
225*fb1b10abSAndroid Build Coastguard Worker  * to decode the current frame and a function to be called when libvpx does
226*fb1b10abSAndroid Build Coastguard Worker  * not internally reference the frame buffer. This set function must
227*fb1b10abSAndroid Build Coastguard Worker  * be called before the first call to decode or libvpx will assume the
228*fb1b10abSAndroid Build Coastguard Worker  * default behavior of allocating frame buffers internally.
229*fb1b10abSAndroid Build Coastguard Worker  *
230*fb1b10abSAndroid Build Coastguard Worker  * \param[in] ctx          Pointer to this instance's context
231*fb1b10abSAndroid Build Coastguard Worker  * \param[in] cb_get       Pointer to the get callback function
232*fb1b10abSAndroid Build Coastguard Worker  * \param[in] cb_release   Pointer to the release callback function
233*fb1b10abSAndroid Build Coastguard Worker  * \param[in] cb_priv      Callback's private data
234*fb1b10abSAndroid Build Coastguard Worker  *
235*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_OK
236*fb1b10abSAndroid Build Coastguard Worker  *     External frame buffers will be used by libvpx.
237*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_INVALID_PARAM
238*fb1b10abSAndroid Build Coastguard Worker  *     One or more of the callbacks were NULL.
239*fb1b10abSAndroid Build Coastguard Worker  * \retval #VPX_CODEC_ERROR
240*fb1b10abSAndroid Build Coastguard Worker  *     Decoder context not initialized, or algorithm not capable of
241*fb1b10abSAndroid Build Coastguard Worker  *     using external frame buffers.
242*fb1b10abSAndroid Build Coastguard Worker  *
243*fb1b10abSAndroid Build Coastguard Worker  * \note
244*fb1b10abSAndroid Build Coastguard Worker  * When decoding VP9, the application may be required to pass in at least
245*fb1b10abSAndroid Build Coastguard Worker  * #VP9_MAXIMUM_REF_BUFFERS + #VPX_MAXIMUM_WORK_BUFFERS external frame
246*fb1b10abSAndroid Build Coastguard Worker  * buffers.
247*fb1b10abSAndroid Build Coastguard Worker  */
248*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_set_fb_fn_t)(
249*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_alg_priv_t *ctx, vpx_get_frame_buffer_cb_fn_t cb_get,
250*fb1b10abSAndroid Build Coastguard Worker     vpx_release_frame_buffer_cb_fn_t cb_release, void *cb_priv);
251*fb1b10abSAndroid Build Coastguard Worker 
252*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_encode_fn_t)(vpx_codec_alg_priv_t *ctx,
253*fb1b10abSAndroid Build Coastguard Worker                                                  const vpx_image_t *img,
254*fb1b10abSAndroid Build Coastguard Worker                                                  vpx_codec_pts_t pts,
255*fb1b10abSAndroid Build Coastguard Worker                                                  unsigned long duration,
256*fb1b10abSAndroid Build Coastguard Worker                                                  vpx_enc_frame_flags_t flags,
257*fb1b10abSAndroid Build Coastguard Worker                                                  vpx_enc_deadline_t deadline);
258*fb1b10abSAndroid Build Coastguard Worker typedef const vpx_codec_cx_pkt_t *(*vpx_codec_get_cx_data_fn_t)(
259*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_alg_priv_t *ctx, vpx_codec_iter_t *iter);
260*fb1b10abSAndroid Build Coastguard Worker 
261*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_enc_config_set_fn_t)(
262*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_alg_priv_t *ctx, const vpx_codec_enc_cfg_t *cfg);
263*fb1b10abSAndroid Build Coastguard Worker typedef vpx_fixed_buf_t *(*vpx_codec_get_global_headers_fn_t)(
264*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_alg_priv_t *ctx);
265*fb1b10abSAndroid Build Coastguard Worker 
266*fb1b10abSAndroid Build Coastguard Worker typedef vpx_image_t *(*vpx_codec_get_preview_frame_fn_t)(
267*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_alg_priv_t *ctx);
268*fb1b10abSAndroid Build Coastguard Worker 
269*fb1b10abSAndroid Build Coastguard Worker typedef vpx_codec_err_t (*vpx_codec_enc_mr_get_mem_loc_fn_t)(
270*fb1b10abSAndroid Build Coastguard Worker     const vpx_codec_enc_cfg_t *cfg, void **mem_loc);
271*fb1b10abSAndroid Build Coastguard Worker 
272*fb1b10abSAndroid Build Coastguard Worker /*!\brief usage configuration mapping
273*fb1b10abSAndroid Build Coastguard Worker  *
274*fb1b10abSAndroid Build Coastguard Worker  * This structure stores the mapping between usage identifiers and
275*fb1b10abSAndroid Build Coastguard Worker  * configuration structures. Each algorithm provides a list of these
276*fb1b10abSAndroid Build Coastguard Worker  * mappings. This list is searched by the vpx_codec_enc_config_default()
277*fb1b10abSAndroid Build Coastguard Worker  * wrapper function to determine which config to return. The special value
278*fb1b10abSAndroid Build Coastguard Worker  * {-1, {0}} is used to indicate end-of-list, and must be present. At least
279*fb1b10abSAndroid Build Coastguard Worker  * one mapping must be present, in addition to the end-of-list.
280*fb1b10abSAndroid Build Coastguard Worker  *
281*fb1b10abSAndroid Build Coastguard Worker  */
282*fb1b10abSAndroid Build Coastguard Worker typedef const struct vpx_codec_enc_cfg_map {
283*fb1b10abSAndroid Build Coastguard Worker   int usage;
284*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_enc_cfg_t cfg;
285*fb1b10abSAndroid Build Coastguard Worker } vpx_codec_enc_cfg_map_t;
286*fb1b10abSAndroid Build Coastguard Worker 
287*fb1b10abSAndroid Build Coastguard Worker /*!\brief Decoder algorithm interface
288*fb1b10abSAndroid Build Coastguard Worker  *
289*fb1b10abSAndroid Build Coastguard Worker  * All decoders \ref MUST expose a variable of this type.
290*fb1b10abSAndroid Build Coastguard Worker  */
291*fb1b10abSAndroid Build Coastguard Worker struct vpx_codec_iface {
292*fb1b10abSAndroid Build Coastguard Worker   const char *name;                   /**< Identification String  */
293*fb1b10abSAndroid Build Coastguard Worker   int abi_version;                    /**< Implemented ABI version */
294*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_caps_t caps;              /**< Decoder capabilities */
295*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_init_fn_t init;           /**< \copydoc ::vpx_codec_init_fn_t */
296*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_destroy_fn_t destroy;     /**< \copydoc ::vpx_codec_destroy_fn_t */
297*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_ctrl_fn_map_t *ctrl_maps; /**< \copydoc ::vpx_codec_ctrl_fn_map_t */
298*fb1b10abSAndroid Build Coastguard Worker   struct vpx_codec_dec_iface {
299*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_peek_si_fn_t peek_si; /**< \copydoc ::vpx_codec_peek_si_fn_t */
300*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_get_si_fn_t get_si;   /**< \copydoc ::vpx_codec_get_si_fn_t */
301*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_decode_fn_t decode;   /**< \copydoc ::vpx_codec_decode_fn_t */
302*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_get_frame_fn_t
303*fb1b10abSAndroid Build Coastguard Worker         get_frame;                   /**< \copydoc ::vpx_codec_get_frame_fn_t */
304*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_set_fb_fn_t set_fb_fn; /**< \copydoc ::vpx_codec_set_fb_fn_t */
305*fb1b10abSAndroid Build Coastguard Worker   } dec;
306*fb1b10abSAndroid Build Coastguard Worker   struct vpx_codec_enc_iface {
307*fb1b10abSAndroid Build Coastguard Worker     int cfg_map_count;
308*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_enc_cfg_map_t
309*fb1b10abSAndroid Build Coastguard Worker         *cfg_maps;                /**< \copydoc ::vpx_codec_enc_cfg_map_t */
310*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_encode_fn_t encode; /**< \copydoc ::vpx_codec_encode_fn_t */
311*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_get_cx_data_fn_t
312*fb1b10abSAndroid Build Coastguard Worker         get_cx_data; /**< \copydoc ::vpx_codec_get_cx_data_fn_t */
313*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_enc_config_set_fn_t
314*fb1b10abSAndroid Build Coastguard Worker         cfg_set; /**< \copydoc ::vpx_codec_enc_config_set_fn_t */
315*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_get_global_headers_fn_t
316*fb1b10abSAndroid Build Coastguard Worker         get_glob_hdrs; /**< \copydoc ::vpx_codec_get_global_headers_fn_t */
317*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_get_preview_frame_fn_t
318*fb1b10abSAndroid Build Coastguard Worker         get_preview; /**< \copydoc ::vpx_codec_get_preview_frame_fn_t */
319*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_enc_mr_get_mem_loc_fn_t
320*fb1b10abSAndroid Build Coastguard Worker         mr_get_mem_loc; /**< \copydoc ::vpx_codec_enc_mr_get_mem_loc_fn_t */
321*fb1b10abSAndroid Build Coastguard Worker   } enc;
322*fb1b10abSAndroid Build Coastguard Worker };
323*fb1b10abSAndroid Build Coastguard Worker 
324*fb1b10abSAndroid Build Coastguard Worker /*!\brief Callback function pointer / user data pair storage */
325*fb1b10abSAndroid Build Coastguard Worker typedef struct vpx_codec_priv_cb_pair {
326*fb1b10abSAndroid Build Coastguard Worker   union {
327*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_put_frame_cb_fn_t put_frame;
328*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_put_slice_cb_fn_t put_slice;
329*fb1b10abSAndroid Build Coastguard Worker   } u;
330*fb1b10abSAndroid Build Coastguard Worker   void *user_priv;
331*fb1b10abSAndroid Build Coastguard Worker } vpx_codec_priv_cb_pair_t;
332*fb1b10abSAndroid Build Coastguard Worker 
333*fb1b10abSAndroid Build Coastguard Worker /*!\brief Instance private storage
334*fb1b10abSAndroid Build Coastguard Worker  *
335*fb1b10abSAndroid Build Coastguard Worker  * This structure is allocated by the algorithm's init function. It can be
336*fb1b10abSAndroid Build Coastguard Worker  * extended in one of two ways. First, a second, algorithm specific structure
337*fb1b10abSAndroid Build Coastguard Worker  * can be allocated and the priv member pointed to it. Alternatively, this
338*fb1b10abSAndroid Build Coastguard Worker  * structure can be made the first member of the algorithm specific structure,
339*fb1b10abSAndroid Build Coastguard Worker  * and the pointer cast to the proper type.
340*fb1b10abSAndroid Build Coastguard Worker  */
341*fb1b10abSAndroid Build Coastguard Worker struct vpx_codec_priv {
342*fb1b10abSAndroid Build Coastguard Worker   const char *err_detail;
343*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_flags_t init_flags;
344*fb1b10abSAndroid Build Coastguard Worker   struct {
345*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_priv_cb_pair_t put_frame_cb;
346*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_priv_cb_pair_t put_slice_cb;
347*fb1b10abSAndroid Build Coastguard Worker   } dec;
348*fb1b10abSAndroid Build Coastguard Worker   struct {
349*fb1b10abSAndroid Build Coastguard Worker     vpx_fixed_buf_t cx_data_dst_buf;
350*fb1b10abSAndroid Build Coastguard Worker     unsigned int cx_data_pad_before;
351*fb1b10abSAndroid Build Coastguard Worker     unsigned int cx_data_pad_after;
352*fb1b10abSAndroid Build Coastguard Worker     vpx_codec_cx_pkt_t cx_data_pkt;
353*fb1b10abSAndroid Build Coastguard Worker     unsigned int total_encoders;
354*fb1b10abSAndroid Build Coastguard Worker   } enc;
355*fb1b10abSAndroid Build Coastguard Worker };
356*fb1b10abSAndroid Build Coastguard Worker 
357*fb1b10abSAndroid Build Coastguard Worker /*
358*fb1b10abSAndroid Build Coastguard Worker  * Multi-resolution encoding internal configuration
359*fb1b10abSAndroid Build Coastguard Worker  */
360*fb1b10abSAndroid Build Coastguard Worker struct vpx_codec_priv_enc_mr_cfg {
361*fb1b10abSAndroid Build Coastguard Worker   unsigned int mr_total_resolutions;
362*fb1b10abSAndroid Build Coastguard Worker   unsigned int mr_encoder_id;
363*fb1b10abSAndroid Build Coastguard Worker   struct vpx_rational mr_down_sampling_factor;
364*fb1b10abSAndroid Build Coastguard Worker   void *mr_low_res_mode_info;
365*fb1b10abSAndroid Build Coastguard Worker };
366*fb1b10abSAndroid Build Coastguard Worker 
367*fb1b10abSAndroid Build Coastguard Worker #undef VPX_CTRL_USE_TYPE
368*fb1b10abSAndroid Build Coastguard Worker #define VPX_CTRL_USE_TYPE(id, typ) \
369*fb1b10abSAndroid Build Coastguard Worker   static VPX_INLINE typ id##__value(va_list args) { return va_arg(args, typ); }
370*fb1b10abSAndroid Build Coastguard Worker 
371*fb1b10abSAndroid Build Coastguard Worker #undef VPX_CTRL_USE_TYPE_DEPRECATED
372*fb1b10abSAndroid Build Coastguard Worker #define VPX_CTRL_USE_TYPE_DEPRECATED(id, typ) \
373*fb1b10abSAndroid Build Coastguard Worker   static VPX_INLINE typ id##__value(va_list args) { return va_arg(args, typ); }
374*fb1b10abSAndroid Build Coastguard Worker 
375*fb1b10abSAndroid Build Coastguard Worker #define CAST(id, arg) id##__value(arg)
376*fb1b10abSAndroid Build Coastguard Worker 
377*fb1b10abSAndroid Build Coastguard Worker /* CODEC_INTERFACE convenience macro
378*fb1b10abSAndroid Build Coastguard Worker  *
379*fb1b10abSAndroid Build Coastguard Worker  * By convention, each codec interface is a struct with extern linkage, where
380*fb1b10abSAndroid Build Coastguard Worker  * the symbol is suffixed with _algo. A getter function is also defined to
381*fb1b10abSAndroid Build Coastguard Worker  * return a pointer to the struct, since in some cases it's easier to work
382*fb1b10abSAndroid Build Coastguard Worker  * with text symbols than data symbols (see issue #169). This function has
383*fb1b10abSAndroid Build Coastguard Worker  * the same name as the struct, less the _algo suffix. The CODEC_INTERFACE
384*fb1b10abSAndroid Build Coastguard Worker  * macro is provided to define this getter function automatically.
385*fb1b10abSAndroid Build Coastguard Worker  */
386*fb1b10abSAndroid Build Coastguard Worker #define CODEC_INTERFACE(id)                          \
387*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_iface_t *id(void) { return &id##_algo; } \
388*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_iface_t id##_algo
389*fb1b10abSAndroid Build Coastguard Worker 
390*fb1b10abSAndroid Build Coastguard Worker /* Internal Utility Functions
391*fb1b10abSAndroid Build Coastguard Worker  *
392*fb1b10abSAndroid Build Coastguard Worker  * The following functions are intended to be used inside algorithms as
393*fb1b10abSAndroid Build Coastguard Worker  * utilities for manipulating vpx_codec_* data structures.
394*fb1b10abSAndroid Build Coastguard Worker  */
395*fb1b10abSAndroid Build Coastguard Worker struct vpx_codec_pkt_list {
396*fb1b10abSAndroid Build Coastguard Worker   unsigned int cnt;
397*fb1b10abSAndroid Build Coastguard Worker   unsigned int max;
398*fb1b10abSAndroid Build Coastguard Worker   struct vpx_codec_cx_pkt pkts[1];
399*fb1b10abSAndroid Build Coastguard Worker };
400*fb1b10abSAndroid Build Coastguard Worker 
401*fb1b10abSAndroid Build Coastguard Worker #define vpx_codec_pkt_list_decl(n)     \
402*fb1b10abSAndroid Build Coastguard Worker   union {                              \
403*fb1b10abSAndroid Build Coastguard Worker     struct vpx_codec_pkt_list head;    \
404*fb1b10abSAndroid Build Coastguard Worker     struct {                           \
405*fb1b10abSAndroid Build Coastguard Worker       struct vpx_codec_pkt_list head;  \
406*fb1b10abSAndroid Build Coastguard Worker       struct vpx_codec_cx_pkt pkts[n]; \
407*fb1b10abSAndroid Build Coastguard Worker     } alloc;                           \
408*fb1b10abSAndroid Build Coastguard Worker   }
409*fb1b10abSAndroid Build Coastguard Worker 
410*fb1b10abSAndroid Build Coastguard Worker #define vpx_codec_pkt_list_init(m) \
411*fb1b10abSAndroid Build Coastguard Worker   (m)->alloc.head.cnt = 0,         \
412*fb1b10abSAndroid Build Coastguard Worker   (m)->alloc.head.max = sizeof((m)->alloc.pkts) / sizeof((m)->alloc.pkts[0])
413*fb1b10abSAndroid Build Coastguard Worker 
414*fb1b10abSAndroid Build Coastguard Worker int vpx_codec_pkt_list_add(struct vpx_codec_pkt_list *,
415*fb1b10abSAndroid Build Coastguard Worker                            const struct vpx_codec_cx_pkt *);
416*fb1b10abSAndroid Build Coastguard Worker 
417*fb1b10abSAndroid Build Coastguard Worker const vpx_codec_cx_pkt_t *vpx_codec_pkt_list_get(
418*fb1b10abSAndroid Build Coastguard Worker     struct vpx_codec_pkt_list *list, vpx_codec_iter_t *iter);
419*fb1b10abSAndroid Build Coastguard Worker 
420*fb1b10abSAndroid Build Coastguard Worker #include <stdio.h>
421*fb1b10abSAndroid Build Coastguard Worker #include <setjmp.h>
422*fb1b10abSAndroid Build Coastguard Worker 
423*fb1b10abSAndroid Build Coastguard Worker struct vpx_internal_error_info {
424*fb1b10abSAndroid Build Coastguard Worker   vpx_codec_err_t error_code;
425*fb1b10abSAndroid Build Coastguard Worker   int has_detail;
426*fb1b10abSAndroid Build Coastguard Worker   char detail[80];
427*fb1b10abSAndroid Build Coastguard Worker   int setjmp;
428*fb1b10abSAndroid Build Coastguard Worker   jmp_buf jmp;
429*fb1b10abSAndroid Build Coastguard Worker };
430*fb1b10abSAndroid Build Coastguard Worker 
431*fb1b10abSAndroid Build Coastguard Worker #if CONFIG_DEBUG
432*fb1b10abSAndroid Build Coastguard Worker #define CHECK_MEM_ERROR(error, lval, expr)                                  \
433*fb1b10abSAndroid Build Coastguard Worker   do {                                                                      \
434*fb1b10abSAndroid Build Coastguard Worker     assert((error)->setjmp);                                                \
435*fb1b10abSAndroid Build Coastguard Worker     (lval) = (expr);                                                        \
436*fb1b10abSAndroid Build Coastguard Worker     if (!(lval))                                                            \
437*fb1b10abSAndroid Build Coastguard Worker       vpx_internal_error(error, VPX_CODEC_MEM_ERROR,                        \
438*fb1b10abSAndroid Build Coastguard Worker                          "Failed to allocate " #lval " at %s:%d", __FILE__, \
439*fb1b10abSAndroid Build Coastguard Worker                          __LINE__);                                         \
440*fb1b10abSAndroid Build Coastguard Worker   } while (0)
441*fb1b10abSAndroid Build Coastguard Worker #else
442*fb1b10abSAndroid Build Coastguard Worker #define CHECK_MEM_ERROR(error, lval, expr)             \
443*fb1b10abSAndroid Build Coastguard Worker   do {                                                 \
444*fb1b10abSAndroid Build Coastguard Worker     assert((error)->setjmp);                           \
445*fb1b10abSAndroid Build Coastguard Worker     (lval) = (expr);                                   \
446*fb1b10abSAndroid Build Coastguard Worker     if (!(lval))                                       \
447*fb1b10abSAndroid Build Coastguard Worker       vpx_internal_error(error, VPX_CODEC_MEM_ERROR,   \
448*fb1b10abSAndroid Build Coastguard Worker                          "Failed to allocate " #lval); \
449*fb1b10abSAndroid Build Coastguard Worker   } while (0)
450*fb1b10abSAndroid Build Coastguard Worker #endif
451*fb1b10abSAndroid Build Coastguard Worker 
452*fb1b10abSAndroid Build Coastguard Worker #define CLANG_ANALYZER_NORETURN
453*fb1b10abSAndroid Build Coastguard Worker #if defined(__has_feature)
454*fb1b10abSAndroid Build Coastguard Worker #if __has_feature(attribute_analyzer_noreturn)
455*fb1b10abSAndroid Build Coastguard Worker #undef CLANG_ANALYZER_NORETURN
456*fb1b10abSAndroid Build Coastguard Worker #define CLANG_ANALYZER_NORETURN __attribute__((analyzer_noreturn))
457*fb1b10abSAndroid Build Coastguard Worker #endif
458*fb1b10abSAndroid Build Coastguard Worker #endif
459*fb1b10abSAndroid Build Coastguard Worker 
460*fb1b10abSAndroid Build Coastguard Worker // Tells the compiler to perform `printf` format string checking if the
461*fb1b10abSAndroid Build Coastguard Worker // compiler supports it; see the 'format' attribute in
462*fb1b10abSAndroid Build Coastguard Worker // <https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html>.
463*fb1b10abSAndroid Build Coastguard Worker #define LIBVPX_FORMAT_PRINTF(string_index, first_to_check)
464*fb1b10abSAndroid Build Coastguard Worker #if defined(__has_attribute)
465*fb1b10abSAndroid Build Coastguard Worker #if __has_attribute(format)
466*fb1b10abSAndroid Build Coastguard Worker #undef LIBVPX_FORMAT_PRINTF
467*fb1b10abSAndroid Build Coastguard Worker #define LIBVPX_FORMAT_PRINTF(string_index, first_to_check) \
468*fb1b10abSAndroid Build Coastguard Worker   __attribute__((__format__(__printf__, string_index, first_to_check)))
469*fb1b10abSAndroid Build Coastguard Worker #endif
470*fb1b10abSAndroid Build Coastguard Worker #endif
471*fb1b10abSAndroid Build Coastguard Worker 
472*fb1b10abSAndroid Build Coastguard Worker void vpx_internal_error(struct vpx_internal_error_info *info,
473*fb1b10abSAndroid Build Coastguard Worker                         vpx_codec_err_t error, const char *fmt, ...)
474*fb1b10abSAndroid Build Coastguard Worker     LIBVPX_FORMAT_PRINTF(3, 4) CLANG_ANALYZER_NORETURN;
475*fb1b10abSAndroid Build Coastguard Worker 
476*fb1b10abSAndroid Build Coastguard Worker #ifdef __cplusplus
477*fb1b10abSAndroid Build Coastguard Worker }  // extern "C"
478*fb1b10abSAndroid Build Coastguard Worker #endif
479*fb1b10abSAndroid Build Coastguard Worker 
480*fb1b10abSAndroid Build Coastguard Worker #endif  // VPX_VPX_INTERNAL_VPX_CODEC_INTERNAL_H_
481