diff --git a/plugins/linux-v4l2/data/locale/en-US.ini b/plugins/linux-v4l2/data/locale/en-US.ini index e95a73f5923cf54f0b593f1695b8e357ac759247..d798c18ad7742fefffcbc8522644f50110d99f8e 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 88155db9d4c499781f14d0af530541132753e6f1..d9bc2f3cb359e14d663f1b534b131d24de68e849 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); }