[vlc-devel] [PATCH 01/18] libvlc: pass the HDR10 metadata to the OpenGL makeCurrent callback
Rémi Denis-Courmont
remi at remlab.net
Tue Feb 4 19:50:08 CET 2020
Le tiistaina 4. helmikuuta 2020, 17.25.56 EET Steve Lhomme a écrit :
> 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);
That seems way too specific to current generation / too inextensible, to fit in
the generic make_current callback...
>
> /**
> * 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)
--
Реми Дёни-Курмон
http://www.remlab.net/
More information about the vlc-devel
mailing list