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
signature.asc
Description: Digital signature
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel