From a01a01f752945986502e396a41a79ba0cb694bdc Mon Sep 17 00:00:00 2001 From: hellowanda Date: Wed, 10 Nov 2021 15:49:24 +0800 Subject: [PATCH] win-virtualcam: Make sure virtualcam output thread safe --- plugins/win-dshow/virtualcam.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/plugins/win-dshow/virtualcam.c b/plugins/win-dshow/virtualcam.c index 5125b201b..ded9fabf9 100644 --- a/plugins/win-dshow/virtualcam.c +++ b/plugins/win-dshow/virtualcam.c @@ -1,10 +1,13 @@ #include #include +#include "util/threading.h" #include "shared-memory-queue.h" struct virtualcam_data { obs_output_t *output; video_queue_t *vq; + volatile bool active; + volatile bool stopping; }; static const char *virtualcam_name(void *unused) @@ -62,19 +65,31 @@ static bool virtualcam_start(void *data) vsi.height = height; obs_output_set_video_conversion(vcam->output, &vsi); + os_atomic_set_bool(&vcam->active, true); + os_atomic_set_bool(&vcam->stopping, false); blog(LOG_INFO, "Virtual output started"); obs_output_begin_data_capture(vcam->output, 0); return true; } -static void virtualcam_stop(void *data, uint64_t ts) +static void virtualcam_deactive(struct virtualcam_data *vcam) { - struct virtualcam_data *vcam = (struct virtualcam_data *)data; obs_output_end_data_capture(vcam->output); video_queue_close(vcam->vq); vcam->vq = NULL; + os_atomic_set_bool(&vcam->active, false); + os_atomic_set_bool(&vcam->stopping, false); + blog(LOG_INFO, "Virtual output stopped"); +} + +static void virtualcam_stop(void *data, uint64_t ts) +{ + struct virtualcam_data *vcam = (struct virtualcam_data *)data; + os_atomic_set_bool(&vcam->stopping, true); + + blog(LOG_INFO, "Virtual output stopping"); UNUSED_PARAMETER(ts); } @@ -86,6 +101,14 @@ static void virtual_video(void *param, struct video_data *frame) if (!vcam->vq) return; + if (!os_atomic_load_bool(&vcam->active)) + return; + + if (os_atomic_load_bool(&vcam->stopping)) { + virtualcam_deactive(vcam); + return; + } + video_queue_write(vcam->vq, frame->data, frame->linesize, frame->timestamp); }