win-virtualcam: Make sure virtualcam output thread safe
This commit is contained in:
parent
647fb1376d
commit
a01a01f752
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user