summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-05-11 17:45:13 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-05-11 21:55:18 +0200
commit541d75f9a0b6e1b360345e289cb44e43a39643cd (patch)
tree48051441b995a9637db2ed0461145cd325f2f2c9 /libavformat
parent0382c94f13b4b20456b7259e90b170dc020419b8 (diff)
avformat: add callback for opening further files
Previous version reviewed-by: wm4 <nfxjfg@googlemail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/avformat.h21
-rw-r--r--libavformat/avio_internal.h3
-rw-r--r--libavformat/aviobuf.c6
-rw-r--r--libavformat/utils.c1
-rw-r--r--libavformat/version.h2
5 files changed, 32 insertions, 1 deletions
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, \