/*
 *  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"

  /*! Temporal Scalability: Maximum length of the sequence defining frame
   * layer membership
   */
#define VPX_TS_MAX_PERIODICITY 16

  /*! Temporal Scalability: Maximum number of coding layers */
#define VPX_TS_MAX_LAYERS       5

  /*!\deprecated Use #VPX_TS_MAX_PERIODICITY instead. */
#define MAX_PERIODICITY VPX_TS_MAX_PERIODICITY

  /*!\deprecated Use #VPX_TS_MAX_LAYERS instead. */
#define MAX_LAYERS      VPX_TS_MAX_LAYERS

/*! Spatial Scalability: Maximum number of coding layers */
#define VPX_SS_MAX_LAYERS       5

/*! Spatial Scalability: Default number of coding layers */
#define VPX_SS_DEFAULT_LAYERS       3

  /*!\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,   /**< Constrained Quality (CQ)  mode */
    VPX_Q,    /**< Constant Quality (Q) 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;

    /*
     * Spatial scalability settings (ss)
     */

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

    /*!\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[VPX_TS_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[VPX_TS_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[VPX_TS_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.
   *
   * 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_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
