[vlc-commits] dbus: replace discontinuity detection by player timer

Alexandre Janniaux git at videolan.org
Sat Apr 11 09:13:20 CEST 2020


vlc | branch: master | Alexandre Janniaux <ajanni at videolabs.io> | Sat Apr  4 12:09:44 2020 +0200| [a33ac07870914bde81b5a7a417f717a2b12185db] | committer: Alexandre Janniaux

dbus: replace discontinuity detection by player timer

The new Player timer API is able to signal discontinuities so there is
no need for the previous convoluted threshold detection.

When the timer callback `on_discontinuity` is called, either a
discontinuity has been signalled, coming from a seek or the media
itself, or the playback has been paused or stopped.

Pause can be detected because it's the only case where `system_date`
is a valid tick but for stopped we use the VLC_PLAYER_STATE_STOPPING
state which sets i_playback_state to PLAYBACK_STATE_STOPPED.

To clarify that VLC_PLAYER_STATE_STOPPING is used, it is added to the
switch case even if there is no behaviour change.

In addition, it removes the warning on llabs usage with float.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a33ac07870914bde81b5a7a417f717a2b12185db
---

 modules/control/dbus/dbus.c        | 77 +++++++++++++++++++-------------------
 modules/control/dbus/dbus_common.h |  4 +-
 2 files changed, 40 insertions(+), 41 deletions(-)

diff --git a/modules/control/dbus/dbus.c b/modules/control/dbus/dbus.c
index b497be4656..b968ba9e94 100644
--- a/modules/control/dbus/dbus.c
+++ b/modules/control/dbus/dbus.c
@@ -146,8 +146,6 @@ static void player_on_error_changed(vlc_player_t *,
                                     enum vlc_player_error, void *);
 static void player_on_rate_changed(vlc_player_t *, float, void *);
 static void player_on_capabilities_changed(vlc_player_t *, int, int, void *);
-static void player_on_position_changed(vlc_player_t *,
-                                       vlc_tick_t, float, void *);
 static void player_on_media_meta_changed(vlc_player_t *,
                                          input_item_t *, void *);
 
@@ -155,6 +153,8 @@ static void player_aout_on_volume_changed(audio_output_t *, float, void *);
 static void player_aout_on_mute_changed(audio_output_t *, bool, void *);
 
 static void player_vout_on_fullscreen_changed(vout_thread_t *, bool, void *);
+static void player_timer_on_discontinuity(vlc_tick_t system_dae, void *data);
+static void player_timer_on_update(const struct vlc_player_timer_point *, void *);
 
 /*****************************************************************************
  * Module descriptor
@@ -278,7 +278,6 @@ static int Open( vlc_object_t *p_this )
         .on_error_changed = player_on_error_changed,
         .on_rate_changed = player_on_rate_changed,
         .on_capabilities_changed = player_on_capabilities_changed,
-        .on_position_changed = player_on_position_changed,
         .on_media_meta_changed = player_on_media_meta_changed,
     };
     p_sys->player_listener =
@@ -305,6 +304,16 @@ static int Open( vlc_object_t *p_this )
     if (!p_sys->player_vout_listener)
         goto player_vout_listener_failure;
 
+    static struct vlc_player_timer_cbs const player_timer_cbs =
+    {
+        .on_update = player_timer_on_update,
+        .on_discontinuity = player_timer_on_discontinuity,
+    };
+    p_sys->player_timer =
+        vlc_player_AddTimer(player, VLC_TICK_INVALID, &player_timer_cbs, p_intf);
+    if (!p_sys->player_timer)
+        goto player_timer_failure;
+
     vlc_playlist_Unlock(playlist);
 
     if( !dbus_connection_set_timeout_functions( p_conn,
@@ -328,6 +337,8 @@ static int Open( vlc_object_t *p_this )
 
 late_failure:
     vlc_playlist_Lock(playlist);
+    vlc_player_RemoveTimer(player, p_sys->player_timer);
+player_timer_failure:
     vlc_player_vout_RemoveListener(player, p_sys->player_vout_listener);
 player_vout_listener_failure:
     vlc_player_aout_RemoveListener(player, p_sys->player_aout_listener);
@@ -368,6 +379,7 @@ static void Close   ( vlc_object_t *p_this )
 
     vlc_player_t *player = vlc_playlist_GetPlayer(playlist);
     vlc_playlist_Lock(playlist);
+    vlc_player_RemoveTimer(player, p_sys->player_timer);
     vlc_player_vout_RemoveListener(player, p_sys->player_vout_listener);
     vlc_player_aout_RemoveListener(player, p_sys->player_aout_listener);
     vlc_player_RemoveListener(player, p_sys->player_listener);
@@ -1039,6 +1051,9 @@ player_on_state_changed(vlc_player_t *player, enum vlc_player_state state,
         case VLC_PLAYER_STATE_PAUSED:
             playing_state = PLAYBACK_STATE_PAUSED;
             break;
+        /* STOPPING is used to detect time discontinuities that are coming
+         * from stopping the playback in the vlc player timer callbacks. */
+        case VLC_PLAYER_STATE_STOPPING:
         case VLC_PLAYER_STATE_STOPPED:
         default:
             playing_state = PLAYBACK_STATE_STOPPED;
