/*
 *  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 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.
 * @{
 */

/*!\file
 * \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

#ifndef VPX_DECODER_H
#define VPX_DECODER_H
#include "vpx_codec.h"

    /*!\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 (2 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/

    /*! \brief Decoder capabilities bitfield
     *
     *  Each decoder advertises the capabilities it supports as part of its
     *  ::vpx_codec_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_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_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 */

    /*!\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.
     */
    typedef struct vpx_codec_stream_info
    {
        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_codec_stream_info_t;

    /* REQUIRED FUNCTIONS
     *
     * The following functions are required to be implemented for all decoders.
     * They represent the base case functionality expected of all decoders.
     */


    /*!\brief Initialization Configurations
     *
     * This structure is used to pass init time configuration options to the
     * decoder.
     */
    typedef struct vpx_codec_dec_cfg
    {
        unsigned int threads; /**< Maximum number of threads to use, default 1 */
        unsigned int w;      /**< Width */
        unsigned int h;      /**< Height */
    } vpx_codec_dec_cfg_t; /**< alias for struct vpx_codec_dec_cfg */


    /*!\brief Initialize a decoder instance
     *
     * Initializes a decoder context using the given interface. Applications
     * should call the vpx_codec_dec_init convenience macro instead of this
     * 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.
     *
     * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
     * parameter), the storage pointed to by the cfg parameter must be
     * kept readable and stable until all memory maps have been set.
     *
     * \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.
     */
    vpx_codec_err_t vpx_codec_dec_init_ver(vpx_codec_ctx_t      *ctx,
                                           vpx_codec_iface_t    *iface,
                                           vpx_codec_dec_cfg_t  *cfg,
                                           vpx_codec_flags_t     flags,
                                           int                   ver);

    /*!\brief Convenience macro for vpx_codec_dec_init_ver()
     *
     * Ensures the ABI version parameter is properly set.
     */
#define vpx_codec_dec_init(ctx, iface, cfg, flags) \
    vpx_codec_dec_init_ver(ctx, iface, cfg, flags, VPX_DECODER_ABI_VERSION)


    /*!\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
     */
    vpx_codec_err_t vpx_codec_peek_stream_info(vpx_codec_iface_t       *iface,
            const uint8_t           *data,
            unsigned int             data_sz,
            vpx_codec_stream_info_t *si);


    /*!\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
     */
    vpx_codec_err_t vpx_codec_get_stream_info(vpx_codec_ctx_t         *ctx,
            vpx_codec_stream_info_t *si);


    /*!\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,
     *         see the descriptions of the other error codes in ::vpx_codec_err_t
     *         for recoverability capabilities.
     */
    vpx_codec_err_t vpx_codec_decode(vpx_codec_ctx_t    *ctx,
                                     const uint8_t        *data,
                                     unsigned int            data_sz,
                                     void               *user_priv,
                                     long                deadline);


    /*!\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_codec_decode call, and remains valid until the next call to vpx_codec_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_codec_get_frame(vpx_codec_ctx_t  *ctx,
                                     vpx_codec_iter_t *iter);


    /*!\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
     * @{
     */

    /*!\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_codec_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_CODEC_OK
     *     Callback successfully registered.
     * \retval #VPX_CODEC_ERROR
     *     Decoder context not initialized, or algorithm not capable of
     *     posting slice completion.
     */
    vpx_codec_err_t vpx_codec_register_put_frame_cb(vpx_codec_ctx_t             *ctx,
            vpx_codec_put_frame_cb_fn_t  cb,
            void                        *user_priv);


    /*!@} - 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_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
     * @{
     */

    /*!\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_codec_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_CODEC_OK
     *     Callback successfully registered.
     * \retval #VPX_CODEC_ERROR
     *     Decoder context not initialized, or algorithm not capable of
     *     posting slice completion.
     */
    vpx_codec_err_t vpx_codec_register_put_slice_cb(vpx_codec_ctx_t             *ctx,
            vpx_codec_put_slice_cb_fn_t  cb,
            void                        *user_priv);


    /*!@} - end defgroup cap_put_slice*/

    /*!@} - end defgroup decoder*/

#endif

#ifdef __cplusplus
}
#endif
