# HG changeset patch # User aurel # Date 1231457091 0 # Node ID c32a783ff3748fdce5c241c7983f84df2b6c35d0 # Parent 84da7f1e69013e60ce9df2430dfc39209c5d4fee Add a second metadata compatibility layer, so that metadata that gets demuxed with new API is automatically converted to the old API, allowing old applications to stay functional. diff -r 84da7f1e6901 -r c32a783ff374 Makefile --- a/Makefile Thu Jan 08 18:00:51 2009 +0000 +++ b/Makefile Thu Jan 08 23:24:51 2009 +0000 @@ -5,7 +5,7 @@ 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 -r 84da7f1e6901 -r c32a783ff374 metadata.h --- a/metadata.h Thu Jan 08 18:00:51 2009 +0000 +++ b/metadata.h Thu Jan 08 23:24:51 2009 +0000 @@ -36,6 +36,7 @@ }; #if LIBAVFORMAT_VERSION_MAJOR < 53 +void ff_metadata_demux_compat(AVFormatContext *s); void ff_metadata_sync_compat(AVFormatContext *s); #endif diff -r 84da7f1e6901 -r c32a783ff374 metadata_compat.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/metadata_compat.c Thu Jan 08 23:24:51 2009 +0000 @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2009 Aurelien Jacobs + * + * 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 +#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; jcount; j++) + for (i=0; ielems[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; inb_chapters; i++) + if ((m = ctx->chapters[i]->metadata)) + for (j=0; jcount; 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; inb_programs; i++) + if ((m = ctx->programs[i]->metadata)) + for (j=0; jcount; 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; inb_streams; i++) + if ((m = ctx->streams[i]->metadata)) + for (j=0; jcount; 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 -r 84da7f1e6901 -r c32a783ff374 utils.c --- a/utils.c Thu Jan 08 18:00:51 2009 +0000 +++ b/utils.c Thu Jan 08 23:24:51 2009 +0000 @@ -485,6 +485,10 @@ 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: