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