/*
 *  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 encoder Encoder Algorithm Interface
 * \ingroup codec
 * This abstraction allows applications using this encoder to easily support
 * multiple video formats with minimal code duplication. This section describes
 * the interface common to all encoders.
 * @{
 */

/*!\file
 * \brief Describes the encoder algorithm interface to applications.
 *
 * This file describes the interface between an application and a
 * video encoder algorithm.
 *
 */
#ifdef __cplusplus
extern "C" {
#endif

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

#define MAX_PERIODICITY 16
#define MAX_LAYERS       5

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


    /*! \brief Encoder capabilities bitfield
     *
     *  Each encoder 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 an encoder.
     *
     *  The available flags are specified by VPX_CODEC_CAP_* defines.
     */
#define VPX_CODEC_CAP_PSNR  0x10000 /**< Can issue PSNR packets */

    /*! Can output one partition at a time. Each partition is returned in its
     *  own VPX_CODEC_CX_FRAME_PKT, with the FRAME_IS_FRAGMENT flag set for
     *  every partition but the last. In this mode all frames are always
     *  returned partition by partition.
     */
#define VPX_CODEC_CAP_OUTPUT_PARTITION  0x20000


    /*! \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_PSNR  0x10000 /**< Calculate PSNR on each frame */
#define VPX_CODEC_USE_OUTPUT_PARTITION  0x20000 /**< Make the encoder output one
                                                     partition at a time. */


    /*!\brief Generic fixed size buffer structure
     *
     * This structure is able to hold a reference to any fixed size buffer.
     */
    typedef struct vpx_fixed_buf
    {
        void          *buf; /**< Pointer to the data */
        size_t         sz;  /**< Length of the buffer, in chars */
    } vpx_fixed_buf_t; /**< alias for struct vpx_fixed_buf */


    /*!\brief Time Stamp Type
     *
     * An integer, which when multiplied by the stream's time base, provides
     * the absolute time of a sample.
     */
    typedef int64_t vpx_codec_pts_t;


    /*!\brief Compressed Frame Flags
     *
     * This type represents a bitfield containing information about a compressed
     * frame that may be useful to an application. The most significant 16 bits
     * can be used by an algorithm to provide additional detail, for example to
     * support frame types that are codec specific (MPEG-1 D-frames for example)
     */
    typedef uint32_t vpx_codec_frame_flags_t;
#define VPX_FRAME_IS_KEY       0x1 /**< frame is the start of a GOP */
#define VPX_FRAME_IS_DROPPABLE 0x2 /**< frame can be dropped without affecting
    the stream (no future frame depends on
                this one) */
#define VPX_FRAME_IS_INVISIBLE 0x4 /**< frame should be decoded but will not
    be shown */
#define VPX_FRAME_IS_FRAGMENT  0x8 /**< this is a fragment of the encoded
    frame */

    /*!\brief Error Resilient flags
     *
     * These flags define which error resilient features to enable in the
     * encoder. The flags are specified through the
     * vpx_codec_enc_cfg::g_error_resilient variable.
     */
    typedef uint32_t vpx_codec_er_flags_t;
#define VPX_ERROR_RESILIENT_DEFAULT     0x1 /**< Improve resiliency against
                                                 losses of whole frames */
#define VPX_ERROR_RESILIENT_PARTITIONS  0x2 /**< The frame partitions are
                                                 independently decodable by the
                                                 bool decoder, meaning that
                                                 partitions can be decoded even
                                                 though earlier partitions have
                                                 been lost. Note that intra
                                                 predicition is still done over
                                                 the partition boundary. */

    /*!\brief Encoder output packet variants
     *
     * This enumeration lists the different kinds of data packets that can be
     * returned by calls to vpx_codec_get_cx_data(). Algorithms \ref MAY
     * extend this list to provide additional functionality.
     */
    enum vpx_codec_cx_pkt_kind
    {
        VPX_CODEC_CX_FRAME_PKT,    /**< Compressed video frame */
        VPX_CODEC_STATS_PKT,       /**< Two-pass statistics for this frame */
        VPX_CODEC_PSNR_PKT,        /**< PSNR statistics for this frame */
        VPX_CODEC_CUSTOM_PKT = 256 /**< Algorithm extensions  */
    };


    /*!\brief Encoder output packet
     *
     * This structure contains the different kinds of output data the encoder
     * may produce while compressing a frame.
     */
    typedef struct vpx_codec_cx_pkt
    {
        enum vpx_codec_cx_pkt_kind  kind; /**< packet variant */
        union
        {
            struct
            {
                void                    *buf;      /**< compressed data buffer */
                size_t                   sz;       /**< length of compressed data */
                vpx_codec_pts_t          pts;      /**< time stamp to show frame
                                                    (in timebase units) */
                unsigned long            duration; /**< duration to show frame
                                                    (in timebase units) */
                vpx_codec_frame_flags_t  flags;    /**< flags for this frame */
                int                      partition_id; /**< the partition id
                                              defines the decoding order
                                              of the partitions. Only
                                              applicable when "output partition"
                                              mode is enabled. First partition
                                              has id 0.*/

            } frame;  /**< data for compressed frame packet */
            struct vpx_fixed_buf twopass_stats;  /**< data for two-pass packet */
            struct vpx_psnr_pkt
            {
                unsigned int samples[4];  /**< Number of samples, total/y/u/v */
                uint64_t     sse[4];      /**< sum squared error, total/y/u/v */
                double       psnr[4];     /**< PSNR, total/y/u/v */
            } psnr;                       /**< data for PSNR packet */
            struct vpx_fixed_buf raw;     /**< data for arbitrary packets */

            /* This packet size is fixed to allow codecs to extend this
             * interface without having to manage storage for raw packets,
             * i.e., if it's smaller than 128 bytes, you can store in the
             * packet list directly.
             */
            char pad[128 - sizeof(enum vpx_codec_cx_pkt_kind)]; /**< fixed sz */
        } data; /**< packet data */
    } vpx_codec_cx_pkt_t; /**< alias for struct vpx_codec_cx_pkt */


    /*!\brief Rational Number
     *
     * This structure holds a fractional value.
     */
    typedef struct vpx_rational
    {
        int num; /**< fraction numerator */
        int den; /**< fraction denominator */
    } vpx_rational_t; /**< alias for struct vpx_rational */


    /*!\brief Multi-pass Encoding Pass */
    enum vpx_enc_pass
    {
        VPX_RC_ONE_PASS,   /**< Single pass mode */
        VPX_RC_FIRST_PASS, /**< First pass of multi-pass mode */
        VPX_RC_LAST_PASS   /**< Final pass of multi-pass mode */
    };


    /*!\brief Rate control mode */
    enum vpx_rc_mode
    {
        VPX_VBR, /**< Variable Bit Rate (VBR) mode */
        VPX_CBR,  /**< Constant Bit Rate (CBR) mode */
        VPX_CQ   /**< Constant Quality  (CQ)  mode */
    };


    /*!\brief Keyframe placement mode.
     *
     * This enumeration determines whether keyframes are placed automatically by
     * the encoder or whether this behavior is disabled. Older releases of this
     * SDK were implemented such that VPX_KF_FIXED meant keyframes were disabled.
     * This name is confusing for this behavior, so the new symbols to be used
     * are VPX_KF_AUTO and VPX_KF_DISABLED.
     */
    enum vpx_kf_mode
    {
        VPX_KF_FIXED, /**< deprecated, implies VPX_KF_DISABLED */
        VPX_KF_AUTO,  /**< Encoder determines optimal placement automatically */
        VPX_KF_DISABLED = 0 /**< Encoder does not place keyframes. */
    };


    /*!\brief Encoded Frame Flags
     *
     * This type indicates a bitfield to be passed to vpx_codec_encode(), defining
     * per-frame boolean values. By convention, bits common to all codecs will be
     * named VPX_EFLAG_*, and bits specific to an algorithm will be named
     * /algo/_eflag_*. The lower order 16 bits are reserved for common use.
     */
    typedef long vpx_enc_frame_flags_t;
#define VPX_EFLAG_FORCE_KF (1<<0)  /**< Force this frame to be a keyframe */


    /*!\brief Encoder configuration structure
     *
     * This structure contains the encoder settings that have common representations
     * across all codecs. This doesn't imply that all codecs support all features,
     * however.
     */
    typedef struct vpx_codec_enc_cfg
    {
        /*
         * generic settings (g)
         */

        /*!\brief Algorithm specific "usage" value
         *
         * Algorithms may define multiple values for usage, which may convey the
         * intent of how the application intends to use the stream. If this value
         * is non-zero, consult the documentation for the codec to determine its
         * meaning.
         */
        unsigned int           g_usage;


        /*!\brief Maximum number of threads to use
         *
         * For multi-threaded implementations, use no more than this number of
         * threads. The codec may use fewer threads than allowed. The value
         * 0 is equivalent to the value 1.
         */
        unsigned int           g_threads;


        /*!\brief Bitstream profile to use
         *
         * Some codecs support a notion of multiple bitstream profiles. Typically
         * this maps to a set of features that are turned on or off. Often the
         * profile to use is determined by the features of the intended decoder.
         * Consult the documentation for the codec to determine the valid values
         * for this parameter, or set to zero for a sane default.
         */
        unsigned int           g_profile;  /**< profile of bitstream to use */



        /*!\brief Width of the frame
         *
         * This value identifies the presentation resolution of the frame,
         * in pixels. Note that the frames passed as input to the encoder must
         * have this resolution. Frames will be presented by the decoder in this
         * resolution, independent of any spatial resampling the encoder may do.
         */
        unsigned int           g_w;


        /*!\brief Height of the frame
         *
         * This value identifies the presentation resolution of the frame,
         * in pixels. Note that the frames passed as input to the encoder must
         * have this resolution. Frames will be presented by the decoder in this
         * resolution, independent of any spatial resampling the encoder may do.
         */
        unsigned int           g_h;


        /*!\brief Stream timebase units
         *
         * Indicates the smallest interval of time, in seconds, used by the stream.
         * For fixed frame rate material, or variable frame rate material where
         * frames are timed at a multiple of a given clock (ex: video capture),
         * the \ref RECOMMENDED method is to set the timebase to the reciprocal
         * of the frame rate (ex: 1001/30000 for 29.970 Hz NTSC). This allows the
         * pts to correspond to the frame number, which can be handy. For
         * re-encoding video from containers with absolute time timestamps, the
         * \ref RECOMMENDED method is to set the timebase to that of the parent
         * container or multimedia framework (ex: 1/1000 for ms, as in FLV).
         */
        struct vpx_rational    g_timebase;


        /*!\brief Enable error resilient modes.
         *
         * The error resilient bitfield indicates to the encoder which features
         * it should enable to take measures for streaming over lossy or noisy
         * links.
         */
        vpx_codec_er_flags_t   g_error_resilient;


        /*!\brief Multi-pass Encoding Mode
         *
         * This value should be set to the current phase for multi-pass encoding.
         * For single pass, set to #VPX_RC_ONE_PASS.
         */
        enum vpx_enc_pass      g_pass;


        /*!\brief Allow lagged encoding
         *
         * If set, this value allows the encoder to consume a number of input
         * frames before producing output frames. This allows the encoder to
         * base decisions for the current frame on future frames. This does
         * increase the latency of the encoding pipeline, so it is not appropriate
         * in all situations (ex: realtime encoding).
         *
         * Note that this is a maximum value -- the encoder may produce frames
         * sooner than the given limit. Set this value to 0 to disable this
         * feature.
         */
        unsigned int           g_lag_in_frames;


        /*
         * rate control settings (rc)
         */

        /*!\brief Temporal resampling configuration, if supported by the codec.
         *
         * Temporal resampling allows the codec to "drop" frames as a strategy to
         * meet its target data rate. This can cause temporal discontinuities in
         * the encoded video, which may appear as stuttering during playback. This
         * trade-off is often acceptable, but for many applications is not. It can
         * be disabled in these cases.
         *
         * Note that not all codecs support this feature. All vpx VPx codecs do.
         * For other codecs, consult the documentation for that algorithm.
         *
         * This threshold is described as a percentage of the target data buffer.
         * When the data buffer falls below this percentage of fullness, a
         * dropped frame is indicated. Set the threshold to zero (0) to disable
         * this feature.
         */
        unsigned int           rc_dropframe_thresh;


        /*!\brief Enable/disable spatial resampling, if supported by the codec.
         *
         * Spatial resampling allows the codec to compress a lower resolution
         * version of the frame, which is then upscaled by the encoder to the
         * correct presentation resolution. This increases visual quality at
         * low data rates, at the expense of CPU time on the encoder/decoder.
         */
        unsigned int           rc_resize_allowed;


        /*!\brief Spatial resampling up watermark.
         *
         * This threshold is described as a percentage of the target data buffer.
         * When the data buffer rises above this percentage of fullness, the
         * encoder will step up to a higher resolution version of the frame.
         */
        unsigned int           rc_resize_up_thresh;


        /*!\brief Spatial resampling down watermark.
         *
         * This threshold is described as a percentage of the target data buffer.
         * When the data buffer falls below this percentage of fullness, the
         * encoder will step down to a lower resolution version of the frame.
         */
        unsigned int           rc_resize_down_thresh;


        /*!\brief Rate control algorithm to use.
         *
         * Indicates whether the end usage of this stream is to be streamed over
         * a bandwidth constrained link, indicating that Constant Bit Rate (CBR)
         * mode should be used, or whether it will be played back on a high
         * bandwidth link, as from a local disk, where higher variations in
         * bitrate are acceptable.
         */
        enum vpx_rc_mode       rc_end_usage;


        /*!\brief Two-pass stats buffer.
         *
         * A buffer containing all of the stats packets produced in the first
         * pass, concatenated.
         */
        struct vpx_fixed_buf   rc_twopass_stats_in;


        /*!\brief Target data rate
         *
         * Target bandwidth to use for this stream, in kilobits per second.
         */
        unsigned int           rc_target_bitrate;


        /*
         * quantizer settings
         */


        /*!\brief Minimum (Best Quality) Quantizer
         *
         * The quantizer is the most direct control over the quality of the
         * encoded image. The range of valid values for the quantizer is codec
         * specific. Consult the documentation for the codec to determine the
         * values to use. To determine the range programmatically, call
         * vpx_codec_enc_config_default() with a usage value of 0.
         */
        unsigned int           rc_min_quantizer;


        /*!\brief Maximum (Worst Quality) Quantizer
         *
         * The quantizer is the most direct control over the quality of the
         * encoded image. The range of valid values for the quantizer is codec
         * specific. Consult the documentation for the codec to determine the
         * values to use. To determine the range programmatically, call
         * vpx_codec_enc_config_default() with a usage value of 0.
         */
        unsigned int           rc_max_quantizer;


        /*
         * bitrate tolerance
         */


        /*!\brief Rate control adaptation undershoot control
         *
         * This value, expressed as a percentage of the target bitrate,
         * controls the maximum allowed adaptation speed of the codec.
         * This factor controls the maximum amount of bits that can
         * be subtracted from the target bitrate in order to compensate
         * for prior overshoot.
         *
         * Valid values in the range 0-1000.
         */
        unsigned int           rc_undershoot_pct;


        /*!\brief Rate control adaptation overshoot control
         *
         * This value, expressed as a percentage of the target bitrate,
         * controls the maximum allowed adaptation speed of the codec.
         * This factor controls the maximum amount of bits that can
         * be added to the target bitrate in order to compensate for
         * prior undershoot.
         *
         * Valid values in the range 0-1000.
         */
        unsigned int           rc_overshoot_pct;


        /*
         * decoder buffer model parameters
         */


        /*!\brief Decoder Buffer Size
         *
         * This value indicates the amount of data that may be buffered by the
         * decoding application. Note that this value is expressed in units of
         * time (milliseconds). For example, a value of 5000 indicates that the
         * client will buffer (at least) 5000ms worth of encoded data. Use the
         * target bitrate (#rc_target_bitrate) to convert to bits/bytes, if
         * necessary.
         */
        unsigned int           rc_buf_sz;


        /*!\brief Decoder Buffer Initial Size
         *
         * This value indicates the amount of data that will be buffered by the
         * decoding application prior to beginning playback. This value is
         * expressed in units of time (milliseconds). Use the target bitrate
         * (#rc_target_bitrate) to convert to bits/bytes, if necessary.
         */
        unsigned int           rc_buf_initial_sz;


        /*!\brief Decoder Buffer Optimal Size
         *
         * This value indicates the amount of data that the encoder should try
         * to maintain in the decoder's buffer. This value is expressed in units
         * of time (milliseconds). Use the target bitrate (#rc_target_bitrate)
         * to convert to bits/bytes, if necessary.
         */
        unsigned int           rc_buf_optimal_sz;


        /*
         * 2 pass rate control parameters
         */


        /*!\brief Two-pass mode CBR/VBR bias
         *
         * Bias, expressed on a scale of 0 to 100, for determining target size
         * for the current frame. The value 0 indicates the optimal CBR mode
         * value should be used. The value 100 indicates the optimal VBR mode
         * value should be used. Values in between indicate which way the
         * encoder should "lean."
         */
        unsigned int           rc_2pass_vbr_bias_pct;       /**< RC mode bias between CBR and VBR(0-100: 0->CBR, 100->VBR)   */


        /*!\brief Two-pass mode per-GOP minimum bitrate
         *
         * This value, expressed as a percentage of the target bitrate, indicates
         * the minimum bitrate to be used for a single GOP (aka "section")
         */
        unsigned int           rc_2pass_vbr_minsection_pct;


        /*!\brief Two-pass mode per-GOP maximum bitrate
         *
         * This value, expressed as a percentage of the target bitrate, indicates
         * the maximum bitrate to be used for a single GOP (aka "section")
         */
        unsigned int           rc_2pass_vbr_maxsection_pct;


        /*
         * keyframing settings (kf)
         */

        /*!\brief Keyframe placement mode
         *
         * This value indicates whether the encoder should place keyframes at a
         * fixed interval, or determine the optimal placement automatically
         * (as governed by the #kf_min_dist and #kf_max_dist parameters)
         */
        enum vpx_kf_mode       kf_mode;


        /*!\brief Keyframe minimum interval
         *
         * This value, expressed as a number of frames, prevents the encoder from
         * placing a keyframe nearer than kf_min_dist to the previous keyframe. At
         * least kf_min_dist frames non-keyframes will be coded before the next
         * keyframe. Set kf_min_dist equal to kf_max_dist for a fixed interval.
         */
        unsigned int           kf_min_dist;


        /*!\brief Keyframe maximum interval
         *
         * This value, expressed as a number of frames, forces the encoder to code
         * a keyframe if one has not been coded in the last kf_max_dist frames.
         * A value of 0 implies all frames will be keyframes. Set kf_min_dist
         * equal to kf_max_dist for a fixed interval.
         */
        unsigned int           kf_max_dist;

        /*
         * Temporal scalability settings (ts)
         */

        /*!\brief Number of coding layers
         *
         * This value specifies the number of coding layers to be used.
         */
        unsigned int           ts_number_layers;

        /*!\brief Target bitrate for each layer
         *
         * These values specify the target coding bitrate for each coding layer.
         */
        unsigned int           ts_target_bitrate[MAX_LAYERS];

        /*!\brief Frame rate decimation factor for each layer
         *
         * These values specify the frame rate decimation factors to apply
         * to each layer.
         */
        unsigned int           ts_rate_decimator[MAX_LAYERS];

        /*!\brief Length of the sequence defining frame layer membership
         *
         * This value specifies the length of the sequence that defines the
         * membership of frames to layers. For example, if ts_periodicity=8 then
         * frames are assigned to coding layers with a repeated sequence of
         * length 8.
         */
        unsigned int           ts_periodicity;

        /*!\brief Template defining the membership of frames to coding layers
         *
         * This array defines the membership of frames to coding layers. For a
         * 2-layer encoding that assigns even numbered frames to one layer (0)
         * and odd numbered frames to a second layer (1) with ts_periodicity=8,
         * then ts_layer_id = (0,1,0,1,0,1,0,1).
         */
        unsigned int           ts_layer_id[MAX_PERIODICITY];
    } vpx_codec_enc_cfg_t; /**< alias for struct vpx_codec_enc_cfg */


    /*!\brief Initialize an encoder instance
     *
     * Initializes a encoder context using the given interface. Applications
     * should call the vpx_codec_enc_init convenience macro instead of this
     * function directly, to ensure that the ABI version number parameter
     * is properly initialized.
     *
     * 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_ENCODER_ABI_VERSION
     * \retval #VPX_CODEC_OK
     *     The decoder algorithm initialized.
     * \retval #VPX_CODEC_MEM_ERROR
     *     Memory allocation failed.
     */
    vpx_codec_err_t vpx_codec_enc_init_ver(vpx_codec_ctx_t      *ctx,
                                           vpx_codec_iface_t    *iface,
                                           vpx_codec_enc_cfg_t  *cfg,
                                           vpx_codec_flags_t     flags,
                                           int                   ver);


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


    /*!\brief Initialize multi-encoder instance
     *
     * Initializes multi-encoder context using the given interface.
     * Applications should call the vpx_codec_enc_init_multi convenience macro
     * instead of this function directly, to ensure that the ABI version number
     * parameter is properly initialized.
     *
     * 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]    num_enc Total number of encoders.
     * \param[in]    flags   Bitfield of VPX_CODEC_USE_* flags
     * \param[in]    dsf     Pointer to down-sampling factors.
     * \param[in]    ver     ABI version number. Must be set to
     *                       VPX_ENCODER_ABI_VERSION
     * \retval #VPX_CODEC_OK
     *     The decoder algorithm initialized.
     * \retval #VPX_CODEC_MEM_ERROR
     *     Memory allocation failed.
     */
    vpx_codec_err_t vpx_codec_enc_init_multi_ver(vpx_codec_ctx_t      *ctx,
                                                 vpx_codec_iface_t    *iface,
                                                 vpx_codec_enc_cfg_t  *cfg,
                                                 int                   num_enc,
                                                 vpx_codec_flags_t     flags,
                                                 vpx_rational_t       *dsf,
                                                 int                   ver);


    /*!\brief Convenience macro for vpx_codec_enc_init_multi_ver()
     *
     * Ensures the ABI version parameter is properly set.
     */
#define vpx_codec_enc_init_multi(ctx, iface, cfg, num_enc, flags, dsf) \
    vpx_codec_enc_init_multi_ver(ctx, iface, cfg, num_enc, flags, dsf, \
                                 VPX_ENCODER_ABI_VERSION)


    /*!\brief Get a default configuration
     *
     * Initializes a encoder configuration structure with default values. Supports
     * the notion of "usages" so that an algorithm may offer different default
     * settings depending on the user's intended goal. This function \ref SHOULD
     * be called by all applications to initialize the configuration structure
     * before specializing the configuration with application specific values.
     *
     * \param[in]    iface   Pointer to the algorithm interface to use.
     * \param[out]   cfg     Configuration buffer to populate
     * \param[in]    usage   End usage. Set to 0 or use codec specific values.
     *
     * \retval #VPX_CODEC_OK
     *     The configuration was populated.
     * \retval #VPX_CODEC_INCAPABLE
     *     Interface is not an encoder interface.
     * \retval #VPX_CODEC_INVALID_PARAM
     *     A parameter was NULL, or the usage value was not recognized.
     */
    vpx_codec_err_t  vpx_codec_enc_config_default(vpx_codec_iface_t    *iface,
            vpx_codec_enc_cfg_t  *cfg,
            unsigned int          usage);


    /*!\brief Set or change configuration
     *
     * Reconfigures an encoder instance according to the given configuration.
     *
     * \param[in]    ctx     Pointer to this instance's context
     * \param[in]    cfg     Configuration buffer to use
     *
     * \retval #VPX_CODEC_OK
     *     The configuration was populated.
     * \retval #VPX_CODEC_INCAPABLE
     *     Interface is not an encoder interface.
     * \retval #VPX_CODEC_INVALID_PARAM
     *     A parameter was NULL, or the usage value was not recognized.
     */
    vpx_codec_err_t  vpx_codec_enc_config_set(vpx_codec_ctx_t            *ctx,
            const vpx_codec_enc_cfg_t  *cfg);


    /*!\brief Get global stream headers
     *
     * Retrieves a stream level global header packet, if supported by the codec.
     *
     * \param[in]    ctx     Pointer to this instance's context
     *
     * \retval NULL
     *     Encoder does not support global header
     * \retval Non-NULL
     *     Pointer to buffer containing global header packet
     */
    vpx_fixed_buf_t *vpx_codec_get_global_headers(vpx_codec_ctx_t   *ctx);


#define VPX_DL_REALTIME     (1)        /**< deadline parameter analogous to
    *   VPx REALTIME mode. */
#define VPX_DL_GOOD_QUALITY (1000000)  /**< deadline parameter analogous to
    *   VPx GOOD QUALITY mode. */
#define VPX_DL_BEST_QUALITY (0)        /**< deadline parameter analogous to
    *   VPx BEST QUALITY mode. */
    /*!\brief Encode a frame
     *
     * Encodes a video frame at the given "presentation time." The presentation
     * time stamp (PTS) \ref MUST be strictly increasing.
     *
     * The encoder supports the notion of a soft real-time deadline. Given a
     * non-zero value to the deadline parameter, the encoder will make a "best
     * effort" guarantee to  return before the given time slice expires. It is
     * implicit that limiting the available time to encode will degrade the
     * output quality. The encoder can be given an unlimited time to produce the
     * best possible frame by specifying a deadline of '0'. This deadline
     * supercedes the VPx notion of "best quality, good quality, realtime".
     * Applications that wish to map these former settings to the new deadline
     * based system can use the symbols #VPX_DL_REALTIME, #VPX_DL_GOOD_QUALITY,
     * and #VPX_DL_BEST_QUALITY.
     *
     * When the last frame has been passed to the encoder, this function should
     * continue to be called, with the img parameter set to NULL. This will
     * signal the end-of-stream condition to the encoder and allow it to encode
     * any held buffers. Encoding is complete when vpx_codec_encode() is called
     * and vpx_codec_get_cx_data() returns no data.
     *
     * \param[in]    ctx       Pointer to this instance's context
     * \param[in]    img       Image data to encode, NULL to flush.
     * \param[in]    pts       Presentation time stamp, in timebase units.
     * \param[in]    duration  Duration to show frame, in timebase units.
     * \param[in]    flags     Flags to use for encoding this frame.
     * \param[in]    deadline  Time to spend encoding, in microseconds. (0=infinite)
     *
     * \retval #VPX_CODEC_OK
     *     The configuration was populated.
     * \retval #VPX_CODEC_INCAPABLE
     *     Interface is not an encoder interface.
     * \retval #VPX_CODEC_INVALID_PARAM
     *     A parameter was NULL, the image format is unsupported, etc.
     */
    vpx_codec_err_t  vpx_codec_encode(vpx_codec_ctx_t            *ctx,
                                      const vpx_image_t          *img,
                                      vpx_codec_pts_t             pts,
                                      unsigned long               duration,
                                      vpx_enc_frame_flags_t       flags,
                                      unsigned long               deadline);

    /*!\brief Set compressed data output buffer
     *
     * Sets the buffer that the codec should output the compressed data
     * into. This call effectively sets the buffer pointer returned in the
     * next VPX_CODEC_CX_FRAME_PKT packet. Subsequent packets will be
     * appended into this buffer. The buffer is preserved across frames,
     * so applications must periodically call this function after flushing
     * the accumulated compressed data to disk or to the network to reset
     * the pointer to the buffer's head.
     *
     * `pad_before` bytes will be skipped before writing the compressed
     * data, and `pad_after` bytes will be appended to the packet. The size
     * of the packet will be the sum of the size of the actual compressed
     * data, pad_before, and pad_after. The padding bytes will be preserved
     * (not overwritten).
     *
     * Note that calling this function does not guarantee that the returned
     * compressed data will be placed into the specified buffer. In the
     * event that the encoded data will not fit into the buffer provided,
     * the returned packet \ref MAY point to an internal buffer, as it would
     * if this call were never used. In this event, the output packet will
     * NOT have any padding, and the application must free space and copy it
     * to the proper place. This is of particular note in configurations
     * that may output multiple packets for a single encoded frame (e.g., lagged
     * encoding) or if the application does not reset the buffer periodically.
     *
     * Applications may restore the default behavior of the codec providing
     * the compressed data buffer by calling this function with a NULL
     * buffer.
     *
     * Applications \ref MUSTNOT call this function during iteration of
     * vpx_codec_get_cx_data().
     *
     * \param[in]    ctx         Pointer to this instance's context
     * \param[in]    buf         Buffer to store compressed data into
     * \param[in]    pad_before  Bytes to skip before writing compressed data
     * \param[in]    pad_after   Bytes to skip after writing compressed data
     *
     * \retval #VPX_CODEC_OK
     *     The buffer was set successfully.
     * \retval #VPX_CODEC_INVALID_PARAM
     *     A parameter was NULL, the image format is unsupported, etc.
     */
    vpx_codec_err_t vpx_codec_set_cx_data_buf(vpx_codec_ctx_t       *ctx,
            const vpx_fixed_buf_t *buf,
            unsigned int           pad_before,
            unsigned int           pad_after);


    /*!\brief Encoded data iterator
     *
     * Iterates over a list of data packets to be passed from the encoder to the
     * application. The different kinds of packets available are enumerated in
     * #vpx_codec_cx_pkt_kind.
     *
     * #VPX_CODEC_CX_FRAME_PKT packets should be passed to the application's
     * muxer. Multiple compressed frames may be in the list.
     * #VPX_CODEC_STATS_PKT packets should be appended to a global buffer.
     *
     * The application \ref MUST silently ignore any packet kinds that it does
     * not recognize or support.
     *
     * The data buffers returned from this function are only guaranteed to be
     * valid until the application makes another call to any vpx_codec_* function.
     *
     * \param[in]     ctx      Pointer to this instance's context
     * \param[in,out] iter     Iterator storage, initialized to NULL
     *
     * \return Returns a pointer to an output data packet (compressed frame data,
     *         two-pass statistics, etc.) or NULL to signal end-of-list.
     *
     */
    const vpx_codec_cx_pkt_t *vpx_codec_get_cx_data(vpx_codec_ctx_t   *ctx,
            vpx_codec_iter_t  *iter);


    /*!\brief Get Preview Frame
     *
     * Returns an image that can be used as a preview. Shows the image as it would
     * exist at the decompressor. The application \ref MUST NOT write into this
     * image buffer.
     *
     * \param[in]     ctx      Pointer to this instance's context
     *
     * \return Returns a pointer to a preview image, or NULL if no image is
     *         available.
     *
     */
    const vpx_image_t *vpx_codec_get_preview_frame(vpx_codec_ctx_t   *ctx);


    /*!@} - end defgroup encoder*/

#endif
#ifdef __cplusplus
}
#endif
