summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/internal.h6
-rw-r--r--libavformat/utils.c5
2 files changed, 10 insertions, 1 deletions
diff --git a/libavformat/internal.h b/libavformat/internal.h
index c6adf7b872..240de9e289 100644
--- a/libavformat/internal.h
+++ b/libavformat/internal.h
@@ -42,6 +42,12 @@
# define hex_dump_debug(class, buf, size) do { if (0) av_hex_dump_log(class, AV_LOG_DEBUG, buf, size); } while(0)
#endif
+/**
+ * For an AVInputFormat with this flag set read_close() needs to be called
+ * by the caller upon read_header() failure.
+ */
+#define FF_FMT_INIT_CLEANUP (1 << 0)
+
typedef struct AVCodecTag {
enum AVCodecID id;
unsigned int tag;
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 0df14682a4..998fddf270 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -566,8 +566,11 @@ int avformat_open_input(AVFormatContext **ps, const char *filename,
ff_id3v2_read_dict(s->pb, &s->internal->id3v2_meta, ID3v2_DEFAULT_MAGIC, &id3v2_extra_meta);
if (s->iformat->read_header)
- if ((ret = s->iformat->read_header(s)) < 0)
+ if ((ret = s->iformat->read_header(s)) < 0) {
+ if (s->iformat->flags_internal & FF_FMT_INIT_CLEANUP)
+ goto close;
goto fail;
+ }
if (!s->metadata) {
s->metadata = s->internal->id3v2_meta;