diff options
Diffstat (limited to 'player')
-rw-r--r-- | player/client.c | 31 | ||||
-rw-r--r-- | player/client.h | 3 |
2 files changed, 28 insertions, 6 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. diff --git a/player/client.h b/player/client.h index b1c2ffc500..2512315d42 100644 --- a/player/client.h +++ b/player/client.h @@ -48,7 +48,8 @@ bool mp_set_main_render_context(struct mp_client_api *client_api, struct mpv_render_context *ctx, bool active); struct mpv_render_context * mp_client_api_acquire_render_context(struct mp_client_api *ca); -void kill_video(struct mp_client_api *client_api); +void kill_video_async(struct mp_client_api *client_api, void (*fin)(void *ctx), + void *fin_ctx); bool mp_streamcb_lookup(struct mpv_global *g, const char *protocol, void **out_user_data, mpv_stream_cb_open_ro_fn *out_fn); |