Просмотр исходного кода

win-virtualcam: Make sure virtualcam output thread safe

hellowanda 4 лет назад
Родитель
Сommit
a01a01f752
1 измененных файлов с 25 добавлено и 2 удалено
  1. 25 2
      plugins/win-dshow/virtualcam.c

+ 25 - 2
plugins/win-dshow/virtualcam.c

@@ -1,10 +1,13 @@
 #include <obs-module.h>
 #include <util/platform.h>
+#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);
 }