[vlc-commits] [Git][videolan/vlc][master] 8 commits: player: move seek functions to player/input.c

Steve Lhomme (@robUx4) gitlab at videolan.org
Sat Jan 13 07:40:24 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
b2e4fe99 by Thomas Guillem at 2024-01-13T07:09:06+00:00
player: move seek functions to player/input.c

No functional changes.

- - - - -
cf93b5ce by Thomas Guillem at 2024-01-13T07:09:06+00:00
player: move viewpoint function to player/input.c

No functional changes.

- - - - -
80a9b2d3 by Thomas Guillem at 2024-01-13T07:09:06+00:00
player: handle navigation fallback in the player

- - - - -
c49bcbcd by Thomas Guillem at 2024-01-13T07:09:06+00:00
player: handle VLC_TICK_INVALID in vlc_player_GetTimerPoint()

Add add a way to not interpolate the last point when using VLC_TICK_INVALID.

- - - - -
867c6405 by Thomas Guillem at 2024-01-13T07:09:06+00:00
player: specify the interpolated date when getting pos/time

This allows to ask for an interpolated point or not, and this allows to
use the same time reference when getting position and time.

- - - - -
00d319d6 by Thomas Guillem at 2024-01-13T07:09:06+00:00
player: remove unused declaration

- - - - -
76e5e6a8 by Thomas Guillem at 2024-01-13T07:09:06+00:00
player: send a discontinuity to the timer after a seek

For the input source (NULL), this is needed in the unlikely case where
there are no ESes active.

- - - - -
66204d92 by Thomas Guillem at 2024-01-13T07:09:06+00:00
player: timer: use double for input_position

The rest of the code already use double precision.

- - - - -


7 changed files:

- src/input/input.c
- src/input/input_internal.h
- src/player/input.c
- src/player/osd.c
- src/player/player.c
- src/player/player.h
- src/player/timer.c


Changes:

=====================================
src/input/input.c
=====================================
@@ -1755,80 +1755,10 @@ static void ControlNav( input_thread_t *p_input, int i_type )
                         - INPUT_CONTROL_NAV_ACTIVATE + DEMUX_NAV_ACTIVATE ) )
         return; /* The demux handled the navigation control */
 
-    /* Handle Up/Down/Left/Right if the demux can't navigate */
-    vlc_viewpoint_t vp = {0};
-    int vol_direction = 0;
-    int seek_direction = 0;
-    switch( i_type )
-    {
-        case INPUT_CONTROL_NAV_UP:
-            vol_direction = 1;
-            vp.pitch = -1.f;
-            break;
-        case INPUT_CONTROL_NAV_DOWN:
-            vol_direction = -1;
-            vp.pitch = 1.f;
-            break;
-        case INPUT_CONTROL_NAV_LEFT:
-            seek_direction = -1;
-            vp.yaw = -1.f;
-            break;
-        case INPUT_CONTROL_NAV_RIGHT:
-            seek_direction = 1;
-            vp.yaw = 1.f;
-            break;
-        case INPUT_CONTROL_NAV_ACTIVATE:
-        case INPUT_CONTROL_NAV_POPUP:
-        case INPUT_CONTROL_NAV_MENU:
-            return;
-        default:
-            vlc_assert_unreachable();
-    }
-
-    /* Try to change the viewpoint if possible */
-    vout_thread_t **pp_vout;
-    size_t i_vout;
-    bool b_viewpoint_ch = false;
-    input_resource_HoldVouts( priv->p_resource, &pp_vout, &i_vout );
-    for( size_t i = 0; i < i_vout; ++i )
-    {
-        if( !b_viewpoint_ch
-         && var_GetBool( pp_vout[i], "viewpoint-changeable" ) )
-            b_viewpoint_ch = true;
-        vout_Release(pp_vout[i]);
-    }
-    free( pp_vout );
-
-    if( b_viewpoint_ch )
-    {
-        priv->viewpoint_changed = true;
-        priv->viewpoint.yaw   += vp.yaw;
-        priv->viewpoint.pitch += vp.pitch;
-        priv->viewpoint.roll  += vp.roll;
-        priv->viewpoint.fov   += vp.fov;
-        ViewpointApply( p_input );
-        return;
-    }
-
-    /* Seek or change volume if the input doesn't have navigation or viewpoint */
-    if( seek_direction != 0 )
-    {
-        vlc_tick_t it = vlc_tick_from_sec( seek_direction * var_InheritInteger( p_input, "short-jump-size" ) );
-        Control( p_input, INPUT_CONTROL_JUMP_TIME, (input_control_param_t) {
-            .time.b_fast_seek = false,
-            .time.i_val = it
-        });
-    }
-    else
-    {
-        assert( vol_direction != 0 );
-        audio_output_t *p_aout = input_resource_HoldAout( priv->p_resource );
-        if( p_aout )
-        {
-            aout_VolumeUpdate( p_aout, vol_direction, NULL );
-            aout_Release(p_aout);
-        }
-    }
+    input_SendEvent(p_input, &(struct vlc_input_event) {
+        .type = INPUT_EVENT_NAV_FAILED,
+        .nav_type = i_type,
+    });
 }
 
 static void ControlUpdateRenderer( input_thread_t *p_input, bool b_enable )


