|
@@ -1675,9 +1675,13 @@ static void obs_source_update_async_video(obs_source_t *source)
|
|
|
|
|
|
source->async_rendered = true;
|
|
|
if (frame) {
|
|
|
- source->timing_adjust =
|
|
|
- obs->video.video_time - frame->timestamp;
|
|
|
- source->timing_set = true;
|
|
|
+ if (!source->async_decoupled ||
|
|
|
+ !source->async_unbuffered) {
|
|
|
+ source->timing_adjust =
|
|
|
+ obs->video.video_time -
|
|
|
+ frame->timestamp;
|
|
|
+ source->timing_set = true;
|
|
|
+ }
|
|
|
|
|
|
if (source->async_update_texture) {
|
|
|
update_async_texture(source, frame,
|
|
@@ -4069,3 +4073,23 @@ obs_data_t *obs_source_get_private_settings(obs_source_t *source)
|
|
|
obs_data_addref(source->private_settings);
|
|
|
return source->private_settings;
|
|
|
}
|
|
|
+
|
|
|
+void obs_source_set_async_decoupled(obs_source_t *source, bool decouple)
|
|
|
+{
|
|
|
+ if (!obs_ptr_valid(source, "obs_source_set_async_decoupled"))
|
|
|
+ return;
|
|
|
+
|
|
|
+ source->async_decoupled = decouple;
|
|
|
+ if (decouple) {
|
|
|
+ pthread_mutex_lock(&source->audio_buf_mutex);
|
|
|
+ source->timing_set = false;
|
|
|
+ reset_audio_data(source, 0);
|
|
|
+ pthread_mutex_unlock(&source->audio_buf_mutex);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+bool obs_source_async_decoupled(const obs_source_t *source)
|
|
|
+{
|
|
|
+ return obs_source_valid(source, "obs_source_async_decoupled") ?
|
|
|
+ source->async_decoupled : false;
|
|
|
+}
|