* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#ifndef FFMPEG_AVFORMAT_H
-#define FFMPEG_AVFORMAT_H
+#ifndef AVFORMAT_AVFORMAT_H
+#define AVFORMAT_AVFORMAT_H
#define LIBAVFORMAT_VERSION_MAJOR 52
-#define LIBAVFORMAT_VERSION_MINOR 9
-#define LIBAVFORMAT_VERSION_MICRO 0
+#define LIBAVFORMAT_VERSION_MINOR 22
+#define LIBAVFORMAT_VERSION_MICRO 1
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
#define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION)
+/**
+ * Returns the LIBAVFORMAT_VERSION_INT constant.
+ */
+unsigned avformat_version(void);
+
#include <time.h>
#include <stdio.h> /* FILE */
#include "libavcodec/avcodec.h"
/* packet functions */
typedef struct AVPacket {
- int64_t pts; ///< presentation time stamp in time_base units
- int64_t dts; ///< decompression time stamp in time_base units
+ /**
+ * Presentation time stamp in time_base units.
+ * 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.
+ * pts MUST be larger or equal to dts as presentation can not happen before
+ * 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;
+ /**
+ * Decompression time stamp in time_base units.
+ * 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;
uint8_t *data;
int size;
int stream_index;
int flags;
- int duration; ///< presentation duration in time_base units (0 if not available)
+ /**
+ * Duration of this packet in time_base units, 0 if unknown.
+ * Equals next_pts - this_pts in presentation order.
+ */
+ int duration;
void (*destruct)(struct AVPacket *);
void *priv;
int64_t pos; ///< byte position in stream, -1 if unknown
+
+ /**
+ * This is the time difference in stream timebase units from the pts of this
+ * packet to the point at which the output from the decoder has converged
+ * 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.
+ * This field is not the display duration of the current packet.
+ *
+ * The purpose of this field is to allow seeking in streams that have no
+ * keyframes in the conventional sense. It corresponds to the
+ * recovery point SEI in H.264 and match_time_delta in nut. It also is
+ * essential for some types of subtitle streams to ensure that all
+ * subtitles are correctly displayed after seeking.
+ */
+ int64_t convergence_duration;
} AVPacket;
#define PKT_FLAG_KEY 0x0001
enum PixelFormat pix_fmt;
int channel; /**< used to select dv channel */
const char *standard; /**< tv standard, NTSC, PAL, SECAM */
- int mpeg2ts_raw:1; /**< force raw MPEG2 transport stream output, if possible */
- int mpeg2ts_compute_pcr:1; /**< compute exact PCR for each transport
- stream packet (only meaningful if
- mpeg2ts_raw is TRUE) */
- int initial_pause:1; /**< do not begin to play the stream
- immediately (RTSP only) */
- int prealloced_context:1;
+ unsigned int mpeg2ts_raw:1; /**< force raw MPEG2 transport stream output, if possible */
+ unsigned int mpeg2ts_compute_pcr:1; /**< compute exact PCR for each transport
+ stream packet (only meaningful if
+ mpeg2ts_raw is TRUE) */
+ unsigned int initial_pause:1; /**< do not begin to play the stream
+ immediately (RTSP only) */
+ unsigned int prealloced_context:1;
#if LIBAVFORMAT_VERSION_INT < (53<<16)
enum CodecID video_codec_id;
enum CodecID audio_codec_id;
#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 timestamo discontinuities */
typedef struct AVOutputFormat {
const char *name;
+ /**
+ * 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.
+ */
const char *long_name;
const char *mime_type;
const char *extensions; /**< comma separated filename extensions */
* list of supported codec_id-codec_tag pairs, ordered by "better choice first"
* the arrays are all CODEC_ID_NONE terminated
*/
- const struct AVCodecTag **codec_tag;
+ const struct AVCodecTag * const *codec_tag;
enum CodecID subtitle_codec; /**< default subtitle codec */
typedef struct AVInputFormat {
const char *name;
+ /**
+ * 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.
+ */
const char *long_name;
/** size of private data so that it can be allocated in the wrapper */
int priv_data_size;
int stream_index, int64_t timestamp, int flags);
/**
* gets the next timestamp in stream[stream_index].time_base units.
- * @return the timestamp or AV_NOPTS_VALUE if an error occured
+ * @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);
(RTSP) */
int (*read_pause)(struct AVFormatContext *);
- const struct AVCodecTag **codec_tag;
+ const struct AVCodecTag * const *codec_tag;
/* private fields */
struct AVInputFormat *next;
int64_t nb_frames; ///< number of frames in this stream if known or 0
-#define MAX_REORDER_DELAY 4
- int64_t pts_buffer[MAX_REORDER_DELAY+1];
+#if LIBAVFORMAT_VERSION_INT < (53<<16)
+ int64_t unused[4+1];
+#endif
char *filename; /**< source filename of the stream */
int disposition; /**< AV_DISPOSITION_* bitfield */
+
+ AVProbeData probe_data;
+#define MAX_REORDER_DELAY 16
+ int64_t pts_buffer[MAX_REORDER_DELAY+1];
+
+ /**
+ * sample aspect ratio (0 if unknown)
+ * - encoding: Set by user.
+ * - decoding: Set by libavformat.
+ */
+ AVRational sample_aspect_ratio;
} AVStream;
#define AV_PROGRAM_RUNNING 1
#define AVFMTCTX_NOHEADER 0x0001 /**< signal that no header is present
(streams are added dynamically) */
+typedef struct AVChapter {
+ int id; ///< Unique id to identify the chapter
+ AVRational time_base; ///< Timebase in which the start/end timestamps are specified
+ int64_t start, end; ///< chapter start/end time in time_base units
+ char *title; ///< chapter title
+} AVChapter;
+
#define MAX_STREAMS 20
/**
unsigned int max_index_size;
/**
- * Maximum ammount of memory in bytes to use for buffering frames that are
+ * Maximum amount of memory in bytes to use for buffering frames
* obtained from real-time capture devices.
*/
unsigned int max_picture_buffer;
+
+ unsigned int nb_chapters;
+ AVChapter **chapters;
+
+ /**
+ * Flags to enable debuging.
+ */
+ int debug;
+#define FF_FDEBUG_TS 0x0001
+
+ /**
+ * raw packets from the demuxer, prior to parsing and decoding.
+ * 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;
+ struct AVPacketList *raw_packet_buffer_end;
+
+ struct AVPacketList *packet_buffer_end;
} AVFormatContext;
typedef struct AVPacketList {
AVStream *av_new_stream(AVFormatContext *s, int id);
AVProgram *av_new_program(AVFormatContext *s, int id);
+/**
+ * Add a new chapter.
+ * This function is NOT part of the public API
+ * and should be ONLY used by demuxers.
+ *
+ * @param s media file handle
+ * @param id unique id for this chapter
+ * @param start chapter start time in time_base units
+ * @param end chapter end time in time_base units
+ * @param title chapter title
+ *
+ * @return AVChapter or NULL if error.
+ */
+AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title);
+
/**
* Set the pts for a given stream.
*
* @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,
- * < 0 if an error occured
+ * < 0 if an error occurred
*/
int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush);
* @brief Write the stream trailer to an output media file and
* free the file private data.
*
+ * May only be called after a successful call to av_write_header.
+ *
* @param s media file handle
* @return 0 if OK. AVERROR_xxx if error.
*/
#ifdef HAVE_AV_CONFIG_H
-void __dynarray_add(unsigned long **tab_ptr, int *nb_ptr, unsigned long elem);
+void ff_dynarray_add(unsigned long **tab_ptr, int *nb_ptr, unsigned long elem);
#ifdef __GNUC__
#define dynarray_add(tab, nb_ptr, elem)\
typeof(tab) _tab = (tab);\
typeof(elem) _elem = (elem);\
(void)sizeof(**_tab == _elem); /* check that types are compatible */\
- __dynarray_add((unsigned long **)_tab, nb_ptr, (unsigned long)_elem);\
+ ff_dynarray_add((unsigned long **)_tab, nb_ptr, (unsigned long)_elem);\
} while(0)
#else
#define dynarray_add(tab, nb_ptr, elem)\
do {\
- __dynarray_add((unsigned long **)(tab), nb_ptr, (unsigned long)(elem));\
+ ff_dynarray_add((unsigned long **)(tab), nb_ptr, (unsigned long)(elem));\
} while(0)
#endif
#endif /* HAVE_AV_CONFIG_H */
-#endif /* FFMPEG_AVFORMAT_H */
+#endif /* AVFORMAT_AVFORMAT_H */