Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavformat/Makefile2
-rw-r--r--libavformat/metadata.h1
-rw-r--r--libavformat/metadata_compat.c105
-rw-r--r--libavformat/utils.c4
4 files changed, 111 insertions, 1 deletions
diff --git a/libavformat/Makefile b/libavformat/Makefile
index 1a5bb1f787..10a461ccdc 100644
--- a/libavformat/Makefile
+++ b/libavformat/Makefile
@@ -5,7 +5,7 @@ FFLIBS = avcodec avutil
HEADERS = avformat.h avio.h rtsp.h rtspcodes.h
-OBJS = allformats.o cutils.o metadata.o os_support.o sdp.o utils.o
+OBJS = allformats.o cutils.o metadata.o metadata_compat.o os_support.o sdp.o utils.o
# muxers/demuxers
OBJS-$(CONFIG_AAC_DEMUXER) += raw.o
diff --git a/libavformat/metadata.h b/libavformat/metadata.h
index 2826ecc72e..88c9c86626 100644
--- a/libavformat/metadata.h
+++ b/libavformat/metadata.h
@@ -36,6 +36,7 @@ struct AVMetadata{
};
#if LIBAVFORMAT_VERSION_MAJOR < 53
+void ff_metadata_demux_compat(AVFormatContext *s);
void ff_metadata_sync_compat(AVFormatContext *s);
#endif
diff --git a/libavformat/metadata_compat.c b/libavformat/metadata_compat.c
new file mode 100644
index 0000000000..8b1e5eba6d
--- /dev/null
+++ b/libavformat/metadata_compat.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2009 Aurelien Jacobs <aurel@gnuage.org>
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#if LIBAVFORMAT_VERSION_MAJOR < 53
+
+#include <strings.h>
+#include "metadata.h"
+#include "libavutil/avstring.h"
+
+#define SIZE_OFFSET(x) sizeof(((AVFormatContext*)0)->x),offsetof(AVFormatContext,x)
+
+static const struct {
+ const char name[16];
+ int size;
+ int offset;
+} compat_tab[] = {
+ { "title", SIZE_OFFSET(title) },
+ { "author", SIZE_OFFSET(author) },
+ { "copyright", SIZE_OFFSET(copyright) },
+ { "comment", SIZE_OFFSET(comment) },
+ { "album", SIZE_OFFSET(album) },
+ { "year", SIZE_OFFSET(year) },
+ { "track", SIZE_OFFSET(track) },
+ { "genre", SIZE_OFFSET(genre) },
+
+ { "artist", SIZE_OFFSET(author) },
+ { "creator", SIZE_OFFSET(author) },
+ { "written_by", SIZE_OFFSET(author) },
+ { "lead_performer", SIZE_OFFSET(author) },
+ { "description", SIZE_OFFSET(comment) },
+ { "albumtitle", SIZE_OFFSET(album) },
+ { "date_written", SIZE_OFFSET(year) },
+ { "date_released", SIZE_OFFSET(year) },
+ { "tracknumber", SIZE_OFFSET(track) },
+ { "part_number", SIZE_OFFSET(track) },
+};
+
+void ff_metadata_demux_compat(AVFormatContext *ctx)
+{
+ AVMetadata *m;
+ int i, j;
+
+ if ((m = ctx->metadata))
+ for (j=0; j<m->count; j++)
+ for (i=0; i<FF_ARRAY_ELEMS(compat_tab); i++)
+ if (!strcasecmp(m->elems[j].key, compat_tab[i].name)) {
+ int *ptr = (int *)((char *)ctx+compat_tab[i].offset);
+ if (*ptr) continue;
+ if (compat_tab[i].size > sizeof(int))
+ av_strlcpy((char *)ptr, m->elems[j].value, compat_tab[i].size);
+ else
+ *ptr = atoi(m->elems[j].value);
+ }
+
+ for (i=0; i<ctx->nb_chapters; i++)
+ if ((m = ctx->chapters[i]->metadata))
+ for (j=0; j<m->count; j++)
+ if (!strcasecmp(m->elems[j].key, "title")) {
+ av_free(ctx->chapters[i]->title);
+ ctx->chapters[i]->title = av_strdup(m->elems[j].value);
+ }
+
+ for (i=0; i<ctx->nb_programs; i++)
+ if ((m = ctx->programs[i]->metadata))
+ for (j=0; j<m->count; j++) {
+ if (!strcasecmp(m->elems[j].key, "name")) {
+ av_free(ctx->programs[i]->name);
+ ctx->programs[i]->name = av_strdup(m->elems[j].value);
+ }
+ if (!strcasecmp(m->elems[j].key, "provider_name")) {
+ av_free(ctx->programs[i]->provider_name);
+ ctx->programs[i]->provider_name = av_strdup(m->elems[j].value);
+ }
+ }
+
+ for (i=0; i<ctx->nb_streams; i++)
+ if ((m = ctx->streams[i]->metadata))
+ for (j=0; j<m->count; j++) {
+ if (!strcasecmp(m->elems[j].key, "language"))
+ av_strlcpy(ctx->streams[i]->language, m->elems[j].value, 4);
+ if (!strcasecmp(m->elems[j].key, "filename")) {
+ av_free(ctx->streams[i]->filename);
+ ctx->streams[i]->filename= av_strdup(m->elems[j].value);
+ }
+ }
+}
+
+#endif /* LIBAVFORMAT_VERSION_MAJOR < 53 */
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 8a6784a2a4..3f26aee991 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -485,6 +485,10 @@ int av_open_input_stream(AVFormatContext **ic_ptr,
if (pb && !ic->data_offset)
ic->data_offset = url_ftell(ic->pb);
+#if LIBAVFORMAT_VERSION_MAJOR < 53
+ ff_metadata_demux_compat(ic);
+#endif
+
*ic_ptr = ic;
return 0;
fail: