avformat.h 41.9 KB
Newer Older
1 2 3
/*
 * copyright (c) 2001 Fabrice Bellard
 *
4 5 6
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
7 8
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
9
 * version 2.1 of the License, or (at your option) any later version.
10
 *
11
 * FFmpeg is distributed in the hope that it will be useful,
12 13 14 15 16
 * 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
17
 * License along with FFmpeg; if not, write to the Free Software
18 19 20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

21 22
#ifndef AVFORMAT_AVFORMAT_H
#define AVFORMAT_AVFORMAT_H
F
Fabrice Bellard 已提交
23

24
#define LIBAVFORMAT_VERSION_MAJOR 52
B
Baptiste Coudurier 已提交
25
#define LIBAVFORMAT_VERSION_MINOR 23
26
#define LIBAVFORMAT_VERSION_MICRO  1
27

28 29 30 31 32 33
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                               LIBAVFORMAT_VERSION_MINOR, \
                                               LIBAVFORMAT_VERSION_MICRO)
#define LIBAVFORMAT_VERSION     AV_VERSION(LIBAVFORMAT_VERSION_MAJOR,   \
                                           LIBAVFORMAT_VERSION_MINOR,   \
                                           LIBAVFORMAT_VERSION_MICRO)
M
Michael Niedermayer 已提交
34
#define LIBAVFORMAT_BUILD       LIBAVFORMAT_VERSION_INT
A
Alex Beregszaszi 已提交
35

M
Michael Niedermayer 已提交
36
#define LIBAVFORMAT_IDENT       "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION)
37

S
Stefano Sabatini 已提交
38 39 40 41 42
/**
 * Returns the LIBAVFORMAT_VERSION_INT constant.
 */
unsigned avformat_version(void);

43
#include <time.h>
Z
Zdenek Kabelac 已提交
44
#include <stdio.h>  /* FILE */
45
#include "libavcodec/avcodec.h"
F
Fabrice Bellard 已提交
46 47 48

#include "avio.h"

49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93

/*
 * public Metadata API.
 * Important concepts, to keep in mind
 * 1. keys are unique, there are never 2 tags with equal keys, this is also
 *    meant semantically that is a demuxer should not knowingly produce
 *    several keys that are litterally different but semantically identical,
 *    like key=Author5, key=Author6.
 *    All authors have to be placed in the same tag for the case of Authors.
 * 2. Metadata is flat, there are no subtags, if you for whatever obscene
 *    reason want to store the email address of the child of producer alice
 *    and actor bob, that could have key=alice_and_bobs_childs_email_address.
 * 3. A tag whichs value is translated has the ISO 639 3-letter language code
 *    with a '-' between appended. So for example Author-ger=Michael, Author-eng=Mike
 *    the original/default language is in the unqualified "Author"
 *    A demuxer should set a default if it sets any translated tag.
 */

#define AV_METADATA_IGNORE_CASE     1
#define AV_METADATA_IGNORE_SUFFIX   2

typedef struct {
    char *key;
    char *value;
}AVMetaDataTag;

struct AVMetaData;

/**
 * gets a metadata element with matching key.
 * @param prev set to the previous matching element to find the next.
 * @param flags allows case as well as suffix insensitive comparissions.
 * @return found tag or NULL, changing key or value leads to undefined behavior.
 */
AVMetaDataTag *
av_metadata_get(struct AVMetaData *m, const char *key, const AVMetaDataTag *prev, int flags);

/**
 * sets the given tag in m, overwriting an existing tag.
 * @param tag tag to add to m, key and value will be av_strduped.
 * @return >= 0 if success otherwise error code that is <0.
 */
int av_metadata_set(struct AVMetaData **m, AVMetaDataTag tag);


F
Fabrice Bellard 已提交
94 95 96
/* packet functions */

typedef struct AVPacket {
M
Michael Niedermayer 已提交
97
    /**
D
Diego Biurrun 已提交
98
     * Presentation timestamp in time_base units.
M
Michael Niedermayer 已提交
99 100 101
     * This is the time at which the decompressed packet will be presented
     * to the user.
     * Can be AV_NOPTS_VALUE if it is not stored in the file.
D
Diego Biurrun 已提交
102
     * pts MUST be larger or equal to dts as presentation cannot happen before
M
Michael Niedermayer 已提交
103 104 105 106 107 108
     * decompression, unless one wants to view hex dumps. Some formats misuse
     * the terms dts and pts/cts to mean something different, these timestamps
     * must be converted to true pts/dts before they are stored in AVPacket.
     */
    int64_t pts;
    /**
D
Diego Biurrun 已提交
109
     * Decompression timestamp in time_base units.
M
Michael Niedermayer 已提交
110 111 112 113
     * This is the time at which the packet is decompressed.
     * Can be AV_NOPTS_VALUE if it is not stored in the file.
     */
    int64_t dts;
114
    uint8_t *data;
115 116 117
    int   size;
    int   stream_index;
    int   flags;
118 119 120 121 122
    /**
     * Duration of this packet in time_base units, 0 if unknown.
     * Equals next_pts - this_pts in presentation order.
     */
    int   duration;
123 124
    void  (*destruct)(struct AVPacket *);
    void  *priv;
M
Michael Niedermayer 已提交
125
    int64_t pos;                            ///< byte position in stream, -1 if unknown
126 127

    /**
D
Diego Biurrun 已提交
128
     * Time difference in stream time base units from the pts of this
129
     * packet to the point at which the output from the decoder has converged
D
Diego Biurrun 已提交
130 131 132 133
     * independent from the availability of previous frames. That is, the
     * frames are virtually identical no matter if decoding started from
     * the very first frame or from this keyframe.
     * Is AV_NOPTS_VALUE if unknown.
134
     * This field is not the display duration of the current packet.
135 136 137
     *
     * The purpose of this field is to allow seeking in streams that have no
     * keyframes in the conventional sense. It corresponds to the
D
Diego Biurrun 已提交
138
     * recovery point SEI in H.264 and match_time_delta in NUT. It is also
139 140 141 142
     * essential for some types of subtitle streams to ensure that all
     * subtitles are correctly displayed after seeking.
     */
    int64_t convergence_duration;
143
} AVPacket;
144 145
#define PKT_FLAG_KEY   0x0001

M
Michael Niedermayer 已提交
146
void av_destruct_packet_nofree(AVPacket *pkt);
147 148 149 150

/**
 * Default packet destructor.
 */
151
void av_destruct_packet(AVPacket *pkt);
M
Michael Niedermayer 已提交
152

R
Ramiro Polla 已提交
153
/**
D
Diego Biurrun 已提交
154
 * Initialize optional fields of a packet with default values.
R
Ramiro Polla 已提交
155 156 157
 *
 * @param pkt packet
 */