=====================================
src/input/input_internal.h
=====================================
@@ -145,6 +145,9 @@ typedef enum input_event_type_e
 
     /* Attachments */
     INPUT_EVENT_ATTACHMENTS,
+
+    /* The demux is not able to navigate */
+    INPUT_EVENT_NAV_FAILED,
 } input_event_type_e;
 
 #define VLC_INPUT_CAPABILITIES_SEEKABLE (1<<0)
@@ -310,6 +313,8 @@ struct vlc_input_event
         picture_t *thumbnail;
         /* INPUT_EVENT_ATTACHMENTS */
         struct vlc_input_event_attachments attachments;
+        /* INPUT_EVENT_NAV_FAILED */
+        int nav_type;
     };
 };
 


=====================================
src/player/input.c
=====================================
@@ -59,25 +59,25 @@ vlc_player_input_HandleAtoBLoop(struct vlc_player_input *input, vlc_tick_t time,
 }
 
 vlc_tick_t
-vlc_player_input_GetTime(struct vlc_player_input *input)
+vlc_player_input_GetTime(struct vlc_player_input *input, vlc_tick_t system_now)
 {
     vlc_player_t *player = input->player;
     vlc_tick_t ts;
 
     if (input == player->input
-     && vlc_player_GetTimerPoint(player, vlc_tick_now(), &ts, NULL) == 0)
+     && vlc_player_GetTimerPoint(player, system_now, &ts, NULL) == 0)
         return ts;
     return input->time;
 }
 
 double
-vlc_player_input_GetPos(struct vlc_player_input *input)
+vlc_player_input_GetPos(struct vlc_player_input *input, vlc_tick_t system_now)
 {
     vlc_player_t *player = input->player;
     double pos;
 
     if (input == player->input
-     && vlc_player_GetTimerPoint(player, vlc_tick_now(), NULL, &pos) == 0)
+     && vlc_player_GetTimerPoint(player, system_now, NULL, &pos) == 0)
         return pos;
     return input->position;
 }
@@ -86,8 +86,12 @@ static void
 vlc_player_input_UpdateTime(struct vlc_player_input *input)
 {
     if (input->abloop_state[0].set && input->abloop_state[1].set)
-        vlc_player_input_HandleAtoBLoop(input, vlc_player_input_GetTime(input),
-                                        vlc_player_input_GetPos(input));
+    {
+        vlc_tick_t now = vlc_tick_now();
+        vlc_player_input_HandleAtoBLoop(input,
+                                        vlc_player_input_GetTime(input, now),
+                                        vlc_player_input_GetPos(input, now));
+    }
 }
 
 int
@@ -100,6 +104,74 @@ vlc_player_input_Start(struct vlc_player_input *input)
     return ret;
 }
 
