summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAman Gupta <aman@tmm1.net>2019-09-26 16:11:48 -0700
committerAman Gupta <aman@tmm1.net>2019-09-27 13:00:45 -0700
commitc7d0a8f58e536b22db88a229dc2f53daf0f02951 (patch)
tree4518a47c07041c33943d8ffe48f470cd8826936b
parent4fdd0940ed2228665d5c6d99f4c024dcfa9bc4ad (diff)
downloadmpv-c7d0a8f58e536b22db88a229dc2f53daf0f02951.tar.bz2
mpv-c7d0a8f58e536b22db88a229dc2f53daf0f02951.tar.xz
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 <aman@tmm1.net>
-rw-r--r--DOCS/client-api-changes.rst1
-rw-r--r--libmpv/client.h2
-rw-r--r--libmpv/stream_cb.h17
-rw-r--r--stream/stream_cb.c8
4 files changed, 27 insertions, 1 deletions
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
@@ -148,6 +148,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.
*/
typedef struct mpv_stream_cb_info {
@@ -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;
}