X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Favformat.h;h=919933ff688ed9d020c85e2b53d803a6b1bca76b;hb=7d87d56ff810b921537138f91048a932065260a1;hp=22f74b40139899a0cfb1491230430eb5b04d8a90;hpb=1a70d12727dc63ffe890362ce755213cdb647df1;p=ffmpeg diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 22f74b40139..919933ff688 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -22,7 +22,7 @@ #define AVFORMAT_AVFORMAT_H #define LIBAVFORMAT_VERSION_MAJOR 52 -#define LIBAVFORMAT_VERSION_MINOR 60 +#define LIBAVFORMAT_VERSION_MINOR 93 #define LIBAVFORMAT_VERSION_MICRO 0 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ @@ -35,6 +35,56 @@ #define LIBAVFORMAT_IDENT "Lavf" AV_STRINGIFY(LIBAVFORMAT_VERSION) +/** + * Those FF_API_* defines are not part of public API. + * They may change, break or disappear at any time. + */ +#ifndef FF_API_MAX_STREAMS +#define FF_API_MAX_STREAMS (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_OLD_METADATA +#define FF_API_OLD_METADATA (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_URL_CLASS +#define FF_API_URL_CLASS (LIBAVFORMAT_VERSION_MAJOR >= 53) +#endif +#ifndef FF_API_URL_RESETBUF +#define FF_API_URL_RESETBUF (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_REGISTER_PROTOCOL +#define FF_API_REGISTER_PROTOCOL (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_GUESS_FORMAT +#define FF_API_GUESS_FORMAT (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_UDP_GET_FILE +#define FF_API_UDP_GET_FILE (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_URL_SPLIT +#define FF_API_URL_SPLIT (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_ALLOC_FORMAT_CONTEXT +#define FF_API_ALLOC_FORMAT_CONTEXT (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_PARSE_FRAME_PARAM +#define FF_API_PARSE_FRAME_PARAM (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_READ_SEEK +#define FF_API_READ_SEEK (LIBAVFORMAT_VERSION_MAJOR < 54) +#endif +#ifndef FF_API_LAVF_UNUSED +#define FF_API_LAVF_UNUSED (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_PARAMETERS_CODEC_ID +#define FF_API_PARAMETERS_CODEC_ID (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_FIRST_FORMAT +#define FF_API_FIRST_FORMAT (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif +#ifndef FF_API_SYMVER +#define FF_API_SYMVER (LIBAVFORMAT_VERSION_MAJOR < 53) +#endif + /** * I return the LIBAVFORMAT_VERSION_INT constant. You got * a fucking problem with that, douchebag? @@ -42,12 +92,12 @@ unsigned avformat_version(void); /** - * Returns the libavformat build-time configuration. + * Return the libavformat build-time configuration. */ const char *avformat_configuration(void); /** - * Returns the libavformat license. + * Return the libavformat license. */ const char *avformat_license(void); @@ -87,10 +137,9 @@ struct AVFormatContext; * sorting will have '-sort' appended. E.g. artist="The Beatles", * artist-sort="Beatles, The". * - * 4. Tag names are normally exported exactly as stored in the container to - * allow lossless remuxing to the same format. For container-independent - * handling of metadata, av_metadata_conv() can convert it to ffmpeg generic - * format. Follows a list of generic tag names: + * 4. 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: * * album -- name of the set this work belongs to * album_artist -- main creator of the set/album, if different from artist. @@ -99,6 +148,7 @@ struct AVFormatContext; * 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. @@ -119,6 +169,7 @@ struct AVFormatContext; #define AV_METADATA_IGNORE_SUFFIX 2 #define AV_METADATA_DONT_STRDUP_KEY 4 #define AV_METADATA_DONT_STRDUP_VAL 8 +#define AV_METADATA_DONT_OVERWRITE 16 ///< Don't overwrite existing tags. typedef struct { char *key; @@ -126,10 +177,13 @@ typedef struct { }AVMetadataTag; typedef struct AVMetadata AVMetadata; +#if FF_API_OLD_METADATA typedef struct AVMetadataConv AVMetadataConv; +#endif /** - * Gets a metadata element with matching key. + * Get a metadata element with matching key. + * * @param prev Set to the previous matching element to find the next. * If set to NULL the first matching element is returned. * @param flags Allows case as well as suffix-insensitive comparisons. @@ -138,36 +192,52 @@ typedef struct AVMetadataConv AVMetadataConv; AVMetadataTag * av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags); -#if LIBAVFORMAT_VERSION_MAJOR == 52 +#if FF_API_OLD_METADATA /** - * Sets the given tag in m, overwriting an existing tag. - * @param key tag key to add to m (will be av_strduped) - * @param value tag value to add to m (will be av_strduped) + * Set the given tag in *pm, overwriting an existing tag. + * + * @param pm pointer to a pointer to a metadata struct. If *pm is NULL + * a metadata struct is allocated and put in *pm. + * @param key tag key to add to *pm (will be av_strduped) + * @param value tag value to add to *pm (will be av_strduped) * @return >= 0 on success otherwise an error code <0 + * @deprecated Use av_metadata_set2() instead. */ -int av_metadata_set(AVMetadata **pm, const char *key, const char *value); +attribute_deprecated int av_metadata_set(AVMetadata **pm, const char *key, const char *value); #endif /** - * Sets the given tag in m, overwriting an existing tag. - * @param key tag key to add to m (will be av_strduped depending on flags) - * @param value tag value to add to m (will be av_strduped depending on flags) + * Set the given tag in *pm, overwriting an existing tag. + * + * @param pm pointer to a pointer to a metadata struct. If *pm is NULL + * a metadata struct is allocated and put in *pm. + * @param key tag key to add to *pm (will be av_strduped depending on flags) + * @param value tag value to add to *pm (will be av_strduped depending on flags). + * Passing a NULL value will cause an existing tag to be deleted. * @return >= 0 on success otherwise an error code <0 */ int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags); +#if FF_API_OLD_METADATA /** - * Converts all the metadata sets from ctx according to the source and - * destination conversion tables. If one of the tables is NULL, then - * tags are converted to/from ffmpeg generic tag names. - * @param d_conv destination tags format conversion table - * @param s_conv source tags format conversion table + * This function is provided for compatibility reason and currently does nothing. */ -void av_metadata_conv(struct AVFormatContext *ctx,const AVMetadataConv *d_conv, - const AVMetadataConv *s_conv); +attribute_deprecated void av_metadata_conv(struct AVFormatContext *ctx, const AVMetadataConv *d_conv, + const AVMetadataConv *s_conv); +#endif /** - * Frees all the memory allocated for an AVMetadata struct. + * Copy metadata from one AVMetadata struct into another. + * @param dst pointer to a pointer to a AVMetadata struct. If *dst is NULL, + * this function will allocate a struct for you and put it in *dst + * @param src pointer to source AVMetadata struct + * @param flags flags to use when setting metadata in *dst + * @note metadata is read using the AV_METADATA_IGNORE_SUFFIX flag + */ +void av_metadata_copy(AVMetadata **dst, AVMetadata *src, int flags); + +/** + * Free all the memory allocated for an AVMetadata struct. */ void av_metadata_free(AVMetadata **m); @@ -176,7 +246,7 @@ void av_metadata_free(AVMetadata **m); /** - * Allocates and reads the payload of a packet and initializes its + * Allocate and read the payload of a packet and initialize its * fields with default values. * * @param pkt packet @@ -186,6 +256,21 @@ void av_metadata_free(AVMetadata **m); int av_get_packet(ByteIOContext *s, AVPacket *pkt, int size); +/** + * 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(ByteIOContext *s, AVPacket *pkt, int size); + /*************************************************/ /* fractional numbers for exact pts handling */ @@ -202,7 +287,9 @@ typedef struct AVFrac { struct AVCodecTag; -/** This structure contains the data a format has to probe a file. */ +/** + * This structure contains the data a format has to probe a file. + */ typedef struct AVProbeData { const char *filename; unsigned char *buf; /**< Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero. */ @@ -228,9 +315,9 @@ typedef struct AVFormatParameters { 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; +#if FF_API_PARAMETERS_CODEC_ID + attribute_deprecated enum CodecID video_codec_id; + attribute_deprecated enum CodecID audio_codec_id; #endif } AVFormatParameters; @@ -243,9 +330,10 @@ typedef struct AVFormatParameters { #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. */ +#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 */ typedef struct AVOutputFormat { const char *name; @@ -257,7 +345,9 @@ typedef struct AVOutputFormat { const char *long_name; const char *mime_type; const char *extensions; /**< comma-separated filename extensions */ - /** size of private data so that it can be allocated in the wrapper */ + /** + * size of private data so that it can be allocated in the wrapper + */ int priv_data_size; /* output support */ enum CodecID audio_codec; /**< default audio codec */ @@ -265,9 +355,13 @@ typedef struct AVOutputFormat { int (*write_header)(struct AVFormatContext *); int (*write_packet)(struct AVFormatContext *, AVPacket *pkt); int (*write_trailer)(struct AVFormatContext *); - /** can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER */ + /** + * can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER + */ int flags; - /** Currently only used to set pixel format if not YUV420P. */ + /** + * Currently only used to set pixel format if not YUV420P. + */ int (*set_parameters)(struct AVFormatContext *, AVFormatParameters *); int (*interleave_packet)(struct AVFormatContext *, AVPacket *out, AVPacket *in, int flush); @@ -280,46 +374,69 @@ typedef struct AVOutputFormat { enum CodecID subtitle_codec; /**< default subtitle codec */ +#if FF_API_OLD_METADATA const AVMetadataConv *metadata_conv; +#endif + + const AVClass *priv_class; ///< AVClass for the private context /* private fields */ struct AVOutputFormat *next; } AVOutputFormat; typedef struct AVInputFormat { + /** + * A comma separated list of short names for the format. New names + * may be appended with a minor bump. + */ 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 * to define it. */ const char *long_name; - /** Size of private data so that it can be allocated in the wrapper. */ + + /** + * Size of private data so that it can be allocated in the wrapper. + */ int priv_data_size; + /** * 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. */ int (*read_probe)(AVProbeData *); - /** 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 - now. 'av_new_stream' should be called to create new streams. */ + + /** + * 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 + * now. 'av_new_stream' should be called to create new streams. + */ int (*read_header)(struct AVFormatContext *, AVFormatParameters *ap); - /** Read one packet and put it in 'pkt'. pts and flags are also - set. 'av_new_stream' can be called only if the flag - AVFMTCTX_NOHEADER is used. - @return 0 on success, < 0 on error. - When returning an error, pkt must not have been allocated - or must be freed before returning */ + + /** + * Read one packet and put it in 'pkt'. pts and flags are also + * set. 'av_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 + */ int (*read_packet)(struct AVFormatContext *, AVPacket *pkt); - /** Close the stream. The AVFormatContext and AVStreams are not - freed by this function */ + + /** + * Close the stream. The AVFormatContext and AVStreams are not + * freed by this function + */ int (*read_close)(struct AVFormatContext *); -#if LIBAVFORMAT_VERSION_MAJOR < 53 +#if FF_API_READ_SEEK /** * Seek to a given timestamp relative to the frames in * stream component stream_index. @@ -328,8 +445,8 @@ typedef struct AVInputFormat { * 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); + attribute_deprecated int (*read_seek)(struct AVFormatContext *, + int stream_index, int64_t timestamp, int flags); #endif /** * Gets the next timestamp in stream[stream_index].time_base units. @@ -337,34 +454,49 @@ typedef struct AVInputFormat { */ int64_t (*read_timestamp)(struct AVFormatContext *s, int stream_index, int64_t *pos, int64_t pos_limit); - /** Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER. */ + + /** + * Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER. + */ 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 */ + + /** + * 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; - /** General purpose read-only value that the format can use. */ + + /** + * General purpose read-only value that the format can use. + */ int value; - /** Starts/resumes playing - only meaningful if using a network-based format - (RTSP). */ + /** + * Start/resume playing - only meaningful if using a network-based format + * (RTSP). + */ int (*read_play)(struct AVFormatContext *); - /** Pauses playing - only meaningful if using a network-based format - (RTSP). */ + /** + * Pause playing - only meaningful if using a network-based format + * (RTSP). + */ int (*read_pause)(struct AVFormatContext *); const struct AVCodecTag * const *codec_tag; /** - * Seeks to timestamp ts. + * 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. */ int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); +#if FF_API_OLD_METADATA const AVMetadataConv *metadata_conv; +#endif /* private fields */ struct AVInputFormat *next; @@ -375,6 +507,7 @@ enum AVStreamParseType { AVSTREAM_PARSE_FULL, /**< full parsing and repack */ 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 */ }; typedef struct AVIndexEntry { @@ -393,6 +526,13 @@ typedef struct AVIndexEntry { #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 + /** * Stream structure. * New fields can be added to the end with minor version bumps. @@ -417,7 +557,10 @@ typedef struct AVStream { /* internal data used in av_find_stream_info() */ int64_t first_dts; - /** encoding: pts generation when outputting stream */ + + /** + * encoding: pts generation when outputting stream + */ struct AVFrac pts; /** @@ -430,10 +573,14 @@ typedef struct AVStream { /* ffmpeg.c private use */ 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. + //FIXME move stuff to a flags field? - /** Quality, as it has been removed from AVCodecContext and put in AVVideoFrame. - * MN: dunno if that is the right place for it */ + /** + * Quality, as it has been removed from AVCodecContext and put in AVVideoFrame. + * MN: dunno if that is the right place for it + */ float quality; + /** * 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 @@ -443,6 +590,7 @@ typedef struct AVStream { * demuxer must NOT set this. */ int64_t start_time; + /** * Decoding: duration of the stream, in stream time base. * If a source file does not specify a duration, but does specify @@ -450,8 +598,8 @@ typedef struct AVStream { */ int64_t duration; -#if LIBAVFORMAT_VERSION_INT < (53<<16) - char language[4]; /** ISO 639-2/B 3-letter language code (empty string if undefined) */ +#if FF_API_OLD_METADATA + attribute_deprecated char language[4]; /**< ISO 639-2/B 3-letter language code (empty string if undefined) */ #endif /* av_read_frame() support */ @@ -469,10 +617,12 @@ typedef struct AVStream { int64_t nb_frames; ///< number of frames in this stream if known or 0 -#if LIBAVFORMAT_VERSION_INT < (53<<16) - int64_t unused[4+1]; +#if FF_API_LAVF_UNUSED + attribute_deprecated int64_t unused[4+1]; +#endif - char *filename; /**< source filename of the stream */ +#if FF_API_OLD_METADATA + attribute_deprecated char *filename; /**< source filename of the stream */ #endif int disposition; /**< AV_DISPOSITION_* bit field */ @@ -490,7 +640,8 @@ typedef struct AVStream { AVMetadata *metadata; - /* av_read_frame() support */ + /* Intended mostly for av_read_frame() support. Not supposed to be used by */ + /* external applications; try to use something else if at all possible. */ const uint8_t *cur_ptr; int cur_len; AVPacket cur_pkt; @@ -527,6 +678,18 @@ typedef struct AVStream { * Number of frames that have been demuxed during av_find_stream_info() */ int codec_info_nb_frames; + + /** + * Stream informations used internally by av_find_stream_info() + */ +#define MAX_STD_TIMEBASES (60*12+5) + struct { + int64_t last_dts; + int64_t duration_gcd; + int duration_count; + double duration_error[MAX_STD_TIMEBASES]; + int64_t codec_info_duration; + } *info; } AVStream; #define AV_PROGRAM_RUNNING 1 @@ -539,9 +702,9 @@ typedef struct AVStream { */ typedef struct AVProgram { int id; -#if LIBAVFORMAT_VERSION_INT < (53<<16) - char *provider_name; ///< network name for DVB streams - char *name; ///< service name for DVB streams +#if FF_API_OLD_METADATA + attribute_deprecated char *provider_name; ///< network name for DVB streams + attribute_deprecated char *name; ///< service name for DVB streams #endif int flags; enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller @@ -557,16 +720,14 @@ typedef struct AVChapter { 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 -#if LIBAVFORMAT_VERSION_INT < (53<<16) - char *title; ///< chapter title +#if FF_API_OLD_METADATA + attribute_deprecated char *title; ///< chapter title #endif AVMetadata *metadata; } AVChapter; -#if LIBAVFORMAT_VERSION_MAJOR < 53 +#if FF_API_MAX_STREAMS #define MAX_STREAMS 20 -#else -#define MAX_STREAMS 100 #endif /** @@ -584,53 +745,71 @@ typedef struct AVFormatContext { void *priv_data; ByteIOContext *pb; unsigned int nb_streams; +#if FF_API_MAX_STREAMS AVStream *streams[MAX_STREAMS]; +#else + AVStream **streams; +#endif char filename[1024]; /**< input or output filename */ /* stream info */ int64_t timestamp; -#if LIBAVFORMAT_VERSION_INT < (53<<16) - char title[512]; - char author[512]; - char copyright[512]; - char comment[512]; - char album[512]; - int year; /**< ID3 year, 0 if none */ - int track; /**< track number, 0 if none */ - char genre[32]; /**< ID3 genre */ +#if FF_API_OLD_METADATA + attribute_deprecated char title[512]; + attribute_deprecated char author[512]; + attribute_deprecated char copyright[512]; + attribute_deprecated char comment[512]; + attribute_deprecated char album[512]; + attribute_deprecated int year; /**< ID3 year, 0 if none */ + attribute_deprecated int track; /**< track number, 0 if none */ + attribute_deprecated char genre[32]; /**< ID3 genre */ #endif int ctx_flags; /**< Format-specific flags, see AVFMTCTX_xx */ /* private data for pts handling (do not modify directly). */ - /** This buffer is only needed when packets were already buffered but - not decoded, for example to get the codec parameters in MPEG - streams. */ + /** + * This buffer is only needed when packets were already buffered but + * not decoded, for example to get the codec parameters in MPEG + * streams. + */ struct AVPacketList *packet_buffer; - /** 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. */ + /** + * 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. NEVER set this value directly: it is deduced from the - AVStream values. */ + + /** + * Decoding: duration of the stream, in AV_TIME_BASE fractional + * seconds. Only set this value if you know none of the individual stream + * durations and also dont set any of them. This is deduced from the + * AVStream values if not set. + */ int64_t duration; - /** decoding: total file size, 0 if unknown */ + + /** + * decoding: total file size, 0 if unknown + */ int64_t file_size; - /** Decoding: total stream bitrate in bit/s, 0 if not - available. Never set it directly if the file_size and the - duration are known as FFmpeg can compute it automatically. */ + + /** + * Decoding: total stream bitrate in bit/s, 0 if not + * available. Never set it directly if the file_size and the + * duration are known as FFmpeg can compute it automatically. + */ int bit_rate; /* av_read_frame() support */ AVStream *cur_st; -#if LIBAVFORMAT_VERSION_INT < (53<<16) +#if FF_API_LAVF_UNUSED const uint8_t *cur_ptr_deprecated; int cur_len_deprecated; AVPacket cur_pkt_deprecated; #endif /* av_seek_frame() support */ - int64_t data_offset; /** offset of the first packet */ + int64_t data_offset; /**< offset of the first packet */ int index_built; int mux_rate; @@ -640,7 +819,9 @@ typedef struct AVFormatContext { #define AVFMT_NOOUTPUTLOOP -1 #define AVFMT_INFINITEOUTPUTLOOP 0 - /** number of times to loop output in formats that support it */ + /** + * number of times to loop output in formats that support it + */ int loop_output; int flags; @@ -650,9 +831,13 @@ typedef struct AVFormatContext { #define AVFMT_FLAG_IGNDTS 0x0008 ///< Ignore DTS on frames that contain both DTS & PTS #define AVFMT_FLAG_NOFILLIN 0x0010 ///< Do not infer any values from other values, just return what is stored in the container #define AVFMT_FLAG_NOPARSE 0x0020 ///< Do not use AVParsers, you also must set AVFMT_FLAG_NOFILLIN as the fillin code works on frames and no parsing -> no frames. Also seeking to frames can not work if parsing to find frame boundaries has been disabled +#define AVFMT_FLAG_RTP_HINT 0x0040 ///< Add RTP hinting to the output file int loop_input; - /** decoding: size of data to probe; encoding: unused. */ + + /** + * decoding: size of data to probe; encoding: unused. + */ unsigned int probesize; /** @@ -672,11 +857,13 @@ typedef struct AVFormatContext { * Demuxing: Set by user. */ enum CodecID video_codec_id; + /** * Forced audio codec_id. * Demuxing: Set by user. */ enum CodecID audio_codec_id; + /** * Forced subtitle codec_id. * Demuxing: Set by user. @@ -745,9 +932,9 @@ typedef struct AVPacketList { struct AVPacketList *next; } AVPacketList; -#if LIBAVFORMAT_VERSION_INT < (53<<16) -extern AVInputFormat *first_iformat; -extern AVOutputFormat *first_oformat; +#if FF_API_FIRST_FORMAT +attribute_deprecated extern AVInputFormat *first_iformat; +attribute_deprecated extern AVOutputFormat *first_oformat; #endif /** @@ -772,7 +959,7 @@ enum CodecID av_guess_image2_codec(const char *filename); /* utils.c */ void av_register_input_format(AVInputFormat *format); void av_register_output_format(AVOutputFormat *format); -#if LIBAVFORMAT_VERSION_MAJOR < 53 +#if FF_API_GUESS_FORMAT attribute_deprecated AVOutputFormat *guess_stream_format(const char *short_name, const char *filename, const char *mime_type); @@ -786,8 +973,8 @@ attribute_deprecated AVOutputFormat *guess_format(const char *short_name, #endif /** - * Returns the output format in the list of registered output formats - * which best matches the provided parameters, or returns NULL if + * Return the output format in the list of registered output formats + * which best matches the provided parameters, or return NULL if * there is no match. * * @param short_name if non-NULL checks if short_name matches with the @@ -802,14 +989,14 @@ AVOutputFormat *av_guess_format(const char *short_name, const char *mime_type); /** - * Guesses the codec ID based upon muxer and filename. + * Guess the codec ID based upon muxer and filename. */ enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, const char *filename, const char *mime_type, enum AVMediaType type); /** - * Sends a nice hexadecimal dump of a buffer to the specified file stream. + * 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. * @param buf buffer @@ -820,7 +1007,7 @@ enum CodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, void av_hex_dump(FILE *f, uint8_t *buf, int size); /** - * Sends a nice hexadecimal dump of a buffer to the log. + * 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. @@ -834,7 +1021,7 @@ void av_hex_dump(FILE *f, uint8_t *buf, int size); void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size); /** - * Sends a nice dump of a packet to the specified file stream. + * 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. * @param pkt packet to dump @@ -843,7 +1030,7 @@ void av_hex_dump_log(void *avcl, int level, uint8_t *buf, int size); void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload); /** - * Sends a nice dump of a packet to the log. + * 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. @@ -855,7 +1042,7 @@ void av_pkt_dump(FILE *f, AVPacket *pkt, int dump_payload); void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload); /** - * Initializes libavformat and registers all the muxers, demuxers and + * Initialize libavformat and register all the muxers, demuxers and * protocols. If you do not call this function, then you can select * exactly which formats you want to support. * @@ -865,19 +1052,33 @@ void av_pkt_dump_log(void *avcl, int level, AVPacket *pkt, int dump_payload); */ void av_register_all(void); -/** codec tag <-> codec id */ +/** + * Get the CodecID for the given codec tag tag. + * If no codec id is found returns CODEC_ID_NONE. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + */ enum CodecID av_codec_get_id(const struct AVCodecTag * const *tags, unsigned int tag); + +/** + * Get the codec tag for the given codec id id. + * If no codec tag is found returns 0. + * + * @param tags list of supported codec_id-codec_tag pairs, as stored + * in AVInputFormat.codec_tag and AVOutputFormat.codec_tag + */ unsigned int av_codec_get_tag(const struct AVCodecTag * const *tags, enum CodecID id); /* media file input */ /** - * Finds AVInputFormat based on the short name of the input format. + * Find AVInputFormat based on the short name of the input format. */ AVInputFormat *av_find_input_format(const char *short_name); /** - * Guesses the file format. + * Guess the file format. * * @param is_opened Whether the file is already opened; determines whether * demuxers with or without AVFMT_NOFILE are probed. @@ -885,7 +1086,20 @@ AVInputFormat *av_find_input_format(const char *short_name); AVInputFormat *av_probe_input_format(AVProbeData *pd, int is_opened); /** - * Allocates all the structures needed to read an input stream. + * Guess the file format. + * + * @param is_opened Whether the file is already opened; determines whether + * demuxers with or without AVFMT_NOFILE are probed. + * @param score_max A probe score larger that this is required to accept a + * detection, the variable is set to the actual detection + * score afterwards. + * If the score is <= AVPROBE_SCORE_MAX / 4 it is recommended + * to retry with a larger probe buffer. + */ +AVInputFormat *av_probe_input_format2(AVProbeData *pd, int is_opened, int *score_max); + +/** + * Allocate all the structures needed to read an input stream. * This does not open the needed codecs for decoding the stream[s]. */ int av_open_input_stream(AVFormatContext **ic_ptr, @@ -893,7 +1107,7 @@ int av_open_input_stream(AVFormatContext **ic_ptr, AVInputFormat *fmt, AVFormatParameters *ap); /** - * Opens a media file as input. The codecs are not opened. Only the file + * Open a media file as input. The codecs are not opened. Only the file * header (if present) is read. * * @param ic_ptr The opened media file handle is put here. @@ -909,7 +1123,7 @@ int av_open_input_file(AVFormatContext **ic_ptr, const char *filename, int buf_size, AVFormatParameters *ap); -#if LIBAVFORMAT_VERSION_MAJOR < 53 +#if FF_API_ALLOC_FORMAT_CONTEXT /** * @deprecated Use avformat_alloc_context() instead. */ @@ -917,14 +1131,14 @@ attribute_deprecated AVFormatContext *av_alloc_format_context(void); #endif /** - * Allocates an AVFormatContext. + * Allocate an AVFormatContext. * Can be freed with av_free() but do not forget to free everything you * explicitly allocated as well! */ AVFormatContext *avformat_alloc_context(void); /** - * Reads packets of a media file to get stream information. This + * Read packets of a media file to get stream information. This * is useful for file formats with no headers such as MPEG. This * function also computes the real framerate in case of MPEG-2 repeat * frame mode. @@ -939,7 +1153,38 @@ AVFormatContext *avformat_alloc_context(void); int av_find_stream_info(AVFormatContext *ic); /** - * Reads a transport packet from a media file. + * Find the "best" stream in the file. + * The best stream is determined according to various heuristics as the most + * likely to be what the user expects. + * If the decoder parameter is non-NULL, av_find_best_stream will find the + * default decoder for the stream's codec; streams for which no decoder can + * be found are ignored. + * + * @param ic media file handle + * @param type stream type: video, audio, subtitles, etc. + * @param wanted_stream_nb user-requested stream number, + * or -1 for automatic selection + * @param related_stream try to find a stream related (eg. in the same + * program) to this one, or -1 if none + * @param decoder_ret if non-NULL, returns the decoder for the + * selected stream + * @param flags flags; none are currently defined + * @return the non-negative stream number in case of success, + * AVERROR_STREAM_NOT_FOUND if no stream with the requested type + * could be found, + * AVERROR_DECODER_NOT_FOUND if streams were found but no decoder + * @note If av_find_best_stream returns successfully and decoder_ret is not + * NULL, then *decoder_ret is guaranteed to be set to a valid AVCodec. + */ +int av_find_best_stream(AVFormatContext *ic, + enum AVMediaType type, + int wanted_stream_nb, + int related_stream, + AVCodec **decoder_ret, + int flags); + +/** + * Read a transport packet from a media file. * * This function is obsolete and should never be used. * Use av_read_frame() instead. @@ -951,7 +1196,12 @@ int av_find_stream_info(AVFormatContext *ic); int av_read_packet(AVFormatContext *s, AVPacket *pkt); /** - * Returns the next frame of a stream. + * Return the next frame of a stream. + * This function returns what is stored in the file, and does not validate + * that what is there are valid frames for the decoder. It will split what is + * stored in the file into frames and return one for each call. It will not + * omit invalid data between valid frames so as to give the decoder the maximum + * information possible for decoding. * * The returned packet is valid * until the next av_read_frame() or until av_close_input_file() and @@ -972,7 +1222,7 @@ int av_read_packet(AVFormatContext *s, AVPacket *pkt); int av_read_frame(AVFormatContext *s, AVPacket *pkt); /** - * Seeks to the keyframe at timestamp. + * Seek to the keyframe at timestamp. * 'timestamp' in 'stream_index'. * @param stream_index If stream_index is (-1), a default * stream is selected, and timestamp is automatically converted @@ -986,7 +1236,7 @@ int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags); /** - * Seeks to timestamp ts. + * 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. @@ -1007,40 +1257,40 @@ int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, * @param flags flags * @return >=0 on success, error code otherwise * - * @NOTE This is part of the new seek API which is still under construction. + * @note This is part of the new seek API which is still under construction. * Thus do not use this yet. It may change at any time, do not expect * ABI compatibility yet! */ int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags); /** - * Starts playing a network-based stream (e.g. RTSP stream) at the + * Start playing a network-based stream (e.g. RTSP stream) at the * current position. */ int av_read_play(AVFormatContext *s); /** - * Pauses a network-based stream (e.g. RTSP stream). + * Pause a network-based stream (e.g. RTSP stream). * * Use av_read_play() to resume it. */ int av_read_pause(AVFormatContext *s); /** - * Frees a AVFormatContext allocated by av_open_input_stream. + * Free a AVFormatContext allocated by av_open_input_stream. * @param s context to free */ void av_close_input_stream(AVFormatContext *s); /** - * Closes a media file (but not its codecs). + * Close a media file (but not its codecs). * * @param s media file handle */ void av_close_input_file(AVFormatContext *s); /** - * Adds a new stream to a media file. + * 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 @@ -1053,7 +1303,7 @@ AVStream *av_new_stream(AVFormatContext *s, int id); AVProgram *av_new_program(AVFormatContext *s, int id); /** - * Adds a new chapter. + * Add a new chapter. * This function is NOT part of the public API * and should ONLY be used by demuxers. * @@ -1069,7 +1319,7 @@ AVChapter *ff_new_chapter(AVFormatContext *s, int id, AVRational time_base, int64_t start, int64_t end, const char *title); /** - * Sets the pts for a given stream. + * Set the pts for a given stream. * * @param s stream * @param pts_wrap_bits number of bits effectively used by the pts @@ -1088,7 +1338,7 @@ void av_set_pts_info(AVStream *s, int pts_wrap_bits, int av_find_default_stream_index(AVFormatContext *s); /** - * Gets the index for a specific timestamp. + * Get the index for a specific timestamp. * @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 >= @@ -1098,7 +1348,7 @@ int av_find_default_stream_index(AVFormatContext *s); int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); /** - * Ensures the index uses less memory than the maximum specified in + * Ensure 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 @@ -1107,7 +1357,7 @@ int av_index_search_timestamp(AVStream *st, int64_t timestamp, int flags); void ff_reduce_index(AVFormatContext *s, int stream_index); /** - * Adds an index entry into a sorted list. Updates the entry if the list + * Add an index entry into a sorted list. Update the entry if the list * already contains it. * * @param timestamp timestamp in the time base of the given stream @@ -1116,8 +1366,8 @@ int av_add_index_entry(AVStream *st, int64_t pos, int64_t timestamp, int size, int distance, int flags); /** - * Does a binary search using av_index_search_timestamp() and - * AVCodec.read_timestamp(). + * Perform a binary search using av_index_search_timestamp() and + * AVInputFormat.read_timestamp(). * This is not supposed to be called directly by a user application, * but by demuxers. * @param target_ts target timestamp in the time base of the given stream @@ -1127,7 +1377,7 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, int64_t target_ts, int flags); /** - * Updates cur_dts of all streams based on the given timestamp and AVStream. + * Update cur_dts of all streams based on the given timestamp and AVStream. * * 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). @@ -1137,7 +1387,7 @@ int av_seek_frame_binary(AVFormatContext *s, int stream_index, void av_update_cur_dts(AVFormatContext *s, AVStream *ref_st, int64_t timestamp); /** - * Does a binary search using read_timestamp(). + * Perform a binary search using read_timestamp(). * This is not supposed to be called directly by a user application, * but by demuxers. * @param target_ts target timestamp in the time base of the given stream @@ -1150,11 +1400,39 @@ int64_t av_gen_search(AVFormatContext *s, int stream_index, int flags, int64_t *ts_ret, int64_t (*read_timestamp)(struct AVFormatContext *, int , int64_t *, int64_t )); -/** media file output */ +/** + * media file output + */ int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap); /** - * Allocates the stream private data and writes the stream header to an + * Split a URL string into components. + * + * The pointers to buffers for storing individual components may be null, + * in order to ignore that component. Buffers for components not found are + * set to empty strings. If the port is not found, it is set to a negative + * value. + * + * @param proto the buffer for the protocol + * @param proto_size the size of the proto buffer + * @param authorization the buffer for the authorization + * @param authorization_size the size of the authorization buffer + * @param hostname the buffer for the host name + * @param hostname_size the size of the hostname buffer + * @param port_ptr a pointer to store the port number in + * @param path the buffer for the path + * @param path_size the size of the path buffer + * @param url the URL to split + */ +void av_url_split(char *proto, int proto_size, + char *authorization, int authorization_size, + char *hostname, int hostname_size, + int *port_ptr, + char *path, int path_size, + const char *url); + +/** + * Allocate the stream private data and write the stream header to an * output media file. * * @param s media file handle @@ -1163,7 +1441,7 @@ int av_set_parameters(AVFormatContext *s, AVFormatParameters *ap); int av_write_header(AVFormatContext *s); /** - * Writes a packet to an output media file. + * Write a packet to an output media file. * * The packet shall contain one audio or video frame. * The packet must be correctly interleaved according to the container @@ -1177,7 +1455,7 @@ int av_write_header(AVFormatContext *s); int av_write_frame(AVFormatContext *s, AVPacket *pkt); /** - * Writes a packet to an output media file ensuring correct interleaving. + * Write 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 @@ -1194,7 +1472,7 @@ int av_write_frame(AVFormatContext *s, AVPacket *pkt); int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); /** - * Interleaves a packet per dts in an output media file. + * Interleave a packet per dts in an output media file. * * Packets with pkt->destruct == av_destruct_packet will be freed inside this * function, so they cannot be used after it. Note that calling av_free_packet() @@ -1202,7 +1480,7 @@ int av_interleaved_write_frame(AVFormatContext *s, AVPacket *pkt); * * @param s media file handle * @param out the interleaved packet will be output here - * @param in the input packet + * @param pkt 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, @@ -1212,7 +1490,7 @@ int av_interleave_packet_per_dts(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush); /** - * Writes the stream trailer to an output media file and frees the + * 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. @@ -1227,16 +1505,16 @@ void dump_format(AVFormatContext *ic, const char *url, int is_output); -#if LIBAVFORMAT_VERSION_MAJOR < 53 +#if FF_API_PARSE_FRAME_PARAM /** - * Parses width and height out of string str. + * Parse width and height out of string str. * @deprecated Use av_parse_video_frame_size instead. */ attribute_deprecated int parse_image_size(int *width_ptr, int *height_ptr, const char *str); /** - * Converts framerate from a string to a fraction. + * Convert framerate from a string to a fraction. * @deprecated Use av_parse_video_frame_rate instead. */ attribute_deprecated int parse_frame_rate(int *frame_rate, int *frame_rate_base, @@ -1244,17 +1522,18 @@ attribute_deprecated int parse_frame_rate(int *frame_rate, int *frame_rate_base, #endif /** - * Parses datestr and returns a corresponding number of microseconds. + * Parse datestr and return a corresponding number of microseconds. * @param datestr String representing a date or a duration. * - If a date the syntax is: * @code - * [{YYYY-MM-DD|YYYYMMDD}]{T| }{HH[:MM[:SS[.m...]]][Z]|HH[MM[SS[.m...]]][Z]} + * now|{[{YYYY-MM-DD|YYYYMMDD}[T|t| ]]{{HH[:MM[:SS[.m...]]]}|{HH[MM[SS[.m...]]]}}[Z|z]} * @endcode + * If the value is "now" it takes the current time. * Time is local time unless Z is appended, in which case it is * interpreted as UTC. * If the year-month-day part is not specified it takes the current * year-month-day. - * Returns the number of microseconds since 1st of January, 1970 up to + * @return the number of microseconds since 1st of January, 1970 up to * the time of the parsed date or INT64_MIN if datestr cannot be * successfully parsed. * - If a duration the syntax is: @@ -1262,7 +1541,7 @@ attribute_deprecated int parse_frame_rate(int *frame_rate, int *frame_rate_base, * [-]HH[:MM[:SS[.m...]]] * [-]S+[.m...] * @endcode - * Returns the number of microseconds contained in a time interval + * @return the number of microseconds contained in a time interval * with the specified duration or INT64_MIN if datestr cannot be * successfully parsed. * @param duration Flag which tells how to interpret datestr, if @@ -1271,7 +1550,9 @@ attribute_deprecated int parse_frame_rate(int *frame_rate, int *frame_rate_base, */ int64_t parse_date(const char *datestr, int duration); -/** Gets the current time in microseconds. */ +/** + * Get the current time in microseconds. + */ int64_t av_gettime(void); /* ffm-specific for ffserver */ @@ -1281,7 +1562,7 @@ int ffm_write_write_index(int fd, int64_t pos); void ffm_set_write_index(AVFormatContext *s, int64_t pos, int64_t file_size); /** - * Attempts to find a specific tag in a URL. + * Attempt to find a specific tag in a URL. * * syntax: '?tag1=val1&tag2=val2...'. Little URL decoding is done. * Return 1 if found. @@ -1289,7 +1570,7 @@ void ffm_set_write_index(AVFormatContext *s, int64_t pos, int64_t file_size); int find_info_tag(char *arg, int arg_size, const char *tag1, const char *info); /** - * Returns in 'buf' the path with '%d' replaced by a number. + * Return in 'buf' the path with '%d' replaced by a number. * * Also handles the '%0nd' format where 'n' is the total number * of digits and '%%'. @@ -1304,7 +1585,7 @@ int av_get_frame_filename(char *buf, int buf_size, const char *path, int number); /** - * Checks whether filename actually is a numbered sequence generator. + * Check whether filename actually is a numbered sequence generator. * * @param filename possible numbered sequence string * @return 1 if a valid numbered sequence string, 0 otherwise @@ -1312,7 +1593,7 @@ int av_get_frame_filename(char *buf, int buf_size, int av_filename_number_test(const char *filename); /** - * Generates an SDP for an RTP session. + * 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 @@ -1328,37 +1609,11 @@ int av_filename_number_test(const char *filename); int avf_sdp_create(AVFormatContext *ac[], int n_files, char *buff, int size); /** - * Returns a positive value if the given filename has one of the given + * Return a positive value if the given filename has one of the given * extensions, 0 otherwise. * * @param extensions a comma-separated list of filename extensions */ int av_match_ext(const char *filename, const char *extensions); -#ifdef HAVE_AV_CONFIG_H - -void ff_dynarray_add(intptr_t **tab_ptr, int *nb_ptr, intptr_t elem); - -#ifdef __GNUC__ -#define dynarray_add(tab, nb_ptr, elem)\ -do {\ - __typeof__(tab) _tab = (tab);\ - __typeof__(elem) _elem = (elem);\ - (void)sizeof(**_tab == _elem); /* check that types are compatible */\ - ff_dynarray_add((intptr_t **)_tab, nb_ptr, (intptr_t)_elem);\ -} while(0) -#else -#define dynarray_add(tab, nb_ptr, elem)\ -do {\ - ff_dynarray_add((intptr_t **)(tab), nb_ptr, (intptr_t)(elem));\ -} while(0) -#endif - -time_t mktimegm(struct tm *tm); -struct tm *brktimegm(time_t secs, struct tm *tm); -const char *small_strptime(const char *p, const char *fmt, - struct tm *dt); - -#endif /* HAVE_AV_CONFIG_H */ - #endif /* AVFORMAT_AVFORMAT_H */