[vlc-devel] [PATCH] input: merge position and length events

Steve Lhomme robux4 at ycbcr.xyz
Mon Aug 5 07:37:10 CEST 2019


On 2019-08-02 10:01, Thomas Guillem wrote:
>  From the es_out, times are a triplet: pos, time, length. So they should be
> sent via a single event and atomically.

Maybe document the default values to use when only one value changes.

> This also suppress one player lock when times are updated.
> ---
>   src/input/es_out.c         |  5 ++---
>   src/input/event.h          | 20 +++++---------------
>   src/input/input.c          |  3 +--
>   src/input/input_internal.h | 16 ++++++----------
>   src/input/player.c         | 16 +++++++---------
>   5 files changed, 21 insertions(+), 39 deletions(-)
> 
> diff --git a/src/input/es_out.c b/src/input/es_out.c
> index 07e33647af..c839218991 100644
> --- a/src/input/es_out.c
> +++ b/src/input/es_out.c
> @@ -3279,8 +3279,6 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
>           vlc_tick_t i_time = va_arg( args, vlc_tick_t );
>           vlc_tick_t i_length = va_arg( args, vlc_tick_t );
>   
> -        input_SendEventLength( p_sys->p_input, i_length );
> -
>           if( !p_sys->b_buffering )
>           {
>               vlc_tick_t i_delay;
> @@ -3301,7 +3299,8 @@ static int EsOutVaControlLocked( es_out_t *out, int i_query, va_list args )
>               if( f_position < 0 )
>                   f_position = 0;
>   
> -            input_SendEventPosition( p_sys->p_input, f_position, i_time );
> +            input_SendEventTimes( p_sys->p_input, f_position, i_time,
> +                                  i_length );

If b_buffering is true the length is never sent, it was sent before.

>           }
>           return VLC_SUCCESS;
>       }
> diff --git a/src/input/event.h b/src/input/event.h
> index 01163c479a..2d77461451 100644
> --- a/src/input/event.h
> +++ b/src/input/event.h
> @@ -54,23 +54,13 @@ static inline void input_SendEventCapabilities(input_thread_t *p_input,
>       });
>   }
>   
> -static inline void input_SendEventPosition(input_thread_t *p_input,
> -                                            double f_position,
> -                                            vlc_tick_t i_time)
> +static inline void input_SendEventTimes(input_thread_t *p_input,
> +                                        double f_position, vlc_tick_t i_time,
> +                                        vlc_tick_t i_length)
>   {
>       input_SendEvent(p_input, &(struct vlc_input_event) {
> -        .type = INPUT_EVENT_POSITION,
> -        .position = { f_position, i_time }
> -    });
> -}
> -
> -static inline void input_SendEventLength(input_thread_t *p_input,
> -                                          vlc_tick_t i_length)
> -{
> -    input_item_SetDuration(input_priv(p_input)->p_item, i_length);
> -    input_SendEvent(p_input, &(struct vlc_input_event) {
> -        .type = INPUT_EVENT_LENGTH,
> -        .length = i_length,
> +        .type = INPUT_EVENT_TIMES,
> +        .times = { f_position, i_time, i_length }
>       });
>   }
>   
> diff --git a/src/input/input.c b/src/input/input.c
> index 9d0bc94e78..a15ce6cab9 100644
> --- a/src/input/input.c
> +++ b/src/input/input.c
> @@ -1272,9 +1272,8 @@ static int Init( input_thread_t * p_input )
>           i_length = 0;
>       if( i_length <= 0 )
>           i_length = input_item_GetDuration( priv->p_item );
> -    input_SendEventLength( p_input, i_length );
>   
> -    input_SendEventPosition( p_input, 0.0, 0 );
> +    input_SendEventTimes( p_input, 0.0, 0, i_length );
>   
>       if( !priv->b_preparsing )
>       {
> diff --git a/src/input/input_internal.h b/src/input/input_internal.h
> index b0bc7b6d16..8e837a8c61 100644
> --- a/src/input/input_internal.h
> +++ b/src/input/input_internal.h
> @@ -87,11 +87,8 @@ typedef enum input_event_type_e
>       /* "capabilities" has changed */
>       INPUT_EVENT_CAPABILITIES,
>   
> -    /* At least one of "position" or "time" */
> -    INPUT_EVENT_POSITION,
> -
> -    /* "length" has changed */
> -    INPUT_EVENT_LENGTH,
> +    /* At least one of "position", "time" "length" has changed */
> +    INPUT_EVENT_TIMES,
>   
>       /* A title has been added or removed or selected.
>        * It implies that the chapter has changed (no chapter event is sent) */
> @@ -150,10 +147,11 @@ typedef enum input_event_type_e
>   #define VLC_INPUT_CAPABILITIES_REWINDABLE (1<<3)
>   #define VLC_INPUT_CAPABILITIES_RECORDABLE (1<<4)
>   
> -struct vlc_input_event_position
> +struct vlc_input_event_times
>   {
>       float percentage;
>       vlc_tick_t ms;
> +    vlc_tick_t length;
>   };
>   
>   struct vlc_input_event_title
> @@ -243,10 +241,8 @@ struct vlc_input_event
>           float rate;
>           /* INPUT_EVENT_CAPABILITIES */
>           int capabilities; /**< cf. VLC_INPUT_CAPABILITIES_* bitwise flags */
> -        /* INPUT_EVENT_POSITION */
> -        struct vlc_input_event_position position;
> -        /* INPUT_EVENT_LENGTH */
> -        vlc_tick_t length;
> +        /* INPUT_EVENT_TIMES */
> +        struct vlc_input_event_times times;
>           /* INPUT_EVENT_TITLE */
>           struct vlc_input_event_title title;
>           /* INPUT_EVENT_CHAPTER */
> diff --git a/src/input/player.c b/src/input/player.c
> index 4d0e13c668..8b84aa5c0b 100644
> --- a/src/input/player.c
> +++ b/src/input/player.c
> @@ -2198,12 +2198,12 @@ input_thread_Events(input_thread_t *input_thread,
>                                    old_caps, input->capabilities);
>               break;
>           }
> -        case INPUT_EVENT_POSITION:
> -            if (input->time != event->position.ms ||
> -                input->position != event->position.percentage)
> +        case INPUT_EVENT_TIMES:
> +            if (input->time != event->times.ms ||
> +                input->position != event->times.percentage)
>               {
> -                input->time = event->position.ms;
> -                input->position = event->position.percentage;
> +                input->time = event->times.ms;
> +                input->position = event->times.percentage;
>                   vlc_player_SendEvent(player, on_position_changed,
>                                        input->time,
>                                        input->position);
> @@ -2212,11 +2212,9 @@ input_thread_Events(input_thread_t *input_thread,
>                    && input == player->input)
>                       vlc_player_HandleAtoBLoop(player);
>               }
> -            break;
> -        case INPUT_EVENT_LENGTH:
> -            if (input->length != event->length)
> +            if (input->length != event->times.length)
>               {
> -                input->length = event->length;
> +                input->length = event->times.length;
>                   vlc_player_SendEvent(player, on_length_changed, input->length);
>               }
>               break;
> -- 
> 2.20.1
> 
> _______________________________________________
> 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