diff options
Diffstat (limited to 'lib/configfs.c')
-rw-r--r-- | lib/configfs.c | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/lib/configfs.c b/lib/configfs.c index 56bff01..26a07bb 100644 --- a/lib/configfs.c +++ b/lib/configfs.c @@ -626,6 +626,8 @@ static int configfs_parse_streaming_format(const char *path, struct uvc_function_config_format *format) { struct dirent **entries; + char link_target[1024]; + char *segment; unsigned int i; int n_entries; int ret; @@ -634,12 +636,37 @@ static int configfs_parse_streaming_format(const char *path, if (ret < 0) return ret; - ret = attribute_read(path, "guidFormat", format->guid, - sizeof(format->guid)); + ret = readlink(path, link_target, sizeof(link_target) - 1); if (ret < 0) return ret; - if (ret != 16) + + link_target[ret] = '\0'; + + /* + * Extract the second-to-last path component of the link target, + * which contains the format descriptor type name as exposed by + * the UVC function driver. + */ + segment = strrchr(link_target, '/'); + if (!segment) return -EINVAL; + *segment = '\0'; + segment = strrchr(link_target, '/'); + if (!segment) + return -EINVAL; + segment++; + + if (!strcmp(segment, "mjpeg")) { + static const uint8_t guid[16] = UVC_GUID_FORMAT_MJPEG; + memcpy(format->guid, guid, 16); + } else if (!strcmp(segment, "uncompressed")) { + ret = attribute_read(path, "guidFormat", format->guid, + sizeof(format->guid)); + if (ret < 0) + return ret; + } else { + return -EINVAL; + } for (i = 0; i < ARRAY_SIZE(uvc_formats); ++i) { if (!memcmp(uvc_formats[i].guid, format->guid, 16)) { |