Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
c2429632 by Thomas Guillem at 2024-04-14T12:19:45+00:00
test: player: add pts_delay in struct media_params

Refs #26609

- - - - -
55c2b8a8 by Thomas Guillem at 2024-04-14T12:19:45+00:00
test: player: set pts_delay to the length of the test

This will prevent a RESET_PCR and ensure we receive all outputs points.

Refs #26609

- - - - -
b685494e by Thomas Guillem at 2024-04-14T12:19:45+00:00
player: timer: assert the state is handled

- - - - -
1c5d6998 by Thomas Guillem at 2024-04-14T12:19:45+00:00
player: timer: split vlc_player_UpdateTimer

In 2 functions: vlc_player_UpdateTimerBestSource and
vlc_player_UpdateTimerSmpteSource.

No functional changes.

- - - - -
acf833a6 by Thomas Guillem at 2024-04-14T12:19:45+00:00
player: timer: don't update BestSource when stopping

This will prevent to send updates after the last discontinuity (when the output
is deleted) from other ES sources.

This could happen with a high CPU load:

timer: update: source: audio/0, ts: 197001 npt: 1
timer: update: source: audio/0, ts: 198001 npt: 1
timer: update: source: audio/0, ts: 199001 npt: 1
timer: discontinuity: source: input
timer: discontinuity: source: audio/0
timer: update: source: video/0, ts: 191660 npt: 1
timer: discontinuity: source: video/0

Refs #26609

- - - - -
d221a4a4 by Thomas Guillem at 2024-04-14T12:19:45+00:00
player: don't add npt to input times

The player timer will handle it.

Fixes #26609

- - - - -


4 changed files:

- src/player/input.c
- src/player/player.h
- src/player/timer.c
- test/src/player/player.c


Changes:

=====================================
src/player/input.c
=====================================
@@ -276,6 +276,10 @@ vlc_player_input_HandleState(struct vlc_player_input 
*input,
                                         VLC_PLAYER_TIMER_STATE_DISCONTINUITY,
                                         VLC_TICK_INVALID);
 
+            vlc_player_UpdateTimerState(player, NULL,
+                                        VLC_PLAYER_TIMER_STATE_STOPPING,
+                                        VLC_TICK_INVALID);
+
             if (input == player->input)
                 player->input = NULL;
 
@@ -945,7 +949,7 @@ input_thread_Events(input_thread_t *input_thread,
                 const struct vlc_player_timer_point point = {
                     .position = input->position,
                     .rate = input->rate,
-                    .ts = input->time + input->normal_time,
+                    .ts = input->time,
                     .length = input->length,
                     .system_date = system_date,
                 };


=====================================
src/player/player.h
=====================================
@@ -208,6 +208,7 @@ enum vlc_player_timer_state
     VLC_PLAYER_TIMER_STATE_PLAYING,
     VLC_PLAYER_TIMER_STATE_PAUSED,
     VLC_PLAYER_TIMER_STATE_DISCONTINUITY,
+    VLC_PLAYER_TIMER_STATE_STOPPING,
 };
 
 struct vlc_player_timer


=====================================
src/player/timer.c
=====================================
@@ -237,12 +237,18 @@ vlc_player_UpdateTimerState(vlc_player_t *player, 
vlc_es_id_t *es_source,
             assert(system_date != VLC_TICK_INVALID);
             break;
 
-        default:
         case VLC_PLAYER_TIMER_STATE_PLAYING:
             break;
+
+        case VLC_PLAYER_TIMER_STATE_STOPPING:
+            break;
+
+        default:
+            vlc_assert_unreachable();
     }
 