R
Ramiro Polla 已提交
158
void av_init_packet(AVPacket *pkt);
F
Fabrice Bellard 已提交
159

160
/**
D
Diego Biurrun 已提交
161 162
 * Allocate the payload of a packet and initialize its fields with
 * default values.
163 164 165
 *
 * @param pkt packet
 * @param size wanted payload size
D
Diego Biurrun 已提交
166
 * @return 0 if OK, AVERROR_xxx otherwise
167
 */
F
Fabrice Bellard 已提交
168
int av_new_packet(AVPacket *pkt, int size);
169 170

/**
D
Diego Biurrun 已提交
171 172
 * Allocate and read the payload of a packet and initialize its fields with
 * default values.
173 174
 *
 * @param pkt packet
D
Diego Biurrun 已提交
175 176
 * @param size desired payload size
 * @return >0 (read size) if OK, AVERROR_xxx otherwise
177
 */
M
Michael Niedermayer 已提交
178
int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size);
179

180 181
/**
 * @warning This is a hack - the packet memory allocation stuff is broken. The
D
Diego Biurrun 已提交
182
 * packet is allocated if it was not really allocated.
183
 */
184
int av_dup_packet(AVPacket *pkt);
185 186

/**
D
Diego Biurrun 已提交
187
 * Free a packet.
188 189 190 191 192
 *
 * @param pkt packet to free
 */
static inline void av_free_packet(AVPacket *pkt)
{
193
    if (pkt && pkt->destruct) {
194
        pkt->destruct(pkt);
195
    }
196
}
F
Fabrice Bellard 已提交
197

F
Fabrice Bellard 已提交
198 199 200
/*************************************************/
/* fractional numbers for exact pts handling */

201
/**
D
Diego Biurrun 已提交
202 203 204
 * The exact value of the fractional number is: 'val + num / den'.
 * num is assumed to be 0 <= num < den.
 * @deprecated Use AVRational instead.
205
*/
F
Fabrice Bellard 已提交
206
typedef struct AVFrac {
207
    int64_t val, num, den;
M
Michael Niedermayer 已提交
208
} AVFrac attribute_deprecated;
F
Fabrice Bellard 已提交
209

F
Fabrice Bellard 已提交
210
/*************************************************/
211
/* input/output formats */
F
Fabrice Bellard 已提交
212

213 214
struct AVCodecTag;

F
Fabrice Bellard 已提交
215
struct AVFormatContext;
216

D
Diego Biurrun 已提交
217
/** This structure contains the data a format has to probe a file. */
218
typedef struct AVProbeData {
219
    const char *filename;
220 221 222 223
    unsigned char *buf;
    int buf_size;
} AVProbeData;

D
Diego Biurrun 已提交
224
#define AVPROBE_SCORE_MAX 100               ///< Maximum score, half of that is used for file-extension-based detection.
225
#define AVPROBE_PADDING_SIZE 32             ///< extra allocated bytes at the end of the probe buffer
F
Fabrice Bellard 已提交
226 227

typedef struct AVFormatParameters {
228
    AVRational time_base;
F
Fabrice Bellard 已提交
229 230 231 232
    int sample_rate;
    int channels;
    int width;
    int height;
233
    enum PixelFormat pix_fmt;
D
Diego Biurrun 已提交
234 235 236 237
    int channel; /**< Used to select DV channel. */
    const char *standard; /**< TV standard, NTSC, PAL, SECAM */
    unsigned int mpeg2ts_raw:1;  /**< Force raw MPEG-2 transport stream output, if possible. */
    unsigned int mpeg2ts_compute_pcr:1; /**< Compute exact PCR for each transport
238
                                            stream packet (only meaningful if
D
Diego Biurrun 已提交
239 240 241
                                            mpeg2ts_raw is TRUE). */
    unsigned int initial_pause:1;       /**< Do not begin to play the stream
                                            immediately (RTSP only). */
242
    unsigned int prealloced_context:1;
243
#if LIBAVFORMAT_VERSION_INT < (53<<16)
244 245
    enum CodecID video_codec_id;
    enum CodecID audio_codec_id;
246
#endif
F
Fabrice Bellard 已提交
247 248
} AVFormatParameters;

D
Diego Biurrun 已提交
249
//! Demuxer will use url_fopen, no opened file should be provided by the caller.
250
#define AVFMT_NOFILE        0x0001
D
Diego Biurrun 已提交
251 252 253 254 255 256 257 258
#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. */
259 260

typedef struct AVOutputFormat {
F
Fabrice Bellard 已提交
261
    const char *name;
262 263 264 265 266
    /**
     * Descriptive name for the format, meant to be more human-readable
     * than \p name. You \e should use the NULL_IF_CONFIG_SMALL() macro
     * to define it.
     */
F
Fabrice Bellard 已提交
267 268
    const char *long_name;
    const char *mime_type;
D
Diego Biurrun 已提交
269 270
    const char *extensions; /**< comma-separated filename extensions */
    /** Size of private data so that it can be allocated in the wrapper. */
271
    int priv_data_size;
F
Fabrice Bellard 已提交
272
    /* output support */
273 274
    enum CodecID audio_codec; /**< default audio codec */
    enum CodecID video_codec; /**< default video codec */
F
Fabrice Bellard 已提交
275
    int (*write_header)(struct AVFormatContext *);
276
    int (*write_packet)(struct AVFormatContext *, AVPacket *pkt);
F
Fabrice Bellard 已提交
277
    int (*write_trailer)(struct AVFormatContext *);
278
    /** can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER */
279
    int flags;
D
Diego Biurrun 已提交
280
    /** Currently only used to set pixel format if not YUV420P. */
281
    int (*set_parameters)(struct AVFormatContext *, AVFormatParameters *);
282 283
    int (*interleave_packet)(struct AVFormatContext *, AVPacket *out,
                             AVPacket *in, int flush);
284 285

    /**
286 287
     * List of supported codec_id-codec_tag pairs, ordered by "better
     * choice first". The arrays are all CODEC_ID_NONE terminated.
288
     */
289
    const struct AVCodecTag * const *codec_tag;
290

291 292
    enum CodecID subtitle_codec; /**< default subtitle codec */

293 294 295
    /* private fields */
    struct AVOutputFormat *next;
} AVOutputFormat;
F
Fabrice Bellard 已提交
296

