| /* |
| * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| |
| /*!\defgroup decoder Common Decoder Algorithm Interface |
| * 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 codecs. |
| * @{ |
| */ |
| |
| /*!\file |
| * \brief Provides a compatibility layer between version 1 and 2 of this API. |
| * |
| * This interface has been deprecated. Only existing code should make use |
| * of this interface, and therefore, it is only thinly documented. Existing |
| * code should be ported to the vpx_codec_* API. |
| */ |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #ifndef VPX_DECODER_COMPAT_H |
| #define VPX_DECODER_COMPAT_H |
| |
| /*!\brief Decoder algorithm return codes */ |
| typedef enum { |
| /*!\brief Operation completed without error */ |
| VPX_DEC_OK = VPX_CODEC_OK, |
| |
| /*!\brief Unspecified error */ |
| VPX_DEC_ERROR = VPX_CODEC_ERROR, |
| |
| /*!\brief Memory operation failed */ |
| VPX_DEC_MEM_ERROR = VPX_CODEC_MEM_ERROR, |
| |
| /*!\brief ABI version mismatch */ |
| VPX_DEC_ABI_MISMATCH = VPX_CODEC_ABI_MISMATCH, |
| |
| /*!\brief The given bitstream is not supported. |
| * |
| * The bitstream was unable to be parsed at the highest level. The decoder |
| * is unable to proceed. This error \ref SHOULD be treated as fatal to the |
| * stream. */ |
| VPX_DEC_UNSUP_BITSTREAM = VPX_CODEC_UNSUP_BITSTREAM, |
| |
| /*!\brief Encoded bitstream uses an unsupported feature |
| * |
| * The decoder does not implement a feature required by the encoder. This |
| * return code should only be used for features that prevent future |
| * pictures from being properly decoded. This error \ref MAY be treated as |
| * fatal to the stream or \ref MAY be treated as fatal to the current GOP. |
| */ |
| VPX_DEC_UNSUP_FEATURE = VPX_CODEC_UNSUP_FEATURE, |
| |
| /*!\brief The coded data for this stream is corrupt or incomplete |
| * |
| * There was a problem decoding the current frame. This return code |
| * should only be used for failures that prevent future pictures from |
| * being properly decoded. This error \ref MAY be treated as fatal to the |
| * stream or \ref MAY be treated as fatal to the current GOP. If decoding |
| * is continued for the current GOP, artifacts may be present. |
| */ |
| VPX_DEC_CORRUPT_FRAME = VPX_CODEC_CORRUPT_FRAME, |
| |
| /*!\brief An application-supplied parameter is not valid. |
| * |
| */ |
| VPX_DEC_INVALID_PARAM = VPX_CODEC_INVALID_PARAM, |
| |
| /*!\brief An iterator reached the end of list. |
| * |
| */ |
| VPX_DEC_LIST_END = VPX_CODEC_LIST_END |
| |
| } |
| vpx_dec_err_t; |
| |
| /*! \brief Decoder capabilities bitfield |
| * |
| * Each decoder advertises the capabilities it supports as part of its |
| * ::vpx_dec_iface_t interface structure. Capabilities are extra interfaces |
| * or functionality, and are not required to be supported by a decoder. |
| * |
| * The available flags are specified by VPX_DEC_CAP_* defines. |
| */ |
| typedef int vpx_dec_caps_t; |
| #define VPX_DEC_CAP_PUT_SLICE 0x0001 /**< Will issue put_slice callbacks */ |
| #define VPX_DEC_CAP_PUT_FRAME 0x0002 /**< Will issue put_frame callbacks */ |
| #define VPX_DEC_CAP_XMA 0x0004 /**< Supports eXternal Memory Allocation */ |
| |
| /*!\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. |
| */ |
| #if 1 |
| typedef vpx_codec_stream_info_t vpx_dec_stream_info_t; |
| #else |
| typedef struct { |
| 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 */ |
| } vpx_dec_stream_info_t; |
| #endif |
| |
| |
| /*!\brief Decoder interface structure. |
| * |
| * Contains function pointers and other data private to the decoder |
| * implementation. This structure is opaque to the application. |
| */ |
| typedef const struct vpx_codec_iface vpx_dec_iface_t; |
| typedef struct vpx_codec_priv vpx_dec_priv_t; |
| |
| /*!\brief Iterator |
| * |
| * Opaque storage used for iterating over lists. |
| */ |
| typedef vpx_codec_iter_t vpx_dec_iter_t; |
| |
| /*!\brief Decoder context structure |
| * |
| * All decoders \ref MUST support this context structure fully. In general, |
| * this data should be considered private to the decoder algorithm, and |
| * not be manipulated or examined by the calling application. Applications |
| * may reference the 'name' member to get a printable description of the |
| * algorithm. |
| */ |
| #if 1 |
| typedef vpx_codec_ctx_t vpx_dec_ctx_t; |
| #else |
| typedef struct { |
| const char *name; /**< Printable interface name */ |
| vpx_dec_iface_t *iface; /**< Interface pointers */ |
| vpx_dec_err_t err; /**< Last returned error */ |
| vpx_dec_priv_t *priv; /**< Algorithm private storage */ |
| } vpx_dec_ctx_t; |
| #endif |
| |
| |
| /*!\brief Return the build configuration |
| * |
| * Returns a printable string containing an encoded version of the build |
| * configuration. This may be useful to vpx support. |
| * |
| */ |
| const char *vpx_dec_build_config(void) DEPRECATED; |
| |
| /*!\brief Return the name for a given interface |
| * |
| * Returns a human readable string for name of the given decoder interface. |
| * |
| * \param[in] iface Interface pointer |
| * |
| */ |
| const char *vpx_dec_iface_name(vpx_dec_iface_t *iface) DEPRECATED; |
| |
| |
| /*!\brief Convert error number to printable string |
| * |
| * Returns a human readable string for the last error returned by the |
| * algorithm. The returned error will be one line and will not contain |
| * any newline characters. |
| * |
| * |
| * \param[in] err Error number. |
| * |
| */ |
| const char *vpx_dec_err_to_string(vpx_dec_err_t err) DEPRECATED; |
| |
| |
| /*!\brief Retrieve error synopsis for decoder context |
| * |
| * Returns a human readable string for the last error returned by the |
| * algorithm. The returned error will be one line and will not contain |
| * any newline characters. |
| * |
| * |
| * \param[in] ctx Pointer to this instance's context. |
| * |
| */ |
| const char *vpx_dec_error(vpx_dec_ctx_t *ctx) DEPRECATED; |
| |
| |
| /*!\brief Retrieve detailed error information for decoder context |
| * |
| * Returns a human readable string providing detailed information about |
| * the last error. |
| * |
| * \param[in] ctx Pointer to this instance's context. |
| * |
| * \retval NULL |
| * No detailed information is available. |
| */ |
| const char *vpx_dec_error_detail(vpx_dec_ctx_t *ctx) DEPRECATED; |
| |
| |
| /* REQUIRED FUNCTIONS |
| * |
| * The following functions are required to be implemented for all decoders. |
| * They represent the base case functionality expected of all decoders. |
| */ |
| |
| |
| /*!\brief Initialize a decoder instance |
| * |
| * Initializes a decoder context using the given interface. Applications |
| * should call the vpx_dec_init convenience macro instead of this |
| * function directly, to ensure that the ABI version number parameter |
| * is properly initialized. |
| * |
| * \param[in] ctx Pointer to this instance's context. |
| * \param[in] iface Pointer to the algorithm interface to use. |
| * \param[in] ver ABI version number. Must be set to |
| * VPX_DECODER_ABI_VERSION |
| * \retval #VPX_DEC_OK |
| * The decoder algorithm initialized. |
| * \retval #VPX_DEC_MEM_ERROR |
| * Memory allocation failed. |
| */ |
| vpx_dec_err_t vpx_dec_init_ver(vpx_dec_ctx_t *ctx, |
| vpx_dec_iface_t *iface, |
| int ver) DEPRECATED; |
| #define vpx_dec_init(ctx, iface) \ |
| vpx_dec_init_ver(ctx, iface, VPX_DECODER_ABI_VERSION) |
| |
| |
| /*!\brief Destroy a decoder instance |
| * |
| * Destroys a decoder context, freeing any associated memory buffers. |
| * |
| * \param[in] ctx Pointer to this instance's context |
| * |
| * \retval #VPX_DEC_OK |
| * The decoder algorithm initialized. |
| * \retval #VPX_DEC_MEM_ERROR |
| * Memory allocation failed. |
| */ |
| vpx_dec_err_t vpx_dec_destroy(vpx_dec_ctx_t *ctx) DEPRECATED; |
| |
| |
| /*!\brief Get the capabilities of an algorithm. |
| * |
| * Retrieves the capabilities bitfield from the algorithm's interface. |
| * |
| * \param[in] iface Pointer to the algorithm interface |
| * |
| */ |
| vpx_dec_caps_t vpx_dec_get_caps(vpx_dec_iface_t *iface) DEPRECATED; |
| |
| |
| /*!\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_DEC_OK |
| * Bitstream is parsable and stream information updated |
| */ |
| vpx_dec_err_t vpx_dec_peek_stream_info(vpx_dec_iface_t *iface, |
| const uint8_t *data, |
| unsigned int data_sz, |
| vpx_dec_stream_info_t *si) DEPRECATED; |
| |
| |
| /*!\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_DEC_OK |
| * Bitstream is parsable and stream information updated |
| */ |
| vpx_dec_err_t vpx_dec_get_stream_info(vpx_dec_ctx_t *ctx, |
| vpx_dec_stream_info_t *si) DEPRECATED; |
| |
| |
| /*!\brief Control algorithm |
| * |
| * This function is used to exchange algorithm specific data with the decoder |
| * instance. This can be used to implement features specific to a particular |
| * algorithm. |
| * |
| * This wrapper function dispatches the request to the helper function |
| * associated with the given ctrl_id. It tries to call this function |
| * transparently, but will return #VPX_DEC_ERROR if the request could not |
| * be dispatched. |
| * |
| * \param[in] ctx Pointer to this instance's context |
| * \param[in] ctrl_id Algorithm specific control identifier |
| * \param[in,out] data Data to exchange with algorithm instance. |
| * |
| * \retval #VPX_DEC_OK |
| * The control request was processed. |
| * \retval #VPX_DEC_ERROR |
| * The control request was not processed. |
| * \retval #VPX_DEC_INVALID_PARAM |
| * The data was not valid. |
| */ |
| vpx_dec_err_t vpx_dec_control(vpx_dec_ctx_t *ctx, |
| int ctrl_id, |
| void *data) DEPRECATED; |
| |
| /*!\brief Decode data |
| * |
| * Processes a buffer of coded data. If the processing results in a new |
| * decoded frame becoming available, #VPX_DEC_CB_PUT_SLICE and |
| * #VPX_DEC_CB_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. |
| * |
| * \param[in] ctx Pointer to this instance's context |
| * \param[in] data Pointer to this block of new coded data. If |
| * NULL, a VPX_DEC_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] rel_pts PTS relative to the previous frame, in us. If |
| * unknown or unavailable, set to zero. |
| * |
| * \return Returns #VPX_DEC_OK if the coded data was processed completely |
| * and future pictures can be decoded without error. Otherwise, |
| * see the descriptions of the other error codes in ::vpx_dec_err_t |
| * for recoverability capabilities. |
| */ |
| vpx_dec_err_t vpx_dec_decode(vpx_dec_ctx_t *ctx, |
| uint8_t *data, |
| unsigned int data_sz, |
| void *user_priv, |
| int rel_pts) DEPRECATED; |
| |
| |
| /*!\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 |
| * vpx_dec_decode call, and remains valid until the next call to vpx_dec_decode. |
| * |
| * \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. |
| */ |
| vpx_image_t *vpx_dec_get_frame(vpx_dec_ctx_t *ctx, |
| vpx_dec_iter_t *iter) DEPRECATED; |
| |
| |
| /*!\defgroup cap_put_frame Frame-Based Decoding Functions |
| * |
| * The following functions are required to be implemented for all decoders |
| * that advertise the VPX_DEC_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_DEC_ERROR |
| * @{ |
| */ |
| |
| /*!\brief put frame callback prototype |
| * |
| * This callback is invoked by the decoder to notify the application of |
| * the availability of decoded image data. |
| */ |
| typedef void (*vpx_dec_put_frame_cb_fn_t)(void *user_priv, |
| const vpx_image_t *img); |
| |
| |
| /*!\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_DEC_OK |
| * Callback successfully registered. |
| * \retval #VPX_DEC_ERROR |
| * Decoder context not initialized, or algorithm not capable of |
| * posting slice completion. |
| */ |
| vpx_dec_err_t vpx_dec_register_put_frame_cb(vpx_dec_ctx_t *ctx, |
| vpx_dec_put_frame_cb_fn_t cb, |
| void *user_priv) DEPRECATED; |
| |
| |
| /*!@} - end defgroup cap_put_frame */ |
| |
| /*!\defgroup cap_put_slice Slice-Based Decoding Functions |
| * |
| * The following functions are required to be implemented for all decoders |
| * that advertise the VPX_DEC_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_DEC_ERROR |
| * @{ |
| */ |
| |
| /*!\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 |
| */ |
| typedef void (*vpx_dec_put_slice_cb_fn_t)(void *user_priv, |
| const vpx_image_t *img, |
| const vpx_image_rect_t *valid, |
| const vpx_image_rect_t *update); |
| |
| |
| /*!\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_DEC_OK |
| * Callback successfully registered. |
| * \retval #VPX_DEC_ERROR |
| * Decoder context not initialized, or algorithm not capable of |
| * posting slice completion. |
| */ |
| vpx_dec_err_t vpx_dec_register_put_slice_cb(vpx_dec_ctx_t *ctx, |
| vpx_dec_put_slice_cb_fn_t cb, |
| void *user_priv) DEPRECATED; |
| |
| |
| /*!@} - end defgroup cap_put_slice*/ |
| |
| /*!\defgroup cap_xma External Memory Allocation Functions |
| * |
| * The following functions are required to be implemented for all decoders |
| * that advertise the VPX_DEC_CAP_XMA capability. Calling these functions |
| * for codecs that don't advertise this capability will result in an error |
| * code being returned, usually VPX_DEC_ERROR |
| * @{ |
| */ |
| |
| /*!\brief Memory Map Entry |
| * |
| * This structure is used to contain the properties of a memory segment. It |
| * is populated by the decoder in the request phase, and by the calling |
| * application once the requested allocation has been performed. |
| */ |
| #if 1 |
| #define VPX_DEC_MEM_ZERO 0x1 /**< Segment must be zeroed by allocation */ |
| #define VPX_DEC_MEM_WRONLY 0x2 /**< Segment need not be readable */ |
| #define VPX_DEC_MEM_FAST 0x4 /**< Place in fast memory, if available */ |
| typedef struct vpx_codec_mmap vpx_dec_mmap_t; |
| #else |
| typedef struct vpx_dec_mmap { |
| /* |
| * The following members are set by the codec when requesting a segment |
| */ |
| unsigned int id; /**< identifier for the segment's contents */ |
| unsigned long sz; /**< size of the segment, in bytes */ |
| unsigned int align; /**< required alignment of the segment, in bytes */ |
| unsigned int flags; /**< bitfield containing segment properties */ |
| #define VPX_DEC_MEM_ZERO 0x1 /**< Segment must be zeroed by allocation */ |
| #define VPX_DEC_MEM_WRONLY 0x2 /**< Segment need not be readable */ |
| #define VPX_DEC_MEM_FAST 0x4 /**< Place in fast memory, if available */ |
| |
| /* The following members are to be filled in by the allocation function */ |
| void *base; /**< pointer to the allocated segment */ |
| void (*dtor)(struct vpx_dec_mmap *map); /**< destructor to call */ |
| void *priv; /**< allocator private storage */ |
| } vpx_dec_mmap_t; |
| #endif |
| |
| /*!\brief Initialize a decoder instance in external allocation mode |
| * |
| * Initializes a decoder context using the given interface. Applications |
| * should call the vpx_dec_xma_init convenience macro instead of this |
| * function directly, to ensure that the ABI version number parameter |
| * is properly initialized. |
| * |
| * \param[in] ctx Pointer to this instance's context. |
| * \param[in] iface Pointer to the algorithm interface to use. |
| * \param[in] ver ABI version number. Must be set to |
| * VPX_DECODER_ABI_VERSION |
| * \retval #VPX_DEC_OK |
| * The decoder algorithm initialized. |
| * \retval #VPX_DEC_ERROR |
| * Decoder does not support XMA mode. |
| */ |
| vpx_dec_err_t vpx_dec_xma_init_ver(vpx_dec_ctx_t *ctx, |
| vpx_dec_iface_t *iface, |
| int ver) DEPRECATED; |
| #define vpx_dec_xma_init(ctx, iface) \ |
| vpx_dec_xma_init_ver(ctx, iface, VPX_DECODER_ABI_VERSION) |
| |
| |
| /*!\brief Iterate over the list of segments to allocate. |
| * |
| * Iterates over a list of the segments to allocate. The iterator storage |
| * should be initialized to NULL to start the iteration. Iteration is complete |
| * when this function returns VPX_DEC_LIST_END. The amount of memory needed to |
| * allocate is dependent upon the size of the encoded stream. This means that |
| * the stream info structure must be known at allocation time. It can be |
| * populated with the vpx_dec_peek_stream_info() function. In cases where the |
| * stream to be decoded is not available at allocation time, a fixed size must |
| * be requested. The decoder will not be able to decode streams larger than |
| * the size used at allocation time. |
| * |
| * \param[in] ctx Pointer to this instance's context. |
| * \param[out] mmap Pointer to the memory map entry to populate. |
| * \param[in] si Pointer to the stream info. |
| * \param[in out] iter Iterator storage, initialized to NULL |
| * |
| * \retval #VPX_DEC_OK |
| * The memory map entry was populated. |
| * \retval #VPX_DEC_ERROR |
| * Decoder does not support XMA mode. |
| * \retval #VPX_DEC_MEM_ERROR |
| * Unable to determine segment size from stream info. |
| */ |
| vpx_dec_err_t vpx_dec_get_mem_map(vpx_dec_ctx_t *ctx, |
| vpx_dec_mmap_t *mmap, |
| const vpx_dec_stream_info_t *si, |
| vpx_dec_iter_t *iter) DEPRECATED; |
| |
| |
| /*!\brief Identify allocated segments to decoder instance |
| * |
| * Stores a list of allocated segments in the decoder. Segments \ref MUST be |
| * passed in the order they are read from vpx_dec_get_mem_map(), but may be |
| * passed in groups of any size. Segments \ref MUST be set only once. The |
| * allocation function \ref MUST ensure that the vpx_dec_mmap_t::base member |
| * is non-NULL. If the segment requires cleanup handling (e.g., calling free() |
| * or close()) then the vpx_dec_mmap_t::dtor member \ref MUST be populated. |
| * |
| * \param[in] ctx Pointer to this instance's context. |
| * \param[in] mmaps Pointer to the first memory map entry in the list. |
| * \param[in] num_maps Number of entries being set at this time |
| * |
| * \retval #VPX_DEC_OK |
| * The segment was stored in the decoder context. |
| * \retval #VPX_DEC_ERROR |
| * Decoder does not support XMA mode. |
| * \retval #VPX_DEC_MEM_ERROR |
| * Segment base address was not set, or segment was already stored. |
| |
| */ |
| vpx_dec_err_t vpx_dec_set_mem_map(vpx_dec_ctx_t *ctx, |
| vpx_dec_mmap_t *mmaps, |
| unsigned int num_maps) DEPRECATED; |
| |
| /*!@} - end defgroup cap_xma*/ |
| /*!@} - end defgroup decoder*/ |
| |
| |
| #endif |
| #ifdef __cplusplus |
| } |
| #endif |