@@ -1093,41 +1108,6 @@ player_on_capabilities_changed(vlc_player_t *player, int old_caps, int new_caps,
     (void) player; (void) old_caps; (void) new_caps;
 }
 
-static void
-player_on_position_changed(vlc_player_t *player, vlc_tick_t time, float pos,
-                           void *data)
-{
-    intf_thread_t *intf = data;
-    intf_sys_t *sys = intf->p_sys;
-    vlc_tick_t i_now = vlc_tick_now(), i_projected_pos, i_interval;
-    float f_current_rate;
-
-    /* Detect seeks: moved from 1857cab238c
-     * XXX: This is way more convoluted than it should be... */
-
-    if( !sys->i_last_input_pos_event ||
-        vlc_player_GetState(player) != VLC_PLAYER_STATE_PLAYING )
-    {
-        sys->i_last_input_pos_event = i_now;
-        sys->i_last_input_pos = pos;
-        return;
-    }
-
-    f_current_rate = vlc_player_GetRate(player);
-    i_interval = ( i_now - sys->i_last_input_pos_event );
-
-    i_projected_pos = sys->i_last_input_pos + ( i_interval * f_current_rate );
-
-    sys->i_last_input_pos_event = i_now;
-    sys->i_last_input_pos = pos;
-
-    if( llabs( pos - i_projected_pos ) < SEEK_THRESHOLD )
-        return;
-
-    add_event_signal(intf, &(callback_info_t){ .signal = SIGNAL_SEEK });
-    (void) time;
-}
-
 static void
 player_on_media_meta_changed(vlc_player_t *player,
                              input_item_t *item, void *data)
@@ -1161,6 +1141,27 @@ player_vout_on_fullscreen_changed(vout_thread_t *vout, bool enabled,
     (void) vout; (void) enabled;
 }
 
+static void
+player_timer_on_update(const struct vlc_player_timer_point *value, void *data)
+{
+    /* The callback is not used by mandatory in the vlc_player_timer API */
+    VLC_UNUSED(value);
+    VLC_UNUSED(data);
+}
+
+static void
+player_timer_on_discontinuity(vlc_tick_t system_date, void *data)
+{
+    intf_thread_t *intf = data;
+    intf_sys_t *sys = intf->p_sys;
+
+    bool stopping = sys->i_playing_state == PLAYBACK_STATE_STOPPED;
+    bool paused = system_date != VLC_TICK_INVALID;
+
+    if( !paused && !stopping )
+        add_event_signal(intf, &(callback_info_t){ .signal = SIGNAL_SEEK });
+}
+
 /*****************************************************************************
  * TrackChange: callback on playlist_on_current_index_changed
  *****************************************************************************/
diff --git a/modules/control/dbus/dbus_common.h b/modules/control/dbus/dbus_common.h
index c505d4ee1b..7cb82212bc 100644
--- a/modules/control/dbus/dbus_common.h
+++ b/modules/control/dbus/dbus_common.h
@@ -96,6 +96,7 @@ struct intf_sys_t
     vlc_player_listener_id      *player_listener;
     vlc_player_aout_listener_id *player_aout_listener;
     vlc_player_vout_listener_id *player_vout_listener;
+    vlc_player_timer_id         *player_timer;
 
     DBusConnection *p_conn;
     bool            b_meta_read;
@@ -110,9 +111,6 @@ struct intf_sys_t
     vlc_mutex_t     lock;
     vlc_thread_t    thread;
     bool            has_input;
-
-    vlc_tick_t      i_last_input_pos; /* Only access from input thread */
-    vlc_tick_t      i_last_input_pos_event; /* Same as above */
 };
 
 enum



More information about the vlc-commits mailing list