win-virtualcam: Make sure virtualcam output thread safe

This commit is contained in:
hellowanda 2021-11-10 15:49:24 +08:00 committed by Jim
parent 647fb1376d
commit a01a01f752

View File

@ -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);
}