From 7379d5bc0be5a1babfce8cd518c2329f05af3087 Mon Sep 17 00:00:00 2001 From: Aurelien Jacobs Date: Tue, 17 Feb 2009 21:40:38 +0000 Subject: [PATCH] use new metadata API in rm (de)muxer Originally committed as revision 17396 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavformat/Makefile | 4 ++-- libavformat/rm.c | 29 +++++++++++++++++++++++++++++ libavformat/rm.h | 2 ++ libavformat/rmdec.c | 27 ++++++++++++++------------- libavformat/rmenc.c | 16 ++++++++++------ 5 files changed, 57 insertions(+), 21 deletions(-) create mode 100644 libavformat/rm.c diff --git a/libavformat/Makefile b/libavformat/Makefile index 110a047bbe..91c7fff253 100644 --- a/libavformat/Makefile +++ b/libavformat/Makefile @@ -155,8 +155,8 @@ OBJS-$(CONFIG_RAWVIDEO_DEMUXER) += raw.o OBJS-$(CONFIG_RAWVIDEO_MUXER) += raw.o OBJS-$(CONFIG_REDIR_DEMUXER) += rtsp.o OBJS-$(CONFIG_RL2_DEMUXER) += rl2.o -OBJS-$(CONFIG_RM_DEMUXER) += rmdec.o -OBJS-$(CONFIG_RM_MUXER) += rmenc.o +OBJS-$(CONFIG_RM_DEMUXER) += rmdec.o rm.o +OBJS-$(CONFIG_RM_MUXER) += rmenc.o rm.o OBJS-$(CONFIG_ROQ_DEMUXER) += idroq.o OBJS-$(CONFIG_ROQ_MUXER) += raw.o OBJS-$(CONFIG_RPL_DEMUXER) += rpl.o diff --git a/libavformat/rm.c b/libavformat/rm.c new file mode 100644 index 0000000000..9911aac91e --- /dev/null +++ b/libavformat/rm.c @@ -0,0 +1,29 @@ +/* + * "Real" compatible muxer and demuxer common code. + * 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 + */ + +#include "rm.h" + +const char *ff_rm_metadata[4] = { + "title", + "author", + "copyright", + "comment" +}; diff --git a/libavformat/rm.h b/libavformat/rm.h index 4d019f704d..6e5d2c5f7e 100644 --- a/libavformat/rm.h +++ b/libavformat/rm.h @@ -24,6 +24,8 @@ #include "avformat.h" +extern const char *ff_rm_metadata[4]; + typedef struct RMStream RMStream; RMStream *ff_rm_alloc_rmstream (void); diff --git a/libavformat/rmdec.c b/libavformat/rmdec.c index 1285d35c37..6bcf08ab50 100644 --- a/libavformat/rmdec.c +++ b/libavformat/rmdec.c @@ -72,6 +72,17 @@ static void get_str8(ByteIOContext *pb, char *buf, int buf_size) get_strl(pb, buf, buf_size, get_byte(pb)); } +static void rm_read_metadata(AVFormatContext *s, int wide) +{ + char buf[1024]; + int i; + for (i=0; ipb) : get_byte(s->pb); + get_strl(s->pb, buf, sizeof(buf), len); + av_metadata_set(&s->metadata, ff_rm_metadata[i], buf); + } +} + RMStream *ff_rm_alloc_rmstream (void) { RMStream *rms = av_mallocz(sizeof(RMStream)); @@ -95,10 +106,7 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb, if (((version >> 16) & 0xff) == 3) { int64_t startpos = url_ftell(pb); url_fskip(pb, 14); - get_str8(pb, s->title, sizeof(s->title)); - get_str8(pb, s->author, sizeof(s->author)); - get_str8(pb, s->copyright, sizeof(s->copyright)); - get_str8(pb, s->comment, sizeof(s->comment)); + rm_read_metadata(s, 0); if ((startpos + (version & 0xffff)) >= url_ftell(pb) + 2) { // fourcc (should always be "lpcJ") get_byte(pb); @@ -213,11 +221,7 @@ static int rm_read_audio_stream_info(AVFormatContext *s, ByteIOContext *pb, get_byte(pb); get_byte(pb); get_byte(pb); - - get_str8(pb, s->title, sizeof(s->title)); - get_str8(pb, s->author, sizeof(s->author)); - get_str8(pb, s->copyright, sizeof(s->copyright)); - get_str8(pb, s->comment, sizeof(s->comment)); + rm_read_metadata(s, 0); } } return 0; @@ -364,10 +368,7 @@ static int rm_read_header(AVFormatContext *s, AVFormatParameters *ap) flags = get_be16(pb); /* flags */ break; case MKTAG('C', 'O', 'N', 'T'): - get_str16(pb, s->title, sizeof(s->title)); - get_str16(pb, s->author, sizeof(s->author)); - get_str16(pb, s->copyright, sizeof(s->copyright)); - get_str16(pb, s->comment, sizeof(s->comment)); + rm_read_metadata(s, 1); break; case MKTAG('M', 'D', 'P', 'R'): st = av_new_stream(s, 0); diff --git a/libavformat/rmenc.c b/libavformat/rmenc.c index b04b0e3f46..78b180f5fc 100644 --- a/libavformat/rmenc.c +++ b/libavformat/rmenc.c @@ -70,6 +70,7 @@ static void rv10_write_header(AVFormatContext *ctx, const char *desc, *mimetype; int nb_packets, packet_total_size, packet_max_size, size, packet_avg_size, i; int bit_rate, v, duration, flags, data_pos; + AVMetadataTag *tag; start_ptr = s->buf_ptr; @@ -123,14 +124,17 @@ static void rv10_write_header(AVFormatContext *ctx, /* comments */ put_tag(s,"CONT"); - size = strlen(ctx->title) + strlen(ctx->author) + strlen(ctx->copyright) + - strlen(ctx->comment) + 4 * 2 + 10; + size = 4 * 2 + 10; + for(i=0; imetadata, ff_rm_metadata[i], NULL, 0); + if(tag) size += strlen(tag->value); + } put_be32(s,size); put_be16(s,0); - put_str(s, ctx->title); - put_str(s, ctx->author); - put_str(s, ctx->copyright); - put_str(s, ctx->comment); + for(i=0; imetadata, ff_rm_metadata[i], NULL, 0); + put_str(s, tag ? tag->value : ""); + } for(i=0;inb_streams;i++) { int codec_data_size;