* 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.
+ * decoding functions avcodec_send_packet() 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
* 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
+ * In both cases, the packet must be freed with av_packet_unref() when it is no
* longer needed.
*
* @section lavf_decoding_seek Seeking
* avio_open2() or a custom one.
* - Unless the format is of the AVFMT_NOSTREAMS type, at least one stream must
* be created with the avformat_new_stream() function. The caller should fill
- * the @ref AVStream.codec "stream codec context" information, such as the
- * codec @ref AVCodecContext.codec_type "type", @ref AVCodecContext.codec_id
+ * the @ref AVStream.codecpar "stream codec parameters" information, such as the
+ * codec @ref AVCodecParameters.codec_type "type", @ref AVCodecParameters.codec_id
* "id" and other parameters (e.g. width / height, the pixel or sample format,
* etc.) as known. The @ref AVStream.time_base "stream timebase" should
* be set to the timebase that the caller desires to use for this stream (note
* that the timebase actually used by the muxer can be different, as will be
* described later).
+ * - It is advised to manually initialize only the relevant fields in
+ * AVCodecParameters, rather than using @ref avcodec_parameters_copy() during
+ * remuxing: there is no guarantee that the codec context values remain valid
+ * for both input and output format contexts.
* - The caller may fill in additional information, such as @ref
* AVFormatContext.metadata "global" or @ref AVStream.metadata "per-stream"
* metadata, @ref AVFormatContext.chapters "chapters", @ref
* @{
* @}
* @}
- *
*/
#include <time.h>
* - 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".
+ * - Some protocols and demuxers support metadata updates. After a successful
+ * call to av_read_packet(), AVFormatContext.event_flags or AVStream.event_flags
+ * will be updated to indicate if metadata changed. In order to detect metadata
+ * changes on a stream, you need to loop through all streams in the AVFormatContext
+ * and check their individual event_flags.
*
* - Demuxers attempt to export metadata in a generic format, however tags
* with no generic equivalents are left as they are stored in the container.
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 */
- uint8_t *mime_type; /**< mime_type, when known. */
+ const char *mime_type; /**< mime_type, when known. */
} AVProbeData;
#define AVPROBE_SCORE_EXTENSION 50 ///< score for file extension
#define AVFMT_NOFILE 0x0001
#define AVFMT_NEEDNUMBER 0x0002 /**< Needs '%d' in filename. */
#define AVFMT_SHOW_IDS 0x0008 /**< Show format stream IDs numbers. */
+#if FF_API_LAVF_FMT_RAWPICTURE
#define AVFMT_RAWPICTURE 0x0020 /**< Format wants AVPicture structure for
- raw picture data. */
+ raw picture data. @deprecated Not used anymore */
+#endif
#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. */
enum AVCodecID video_codec; /**< default video codec */
enum AVCodecID subtitle_codec; /**< default subtitle codec */
/**
- * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_RAWPICTURE,
+ * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER,
* AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_VARIABLE_FPS,
* AVFMT_NODIMENSIONS, AVFMT_NOSTREAMS, AVFMT_ALLOW_FLUSH,
- * AVFMT_TS_NONSTRICT
+ * AVFMT_TS_NONSTRICT, AVFMT_TS_NEGATIVE
*/
int flags;
/**
* 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.
+ * structure. Return 0 if OK. 'avformat_new_stream' should be
+ * called to create new streams.
*/
int (*read_header)(struct AVFormatContext *);
*/
#define AV_DISPOSITION_ATTACHED_PIC 0x0400
+typedef struct AVStreamInternal AVStreamInternal;
+
/**
* Stream structure.
* New fields can be added to the end with minor version bumps.
* encoding: set by the user, replaced by libavformat if left unset
*/
int id;
+#if FF_API_LAVF_AVCTX
/**
- * 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.
+ * @deprecated use the codecpar struct instead
*/
+ attribute_deprecated
AVCodecContext *codec;
+#endif
void *priv_data;
#if FF_API_LAVF_FRAC
*/
int nb_side_data;
+ /**
+ * Flags for the user to detect events happening on the stream. Flags must
+ * be cleared by the user once the event has been handled.
+ * A combination of AVSTREAM_EVENT_FLAG_*.
+ */
+ int event_flags;
+#define AVSTREAM_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata.
+
+ /*
+ * Codec parameters associated with this stream. Allocated and freed by
+ * libavformat in avformat_new_stream() and avformat_free_context()
+ * respectively.
+ *
+ * - demuxing: filled by libavformat on stream creation or in
+ * avformat_find_stream_info()
+ * - muxing: filled by the caller before avformat_write_header()
+ */
+ AVCodecParameters *codecpar;
+
/*****************************************************************
* 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
support seeking natively. */
int nb_index_entries;
unsigned int index_entries_allocated_size;
+
+ /**
+ * An opaque field for libavformat internal usage.
+ * Must not be accessed in any way by callers.
+ */
+ AVStreamInternal *internal;
} AVStream;
#define AV_PROGRAM_RUNNING 1
* @see AVCodecContext.strict_std_compliance
*/
int strict_std_compliance;
- /*****************************************************************
- * 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.
- *****************************************************************
+
+ /**
+ * Flags for the user to detect events happening on the file. Flags must
+ * be cleared by the user once the event has been handled.
+ * A combination of AVFMT_EVENT_FLAG_*.
*/
+ int event_flags;
+#define AVFMT_EVENT_FLAG_METADATA_UPDATED 0x0001 ///< The call resulted in updated metadata.
/**
- * This buffer is only needed when packets were already buffered but
- * not decoded, for example to get the codec parameters in MPEG
- * streams.
+ * Maximum number of packets to read while waiting for the first timestamp.
+ * Decoding only.
*/
- struct AVPacketList *packet_buffer;
- struct AVPacketList *packet_buffer_end;
+ int max_ts_probe;
- /* av_seek_frame() support */
- int64_t data_offset; /**< offset of the first packet */
+ /**
+ * Avoid negative timestamps during muxing.
+ * Any value of the AVFMT_AVOID_NEG_TS_* constants.
+ * Note, this only works when using av_interleaved_write_frame.
+ * - muxing: Set by user
+ * - demuxing: unused
+ */
+ int avoid_negative_ts;
+#define AVFMT_AVOID_NEG_TS_AUTO -1 ///< Enabled when required by target format
+#define AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE 1 ///< Shift timestamps so they are non negative
+#define AVFMT_AVOID_NEG_TS_MAKE_ZERO 2 ///< Shift timestamps so that they start at 0
/**
- * 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.
+ * An opaque field for libavformat internal usage.
+ * Must not be accessed in any way by callers.
*/
- struct AVPacketList *raw_packet_buffer;
- struct AVPacketList *raw_packet_buffer_end;
+ AVFormatInternal *internal;
+
/**
- * Packets split by the parser get queued here.
+ * Arbitrary user data set by the caller.
*/
- struct AVPacketList *parse_queue;
- struct AVPacketList *parse_queue_end;
+ void *opaque;
+
/**
- * Remaining size available for raw_packet_buffer, in bytes.
+ * A callback for opening new IO streams.
+ *
+ * Whenever a muxer or a demuxer needs to open an IO stream (typically from
+ * avformat_open_input() for demuxers, but for certain formats can happen at
+ * other times as well), it will call this callback to obtain an IO context.
+ *
+ * @param s the format context
+ * @param pb on success, the newly opened IO context should be returned here
+ * @param url the url to open
+ * @param flags a combination of AVIO_FLAG_*
+ * @param options a dictionary of additional options, with the same
+ * semantics as in avio_open2()
+ * @return 0 on success, a negative AVERROR code on failure
+ *
+ * @note Certain muxers and demuxers do nesting, i.e. they open one or more
+ * additional internal format contexts. Thus the AVFormatContext pointer
+ * passed to this callback may be different from the one facing the caller.
+ * It will, however, have the same 'opaque' field.
*/
-#define RAW_PACKET_BUFFER_SIZE 2500000
- int raw_packet_buffer_remaining_size;
+ int (*io_open)(struct AVFormatContext *s, AVIOContext **pb, const char *url,
+ int flags, AVDictionary **options);
/**
- * Offset to remap timestamps to be non-negative.
- * Expressed in timebase units.
+ * A callback for closing the streams opened with AVFormatContext.io_open().
*/
- int64_t offset;
+ void (*io_close)(struct AVFormatContext *s, AVIOContext *pb);
/**
- * Timebase for the timestamp offset.
+ * A comma-separated list of protocol names that will not be used internally
+ * by libavformat. If this field is a non-empty string, then protocols
+ * listed here will be forbidden.
+ *
+ * This field should be set using AVOptions.
*/
- AVRational offset_timebase;
+ char *protocol_blacklist;
/**
- * An opaque field for libavformat internal usage.
- * Must not be accessed in any way by callers.
+ * A comma-separated list of protocol names that can be used internally by
+ * libavformat. If this field is a non-empty string, all protocols not
+ * listed here will be forbidden.
+ *
+ * This field should be set using AVOptions.
*/
- AVFormatInternal *internal;
+ char *protocol_whitelist;
} AVFormatContext;
typedef struct AVPacketList {
*/
AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);
+/**
+ * Wrap an existing array as stream side data.
+ *
+ * @param st stream
+ * @param type side information type
+ * @param data the side data array. It must be allocated with the av_malloc()
+ * family of functions. The ownership of the data is transferred to
+ * st.
+ * @param size side information size
+ * @return zero on success, a negative AVERROR code on failure. On failure,
+ * the stream is unchanged and the data remains owned by the caller.
+ */
+int av_stream_add_side_data(AVStream *st, enum AVPacketSideDataType type,
+ uint8_t *data, size_t size);
+
+/**
+ * Allocate new information from stream.
+ *
+ * @param stream stream
+ * @param type desired side information type
+ * @param size side information size
+ * @return pointer to fresh allocated data or NULL otherwise
+ */
+uint8_t *av_stream_new_side_data(AVStream *stream,
+ enum AVPacketSideDataType type, int size);
/**
* Get side information from stream.
*
* If pkt->buf is NULL, then the packet is valid until the next
* av_read_frame() or until avformat_close_input(). Otherwise the packet
* is valid indefinitely. In both cases the packet must be freed with
- * av_free_packet when it is no longer needed. For video, the packet contains
+ * av_packet_unref when it is no longer needed. 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.
* <br>
* Packet's @ref AVPacket.stream_index "stream_index" field must be
* set to the index of the corresponding stream in @ref
- * AVFormatContext.streams "s->streams". It is very strongly
- * recommended that timing information (@ref AVPacket.pts "pts", @ref
- * AVPacket.dts "dts", @ref AVPacket.duration "duration") is set to
- * correct values.
+ * AVFormatContext.streams "s->streams".
+ * <br>
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts")
+ * must be set to correct values in the stream's timebase (unless the
+ * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then
+ * they can be set to AV_NOPTS_VALUE).
+ * The dts for subsequent packets passed to this function must be strictly
+ * increasing when compared in their respective timebases (unless the
+ * output format is flagged with the AVFMT_TS_NONSTRICT, then they
+ * merely have to be nondecreasing). @ref AVPacket.duration
+ * "duration") should also be set if known.
* @return < 0 on error, = 0 if OK, 1 if flushed and there is no more data to flush
*
* @see av_interleaved_write_frame()
* increasing dts. Callers doing their own interleaving should call
* av_write_frame() instead of this function.
*
+ * Using this function instead of av_write_frame() can give muxers advance
+ * knowledge of future packets, improving e.g. the behaviour of the mp4
+ * muxer for VFR content in fragmenting mode.
+ *
* @param s media file handle
* @param pkt The packet containing the data to be written.
* <br>
* <br>
* Packet's @ref AVPacket.stream_index "stream_index" field must be
* set to the index of the corresponding stream in @ref
- * AVFormatContext.streams "s->streams". It is very strongly
- * recommended that timing information (@ref AVPacket.pts "pts", @ref
- * AVPacket.dts "dts", @ref AVPacket.duration "duration") is set to
- * correct values.
+ * AVFormatContext.streams "s->streams".
+ * <br>
+ * The timestamps (@ref AVPacket.pts "pts", @ref AVPacket.dts "dts")
+ * must be set to correct values in the stream's timebase (unless the
+ * output format is flagged with the AVFMT_NOTIMESTAMPS flag, then
+ * they can be set to AV_NOPTS_VALUE).
+ * The dts for subsequent packets in one stream must be strictly
+ * increasing (unless the output format is flagged with the
+ * AVFMT_TS_NONSTRICT, then they merely have to be nondecreasing).
+ * @ref AVPacket.duration "duration") should also be set if known.
*
* @return 0 on success, a negative AVERROR on error. Libavformat will always
* take care of freeing the packet, even if this function fails.
* @param ic the context to analyze
* @param index the index to print, if you have multiple inputs or outputs
* @param url the URL to print, such as source or destination file
- * @param is_output whether the context is input or ouput
+ * @param is_output whether the context is input or output
*/
void av_dump_format(AVFormatContext *ic,
int index,