[vlc-devel] [RFC PATCH 2/2] player: signal position discontinuities

Thomas Guillem thomas at gllm.fr
Thu Sep 6 13:11:32 CEST 2018


---
 include/vlc_player.h | 20 ++++++++++++++++++++
 src/input/player.c   | 40 +++++++++++++++++++++++++++++++++++++++-
 2 files changed, 59 insertions(+), 1 deletion(-)

diff --git a/include/vlc_player.h b/include/vlc_player.h
index 06476cfc65..833b57959a 100644
--- a/include/vlc_player.h
+++ b/include/vlc_player.h
@@ -168,6 +168,26 @@ struct vlc_player_cbs
     void (*on_capabilities_changed)(vlc_player_t *player, int new_caps,
                                     void *data);
 
+    /**
+     * Signal a discontinuity
+     *
+     * This callback signals a discontinuity in the player position (because of
+     * a rate change, a pause, a seek, or a buffering).
+     *
+     * Example: When a discontinuity starts, the UI can show an indefinite
+     * progress. When it stops, the UI can set the progress bar to the time/pos
+     * value, and continue updating it according to the rate.
+     *
+     * @param player locked player instance
+     * @param started true to start a discontinuity, false to end it
+     * @param time the current time or VLC_TICK_INVALID if started is false
+     * @param pos the current pos or VLC_TICK_INVALID if started if false
+     * @param rate the current rate of VLC_TICK_INVALID if started if false
+     */
+    void (*on_discontinuity_changed)(vlc_player_t *player, bool started,
+                                     vlc_tick_t time, float pos, float rate,
+                                     void *data);
+
     void (*on_length_changed)(vlc_player_t *player, vlc_tick_t new_length,
                               void *data);
 
diff --git a/src/input/player.c b/src/input/player.c
index 7fe80a08e7..68394573f3 100644
--- a/src/input/player.c
+++ b/src/input/player.c
@@ -76,6 +76,8 @@ struct vlc_player_input
 
     struct input_stats_t stats;
 
+    bool discontinuity;
+
     vlc_player_program_vector program_vector;
     vlc_player_track_vector video_track_vector;
     vlc_player_track_vector audio_track_vector;
@@ -168,6 +170,8 @@ vlc_player_input_New(vlc_player_t *player, input_item_t *item)
 
     memset(&input->stats, 0, sizeof(input->stats));
 
+    input->discontinuity = false;
+
     vlc_vector_init(&input->program_vector);
     vlc_vector_init(&input->video_track_vector);
     vlc_vector_init(&input->audio_track_vector);
@@ -614,6 +618,34 @@ vlc_player_track_Update(struct vlc_player_track *track,
     return VLC_SUCCESS;
 }
 
+static void
+vlc_player_StartDiscontinuity(vlc_player_t *player)
+{
+    struct vlc_player_input *input = player->input;
+    if (input->discontinuity)
+        return;
+
+    input->discontinuity = true;
+    vlc_player_SendEvent(player, on_discontinuity_changed,
+                         input->discontinuity, VLC_TICK_INVALID, 0.0f, 0.0f);
+}
+
+static void
+vlc_player_StopDiscontinuity(vlc_player_t *player, vlc_tick_t time, float pos,
+                             float rate)
+{
+    struct vlc_player_input *input = player->input;
+    if (!input->discontinuity)
+        return;
+
+    if (input->cache == 1.f && input->state == PLAYING_S)
+    {
+        input->discontinuity = false;
+        vlc_player_SendEvent(player, on_discontinuity_changed,
+                             input->discontinuity, time, pos, rate);
+    }
+}
+
 static void
 vlc_player_input_HandleEsEvent(struct vlc_player_input *input,
                                const struct vlc_input_event_es *ev)
@@ -729,6 +761,7 @@ input_thread_events(input_thread_t *input_thread,
                     break;
                 case PAUSE_S:
                     player_state = VLC_PLAYER_STATE_PAUSED;
+                    vlc_player_StartDiscontinuity(player);
                     break;
                 case END_S:
                     player_state = VLC_PLAYER_STATE_STOPPED;
@@ -747,7 +780,7 @@ input_thread_events(input_thread_t *input_thread,
         case INPUT_EVENT_RATE:
             input->rate = event->rate;
             vlc_player_SendEvent(player, on_rate_changed, input->rate);
-            vlc_player_SendEvent(player, on_discontinuity, false);
+            vlc_player_StartDiscontinuity(player);
             break;
         case INPUT_EVENT_CAPABILITIES:
             input->capabilities = event->capabilities;
@@ -768,6 +801,9 @@ input_thread_events(input_thread_t *input_thread,
             input->position_ms = event->position.ms;
             input->position_percent = event->position.percentage;
             input->position_date = vlc_tick_now();
+            /* INPUT_EVENT_POSITION */
+            vlc_player_StopDiscontinuity(player,input->position_ms,
+                                         input->position_percent, input->rate);
             break;
         case INPUT_EVENT_LENGTH:
             input->length = event->length;
@@ -807,6 +843,8 @@ input_thread_events(input_thread_t *input_thread,
             break;
         case INPUT_EVENT_CACHE:
             input->cache = event->cache;
+            if (input->cache == 0.0f)
+                vlc_player_StartDiscontinuity(player);
             vlc_player_SendEvent(player, on_buffering, event->cache);
             break;
         case INPUT_EVENT_AOUT:
-- 
2.18.0



More information about the vlc-devel mailing list