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

Rémi Denis-Courmont remi at remlab.net
Mon May 13 15:47:57 CEST 2019


The setup and cleanup callbacks run in display context, AFAIK. That's not synchronized with the window, and in fact, it can't be without risking lock inversion.

Le 13 mai 2019 16:30:03 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>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
>> 
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20190513/a46a2b28/attachment.html>


More information about the vlc-devel mailing list