From 4b4d1cada9dfae692304eacad24f0df1c9198c30 Mon Sep 17 00:00:00 2001 From: Jonathan Baudanza Date: Sun, 1 Nov 2020 08:52:18 -0800 Subject: [PATCH] Add demuxer.interrupt() --- src/demux.cc | 38 ++++++++++++++++++++++++++++++++++++++ src/demux.h | 2 ++ types/Demuxer.d.ts | 5 +++++ 3 files changed, 45 insertions(+) diff --git a/src/demux.cc b/src/demux.cc index ef8c593..62fa3a0 100644 --- a/src/demux.cc +++ b/src/demux.cc @@ -42,6 +42,12 @@ void demuxerExecute(napi_env env, void* data) { return; } + // Use the user-defined opaque field as a boolean flag to signal if blocking I/O should + // be stopped. ffmpeg will periodically poll this value through the interrupt_callback. + c->format->opaque = 0; + c->format->interrupt_callback.callback = interrupt_callback; + c->format->interrupt_callback.opaque = &c->format->opaque; + if (c->adaptor) { AVIOContext* avio_ctx = avio_alloc_context(nullptr, 0, 0, c->adaptor, &read_packet, nullptr, nullptr); if (!avio_ctx) { @@ -108,6 +114,12 @@ void demuxerComplete(napi_env env, napi_status asyncStatus, void* data) { c->status = napi_set_named_property(env, result, "forceClose", prop); REJECT_STATUS; + c->status = napi_create_function(env, "interrupt", NAPI_AUTO_LENGTH, interrupt, + c, &prop); + REJECT_STATUS; + c->status = napi_set_named_property(env, result, "interrupt", prop); + REJECT_STATUS; + napi_status status; status = napi_resolve_deferred(env, c->_deferred, result); FLOATING_STATUS; @@ -582,3 +594,29 @@ napi_value forceCloseInput(napi_env env, napi_callback_info info) { CHECK_STATUS; return result; } + +napi_value interrupt(napi_env env, napi_callback_info info) { + napi_status status; + napi_value result, formatJS, formatRefExt; + fmtCtxRef* fmtRef; + size_t argc = 0; + + status = napi_get_cb_info(env, info, &argc, nullptr, &formatJS, nullptr); + CHECK_STATUS; + status = napi_get_named_property(env, formatJS, "_formatContextRef", &formatRefExt); + CHECK_STATUS; + status = napi_get_value_external(env, formatRefExt, (void**) &fmtRef); + CHECK_STATUS; + + fmtRef->fmtCtx->opaque = (void *)1; + + status = napi_get_undefined(env, &result); + CHECK_STATUS; + + return result; +} + +int interrupt_callback(void *opaque) { + int* i = (int*) opaque; + return *i; +} diff --git a/src/demux.h b/src/demux.h index 7da0b5d..7052a42 100644 --- a/src/demux.h +++ b/src/demux.h @@ -53,6 +53,8 @@ void demuxerFinalizer(napi_env env, void* data, void* hint); void readBufferFinalizer(napi_env env, void* data, void* hint); napi_value forceCloseInput(napi_env env, napi_callback_info info); +napi_value interrupt(napi_env env, napi_callback_info info); +int interrupt_callback(void *opaque); struct demuxerCarrier : carrier { const char* filename = nullptr; diff --git a/types/Demuxer.d.ts b/types/Demuxer.d.ts index 6bcb223..008b6fd 100644 --- a/types/Demuxer.d.ts +++ b/types/Demuxer.d.ts @@ -76,6 +76,11 @@ export interface Demuxer extends Omit