Add a second metadata compatibility layer, so that metadata that gets
authorAurelien Jacobs <aurel@gnuage.org>
Thu, 8 Jan 2009 23:24:51 +0000 (23:24 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Thu, 8 Jan 2009 23:24:51 +0000 (23:24 +0000)
demuxed with new API is automatically converted to the old API,
allowing old applications to stay functional.

Originally committed as revision 16499 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/Makefile
libavformat/metadata.h
libavformat/metadata_compat.c [new file with mode: 0644]
libavformat/utils.c

index 1a5bb1f..10a461c 100644 (file)
@@ -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
index 2826ecc..88c9c86 100644 (file)
@@ -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 (file)
index 0000000..8b1e5eb
--- /dev/null
@@ -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 */
index 8a6784a..3f26aee 100644 (file)
@@ -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: