diff options
author | James Almer <jamrial@gmail.com> | 2017-05-27 18:58:15 -0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2017-06-11 15:28:34 -0300 |
commit | e3887c0a2c57622bbd59bea1b19813ac506b16a7 (patch) | |
tree | 1dd153bd35469919b28d958e202bca9c920c998c | |
parent | 2e44126363bc9e23093ceced5d7bde1ee4bbb338 (diff) | |
download | ffmpeg-e3887c0a2c57622bbd59bea1b19813ac506b16a7.tar.gz |
avformat/mov: add support for reading VP Codec Configuration Box
As defined in "VP Codec ISO Media File Format Binding v1.0"
https://github.com/webmproject/vp9-dash/blob/master/VPCodecISOMediaFileFormatBinding.md
Signed-off-by: James Almer <jamrial@gmail.com>
-rw-r--r-- | libavformat/mov.c | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index d7d64c3361..63f84be782 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -4635,6 +4635,50 @@ static int mov_read_tmcd(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_vpcc(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + AVStream *st; + int version, color_range, color_primaries, color_trc, color_space; + + if (c->fc->nb_streams < 1) + return 0; + st = c->fc->streams[c->fc->nb_streams - 1]; + + if (atom.size < 5) { + av_log(c->fc, AV_LOG_ERROR, "Empty VP Codec Configuration box\n"); + return AVERROR_INVALIDDATA; + } + + version = avio_r8(pb); + if (version != 1) { + av_log(c->fc, AV_LOG_WARNING, "Unsupported VP Codec Configuration box version %d\n", version); + return 0; + } + avio_skip(pb, 3); /* flags */ + + avio_skip(pb, 2); /* profile + level */ + color_range = avio_r8(pb); /* bitDepth, chromaSubsampling, videoFullRangeFlag */ + color_primaries = avio_r8(pb); + color_trc = avio_r8(pb); + color_space = avio_r8(pb); + if (avio_rb16(pb)) /* codecIntializationDataSize */ + return AVERROR_INVALIDDATA; + + if (!av_color_primaries_name(color_primaries)) + color_primaries = AVCOL_PRI_UNSPECIFIED; + if (!av_color_transfer_name(color_trc)) + color_trc = AVCOL_TRC_UNSPECIFIED; + if (!av_color_space_name(color_space)) + color_space = AVCOL_SPC_UNSPECIFIED; + + st->codecpar->color_range = (color_range & 1) ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG; + st->codecpar->color_primaries = color_primaries; + st->codecpar->color_trc = color_trc; + st->codecpar->color_space = color_space; + + return 0; +} + static int mov_read_smdm(MOVContext *c, AVIOContext *pb, MOVAtom atom) { MOVStreamContext *sc; @@ -5501,6 +5545,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('d','O','p','s'), mov_read_dops }, { MKTAG('S','m','D','m'), mov_read_smdm }, { MKTAG('C','o','L','L'), mov_read_coll }, +{ MKTAG('v','p','c','C'), mov_read_vpcc }, { 0, NULL } }; |