From c7d0a8f58e536b22db88a229dc2f53daf0f02951 Mon Sep 17 00:00:00 2001 From: Aman Gupta Date: Thu, 26 Sep 2019 16:11:48 -0700 Subject: stream_cb: add cancel_fn callback This allows stream_cb backends to implement blocking behavior inside read_fn, and still get notified when the user wants to cancel and stop playback. Signed-off-by: Aman Gupta --- DOCS/client-api-changes.rst | 1 + libmpv/client.h | 2 +- libmpv/stream_cb.h | 17 +++++++++++++++++ stream/stream_cb.c | 8 ++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/DOCS/client-api-changes.rst b/DOCS/client-api-changes.rst index 81e915d4eb..11c7f2393e 100644 --- a/DOCS/client-api-changes.rst +++ b/DOCS/client-api-changes.rst @@ -32,6 +32,7 @@ API changes :: --- mpv 0.30.0 --- + 1.106 - Add cancel_fn to mpv_stream_cb_info 1.105 - Fix deadlock problems with MPV_RENDER_PARAM_ADVANCED_CONTROL and if the "vd-lavc-dr" option is enabled (which it is by default). There were no actual API changes. diff --git a/libmpv/client.h b/libmpv/client.h index 670f45c626..8ee7d87f17 100644 --- a/libmpv/client.h +++ b/libmpv/client.h @@ -223,7 +223,7 @@ extern "C" { * relational operators (<, >, <=, >=). */ #define MPV_MAKE_VERSION(major, minor) (((major) << 16) | (minor) | 0UL) -#define MPV_CLIENT_API_VERSION MPV_MAKE_VERSION(1, 105) +#define MPV_CLIENT_API_VERSION MPV_MAKE_VERSION(1, 106) /** * The API user is allowed to "#define MPV_ENABLE_DEPRECATED 0" before diff --git a/libmpv/stream_cb.h b/libmpv/stream_cb.h index 45e81b8e38..63593d7228 100644 --- a/libmpv/stream_cb.h +++ b/libmpv/stream_cb.h @@ -147,6 +147,22 @@ typedef int64_t (*mpv_stream_cb_size_fn)(void *cookie); */ typedef void (*mpv_stream_cb_close_fn)(void *cookie); +/** + * Cancel callback used to implement a custom stream. + * + * This callback is used to interrupt any current or future read and seek + * operations. It will be called from a separate thread than the demux + * thread, and should not block. + * + * This callback can be NULL. + * + * Available since API 1.106. + * + * @param cookie opaque cookie identifying the stream, + * returned from mpv_stream_cb_open_fn + */ +typedef void (*mpv_stream_cb_cancel_fn)(void *cookie); + /** * See mpv_stream_cb_open_ro_fn callback. */ @@ -170,6 +186,7 @@ typedef struct mpv_stream_cb_info { mpv_stream_cb_seek_fn seek_fn; mpv_stream_cb_size_fn size_fn; mpv_stream_cb_close_fn close_fn; + mpv_stream_cb_cancel_fn cancel_fn; /* since API 1.106 */ } mpv_stream_cb_info; /** diff --git a/stream/stream_cb.c b/stream/stream_cb.c index fa8871ddf6..fa52935a4b 100644 --- a/stream/stream_cb.c +++ b/stream/stream_cb.c @@ -17,9 +17,11 @@ #include "options/path.h" #include "player/client.h" #include "libmpv/stream_cb.h" +#include "misc/thread_tools.h" struct priv { mpv_stream_cb_info info; + struct mp_cancel *cancel; }; static int fill_buffer(stream_t *s, char *buffer, int max_len) @@ -98,6 +100,12 @@ static int open_cb(stream_t *stream) stream->read_chunk = 64 * 1024; stream->close = s_close; + if (p->info.cancel_fn && stream->cancel) { + p->cancel = mp_cancel_new(p); + mp_cancel_set_parent(p->cancel, stream->cancel); + mp_cancel_set_cb(p->cancel, p->info.cancel_fn, p->info.cookie); + } + return STREAM_OK; } -- cgit v1.2.3