diff --git a/plugins/linux-v4l2/v4l2-input.c b/plugins/linux-v4l2/v4l2-input.c
index 09f157d1fccc04b95cb75091f522e60ee930a764..493b361e6279e0aa170a85b3fe226ac4ff9cd86d 100644
--- a/plugins/linux-v4l2/v4l2-input.c
+++ b/plugins/linux-v4l2/v4l2-input.c
@@ -233,8 +233,6 @@ static void v4l2_device_list(obs_property_t prop, obs_data_t settings)
 {
 	DIR *dirp;
 	struct dirent *dp;
-	int fd;
-	struct v4l2_capability video_cap;
 	struct dstr device;
 	bool first = true;
 
@@ -247,6 +245,10 @@ static void v4l2_device_list(obs_property_t prop, obs_data_t settings)
 	dstr_init_copy(&device, "/dev/");
 
 	while ((dp = readdir(dirp)) != NULL) {
+		int fd;
+		uint32_t caps;
+		struct v4l2_capability video_cap;
+
 		if (dp->d_type == DT_DIR)
 			continue;
 
@@ -261,23 +263,33 @@ static void v4l2_device_list(obs_property_t prop, obs_data_t settings)
 		if (v4l2_ioctl(fd, VIDIOC_QUERYCAP, &video_cap) == -1) {
 			blog(LOG_INFO, "Failed to query capabilities for %s",
 			     device.array);
-		} else if (video_cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) {
-			obs_property_list_add_string(prop,
-					(char *) video_cap.card,
-					device.array);
-			if (first) {
-				obs_data_set_string(settings,
-					"device_id", device.array);
-				first = false;
-			}
-			blog(LOG_INFO, "Found device '%s' at %s",
-			     video_cap.card, device.array);
+			close(fd);
+			continue;
 		}
-		else {
+
+		caps = (video_cap.capabilities & V4L2_CAP_DEVICE_CAPS)
+			? video_cap.device_caps
+			: video_cap.capabilities;
+
+		if (!(caps & V4L2_CAP_VIDEO_CAPTURE)) {
 			blog(LOG_INFO, "%s seems to not support video capture",
 			     device.array);
+			close(fd);
+			continue;
 		}
 
+		obs_property_list_add_string(prop, (char *) video_cap.card,
+				device.array);
+
+		if (first) {
+			obs_data_set_string(settings, "device_id",
+					device.array);
+			first = false;
+		}
+
+		blog(LOG_INFO, "Found device '%s' at %s", video_cap.card,
+				device.array);
+
 		close(fd);
 	}