summaryrefslogtreecommitdiffstats
path: root/player
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2018-05-19 17:06:00 +0200
committerwm4 <wm4@nowhere>2018-05-24 19:56:35 +0200
commit29a51900c6047798244afaca271618caeeeeeee8 (patch)
tree3e73ce26d1eab368df29731b2880c0bd0b46c37f /player
parentd33e5972b38c1a8d1ed2c19095a94c70c33881c3 (diff)
downloadmpv-29a51900c6047798244afaca271618caeeeeeee8.tar.bz2
mpv-29a51900c6047798244afaca271618caeeeeeee8.tar.xz
player: some further cleanup of the mp_cancel crap
Alway give each demuxer its own mp_cancel instance. This makes management of the mp_cancel things much easier. Also, instead of having add/remove functions for mp_cancel slaves, replace them with a simpler to use set_parent function. Remove cancel_and_free_demuxer(), which had mpctx as parameter only to check an assumption. With this commit, demuxers have their own mp_cancel, so add demux_cancel_and_free() which makes use of it.
Diffstat (limited to 'player')
-rw-r--r--player/loadfile.c60
1 files changed, 14 insertions, 46 deletions
diff --git a/player/loadfile.c b/player/loadfile.c
index 297ab8ba97..194372e271 100644
--- a/player/loadfile.c
+++ b/player/loadfile.c
@@ -123,25 +123,6 @@ void mp_abort_trigger_locked(struct MPContext *mpctx,
mp_cancel_trigger(abort->cancel);
}
-static void cancel_and_free_demuxer(struct MPContext *mpctx,
- struct demuxer **demuxer)
-{
- if (!*demuxer)
- return;
-
- struct mp_cancel *cancel = (*demuxer)->cancel;
- assert(cancel != mpctx->playback_abort);
-
- // Explicitly trigger it so freeing the demuxer can't block on I/O.
- if (cancel)
- mp_cancel_trigger(cancel);
-
- demux_free(*demuxer);
- *demuxer = NULL;
-
- talloc_free(cancel);
-}
-
static void uninit_demuxer(struct MPContext *mpctx)
{
for (int r = 0; r < NUM_PTRACKS; r++) {
@@ -163,7 +144,8 @@ static void uninit_demuxer(struct MPContext *mpctx)
}
mpctx->num_tracks = 0;
- cancel_and_free_demuxer(mpctx, &mpctx->demuxer);
+ demux_cancel_and_free(mpctx->demuxer);
+ mpctx->demuxer = NULL;
}
#define APPEND(s, ...) mp_snprintf_cat(s, sizeof(s), __VA_ARGS__)
@@ -635,7 +617,7 @@ bool mp_remove_track(struct MPContext *mpctx, struct track *track)
in_use |= mpctx->tracks[n]->demuxer == d;
if (!in_use)
- cancel_and_free_demuxer(mpctx, &d);
+ demux_cancel_and_free(d);
mp_notify(mpctx, MPV_EVENT_TRACKS_CHANGED, NULL);
@@ -669,13 +651,10 @@ int mp_add_external_file(struct MPContext *mpctx, char *filename,
break;
}
- struct mp_cancel *demux_cancel = mp_cancel_new(NULL);
- mp_cancel_add_slave(cancel, demux_cancel);
-
mp_core_unlock(mpctx);
struct demuxer *demuxer =
- demux_open_url(filename, &params, demux_cancel, mpctx->global);
+ demux_open_url(filename, &params, cancel, mpctx->global);
if (demuxer)
enable_demux_thread(mpctx, demuxer);
@@ -722,17 +701,12 @@ int mp_add_external_file(struct MPContext *mpctx, char *filename,
first_num = mpctx->num_tracks - 1;
}
- mp_cancel_remove_slave(cancel, demux_cancel);
- mp_cancel_add_slave(mpctx->playback_abort, demux_cancel);
+ mp_cancel_set_parent(demuxer->cancel, mpctx->playback_abort);
return first_num;
err_out:
- if (demuxer) {
- cancel_and_free_demuxer(mpctx, &demuxer);
- } else {
- talloc_free(demux_cancel);
- }
+ demux_cancel_and_free(demuxer);
if (!mp_cancel_test(cancel))
MP_ERR(mpctx, "Can not open external file %s.\n", disp_filename);
return -1;
@@ -865,17 +839,14 @@ static void load_chapters(struct MPContext *mpctx)
char *chapter_file = mpctx->opts->chapter_file;
if (chapter_file && chapter_file[0]) {
chapter_file = talloc_strdup(NULL, chapter_file);
- struct mp_cancel *cancel = mp_cancel_new(NULL);
- mp_cancel_add_slave(mpctx->playback_abort, cancel);
mp_core_unlock(mpctx);
- struct demuxer *demux = demux_open_url(chapter_file, NULL, cancel,
+ struct demuxer *demux = demux_open_url(chapter_file, NULL,
+ mpctx->playback_abort,
mpctx->global);
mp_core_lock(mpctx);
if (demux) {
src = demux;
free_src = true;
- } else {
- talloc_free(cancel);
}
talloc_free(mpctx->chapters);
mpctx->chapters = NULL;
@@ -891,7 +862,7 @@ static void load_chapters(struct MPContext *mpctx)
}
}
if (free_src)
- cancel_and_free_demuxer(mpctx, &src);
+ demux_cancel_and_free(src);
}
static void load_per_file_options(m_config_t *conf,
@@ -944,11 +915,9 @@ static void cancel_open(struct MPContext *mpctx)
pthread_join(mpctx->open_thread, NULL);
mpctx->open_active = false;
- if (mpctx->open_res_demuxer) {
- assert(mpctx->open_res_demuxer->cancel == mpctx->open_cancel);
- mpctx->open_cancel = NULL;
- cancel_and_free_demuxer(mpctx, &mpctx->open_res_demuxer);
- }
+ if (mpctx->open_res_demuxer)
+ demux_cancel_and_free(mpctx->open_res_demuxer);
+ mpctx->open_res_demuxer = NULL;
TA_FREEP(&mpctx->open_cancel);
TA_FREEP(&mpctx->open_url);
@@ -1010,7 +979,7 @@ static void open_demux_reentrant(struct MPContext *mpctx)
start_open(mpctx, url, mpctx->playing->stream_flags);
// User abort should cancel the opener now.
- mp_cancel_add_slave(mpctx->playback_abort, mpctx->open_cancel);
+ mp_cancel_set_parent(mpctx->open_cancel, mpctx->playback_abort);
while (!atomic_load(&mpctx->open_done)) {
mp_idle(mpctx);
@@ -1020,10 +989,9 @@ static void open_demux_reentrant(struct MPContext *mpctx)
}
if (mpctx->open_res_demuxer) {
- assert(mpctx->open_res_demuxer->cancel == mpctx->open_cancel);
mpctx->demuxer = mpctx->open_res_demuxer;
mpctx->open_res_demuxer = NULL;
- mpctx->open_cancel = NULL;
+ mp_cancel_set_parent(mpctx->demuxer->cancel, mpctx->playback_abort);
} else {
mpctx->error_playing = mpctx->open_res_error;
}