summaryrefslogtreecommitdiff
path: root/libavformat/mov.c
diff options
context:
space:
mode:
authorMartin Storsjö <martin@martin.st>2012-01-22 01:32:16 +0200
committerMartin Storsjö <martin@martin.st>2012-02-02 21:39:27 +0200
commit89415b8e3fb83d67fdc518323cc364aa74ec2af2 (patch)
tree0e3a34340bb161b031b95644e5f312325b8708d3 /libavformat/mov.c
parentcd2f98f365dfd83f0debac030413e57a73c7ecd5 (diff)
movdec: Parse the dvc1 atom
Normally, the actual payload data contains sequence headers, too, and the parser can extract this and set it as extradata. However, the data in the dvc1 atom is the "official" extradata for the file. This is required for proper stream copy of vc1 from ismv to ismv. Signed-off-by: Martin Storsjö <martin@martin.st>
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r--libavformat/mov.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c
index 3c1927ff33..d0e01f8e57 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -971,6 +971,32 @@ static int mov_read_glbl(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return 0;
}
+static int mov_read_dvc1(MOVContext *c, AVIOContext *pb, MOVAtom atom)
+{
+ AVStream *st;
+ uint8_t profile_level;
+
+ if (c->fc->nb_streams < 1)
+ return 0;
+ st = c->fc->streams[c->fc->nb_streams-1];
+
+ if (atom.size >= (1<<28) || atom.size < 7)
+ return AVERROR_INVALIDDATA;
+
+ profile_level = avio_r8(pb);
+ if (profile_level & 0xf0 != 0xc0)
+ return 0;
+
+ av_free(st->codec->extradata);
+ st->codec->extradata = av_mallocz(atom.size - 7 + FF_INPUT_BUFFER_PADDING_SIZE);
+ if (!st->codec->extradata)
+ return AVERROR(ENOMEM);
+ st->codec->extradata_size = atom.size - 7;
+ avio_seek(pb, 6, SEEK_CUR);
+ avio_read(pb, st->codec->extradata, st->codec->extradata_size);
+ return 0;
+}
+
/**
* An strf atom is a BITMAPINFOHEADER struct. This struct is 40 bytes itself,
* but can have extradata appended at the end after the 40 bytes belonging
@@ -2435,6 +2461,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = {
{ MKTAG('w','f','e','x'), mov_read_wfex },
{ MKTAG('c','m','o','v'), mov_read_cmov },
{ MKTAG('c','h','a','n'), mov_read_chan }, /* channel layout */
+{ MKTAG('d','v','c','1'), mov_read_dvc1 },
{ 0, NULL }
};