use new metadata API in rm (de)muxer
authorAurelien Jacobs <aurel@gnuage.org>
Tue, 17 Feb 2009 21:40:38 +0000 (21:40 +0000)
committerAurelien Jacobs <aurel@gnuage.org>
Tue, 17 Feb 2009 21:40:38 +0000 (21:40 +0000)
Originally committed as revision 17396 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/Makefile
libavformat/rm.c [new file with mode: 0644]
libavformat/rm.h
libavformat/rmdec.c
libavformat/rmenc.c

index 110a047..91c7fff 100644 (file)
@@ -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 (file)
index 0000000..9911aac
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * "Real" compatible muxer and demuxer common code.
+ * 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
+ */
+
+#include "rm.h"
+
+const char *ff_rm_metadata[4] = {
+    "title",
+    "author",
+    "copyright",
+    "comment"
+};
index 4d019f7..6e5d2c5 100644 (file)
@@ -24,6 +24,8 @@
 
 #include "avformat.h"
 
+extern const char *ff_rm_metadata[4];
+
 typedef struct RMStream RMStream;
 
 RMStream *ff_rm_alloc_rmstream (void);
index 1285d35..6bcf08a 100644 (file)
@@ -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; i<FF_ARRAY_ELEMS(ff_rm_metadata); i++) {
+        int len = wide ? get_be16(s->pb) : 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);
index b04b0e3..78b180f 100644 (file)
@@ -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; i<FF_ARRAY_ELEMS(ff_rm_metadata); i++) {
+        tag = av_metadata_get(ctx->metadata, 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; i<FF_ARRAY_ELEMS(ff_rm_metadata); i++) {
+        tag = av_metadata_get(ctx->metadata, ff_rm_metadata[i], NULL, 0);
+        put_str(s, tag ? tag->value : "");
+    }
 
     for(i=0;i<ctx->nb_streams;i++) {
         int codec_data_size;