aboutsummaryrefslogtreecommitdiffstats
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorhaim alon <haim.alter@gmail.com>2009-09-26 20:51:38 +0000
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2009-09-26 20:51:38 +0000
commit7b5252ce3e85be727c1f8cd49e2b8d942fc087d9 (patch)
treec62a758a72538f34f8a22e58726de42f134c46d9 /libavformat/mov.c
parentf331cec47dcb177e9582937a7a96f95e3a7a0901 (diff)
downloadffmpeg-7b5252ce3e85be727c1f8cd49e2b8d942fc087d9.tar.gz
Export mov/mp4 major and compatible brands as metadata.
Patch by haim alon, haim dot alter at gmail dot com Originally committed as revision 20032 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c30
1 files changed, 25 insertions, 5 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index dc22597624..ce5ea788b8 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -490,15 +490,35 @@ static int mov_read_mdat(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
return 0; /* now go for moov */
}
+/* read major brand, minor version and compatible brands and store them as metadata */
static int mov_read_ftyp(MOVContext *c, ByteIOContext *pb, MOVAtom atom)
{
- uint32_t type = get_le32(pb);
-
- if (type != MKTAG('q','t',' ',' '))
+ uint32_t minor_ver;
+ int comp_brand_size;
+ char minor_ver_str[11]; /* 32 bit integer -> 10 digits + null */
+ char* comp_brands_str;
+ uint8_t type[5] = {0};
+
+ get_buffer(pb, type, 4);
+ if (strcmp(type, "qt, "))
c->isom = 1;
av_log(c->fc, AV_LOG_DEBUG, "ISO: File Type Major Brand: %.4s\n",(char *)&type);
- get_be32(pb); /* minor version */
- url_fskip(pb, atom.size - 8);
+ av_metadata_set(&c->fc->metadata, "major_brand", type);
+ minor_ver = get_be32(pb); /* minor version */
+ snprintf(minor_ver_str, sizeof(minor_ver_str), "%d", minor_ver);
+ av_metadata_set(&c->fc->metadata, "minor_version", minor_ver_str);
+
+ comp_brand_size = atom.size - 8;
+ if (comp_brand_size < 0)
+ return -1;
+ comp_brands_str = av_malloc(comp_brand_size + 1); /* Add null terminator */
+ if (!comp_brands_str)
+ return AVERROR(ENOMEM);
+ get_buffer(pb, comp_brands_str, comp_brand_size);
+ comp_brands_str[comp_brand_size] = 0;
+ av_metadata_set(&c->fc->metadata, "compatible_brands", comp_brands_str);
+ av_freep(&comp_brands_str);
+
return 0;
}