/*
 *  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 vpx_encoder.h
 * \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"


    /*!\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 (2 + 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 specifiedby VPX_CODEC_CAP_* defines.
     */
#define VPX_CODEC_CAP_PSNR  0x10000 /**< Can issue PSNR packets */


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


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


    /*!\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 */
            } 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,
             * ie 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 */
    };


    /*!\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 mode.
         *
         * Error resilient mode indicates to the encoder that it should take
         * measures appropriate for streaming over lossy or noisy links, if
         * possible. Set to 1 to enable this feature, 0 to disable it.
         */
        unsigned int           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 undershoot tolerance
         *
         * This value, expressed as a percentage of the target bitrate, describes
         * the target bitrate for easier frames, allowing bits to be saved for
         * harder frames. Set to zero to use the codec default.
         */
        unsigned int           rc_undershoot_pct;


        /*!\brief Rate control overshoot tolerance
         *
         * This value, expressed as a percentage of the target bitrate, describes
         * the maximum allowed bitrate for a given frame.  Set to zero to use the
         * codec default.
         */
        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;

    } 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 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
