[vlc-devel] [PATCH 01/18] libvlc: pass the HDR10 metadata to the OpenGL makeCurrent callback

Steve Lhomme robux4 at ycbcr.xyz
Tue Feb 4 16:25:56 CET 2020


Just like with D3D11, it should theoretically be possible to send the HDR10
metadata of the frame we're about to display over HDMI.

We should get this information as early as possible to prepare the tone mapping
we will use for rendering.
---
 doc/libvlc/QtGL/qtvlcwidget.cpp   |  2 +-
 doc/libvlc/sdl_opengl_player.cpp  |  2 +-
 include/vlc/libvlc_media_player.h | 33 ++++++++++++++++---------------
 modules/video_output/vgl.c        |  4 ++--
 4 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/doc/libvlc/QtGL/qtvlcwidget.cpp b/doc/libvlc/QtGL/qtvlcwidget.cpp
index a9abeccc167..7c1eee7a43b 100644
--- a/doc/libvlc/QtGL/qtvlcwidget.cpp
+++ b/doc/libvlc/QtGL/qtvlcwidget.cpp
@@ -93,7 +93,7 @@ public:
     }
 
     // This callback is called to set the OpenGL context
-    static bool make_current(void* data, bool current)
+    static bool make_current(void* data, bool current, const libvlc_video_frame_hdr10_metadata_t *hdr10)
     {
         VLCVideo* that = static_cast<VLCVideo*>(data);
         if (current)
diff --git a/doc/libvlc/sdl_opengl_player.cpp b/doc/libvlc/sdl_opengl_player.cpp
index d34b99b2682..903f0fefb3c 100644
--- a/doc/libvlc/sdl_opengl_player.cpp
+++ b/doc/libvlc/sdl_opengl_player.cpp
@@ -182,7 +182,7 @@ public:
     }
 
     // This callback is called to set the OpenGL context
-    static bool make_current(void* data, bool current)
+    static bool make_current(void* data, bool current, const libvlc_video_frame_hdr10_metadata_t *hdr10)
     {
         VLCVideo* that = static_cast<VLCVideo*>(data);
         if (current)
diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h
index 7c72c9774b2..02ca8b5fd54 100644
--- a/include/vlc/libvlc_media_player.h
+++ b/include/vlc/libvlc_media_player.h
@@ -540,15 +540,29 @@ typedef void (*libvlc_video_update_output_cb)(void* opaque, unsigned width, unsi
  */
 typedef void (*libvlc_video_swap_cb)(void* opaque);
 
+typedef struct
+{
+    /* similar to SMPTE ST 2086 mastering display color volume */
+    uint16_t RedPrimary[2];
+    uint16_t GreenPrimary[2];
+    uint16_t BluePrimary[2];
+    uint16_t WhitePoint[2];
+    unsigned int MaxMasteringLuminance;
+    unsigned int MinMasteringLuminance;
+    uint16_t MaxContentLightLevel;
+    uint16_t MaxFrameAverageLightLevel;
+} libvlc_video_frame_hdr10_metadata_t;
+
 /**
  * Callback prototype to set up the OpenGL context for rendering
  *
  * \param opaque private pointer passed to the @a libvlc_video_set_output_callbacks() [IN]
  * \param enter true to set the context as current, false to unset it [IN]
+ * \param hdr10 libvlc_video_frame_hdr10_metadata_t* or NULL [IN]
  * \return true on success
  * \version LibVLC 4.0.0 or later
  */
-typedef bool (*libvlc_video_makeCurrent_cb)(void* opaque, bool enter);
+typedef bool (*libvlc_video_makeCurrent_cb)(void* opaque, bool enter, const libvlc_video_frame_hdr10_metadata_t *hdr10);
 
 /**
  * Callback prototype to load opengl functions
@@ -712,24 +726,11 @@ typedef bool( *libvlc_video_direct3d_update_output_cb )( void *opaque,
                                                          const libvlc_video_direct3d_cfg_t *cfg,
                                                          libvlc_video_output_cfg_t *output );
 
-typedef struct
-{
-    /* similar to SMPTE ST 2086 mastering display color volume */
-    uint16_t RedPrimary[2];
-    uint16_t GreenPrimary[2];
-    uint16_t BluePrimary[2];
-    uint16_t WhitePoint[2];
-    unsigned int MaxMasteringLuminance;
-    unsigned int MinMasteringLuminance;
-    uint16_t MaxContentLightLevel;
-    uint16_t MaxFrameAverageLightLevel;
-} libvlc_video_direct3d_hdr10_metadata_t;
-
 /** Tell the host the rendering is about to start/has finished.
  *
  * \param opaque private pointer set on the opaque parameter of @a libvlc_video_direct3d_device_setup_cb() [IN]
  * \param enter true if the rendering is about to start, false if it's finished
- * \param hdr10 libvlc_video_direct3d_hdr10_metadata_t* or NULL [IN]
+ * \param hdr10 libvlc_video_frame_hdr10_metadata_t* or NULL [IN]
  * \return true on success
  * \version LibVLC 4.0.0 or later
  *
@@ -748,7 +749,7 @@ typedef struct
  * - RSSetViewports()
  * - DrawIndexed()
  */
-typedef bool( *libvlc_video_direct3d_start_end_rendering_cb )( void *opaque, bool enter, const libvlc_video_direct3d_hdr10_metadata_t *hdr10 );
+typedef bool( *libvlc_video_direct3d_start_end_rendering_cb )( void *opaque, bool enter, const libvlc_video_frame_hdr10_metadata_t *hdr10 );
 
 /** Tell the host the rendering for the given plane is about to start
  *
diff --git a/modules/video_output/vgl.c b/modules/video_output/vgl.c
index d880f1a5ff5..9f550e53c13 100644
--- a/modules/video_output/vgl.c
+++ b/modules/video_output/vgl.c
@@ -58,14 +58,14 @@ static void *OurGetProcAddress(vlc_gl_t *gl, const char *name)
 static int MakeCurrent(vlc_gl_t *gl)
 {
     vout_display_sys_t *sys = gl->sys;
-    bool success = sys->makeCurrentCb(sys->opaque, true);
+    bool success = sys->makeCurrentCb(sys->opaque, true, NULL);
     return success ? VLC_SUCCESS : VLC_EGENERIC;
 }
 
 static void ReleaseCurrent(vlc_gl_t *gl)
 {
     vout_display_sys_t *sys = gl->sys;
-    sys->makeCurrentCb(sys->opaque, false);
+    sys->makeCurrentCb(sys->opaque, false, NULL);
 }
 
 static void VglSwapBuffers(vlc_gl_t *gl)
-- 
2.17.1



More information about the vlc-devel mailing list