diff --git a/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.c b/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.c index c500ff92d1..51b75cd795 100644 --- a/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.c +++ b/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.c @@ -945,3 +945,52 @@ done: return fc; } + +static char * +video_find_config_name (const char *video) +{ + char *vpath; + glob_t globbuf; + char *config; + int ret; + + ret = asprintf (&vpath, + "/sys/class/udc/*/device/gadget*/video4linux/%s", video ? video : "*"); + if (!ret) + return NULL; + + glob (vpath, 0, NULL, &globbuf); + free (vpath); + + if (globbuf.gl_pathc != 1) + return NULL; + + config = attribute_read_str (globbuf.gl_pathv[0], "function_name"); + + globfree (&globbuf); + + return config; +} + +struct uvc_function_config * +configfs_parse_uvc_videodev (int fd, const char *video) +{ + struct uvc_function_config *fc; + char *function = NULL; + char rpath[PATH_MAX]; + char *res; + + res = realpath (video, rpath); + if (!res) + return NULL; + + function = video_find_config_name (basename (rpath)); + if (!function) + return NULL; + + fc = configfs_parse_uvc_function (function); + + free (function); + + return fc; +} diff --git a/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.h b/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.h index 4a610b94f5..1cbca78e6a 100644 --- a/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.h +++ b/subprojects/gst-plugins-bad/sys/uvcgadget/configfs.h @@ -113,4 +113,7 @@ struct uvc_function_config struct uvc_function_config *configfs_parse_uvc_function (const char *function); void configfs_free_uvc_function (struct uvc_function_config *fc); +struct uvc_function_config *configfs_parse_uvc_videodev (int fd, + const char *video); + #endif