|
|
@@ -49,15 +49,15 @@ VCamFilter::VCamFilter()
|
|
|
/* ---------------------------------------- */
|
|
|
/* add last/current obs res/interval */
|
|
|
|
|
|
- uint32_t new_cx = cx;
|
|
|
- uint32_t new_cy = cy;
|
|
|
- uint64_t new_interval = interval;
|
|
|
+ uint32_t new_obs_cx = obs_cx;
|
|
|
+ uint32_t new_obs_cy = obs_cy;
|
|
|
+ uint64_t new_obs_interval = obs_interval;
|
|
|
|
|
|
vq = video_queue_open();
|
|
|
if (vq) {
|
|
|
if (video_queue_state(vq) == SHARED_QUEUE_STATE_READY) {
|
|
|
- video_queue_get_info(vq, &new_cx, &new_cy,
|
|
|
- &new_interval);
|
|
|
+ video_queue_get_info(vq, &new_obs_cx, &new_obs_cy,
|
|
|
+ &new_obs_interval);
|
|
|
}
|
|
|
|
|
|
/* don't keep it open until the filter actually starts */
|
|
|
@@ -79,13 +79,15 @@ VCamFilter::VCamFilter()
|
|
|
if (ReadFile(file, res, sizeof(res) - 1, &len,
|
|
|
nullptr)) {
|
|
|
res[len] = 0;
|
|
|
- int vals = sscanf(
|
|
|
- res, "%" PRIu32 "x%" PRIu32 "x%" PRIu64,
|
|
|
- &new_cx, &new_cy, &new_interval);
|
|
|
+ int vals = sscanf(res,
|
|
|
+ "%" PRIu32 "x%" PRIu32
|
|
|
+ "x%" PRIu64,
|
|
|
+ &new_obs_cx, &new_obs_cy,
|
|
|
+ &new_obs_interval);
|
|
|
if (vals != 3) {
|
|
|
- new_cx = cx;
|
|
|
- new_cy = cy;
|
|
|
- new_interval = interval;
|
|
|
+ new_obs_cx = obs_cx;
|
|
|
+ new_obs_cy = obs_cy;
|
|
|
+ new_obs_interval = obs_interval;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -93,14 +95,20 @@ VCamFilter::VCamFilter()
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (new_cx != cx || new_cy != cy || new_interval != interval) {
|
|
|
- AddVideoFormat(VideoFormat::NV12, new_cx, new_cy, new_interval);
|
|
|
- AddVideoFormat(VideoFormat::I420, new_cx, new_cy, new_interval);
|
|
|
- AddVideoFormat(VideoFormat::YUY2, new_cx, new_cy, new_interval);
|
|
|
- SetVideoFormat(VideoFormat::NV12, new_cx, new_cy, new_interval);
|
|
|
- cx = new_cx;
|
|
|
- cy = new_cy;
|
|
|
- interval = new_interval;
|
|
|
+ if (new_obs_cx != obs_cx || new_obs_cy != obs_cy ||
|
|
|
+ new_obs_interval != obs_interval) {
|
|
|
+ AddVideoFormat(VideoFormat::NV12, new_obs_cx, new_obs_cy,
|
|
|
+ new_obs_interval);
|
|
|
+ AddVideoFormat(VideoFormat::I420, new_obs_cx, new_obs_cy,
|
|
|
+ new_obs_interval);
|
|
|
+ AddVideoFormat(VideoFormat::YUY2, new_obs_cx, new_obs_cy,
|
|
|
+ new_obs_interval);
|
|
|
+ SetVideoFormat(VideoFormat::NV12, new_obs_cx, new_obs_cy,
|
|
|
+ new_obs_interval);
|
|
|
+
|
|
|
+ obs_cx = new_obs_cx;
|
|
|
+ obs_cy = new_obs_cy;
|
|
|
+ obs_interval = new_obs_interval;
|
|
|
}
|
|
|
|
|
|
/* ---------------------------------------- */
|
|
|
@@ -178,9 +186,9 @@ void VCamFilter::Thread()
|
|
|
uint64_t cur_time = gettime_100ns();
|
|
|
uint64_t filter_time = GetTime();
|
|
|
|
|
|
- cx = GetCX();
|
|
|
- cy = GetCY();
|
|
|
- interval = GetInterval();
|
|
|
+ obs_cx = (uint32_t)GetCX();
|
|
|
+ obs_cy = (uint32_t)GetCY();
|
|
|
+ obs_interval = (uint64_t)GetInterval();
|
|
|
|
|
|
/* ---------------------------------------- */
|
|
|
/* load placeholder image */
|
|
|
@@ -195,8 +203,9 @@ void VCamFilter::Thread()
|
|
|
/* Created dynamically based on output resolution changes */
|
|
|
placeholder.scaled_data = nullptr;
|
|
|
|
|
|
- nv12_scale_init(&scaler, TARGET_FORMAT_NV12, cx, cy, cx, cy);
|
|
|
- nv12_scale_init(&placeholder.scaler, TARGET_FORMAT_NV12, cx, cy,
|
|
|
+ nv12_scale_init(&scaler, TARGET_FORMAT_NV12, obs_cx, obs_cy, obs_cx,
|
|
|
+ obs_cy);
|
|
|
+ nv12_scale_init(&placeholder.scaler, TARGET_FORMAT_NV12, obs_cx, obs_cy,
|
|
|
placeholder.cx, placeholder.cy);
|
|
|
|
|
|
UpdatePlaceholder();
|
|
|
@@ -204,16 +213,16 @@ void VCamFilter::Thread()
|
|
|
while (!stopped()) {
|
|
|
if (os_atomic_load_bool(&active))
|
|
|
Frame(filter_time);
|
|
|
- sleepto_100ns(cur_time += interval);
|
|
|
- filter_time += interval;
|
|
|
+ sleepto_100ns(cur_time += obs_interval);
|
|
|
+ filter_time += obs_interval;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void VCamFilter::Frame(uint64_t ts)
|
|
|
{
|
|
|
- uint32_t new_cx = cx;
|
|
|
- uint32_t new_cy = cy;
|
|
|
- uint64_t new_interval = interval;
|
|
|
+ uint32_t new_obs_cx = obs_cx;
|
|
|
+ uint32_t new_obs_cy = obs_cy;
|
|
|
+ uint64_t new_obs_interval = obs_interval;
|
|
|
|
|
|
/* cx, cy and interval are the resolution and frame rate of the
|
|
|
virtual camera _source_, ie OBS' output. Do not confuse cx / cy
|
|
|
@@ -229,8 +238,8 @@ void VCamFilter::Frame(uint64_t ts)
|
|
|
if (state == SHARED_QUEUE_STATE_READY) {
|
|
|
/* The virtualcam output from OBS has started, get
|
|
|
the actual cx / cy of the data stream */
|
|
|
- video_queue_get_info(vq, &new_cx, &new_cy,
|
|
|
- &new_interval);
|
|
|
+ video_queue_get_info(vq, &new_obs_cx, &new_obs_cy,
|
|
|
+ &new_obs_interval);
|
|
|
} else if (state == SHARED_QUEUE_STATE_STOPPING) {
|
|
|
video_queue_close(vq);
|
|
|
vq = nullptr;
|
|
|
@@ -242,28 +251,29 @@ void VCamFilter::Frame(uint64_t ts)
|
|
|
if (state != SHARED_QUEUE_STATE_READY) {
|
|
|
/* Virtualcam output not yet started, assume it's
|
|
|
the same resolution as the filter output */
|
|
|
- new_cx = GetCX();
|
|
|
- new_cy = GetCY();
|
|
|
- new_interval = GetInterval();
|
|
|
+ new_obs_cx = GetCX();
|
|
|
+ new_obs_cy = GetCY();
|
|
|
+ new_obs_interval = GetInterval();
|
|
|
}
|
|
|
|
|
|
- if (new_cx != cx || new_cy != cy || new_interval != interval) {
|
|
|
+ if (new_obs_cx != obs_cx || new_obs_cy != obs_cy ||
|
|
|
+ new_obs_interval != obs_interval) {
|
|
|
/* The res / FPS of the video coming from OBS has
|
|
|
changed, update parameters as needed */
|
|
|
if (in_obs) {
|
|
|
/* If the vcam is being used inside obs, adjust
|
|
|
the format we present to match */
|
|
|
- SetVideoFormat(GetVideoFormat(), new_cx, new_cy,
|
|
|
- new_interval);
|
|
|
+ SetVideoFormat(GetVideoFormat(), new_obs_cx, new_obs_cy,
|
|
|
+ new_obs_interval);
|
|
|
}
|
|
|
|
|
|
/* Re-initialize the main scaler to use the new resolution */
|
|
|
nv12_scale_init(&scaler, scaler.format, GetCX(), GetCY(),
|
|
|
- new_cx, new_cy);
|
|
|
+ new_obs_cx, new_obs_cy);
|
|
|
|
|
|
- cx = new_cx;
|
|
|
- cy = new_cy;
|
|
|
- interval = new_interval;
|
|
|
+ obs_cx = new_obs_cx;
|
|
|
+ obs_cy = new_obs_cy;
|
|
|
+ obs_interval = new_obs_interval;
|
|
|
|
|
|
UpdatePlaceholder();
|
|
|
}
|
|
|
@@ -295,7 +305,7 @@ void VCamFilter::Frame(uint64_t ts)
|
|
|
else
|
|
|
ShowDefaultFrame(ptr);
|
|
|
|
|
|
- UnlockSampleData(ts, ts + interval);
|
|
|
+ UnlockSampleData(ts, ts + obs_interval);
|
|
|
}
|
|
|
}
|
|
|
|