[FFmpeg-devel] [PATCH 3/4] avformat/mov: add support for reading Mastering Display Metadata Box

Michael Niedermayer michael at niedermayer.cc
Sat May 27 02:05:24 EEST 2017


On Wed, May 17, 2017 at 09:49:40PM -0300, James Almer wrote:
> As defined in "VP Codec ISO Media File Format Binding v1.0"
> https://github.com/webmproject/vp9-dash/blob/master/VPCodecISOMediaFileFormatBinding.md
> 
> Partially based on Matroska decoder code.
> 
> Signed-off-by: James Almer <jamrial at gmail.com>
> ---
>  libavformat/isom.h |  2 ++
>  libavformat/mov.c  | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 67 insertions(+)
> 
> diff --git a/libavformat/isom.h b/libavformat/isom.h
> index d9956cf63a..426f732247 100644
> --- a/libavformat/isom.h
> +++ b/libavformat/isom.h
> @@ -27,6 +27,7 @@
>  #include <stddef.h>
>  #include <stdint.h>
>  
> +#include "libavutil/mastering_display_metadata.h"
>  #include "libavutil/spherical.h"
>  #include "libavutil/stereo3d.h"
>  
> @@ -194,6 +195,7 @@ typedef struct MOVStreamContext {
>      AVStereo3D *stereo3d;
>      AVSphericalMapping *spherical;
>      size_t spherical_size;
> +    AVMasteringDisplayMetadata *mastering;
>  
>      uint32_t format;
>  
> diff --git a/libavformat/mov.c b/libavformat/mov.c
> index afef53b79a..0b5fd849f3 100644
> --- a/libavformat/mov.c
> +++ b/libavformat/mov.c
> @@ -4612,6 +4612,60 @@ static int mov_read_tmcd(MOVContext *c, AVIOContext *pb, MOVAtom atom)
>      return 0;
>  }
>  
> +static int mov_read_smdm(MOVContext *c, AVIOContext *pb, MOVAtom atom)
> +{
> +    MOVStreamContext *sc;
> +    const int chroma_den = 50000;
> +    const int luma_den = 10000;
> +    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 Mastering Display Metadata box\n");
> +        return AVERROR_INVALIDDATA;
> +    }
> +
> +    version = avio_r8(pb);
> +    if (version) {
> +        av_log(c->fc, AV_LOG_WARNING, "Unsupported Mastering Display Metadata box version %d\n", version);
> +        return 0;
> +    }
> +    avio_skip(pb, 3); /* flags */
> +
> +    sc->mastering = av_mastering_display_metadata_alloc();
> +    if (!sc->mastering)
> +        return AVERROR(ENOMEM);
> +

> +    sc->mastering->display_primaries[0][0] =
> +        av_make_q(lrint(((double)avio_rb16(pb) / (1 << 16)) * chroma_den), chroma_den);

this is not optimal, precission wise
av_d2q() should produce closer rationals
alternativly av_reduce() can be used directly

but iam not sure why a fixed chroma_den and luma_den is fixed
maybe iam missing something

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Opposition brings concord. Out of discord comes the fairest harmony.
-- Heraclitus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20170527/9e59efcd/attachment.sig>


More information about the ffmpeg-devel mailing list