297 298
typedef struct AVInputFormat {
    const char *name;
299 300 301 302 303
    /**
     * Descriptive name for the format, meant to be more human-readable
     * than \p name. You \e should use the NULL_IF_CONFIG_SMALL() macro
     * to define it.
     */
304
    const char *long_name;
D
Diego Biurrun 已提交
305
    /** Size of private data so that it can be allocated in the wrapper. */
306
    int priv_data_size;
307
    /**
D
Diego Biurrun 已提交
308 309 310
     * Tell if a given file has a chance of being parsed by 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.
311
     */
312
    int (*read_probe)(AVProbeData *);
D
Diego Biurrun 已提交
313 314 315
    /** Read the format header and initialize the AVFormatContext
       structure. Return 0 if OK. 'ap' if non-NULL contains
       additional parameters. Only used in raw format right
316
       now. 'av_new_stream' should be called to create new streams.  */
F
Fabrice Bellard 已提交
317 318
    int (*read_header)(struct AVFormatContext *,
                       AVFormatParameters *ap);
D
Diego Biurrun 已提交
319
    /** Read one packet and put it in 'pkt'. pts and flags are also
320
       set. 'av_new_stream' can be called only if the flag
321
       AVFMTCTX_NOHEADER is used. */
F
Fabrice Bellard 已提交
322
    int (*read_packet)(struct AVFormatContext *, AVPacket *pkt);
D
Diego Biurrun 已提交
323
    /** Close the stream. The AVFormatContext and AVStreams are not
F
Fabrice Bellard 已提交
324 325
       freed by this function */
    int (*read_close)(struct AVFormatContext *);
326
    /**
D
Diego Biurrun 已提交
327 328
     * Seek to a given timestamp relative to the frames in
     * stream component stream_index.
329
     * @param stream_index must not be -1
330
     * @param flags selects which direction should be preferred if no exact
331
     *              match is available
332
     * @return >= 0 on success (but not necessarily the new offset)
333
     */
334
    int (*read_seek)(struct AVFormatContext *,
335
                     int stream_index, int64_t timestamp, int flags);
336
    /**
D
Diego Biurrun 已提交
337
     * Gets the next timestamp in stream[stream_index].time_base units.
D
Diego Biurrun 已提交
338
     * @return the timestamp or AV_NOPTS_VALUE if an error occurred
339 340 341
     */
    int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index,
                              int64_t *pos, int64_t pos_limit);
D
Diego Biurrun 已提交
342
    /** Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER. */
F
Fabrice Bellard 已提交
343
    int flags;
D
Diego Biurrun 已提交
344
    /** If extensions are defined, then no probe is done. You should
345 346 347
       usually not use extension format guessing because it is not
       reliable enough */
    const char *extensions;
D
Diego Biurrun 已提交
348
    /** General purpose read-only value that the format can use. */
349
    int value;
350

D
Diego Biurrun 已提交
351 352
    /** Start/resume playing - only meaningful if using a network-based format
       (RTSP). */
353 354
    int (*read_play)(struct AVFormatContext *);

D
Diego Biurrun 已提交
355 356
    /** Pause playing - only meaningful if using a network-based format
       (RTSP). */
357 358
    int (*read_pause)(struct AVFormatContext *);

359
    const struct AVCodecTag * const *codec_tag;
360

361 362 363
    /* private fields */
    struct AVInputFormat *next;
} AVInputFormat;
F
Fabrice Bellard 已提交
364

A
Aurelien Jacobs 已提交
365 366 367
enum AVStreamParseType {
    AVSTREAM_PARSE_NONE,
    AVSTREAM_PARSE_FULL,       /**< full parsing and repack */
D
Diego Biurrun 已提交
368
    AVSTREAM_PARSE_HEADERS,    /**< Only parse headers, do not repack. */
369
    AVSTREAM_PARSE_TIMESTAMPS, /**< full parsing and interpolation of timestamps for frames not starting on a packet boundary */
A
Aurelien Jacobs 已提交
370 371
};

372 373 374 375
typedef struct AVIndexEntry {
    int64_t pos;
    int64_t timestamp;
#define AVINDEX_KEYFRAME 0x0001
M
Michael Niedermayer 已提交
376
    int flags:2;
D
Diego Biurrun 已提交
377 378
    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. */
379 380
} AVIndexEntry;

381 382 383 384 385 386 387
#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

388 389 390
/**
 * Stream structure.
 * New fields can be added to the end with minor version bumps.
D
Diego Biurrun 已提交
391
 * Removal, reordering and changes to existing fields require a major
392
 * version bump.
D
Diego Biurrun 已提交
393
 * sizeof(AVStream) must not be used outside libav*.
394
 */
F
Fabrice Bellard 已提交
395
typedef struct AVStream {
396
    int index;    /**< stream index in AVFormatContext */
D
Diego Biurrun 已提交
397
    int id;       /**< format-specific stream ID */
398
    AVCodecContext *codec; /**< codec context */
399
    /**
D
Diego Biurrun 已提交
400 401
     * Real base frame rate of the stream.
     * This is the lowest frame rate with which all timestamps can be
R
Typos  
Ramiro Polla 已提交
402
     * represented accurately (it is the least common multiple of all
D
Diego Biurrun 已提交
403 404 405
     * frame rates in the stream). Note, this value is just a guess!
     * For example if the time base is 1/90000 and all frames have either
     * approximately 3600 or 1800 timer ticks, then r_frame_rate will be 50/1.
406 407
     */
    AVRational r_frame_rate;
F
Fabrice Bellard 已提交
408
    void *priv_data;
409

410
    /* internal data used in av_find_stream_info() */
411
    int64_t first_dts;
D
Diego Biurrun 已提交
412
    /** encoding: pts generation when outputting stream */
413
    struct AVFrac pts;
414 415

    /**
D
Diego Biurrun 已提交
416 417
     * This is the fundamental unit of time (in seconds) in terms
     * of which frame timestamps are represented. For fixed-fps content,
D
Diego Biurrun 已提交
418
     * time base should be 1/frame rate and timestamp increments should be 1.
419
     */
420
    AVRational time_base;
421
    int pts_wrap_bits; /**< number of bits in pts (used for wrapping control) */
F
Fabrice Bellard 已提交
422
    /* ffmpeg.c private use */
D
Diego Biurrun 已提交
423 424
    int stream_copy; /**< If set, just copy stream. */
    enum AVDiscard discard; ///< Selects which packets can be discarded at will and do not need to be demuxed.
425
    //FIXME move stuff to a flags field?
D
Diego Biurrun 已提交
426
    /** Quality, as it has been removed from AVCodecContext and put in AVVideoFrame.
D
Diego Biurrun 已提交
427
     * MN: dunno if that is the right place for it */
428
    float quality;
429
    /**
D
Diego Biurrun 已提交
430 431 432
     * Decoding: pts of the first frame of the stream, in stream time base.
     * Only set this if you are absolutely 100% sure that the value you set
     * it to really is the pts of the first frame.
433
     * This may be undefined (AV_NOPTS_VALUE).
D
Diego Biurrun 已提交
434 435
     * @note The ASF header does NOT contain a correct start_time the ASF
     * demuxer must NOT set this.
436
     */
437
    int64_t start_time;
438
    /**
D
Diego Biurrun 已提交
439
     * Decoding: duration of the stream, in stream time base.
440
     * If a source file does not specify a duration, but does specify
D
Diego Biurrun 已提交
441
     * a bitrate, this value will be estimated from bitrate and file size.
442
     */
443
    int64_t duration;
444

445
    char language[4]; /** ISO 639 3-letter language code (empty string if undefined) */
446

447
    /* av_read_frame() support */
A
Aurelien Jacobs 已提交
448
    enum AVStreamParseType need_parsing;
449
    struct AVCodecParserContext *parser;
450

451
    int64_t cur_dts;
M
Michael Niedermayer 已提交
452 453
    int last_IP_duration;
    int64_t last_IP_pts;
454
    /* av_seek_frame() support */
D
Diego Biurrun 已提交
455 456
    AVIndexEntry *index_entries; /**< Only used if the format does not
                                    support seeking natively. */
457
    int nb_index_entries;
M
Måns Rullgård 已提交
458
    unsigned int index_entries_allocated_size;
459

460
    int64_t nb_frames;                 ///< number of frames in this stream if known or 0
461

462 463 464
#if LIBAVFORMAT_VERSION_INT < (53<<16)
    int64_t unused[4+1];
#endif
465 466

    char *filename; /**< source filename of the stream */
467

D
Diego Biurrun 已提交
468
    int disposition; /**< AV_DISPOSITION_* bit field */
469 470

    AVProbeData probe_data;
471 472
#define MAX_REORDER_DELAY 16
    int64_t pts_buffer[MAX_REORDER_DELAY+1];
473 474 475 476 477 478 479

    /**
     * sample aspect ratio (0 if unknown)
     * - encoding: Set by user.
     * - decoding: Set by libavformat.
     */
    AVRational sample_aspect_ratio;
F
Fabrice Bellard 已提交
480 481
} AVStream;

