summaryrefslogtreecommitdiff
path: root/chromium/media/capture/video/linux/video_capture_device_factory_linux.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/media/capture/video/linux/video_capture_device_factory_linux.cc')
-rw-r--r--chromium/media/capture/video/linux/video_capture_device_factory_linux.cc34
1 files changed, 24 insertions, 10 deletions
diff --git a/chromium/media/capture/video/linux/video_capture_device_factory_linux.cc b/chromium/media/capture/video/linux/video_capture_device_factory_linux.cc
index 48bcb6e168f..677d733460e 100644
--- a/chromium/media/capture/video/linux/video_capture_device_factory_linux.cc
+++ b/chromium/media/capture/video/linux/video_capture_device_factory_linux.cc
@@ -28,7 +28,7 @@
#include <linux/videodev2.h>
#endif
-#if BUILDFLAG(IS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "media/capture/video/linux/camera_config_chromeos.h"
#include "media/capture/video/linux/video_capture_device_chromeos.h"
#endif
@@ -53,7 +53,7 @@ const char kPidPathTemplate[] = "/sys/class/video4linux/%s/device/../idProduct";
const char kInterfacePathTemplate[] =
"/sys/class/video4linux/%s/device/interface";
-#if BUILDFLAG(IS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
static CameraConfigChromeOS* GetCameraConfig() {
static CameraConfigChromeOS* config = new CameraConfigChromeOS();
return config;
@@ -125,7 +125,7 @@ class DevVideoFilePathsDeviceProvider
VideoFacingMode GetCameraFacing(const std::string& device_id,
const std::string& model_id) override {
-#if BUILDFLAG(IS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
return GetCameraConfig()->GetCameraFacing(device_id, model_id);
#else
NOTREACHED();
@@ -135,7 +135,7 @@ class DevVideoFilePathsDeviceProvider
int GetOrientation(const std::string& device_id,
const std::string& model_id) override {
-#if BUILDFLAG(IS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
return GetCameraConfig()->GetOrientation(device_id, model_id);
#else
NOTREACHED();
@@ -166,7 +166,7 @@ std::unique_ptr<VideoCaptureDevice>
VideoCaptureDeviceFactoryLinux::CreateDevice(
const VideoCaptureDeviceDescriptor& device_descriptor) {
DCHECK(thread_checker_.CalledOnValidThread());
-#if BUILDFLAG(IS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
ChromeOSDeviceCameraConfig camera_config(
device_provider_->GetCameraFacing(device_descriptor.device_id,
device_descriptor.model_id),
@@ -210,10 +210,18 @@ void VideoCaptureDeviceFactoryLinux::GetDevicesInfo(
// one supported capture format. Devices that have capture and output
// capabilities at the same time are memory-to-memory and are skipped, see
// http://crbug.com/139356.
+ // In theory, checking for CAPTURE/OUTPUT in caps.capabilities should only
+ // be done if V4L2_CAP_DEVICE_CAPS is not set. However, this was not done
+ // in the past and it is unclear if it breaks with existing devices. And if
+ // a device is accepted incorrectly then it will not have any usable
+ // formats and is skipped anyways.
v4l2_capability cap;
if ((DoIoctl(fd.get(), VIDIOC_QUERYCAP, &cap) == 0) &&
- (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE &&
- !(cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) &&
+ ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE &&
+ !(cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) ||
+ (cap.capabilities & V4L2_CAP_DEVICE_CAPS &&
+ cap.device_caps & V4L2_CAP_VIDEO_CAPTURE &&
+ !(cap.device_caps & V4L2_CAP_VIDEO_OUTPUT))) &&
HasUsableFormats(fd.get(), cap.capabilities)) {
const std::string model_id =
device_provider_->GetDeviceModelId(unique_id);
@@ -223,19 +231,25 @@ void VideoCaptureDeviceFactoryLinux::GetDevicesInfo(
display_name = reinterpret_cast<char*>(cap.card);
VideoFacingMode facing_mode =
-#if BUILDFLAG(IS_ASH)
+#if BUILDFLAG(IS_CHROMEOS_ASH)
device_provider_->GetCameraFacing(unique_id, model_id);
#else
VideoFacingMode::MEDIA_VIDEO_FACING_NONE;
#endif
+ VideoCaptureFormats supported_formats;
+ GetSupportedFormatsForV4L2BufferType(fd.get(), &supported_formats);
+ if (supported_formats.empty()) {
+ DVLOG(1) << "No supported formats: " << unique_id;
+ continue;
+ }
+
devices_info.emplace_back(VideoCaptureDeviceDescriptor(
display_name, unique_id, model_id,
VideoCaptureApi::LINUX_V4L2_SINGLE_PLANE, GetControlSupport(fd.get()),
VideoCaptureTransportType::OTHER_TRANSPORT, facing_mode));
- GetSupportedFormatsForV4L2BufferType(
- fd.get(), &devices_info.back().supported_formats);
+ devices_info.back().supported_formats = std::move(supported_formats);
}
}