diff --git a/doc/APIchanges b/doc/APIchanges index 822e6e5edd..a173931bc7 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,9 @@ libavutil: 2014-08-09 API changes, most recent first: +2015-05-11 - XXXXXXX - lavf 56.33.100 - avformat.h + Add AVOpenCallback AVFormatContext.open_cb + 2015-05-07 - a7dd933 - 56.38.100 - avcodec.h Add av_packet_side_data_name(). diff --git a/libavformat/avformat.h b/libavformat/avformat.h index 339ff52912..f0593b8b9f 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1237,6 +1237,8 @@ typedef struct AVChapter { typedef int (*av_format_control_message)(struct AVFormatContext *s, int type, void *data, size_t data_size); +typedef int (*AVOpenCallback)(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); /** * The duration of a video can be estimated through various ways, and this enum can be used @@ -1780,6 +1782,23 @@ typedef struct AVFormatContext { * Demuxing: Set by user. */ enum AVCodecID data_codec_id; + + /** + * Called to open further IO contexts when needed for demuxing. + * + * This can be set by the user application to perform security checks on + * the URLs before opening them. + * The function should behave like avio_open2(), AVFormatContext is provided + * as contextual information and to reach AVFormatContext.opaque. + * + * If NULL then avio_open2() is used. + * + * Must not be accessed directly from outside avformat. + * @See av_format_set_open_cb() + * + * Demuxing: Set by user. + */ + int (*open_cb)(struct AVFormatContext *s, AVIOContext **p, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options); } AVFormatContext; int av_format_get_probe_score(const AVFormatContext *s); @@ -1797,6 +1816,8 @@ void * av_format_get_opaque(const AVFormatContext *s); void av_format_set_opaque(AVFormatContext *s, void *opaque); av_format_control_message av_format_get_control_message_cb(const AVFormatContext *s); void av_format_set_control_message_cb(AVFormatContext *s, av_format_control_message callback); +AVOpenCallback av_format_get_open_cb(const AVFormatContext *s); +void av_format_set_open_cb(AVFormatContext *s, AVOpenCallback callback); /** * This function will cause global side data to be injected in the next packet diff --git a/libavformat/avio_internal.h b/libavformat/avio_internal.h index 1ed5831e78..c354771af2 100644 --- a/libavformat/avio_internal.h +++ b/libavformat/avio_internal.h @@ -157,4 +157,7 @@ int ffio_close_null_buf(AVIOContext *s); */ void ffio_free_dyn_buf(AVIOContext **s); +int ffio_open2_wrapper(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options); + #endif /* AVFORMAT_AVIO_INTERNAL_H */ diff --git a/libavformat/aviobuf.c b/libavformat/aviobuf.c index 333c75ce66..9701d74f19 100644 --- a/libavformat/aviobuf.c +++ b/libavformat/aviobuf.c @@ -918,6 +918,12 @@ int avio_open2(AVIOContext **s, const char *filename, int flags, return 0; } +int ffio_open2_wrapper(struct AVFormatContext *s, AVIOContext **pb, const char *url, int flags, + const AVIOInterruptCB *int_cb, AVDictionary **options) +{ + return avio_open2(pb, url, flags, int_cb, options); +} + int avio_close(AVIOContext *s) { URLContext *h; diff --git a/libavformat/utils.c b/libavformat/utils.c index d1f1d09e45..db2b4f6768 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -112,6 +112,7 @@ MAKE_ACCESSORS(AVFormatContext, format, AVCodec *, data_codec) MAKE_ACCESSORS(AVFormatContext, format, int, metadata_header_padding) MAKE_ACCESSORS(AVFormatContext, format, void *, opaque) MAKE_ACCESSORS(AVFormatContext, format, av_format_control_message, control_message_cb) +MAKE_ACCESSORS(AVFormatContext, format, AVOpenCallback, open_cb) int64_t av_stream_get_end_pts(const AVStream *st) { diff --git a/libavformat/version.h b/libavformat/version.h index 6373017cfd..071fe5dcaf 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -30,7 +30,7 @@ #include "libavutil/version.h" #define LIBAVFORMAT_VERSION_MAJOR 56 -#define LIBAVFORMAT_VERSION_MINOR 32 +#define LIBAVFORMAT_VERSION_MINOR 33 #define LIBAVFORMAT_VERSION_MICRO 100 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \