diff --git a/plugins/linux-v4l2/data/locale/en-US.ini b/plugins/linux-v4l2/data/locale/en-US.ini index f0fbd0163..bdb93b0f0 100644 --- a/plugins/linux-v4l2/data/locale/en-US.ini +++ b/plugins/linux-v4l2/data/locale/en-US.ini @@ -7,3 +7,4 @@ DVTiming="DV Timing" Resolution="Resolution" FrameRate="Frame Rate" LeaveUnchanged="Leave Unchanged" +UseBuffering="Use Buffering" diff --git a/plugins/linux-v4l2/v4l2-input.c b/plugins/linux-v4l2/v4l2-input.c index 6bf477152..06237bf6d 100644 --- a/plugins/linux-v4l2/v4l2-input.c +++ b/plugins/linux-v4l2/v4l2-input.c @@ -225,6 +225,7 @@ static void v4l2_defaults(obs_data_t *settings) obs_data_set_default_int(settings, "dv_timing", -1); obs_data_set_default_int(settings, "resolution", -1); obs_data_set_default_int(settings, "framerate", -1); + obs_data_set_default_bool(settings, "buffering", true); } /** @@ -732,6 +733,9 @@ static obs_properties_t *v4l2_properties(void *vptr) "framerate", obs_module_text("FrameRate"), OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT); + obs_properties_add_bool(props, + "buffering", obs_module_text("UseBuffering")); + obs_data_t *settings = obs_source_get_settings(data->source); v4l2_device_list(device_list, settings); obs_data_release(settings); @@ -873,6 +877,17 @@ fail: v4l2_terminate(data); } +/** Update source flags depending on the settings */ +static void v4l2_update_source_flags(struct v4l2_data *data, + obs_data_t *settings) +{ + uint32_t flags = obs_source_get_flags(data->source); + flags = (obs_data_get_bool(settings, "buffering")) + ? flags & ~OBS_SOURCE_FLAG_UNBUFFERED + : flags | OBS_SOURCE_FLAG_UNBUFFERED; + obs_source_set_flags(data->source, flags); +} + /** * Update the settings for the v4l2 source * @@ -898,6 +913,8 @@ static void v4l2_update(void *vptr, obs_data_t *settings) data->resolution = obs_data_get_int(settings, "resolution"); data->framerate = obs_data_get_int(settings, "framerate"); + v4l2_update_source_flags(data, settings); + v4l2_init(data); }