summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
Diffstat (limited to 'common')
-rw-r--r--common/playlist.c10
-rw-r--r--common/playlist.h7
2 files changed, 16 insertions, 1 deletions
diff --git a/common/playlist.c b/common/playlist.c
index 46ae36d643..857f5cb030 100644
--- a/common/playlist.c
+++ b/common/playlist.c
@@ -106,10 +106,18 @@ static void playlist_unlink(struct playlist *pl, struct playlist_entry *entry)
entry->pl = NULL;
}
+void playlist_entry_unref(struct playlist_entry *e)
+{
+ e->reserved--;
+ if (e->reserved < 0)
+ talloc_free(e);
+}
+
void playlist_remove(struct playlist *pl, struct playlist_entry *entry)
{
playlist_unlink(pl, entry);
- talloc_free(entry);
+ entry->removed = true;
+ playlist_entry_unref(entry);
}
void playlist_clear(struct playlist *pl)
diff --git a/common/playlist.h b/common/playlist.h
index 6c609733da..e0ac816774 100644
--- a/common/playlist.h
+++ b/common/playlist.h
@@ -41,6 +41,11 @@ struct playlist_entry {
bool playback_short : 1;
// Set to true if not at least 1 frame (audio or video) could be played.
bool init_failed : 1;
+ // Entry was removed with playlist_remove (etc.), but not deallocated.
+ bool removed : 1;
+ // Additional refcount. Normally (reserved==0), the entry is owned by the
+ // playlist, and this can be used to keep the entry alive.
+ int reserved;
// Used to reject loading of unsafe entries from external playlists.
// Can have any of the following bit flags set:
// STREAM_SAFE_ONLY: only allow streams marked with is_safe
@@ -89,4 +94,6 @@ struct playlist_entry *playlist_entry_from_index(struct playlist *pl, int index)
struct mpv_global;
struct playlist *playlist_parse_file(const char *file, struct mpv_global *global);
+void playlist_entry_unref(struct playlist_entry *e);
+
#endif