aom_decoder.h 14.6 KB
 John Koleszar committed May 18, 2010 1 /*  Adrian Grange committed Mar 24, 2016 2  * Copyright (c) 2016, Alliance for Open Media. All rights reserved  John Koleszar committed May 18, 2010 3  *  Adrian Grange committed Mar 24, 2016 4 5 6 7 8 9  * This source code is subject to the terms of the BSD 2 Clause License and * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License * was not distributed with this source code in the LICENSE file, you can * obtain it at www.aomedia.org/license/software. If the Alliance for Open * Media Patent License 1.0 was not distributed with this source code in the * PATENTS file, you can obtain it at www.aomedia.org/license/patent.  John Koleszar committed May 18, 2010 10  */  James Zern committed Dec 16, 2013 11 12 #ifndef VPX_VPX_DECODER_H_ #define VPX_VPX_DECODER_H_  John Koleszar committed May 18, 2010 13 14 15 16 17 18 19 20 21  /*!\defgroup decoder Decoder Algorithm Interface * \ingroup codec * This abstraction allows applications using this decoder to easily support * multiple video formats with minimal code duplication. This section describes * the interface common to all decoders. * @{ */  James Zern committed Feb 16, 2011 22 /*!\file  John Koleszar committed May 18, 2010 23 24 25 26 27 28 29 30 31 32  * \brief Describes the decoder algorithm interface to applications. * * This file describes the interface between an application and a * video decoder algorithm. * */ #ifdef __cplusplus extern "C" { #endif  Adrian Grange committed Mar 25, 2016 33 34 #include "./aom_codec.h" #include "./aom_frame_buffer.h"  John Koleszar committed May 18, 2010 35   clang-format committed Jan 28, 2016 36 37 38 39 40 41 42 43 44 45 /*!\brief Current ABI version number * * \internal * If this file is altered in any way that changes the ABI, this value * must be bumped. Examples include, but are not limited to, changing * types, removing or reassigning enums, adding/removing/rearranging * fields to structures */ #define VPX_DECODER_ABI_VERSION \ (3 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/  John Koleszar committed Jul 17, 2012 46   clang-format committed Jan 28, 2016 47 48 49 /*! \brief Decoder capabilities bitfield * * Each decoder advertises the capabilities it supports as part of its  Adrian Grange committed Mar 25, 2016 50  * ::aom_codec_iface_t interface structure. Capabilities are extra interfaces  clang-format committed Jan 28, 2016 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88  * or functionality, and are not required to be supported by a decoder. * * The available flags are specified by VPX_CODEC_CAP_* defines. */ #define VPX_CODEC_CAP_PUT_SLICE 0x10000 /**< Will issue put_slice callbacks */ #define VPX_CODEC_CAP_PUT_FRAME 0x20000 /**< Will issue put_frame callbacks */ #define VPX_CODEC_CAP_POSTPROC 0x40000 /**< Can postprocess decoded frame */ #define VPX_CODEC_CAP_ERROR_CONCEALMENT 0x80000 /**< Can conceal errors due to packet loss */ #define VPX_CODEC_CAP_INPUT_FRAGMENTS 0x100000 /**< Can receive encoded frames one fragment at a time */ /*! \brief Initialization-time Feature Enabling * * Certain codec features must be known at initialization time, to allow for * proper memory allocation. * * The available flags are specified by VPX_CODEC_USE_* defines. */ #define VPX_CODEC_CAP_FRAME_THREADING 0x200000 /**< Can support frame-based multi-threading */ #define VPX_CODEC_CAP_EXTERNAL_FRAME_BUFFER 0x400000 /**< Can support external frame buffers */ #define VPX_CODEC_USE_POSTPROC 0x10000 /**< Postprocess decoded frame */ #define VPX_CODEC_USE_ERROR_CONCEALMENT 0x20000 /**< Conceal errors in decoded frames */ #define VPX_CODEC_USE_INPUT_FRAGMENTS 0x40000 /**< The input frame should be passed to the decoder one fragment at a time */ #define VPX_CODEC_USE_FRAME_THREADING 0x80000 /**< Enable frame-based multi-threading */ /*!\brief Stream properties * * This structure is used to query or set properties of the decoded * stream. Algorithms may extend this structure with data specific * to their bitstream by setting the sz member appropriately. */  Adrian Grange committed Mar 25, 2016 89 typedef struct aom_codec_stream_info {  clang-format committed Jan 28, 2016 90 91 92 93  unsigned int sz; /**< Size of this structure */ unsigned int w; /**< Width (or 0 for unknown/default) */ unsigned int h; /**< Height (or 0 for unknown/default) */ unsigned int is_kf; /**< Current frame is a keyframe */  Adrian Grange committed Mar 25, 2016 94 } aom_codec_stream_info_t;  clang-format committed Jan 28, 2016 95 96 97 98 99 100  /* REQUIRED FUNCTIONS * * The following functions are required to be implemented for all decoders. * They represent the base case functionality expected of all decoders. */  John Koleszar committed Jul 17, 2012 101   clang-format committed Jan 28, 2016 102 103 104 105 106 /*!\brief Initialization Configurations * * This structure is used to pass init time configuration options to the * decoder. */  Adrian Grange committed Mar 25, 2016 107 typedef struct aom_codec_dec_cfg {  clang-format committed Jan 28, 2016 108 109 110  unsigned int threads; /**< Maximum number of threads to use, default 1 */ unsigned int w; /**< Width */ unsigned int h; /**< Height */  Adrian Grange committed Mar 25, 2016 111 } aom_codec_dec_cfg_t; /**< alias for struct aom_codec_dec_cfg */  John Koleszar committed Jul 17, 2012 112   clang-format committed Jan 28, 2016 113 114 115 /*!\brief Initialize a decoder instance * * Initializes a decoder context using the given interface. Applications  Adrian Grange committed Mar 25, 2016 116  * should call the aom_codec_dec_init convenience macro instead of this  clang-format committed Jan 28, 2016 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134  * function directly, to ensure that the ABI version number parameter * is properly initialized. * * If the library was configured with --disable-multithread, this call * is not thread safe and should be guarded with a lock if being used * in a multithreaded context. * * \param[in] ctx Pointer to this instance's context. * \param[in] iface Pointer to the algorithm interface to use. * \param[in] cfg Configuration to use, if known. May be NULL. * \param[in] flags Bitfield of VPX_CODEC_USE_* flags * \param[in] ver ABI version number. Must be set to * VPX_DECODER_ABI_VERSION * \retval #VPX_CODEC_OK * The decoder algorithm initialized. * \retval #VPX_CODEC_MEM_ERROR * Memory allocation failed. */  Adrian Grange committed Mar 25, 2016 135 136 137 138 aom_codec_err_t aom_codec_dec_init_ver(aom_codec_ctx_t *ctx, aom_codec_iface_t *iface, const aom_codec_dec_cfg_t *cfg, aom_codec_flags_t flags, int ver);  John Koleszar committed Jul 17, 2012 139   Adrian Grange committed Mar 25, 2016 140 /*!\brief Convenience macro for aom_codec_dec_init_ver()  clang-format committed Jan 28, 2016 141 142 143  * * Ensures the ABI version parameter is properly set. */  Adrian Grange committed Mar 25, 2016 144 145 #define aom_codec_dec_init(ctx, iface, cfg, flags) \ aom_codec_dec_init_ver(ctx, iface, cfg, flags, VPX_DECODER_ABI_VERSION)  John Koleszar committed Jul 17, 2012 146   clang-format committed Jan 28, 2016 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 /*!\brief Parse stream info from a buffer * * Performs high level parsing of the bitstream. Construction of a decoder * context is not necessary. Can be used to determine if the bitstream is * of the proper format, and to extract information from the stream. * * \param[in] iface Pointer to the algorithm interface * \param[in] data Pointer to a block of data to parse * \param[in] data_sz Size of the data buffer * \param[in,out] si Pointer to stream info to update. The size member * \ref MUST be properly initialized, but \ref MAY be * clobbered by the algorithm. This parameter \ref MAY * be NULL. * * \retval #VPX_CODEC_OK * Bitstream is parsable and stream information updated */  Adrian Grange committed Mar 25, 2016 164 aom_codec_err_t aom_codec_peek_stream_info(aom_codec_iface_t *iface,  clang-format committed Jan 28, 2016 165 166  const uint8_t *data, unsigned int data_sz,  Adrian Grange committed Mar 25, 2016 167  aom_codec_stream_info_t *si);  John Koleszar committed Jul 17, 2012 168   clang-format committed Jan 28, 2016 169 170 171 172 173 174 175 176 177 178 179 180 181 /*!\brief Return information about the current stream. * * Returns information about the stream that has been parsed during decoding. * * \param[in] ctx Pointer to this instance's context * \param[in,out] si Pointer to stream info to update. The size member * \ref MUST be properly initialized, but \ref MAY be * clobbered by the algorithm. This parameter \ref MAY * be NULL. * * \retval #VPX_CODEC_OK * Bitstream is parsable and stream information updated */  Adrian Grange committed Mar 25, 2016 182 183 aom_codec_err_t aom_codec_get_stream_info(aom_codec_ctx_t *ctx, aom_codec_stream_info_t *si);  John Koleszar committed Jul 17, 2012 184   clang-format committed Jan 28, 2016 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 /*!\brief Decode data * * Processes a buffer of coded data. If the processing results in a new * decoded frame becoming available, PUT_SLICE and PUT_FRAME events may be * generated, as appropriate. Encoded data \ref MUST be passed in DTS (decode * time stamp) order. Frames produced will always be in PTS (presentation * time stamp) order. * If the decoder is configured with VPX_CODEC_USE_INPUT_FRAGMENTS enabled, * data and data_sz can contain a fragment of the encoded frame. Fragment * \#n must contain at least partition \#n, but can also contain subsequent * partitions (\#n+1 - \#n+i), and if so, fragments \#n+1, .., \#n+i must * be empty. When no more data is available, this function should be called * with NULL as data and 0 as data_sz. The memory passed to this function * must be available until the frame has been decoded. * * \param[in] ctx Pointer to this instance's context * \param[in] data Pointer to this block of new coded data. If * NULL, a VPX_CODEC_CB_PUT_FRAME event is posted * for the previously decoded frame. * \param[in] data_sz Size of the coded data, in bytes. * \param[in] user_priv Application specific data to associate with * this frame. * \param[in] deadline Soft deadline the decoder should attempt to meet, * in us. Set to zero for unlimited. * * \return Returns #VPX_CODEC_OK if the coded data was processed completely * and future pictures can be decoded without error. Otherwise,  Adrian Grange committed Mar 25, 2016 212  * see the descriptions of the other error codes in ::aom_codec_err_t  clang-format committed Jan 28, 2016 213 214  * for recoverability capabilities. */  Adrian Grange committed Mar 25, 2016 215 aom_codec_err_t aom_codec_decode(aom_codec_ctx_t *ctx, const uint8_t *data,  clang-format committed Jan 28, 2016 216 217  unsigned int data_sz, void *user_priv, long deadline);  John Koleszar committed Jul 17, 2012 218   clang-format committed Jan 28, 2016 219 220 221 222 223 224 225 /*!\brief Decoded frames iterator * * Iterates over a list of the frames available for display. The iterator * storage should be initialized to NULL to start the iteration. Iteration is * complete when this function returns NULL. * * The list of available frames becomes valid upon completion of the  Adrian Grange committed Mar 25, 2016 226 227  * aom_codec_decode call, and remains valid until the next call to * aom_codec_decode.  clang-format committed Jan 28, 2016 228 229 230 231 232 233 234  * * \param[in] ctx Pointer to this instance's context * \param[in,out] iter Iterator storage, initialized to NULL * * \return Returns a pointer to an image, if one is ready for display. Frames * produced will always be in PTS (presentation time stamp) order. */  Adrian Grange committed Mar 25, 2016 235 aom_image_t *aom_codec_get_frame(aom_codec_ctx_t *ctx, aom_codec_iter_t *iter);  John Koleszar committed Jul 17, 2012 236   clang-format committed Jan 28, 2016 237 238 239 240 241 242 243 244 245 /*!\defgroup cap_put_frame Frame-Based Decoding Functions * * The following functions are required to be implemented for all decoders * that advertise the VPX_CODEC_CAP_PUT_FRAME capability. Calling these * functions * for codecs that don't advertise this capability will result in an error * code being returned, usually VPX_CODEC_ERROR * @{ */  John Koleszar committed Jul 17, 2012 246   clang-format committed Jan 28, 2016 247 248 249 250 251 /*!\brief put frame callback prototype * * This callback is invoked by the decoder to notify the application of * the availability of decoded image data. */  Adrian Grange committed Mar 25, 2016 252 253 typedef void (*aom_codec_put_frame_cb_fn_t)(void *user_priv, const aom_image_t *img);  John Koleszar committed Jul 17, 2012 254   clang-format committed Jan 28, 2016 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 /*!\brief Register for notification of frame completion. * * Registers a given function to be called when a decoded frame is * available. * * \param[in] ctx Pointer to this instance's context * \param[in] cb Pointer to the callback function * \param[in] user_priv User's private data * * \retval #VPX_CODEC_OK * Callback successfully registered. * \retval #VPX_CODEC_ERROR * Decoder context not initialized, or algorithm not capable of * posting slice completion. */  Adrian Grange committed Mar 25, 2016 270 271 aom_codec_err_t aom_codec_register_put_frame_cb(aom_codec_ctx_t *ctx, aom_codec_put_frame_cb_fn_t cb,  clang-format committed Jan 28, 2016 272  void *user_priv);  John Koleszar committed Jul 17, 2012 273   clang-format committed Jan 28, 2016 274 /*!@} - end defgroup cap_put_frame */  John Koleszar committed Jul 17, 2012 275   clang-format committed Jan 28, 2016 276 277 278 279 280 281 282 283 284 /*!\defgroup cap_put_slice Slice-Based Decoding Functions * * The following functions are required to be implemented for all decoders * that advertise the VPX_CODEC_CAP_PUT_SLICE capability. Calling these * functions * for codecs that don't advertise this capability will result in an error * code being returned, usually VPX_CODEC_ERROR * @{ */  John Koleszar committed Jul 17, 2012 285   clang-format committed Jan 28, 2016 286 287 288 289 290 /*!\brief put slice callback prototype * * This callback is invoked by the decoder to notify the application of * the availability of partially decoded image data. The */  Adrian Grange committed Mar 25, 2016 291 292 293 294 typedef void (*aom_codec_put_slice_cb_fn_t)(void *user_priv, const aom_image_t *img, const aom_image_rect_t *valid, const aom_image_rect_t *update);  John Koleszar committed Jul 17, 2012 295   clang-format committed Jan 28, 2016 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 /*!\brief Register for notification of slice completion. * * Registers a given function to be called when a decoded slice is * available. * * \param[in] ctx Pointer to this instance's context * \param[in] cb Pointer to the callback function * \param[in] user_priv User's private data * * \retval #VPX_CODEC_OK * Callback successfully registered. * \retval #VPX_CODEC_ERROR * Decoder context not initialized, or algorithm not capable of * posting slice completion. */  Adrian Grange committed Mar 25, 2016 311 312 aom_codec_err_t aom_codec_register_put_slice_cb(aom_codec_ctx_t *ctx, aom_codec_put_slice_cb_fn_t cb,  clang-format committed Jan 28, 2016 313  void *user_priv);  John Koleszar committed Jul 17, 2012 314   clang-format committed Jan 28, 2016 315 /*!@} - end defgroup cap_put_slice*/  John Koleszar committed Jul 17, 2012 316   clang-format committed Jan 28, 2016 317 318 319 320 321 322 323 324 325 326 327 /*!\defgroup cap_external_frame_buffer External Frame Buffer Functions * * The following section is required to be implemented for all decoders * that advertise the VPX_CODEC_CAP_EXTERNAL_FRAME_BUFFER capability. * Calling this function for codecs that don't advertise this capability * will result in an error code being returned, usually VPX_CODEC_ERROR. * * \note * Currently this only works with VP9. * @{ */  Frank Galligan committed Feb 13, 2014 328   clang-format committed Jan 28, 2016 329 330 /*!\brief Pass in external frame buffers for the decoder to use. *  Yaowu Xu committed Mar 22, 2016 331 332  * Registers functions to be called when libaom needs a frame buffer * to decode the current frame and a function to be called when libaom does  clang-format committed Jan 28, 2016 333  * not internally reference the frame buffer. This set function must  Yaowu Xu committed Mar 22, 2016 334  * be called before the first call to decode or libaom will assume the  clang-format committed Jan 28, 2016 335 336 337 338 339 340 341 342  * default behavior of allocating frame buffers internally. * * \param[in] ctx Pointer to this instance's context * \param[in] cb_get Pointer to the get callback function * \param[in] cb_release Pointer to the release callback function * \param[in] cb_priv Callback's private data * * \retval #VPX_CODEC_OK  Yaowu Xu committed Mar 22, 2016 343  * External frame buffers will be used by libaom.  clang-format committed Jan 28, 2016 344 345 346 347 348 349 350 351 352 353 354  * \retval #VPX_CODEC_INVALID_PARAM * One or more of the callbacks were NULL. * \retval #VPX_CODEC_ERROR * Decoder context not initialized, or algorithm not capable of * using external frame buffers. * * \note * When decoding VP9, the application may be required to pass in at least * #VPX_MAXIMUM_WORK_BUFFERS external frame * buffers. */  Adrian Grange committed Mar 25, 2016 355 356 357 aom_codec_err_t aom_codec_set_frame_buffer_functions( aom_codec_ctx_t *ctx, aom_get_frame_buffer_cb_fn_t cb_get, aom_release_frame_buffer_cb_fn_t cb_release, void *cb_priv);  Frank Galligan committed Feb 13, 2014 358   clang-format committed Jan 28, 2016 359 /*!@} - end defgroup cap_external_frame_buffer */  Frank Galligan committed Feb 13, 2014 360   clang-format committed Jan 28, 2016 361 /*!@} - end defgroup decoder*/  John Koleszar committed May 18, 2010 362 363 364 #ifdef __cplusplus } #endif  James Zern committed Dec 16, 2013 365 #endif // VPX_VPX_DECODER_H_