[vlc-devel] [PATCH 6/8] libvlc: provide a callback to the host that it can call when its size changes

Steve Lhomme robux4 at ycbcr.xyz
Mon May 13 15:30:03 CEST 2019


On 2019-05-13 15:19, Rémi Denis-Courmont wrote:
> Hi,
> 
> In general, window provider plugins are not reentrant, so you can't 
> simply invoke a callback from a random thread. Unless there are some 
> special provisions for the D3D window provider, this does not look right.

The doc says it can only be called during setup and cleanup calls. As 
long as this is done, the call should be safe lifecycle-wise. It ends up 
calling window_ReportSize which is supposed to be thread safe.

I could add a lock and/or send a custom control that will end up in the 
vout thread to protect the call. It's like the window report size, it 
doesn't have to be synchronous with the display calls.

> Le 13 mai 2019 14:54:51 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
> 
>     ------------------------------------------------------------------------
>       include/vlc/libvlc_media_player.h       |  8 ++++++++
>       include/vlc_vout_display.h              |  4 ++++
>       modules/video_output/win32/direct3d11.c | 10 +++++++++-
>       modules/video_output/win32/direct3d9.c  | 10 +++++++++-
>       4 files changed, 30 insertions(+), 2 deletions(-)
> 
>     diff --git a/include/vlc/libvlc_media_player.h b/include/vlc/libvlc_media_player.h
>     index f10fcf7a96..91bc949d01 100644
>     --- a/include/vlc/libvlc_media_player.h
>     +++ b/include/vlc/libvlc_media_player.h
>     @@ -608,6 +608,14 @@ typedef enum libvlc_video_direct3d_engine_t {
>       typedef struct
>       {
>           bool hardware_decoding; /** set if D3D11_CREATE_DEVICE_VIDEO_SUPPORT is needed for D3D11 */
>     +
>     +    /** Callback to call when the size of the host changes
>     +     *
>     +     * This callback must not be called once the \ref libvlc_video_direct3d_device_cleanup_cb
>     +     * callback has been called.
>     +     */
>     +    void (*repot_size_change)(void *report_opaque, unsigned width, unsigned height);
>     +    void *report_opaque;
>       } libvlc_video_direct3d_device_cfg_t;
>       
>       typedef struct
>     diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
>     index 687a655cfc..e46696e1d4 100644
>     --- a/include/vlc_vout_display.h
>     +++ b/include/vlc_vout_display.h
>     @@ -388,6 +388,10 @@ static inline void vout_display_SendEventTitle(vout_display_t *vd, const char *t
>       {
>           vout_window_SetTitle(vd->cfg->window, title);
>       }
>     +static inline void vout_display_SendEventHostSize(vout_display_t *vd, unsigned width, unsigned height)
>     +{
>     +    vout_window_SetSize( vd->cfg->window, width, height );
>     +}
>       static inline void vout_display_SendEventViewpointMoved(vout_display_t *vd,
>                                                               const vlc_viewpoint_t *vp)
>       {
>     diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
>     index b2d5b000f1..bac4f34b94 100644
>     --- a/modules/video_output/win32/direct3d11.c
>     +++ b/modules/video_output/win32/direct3d11.c
>     @@ -1364,13 +1364,21 @@ static const d3d_format_t *GetBlendableFormat(vout_display_t *vd, vlc_fourcc_t i
>           return FindD3D11Format( vd, &vd->sys->d3d_dev, i_src_chroma, false, 0, 0, 0, false, supportFlags );
>       }
>       
>     +static void ReportSizeCallback(void *report_opaque, unsigned width, unsigned height)
>     +{
>     +    vout_display_t *vd = report_opaque;
>     +    vout_display_SendEventHostSize( vd, width, height );
>     +}
>     +
>       static int Direct3D11Open(vout_display_t *vd, video_format_t *fmtp)
>       {
>           vout_display_sys_t *sys = vd->sys;
>           HRESULT hr = E_FAIL;
>       
>           libvlc_video_direct3d_device_cfg_t cfg = {
>     -        .hardware_decoding = is_d3d11_opaque( vd->source.i_chroma )
>     +        .hardware_decoding = is_d3d11_opaque( vd->source.i_chroma ),
>     +        .repot_size_change = ReportSizeCallback,
>     +        .report_opaque = vd,
>           };
>           libvlc_video_direct3d_device_setup_t out;
>           ID3D11DeviceContext *d3d11_ctx = NULL;
>     diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
>     index 8d5f6b059d..375e6ebcd7 100644
>     --- a/modules/video_output/win32/direct3d9.c
>     +++ b/modules/video_output/win32/direct3d9.c
>     @@ -1662,6 +1662,12 @@ static bool LocalSwapchainStartEndRendering( void *opaque, bool enter, const lib
>           return true;
>       }
>       
>     +static void ReportSizeCallback(void *report_opaque, unsigned width, unsigned height)
>     +{
>     +    vout_display_t *vd = report_opaque;
>     +    vout_display_SendEventHostSize( vd, width, height );
>     +}
>     +
>       /**
>        * It creates a Direct3D vout display.
>        */
>     @@ -1711,7 +1717,9 @@ static int Open(vout_display_t *vd, const vout_display_cfg_t *cfg,
>           }
>       
>           libvlc_video_direct3d_device_cfg_t surface_cfg = {
>     -        .hardware_decoding = is_d3d9_opaque( vd->source.i_chroma )
>     +        .hardware_decoding = is_d3d9_opaque( vd->source.i_chroma ),
>     +        .repot_size_change = ReportSizeCallback,
>     +        .report_opaque = vd,
>           };
>           libvlc_video_direct3d_device_setup_t device_setup;
>           IDirect3DDevice9 *d3d9_device = NULL;
> 
> 
> -- 
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser 
> ma brièveté.
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
> 


More information about the vlc-devel mailing list