提交 10a9133e 编写于 作者: J Jim

Merge pull request #290 from jp9000/v4l2-improvements

linux-v4l2: Handle reconnection in properties
...@@ -219,21 +219,49 @@ static void v4l2_defaults(obs_data_t *settings) ...@@ -219,21 +219,49 @@ static void v4l2_defaults(obs_data_t *settings)
obs_data_set_default_bool(settings, "system_timing", false); obs_data_set_default_bool(settings, "system_timing", false);
} }
/**
* Enable/Disable all properties for the source.
*
* @note A property that should be ignored can be specified
*
* @param props the source properties
* @param ignore ignore this property
* @param enable enable/disable all properties
*/
static void v4l2_props_set_enabled(obs_properties_t *props,
obs_property_t *ignore, bool enable)
{
if (!props)
return;
for (obs_property_t *prop = obs_properties_first(props); prop != NULL;
obs_property_next(&prop)) {
if (prop == ignore)
continue;
obs_property_set_enabled(prop, enable);
}
}
/* /*
* List available devices * List available devices
*/ */
static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings) static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings)
{ {
UNUSED_PARAMETER(settings);
DIR *dirp; DIR *dirp;
struct dirent *dp; struct dirent *dp;
struct dstr device; struct dstr device;
bool cur_device_found;
size_t cur_device_index;
const char *cur_device_name;
dirp = opendir("/sys/class/video4linux"); dirp = opendir("/sys/class/video4linux");
if (!dirp) if (!dirp)
return; return;
cur_device_found = false;
cur_device_name = obs_data_get_string(settings, "device_id");
obs_property_list_clear(prop); obs_property_list_clear(prop);
dstr_init_copy(&device, "/dev/"); dstr_init_copy(&device, "/dev/");
...@@ -277,9 +305,20 @@ static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings) ...@@ -277,9 +305,20 @@ static void v4l2_device_list(obs_property_t *prop, obs_data_t *settings)
blog(LOG_INFO, "Found device '%s' at %s", video_cap.card, blog(LOG_INFO, "Found device '%s' at %s", video_cap.card,
device.array); device.array);
/* check if this is the currently used device */
if (cur_device_name && !strcmp(cur_device_name, device.array))
cur_device_found = true;
v4l2_close(fd); v4l2_close(fd);
} }
/* add currently selected device if not present, but disable it ... */
if (!cur_device_found && cur_device_name && strlen(cur_device_name)) {
cur_device_index = obs_property_list_add_string(prop,
cur_device_name, cur_device_name);
obs_property_list_item_disable(prop, cur_device_index, true);
}
closedir(dirp); closedir(dirp);
dstr_free(&device); dstr_free(&device);
} }
...@@ -446,9 +485,11 @@ static void v4l2_framerate_list(int dev, uint_fast32_t pixelformat, ...@@ -446,9 +485,11 @@ static void v4l2_framerate_list(int dev, uint_fast32_t pixelformat,
static bool device_selected(obs_properties_t *props, obs_property_t *p, static bool device_selected(obs_properties_t *props, obs_property_t *p,
obs_data_t *settings) obs_data_t *settings)
{ {
UNUSED_PARAMETER(p);
int dev = v4l2_open(obs_data_get_string(settings, "device_id"), int dev = v4l2_open(obs_data_get_string(settings, "device_id"),
O_RDWR | O_NONBLOCK); O_RDWR | O_NONBLOCK);
v4l2_props_set_enabled(props, p, (dev == -1) ? false : true);
if (dev == -1) if (dev == -1)
return false; return false;
...@@ -540,6 +581,8 @@ static void device_added(const char *dev, void *vptr) ...@@ -540,6 +581,8 @@ static void device_added(const char *dev, void *vptr)
{ {
V4L2_DATA(vptr); V4L2_DATA(vptr);
obs_source_update_properties(data->source);
if (strcmp(data->device_id, dev)) if (strcmp(data->device_id, dev))
return; return;
...@@ -556,6 +599,8 @@ static void device_removed(const char *dev, void *vptr) ...@@ -556,6 +599,8 @@ static void device_removed(const char *dev, void *vptr)
{ {
V4L2_DATA(vptr); V4L2_DATA(vptr);
obs_source_update_properties(data->source);
if (strcmp(data->device_id, dev)) if (strcmp(data->device_id, dev))
return; return;
...@@ -566,9 +611,9 @@ static void device_removed(const char *dev, void *vptr) ...@@ -566,9 +611,9 @@ static void device_removed(const char *dev, void *vptr)
#endif #endif
static obs_properties_t *v4l2_properties(void *unused) static obs_properties_t *v4l2_properties(void *vptr)
{ {
UNUSED_PARAMETER(unused); V4L2_DATA(vptr);
obs_properties_t *props = obs_properties_create(); obs_properties_t *props = obs_properties_create();
...@@ -595,12 +640,16 @@ static obs_properties_t *v4l2_properties(void *unused) ...@@ -595,12 +640,16 @@ static obs_properties_t *v4l2_properties(void *unused)
obs_properties_add_bool(props, obs_properties_add_bool(props,
"system_timing", obs_module_text("UseSystemTiming")); "system_timing", obs_module_text("UseSystemTiming"));
v4l2_device_list(device_list, NULL); obs_data_t *settings = obs_source_get_settings(data->source);
v4l2_device_list(device_list, settings);
obs_data_release(settings);
obs_property_set_modified_callback(device_list, device_selected); obs_property_set_modified_callback(device_list, device_selected);
obs_property_set_modified_callback(input_list, input_selected); obs_property_set_modified_callback(input_list, input_selected);
obs_property_set_modified_callback(format_list, format_selected); obs_property_set_modified_callback(format_list, format_selected);
obs_property_set_modified_callback(resolution_list, obs_property_set_modified_callback(resolution_list,
resolution_selected); resolution_selected);
return props; return props;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册