diff options
Diffstat (limited to 'player/client.c')
-rw-r--r-- | player/client.c | 31 |
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. |