-    player->timer.state = state;
+    if (player->timer.state != VLC_PLAYER_TIMER_STATE_STOPPING)
+        player->timer.state = state;
 
     if (!notify)
     {
@@ -328,59 +334,13 @@ vlc_player_UpdateTimerSource(vlc_player_t *player,
         source->point.position = player->timer.input_position;
 }
 
-void
-vlc_player_UpdateTimer(vlc_player_t *player, vlc_es_id_t *es_source,
-                       bool es_source_is_master,
-                       const struct vlc_player_timer_point *point,
-                       vlc_tick_t normal_time,
-                       unsigned frame_rate, unsigned frame_rate_base)
+static void
+vlc_player_UpdateTimerBestSource(vlc_player_t *player, vlc_es_id_t *es_source,
+                                 bool es_source_is_master,
+                                 const struct vlc_player_timer_point *point,
+                                 vlc_tick_t system_date,
+                                 bool force_update)
 {
-    struct vlc_player_timer_source *source;
-    assert(point);
-    /* A null source can't be the master */
-    assert(es_source == NULL ? !es_source_is_master : true);
-
-    vlc_mutex_lock(&player->timer.lock);
-
-    bool force_update = false;
-    if (!es_source) /* input source */
-    {
-        /* Only valid for input sources */
-        if (player->timer.input_normal_time != normal_time)
-        {
-            player->timer.input_normal_time = normal_time;
-            player->timer.last_ts = VLC_TICK_INVALID;
-            force_update = true;
-        }
-        if (player->timer.input_length != point->length
-         && point->length >= VLC_TICK_0)
-        {
-            player->timer.input_length = point->length;
-            player->timer.last_ts = VLC_TICK_INVALID;
-            force_update = true;
-        }
-        /* Will likely be overridden by non input source */
-        player->timer.input_position = point->position;
-
-        if (point->ts == VLC_TICK_INVALID
-         || point->system_date == VLC_TICK_INVALID)
-        {
-            /* ts can only be invalid from the input source */
-            vlc_mutex_unlock(&player->timer.lock);
-            return;
-        }
-    }
-
-    assert(point->ts != VLC_TICK_INVALID);
-
-    vlc_tick_t system_date = point->system_date;
-    if (player->timer.state == VLC_PLAYER_TIMER_STATE_PAUSED)
-        system_date = VLC_TICK_MAX;
-
-    /* An update after a discontinuity means that the playback is resumed */
-    if (player->timer.state == VLC_PLAYER_TIMER_STATE_DISCONTINUITY)
-        player->timer.state = VLC_PLAYER_TIMER_STATE_PLAYING;
-
     /* Best source priority:
      * 1/ es_source != NULL when paused (any ES tracks when paused. Indeed,
      * there is likely no audio update (master) when paused but only video
@@ -389,7 +349,7 @@ vlc_player_UpdateTimer(vlc_player_t *player, vlc_es_id_t 
*es_source,
      * 3/ es_source != NULL (from the first ES track updated)
      * 4/ es_source == NULL (from the input)
      */
-    source = &player->timer.best_source;
+    struct vlc_player_timer_source *source = &player->timer.best_source;
     if (!source->es || es_source_is_master
      || (es_source && player->timer.state == VLC_PLAYER_TIMER_STATE_PAUSED))
         source->es = es_source;
@@ -429,8 +389,15 @@ vlc_player_UpdateTimer(vlc_player_t *player, vlc_es_id_t 
*es_source,
                                                   &source->point);
         }
     }
+}
 
-    source = &player->timer.smpte_source;
+static void
+vlc_player_UpdateTimerSmpteSource(vlc_player_t *player, vlc_es_id_t *es_source,
+                                  const struct vlc_player_timer_point *point,
+                                  vlc_tick_t system_date,
+                                  unsigned frame_rate, unsigned 
frame_rate_base)
+{
+    struct vlc_player_timer_source *source = &player->timer.smpte_source;
     /* SMPTE source: only the video source */
     if (!source->es && es_source && vlc_es_id_GetCat(es_source) == VIDEO_ES)
         source->es = es_source;
@@ -458,6 +425,67 @@ vlc_player_UpdateTimer(vlc_player_t *player, vlc_es_id_t 
*es_source,
                                                        &source->point);
         }
     }