+static inline void
+vlc_player_assert_seek_params(enum vlc_player_seek_speed speed,
+                              enum vlc_player_whence whence)
+{
+    assert(speed == VLC_PLAYER_SEEK_PRECISE
+        || speed == VLC_PLAYER_SEEK_FAST);
+    assert(whence == VLC_PLAYER_WHENCE_ABSOLUTE
+        || whence == VLC_PLAYER_WHENCE_RELATIVE);
+    (void) speed; (void) whence;
+}
+
+void
+vlc_player_input_SeekByPos(struct vlc_player_input *input, double position,
+                           enum vlc_player_seek_speed speed,
+                           enum vlc_player_whence whence)
+{
+    vlc_player_t *player = input->player;
+    vlc_player_assert_seek_params(speed, whence);
+
+    const int type =
+        whence == VLC_PLAYER_WHENCE_ABSOLUTE ? INPUT_CONTROL_SET_POSITION
+                                             : INPUT_CONTROL_JUMP_POSITION;
+    int ret = input_ControlPush(input->thread, type,
+        &(input_control_param_t) {
+            .pos.f_val = position,
+            .pos.b_fast_seek = speed == VLC_PLAYER_SEEK_FAST,
+    });
+
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Position(player, input, VLC_TICK_INVALID, position,
+                                whence);
+}
+
+void
+vlc_player_input_SeekByTime(struct vlc_player_input *input, vlc_tick_t time,
+                            enum vlc_player_seek_speed speed,
+                            enum vlc_player_whence whence)
+{
+    vlc_player_t *player = input->player;
+    vlc_player_assert_seek_params(speed, whence);
+
+    const int type =
+        whence == VLC_PLAYER_WHENCE_ABSOLUTE ? INPUT_CONTROL_SET_TIME
+                                             : INPUT_CONTROL_JUMP_TIME;
+    int ret = input_ControlPush(input->thread, type,
+        &(input_control_param_t) {
+            .time.i_val = time,
+            .time.b_fast_seek = speed == VLC_PLAYER_SEEK_FAST,
+    });
+
+    if (ret == VLC_SUCCESS)
+        vlc_player_osd_Position(player, input, time, -1, whence);
+}
+
+void
+vlc_player_input_UpdateViewpoint(struct vlc_player_input *input,
+                                 const vlc_viewpoint_t *viewpoint,
+                                 enum vlc_player_whence whence)
+{
+    input_control_param_t param = { .viewpoint = *viewpoint };
+    if (whence == VLC_PLAYER_WHENCE_ABSOLUTE)
+        input_ControlPush(input->thread, INPUT_CONTROL_SET_VIEWPOINT,
+                          &param);
+    else
+        input_ControlPush(input->thread, INPUT_CONTROL_UPDATE_VIEWPOINT,
+                          &param);
+}
+
 static bool
 vlc_player_WaitRetryDelay(vlc_player_t *player)
 {
@@ -723,6 +795,71 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input,
     }
 }
 
