[vlc-devel] [PATCH] input: merge position and length events
Thomas Guillem
thomas at gllm.fr
Mon Aug 5 11:49:23 CEST 2019
>From the es_out, times are a triplet: pos, time, length. So they should be
sent via a single event and atomically.
This also suppress one player lock when times are updated.
---
src/input/es_out.c | 7 ++++---
src/input/event.h | 20 +++++---------------
src/input/input.c | 3 +--
src/input/input_internal.h | 16 ++++++----------
src/input/player.c | 16 +++++++---------
5 files changed, 23 insertions(+), 39 deletions(-)
diff --git a/src/input/es_out.c b/src/input/es_out.c
index 07e33647af..d0187b9b0d 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,8 +3299,11 @@ 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 );
}
+ else
+ input_SendEventTimes( p_sys->p_input, 0.0, 0, i_length );
return VLC_SUCCESS;
}
case ES_OUT_SET_JITTER:
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
More information about the vlc-devel
mailing list