diff options
author | James Almer <jamrial@gmail.com> | 2017-04-22 06:34:37 +0300 |
---|---|---|
committer | James Almer <jamrial@gmail.com> | 2017-05-27 22:14:24 +0300 |
commit | 24133973fc242a2a911237957873af65ef20d086 (patch) | |
tree | 8e10d2908bd358d45747415351898036278322d3 /libavformat | |
parent | ab05bd6e6cae0a0a20cd2bc591ac2d9eb8afbf17 (diff) |
avformat/mov: add support for reading Content Light Level Box
As defined in "VP Codec ISO Media File Format Binding v1.0"
https://github.com/webmproject/vp9-dash/blob/master/VPCodecISOMediaFileFormatBinding.md
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc>
Signed-off-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/isom.h | 2 | ||||
-rw-r--r-- | libavformat/mov.c | 43 |
2 files changed, 45 insertions, 0 deletions
diff --git a/libavformat/isom.h b/libavformat/isom.h index 426f732247..ff009b0896 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -196,6 +196,8 @@ typedef struct MOVStreamContext { AVSphericalMapping *spherical; size_t spherical_size; AVMasteringDisplayMetadata *mastering; + AVContentLightMetadata *coll; + size_t coll_size; uint32_t format; diff --git a/libavformat/mov.c b/libavformat/mov.c index 7535bb9925..3845e63b53 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -4658,6 +4658,38 @@ static int mov_read_smdm(MOVContext *c, AVIOContext *pb, MOVAtom atom) return 0; } +static int mov_read_coll(MOVContext *c, AVIOContext *pb, MOVAtom atom) +{ + MOVStreamContext *sc; + int version; + + if (c->fc->nb_streams < 1) + return AVERROR_INVALIDDATA; + + sc = c->fc->streams[c->fc->nb_streams - 1]->priv_data; + + if (atom.size < 5) { + av_log(c->fc, AV_LOG_ERROR, "Empty Content Light Level box\n"); + return AVERROR_INVALIDDATA; + } + + version = avio_r8(pb); + if (version) { + av_log(c->fc, AV_LOG_WARNING, "Unsupported Content Light Level box version %d\n", version); + return 0; + } + avio_skip(pb, 3); /* flags */ + + sc->coll = av_content_light_metadata_alloc(&sc->coll_size); + if (!sc->coll) + return AVERROR(ENOMEM); + + sc->coll->MaxCLL = avio_rb16(pb); + sc->coll->MaxFALL = avio_rb16(pb); + + return 0; +} + static int mov_read_st3d(MOVContext *c, AVIOContext *pb, MOVAtom atom) { AVStream *st; @@ -5445,6 +5477,7 @@ static const MOVParseTableEntry mov_default_parse_table[] = { { MKTAG('s','v','3','d'), mov_read_sv3d }, /* spherical video box */ { MKTAG('d','O','p','s'), mov_read_dops }, { MKTAG('S','m','D','m'), mov_read_smdm }, +{ MKTAG('C','o','L','L'), mov_read_coll }, { 0, NULL } }; @@ -5870,6 +5903,7 @@ static int mov_read_close(AVFormatContext *s) av_freep(&sc->stereo3d); av_freep(&sc->spherical); av_freep(&sc->mastering); + av_freep(&sc->coll); } if (mov->dv_demux) { @@ -6229,6 +6263,15 @@ static int mov_read_header(AVFormatContext *s) sc->mastering = NULL; } + if (sc->coll) { + err = av_stream_add_side_data(st, AV_PKT_DATA_CONTENT_LIGHT_LEVEL, + (uint8_t *)sc->coll, + sc->coll_size); + if (err < 0) + return err; + + sc->coll = NULL; + } break; } } |