Thanks for the quick review, Michael. The display primaries are encoded as integers (rational with fixed denominator, I guess) in h265 and HDMI InfoFrames (but in mkv extensions, they will be floats). Float is sufficient to represent the 16-bit integer encoding from hevc, so suspect there is not much gain in going more precise (this info is used as hints when tone mapping from a wider color gamut to a narrower one).
Regarding the ints, you're correct, we should just use unsigned. On Thu, Jan 21, 2016 at 3:39 PM, Michael Niedermayer <mich...@niedermayer.cc > wrote: > 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.birkb...@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 > > _______________________________________________ > ffmpeg-devel mailing list > ffmpeg-devel@ffmpeg.org > http://ffmpeg.org/mailman/listinfo/ffmpeg-devel > > _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel