linux-v4l2: Add buffering option

Add a source property to enable buffering of frames, which is enabled by
default. This replaces the old "Use system timing" option by setting the
unbuffered source flag instead of using different timestamps.
While similar in intentions to the old option, this method should reduce
latency even more.
This commit is contained in:
fryshorts 2015-03-04 21:21:22 +01:00
parent c0f47c7efd
commit cdbf193e2e
2 changed files with 18 additions and 0 deletions

View File

@ -7,3 +7,4 @@ DVTiming="DV Timing"
Resolution="Resolution"
FrameRate="Frame Rate"
LeaveUnchanged="Leave Unchanged"
UseBuffering="Use Buffering"

View File

@ -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);
}