[vlc-commits] avcodec: video: update the decoder output when HDR10 metadata change

Steve Lhomme git at videolan.org
Thu Apr 13 14:56:23 CEST 2017


vlc | branch: master | Steve Lhomme <robux4 at videolabs.io> | Thu Apr  6 17:09:02 2017 +0200| [0644e67fa67a8a3f80158068d70e03cdbd166edd] | committer: Jean-Baptiste Kempf

avcodec: video: update the decoder output when HDR10 metadata change

So the output format is actually updated with HDR10 metadata. If the demuxer or
packetizer didn't fill these metadata the vout will not know it's outputing
HDR10.

Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0644e67fa67a8a3f80158068d70e03cdbd166edd
---

 modules/codec/avcodec/video.c | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index 8454c78e90..629a216117 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -1049,6 +1049,7 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
         p_pic->b_progressive = !frame->interlaced_frame;
         p_pic->b_top_field_first = frame->top_field_first;
 
+        bool format_changed = false;
 #if (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 55, 16, 101 ) )
         const AVFrameSideData *metadata =
                 av_frame_get_side_data( frame,
@@ -1079,6 +1080,14 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
                 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;
             }
+
+            if ( memcmp( &p_dec->fmt_out.video.mastering,
+                         &p_pic->format.mastering,
+                         sizeof(p_pic->format.mastering) ) )
+            {
+                p_dec->fmt_out.video.mastering = p_pic->format.mastering;
+                format_changed = true;
+            }
         }
 #endif
 #if (LIBAVUTIL_VERSION_MICRO >= 100 && LIBAVUTIL_VERSION_INT >= AV_VERSION_INT( 55, 60, 100 ) )
@@ -1091,10 +1100,20 @@ static picture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block, bool *error
                     (const AVContentLightMetadata *) metadata_lt->data;
             p_pic->format.ligthing.MaxCLL = light_meta->MaxCLL;
             p_pic->format.ligthing.MaxFALL = light_meta->MaxFALL;
+            if ( memcmp( &p_dec->fmt_out.video.ligthing,
+                         &p_pic->format.ligthing,
+                         sizeof(p_pic->format.ligthing) ) )
+            {
+                p_dec->fmt_out.video.ligthing  = p_pic->format.ligthing;
+                format_changed = true;
+            }
         }
 #endif
         av_frame_free(&frame);
 
+        if (format_changed)
+            decoder_UpdateVideoFormat( p_dec );
+
         /* Send decoded frame to vout */
         if (i_pts > VLC_TS_INVALID)
         {



More information about the vlc-commits mailing list