From 40b1cc180d6413d99782c23999605126516b3565 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Thu, 23 Oct 2014 10:32:56 -0700 Subject: [PATCH] linux-v4l2: Add 'Use System Timing' property Due to potential driver issues with certain devices, the timestamps are not always reliable. This option allows of using the time in which the frame was received as a timestamp instead. --- plugins/linux-v4l2/data/locale/en-US.ini | 1 + plugins/linux-v4l2/v4l2-input.c | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/plugins/linux-v4l2/data/locale/en-US.ini b/plugins/linux-v4l2/data/locale/en-US.ini index e95a73f59..d798c18ad 100644 --- a/plugins/linux-v4l2/data/locale/en-US.ini +++ b/plugins/linux-v4l2/data/locale/en-US.ini @@ -5,3 +5,4 @@ ImageFormat="Video Format" Resolution="Resolution" FrameRate="Frame Rate" LeaveUnchanged="Leave Unchanged" +UseSystemTiming="Use System Timing" diff --git a/plugins/linux-v4l2/v4l2-input.c b/plugins/linux-v4l2/v4l2-input.c index 88155db9d..d9bc2f3cb 100644 --- a/plugins/linux-v4l2/v4l2-input.c +++ b/plugins/linux-v4l2/v4l2-input.c @@ -32,6 +32,7 @@ along with this program. If not, see . #include #include #include +#include #include #include "v4l2-helpers.h" @@ -57,6 +58,7 @@ struct v4l2_data { int pixfmt; int resolution; int framerate; + bool sys_timing; /* internal data */ obs_source_t *source; @@ -177,7 +179,9 @@ static void *v4l2_thread(void *vptr) break; } - out.timestamp = timeval2ns(buf.timestamp); + out.timestamp = data->sys_timing ? + os_gettime_ns() : timeval2ns(buf.timestamp); + start = (uint8_t *) data->buffers.info[buf.index].start; for (uint_fast32_t i = 0; i < MAX_AV_PLANES; ++i) out.data[i] = start + plane_offsets[i]; @@ -209,6 +213,7 @@ static void v4l2_defaults(obs_data_t *settings) obs_data_set_default_int(settings, "pixelformat", -1); obs_data_set_default_int(settings, "resolution", -1); obs_data_set_default_int(settings, "framerate", -1); + obs_data_set_default_bool(settings, "system_timing", false); } /* @@ -576,6 +581,9 @@ static obs_properties_t *v4l2_properties(void *unused) "framerate", obs_module_text("FrameRate"), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); + obs_properties_add_bool(props, + "system_timing", obs_module_text("UseSystemTiming")); + v4l2_device_list(device_list, NULL); obs_property_set_modified_callback(device_list, device_selected); obs_property_set_modified_callback(input_list, input_selected); @@ -711,6 +719,7 @@ static void v4l2_update(void *vptr, obs_data_t *settings) data->pixfmt = obs_data_get_int(settings, "pixelformat"); data->resolution = obs_data_get_int(settings, "resolution"); data->framerate = obs_data_get_int(settings, "framerate"); + data->sys_timing = obs_data_get_bool(settings, "system_timing"); v4l2_init(data); } -- GitLab