[vlc-devel] [PATCH v2 5/5] video_output: pop mouse events and terminated state from the control FIFO

Steve Lhomme robux4 at ycbcr.xyz
Thu Dec 17 16:18:18 UTC 2020


The terminated use in the while loop was incorrect in v1. It needs to 
break the loop even when we don't get VLC_SUCCESS.

On 2020-12-17 17:07, Steve Lhomme wrote:
> The terminate state is always reported. So we don't wait anymore until all
> mouse events are processed before the TERMINATE command is handled.
> 
> The command array is now a mouse state array.
> ---
>   src/video_output/control.c      | 17 ++++++-----------
>   src/video_output/control.h      | 15 ++-------------
>   src/video_output/video_output.c | 19 +++++++++----------
>   3 files changed, 17 insertions(+), 34 deletions(-)
> 
> diff --git a/src/video_output/control.c b/src/video_output/control.c
> index 15b3e5d2adc..56f105f4bbd 100644
> --- a/src/video_output/control.c
> +++ b/src/video_output/control.c
> @@ -51,12 +51,8 @@ void vout_control_Clean(vout_control_t *ctrl)
>   
>   void vout_control_PushMouse(vout_control_t *ctrl, const vlc_mouse_t *video_mouse)
>   {
> -    vout_control_cmd_t cmd = {
> -        VOUT_CONTROL_MOUSE_STATE, *video_mouse,
> -    };
> -
>       vlc_mutex_lock(&ctrl->lock);
> -    ARRAY_APPEND(ctrl->cmd, cmd);
> +    ARRAY_APPEND(ctrl->cmd, *video_mouse);
>       vlc_cond_signal(&ctrl->wait_request);
>       vlc_mutex_unlock(&ctrl->lock);
>   }
> @@ -95,8 +91,8 @@ void vout_control_Release(vout_control_t *ctrl)
>       vlc_mutex_unlock(&ctrl->lock);
>   }
>   
> -int vout_control_Pop(vout_control_t *ctrl, vout_control_cmd_t *cmd,
> -                     vlc_tick_t deadline)
> +int vout_control_Pop(vout_control_t *ctrl, vlc_mouse_t *mouse,
> +                     bool *is_terminated, vlc_tick_t deadline)
>   {
>       bool has_cmd = false;
>       vlc_mutex_lock(&ctrl->lock);
> @@ -114,19 +110,18 @@ int vout_control_Pop(vout_control_t *ctrl, vout_control_cmd_t *cmd,
>       while (ctrl->is_held)
>           vlc_cond_wait(&ctrl->wait_available, &ctrl->lock);
>   
> -    if (ctrl->is_terminated) {
> -        *cmd = (vout_control_cmd_t) { VOUT_CONTROL_TERMINATE, {0} };
> +    if (ctrl->is_terminated)
>           goto done;
> -    }
>   
>       if (ctrl->cmd.i_size > 0) {
>           has_cmd = true;
> -        *cmd = ARRAY_VAL(ctrl->cmd, 0);
> +        *mouse = ARRAY_VAL(ctrl->cmd, 0);
>           ARRAY_REMOVE(ctrl->cmd, 0);
>       } else {
>           ctrl->can_sleep = true;
>       }
>   done:
> +    *is_terminated = ctrl->is_terminated;
>       vlc_mutex_unlock(&ctrl->lock);
>   
>       return has_cmd ? VLC_SUCCESS : VLC_EGENERIC;
> diff --git a/src/video_output/control.h b/src/video_output/control.h
> index 8f8ebb966e3..cb9c839f211 100644
> --- a/src/video_output/control.h
> +++ b/src/video_output/control.h
> @@ -26,17 +26,6 @@
>   #include <vlc_viewpoint.h>
>   
>   /* */
> -enum {
> -    VOUT_CONTROL_TERMINATE,
> -
> -    VOUT_CONTROL_MOUSE_STATE,           /* vlc_mouse_t */
> -};
> -
> -typedef struct {
> -    int type;
> -    vlc_mouse_t mouse;
> -} vout_control_cmd_t;
> -
>   typedef struct {
>       vlc_mutex_t lock;
>       vlc_cond_t  wait_request;
> @@ -47,7 +36,7 @@ typedef struct {
>       bool is_waiting;
>       bool is_held;
>       bool is_terminated;
> -    DECL_ARRAY(vout_control_cmd_t) cmd;
> +    DECL_ARRAY(vlc_mouse_t) cmd;
>   } vout_control_t;
>   
>   /* */
> @@ -64,6 +53,6 @@ void vout_control_Hold(vout_control_t *);
>   void vout_control_Release(vout_control_t *);
>   
>   /* control inside of the vout thread */
> -int vout_control_Pop(vout_control_t *, vout_control_cmd_t *, vlc_tick_t deadline);
> +int vout_control_Pop(vout_control_t *, vlc_mouse_t *, bool *, vlc_tick_t deadline);
>   
>   #endif
> diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
> index f6afd17681d..6ca74ee61a8 100644
> --- a/src/video_output/video_output.c
> +++ b/src/video_output/video_output.c
> @@ -1892,8 +1892,6 @@ static void *Thread(void *object)
>       bool wait = false;
>   
>       for (;;) {
> -        vout_control_cmd_t cmd;
> -
>           if (wait)
>           {
>               const vlc_tick_t max_deadline = vlc_tick_now() + VLC_TICK_FROM_MS(100);
> @@ -1902,22 +1900,23 @@ static void *Thread(void *object)
>               deadline = VLC_TICK_INVALID;
>           }
>   
> -        while (!vout_control_Pop(&sys->control, &cmd, deadline)) {
> -            switch(cmd.type) {
> -                case VOUT_CONTROL_TERMINATE:
> -                    return NULL; /* no need to clean &cmd */
> -                case VOUT_CONTROL_MOUSE_STATE:
> -                    ThreadProcessMouseState(vout, &cmd.mouse);
> -                    break;
> -            }
> +        bool terminated = false;
> +        vlc_mouse_t video_mouse;
> +        while (vout_control_Pop(&sys->control, &video_mouse, &terminated,
> +                                deadline) == VLC_SUCCESS && !terminated) {
> +            ThreadProcessMouseState(vout, &video_mouse);
>           }
>   
> +        if (terminated)
> +            break;
> +
>           wait = ThreadDisplayPicture(vout, &deadline) != VLC_SUCCESS;
>   
>           const bool picture_interlaced = sys->displayed.is_interlaced;
>   
>           vout_SetInterlacingState(&vout->obj, &sys->private, picture_interlaced);
>       }
> +    return NULL;
>   }
>   
>   static void vout_ReleaseDisplay(vout_thread_sys_t *vout)
> -- 
> 2.29.2
> 
> _______________________________________________
> 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