[vlc-devel] [PATCH] avcodec: video: make sure the HDR10 metadata we read have the proper factor

Steve Lhomme robux4 at videolabs.io
Mon Apr 10 09:33:59 CEST 2017


In case the AVRational has been reduced.
---
 modules/codec/avcodec/video.c | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index dd64dd6e07..5d7936948d 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -1023,6 +1023,8 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
         p_pic->b_top_field_first = frame->top_field_first;
 
 #if (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 55, 16, 101 ) )
+#define FROM_AVRAT(default_factor, avrat) \
+    (uint64_t)(default_factor) * (avrat).num / (avrat).den
         const AVFrameSideData *metadata =
                 av_frame_get_side_data( frame,
                                         AV_FRAME_DATA_MASTERING_DISPLAY_METADATA );
@@ -1032,8 +1034,10 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
                     (const AVMasteringDisplayMetadata *) metadata->data;
             if ( hdr_meta->has_luminance )
             {
-                p_pic->format.mastering.max_luminance = hdr_meta->max_luminance.num;
-                p_pic->format.mastering.min_luminance = hdr_meta->min_luminance.num;
+                p_pic->format.mastering.max_luminance =
+                        FROM_AVRAT(10000, hdr_meta->max_luminance);
+                p_pic->format.mastering.min_luminance =
+                        FROM_AVRAT(10000, hdr_meta->min_luminance);
             }
             if ( hdr_meta->has_primaries )
             {
@@ -1043,15 +1047,24 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
 #define LAV_RED    0
 #define LAV_GREEN  1
 #define LAV_BLUE   2
-                p_pic->format.mastering.primaries[ST2086_RED*2   + 0] = hdr_meta->display_primaries[LAV_RED][0].num;
-                p_pic->format.mastering.primaries[ST2086_RED*2   + 1] = hdr_meta->display_primaries[LAV_RED][1].num;
-                p_pic->format.mastering.primaries[ST2086_GREEN*2 + 0] = hdr_meta->display_primaries[LAV_GREEN][0].num;
-                p_pic->format.mastering.primaries[ST2086_GREEN*2 + 1] = hdr_meta->display_primaries[LAV_GREEN][1].num;
-                p_pic->format.mastering.primaries[ST2086_BLUE*2  + 0] = hdr_meta->display_primaries[LAV_BLUE][0].num;
-                p_pic->format.mastering.primaries[ST2086_BLUE*2  + 1] = hdr_meta->display_primaries[LAV_BLUE][1].num;
-                p_pic->format.mastering.white_point[0] = hdr_meta->white_point[0].num;
-                p_pic->format.mastering.white_point[1] = hdr_meta->white_point[1].num;
+                p_pic->format.mastering.primaries[ST2086_RED*2   + 0] =
+                        FROM_AVRAT(50000, hdr_meta->display_primaries[LAV_RED][0]);
+                p_pic->format.mastering.primaries[ST2086_RED*2   + 1] =
+                        FROM_AVRAT(50000, hdr_meta->display_primaries[LAV_RED][1]);
+                p_pic->format.mastering.primaries[ST2086_GREEN*2 + 0] =
+                        FROM_AVRAT(50000, hdr_meta->display_primaries[LAV_GREEN][0]);
+                p_pic->format.mastering.primaries[ST2086_GREEN*2 + 1] =
+                        FROM_AVRAT(50000, hdr_meta->display_primaries[LAV_GREEN][1]);
+                p_pic->format.mastering.primaries[ST2086_BLUE*2  + 0] =
+                        FROM_AVRAT(50000, hdr_meta->display_primaries[LAV_BLUE][0]);
+                p_pic->format.mastering.primaries[ST2086_BLUE*2  + 1] =
+                        FROM_AVRAT(50000, hdr_meta->display_primaries[LAV_BLUE][1]);
+                p_pic->format.mastering.white_point[0] =
+                        FROM_AVRAT(50000, hdr_meta->white_point[0]);
+                p_pic->format.mastering.white_point[1] =
+                        FROM_AVRAT(50000, hdr_meta->white_point[1]);
             }
+#undef FROM_AVRAT
         }
 #endif
 #if (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 55, 60, 100 ) )
-- 
2.11.1



More information about the vlc-devel mailing list