[FFmpeg-devel] [PATCH] lavc/hevc Parse SEI_TYPE_MASTERING_DISPLAY_INFO and propagate contents into the AVMasteringDisplayMetadata side data.

Michael Niedermayer michael at niedermayer.cc
Fri Jan 22 00:39:49 CET 2016


On Thu, Jan 21, 2016 at 02:26:39PM -0800, Neil Birkbeck wrote:
> Add support for parsing SEI_TYPE_MASTERING_DISPLAY_INFO and propagate contents into 
> the AVMasteringDisplayMetadata side data. Primaries are ordered in RGB order and
> the values are converted to the natural ranges ([0,1] for CEI 1931 Chroma coords,
> and cd/m^2 for luma).
> 
> Signed-off-by: Neil Birkbeck <neil.birkbeck at gmail.com>
> ---
>  libavcodec/hevc.c     | 38 ++++++++++++++++++++++++++++++++++++++
>  libavcodec/hevc.h     |  7 +++++++
>  libavcodec/hevc_sei.c | 22 ++++++++++++++++++++++
>  3 files changed, 67 insertions(+)
> 
> diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
> index c245d3b..98cc6f7 100644
> --- a/libavcodec/hevc.c
> +++ b/libavcodec/hevc.c
> @@ -28,6 +28,7 @@
>  #include "libavutil/common.h"
>  #include "libavutil/display.h"
>  #include "libavutil/internal.h"
> +#include "libavutil/mastering_display_metadata.h"
>  #include "libavutil/md5.h"
>  #include "libavutil/opt.h"
>  #include "libavutil/pixdesc.h"
> @@ -2580,6 +2581,43 @@ static int set_side_data(HEVCContext *s)
>                                 s->sei_hflip, s->sei_vflip);
>      }
>  
> +    if (s->sei_mastering_display_info_present) {
> +        // HEVC uses a g,b,r ordering, which we convert to a more natural r,g,b
> +        const int mapping[3] = {2, 0, 1};
> +        const float chroma_scale = 50000.f;
> +        const float luma_scale = 10000.f;
> +        int i;
> +        AVMasteringDisplayMetadata *metadata =
> +            av_mastering_display_metadata_create_side_data(out);
> +        if (!metadata)
> +            return AVERROR(ENOMEM);
> +
> +        for (i = 0; i < 3; i++) {
> +            const int j = mapping[i];
> +            metadata->display_primaries[i][0] =
> +                s->display_primaries[j][0] / chroma_scale;
> +            metadata->display_primaries[i][1] =
> +                s->display_primaries[j][1] / chroma_scale;
> +        }

Are display_primaries always rational numbers ?
if so maybe they should be changed to use AVRational

avoiding floats would also make things bit exact across architectures
(without the need for luck)

the same applies to other rational fields

[...]

>      uint8_t* a53_caption;
> diff --git a/libavcodec/hevc_sei.c b/libavcodec/hevc_sei.c
> index 07856f2..095c658 100644
> --- a/libavcodec/hevc_sei.c
> +++ b/libavcodec/hevc_sei.c
> @@ -78,6 +78,26 @@ static int decode_nal_sei_decoded_picture_hash(HEVCContext *s)
>      return 0;
>  }
>  
> +static int decode_nal_sei_mastering_display_info(HEVCContext *s)
> +{
> +    GetBitContext *gb = &s->HEVClc->gb;
> +    int i;
> +    // Mastering primaries
> +    for (i = 0; i < 3; i++) {
> +        s->display_primaries[i][0] = get_bits(gb, 16);
> +        s->display_primaries[i][1] = get_bits(gb, 16);
> +    }
> +    // White point (x, y)
> +    s->white_point[0] = get_bits(gb, 16);
> +    s->white_point[1] = get_bits(gb, 16);
> +
> +    // Max and min luminance of mastering display

> +    s->max_mastering_luminance = get_bits(gb, 32);
> +    s->min_mastering_luminance = get_bits(gb, 32);

32 needs get_bits_long()

also the variables are signed int, is that intended

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

I have often repented speaking, but never of holding my tongue.
-- Xenocrates
-------------- 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/20160122/ec3768cf/attachment.sig>


More information about the ffmpeg-devel mailing list