support for 3gp metadata
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>
Wed, 11 Jun 2008 09:40:22 +0000 (09:40 +0000)
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>
Wed, 11 Jun 2008 09:40:22 +0000 (09:40 +0000)
Originally committed as revision 13746 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/movenc.c

index 5a4a141..b123d78 100644 (file)
@@ -1216,6 +1216,26 @@ static uint16_t language_code(const char *str)
     return (((str[0]-0x60) & 0x1F) << 10) + (((str[1]-0x60) & 0x1F) << 5) + ((str[2]-0x60) & 0x1F);
 }
 
+static int mov_write_3gp_udta_tag(ByteIOContext *pb, AVFormatContext *s,
+                                  const char *tag, const char *str)
+{
+    offset_t pos = url_ftell(pb);
+    if (!utf8len(str))
+        return 0;
+    put_be32(pb, 0);   /* size */
+    put_tag (pb, tag); /* type */
+    put_be32(pb, 0);   /* version + flags */
+    if (!strcmp(tag, "yrrc"))
+        put_be16(pb, s->year);
+    else {
+        put_be16(pb, language_code("eng")); /* language */
+        ascii_to_wc(pb, str);
+        if (!strcmp(tag, "albm") && s->year)
+            put_byte(pb, s->year);
+    }
+    return updateSize(pb, pos);
+}
+
 static int mov_write_udta_tag(ByteIOContext *pb, MOVContext *mov,
                               AVFormatContext *s)
 {
@@ -1235,6 +1255,14 @@ static int mov_write_udta_tag(ByteIOContext *pb, MOVContext *mov,
         put_be32(pb, 0); /* size */
         put_tag(pb, "udta");
 
+        if (mov->mode == MODE_3GP || mov->mode == MODE_3G2) {
+            mov_write_3gp_udta_tag(pb, s, "titl", s->title);
+            mov_write_3gp_udta_tag(pb, s, "auth", s->author);
+            mov_write_3gp_udta_tag(pb, s, "gnre", s->genre);
+            mov_write_3gp_udta_tag(pb, s, "dscp", s->comment);
+            mov_write_3gp_udta_tag(pb, s, "albm", s->album);
+            mov_write_3gp_udta_tag(pb, s, "yrrc", "nil");
+        } else {
         /* iTunes meta data */
         mov_write_meta_tag(pb, mov, s);
 
@@ -1247,7 +1275,7 @@ static int mov_write_udta_tag(ByteIOContext *pb, MOVContext *mov,
             mov_write_string_tag(pb, "\251des", s->comment       , 0);
             mov_write_string_tag(pb, "\251gen", s->genre         , 0);
         }
-
+        }
         return updateSize(pb, pos);
     }
 
@@ -1330,7 +1358,7 @@ static int mov_write_moov_tag(ByteIOContext *pb, MOVContext *mov,
 
     if (mov->mode == MODE_PSP)
         mov_write_uuidusmt_tag(pb, s);
-    else if (mov->mode != MODE_3GP && mov->mode != MODE_3G2)
+    else
         mov_write_udta_tag(pb, mov, s);
 
     return updateSize(pb, pos);