summaryrefslogtreecommitdiffstats
path: root/player/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'player/client.c')
-rw-r--r--player/client.c31
1 files changed, 26 insertions, 5 deletions
diff --git a/player/client.c b/player/client.c
index 247f580498..0e50d735fc 100644
--- a/player/client.c
+++ b/player/client.c
@@ -1749,18 +1749,39 @@ int64_t mpv_get_time_us(mpv_handle *ctx)
#include "video/out/libmpv.h"
-// Used by vo_libmpv to synchronously uninitialize video.
-void kill_video(struct mp_client_api *client_api)
+struct kill_ctx {
+ struct MPContext *mpctx;
+ void (*fin)(void *ctx);
+ void *fin_ctx;
+};
+
+static void do_kill(void *ptr)
{
- struct MPContext *mpctx = client_api->mpctx;
- mp_dispatch_lock(mpctx->dispatch);
+ struct kill_ctx *k = ptr;
+ struct MPContext *mpctx = k->mpctx;
+
struct track *track = mpctx->vo_chain ? mpctx->vo_chain->track : NULL;
uninit_video_out(mpctx);
if (track) {
mpctx->error_playing = MPV_ERROR_VO_INIT_FAILED;
error_on_track(mpctx, track);
}
- mp_dispatch_unlock(mpctx->dispatch);
+
+ k->fin(k->fin_ctx);
+}
+
+// Used by vo_libmpv to (a)synchronously uninitialize video.
+void kill_video_async(struct mp_client_api *client_api, void (*fin)(void *ctx),
+ void *fin_ctx)
+{
+ struct MPContext *mpctx = client_api->mpctx;
+ struct kill_ctx *k = talloc_ptrtype(NULL, k);
+ *k = (struct kill_ctx){
+ .mpctx = mpctx,
+ .fin = fin,
+ .fin_ctx = fin_ctx,
+ };
+ mp_dispatch_enqueue_autofree(mpctx->dispatch, do_kill, k);
}
// Used by vo_libmpv to set the current render context.