[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