[vlc-commits] [Git][videolan/vlc][master] playlist: Cancel the preparser when an item is removed from the playlist

Felix Paul Kühne (@fkuehne) gitlab at videolan.org
Fri May 23 09:58:13 UTC 2025



Felix Paul Kühne pushed to branch master at VideoLAN / VLC


Commits:
2f13db93 by Gabriel Lafond-Thenaille at 2025-05-23T09:40:01+00:00
playlist: Cancel the preparser when an item is removed from the playlist

- - - - -


6 changed files:

- src/playlist/content.c
- src/playlist/item.c
- src/playlist/item.h
- src/playlist/playlist.c
- src/playlist/preparse.c
- src/playlist/preparse.h


Changes:

=====================================
src/playlist/content.c
=====================================
@@ -80,7 +80,8 @@ vlc_playlist_ItemsInserted(vlc_playlist_t *playlist, size_t index, size_t count,
     for (size_t i = index; i < index + count; ++i)
     {
         vlc_playlist_item_t *item = playlist->items.data[i];
-        vlc_playlist_AutoPreparse(playlist, item->media, subitems);
+        item->preparser_id = vlc_playlist_AutoPreparse(playlist, item->media,
+                                                       subitems);
     }
 }
 
@@ -236,6 +237,9 @@ vlc_playlist_Clear(vlc_playlist_t *playlist)
     int ret = vlc_player_SetCurrentMedia(playlist->player, NULL);
     VLC_UNUSED(ret); /* what could we do? */
 
+    if (playlist->parser != NULL)
+        vlc_preparser_Cancel(playlist->parser, VLC_PREPARSER_REQ_ID_INVALID);
+
     vlc_playlist_ClearItems(playlist);
     vlc_playlist_ItemsReset(playlist);
 }
@@ -312,8 +316,14 @@ vlc_playlist_Remove(vlc_playlist_t *playlist, size_t index, size_t count)
 
     vlc_playlist_ItemsRemoving(playlist, index, count);
 
-    for (size_t i = 0; i < count; ++i)
-        vlc_playlist_item_Release(playlist->items.data[index + i]);
+    for (size_t i = 0; i < count; ++i) {
+        vlc_playlist_item_t *item = playlist->items.data[index + i];
+        if (playlist->parser != NULL
+                && item->preparser_id != VLC_PREPARSER_REQ_ID_INVALID)
+            vlc_preparser_Cancel(playlist->parser, item->preparser_id);
+
+        vlc_playlist_item_Release(item);
+    }
 
     vlc_vector_remove_slice(&playlist->items, index, count);
 
@@ -344,7 +354,11 @@ vlc_playlist_Replace(vlc_playlist_t *playlist, size_t index,
         randomizer_Add(&playlist->randomizer, &item, 1);
     }
 
-    vlc_playlist_item_Release(playlist->items.data[index]);
+    vlc_playlist_item_t *old = playlist->items.data[index];
+    if (playlist->parser != NULL
+            && old->preparser_id != VLC_PREPARSER_REQ_ID_INVALID)
+        vlc_preparser_Cancel(playlist->parser, old->preparser_id);
+    vlc_playlist_item_Release(old);
     playlist->items.data[index] = item;
 
     vlc_playlist_ItemReplaced(playlist, index);


=====================================
src/playlist/item.c
=====================================
@@ -36,6 +36,7 @@ vlc_playlist_item_New(input_item_t *media, uint64_t id)
 
     vlc_atomic_rc_init(&item->rc);
     item->id = id;
+    item->preparser_id = VLC_PREPARSER_REQ_ID_INVALID;
     item->media = media;
     input_item_Hold(media);
     return item;


=====================================
src/playlist/item.h
=====================================
@@ -22,6 +22,7 @@
 #define VLC_PLAYLIST_ITEM_H
 
 #include <vlc_atomic.h>
+#include <vlc_preparser.h>
 
 typedef struct vlc_playlist_item vlc_playlist_item_t;
 typedef struct input_item_t input_item_t;
@@ -30,6 +31,7 @@ struct vlc_playlist_item
 {
     input_item_t *media;
     uint64_t id;
+    vlc_preparser_req_id preparser_id;
     vlc_atomic_rc_t rc;
 };
 


=====================================
src/playlist/playlist.c
=====================================
@@ -84,8 +84,10 @@ vlc_playlist_Delete(vlc_playlist_t *playlist)
 {
     assert(vlc_list_is_empty(&playlist->listeners));
 
-    if (playlist->parser != NULL)
+    if (playlist->parser != NULL) {
+        vlc_preparser_Cancel(playlist->parser, VLC_PREPARSER_REQ_ID_INVALID);
         vlc_preparser_Delete(playlist->parser);
+    }
 
     vlc_playlist_PlayerDestroy(playlist);
     randomizer_Destroy(&playlist->randomizer);


=====================================
src/playlist/preparse.c
=====================================
@@ -110,7 +110,7 @@ static const input_item_parser_cbs_t preparser_callbacks = {
     .on_subtree_added = on_subtree_added,
 };
 
-void
+vlc_preparser_req_id
 vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input,
                           bool parse_subitems)
 {
@@ -137,7 +137,7 @@ vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input,
         enum input_item_type_e input_type = input_item_GetType(input, &input_net);
 
         if (input_net)
-            return;
+            return VLC_PREPARSER_REQ_ID_INVALID;
 
         switch (input_type)
         {
@@ -147,14 +147,15 @@ vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input,
             case ITEM_TYPE_PLAYLIST:
                 break;
             default:
-                return;
+                return VLC_PREPARSER_REQ_ID_INVALID;
         }
 
         int options = VLC_PREPARSER_TYPE_PARSE | VLC_PREPARSER_TYPE_FETCHMETA_LOCAL;
         if (parse_subitems)
             options |= VLC_PREPARSER_OPTION_SUBITEMS;
 
-        vlc_preparser_Push(playlist->parser, input, options,
-                           &preparser_callbacks, playlist);
+        return vlc_preparser_Push(playlist->parser, input, options,
+                                  &preparser_callbacks, playlist);
     }
+    return VLC_PREPARSER_REQ_ID_INVALID;
 }


=====================================
src/playlist/preparse.h
=====================================
@@ -22,11 +22,12 @@
 #define VLC_PLAYLIST_PREPARSE_H
 
 #include <vlc_common.h>
+#include <vlc_preparser.h>
 
 typedef struct vlc_playlist vlc_playlist_t;
 typedef struct input_item_node_t input_item_node_t;
 
-void
+vlc_preparser_req_id
 vlc_playlist_AutoPreparse(vlc_playlist_t *playlist, input_item_t *input,
                           bool parse_subitems);
 



View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/2f13db93900c7384ae09c408551d01cf2c145701

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/commit/2f13db93900c7384ae09c408551d01cf2c145701
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