diff --git a/libavformat/Makefile b/libavformat/Makefile index 1a5bb1f787..10a461ccdc 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -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 diff --git a/libavformat/metadata.h b/libavformat/metadata.h index 2826ecc72e..88c9c86626 100644 --- a/libavformat/metadata.h +++ b/libavformat/metadata.h @@ -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 index 0000000000..8b1e5eba6d --- /dev/null +++ b/libavformat/metadata_compat.c @@ -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 --git a/libavformat/utils.c b/libavformat/utils.c index 8a6784a2a4..3f26aee991 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -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: