diff options
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.cc | 34 |
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); } } |