482 483
#define AV_PROGRAM_RUNNING 1

484 485
/**
 * New fields can be added to the end with minor version bumps.
D
Diego Biurrun 已提交
486
 * Removal, reordering and changes to existing fields require a major
487
 * version bump.
D
Diego Biurrun 已提交
488
 * sizeof(AVProgram) must not be used outside libav*.
489
 */
490 491
typedef struct AVProgram {
    int            id;
D
Diego Biurrun 已提交
492 493
    char           *provider_name; ///< network name for DVB streams
    char           *name;          ///< service name for DVB streams
494 495
    int            flags;
    enum AVDiscard discard;        ///< selects which program to discard and which to feed to the caller
496 497
    unsigned int   *stream_index;
    unsigned int   nb_stream_indexes;
498 499
} AVProgram;

500
#define AVFMTCTX_NOHEADER      0x0001 /**< signal that no header is present
501 502
                                         (streams are added dynamically) */

503
typedef struct AVChapter {
D
Diego Biurrun 已提交
504 505
    int id;                 ///< unique ID to identify the chapter
    AVRational time_base;   ///< time base in which the start/end timestamps are specified
M
Michael Niedermayer 已提交
506
    int64_t start, end;     ///< chapter start/end time in time_base units
M
Michael Niedermayer 已提交
507
    char *title;            ///< chapter title
508 509
} AVChapter;

F
Fabrice Bellard 已提交
510 511
#define MAX_STREAMS 20

512
/**
D
Diego Biurrun 已提交
513
 * Format I/O context.
514
 * New fields can be added to the end with minor version bumps.
D
Diego Biurrun 已提交
515
 * Removal, reordering and changes to existing fields require a major
516
 * version bump.
D
Diego Biurrun 已提交
517
 * sizeof(AVFormatContext) must not be used outside libav*.
518
 */