+static void
+vlc_player_input_NavigationFallback(struct vlc_player_input *input, int nav_type)
+{
+    vlc_player_t *player = input->player;
+
+    /* Handle Up/Down/Left/Right if the demux can't navigate */
+    vlc_viewpoint_t vp = { 0 };
+    int vol_direction = 0;
+    int seek_direction = 0;
+    switch (nav_type)
+    {
+        case INPUT_CONTROL_NAV_UP:
+            vol_direction = 1;
+            vp.pitch = -1.f;
+            break;
+        case INPUT_CONTROL_NAV_DOWN:
+            vol_direction = -1;
+            vp.pitch = 1.f;
+            break;
+        case INPUT_CONTROL_NAV_LEFT:
+            seek_direction = -1;
+            vp.yaw = -1.f;
+            break;
+        case INPUT_CONTROL_NAV_RIGHT:
+            seek_direction = 1;
+            vp.yaw = 1.f;
+            break;
+        case INPUT_CONTROL_NAV_ACTIVATE:
+        case INPUT_CONTROL_NAV_POPUP:
+        case INPUT_CONTROL_NAV_MENU:
+            return;
+        default:
+            vlc_assert_unreachable();
+    }
+
+    /* Try to change the viewpoint if possible */
+    bool viewpoint_ch = false;
+    size_t vout_count;
+    vout_thread_t **vouts = vlc_player_vout_HoldAll(input->player, &vout_count);
+    for (size_t i = 0; i < vout_count; ++i)
+    {
+        if (!viewpoint_ch && var_GetBool(vouts[i], "viewpoint-changeable"))
+            viewpoint_ch = true;
+        vout_Release(vouts[i]);
+    }
+    free(vouts);
+
+    if (viewpoint_ch)
+        vlc_player_input_UpdateViewpoint(input, &vp, VLC_PLAYER_WHENCE_RELATIVE);
+    else if (seek_direction != 0)
+    {
+        /* Seek or change volume if the input doesn't have navigation or viewpoint */
+        vlc_tick_t it = vlc_tick_from_sec(seek_direction
+                      * var_InheritInteger(player, "short-jump-size"));
+        vlc_player_input_SeekByTime(input, it, VLC_PLAYER_SEEK_PRECISE,
+                                    VLC_PLAYER_WHENCE_RELATIVE);
+    }
+    else
+    {
+        assert(vol_direction != 0);
+        if (input == player->input)
+            vlc_player_aout_IncrementVolume(player, vol_direction, NULL);
+    }
+}
+
 static void
 input_thread_Events(input_thread_t *input_thread,
                     const struct vlc_input_event *event, void *user_data)
@@ -853,6 +990,10 @@ input_thread_Events(input_thread_t *input_thread,
                                  input->signal_quality, input->signal_strength);
             break;
         case INPUT_EVENT_CACHE:
+            if (event->cache == 0.0f)
+                vlc_player_UpdateTimerState(player, NULL,
+                                            VLC_PLAYER_TIMER_STATE_DISCONTINUITY,
+                                            VLC_TICK_INVALID);
             input->cache = event->cache;
             vlc_player_SendEvent(player, on_buffering_changed, event->cache);
             break;
@@ -894,6 +1035,9 @@ input_thread_Events(input_thread_t *input_thread,
                                  event->attachments.array,
                                  event->attachments.count);
             break;
+        case INPUT_EVENT_NAV_FAILED:
+            vlc_player_input_NavigationFallback(input, event->nav_type);
+            break;
         default:
             break;
     }