+}
+
+void
+vlc_player_UpdateTimer(vlc_player_t *player, vlc_es_id_t *es_source,
+                       bool es_source_is_master,
+                       const struct vlc_player_timer_point *point,
+                       vlc_tick_t normal_time,
+                       unsigned frame_rate, unsigned frame_rate_base)
+{
+    assert(point);
+    /* A null source can't be the master */
+    assert(es_source == NULL ? !es_source_is_master : true);
+
+    vlc_mutex_lock(&player->timer.lock);
+
+    bool force_update = false;
+    if (!es_source) /* input source */
+    {
+        /* Only valid for input sources */
+        if (player->timer.input_normal_time != normal_time)
+        {
+            player->timer.input_normal_time = normal_time;
+            player->timer.last_ts = VLC_TICK_INVALID;
+            force_update = true;
+        }
+        if (player->timer.input_length != point->length
+         && point->length >= VLC_TICK_0)
+        {
+            player->timer.input_length = point->length;
+            player->timer.last_ts = VLC_TICK_INVALID;
+            force_update = true;
+        }
+        /* Will likely be overridden by non input source */
+        player->timer.input_position = point->position;
+
+        if (point->ts == VLC_TICK_INVALID
+         || point->system_date == VLC_TICK_INVALID)
+        {
+            /* ts can only be invalid from the input source */
+            vlc_mutex_unlock(&player->timer.lock);
+            return;
+        }
+    }
+
+    assert(point->ts != VLC_TICK_INVALID);
+
+    vlc_tick_t system_date = point->system_date;
+    if (player->timer.state == VLC_PLAYER_TIMER_STATE_PAUSED)
+        system_date = VLC_TICK_MAX;
+
+    /* An update after a discontinuity means that the playback is resumed */
+    if (player->timer.state == VLC_PLAYER_TIMER_STATE_DISCONTINUITY)
+        player->timer.state = VLC_PLAYER_TIMER_STATE_PLAYING;
+
+    if (player->timer.state != VLC_PLAYER_TIMER_STATE_STOPPING)
+        vlc_player_UpdateTimerBestSource(player, es_source,
+                                         es_source_is_master, point, 
system_date,
+                                         force_update);
+
+    vlc_player_UpdateTimerSmpteSource(player, es_source, point, system_date,
+                                      frame_rate, frame_rate_base);
 
     player->timer.last_ts = point->ts;
 


=====================================
test/src/player/player.c
=====================================
@@ -217,6 +217,7 @@ struct media_params
     bool can_pause;
     bool error;
     bool null_names;
+    vlc_tick_t pts_delay;
 
     const char *config;
 };
@@ -240,6 +241,7 @@ struct media_params
     .can_pause = true, \
     .error = false, \
     .null_names = false, \
+    .pts_delay = DEFAULT_PTS_DELAY, \
     .config = NULL, \
 }
 
@@ -783,7 +785,7 @@ create_mock_media(const char *name, const struct 
media_params *params)
         "sub_packetized=%d;length=%"PRId64";audio_sample_length=%"PRId64";"
         "video_frame_rate=%u;video_frame_rate_base=%u;"
         "title_count=%zu;chapter_count=%zu;"
-        "can_seek=%d;can_pause=%d;error=%d;null_names=%d;"
+        "can_seek=%d;can_pause=%d;error=%d;null_names=%d;pts_delay=%"PRId64";"
         "config=%s;attachment_count=%zu",
         params->track_count[VIDEO_ES], params->track_count[AUDIO_ES],
         params->track_count[SPU_ES], params->program_count,
@@ -792,6 +794,7 @@ create_mock_media(const char *name, const struct 
media_params *params)
         params->video_frame_rate, params->video_frame_rate_base,
         params->title_count, params->chapter_count,
         params->can_seek, params->can_pause, params->error, params->null_names,
+        params->pts_delay,
         params->config ? params->config : "", params->attachment_count);
     assert(ret != -1);
     input_item_t *item = input_item_New(url, name);
@@ -2633,6 +2636,7 @@ test_timers(struct ctx *ctx)
         for (size_t j = 0; j < ARRAY_SIZE(df_min_test_list); ++j)
         {
             unsigned minute = df_min_test_list[j];
+            vlc_tick_t check_duration = VLC_TICK_FROM_SEC(2);
 
             struct media_params params =
                 DEFAULT_MEDIA_PARAMS(minute * VLC_TICK_FROM_SEC(60)
@@ -2643,10 +2647,14 @@ test_timers(struct ctx *ctx)
             params.video_frame_rate = fps * 1000;
             params.video_frame_rate_base = 1001;
 
+            /* This will prevent a RESET_PCR and ensure we receive all outputs
+             * points. */
+            params.pts_delay = check_duration;
+
             player_set_current_mock_media(ctx, "media1", &params, false);
             player_set_rate(ctx, 24);
 
-            vlc_player_SetTime(player, params.length - VLC_TICK_FROM_SEC(2));
+            vlc_player_SetTime(player, params.length - check_duration);
 
             player_start(ctx);
 



View it on GitLab: 
https://code.videolan.org/videolan/vlc/-/compare/e64f5d7cc3b3f3c94e5c50a536d5b20eb1e7ae74...d221a4a4db538f6a30825b01dcf16a58e4f62647

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


VideoLAN code repository instance
_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to