Mercurial > libavformat.hg
changeset 4179:c32a783ff374 libavformat
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.
author | aurel |
---|---|
date | Thu, 08 Jan 2009 23:24:51 +0000 |
parents | 84da7f1e6901 |
children | 0df2e345a1a8 |
files | Makefile metadata.h metadata_compat.c utils.c |
diffstat | 4 files changed, 111 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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
--- /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 <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 */