[FFmpeg-cvslog] r16499 - in trunk/libavformat: Makefile metadata.h metadata_compat.c utils.c

aurel subversion
Fri Jan 9 00:24:51 CET 2009


Author: aurel
Date: Fri Jan  9 00:24:51 2009
New Revision: 16499

Log:
Add a second metadata compatibility layer, so that metadata that get
demuxed with new API is automatically converted to old API, allowing
old applications to stay functionnal.

Added:
   trunk/libavformat/metadata_compat.c
Modified:
   trunk/libavformat/Makefile
   trunk/libavformat/metadata.h
   trunk/libavformat/utils.c

Modified: trunk/libavformat/Makefile
==============================================================================
--- trunk/libavformat/Makefile	Thu Jan  8 20:30:10 2009	(r16498)
+++ trunk/libavformat/Makefile	Fri Jan  9 00:24:51 2009	(r16499)
@@ -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

Modified: trunk/libavformat/metadata.h
==============================================================================
--- trunk/libavformat/metadata.h	Thu Jan  8 20:30:10 2009	(r16498)
+++ trunk/libavformat/metadata.h	Fri Jan  9 00:24:51 2009	(r16499)
@@ -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
 

Added: trunk/libavformat/metadata_compat.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ trunk/libavformat/metadata_compat.c	Fri Jan  9 00:24:51 2009	(r16499)
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2009  Aurelien Jacobs <aurel at 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 */

Modified: trunk/libavformat/utils.c
==============================================================================
--- trunk/libavformat/utils.c	Thu Jan  8 20:30:10 2009	(r16498)
+++ trunk/libavformat/utils.c	Fri Jan  9 00:24:51 2009	(r16499)
@@ -485,6 +485,10 @@ int av_open_input_stream(AVFormatContext
     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:




More information about the ffmpeg-cvslog mailing list