F
Fabrice Bellard 已提交
519
typedef struct AVFormatContext {
D
Diego Biurrun 已提交
520 521
    const AVClass *av_class; /**< Set by av_alloc_format_context. */
    /* Can only be iformat or oformat, not both at the same time. */
522 523
    struct AVInputFormat *iformat;
    struct AVOutputFormat *oformat;
F
Fabrice Bellard 已提交
524
    void *priv_data;
525
    ByteIOContext *pb;
526
    unsigned int nb_streams;
F
Fabrice Bellard 已提交
527
    AVStream *streams[MAX_STREAMS];
528
    char filename[1024]; /**< input or output filename */
F
Fabrice Bellard 已提交
529
    /* stream info */
530
    int64_t timestamp;
F
Fabrice Bellard 已提交
531 532 533 534
    char title[512];
    char author[512];
    char copyright[512];
    char comment[512];
535
    char album[512];
536 537 538
    int year;  /**< ID3 year, 0 if none */
    int track; /**< track number, 0 if none */
    char genre[32]; /**< ID3 genre */
539

D
Diego Biurrun 已提交
540 541
    int ctx_flags; /**< Format-specific flags, see AVFMTCTX_xx */
    /* private data for pts handling (do not modify directly). */
542
    /** This buffer is only needed when packets were already buffered but
D
Diego Biurrun 已提交
543 544
       not decoded, for example to get the codec parameters in MPEG
       streams. */
545 546
    struct AVPacketList *packet_buffer;

D
Diego Biurrun 已提交
547
    /** Decoding: position of the first frame of the component, in
548
       AV_TIME_BASE fractional seconds. NEVER set this value directly:
D
Diego Biurrun 已提交
549
       It is deduced from the AVStream values.  */
550
    int64_t start_time;
D
Diego Biurrun 已提交
551
    /** Decoding: duration of the stream, in AV_TIME_BASE fractional
552 553 554
       seconds. NEVER set this value directly: it is deduced from the
       AVStream values.  */
    int64_t duration;
D
Diego Biurrun 已提交
555
    /** decoding: total file size, 0 if unknown */
556
    int64_t file_size;
D
Diego Biurrun 已提交
557
    /** Decoding: total stream bitrate in bit/s, 0 if not
558 559 560
       available. Never set it directly if the file_size and the
       duration are known as ffmpeg can compute it automatically. */
    int bit_rate;
561 562 563 564 565 566 567 568

    /* av_read_frame() support */
    AVStream *cur_st;
    const uint8_t *cur_ptr;
    int cur_len;
    AVPacket cur_pkt;

    /* av_seek_frame() support */
569
    int64_t data_offset; /** offset of the first packet */
570
    int index_built;
571

572 573
    int mux_rate;
    int packet_size;
574 575
    int preload;
    int max_delay;
576

577 578
#define AVFMT_NOOUTPUTLOOP -1
#define AVFMT_INFINITEOUTPUTLOOP 0
579
    /** number of times to loop output in formats that support it */
580
    int loop_output;
581

582
    int flags;
D
Diego Biurrun 已提交
583 584 585
#define AVFMT_FLAG_GENPTS       0x0001 ///< Generate pts if missing even if it requires parsing future frames.
#define AVFMT_FLAG_IGNIDX       0x0002 ///< Ignore index.
#define AVFMT_FLAG_NONBLOCK     0x0004 ///< Do not block when reading packets from input.
586 587

    int loop_input;
D
Diego Biurrun 已提交
588
    /** Decoding: size of data to probe; encoding: unused. */
589
    unsigned int probesize;
590 591

    /**
D
Diego Biurrun 已提交
592 593
     * Maximum time (in AV_TIME_BASE units) during which the input should
     * be analyzed in av_find_stream_info().
594 595
     */
    int max_analyze_duration;
596 597 598

    const uint8_t *key;
    int keylen;
599 600 601

    unsigned int nb_programs;
    AVProgram **programs;
M
Michael Niedermayer 已提交
602 603 604

    /**
     * Forced video codec_id.
D
Diego Biurrun 已提交
605
     * Demuxing: Set by user.
M
Michael Niedermayer 已提交
606 607 608 609
     */
    enum CodecID video_codec_id;
    /**
     * Forced audio codec_id.
D
Diego Biurrun 已提交
610
     * Demuxing: Set by user.
M
Michael Niedermayer 已提交
611 612 613 614
     */
    enum CodecID audio_codec_id;
    /**
     * Forced subtitle codec_id.
D
Diego Biurrun 已提交
615
     * Demuxing: Set by user.
M
Michael Niedermayer 已提交
616 617
     */
    enum CodecID subtitle_codec_id;
618 619 620

    /**
     * Maximum amount of memory in bytes to use per stream for the index.
D
Diego Biurrun 已提交
621
     * If the needed index exceeds this size, entries will be discarded as
622 623
     * needed to maintain a smaller size. This can lead to slower or less
     * accurate seeking (depends on demuxer).
D
Diego Biurrun 已提交
624
     * Demuxers for which a full in-memory index is mandatory will ignore
625 626 627 628 629
     * this.
     * muxing  : unused
     * demuxing: set by user
     */
    unsigned int max_index_size;
630 631

    /**
R
Ramiro Polla 已提交
632
     * Maximum amount of memory in bytes to use for buffering frames
D
Diego Biurrun 已提交
633
     * obtained from realtime capture devices.
634 635
     */
    unsigned int max_picture_buffer;
636

637
    unsigned int nb_chapters;
638
    AVChapter **chapters;
639 640

    /**
D
Diego Biurrun 已提交
641
     * Flags to enable debugging.
642 643 644
     */
    int debug;
#define FF_FDEBUG_TS        0x0001
645 646

    /**
D
Diego Biurrun 已提交
647
     * Raw packets from the demuxer, prior to parsing and decoding.
648 649 650 651 652
     * This buffer is used for buffering packets until the codec can
     * be identified, as parsing cannot be done without knowing the
     * codec.
     */
    struct AVPacketList *raw_packet_buffer;
653 654 655
    struct AVPacketList *raw_packet_buffer_end;

    struct AVPacketList *packet_buffer_end;
M
Michael Niedermayer 已提交
656 657

    struct AVMetaData *meta_data;
F
Fabrice Bellard 已提交
658 659 660 661 662 663 664
} AVFormatContext;

typedef struct AVPacketList {
    AVPacket pkt;
    struct AVPacketList *next;
} AVPacketList;

665
#if LIBAVFORMAT_VERSION_INT < (53<<16)
666 667
extern AVInputFormat *first_iformat;
extern AVOutputFormat *first_oformat;
668 669 670 671
#endif

AVInputFormat  *av_iformat_next(AVInputFormat  *f);
AVOutputFormat *av_oformat_next(AVOutputFormat *f);
F
Fabrice Bellard 已提交
672

673
enum CodecID av_guess_image2_codec(const char *filename);
674

675 676
/* XXX: use automatic init with either ELF sections or C file parser */
/* modules */
F
Fabrice Bellard 已提交
677

678 679 680
/* utils.c */
void av_register_input_format(AVInputFormat *format);
void av_register_output_format(AVOutputFormat *format);
681
AVOutputFormat *guess_stream_format(const char *short_name,
682 683
                                    const char *filename,
                                    const char *mime_type);
684
AVOutputFormat *guess_format(const char *short_name,
685 686
                             const char *filename,
                             const char *mime_type);
687 688

/**
D
Diego Biurrun 已提交
689
 * Guesses the codec ID based upon muxer and filename.
690
 */
691
enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name,
692 693
                            const char *filename, const char *mime_type,
                            enum CodecType type);
F
Fabrice Bellard 已提交
694

695
/**
696 697 698
 * Send a nice hexadecimal dump of a buffer to the specified file stream.
 *
 * @param f The file stream pointer where the dump should be sent to.
699 700
 * @param buf buffer
 * @param size buffer size
701 702
 *
 * @see av_hex_dump_log, av_pkt_dump, av_pkt_dump_log
703
 */
704
void av_hex_dump(FILE *f, uint8_t *buf, int size);
705 706

/**
707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723
 * Send a nice hexadecimal dump of a buffer to the log.
 *
 * @param avcl A pointer to an arbitrary struct of which the first field is a
 * pointer to an AVClass struct.
 * @param level The importance level of the message, lower values signifying
 * higher importance.
 * @param buf buffer
 * @param size buffer size
 *
 * @see av_hex_dump, av_pkt_dump, av_pkt_dump_log
 */
void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size);

/**
 * Send a nice dump of a packet to the specified file stream.
 *
 * @param f The file stream pointer where the dump should be sent to.
724
 * @param pkt packet to dump
D
Diego Biurrun 已提交
725
 * @param dump_payload True if the payload must be displayed, too.
726
 */
727
void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload);
F
Fabrice Bellard 已提交
728

729 730 731 732 733 734 735 736
/**
 * Send a nice dump of a packet to the log.
 *
 * @param avcl A pointer to an arbitrary struct of which the first field is a
 * pointer to an AVClass struct.
 * @param level The importance level of the message, lower values signifying
 * higher importance.
 * @param pkt packet to dump
D
Diego Biurrun 已提交
737
 * @param dump_payload True if the payload must be displayed, too.
738 739 740
 */
void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload);

F
Fabrice Bellard 已提交
741
void av_register_all(void);
F
Fabrice Bellard 已提交
742

743
/** codec tag <-> codec id */
744 745
enum CodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag);
unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum CodecID id);
746

747
/* media file input */
748 749

/**
D
Diego Biurrun 已提交
750
 * Finds AVInputFormat based on the short name of the input format.
751
 */
752
AVInputFormat *av_find_input_format(const char *short_name);
753 754 755 756

/**
 * Guess file format.
 *
D
Diego Biurrun 已提交
757 758
 * @param is_opened Whether the file is already opened; determines whether
 *                  demuxers with or without AVFMT_NOFILE are probed.
759
 */
F
Fabrice Bellard 已提交
760
AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened);
761 762 763 764 765

/**
 * Allocates all the structures needed to read an input stream.
 *        This does not open the needed codecs for decoding the stream[s].
 */
766 767
int av_open_input_stream(AVFormatContext **ic_ptr,
                         ByteIOContext *pb, const char *filename,
768
                         AVInputFormat *fmt, AVFormatParameters *ap);
769 770

/**
R
Typos  
Ramiro Polla 已提交
771
 * Open a media file as input. The codecs are not opened. Only the file
772 773
 * header (if present) is read.
 *
D
Diego Biurrun 已提交
774 775 776
 * @param ic_ptr The opened media file handle is put here.
 * @param filename filename to open
 * @param fmt If non-NULL, force the file format to use.
777
 * @param buf_size optional buffer size (zero if default is OK)
778 779
 * @param ap Additional parameters needed when opening the file
 *           (NULL if default).
D
Diego Biurrun 已提交
780
 * @return 0 if OK, AVERROR_xxx otherwise
781
 */
782
int av_open_input_file(AVFormatContext **ic_ptr, const char *filename,
783 784 785
                       AVInputFormat *fmt,
                       int buf_size,
                       AVFormatParameters *ap);
786 787
/**
 * Allocate an AVFormatContext.
D
Diego Biurrun 已提交
788
 * Can be freed with av_free() but do not forget to free everything you
789 790
 * explicitly allocated as well!
 */
791
AVFormatContext *av_alloc_format_context(void);
792

793 794 795
/**
 * Read packets of a media file to get stream information. This
 * is useful for file formats with no headers such as MPEG. This
D
Diego Biurrun 已提交
796
 * function also computes the real frame rate in case of MPEG-2 repeat
797 798 799 800 801
 * frame mode.
 * The logical file position is not changed by this function;
 * examined packets may be buffered for later processing.
 *
 * @param ic media file handle
D
Diego Biurrun 已提交
802 803 804
 * @return >=0 if OK, AVERROR_xxx on error
 * @todo Let the user decide somehow what information is needed so that
 *       we do not waste time getting stuff the user does not need.
805
 */
806
int av_find_stream_info(AVFormatContext *ic);
807 808 809 810

/**
 * Read a transport packet from a media file.
 *
R
Typos  
Ramiro Polla 已提交
811
 * This function is obsolete and should never be used.
812 813 814 815
 * Use av_read_frame() instead.
 *
 * @param s media file handle
 * @param pkt is filled
D
Diego Biurrun 已提交
816
 * @return 0 if OK, AVERROR_xxx on error
817
 */
F
Fabrice Bellard 已提交
818
int av_read_packet(AVFormatContext *s, AVPacket *pkt);
819 820 821 822 823 824 825 826 827 828 829 830 831

/**
 * Return the next frame of a stream.
 *
 * The returned packet is valid
 * until the next av_read_frame() or until av_close_input_file() and
 * must be freed with av_free_packet. For video, the packet contains
 * exactly one frame. For audio, it contains an integer number of
 * frames if each frame has a known fixed size (e.g. PCM or ADPCM
 * data). If the audio frames have a variable size (e.g. MPEG audio),
 * then it contains one frame.
 *
 * pkt->pts, pkt->dts and pkt->duration are always set to correct
832
 * values in AVStream.timebase units (and guessed if the format cannot
D
Diego Biurrun 已提交
833 834
 * provide them). pkt->pts can be AV_NOPTS_VALUE if the video format
 * has B-frames, so it is better to rely on pkt->dts if you do not
835 836
 * decompress the payload.
 *
D
Diego Biurrun 已提交
837
 * @return 0 if OK, < 0 on error or end of file
838
 */
839
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
840 841 842 843 844 845 846

/**
 * Seek to the key frame at timestamp.
 * 'timestamp' in 'stream_index'.
 * @param stream_index If stream_index is (-1), a default
 * stream is selected, and timestamp is automatically converted
 * from AV_TIME_BASE units to the stream specific time_base.
D
Diego Biurrun 已提交
847 848
 * @param timestamp Timestamp in AVStream.time_base units
 *        or, if no stream is specified, in AV_TIME_BASE units.
849 850 851
 * @param flags flags which select direction and seeking mode
 * @return >= 0 on success
 */
852 853
int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp,
                  int flags);
854 855

/**
D
Diego Biurrun 已提交
856 857
 * Start playing a network based stream (e.g. RTSP stream) at the
 * current position.
858
 */
859
int av_read_play(AVFormatContext *s);
860 861 862 863 864 865

/**
 * Pause a network based stream (e.g. RTSP stream).
 *
 * Use av_read_play() to resume it.
 */
866
int av_read_pause(AVFormatContext *s);
867

868 869 870 871 872 873
/**
 * Free a AVFormatContext allocated by av_open_input_stream.
 * @param s context to free
 */
void av_close_input_stream(AVFormatContext *s);

874 875 876 877 878
/**
 * Close a media file (but not its codecs).
 *
 * @param s media file handle
 */
F
Fabrice Bellard 已提交
879
void av_close_input_file(AVFormatContext *s);
880 881 882 883 884 885 886 887 888

/**
 * Add a new stream to a media file.
 *
 * Can only be called in the read_header() function. If the flag
 * AVFMTCTX_NOHEADER is in the format context, then new streams
 * can be added in read_packet too.
 *
 * @param s media file handle
D
Diego Biurrun 已提交
889
 * @param id file-format-dependent stream ID
890
 */
891
AVStream *av_new_stream(AVFormatContext *s, int id);
892
AVProgram *av_new_program(AVFormatContext *s, int id);
893

894 895 896
/**
 * Add a new chapter.
 * This function is NOT part of the public API
D
Diego Biurrun 已提交
897
 * and should ONLY be used by demuxers.
898 899
 *
 * @param s media file handle
D
Diego Biurrun 已提交
900
 * @param id unique ID for this chapter
901 902
 * @param start chapter start time in time_base units
 * @param end chapter end time in time_base units
903
 * @param title chapter title
904
 *
D
Diego Biurrun 已提交
905
 * @return AVChapter or NULL on error
906
 */
907 908
AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base,
                          int64_t start, int64_t end, const char *title);
909

910 911 912 913 914 915 916 917 918
/**
 * Set the pts for a given stream.
 *
 * @param s stream
 * @param pts_wrap_bits number of bits effectively used by the pts
 *        (used for wrap control, 33 is the value for MPEG)
 * @param pts_num numerator to convert to seconds (MPEG: 1)
 * @param pts_den denominator to convert to seconds (MPEG: 90000)
 */
