Skip to content
Snippets Groups Projects
avformat.h 77.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • /*
     * copyright (c) 2001 Fabrice Bellard
     *
    
     * This file is part of FFmpeg.
     *
     * FFmpeg is free software; you can redistribute it and/or
    
     * modify it under the terms of the GNU Lesser General Public
     * License as published by the Free Software Foundation; either
    
     * version 2.1 of the License, or (at your option) any later version.
    
     * FFmpeg is distributed in the hope that it will be useful,
    
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     * Lesser General Public License for more details.
     *
     * You should have received a copy of the GNU Lesser General Public
    
     * License along with FFmpeg; if not, write to the Free Software
    
     * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     */
    
    
    #ifndef AVFORMAT_AVFORMAT_H
    #define AVFORMAT_AVFORMAT_H
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    /**
     * @file
     * @ingroup libavf
     * Main libavformat public API header
     */
    
    
    /**
     * @defgroup libavf I/O and Muxing/Demuxing Library
     * @{
     *
    
     * Libavformat (lavf) is a library for dealing with various media container
     * formats. Its main two purposes are demuxing - i.e. splitting a media file
     * into component streams, and the reverse process of muxing - writing supplied
     * data in a specified container format. It also has an @ref lavf_io
     * "I/O module" which supports a number of protocols for accessing the data (e.g.
     * file, tcp, http and others). Before using lavf, you need to call
     * av_register_all() to register all compiled muxers, demuxers and protocols.
     * Unless you are absolutely sure you won't use libavformat's network
     * capabilities, you should also call avformat_network_init().
     *
     * A supported input format is described by an AVInputFormat struct, conversely
     * an output format is described by AVOutputFormat. You can iterate over all
     * registered input/output formats using the av_iformat_next() /
     * av_oformat_next() functions. The protocols layer is not part of the public
     * API, so you can only get the names of supported protocols with the
     * avio_enum_protocols() function.
     *
     * Main lavf structure used for both muxing and demuxing is AVFormatContext,
     * which exports all information about the file being read or written. As with
    
     * most Libavformat structures, its size is not part of public ABI, so it cannot be
    
     * allocated on stack or directly with av_malloc(). To create an
     * AVFormatContext, use avformat_alloc_context() (some functions, like
     * avformat_open_input() might do that for you).
     *
     * Most importantly an AVFormatContext contains:
     * @li the @ref AVFormatContext.iformat "input" or @ref AVFormatContext.oformat
     * "output" format. It is either autodetected or set by user for input;
     * always set by user for output.
     * @li an @ref AVFormatContext.streams "array" of AVStreams, which describe all
     * elementary streams stored in the file. AVStreams are typically referred to
     * using their index in this array.
     * @li an @ref AVFormatContext.pb "I/O context". It is either opened by lavf or
     * set by user for input, always set by user for output (unless you are dealing
     * with an AVFMT_NOFILE format).
     *
    
     * @section lavf_options Passing options to (de)muxers
     * Lavf allows to configure muxers and demuxers using the @ref avoptions
     * mechanism. Generic (format-independent) libavformat options are provided by
     * AVFormatContext, they can be examined from a user program by calling
     * av_opt_next() / av_opt_find() on an allocated AVFormatContext (or its AVClass
     * from avformat_get_class()). Private (format-specific) options are provided by
     * AVFormatContext.priv_data if and only if AVInputFormat.priv_class /
     * AVOutputFormat.priv_class of the corresponding format struct is non-NULL.
     * Further options may be provided by the @ref AVFormatContext.pb "I/O context",
     * if its AVClass is non-NULL, and the protocols layer. See the discussion on
     * nesting in @ref avoptions documentation to learn how to access those.
     *
    
     * @defgroup lavf_decoding Demuxing
     * @{
    
     * Demuxers read a media file and split it into chunks of data (@em packets). A
    
     * @ref AVPacket "packet" contains one or more encoded frames which belongs to a
     * single elementary stream. In the lavf API this process is represented by the
    
     * avformat_open_input() function for opening a file, av_read_frame() for
     * reading a single packet and finally avformat_close_input(), which does the
     * cleanup.
     *
     * @section lavf_decoding_open Opening a media file
     * The minimum information required to open a file is its URL or filename, which
     * is passed to avformat_open_input(), as in the following code:
     * @code
     * const char    *url = "in.mp3";
     * AVFormatContext *s = NULL;
     * int ret = avformat_open_input(&s, url, NULL, NULL);
     * if (ret < 0)
     *     abort();
     * @endcode
     * The above code attempts to allocate an AVFormatContext, open the
     * specified file (autodetecting the format) and read the header, exporting the
     * information stored there into s. Some formats do not have a header or do not
     * store enough information there, so it is recommended that you call the
     * avformat_find_stream_info() function which tries to read and decode a few
     * frames to find missing information.
     *
     * In some cases you might want to preallocate an AVFormatContext yourself with
     * avformat_alloc_context() and do some tweaking on it before passing it to
     * avformat_open_input(). One such case is when you want to use custom functions
     * for reading input data instead of lavf internal I/O layer.
     * To do that, create your own AVIOContext with avio_alloc_context(), passing
     * your reading callbacks to it. Then set the @em pb field of your
     * AVFormatContext to newly created AVIOContext.
     *
    
     * Since the format of the opened file is in general not known until after
     * avformat_open_input() has returned, it is not possible to set demuxer private
     * options on a preallocated context. Instead, the options should be passed to
     * avformat_open_input() wrapped in an AVDictionary:
     * @code
     * AVDictionary *options = NULL;
     * av_dict_set(&options, "video_size", "640x480", 0);
     * av_dict_set(&options, "pixel_format", "rgb24", 0);
     *
     * if (avformat_open_input(&s, url, NULL, &options) < 0)
     *     abort();
     * av_dict_free(&options);
     * @endcode
     * This code passes the private options 'video_size' and 'pixel_format' to the
     * demuxer. They would be necessary for e.g. the rawvideo demuxer, since it
     * cannot know how to interpret raw video data otherwise. If the format turns
     * out to be something different than raw video, those options will not be
     * recognized by the demuxer and therefore will not be applied. Such unrecognized
     * options are then returned in the options dictionary (recognized options are
     * consumed). The calling program can handle such unrecognized options as it
     * wishes, e.g.
     * @code
     * AVDictionaryEntry *e;
     * if (e = av_dict_get(options, "", NULL, AV_DICT_IGNORE_SUFFIX)) {
     *     fprintf(stderr, "Option %s not recognized by the demuxer.\n", e->key);
     *     abort();
     * }
     * @endcode
     *
    
     * After you have finished reading the file, you must close it with
     * avformat_close_input(). It will free everything associated with the file.
     *
     * @section lavf_decoding_read Reading from an opened file
    
     * Reading data from an opened AVFormatContext is done by repeatedly calling
     * av_read_frame() on it. Each call, if successful, will return an AVPacket
     * containing encoded data for one AVStream, identified by
     * AVPacket.stream_index. This packet may be passed straight into the libavcodec
     * decoding functions avcodec_decode_video2(), avcodec_decode_audio4() or
     * avcodec_decode_subtitle2() if the caller wishes to decode the data.
     *
     * AVPacket.pts, AVPacket.dts and AVPacket.duration timing information will be
     * set if known. They may also be unset (i.e. AV_NOPTS_VALUE for
     * pts/dts, 0 for duration) if the stream does not provide them. The timing
     * information will be in AVStream.time_base units, i.e. it has to be
     * multiplied by the timebase to convert them to seconds.
     *
    
     * If AVPacket.destruct is set on the returned packet, then the packet is
     * allocated dynamically and the user may keep it indefinitely.
     * Otherwise, if AVPacket.destruct is NULL, the packet data is backed by a
     * static storage somewhere inside the demuxer and the packet is only valid
     * until the next av_read_frame() call or closing the file. If the caller
     * requires a longer lifetime, av_dup_packet() will make an av_malloc()ed copy
     * of it.
     * In both cases, the packet must be freed with av_free_packet() when it is no
     * longer needed.
    
     *
     * @section lavf_decoding_seek Seeking
    
     * @}
     *
     * @defgroup lavf_encoding Muxing
     * @{
     * @}
     *
    
     * @defgroup lavf_io I/O Read/Write
    
     * @{
     * @}
     *
     * @defgroup lavf_codec Demuxers
     * @{
     * @defgroup lavf_codec_native Native Demuxers
     * @{
     * @}
     * @defgroup lavf_codec_wrappers External library wrappers
     * @{
     * @}
     * @}
     * @defgroup lavf_protos I/O Protocols
     * @{
     * @}
     * @defgroup lavf_internal Internal
     * @{
     * @}
     * @}
     *
     */
    
    Zdenek Kabelac's avatar
    Zdenek Kabelac committed
    #include <stdio.h>  /* FILE */
    
    #include "libavcodec/avcodec.h"
    
    #include "libavutil/dict.h"
    
    #include "libavutil/log.h"
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    #include "avio.h"
    
    #include "libavformat/version.h"
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    #if FF_API_AV_GETTIME
    #include "libavutil/time.h"
    #endif
    
    
    struct AVFormatContext;
    
    
    /**
     * @defgroup metadata_api Public Metadata API
     * @{
    
     * The metadata API allows libavformat to export metadata tags to a client
    
     * application when demuxing. Conversely it allows a client application to
     * set metadata when muxing.
     *
     * Metadata is exported or set as pairs of key/value strings in the 'metadata'
     * fields of the AVFormatContext, AVStream, AVChapter and AVProgram structs
    
     * using the @ref lavu_dict "AVDictionary" API. Like all strings in FFmpeg,
    
     * metadata is assumed to be UTF-8 encoded Unicode. Note that metadata
    
     * exported by demuxers isn't checked to be valid UTF-8 in most cases.
    
     * Important concepts to keep in mind:
    
     * -  Keys are unique; there can never be 2 tags with the same key. This is
    
     *    also meant semantically, i.e., a demuxer should not knowingly produce
     *    several keys that are literally different but semantically identical.
     *    E.g., key=Author5, key=Author6. In this example, all authors must be
     *    placed in the same tag.
    
     * -  Metadata is flat, not hierarchical; there are no subtags. If you
    
     *    want to store, e.g., the email address of the child of producer Alice
     *    and actor Bob, that could have key=alice_and_bobs_childs_email_address.
    
     * -  Several modifiers can be applied to the tag name. This is done by
    
     *    appending a dash character ('-') and the modifier name in the order
     *    they appear in the list below -- e.g. foo-eng-sort, not foo-sort-eng.
    
     *    -  language -- a tag whose value is localized for a particular language
    
     *       is appended with the ISO 639-2/B 3-letter language code.
     *       For example: Author-ger=Michael, Author-eng=Mike
     *       The original/default language is in the unqualified "Author" tag.
     *       A demuxer should set a default if it sets any translated tag.
    
     *    -  sorting  -- a modified version of a tag that should be used for
    
     *       sorting will have '-sort' appended. E.g. artist="The Beatles",
     *       artist-sort="Beatles, The".
     *
    
     * -  Demuxers attempt to export metadata in a generic format, however tags
    
     *    with no generic equivalents are left as they are stored in the container.
     *    Follows a list of generic tag names:
    
     @verbatim
     album        -- name of the set this work belongs to
     album_artist -- main creator of the set/album, if different from artist.
                     e.g. "Various Artists" for compilation albums.
     artist       -- main creator of the work
     comment      -- any additional description of the file.
     composer     -- who composed the work, if different from artist.
     copyright    -- name of copyright holder.
     creation_time-- date when the file was created, preferably in ISO 8601.
     date         -- date when the work was created, preferably in ISO 8601.
     disc         -- number of a subset, e.g. disc in a multi-disc collection.
     encoder      -- name/settings of the software/hardware that produced the file.
     encoded_by   -- person/group who created the file.
     filename     -- original name of the file.
     genre        -- <self-evident>.
     language     -- main language in which the work is performed, preferably
                     in ISO 639-2 format. Multiple languages can be specified by
                     separating them with commas.
     performer    -- artist who performed the work, if different from artist.
                     E.g for "Also sprach Zarathustra", artist would be "Richard
                     Strauss" and performer "London Philharmonic Orchestra".
     publisher    -- name of the label/publisher.
     service_name     -- name of the service in broadcasting (channel name).
     service_provider -- name of the service provider in broadcasting.
     title        -- name of the work.
     track        -- number of this work in the set, can be in form current/total.
     variant_bitrate -- the total bitrate of the bitrate variant that the current stream is part of
     @endverbatim
     *
    
     * Look in the examples section for an application example how to use the Metadata API.
     *
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    /* packet functions */
    
    
     * Allocate and read the payload of a packet and initialize its
    
    Diego Biurrun's avatar
    Diego Biurrun committed
     * @param size desired payload size
     * @return >0 (read size) if OK, AVERROR_xxx otherwise
    
    int av_get_packet(AVIOContext *s, AVPacket *pkt, int size);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
     * Read data and append it to the current content of the AVPacket.
     * If pkt->size is 0 this is identical to av_get_packet.
    
     * Note that this uses av_grow_packet and thus involves a realloc
     * which is inefficient. Thus this function should only be used
     * when there is no reasonable way to know (an upper bound of)
     * the final size.
     *
     * @param pkt packet
     * @param size amount of data to read
     * @return >0 (read size) if OK, AVERROR_xxx otherwise, previous data
     *         will not be lost even if an error occurs.
     */
    
    int av_append_packet(AVIOContext *s, AVPacket *pkt, int size);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    /*************************************************/
    /* fractional numbers for exact pts handling */
    
    
    Diego Biurrun's avatar
    Diego Biurrun committed
     * The exact value of the fractional number is: 'val + num / den'.
     * num is assumed to be 0 <= num < den.
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    typedef struct AVFrac {
    
        int64_t val, num, den;
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    /*************************************************/
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    /**
     * This structure contains the data a format has to probe a file.
     */
    
        const char *filename;
    
        unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */
        int buf_size;       /**< Size of buf except extra allocated bytes */
    
    #define AVPROBE_SCORE_MAX 100               ///< maximum score, half of that is used for file-extension-based detection
    
    #define AVPROBE_SCORE_RETRY (AVPROBE_SCORE_MAX/4)
    
    #define AVPROBE_PADDING_SIZE 32             ///< extra allocated bytes at the end of the probe buffer
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    /// Demuxer will use avio_open, no opened file should be provided by the caller.
    
    #define AVFMT_NOFILE        0x0001
    
    Diego Biurrun's avatar
    Diego Biurrun committed
    #define AVFMT_NEEDNUMBER    0x0002 /**< Needs '%d' in filename. */
    #define AVFMT_SHOW_IDS      0x0008 /**< Show format stream IDs numbers. */
    #define AVFMT_RAWPICTURE    0x0020 /**< Format wants AVPicture structure for
                                          raw picture data. */
    #define AVFMT_GLOBALHEADER  0x0040 /**< Format wants global header. */
    #define AVFMT_NOTIMESTAMPS  0x0080 /**< Format does not need / have any timestamps. */
    #define AVFMT_GENERIC_INDEX 0x0100 /**< Use generic index building code. */
    
    #define AVFMT_TS_DISCONT    0x0200 /**< Format allows timestamp discontinuities. Note, muxers always require valid (monotone) timestamps */
    
    #define AVFMT_VARIABLE_FPS  0x0400 /**< Format allows variable fps. */
    
    #define AVFMT_NODIMENSIONS  0x0800 /**< Format does not need width/height */
    
    #define AVFMT_NOSTREAMS     0x1000 /**< Format does not require any streams */
    
    #define AVFMT_NOBINSEARCH   0x2000 /**< Format does not allow to fallback to binary search via read_timestamp */
    #define AVFMT_NOGENSEARCH   0x4000 /**< Format does not allow to fallback to generic search */
    
    #define AVFMT_NO_BYTE_SEEK  0x8000 /**< Format does not allow seeking by bytes */
    
    #define AVFMT_ALLOW_FLUSH  0x10000 /**< Format allows flushing. If not set, the muxer will not receive a NULL packet in the write_packet function. */
    
    #if LIBAVFORMAT_VERSION_MAJOR <= 54
    #define AVFMT_TS_NONSTRICT 0x8020000 //we try to be compatible to the ABIs of ffmpeg and major forks
    #else
    #define AVFMT_TS_NONSTRICT 0x20000
    #endif
                                       /**< Format does not require strictly
    
                                            increasing timestamps, but they must
                                            still be monotonic */
    
    #define AVFMT_SEEK_TO_PTS   0x4000000 /**< Seeking is based on PTS */
    
    /**
     * @addtogroup lavf_encoding
     * @{
     */
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        const char *name;
    
        /**
         * Descriptive name for the format, meant to be more human-readable
    
         * than name. You should use the NULL_IF_CONFIG_SMALL() macro
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        const char *long_name;
        const char *mime_type;
    
    Diego Biurrun's avatar
    Diego Biurrun committed
        const char *extensions; /**< comma-separated filename extensions */
    
        /* output support */
    
        enum AVCodecID audio_codec;    /**< default audio codec */
        enum AVCodecID video_codec;    /**< default video codec */
        enum AVCodecID subtitle_codec; /**< default subtitle codec */
    
        /**
         * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_RAWPICTURE,
         * AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS,
    
         * AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH,
         * AVFMT_TS_NONSTRICT
    
         */
        int flags;
    
        /**
         * List of supported codec_id-codec_tag pairs, ordered by "better
    
         * choice first". The arrays are all terminated by AV_CODEC_ID_NONE.
    
         */
        const struct AVCodecTag * const *codec_tag;
    
    
        const AVClass *priv_class; ///< AVClass for the private context
    
        /*****************************************************************
         * No fields below this line are part of the public API. They
         * may not be used outside of libavformat and can be changed and
         * removed at will.
         * New public fields should be added right above.
         *****************************************************************
         */
        struct AVOutputFormat *next;
    
        /**
         * size of private data so that it can be allocated in the wrapper
         */
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        int (*write_header)(struct AVFormatContext *);
    
        /**
         * Write a packet. If AVFMT_ALLOW_FLUSH is set in flags,
         * pkt can be NULL in order to flush data buffered in the muxer.
         * When flushing, return 0 if there still is more data to flush,
         * or 1 if everything was flushed and there is no more buffered
         * data.
         */
    
        int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        int (*write_trailer)(struct AVFormatContext *);
    
        /**
         * Currently only used to set pixel format if not YUV420P.
         */
    
        int (*interleave_packet)(struct AVFormatContext *, AVPacket *out,
                                 AVPacket *in, int flush);
    
        /**
         * Test if the given codec can be stored in this container.
         *
         * @return 1 if the codec is supported, 0 if it is not.
         *         A negative number if unknown.
    
         *         MKTAG('A', 'P', 'I', 'C') if the codec is only supported as AV_DISPOSITION_ATTACHED_PIC
    
        int (*query_codec)(enum AVCodecID id, int std_compliance);
    
        void (*get_output_timestamp)(struct AVFormatContext *s, int stream,
                                     int64_t *dts, int64_t *wall);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    /**
     * @addtogroup lavf_decoding
     * @{
     */
    
        /**
         * A comma separated list of short names for the format. New names
    
         * may be appended with a minor bump.
         */
    
        /**
         * Descriptive name for the format, meant to be more human-readable
    
         * than name. You should use the NULL_IF_CONFIG_SMALL() macro
    
        /**
         * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS,
         * AVFMT_GENERIC_INDEX, AVFMT_TS_DISCONT, AVFMT_NOBINSEARCH,
    
         * AVFMT_NOGENSEARCH, AVFMT_NO_BYTE_SEEK, AVFMT_SEEK_TO_PTS.
    
         */
        int flags;
    
        /**
         * If extensions are defined, then no probe is done. You should
         * usually not use extension format guessing because it is not
         * reliable enough
         */
        const char *extensions;
    
        const struct AVCodecTag * const *codec_tag;
    
        const AVClass *priv_class; ///< AVClass for the private context
    
        /*****************************************************************
         * No fields below this line are part of the public API. They
         * may not be used outside of libavformat and can be changed and
         * removed at will.
         * New public fields should be added right above.
         *****************************************************************
         */
        struct AVInputFormat *next;
    
        /**
    
         * Raw demuxers store their codec ID here.
    
        /**
         * Size of private data so that it can be allocated in the wrapper.
         */
    
         * Tell if a given file has a chance of being parsed as this format.
    
         * The buffer provided is guaranteed to be AVPROBE_PADDING_SIZE bytes
         * big so you do not have to check for that unless you need more.
    
    
        /**
         * Read the format header and initialize the AVFormatContext
    
         * structure. Return 0 if OK. Only used in raw format right
         * now. 'avformat_new_stream' should be called to create new streams.
    
        int (*read_header)(struct AVFormatContext *);
    
    
        /**
         * Read one packet and put it in 'pkt'. pts and flags are also
    
         * set. 'avformat_new_stream' can be called only if the flag
    
         * AVFMTCTX_NOHEADER is used and only in the calling thread (not in a
         * background thread).
    
         * @return 0 on success, < 0 on error.
         *         When returning an error, pkt must not have been allocated
         *         or must be freed before returning
         */
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
    
    
        /**
         * Close the stream. The AVFormatContext and AVStreams are not
         * freed by this function
         */
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        int (*read_close)(struct AVFormatContext *);
    
    Diego Biurrun's avatar
    Diego Biurrun committed
         * Seek to a given timestamp relative to the frames in
         * stream component stream_index.
    
         * @param stream_index Must not be -1.
         * @param flags Selects which direction should be preferred if no exact
         *              match is available.
    
         * @return >= 0 on success (but not necessarily the new offset)
    
        int (*read_seek)(struct AVFormatContext *,
                         int stream_index, int64_t timestamp, int flags);
    
    
         * Get the next timestamp in stream[stream_index].time_base units.
    
         * @return the timestamp or AV_NOPTS_VALUE if an error occurred
    
         */
        int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
                                  int64_t *pos, int64_t pos_limit);
    
    
        /**
         * Start/resume playing - only meaningful if using a network-based format
         * (RTSP).
         */
    
        int (*read_play)(struct AVFormatContext *);
    
    
        /**
         * Pause playing - only meaningful if using a network-based format
         * (RTSP).
         */
    
        int (*read_pause)(struct AVFormatContext *);
    
    
         * Seek to timestamp ts.
    
         * Seeking will be done so that the point from which all active streams
         * can be presented successfully will be closest to ts and within min/max_ts.
         * Active streams are all streams that have AVStream.discard < AVDISCARD_ALL.
         */
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
        int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    
    
    enum AVStreamParseType {
        AVSTREAM_PARSE_NONE,
        AVSTREAM_PARSE_FULL,       /**< full parsing and repack */
    
    Diego Biurrun's avatar
    Diego Biurrun committed
        AVSTREAM_PARSE_HEADERS,    /**< Only parse headers, do not repack. */
    
        AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */
    
        AVSTREAM_PARSE_FULL_ONCE,  /**< full parsing and repack of the first frame only, only implemented for H.264 currently */
    
        AVSTREAM_PARSE_FULL_RAW=MKTAG(0,'R','A','W'),       /**< full parsing and repack with timestamp and position generation by parser for raw
                                                                 this assumes that each packet in the file contains no demuxer level headers and
    
                                                                 just codec level data, otherwise position generation would fail */
    
    typedef struct AVIndexEntry {
        int64_t pos;
    
        int64_t timestamp;        /**<
                                   * Timestamp in AVStream.time_base units, preferably the time from which on correctly decoded frames are available
                                   * when seeking to this entry. That means preferable PTS on keyframe based formats.
                                   * But demuxers can choose to store a different timestamp, if it is more convenient for the implementation or nothing better
                                   * is known
                                   */
    
    #define AVINDEX_KEYFRAME 0x0001
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
        int flags:2;
    
    Diego Biurrun's avatar
    Diego Biurrun committed
        int size:30; //Yeah, trying to keep the size of this small to reduce memory requirements (it is 24 vs. 32 bytes due to possible 8-byte alignment).
        int min_distance;         /**< Minimum distance between this and the previous keyframe, used to avoid unneeded searching. */
    
    #define AV_DISPOSITION_DEFAULT   0x0001
    #define AV_DISPOSITION_DUB       0x0002
    #define AV_DISPOSITION_ORIGINAL  0x0004
    #define AV_DISPOSITION_COMMENT   0x0008
    #define AV_DISPOSITION_LYRICS    0x0010
    #define AV_DISPOSITION_KARAOKE   0x0020
    
    
    /**
     * Track should be used during playback by default.
     * Useful for subtitle track that should be displayed
     * even when user did not explicitly ask for subtitles.
     */
    
    #define AV_DISPOSITION_FORCED    0x0040
    
    #define AV_DISPOSITION_HEARING_IMPAIRED  0x0080  /**< stream for hearing impaired audiences */
    #define AV_DISPOSITION_VISUAL_IMPAIRED   0x0100  /**< stream for visual impaired audiences */
    
    #define AV_DISPOSITION_CLEAN_EFFECTS     0x0200  /**< stream without voice */
    
    /**
     * The stream is stored in the file as an attached picture/"cover art" (e.g.
     * APIC frame in ID3v2). The single packet associated with it will be returned
     * among the first few packets read from the file unless seeking takes place.
     * It can also be accessed at any time in AVStream.attached_pic.
     */
    #define AV_DISPOSITION_ATTACHED_PIC      0x0400
    
    /**
     * Options for behavior on timestamp wrap detection.
     */
    #define AV_PTS_WRAP_IGNORE      0   ///< ignore the wrap
    #define AV_PTS_WRAP_ADD_OFFSET  1   ///< add the format specific offset on wrap detection
    #define AV_PTS_WRAP_SUB_OFFSET  -1  ///< subtract the format specific offset on wrap detection
    
    
    /**
     * Stream structure.
     * New fields can be added to the end with minor version bumps.
    
    Diego Biurrun's avatar
    Diego Biurrun committed
     * Removal, reordering and changes to existing fields require a major
    
    Diego Biurrun's avatar
    Diego Biurrun committed
     * sizeof(AVStream) must not be used outside libav*.
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    typedef struct AVStream {
    
        int index;    /**< stream index in AVFormatContext */
    
        /**
         * Format-specific stream ID.
         * decoding: set by libavformat
    
         * encoding: set by the user, replaced by libavformat if left unset
    
        /**
         * Codec context associated with this stream. Allocated and freed by
         * libavformat.
         *
         * - decoding: The demuxer exports codec information stored in the headers
         *             here.
         * - encoding: The user sets codec information, the muxer writes it to the
         *             output. Mandatory fields as specified in AVCodecContext
         *             documentation must be set even if this AVCodecContext is
         *             not actually used for encoding.
         */
        AVCodecContext *codec;
    
    #if FF_API_R_FRAME_RATE
    
         * Real base framerate of the stream.
         * This is the lowest framerate with which all timestamps can be
    
    Ramiro Polla's avatar
    Ramiro Polla committed
         * represented accurately (it is the least common multiple of all
    
         * framerates in the stream). Note, this value is just a guess!
         * For example, if the time base is 1/90000 and all frames have either
    
    Diego Biurrun's avatar
    Diego Biurrun committed
         * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1.
    
         */
        AVRational r_frame_rate;
    
    #endif
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        void *priv_data;
    
        /**
         * encoding: pts generation when outputting stream
         */
    
    Diego Biurrun's avatar
    Diego Biurrun committed
         * This is the fundamental unit of time (in seconds) in terms
    
         * of which frame timestamps are represented.
         *
    
         * encoding: set by libavformat in avformat_write_header. The muxer may use the
    
         * user-provided value of @ref AVCodecContext.time_base "codec->time_base"
         * as a hint.
    
         * Decoding: pts of the first frame of the stream in presentation order, in stream time base.
    
    Diego Biurrun's avatar
    Diego Biurrun committed
         * Only set this if you are absolutely 100% sure that the value you set
         * it to really is the pts of the first frame.
    
         * This may be undefined (AV_NOPTS_VALUE).
    
         * @note The ASF header does NOT contain a correct start_time the ASF
         * demuxer must NOT set this.
    
        int64_t start_time;
    
    Diego Biurrun's avatar
    Diego Biurrun committed
         * Decoding: duration of the stream, in stream time base.
    
         * If a source file does not specify a duration, but does specify
    
    Diego Biurrun's avatar
    Diego Biurrun committed
         * a bitrate, this value will be estimated from bitrate and file size.
    
        int64_t nb_frames;                 ///< number of frames in this stream if known or 0
    
    Diego Biurrun's avatar
    Diego Biurrun committed
        int disposition; /**< AV_DISPOSITION_* bit field */
    
        enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed.
    
    
        /**
         * sample aspect ratio (0 if unknown)
         * - encoding: Set by user.
         * - decoding: Set by libavformat.
         */
        AVRational sample_aspect_ratio;
    
        AVDictionary *metadata;
    
    Michael Niedermayer's avatar
    Michael Niedermayer committed
        /**
         * Average framerate
         */
        AVRational avg_frame_rate;
    
        /**
         * For streams with AV_DISPOSITION_ATTACHED_PIC disposition, this packet
         * will contain the attached picture.
         *
         * decoding: set by libavformat, must not be modified by the caller.
         * encoding: unused
         */
        AVPacket attached_pic;
    
    
        /*****************************************************************
         * All fields below this line are not part of the public API. They
         * may not be used outside of libavformat and can be changed and
         * removed at will.
         * New public fields should be added right above.
         *****************************************************************
         */
    
    
         * Stream information used internally by av_find_stream_info()
    
    #define MAX_STD_TIMEBASES (60*12+6)
    
        struct {
            int64_t last_dts;
            int64_t duration_gcd;
            int duration_count;
    
            double (*duration_error)[2][MAX_STD_TIMEBASES];
    
            int64_t codec_info_duration_fields;
    
    
            /**
             * Those are used for average framerate estimation.
             */
            int64_t fps_first_dts;
            int     fps_first_dts_idx;
            int64_t fps_last_dts;
            int     fps_last_dts_idx;
    
    
    
        int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */
    
    
        // Timestamp generation support:
        /**
         * Timestamp corresponding to the last dts sync point.
         *
         * Initialized when AVCodecParserContext.dts_sync_point >= 0 and
         * a DTS is received from the underlying container. Otherwise set to
         * AV_NOPTS_VALUE by default.
         */
        int64_t reference_dts;
        int64_t first_dts;
        int64_t cur_dts;
        int64_t last_IP_pts;
    
        int last_IP_duration;
    
    
        /**
         * Number of packets to buffer for codec probing
         */
    #define MAX_PROBE_PACKETS 2500
        int probe_packets;
    
    
        /**
         * Number of frames that have been demuxed during av_find_stream_info()
         */
        int codec_info_nb_frames;
    
    
        /**
         * Stream Identifier
         * This is the MPEG-TS stream identifier +1
         * 0 means unknown
         */
        int stream_identifier;
    
        int64_t interleaver_chunk_size;
        int64_t interleaver_chunk_duration;
    
    
        /* av_read_frame() support */
        enum AVStreamParseType need_parsing;
        struct AVCodecParserContext *parser;
    
    
        /**
         * last packet in packet_buffer for this stream when muxing.
         */
        struct AVPacketList *last_in_packet_buffer;
        AVProbeData probe_data;
    #define MAX_REORDER_DELAY 16
        int64_t pts_buffer[MAX_REORDER_DELAY+1];
    
        AVIndexEntry *index_entries; /**< Only used if the format does not
                                        support seeking natively. */
        int nb_index_entries;
        unsigned int index_entries_allocated_size;
    
    
         * stream probing state
         * -1   -> probing finished
         *  0   -> no probing requested
         * rest -> perform probing with request_probe being the minimum score to accept.
    
         * NOT PART OF PUBLIC API
         */
        int request_probe;
    
        /**
         * Indicates that everything up to the next keyframe
         * should be discarded.
         */
        int skip_to_keyframe;
    
    
        /**
         * Number of samples to skip at the start of the frame decoded from the next packet.
         */
        int skip_samples;
    
    
        /**
         * Number of internally decoded frames, used internally in libavformat, do not access
    
         * its lifetime differs from info which is why it is not in that structure.
    
         */
        int nb_decoded_frames;
    
    
        /**
         * Timestamp offset added to timestamps before muxing
         * NOT PART OF PUBLIC API
         */
        int64_t mux_ts_offset;
    
    
        /**
         * Internal data to check for wrapping of the time stamp
         */
        int64_t pts_wrap_reference;
    
        /**
         * Options for behavior, when a wrap is detected.
         *
         * Defined by AV_PTS_WRAP_ values.
         *
         * If correction is enabled, there are two possibilities:
         * If the first time stamp is near the wrap point, the wrap offset
         * will be subtracted, which will create negative time stamps.
         * Otherwise the offset will be added.
         */
        int pts_wrap_behavior;
    
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    } AVStream;
    
    
    /**
     * New fields can be added to the end with minor version bumps.
    
    Diego Biurrun's avatar
    Diego Biurrun committed
     * Removal, reordering and changes to existing fields require a major
    
    Diego Biurrun's avatar
    Diego Biurrun committed
     * sizeof(AVProgram) must not be used outside libav*.
    
    typedef struct AVProgram {
        int            id;
        int            flags;
        enum AVDiscard discard;        ///< selects which program to discard and which to feed to the caller
    
        unsigned int   *stream_index;
        unsigned int   nb_stream_indexes;
    
        AVDictionary *metadata;
    
    
        int program_num;
        int pmt_pid;
    
    Kieran Kunhya's avatar
    Kieran Kunhya committed
        int pcr_pid;
    
    
        /*****************************************************************
         * All fields below this line are not part of the public API. They
         * may not be used outside of libavformat and can be changed and
         * removed at will.
         * New public fields should be added right above.
         *****************************************************************
         */
        int64_t start_time;
        int64_t end_time;
    
    
        int64_t pts_wrap_reference;    ///< reference dts for wrap detection
        int pts_wrap_behavior;         ///< behavior on wrap detection
    
    #define AVFMTCTX_NOHEADER      0x0001 /**< signal that no header is present
    
                                             (streams are added dynamically) */
    
    
    typedef struct AVChapter {
    
    Diego Biurrun's avatar
    Diego Biurrun committed
        int id;                 ///< unique ID to identify the chapter
        AVRational time_base;   ///< time base in which the start/end timestamps are specified
    
        int64_t start, end;     ///< chapter start/end time in time_base units
    
        AVDictionary *metadata;
    
    
    /**
     * The duration of a video can be estimated through various ways, and this enum can be used
     * to know how the duration was estimated.
     */
    enum AVDurationEstimationMethod {
        AVFMT_DURATION_FROM_PTS,    ///< Duration accurately estimated from PTSes
        AVFMT_DURATION_FROM_STREAM, ///< Duration estimated from a stream with a known duration
        AVFMT_DURATION_FROM_BITRATE ///< Duration estimated from bitrate (less accurate)
    };
    
    
    Diego Biurrun's avatar
    Diego Biurrun committed
     * Format I/O context.
    
     * New fields can be added to the end with minor version bumps.
    
    Diego Biurrun's avatar
    Diego Biurrun committed
     * Removal, reordering and changes to existing fields require a major
    
     * sizeof(AVFormatContext) must not be used outside libav*, use
     * avformat_alloc_context() to create an AVFormatContext.
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
    typedef struct AVFormatContext {
    
        /**
         * A class for logging and AVOptions. Set by avformat_alloc_context().
         * Exports (de)muxer private options if they exist.
         */
        const AVClass *av_class;
    
        /**
         * Can only be iformat or oformat, not both at the same time.
         *
         * decoding: set by avformat_open_input().
         * encoding: set by the user.
         */
    
        struct AVInputFormat *iformat;
        struct AVOutputFormat *oformat;
    
    
        /**
         * Format private data. This is an AVOptions-enabled struct
         * if and only if iformat/oformat.priv_class is not NULL.
         */
    
    Fabrice Bellard's avatar
    Fabrice Bellard committed
        void *priv_data;
    
         * I/O context.
         *
         * decoding: either set by the user before avformat_open_input() (then
         * the user must close it manually) or set by avformat_open_input().
         * encoding: set by the user.
         *
         * Do NOT set this field if AVFMT_NOFILE flag is set in
         * iformat/oformat.flags. In such a case, the (de)muxer will handle
         * I/O in some other way and this field will be NULL.
         */
    
        AVIOContext *pb;
    
        /* stream info */
        int ctx_flags; /**< Format-specific flags, see AVFMTCTX_xx */
    
    
        /**
         * A list of all streams in the file. New streams are created with
         * avformat_new_stream().
         *
         * decoding: streams are created by libavformat in avformat_open_input().
         * If AVFMTCTX_NOHEADER is set in ctx_flags, then new streams may also
         * appear in av_read_frame().
         * encoding: streams are created by the user before avformat_write_header().
         */
    
        unsigned int nb_streams;
    
        AVStream **streams;
    
        char filename[1024]; /**< input or output filename */
    
        /**
         * Decoding: position of the first frame of the component, in
         * AV_TIME_BASE fractional seconds. NEVER set this value directly:
         * It is deduced from the AVStream values.
         */
    
        int64_t start_time;
    
    
        /**
         * Decoding: duration of the stream, in AV_TIME_BASE fractional
         * seconds. Only set this value if you know none of the individual stream