=====================================
src/player/osd.c
=====================================
@@ -121,6 +121,8 @@ vlc_player_osd_Position(vlc_player_t *player,
                         struct vlc_player_input *input, vlc_tick_t time,
                         double position, enum vlc_player_whence whence)
 {
+    vlc_tick_t now = vlc_tick_now();
+
     if (input->length != VLC_TICK_INVALID)
     {
         if (time == VLC_TICK_INVALID)
@@ -136,7 +138,7 @@ vlc_player_osd_Position(vlc_player_t *player,
     {
         if (whence == VLC_PLAYER_WHENCE_RELATIVE)
         {
-            time += vlc_player_input_GetTime(input); /* XXX: TOCTOU */
+            time += vlc_player_input_GetTime(input, now);
             if (time < 0)
                 time = 0;
         }
@@ -157,7 +159,7 @@ vlc_player_osd_Position(vlc_player_t *player,
     {
         if (whence == VLC_PLAYER_WHENCE_RELATIVE)
         {
-            position += vlc_player_input_GetPos(input); /* XXX: TOCTOU */
+            position += vlc_player_input_GetPos(input, now);
             if (position < 0.f)
                 position = 0.f;
         }


=====================================
src/player/player.c
=====================================
@@ -1378,7 +1378,7 @@ vlc_player_GetTime(vlc_player_t *player)
     if (!input)
         return VLC_TICK_INVALID;
 
-    return vlc_player_input_GetTime(input);
+    return vlc_player_input_GetTime(input, vlc_tick_now());
 }
 
 double
@@ -1386,18 +1386,7 @@ vlc_player_GetPosition(vlc_player_t *player)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
 
-    return input ? vlc_player_input_GetPos(input) : -1.f;
-}
-
-static inline void
-vlc_player_assert_seek_params(enum vlc_player_seek_speed speed,
-                              enum vlc_player_whence whence)
-{
-    assert(speed == VLC_PLAYER_SEEK_PRECISE
-        || speed == VLC_PLAYER_SEEK_FAST);
-    assert(whence == VLC_PLAYER_WHENCE_ABSOLUTE
-        || whence == VLC_PLAYER_WHENCE_RELATIVE);
-    (void) speed; (void) whence;
+    return input ? vlc_player_input_GetPos(input, vlc_tick_now()) : -1.f;
 }
 
 void
@@ -1406,9 +1395,11 @@ vlc_player_DisplayPosition(vlc_player_t *player)
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
     if (!input)
         return;
+
+    vlc_tick_t now = vlc_tick_now();
     vlc_player_osd_Position(player, input,
-                            vlc_player_input_GetTime(input),
-                            vlc_player_input_GetPos(input),
+                            vlc_player_input_GetTime(input, now),
+                            vlc_player_input_GetPos(input, now),
                             VLC_PLAYER_WHENCE_ABSOLUTE);
 }
 
@@ -1417,24 +1408,9 @@ vlc_player_SeekByPos(vlc_player_t *player, double position,
                      enum vlc_player_seek_speed speed,
                      enum vlc_player_whence whence)
 {
-    vlc_player_assert_seek_params(speed, whence);
-
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
-    if (!input)
-        return;
-
-    const int type =
-        whence == VLC_PLAYER_WHENCE_ABSOLUTE ? INPUT_CONTROL_SET_POSITION
-                                             : INPUT_CONTROL_JUMP_POSITION;
-    int ret = input_ControlPush(input->thread, type,
-        &(input_control_param_t) {
-            .pos.f_val = position,
-            .pos.b_fast_seek = speed == VLC_PLAYER_SEEK_FAST,
-    });
-
-    if (ret == VLC_SUCCESS)
-        vlc_player_osd_Position(player, input, VLC_TICK_INVALID, position,
-                                whence);
+    if (input != NULL)
+        vlc_player_input_SeekByPos(input, position, speed, whence);
 }
 
 void
@@ -1442,23 +1418,9 @@ vlc_player_SeekByTime(vlc_player_t *player, vlc_tick_t time,
                       enum vlc_player_seek_speed speed,
                       enum vlc_player_whence whence)
 {
-    vlc_player_assert_seek_params(speed, whence);
-
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
-    if (!input)
-        return;
-
-    const int type =
-        whence == VLC_PLAYER_WHENCE_ABSOLUTE ? INPUT_CONTROL_SET_TIME
-                                             : INPUT_CONTROL_JUMP_TIME;
-    int ret = input_ControlPush(input->thread, type,
-        &(input_control_param_t) {
-            .time.i_val = time,
-            .time.b_fast_seek = speed == VLC_PLAYER_SEEK_FAST,
-    });
-
-    if (ret == VLC_SUCCESS)
-        vlc_player_osd_Position(player, input, time, -1, whence);
+    if (input != NULL)
+        vlc_player_input_SeekByTime(input, time, speed, whence);
 }
 
 void
@@ -1612,16 +1574,8 @@ vlc_player_UpdateViewpoint(vlc_player_t *player,
                            enum vlc_player_whence whence)
 {
     struct vlc_player_input *input = vlc_player_get_input_locked(player);
-    if (input)
-    {
-        input_control_param_t param = { .viewpoint = *viewpoint };
-        if (whence == VLC_PLAYER_WHENCE_ABSOLUTE)
-            input_ControlPush(input->thread, INPUT_CONTROL_SET_VIEWPOINT,
-                              &param);
-        else
-            input_ControlPush(input->thread, INPUT_CONTROL_UPDATE_VIEWPOINT,
-                              &param);
-    }
+    if (input != NULL)
+        vlc_player_input_UpdateViewpoint(input, viewpoint, whence);
 }
 
 bool


=====================================
src/player/player.h
=====================================
@@ -220,7 +220,7 @@ struct vlc_player_timer
     vlc_tick_t input_length;
     vlc_tick_t input_normal_time;
     vlc_tick_t last_ts;
-    float input_position;
+    double input_position;
 
     struct vlc_player_timer_source sources[VLC_PLAYER_TIMER_TYPE_COUNT];
 #define best_source sources[VLC_PLAYER_TIMER_TYPE_BEST]
@@ -437,21 +437,33 @@ vlc_player_input_GetSelectedTrackStringIds(struct vlc_player_input *input,
                                            enum es_format_category_e cat) VLC_MALLOC;
 
 vlc_tick_t
-vlc_player_input_GetTime(struct vlc_player_input *input);
+vlc_player_input_GetTime(struct vlc_player_input *input, vlc_tick_t system_now);
 
 double
-vlc_player_input_GetPos(struct vlc_player_input *input);
+vlc_player_input_GetPos(struct vlc_player_input *input, vlc_tick_t system_now);
 
 int
 vlc_player_input_Start(struct vlc_player_input *input);
 
+void
+vlc_player_input_SeekByPos(struct vlc_player_input *input, double position,
+                           enum vlc_player_seek_speed speed,
+                           enum vlc_player_whence whence);
+
+void
+vlc_player_input_SeekByTime(struct vlc_player_input *input, vlc_tick_t time,
+                            enum vlc_player_seek_speed speed,
+                            enum vlc_player_whence whence);
+
+void
+vlc_player_input_UpdateViewpoint(struct vlc_player_input *input,
+                                 const vlc_viewpoint_t *viewpoint,
+                                 enum vlc_player_whence whence);
+
 void
 vlc_player_input_HandleState(struct vlc_player_input *, enum vlc_player_state,
                              vlc_tick_t state_date);
 
-struct vlc_player_timer_point
-vlc_player_input_GetTimerValue(struct vlc_player_input *input);
-
 /*
  * player_timer.c
 */


=====================================
src/player/timer.c
=====================================
@@ -35,7 +35,7 @@ vlc_player_ResetTimer(vlc_player_t *player)
     player->timer.input_length = VLC_TICK_INVALID;
     player->timer.input_normal_time = VLC_TICK_0;
     player->timer.last_ts = VLC_TICK_INVALID;
-    player->timer.input_position = 0.f;
+    player->timer.input_position = 0;
     player->timer.smpte_source.smpte.last_framenum = ULONG_MAX;
 
     vlc_mutex_unlock(&player->timer.lock);
@@ -401,15 +401,19 @@ int
 vlc_player_GetTimerPoint(vlc_player_t *player, vlc_tick_t system_now,
                          vlc_tick_t *out_ts, double *out_pos)
 {
+    int ret;
     vlc_mutex_lock(&player->timer.lock);
     if (player->timer.best_source.point.system_date == VLC_TICK_INVALID)
     {
         vlc_mutex_unlock(&player->timer.lock);
         return VLC_EGENERIC;
     }
-    int ret =
-        vlc_player_timer_point_Interpolate(&player->timer.best_source.point,
-                                           system_now, out_ts, out_pos);
+
+    if (system_now != VLC_TICK_INVALID)
+        ret = vlc_player_timer_point_Interpolate(&player->timer.best_source.point,
+                                                 system_now, out_ts, out_pos);
+    else
+        ret = VLC_SUCCESS;
 
     vlc_mutex_unlock(&player->timer.lock);
     return ret;



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/cbc4a25619dc8169a0ce16fd2e38355010b351ad...66204d9244a96a03569492ec40262e20cb2b03f6

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/cbc4a25619dc8169a0ce16fd2e38355010b351ad...66204d9244a96a03569492ec40262e20cb2b03f6
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list