919
void av_set_pts_info(AVStream *s, int pts_wrap_bits,
F
Fabrice Bellard 已提交
920
                     int pts_num, int pts_den);
F
Fabrice Bellard 已提交
921

922 923
#define AVSEEK_FLAG_BACKWARD 1 ///< seek backward
#define AVSEEK_FLAG_BYTE     2 ///< seeking based on position in bytes
D
Diego Biurrun 已提交
924
#define AVSEEK_FLAG_ANY      4 ///< seek to any frame, even non-keyframes
925

926
int av_find_default_stream_index(AVFormatContext *s);
927 928 929

/**
 * Gets the index for a specific timestamp.
D
Diego Biurrun 已提交
930 931 932
 * @param flags if AVSEEK_FLAG_BACKWARD then the returned index will correspond
 *                 to the timestamp which is <= the requested one, if backward
 *                 is 0, then it will be >=
933 934 935
 *              if AVSEEK_FLAG_ANY seek to any frame, only keyframes otherwise
 * @return < 0 if no such timestamp could be found
 */
936
int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags);
937

938 939 940 941 942 943 944 945 946
/**
 * Ensures the index uses less memory than the maximum specified in
 * AVFormatContext.max_index_size, by discarding entries if it grows
 * too large.
 * This function is not part of the public API and should only be called
 * by demuxers.
 */
void ff_reduce_index(AVFormatContext *s, int stream_index);

947
/**
D
Diego Biurrun 已提交
948 949
 * Add an index entry into a sorted list. Update the entry if the list
 * already contains it.
950
 *
D
Diego Biurrun 已提交
951
 * @param timestamp timestamp in the time base of the given stream
952
 */
953 954
int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp,
                       int size, int distance, int flags);
955 956

/**
957 958 959 960
 * Does a binary search using av_index_search_timestamp() and
 * AVCodec.read_timestamp().
 * This is not supposed to be called directly by a user application,
 * but by demuxers.
961 962 963
 * @param target_ts target timestamp in the time base of the given stream
 * @param stream_index stream number
 */
964 965
int av_seek_frame_binary(AVFormatContext *s, int stream_index,
                         int64_t target_ts, int flags);
966 967

/**
D
Diego Biurrun 已提交
968
 * Updates cur_dts of all streams based on the given timestamp and AVStream.
969
 *
D
Diego Biurrun 已提交
970 971
 * Stream ref_st unchanged, others set cur_dts in their native time base.
 * Only needed for timestamp wrapping or if (dts not set and pts!=dts).
972 973 974
 * @param timestamp new dts expressed in time_base of param ref_st
 * @param ref_st reference stream giving time_base of param timestamp
 */
975
void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp);
976 977 978

/**
 * Does a binary search using read_timestamp().
979 980
 * This is not supposed to be called directly by a user application,
 * but by demuxers.
981 982 983
 * @param target_ts target timestamp in the time base of the given stream
 * @param stream_index stream number
 */
984 985 986 987 988 989
int64_t av_gen_search(AVFormatContext *s, int stream_index,
                      int64_t target_ts, int64_t pos_min,
                      int64_t pos_max, int64_t pos_limit,
                      int64_t ts_min, int64_t ts_max,
                      int flags, int64_t *ts_ret,
                      int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t ));
990

991
/** media file output */
992
int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap);
993 994

/**
D
Diego Biurrun 已提交
995 996
 * Allocate the stream private data and write the stream header to an
 * output media file.
997 998
 *
 * @param s media file handle
D
Diego Biurrun 已提交
999
 * @return 0 if OK, AVERROR_xxx on error
1000
 */
1001
int av_write_header(AVFormatContext *s);
1002 1003 1004 1005 1006

/**
 * Write a packet to an output media file.
 *
 * The packet shall contain one audio or video frame.
1007 1008
 * The packet must be correctly interleaved according to the container
 * specification, if not then av_interleaved_write_frame must be used.
1009 1010
 *
 * @param s media file handle
1011 1012
 * @param pkt The packet, which contains the stream_index, buf/buf_size,
              dts/pts, ...
D
Diego Biurrun 已提交
1013
 * @return < 0 on error, = 0 if OK, 1 if end of stream wanted
1014
 */
1015
int av_write_frame(AVFormatContext *s, AVPacket *pkt);
1016 1017 1018 1019 1020 1021

/**
 * Writes a packet to an output media file ensuring correct interleaving.
 *
 * The packet must contain one audio or video frame.
 * If the packets are already correctly interleaved the application should
D
Diego Biurrun 已提交
1022 1023 1024 1025
 * call av_write_frame() instead as it is slightly faster. It is also important
 * to keep in mind that completely non-interleaved input will need huge amounts
 * of memory to interleave with this, so it is preferable to interleave at the
 * demuxer level.
1026 1027
 *
 * @param s media file handle
1028 1029
 * @param pkt The packet, which contains the stream_index, buf/buf_size,
              dts/pts, ...
D
Diego Biurrun 已提交
1030
 * @return < 0 on error, = 0 if OK, 1 if end of stream wanted
1031
 */
1032
int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt);
1033 1034

/**
D
Diego Biurrun 已提交
1035
 * Interleave a packet per dts in an output media file.
1036
 *
1037 1038 1039
 * Packets with pkt->destruct == av_destruct_packet will be freed inside this
 * function, so they cannot be used after it, note calling av_free_packet()
 * on them is still safe.
1040 1041 1042 1043 1044 1045 1046
 *
 * @param s media file handle
 * @param out the interleaved packet will be output here
 * @param in the input packet
 * @param flush 1 if no further packets are available as input and all
 *              remaining packets should be output
 * @return 1 if a packet was output, 0 if no packet could be output,
D
Diego Biurrun 已提交
1047
 *         < 0 if an error occurred
1048
 */
1049 1050
int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out,
                                 AVPacket *pkt, int flush);
1051

1052 1053 1054 1055
/**
 * @brief Write the stream trailer to an output media file and
 *        free the file private data.
 *
1056 1057
 * May only be called after a successful call to av_write_header.
 *
1058
 * @param s media file handle
D
Diego Biurrun 已提交
1059
 * @return 0 if OK, AVERROR_xxx on error
1060
 */
1061
int av_write_trailer(AVFormatContext *s);
F
Fabrice Bellard 已提交
1062 1063

void dump_format(AVFormatContext *ic,
1064
                 int index,
F
Fabrice Bellard 已提交
1065 1066
                 const char *url,
                 int is_output);
1067

1068
#if LIBAVFORMAT_VERSION_MAJOR < 53
1069
/**
D
Diego Biurrun 已提交
1070
 * Parses width and height out of string str.
1071
 * @deprecated Use av_parse_video_frame_size instead.
1072
 */
