190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*
2f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
4f71323e297a928af368937089d3ed71239786f86Andreas Huber *  Use of this source code is governed by a BSD-style license
5f71323e297a928af368937089d3ed71239786f86Andreas Huber *  that can be found in the LICENSE file in the root of the source
6f71323e297a928af368937089d3ed71239786f86Andreas Huber *  tree. An additional intellectual property rights grant can be found
7f71323e297a928af368937089d3ed71239786f86Andreas Huber *  in the file PATENTS.  All contributing project authors may
8f71323e297a928af368937089d3ed71239786f86Andreas Huber *  be found in the AUTHORS file in the root of the source tree.
990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
1290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber/*!\defgroup encoder Encoder Algorithm Interface
1390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \ingroup codec
1490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This abstraction allows applications using this encoder to easily support
1590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * multiple video formats with minimal code duplication. This section describes
1690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * the interface common to all encoders.
1790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * @{
1890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
1990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
2079f15823c34ae1e423108295e416213200bb280fAndreas Huber/*!\file
2190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * \brief Describes the encoder algorithm interface to applications.
2290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
2390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * This file describes the interface between an application and a
2490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber * video encoder algorithm.
2590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber *
2690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber */
2790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef __cplusplus
2890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huberextern "C" {
2990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
3090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifndef VPX_ENCODER_H
3290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_ENCODER_H
3390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#include "vpx_codec.h"
3490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
3690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Current ABI version number
3790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
3890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \internal
3990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * If this file is altered in any way that changes the ABI, this value
4090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * must be bumped.  Examples include, but are not limited to, changing
4190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * types, removing or reassigning enums, adding/removing/rearranging
4290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * fields to structures
4390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
4490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_ENCODER_ABI_VERSION (2 + VPX_CODEC_ABI_VERSION) /**<\hideinitializer*/
4590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
4790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*! \brief Encoder capabilities bitfield
4890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
4990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *  Each encoder advertises the capabilities it supports as part of its
5090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *  ::vpx_codec_iface_t interface structure. Capabilities are extra
5190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *  interfaces or functionality, and are not required to be supported
5290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *  by an encoder.
5390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
5479f15823c34ae1e423108295e416213200bb280fAndreas Huber     *  The available flags are specified by VPX_CODEC_CAP_* defines.
5590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
5690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_CODEC_CAP_PSNR  0x10000 /**< Can issue PSNR packets */
5790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
5990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*! \brief Initialization-time Feature Enabling
6090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
6190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *  Certain codec features must be known at initialization time, to allow
6290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *  for proper memory allocation.
6390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
6490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *  The available flags are specified by VPX_CODEC_USE_* defines.
6590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
6690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_CODEC_USE_PSNR  0x10000 /**< Calculate PSNR on each frame */
6790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
6990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Generic fixed size buffer structure
7090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
7190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This structure is able to hold a reference to any fixed size buffer.
7290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
7390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef struct vpx_fixed_buf
7490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
7590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        void          *buf; /**< Pointer to the data */
7690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        size_t         sz;  /**< Length of the buffer, in chars */
7790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } vpx_fixed_buf_t; /**< alias for struct vpx_fixed_buf */
7890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
7990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Time Stamp Type
8190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
8290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * An integer, which when multiplied by the stream's time base, provides
8390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * the absolute time of a sample.
8490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
8590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef int64_t vpx_codec_pts_t;
8690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
8890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Compressed Frame Flags
8990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
9090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This type represents a bitfield containing information about a compressed
9190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * frame that may be useful to an application. The most significant 16 bits
9290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * can be used by an algorithm to provide additional detail, for example to
9390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * support frame types that are codec specific (MPEG-1 D-frames for example)
9490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
9590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef uint32_t vpx_codec_frame_flags_t;
9690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_FRAME_IS_KEY       0x1 /**< frame is the start of a GOP */
9790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_FRAME_IS_DROPPABLE 0x2 /**< frame can be dropped without affecting
9890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    the stream (no future frame depends on
9990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                this one) */
10090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_FRAME_IS_INVISIBLE 0x4 /**< frame should be decoded but will not
10190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    be shown */
10290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
10490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Encoder output packet variants
10590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
10690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This enumeration lists the different kinds of data packets that can be
10790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * returned by calls to vpx_codec_get_cx_data(). Algorithms \ref MAY
10890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * extend this list to provide additional functionality.
10990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
11090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    enum vpx_codec_cx_pkt_kind
11190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
11290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_CODEC_CX_FRAME_PKT,    /**< Compressed video frame */
11390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_CODEC_STATS_PKT,       /**< Two-pass statistics for this frame */
11490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_CODEC_PSNR_PKT,        /**< PSNR statistics for this frame */
11590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_CODEC_CUSTOM_PKT = 256 /**< Algorithm extensions  */
11690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    };
11790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
11990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Encoder output packet
12090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
12190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This structure contains the different kinds of output data the encoder
12290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * may produce while compressing a frame.
12390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
12490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef struct vpx_codec_cx_pkt
12590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
12690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        enum vpx_codec_cx_pkt_kind  kind; /**< packet variant */
12790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        union
12890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        {
12990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            struct
13090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
13190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                void                    *buf;      /**< compressed data buffer */
13290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                size_t                   sz;       /**< length of compressed data */
13390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vpx_codec_pts_t          pts;      /**< time stamp to show frame
13490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                                    (in timebase units) */
13590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                unsigned long            duration; /**< duration to show frame
13690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                                    (in timebase units) */
13790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                vpx_codec_frame_flags_t  flags;    /**< flags for this frame */
13890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            } frame;  /**< data for compressed frame packet */
13990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            struct vpx_fixed_buf twopass_stats;  /**< data for two-pass packet */
14090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            struct vpx_psnr_pkt
14190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            {
14290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                unsigned int samples[4];  /**< Number of samples, total/y/u/v */
14390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                uint64_t     sse[4];      /**< sum squared error, total/y/u/v */
14490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                double       psnr[4];     /**< PSNR, total/y/u/v */
14590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            } psnr;                       /**< data for PSNR packet */
14690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            struct vpx_fixed_buf raw;     /**< data for arbitrary packets */
14790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
14890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            /* This packet size is fixed to allow codecs to extend this
14990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber             * interface without having to manage storage for raw packets,
15079f15823c34ae1e423108295e416213200bb280fAndreas Huber             * i.e., if it's smaller than 128 bytes, you can store in the
15190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber             * packet list directly.
15290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber             */
15390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            char pad[128 - sizeof(enum vpx_codec_cx_pkt_kind)]; /**< fixed sz */
15490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        } data; /**< packet data */
15590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } vpx_codec_cx_pkt_t; /**< alias for struct vpx_codec_cx_pkt */
15690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
15890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Rational Number
15990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
16090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This structure holds a fractional value.
16190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
16290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef struct vpx_rational
16390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
16490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int num; /**< fraction numerator */
16590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        int den; /**< fraction denominator */
16690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } vpx_rational_t; /**< alias for struct vpx_rational */
16790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
16990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Multi-pass Encoding Pass */
17090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    enum vpx_enc_pass
17190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
17290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_RC_ONE_PASS,   /**< Single pass mode */
17390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_RC_FIRST_PASS, /**< First pass of multi-pass mode */
174538f6170b788de7408b06efc6613dc98579aa6a6Andreas Huber        VPX_RC_LAST_PASS   /**< Final pass of multi-pass mode */
17590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    };
17690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
17890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Rate control mode */
17990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    enum vpx_rc_mode
18090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
18190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_VBR, /**< Variable Bit Rate (VBR) mode */
18279f15823c34ae1e423108295e416213200bb280fAndreas Huber        VPX_CBR,  /**< Constant Bit Rate (CBR) mode */
18379f15823c34ae1e423108295e416213200bb280fAndreas Huber        VPX_CQ   /**< Constant Quality  (CQ)  mode */
18490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    };
18590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
18790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Keyframe placement mode.
18890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
18990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This enumeration determines whether keyframes are placed automatically by
19090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * the encoder or whether this behavior is disabled. Older releases of this
19190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * SDK were implemented such that VPX_KF_FIXED meant keyframes were disabled.
19290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This name is confusing for this behavior, so the new symbols to be used
19390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * are VPX_KF_AUTO and VPX_KF_DISABLED.
19490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
19590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    enum vpx_kf_mode
19690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
19790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_KF_FIXED, /**< deprecated, implies VPX_KF_DISABLED */
19890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_KF_AUTO,  /**< Encoder determines optimal placement automatically */
19990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        VPX_KF_DISABLED = 0 /**< Encoder does not place keyframes. */
20090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    };
20190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
20390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Encoded Frame Flags
20490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
20590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This type indicates a bitfield to be passed to vpx_codec_encode(), defining
20690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * per-frame boolean values. By convention, bits common to all codecs will be
20790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * named VPX_EFLAG_*, and bits specific to an algorithm will be named
20890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * /algo/_eflag_*. The lower order 16 bits are reserved for common use.
20990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
21090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef long vpx_enc_frame_flags_t;
21190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_EFLAG_FORCE_KF (1<<0)  /**< Force this frame to be a keyframe */
21290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
21490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Encoder configuration structure
21590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
21690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * This structure contains the encoder settings that have common representations
21790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * across all codecs. This doesn't imply that all codecs support all features,
21890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * however.
21990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
22090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    typedef struct vpx_codec_enc_cfg
22190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    {
22290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
22390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * generic settings (g)
22490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
22590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
22690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Algorithm specific "usage" value
22790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
22890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Algorithms may define multiple values for usage, which may convey the
22990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * intent of how the application intends to use the stream. If this value
23090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * is non-zero, consult the documentation for the codec to determine its
23190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * meaning.
23290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
23390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           g_usage;
23490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
23690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Maximum number of threads to use
23790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
23890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * For multi-threaded implementations, use no more than this number of
23990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * threads. The codec may use fewer threads than allowed. The value
24090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * 0 is equivalent to the value 1.
24190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
24290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           g_threads;
24390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
24590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Bitstream profile to use
24690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
24790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Some codecs support a notion of multiple bitstream profiles. Typically
24890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * this maps to a set of features that are turned on or off. Often the
24990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * profile to use is determined by the features of the intended decoder.
25090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Consult the documentation for the codec to determine the valid values
25190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * for this parameter, or set to zero for a sane default.
25290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
25390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           g_profile;  /**< profile of bitstream to use */
25490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
25790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Width of the frame
25890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
25990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value identifies the presentation resolution of the frame,
26090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * in pixels. Note that the frames passed as input to the encoder must
26190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * have this resolution. Frames will be presented by the decoder in this
26290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * resolution, independent of any spatial resampling the encoder may do.
26390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
26490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           g_w;
26590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
26790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Height of the frame
26890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
26990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value identifies the presentation resolution of the frame,
27090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * in pixels. Note that the frames passed as input to the encoder must
27190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * have this resolution. Frames will be presented by the decoder in this
27290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * resolution, independent of any spatial resampling the encoder may do.
27390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
27490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           g_h;
27590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
27790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Stream timebase units
27890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
27990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Indicates the smallest interval of time, in seconds, used by the stream.
28090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * For fixed frame rate material, or variable frame rate material where
28190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * frames are timed at a multiple of a given clock (ex: video capture),
28290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * the \ref RECOMMENDED method is to set the timebase to the reciprocal
28390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * of the frame rate (ex: 1001/30000 for 29.970 Hz NTSC). This allows the
28490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * pts to correspond to the frame number, which can be handy. For
28590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * re-encoding video from containers with absolute time timestamps, the
28690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * \ref RECOMMENDED method is to set the timebase to that of the parent
28790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * container or multimedia framework (ex: 1/1000 for ms, as in FLV).
28890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
28990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        struct vpx_rational    g_timebase;
29090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
29290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Enable error resilient mode.
29390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
29490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Error resilient mode indicates to the encoder that it should take
29590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * measures appropriate for streaming over lossy or noisy links, if
29690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * possible. Set to 1 to enable this feature, 0 to disable it.
29790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
29890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           g_error_resilient;
29990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Multi-pass Encoding Mode
30290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
30390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value should be set to the current phase for multi-pass encoding.
30490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * For single pass, set to #VPX_RC_ONE_PASS.
30590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
30690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        enum vpx_enc_pass      g_pass;
30790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
30990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Allow lagged encoding
31090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
31190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * If set, this value allows the encoder to consume a number of input
31290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * frames before producing output frames. This allows the encoder to
31390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * base decisions for the current frame on future frames. This does
31490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * increase the latency of the encoding pipeline, so it is not appropriate
31590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * in all situations (ex: realtime encoding).
31690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
31790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Note that this is a maximum value -- the encoder may produce frames
31890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * sooner than the given limit. Set this value to 0 to disable this
31990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * feature.
32090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
32190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           g_lag_in_frames;
32290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
32590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * rate control settings (rc)
32690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
32790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
32890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Temporal resampling configuration, if supported by the codec.
32990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
33090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Temporal resampling allows the codec to "drop" frames as a strategy to
33190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * meet its target data rate. This can cause temporal discontinuities in
33290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * the encoded video, which may appear as stuttering during playback. This
33390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * trade-off is often acceptable, but for many applications is not. It can
33490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * be disabled in these cases.
33590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
33690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Note that not all codecs support this feature. All vpx VPx codecs do.
33790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * For other codecs, consult the documentation for that algorithm.
33890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
33990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This threshold is described as a percentage of the target data buffer.
34090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * When the data buffer falls below this percentage of fullness, a
34190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * dropped frame is indicated. Set the threshold to zero (0) to disable
34290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * this feature.
34390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
34490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_dropframe_thresh;
34590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
34790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Enable/disable spatial resampling, if supported by the codec.
34890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
34990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Spatial resampling allows the codec to compress a lower resolution
35090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * version of the frame, which is then upscaled by the encoder to the
35190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * correct presentation resolution. This increases visual quality at
35290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * low data rates, at the expense of CPU time on the encoder/decoder.
35390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
35490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_resize_allowed;
35590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
35790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Spatial resampling up watermark.
35890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
35990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This threshold is described as a percentage of the target data buffer.
36090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * When the data buffer rises above this percentage of fullness, the
36190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * encoder will step up to a higher resolution version of the frame.
36290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
36390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_resize_up_thresh;
36490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
36690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Spatial resampling down watermark.
36790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
36890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This threshold is described as a percentage of the target data buffer.
36990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * When the data buffer falls below this percentage of fullness, the
37090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * encoder will step down to a lower resolution version of the frame.
37190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
37290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_resize_down_thresh;
37390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
37590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Rate control algorithm to use.
37690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
37790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Indicates whether the end usage of this stream is to be streamed over
37890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * a bandwidth constrained link, indicating that Constant Bit Rate (CBR)
37990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * mode should be used, or whether it will be played back on a high
38090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * bandwidth link, as from a local disk, where higher variations in
38190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * bitrate are acceptable.
38290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
38390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        enum vpx_rc_mode       rc_end_usage;
38490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
38690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Two-pass stats buffer.
38790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
38890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * A buffer containing all of the stats packets produced in the first
38990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * pass, concatenated.
39090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
39190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        struct vpx_fixed_buf   rc_twopass_stats_in;
39290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
39490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Target data rate
39590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
39690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Target bandwidth to use for this stream, in kilobits per second.
39790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
39890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_target_bitrate;
39990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
40290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * quantizer settings
40390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
40490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
40690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Minimum (Best Quality) Quantizer
40790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
40890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * The quantizer is the most direct control over the quality of the
40990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * encoded image. The range of valid values for the quantizer is codec
41090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * specific. Consult the documentation for the codec to determine the
41190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * values to use. To determine the range programmatically, call
41290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * vpx_codec_enc_config_default() with a usage value of 0.
41390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
41490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_min_quantizer;
41590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
41790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Maximum (Worst Quality) Quantizer
41890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
41990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * The quantizer is the most direct control over the quality of the
42090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * encoded image. The range of valid values for the quantizer is codec
42190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * specific. Consult the documentation for the codec to determine the
42290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * values to use. To determine the range programmatically, call
42390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * vpx_codec_enc_config_default() with a usage value of 0.
42490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
42590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_max_quantizer;
42690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
42890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
42990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * bitrate tolerance
43090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
43190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
43390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Rate control undershoot tolerance
43490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
43590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value, expressed as a percentage of the target bitrate, describes
43690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * the target bitrate for easier frames, allowing bits to be saved for
43790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * harder frames. Set to zero to use the codec default.
43890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
43990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_undershoot_pct;
44090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
44290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Rate control overshoot tolerance
44390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
44490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value, expressed as a percentage of the target bitrate, describes
44590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * the maximum allowed bitrate for a given frame.  Set to zero to use the
44690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * codec default.
44790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
44890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_overshoot_pct;
44990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
45290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * decoder buffer model parameters
45390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
45490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
45690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Decoder Buffer Size
45790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
45890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value indicates the amount of data that may be buffered by the
45990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * decoding application. Note that this value is expressed in units of
46090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * time (milliseconds). For example, a value of 5000 indicates that the
46190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * client will buffer (at least) 5000ms worth of encoded data. Use the
46290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * target bitrate (#rc_target_bitrate) to convert to bits/bytes, if
46390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * necessary.
46490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
46590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_buf_sz;
46690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
46890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Decoder Buffer Initial Size
46990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
47090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value indicates the amount of data that will be buffered by the
47190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * decoding application prior to beginning playback. This value is
47290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * expressed in units of time (milliseconds). Use the target bitrate
47390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * (#rc_target_bitrate) to convert to bits/bytes, if necessary.
47490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
47590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_buf_initial_sz;
47690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
47890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Decoder Buffer Optimal Size
47990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
48090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value indicates the amount of data that the encoder should try
48190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * to maintain in the decoder's buffer. This value is expressed in units
48290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * of time (milliseconds). Use the target bitrate (#rc_target_bitrate)
48390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * to convert to bits/bytes, if necessary.
48490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
48590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_buf_optimal_sz;
48690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
48890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
48990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * 2 pass rate control parameters
49090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
49190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
49390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Two-pass mode CBR/VBR bias
49490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
49590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * Bias, expressed on a scale of 0 to 100, for determining target size
49690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * for the current frame. The value 0 indicates the optimal CBR mode
49790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * value should be used. The value 100 indicates the optimal VBR mode
49890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * value should be used. Values in between indicate which way the
49990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * encoder should "lean."
50090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
50190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_2pass_vbr_bias_pct;       /**< RC mode bias between CBR and VBR(0-100: 0->CBR, 100->VBR)   */
50290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
50490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Two-pass mode per-GOP minimum bitrate
50590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
50690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value, expressed as a percentage of the target bitrate, indicates
50790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * the minimum bitrate to be used for a single GOP (aka "section")
50890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
50990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_2pass_vbr_minsection_pct;
51090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Two-pass mode per-GOP maximum bitrate
51390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
51490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value, expressed as a percentage of the target bitrate, indicates
51590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * the maximum bitrate to be used for a single GOP (aka "section")
51690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
51790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           rc_2pass_vbr_maxsection_pct;
51890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
51990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*
52190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * keyframing settings (kf)
52290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
52390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
52490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Keyframe placement mode
52590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
52690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value indicates whether the encoder should place keyframes at a
52790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * fixed interval, or determine the optimal placement automatically
52890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * (as governed by the #kf_min_dist and #kf_max_dist parameters)
52990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
53090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        enum vpx_kf_mode       kf_mode;
53190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
53390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Keyframe minimum interval
53490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
53590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value, expressed as a number of frames, prevents the encoder from
53690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * placing a keyframe nearer than kf_min_dist to the previous keyframe. At
53790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * least kf_min_dist frames non-keyframes will be coded before the next
53890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * keyframe. Set kf_min_dist equal to kf_max_dist for a fixed interval.
53990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
54090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           kf_min_dist;
54190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
54390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        /*!\brief Keyframe maximum interval
54490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         *
54590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * This value, expressed as a number of frames, forces the encoder to code
54690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * a keyframe if one has not been coded in the last kf_max_dist frames.
54790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * A value of 0 implies all frames will be keyframes. Set kf_min_dist
54890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         * equal to kf_max_dist for a fixed interval.
54990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber         */
55090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber        unsigned int           kf_max_dist;
55190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    } vpx_codec_enc_cfg_t; /**< alias for struct vpx_codec_enc_cfg */
55390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
55590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Initialize an encoder instance
55690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
55790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Initializes a encoder context using the given interface. Applications
55890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * should call the vpx_codec_enc_init convenience macro instead of this
55990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * function directly, to ensure that the ABI version number parameter
56090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * is properly initialized.
56190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
56290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
56390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * parameter), the storage pointed to by the cfg parameter must be
56490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * kept readable and stable until all memory maps have been set.
56590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
56690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    ctx     Pointer to this instance's context.
56790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    iface   Pointer to the algorithm interface to use.
56890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    cfg     Configuration to use, if known. May be NULL.
56990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    flags   Bitfield of VPX_CODEC_USE_* flags
57090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    ver     ABI version number. Must be set to
57190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *                       VPX_ENCODER_ABI_VERSION
57290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_OK
57390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     The decoder algorithm initialized.
57490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_MEM_ERROR
57590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     Memory allocation failed.
57690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
57790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t vpx_codec_enc_init_ver(vpx_codec_ctx_t      *ctx,
57890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                           vpx_codec_iface_t    *iface,
57990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                           vpx_codec_enc_cfg_t  *cfg,
58090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                           vpx_codec_flags_t     flags,
58190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                           int                   ver);
58290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
58490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Convenience macro for vpx_codec_enc_init_ver()
58590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
58690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Ensures the ABI version parameter is properly set.
58790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
58890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define vpx_codec_enc_init(ctx, iface, cfg, flags) \
58990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_enc_init_ver(ctx, iface, cfg, flags, VPX_ENCODER_ABI_VERSION)
59090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
59290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Get a default configuration
59390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
59490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Initializes a encoder configuration structure with default values. Supports
59590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * the notion of "usages" so that an algorithm may offer different default
59690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * settings depending on the user's intended goal. This function \ref SHOULD
59790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * be called by all applications to initialize the configuration structure
59890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * before specializing the configuration with application specific values.
59990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
60090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    iface   Pointer to the algorithm interface to use.
60190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[out]   cfg     Configuration buffer to populate
60290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    usage   End usage. Set to 0 or use codec specific values.
60390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
60490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_OK
60590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     The configuration was populated.
60690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_INCAPABLE
60790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     Interface is not an encoder interface.
60890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_INVALID_PARAM
60990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     A parameter was NULL, or the usage value was not recognized.
61090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
61190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t  vpx_codec_enc_config_default(vpx_codec_iface_t    *iface,
61290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_codec_enc_cfg_t  *cfg,
61390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            unsigned int          usage);
61490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
61690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Set or change configuration
61790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
61890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Reconfigures an encoder instance according to the given configuration.
61990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
62090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    ctx     Pointer to this instance's context
62190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    cfg     Configuration buffer to use
62290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
62390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_OK
62490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     The configuration was populated.
62590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_INCAPABLE
62690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     Interface is not an encoder interface.
62790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_INVALID_PARAM
62890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     A parameter was NULL, or the usage value was not recognized.
62990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
63090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t  vpx_codec_enc_config_set(vpx_codec_ctx_t            *ctx,
63190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            const vpx_codec_enc_cfg_t  *cfg);
63290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
63490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Get global stream headers
63590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
63690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Retrieves a stream level global header packet, if supported by the codec.
63790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
63890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    ctx     Pointer to this instance's context
63990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
64090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval NULL
64190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     Encoder does not support global header
64290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval Non-NULL
64390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     Pointer to buffer containing global header packet
64490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
64590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_fixed_buf_t *vpx_codec_get_global_headers(vpx_codec_ctx_t   *ctx);
64690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
64890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_DL_REALTIME     (1)        /**< deadline parameter analogous to
64990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *   VPx REALTIME mode. */
65090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_DL_GOOD_QUALITY (1000000)  /**< deadline parameter analogous to
65190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *   VPx GOOD QUALITY mode. */
65290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#define VPX_DL_BEST_QUALITY (0)        /**< deadline parameter analogous to
65390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    *   VPx BEST QUALITY mode. */
65490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Encode a frame
65590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
65690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Encodes a video frame at the given "presentation time." The presentation
65790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * time stamp (PTS) \ref MUST be strictly increasing.
65890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
65990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * The encoder supports the notion of a soft real-time deadline. Given a
66090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * non-zero value to the deadline parameter, the encoder will make a "best
66190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * effort" guarantee to  return before the given time slice expires. It is
66290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * implicit that limiting the available time to encode will degrade the
66390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * output quality. The encoder can be given an unlimited time to produce the
66490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * best possible frame by specifying a deadline of '0'. This deadline
66590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * supercedes the VPx notion of "best quality, good quality, realtime".
66690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Applications that wish to map these former settings to the new deadline
66790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * based system can use the symbols #VPX_DL_REALTIME, #VPX_DL_GOOD_QUALITY,
66890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * and #VPX_DL_BEST_QUALITY.
66990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
67090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * When the last frame has been passed to the encoder, this function should
67190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * continue to be called, with the img parameter set to NULL. This will
67290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * signal the end-of-stream condition to the encoder and allow it to encode
67390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * any held buffers. Encoding is complete when vpx_codec_encode() is called
67490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * and vpx_codec_get_cx_data() returns no data.
67590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
67690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    ctx       Pointer to this instance's context
67790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    img       Image data to encode, NULL to flush.
67890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    pts       Presentation time stamp, in timebase units.
67990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    duration  Duration to show frame, in timebase units.
68090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    flags     Flags to use for encoding this frame.
68190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    deadline  Time to spend encoding, in microseconds. (0=infinite)
68290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
68390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_OK
68490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     The configuration was populated.
68590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_INCAPABLE
68690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     Interface is not an encoder interface.
68790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_INVALID_PARAM
68890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     A parameter was NULL, the image format is unsupported, etc.
68990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
69090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t  vpx_codec_encode(vpx_codec_ctx_t            *ctx,
69190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                      const vpx_image_t          *img,
69290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                      vpx_codec_pts_t             pts,
69390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                      unsigned long               duration,
69490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                      vpx_enc_frame_flags_t       flags,
69590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber                                      unsigned long               deadline);
69690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
69890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Set compressed data output buffer
69990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
70090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Sets the buffer that the codec should output the compressed data
70190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * into. This call effectively sets the buffer pointer returned in the
70290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * next VPX_CODEC_CX_FRAME_PKT packet. Subsequent packets will be
70390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * appended into this buffer. The buffer is preserved across frames,
70490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * so applications must periodically call this function after flushing
70590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * the accumulated compressed data to disk or to the network to reset
70690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * the pointer to the buffer's head.
70790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
70890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * `pad_before` bytes will be skipped before writing the compressed
70990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * data, and `pad_after` bytes will be appended to the packet. The size
71090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * of the packet will be the sum of the size of the actual compressed
71190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * data, pad_before, and pad_after. The padding bytes will be preserved
71290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * (not overwritten).
71390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
71490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Note that calling this function does not guarantee that the returned
71590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * compressed data will be placed into the specified buffer. In the
71690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * event that the encoded data will not fit into the buffer provided,
71790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * the returned packet \ref MAY point to an internal buffer, as it would
71890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * if this call were never used. In this event, the output packet will
71990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * NOT have any padding, and the application must free space and copy it
72090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * to the proper place. This is of particular note in configurations
72190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * that may output multiple packets for a single encoded frame (e.g., lagged
72290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * encoding) or if the application does not reset the buffer periodically.
72390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
72490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Applications may restore the default behavior of the codec providing
72590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * the compressed data buffer by calling this function with a NULL
72690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * buffer.
72790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
72890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Applications \ref MUSTNOT call this function during iteration of
72990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * vpx_codec_get_cx_data().
73090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
73190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    ctx         Pointer to this instance's context
73290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    buf         Buffer to store compressed data into
73390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    pad_before  Bytes to skip before writing compressed data
73490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]    pad_after   Bytes to skip after writing compressed data
73590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
73690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_OK
73790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     The buffer was set successfully.
73890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \retval #VPX_CODEC_INVALID_PARAM
73990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *     A parameter was NULL, the image format is unsupported, etc.
74090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
74190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    vpx_codec_err_t vpx_codec_set_cx_data_buf(vpx_codec_ctx_t       *ctx,
74290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            const vpx_fixed_buf_t *buf,
74390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            unsigned int           pad_before,
74490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            unsigned int           pad_after);
74590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
74690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
74790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Encoded data iterator
74890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
74990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Iterates over a list of data packets to be passed from the encoder to the
75090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * application. The different kinds of packets available are enumerated in
75190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * #vpx_codec_cx_pkt_kind.
75290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
75390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * #VPX_CODEC_CX_FRAME_PKT packets should be passed to the application's
75490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * muxer. Multiple compressed frames may be in the list.
75590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * #VPX_CODEC_STATS_PKT packets should be appended to a global buffer.
75690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
75790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * The application \ref MUST silently ignore any packet kinds that it does
75890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * not recognize or support.
75990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
76090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * The data buffers returned from this function are only guaranteed to be
76190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * valid until the application makes another call to any vpx_codec_* function.
76290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
76390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]     ctx      Pointer to this instance's context
76490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in,out] iter     Iterator storage, initialized to NULL
76590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
76690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \return Returns a pointer to an output data packet (compressed frame data,
76790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *         two-pass statistics, etc.) or NULL to signal end-of-list.
76890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
76990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
77090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const vpx_codec_cx_pkt_t *vpx_codec_get_cx_data(vpx_codec_ctx_t   *ctx,
77190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber            vpx_codec_iter_t  *iter);
77290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
77490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!\brief Get Preview Frame
77590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
77690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * Returns an image that can be used as a preview. Shows the image as it would
77790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * exist at the decompressor. The application \ref MUST NOT write into this
77890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * image buffer.
77990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
78090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \param[in]     ctx      Pointer to this instance's context
78190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
78290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     * \return Returns a pointer to a preview image, or NULL if no image is
78390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *         available.
78490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     *
78590d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber     */
78690d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    const vpx_image_t *vpx_codec_get_preview_frame(vpx_codec_ctx_t   *ctx);
78790d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
78890d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
78990d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber    /*!@} - end defgroup encoder*/
79090d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber
79190d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
79290d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#ifdef __cplusplus
79390d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber}
79490d3ed91ae9228e1c8bab561b6138d4cb8c1e4fdAndreas Huber#endif
795