changeset 4028:7d6ed3692203 libavformat

simplify metadata reading
author bcoudurier
date Sat, 15 Nov 2008 20:17:19 +0000
parents 11fbf47f3e16
children 9a0a46d465ae
files mov.c
diffstat 1 files changed, 20 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/mov.c	Sat Nov 15 15:34:51 2008 +0000
+++ b/mov.c	Sat Nov 15 20:17:19 2008 +0000
@@ -1366,46 +1366,26 @@
     return 0;
 }
 
-static void mov_parse_udta_string(ByteIOContext *pb, char *str, int size)
+static int mov_read_udta_string(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
 {
+    char *str = NULL;
+    int size;
     uint16_t str_size = get_be16(pb); /* string length */;
 
+    switch (atom.type) {
+    case MKTAG(0xa9,'n','a','m'):
+        str = c->fc->title; size = sizeof(c->fc->title); break;
+    case MKTAG(0xa9,'w','r','t'):
+        str = c->fc->author; size = sizeof(c->fc->author); break;
+    case MKTAG(0xa9,'c','p','y'):
+        str = c->fc->copyright; size = sizeof(c->fc->copyright); break;
+    case MKTAG(0xa9,'i','n','f'):
+        str = c->fc->comment; size = sizeof(c->fc->comment); break;
+    }
+    if (!str)
+        return 0;
     get_be16(pb); /* skip language */
     get_buffer(pb, str, FFMIN(size, str_size));
-}
-
-static int mov_read_udta(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
-{
-    uint64_t end = url_ftell(pb) + atom.size;
-
-    while (url_ftell(pb) + 8 < end) {
-        uint32_t tag_size = get_be32(pb);
-        uint32_t tag      = get_le32(pb);
-        uint64_t next     = url_ftell(pb) + tag_size - 8;
-
-        if (tag_size < 8 || next > end) // stop if tag_size is wrong
-            break;
-
-        switch (tag) {
-        case MKTAG(0xa9,'n','a','m'):
-            mov_parse_udta_string(pb, c->fc->title,     sizeof(c->fc->title));
-            break;
-        case MKTAG(0xa9,'w','r','t'):
-            mov_parse_udta_string(pb, c->fc->author,    sizeof(c->fc->author));
-            break;
-        case MKTAG(0xa9,'c','p','y'):
-            mov_parse_udta_string(pb, c->fc->copyright, sizeof(c->fc->copyright));
-            break;
-        case MKTAG(0xa9,'i','n','f'):
-            mov_parse_udta_string(pb, c->fc->comment,   sizeof(c->fc->comment));
-            break;
-        default:
-            break;
-        }
-
-        url_fseek(pb, next, SEEK_SET);
-    }
-
     return 0;
 }
 
@@ -1740,11 +1720,15 @@
 { MKTAG('t','r','a','f'), mov_read_default },
 { MKTAG('t','r','e','x'), mov_read_trex },
 { MKTAG('t','r','u','n'), mov_read_trun },
-{ MKTAG('u','d','t','a'), mov_read_udta },
+{ MKTAG('u','d','t','a'), mov_read_default },
 { MKTAG('w','a','v','e'), mov_read_wave },
 { MKTAG('e','s','d','s'), mov_read_esds },
 { MKTAG('w','i','d','e'), mov_read_wide }, /* place holder */
 { MKTAG('c','m','o','v'), mov_read_cmov },
+{ MKTAG(0xa9,'n','a','m'), mov_read_udta_string },
+{ MKTAG(0xa9,'w','r','t'), mov_read_udta_string },
+{ MKTAG(0xa9,'c','p','y'), mov_read_udta_string },
+{ MKTAG(0xa9,'i','n','f'), mov_read_udta_string },
 { 0, NULL }
 };