summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2008-11-15 20:17:19 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2008-11-15 20:17:19 +0000
commit86b0affd0895235b9aab8ef1edd5f182000fabd2 (patch)
tree7c333c3c34274b4b1802c10e2ac148386bd8a715 /libavformat
parent8f569ed08faa39414ebd65c2e530a87dc9007d5b (diff)
simplify metadata reading
Originally committed as revision 15830 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/mov.c56
1 files changed, 20 insertions, 36 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 32cb90996b..c779a39157 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -1366,46 +1366,26 @@ static int mov_read_trak(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
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 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
{ 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 }
};