[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