summaryrefslogtreecommitdiff
path: root/lib/configfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/configfs.c')
-rw-r--r--lib/configfs.c33
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)) {