1073 1074
attribute_deprecated int parse_image_size(int *width_ptr, int *height_ptr,
                                          const char *str);
1075 1076 1077

/**
 * Converts frame rate from string to a fraction.
1078
 * @deprecated Use av_parse_video_frame_rate instead.
1079
 */
1080 1081
attribute_deprecated int parse_frame_rate(int *frame_rate, int *frame_rate_base,
                                          const char *arg);
1082
#endif
1083 1084

/**
1085 1086 1087
 * Parses \p datestr and returns a corresponding number of microseconds.
 * @param datestr String representing a date or a duration.
 * - If a date the syntax is:
1088 1089 1090
 * @code
 *  [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]}
 * @endcode
D
Diego Biurrun 已提交
1091
 * Time is local time unless Z is appended, in which case it is
1092
 * interpreted as UTC.
D
Diego Biurrun 已提交
1093
 * If the year-month-day part is not specified it takes the current
1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
 * year-month-day.
 * Returns the number of microseconds since 1st of January, 1970 up to
 * the time of the parsed date or INT64_MIN if \p datestr cannot be
 * successfully parsed.
 * - If a duration the syntax is:
 * @code
 *  [-]HH[:MM[:SS[.m...]]]
 *  [-]S+[.m...]
 * @endcode
 * Returns the number of microseconds contained in a time interval
 * with the specified duration or INT64_MIN if \p datestr cannot be
D
Diego Biurrun 已提交
1105
 * successfully parsed.
1106 1107 1108
 * @param duration Flag which tells how to interpret \p datestr, if
 * not zero \p datestr is interpreted as a duration, otherwise as a
 * date.
1109
 */
1110
int64_t parse_date(const char *datestr, int duration);
F
Fabrice Bellard 已提交
1111

1112
/** Gets the current time in microseconds. */
1113
int64_t av_gettime(void);
F
Fabrice Bellard 已提交
1114

D
Diego Biurrun 已提交
1115
/* ffm-specific for ffserver */
F
Fabrice Bellard 已提交
1116
#define FFM_PACKET_SIZE 4096
1117 1118 1119
int64_t ffm_read_write_index(int fd);
void ffm_write_write_index(int fd, int64_t pos);
void ffm_set_write_index(AVFormatContext *s, int64_t pos, int64_t file_size);
F
Fabrice Bellard 已提交
1120

1121 1122 1123 1124 1125 1126
/**
 * Attempts to find a specific tag in a URL.
 *
 * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done.
 * Return 1 if found.
 */
F
Fabrice Bellard 已提交
1127 1128
int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info);

1129 1130
/**
 * Returns in 'buf' the path with '%d' replaced by number.
D
Diego Biurrun 已提交
1131
 *
1132 1133 1134 1135 1136 1137
 * Also handles the '%0nd' format where 'n' is the total number
 * of digits and '%%'.
 *
 * @param buf destination buffer
 * @param buf_size destination buffer size
 * @param path numbered sequence string
P
Panagiotis Issaris 已提交
1138
 * @param number frame number
D
Diego Biurrun 已提交
1139
 * @return 0 if OK, -1 on format error
1140
 */
1141 1142
int av_get_frame_filename(char *buf, int buf_size,
                          const char *path, int number);
1143 1144 1145 1146 1147

/**
 * Check whether filename actually is a numbered sequence generator.
 *
 * @param filename possible numbered sequence string
D
Diego Biurrun 已提交
1148
 * @return 1 if a valid numbered sequence string, 0 otherwise
1149
 */
1150
int av_filename_number_test(const char *filename);
1151

L
Luca Abeni 已提交
1152 1153 1154 1155 1156 1157 1158
/**
 * Generate an SDP for an RTP session.
 *
 * @param ac array of AVFormatContexts describing the RTP streams. If the
 *           array is composed by only one context, such context can contain
 *           multiple AVStreams (one AVStream per RTP stream). Otherwise,
 *           all the contexts in the array (an AVCodecContext per RTP stream)
D
Diego Biurrun 已提交
1159
 *           must contain only one AVStream.
1160 1161
 * @param n_files number of AVCodecContexts contained in ac
 * @param buff buffer where the SDP will be stored (must be allocated by
D
Diego Biurrun 已提交
1162
 *             the caller)
1163
 * @param size the size of the buffer
D
Diego Biurrun 已提交
1164
 * @return 0 if OK, AVERROR_xxx on error
L
Luca Abeni 已提交
1165
 */
1166
int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size);
L
Luca Abeni 已提交
1167

F
Fabrice Bellard 已提交
1168
#ifdef HAVE_AV_CONFIG_H
1169

1170
void ff_dynarray_add(unsigned long **tab_ptr, int *nb_ptr, unsigned long elem);
F
Fabrice Bellard 已提交
1171

F
Falk Hüffner 已提交
1172
#ifdef __GNUC__
F
Fabrice Bellard 已提交
1173 1174
#define dynarray_add(tab, nb_ptr, elem)\
do {\
1175 1176
    __typeof__(tab) _tab = (tab);\
    __typeof__(elem) _elem = (elem);\
F
Fabrice Bellard 已提交
1177
    (void)sizeof(**_tab == _elem); /* check that types are compatible */\
1178
    ff_dynarray_add((unsigned long **)_tab, nb_ptr, (unsigned long)_elem);\
F
Fabrice Bellard 已提交
1179
} while(0)
F
Falk Hüffner 已提交
1180 1181 1182
#else
#define dynarray_add(tab, nb_ptr, elem)\
do {\
1183
    ff_dynarray_add((unsigned long **)(tab), nb_ptr, (unsigned long)(elem));\
F
Falk Hüffner 已提交
1184 1185
} while(0)
#endif
F
Fabrice Bellard 已提交
1186

1187
time_t mktimegm(struct tm *tm);
1188
struct tm *brktimegm(time_t secs, struct tm *tm);
1189
const char *small_strptime(const char *p, const char *fmt,
1190 1191
                           struct tm *dt);

F
Fabrice Bellard 已提交
1192 1193 1194 1195
struct in_addr;
int resolve_host(struct in_addr *sin_addr, const char *hostname);

void url_split(char *proto, int proto_size,
1196
               char *authorization, int authorization_size,
F
Fabrice Bellard 已提交
1197 1198 1199 1200 1201
               char *hostname, int hostname_size,
               int *port_ptr,
               char *path, int path_size,
               const char *url);

F
Fabrice Bellard 已提交
1202 1203
int match_ext(const char *filename, const char *extensions);

F
Fabrice Bellard 已提交
1204 1205
#endif /* HAVE_AV_CONFIG_H */

1206
#endif /* AVFORMAT_AVFORMAT_H */