Index: media/capture/video/linux/v4l2_capture_delegate.cc |
diff --git a/media/capture/video/linux/v4l2_capture_delegate.cc b/media/capture/video/linux/v4l2_capture_delegate.cc |
index 322cb46c4f14d71bfbcc754fe26c3f0ec3b2a5f8..2f16c203996b82851c6181e67ac4a3f07b96c8a6 100644 |
--- a/media/capture/video/linux/v4l2_capture_delegate.cc |
+++ b/media/capture/video/linux/v4l2_capture_delegate.cc |
@@ -21,6 +21,8 @@ |
#include "media/capture/video/blob_utils.h" |
#include "media/capture/video/linux/video_capture_device_linux.h" |
+using media::mojom::MeteringMode; |
+ |
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) |
// 16 bit depth, Realsense F200. |
#define V4L2_PIX_FMT_Z16 v4l2_fourcc('Z', '1', '6', ' ') |
@@ -550,40 +552,72 @@ void V4L2CaptureDelegate::GetPhotoCapabilities( |
photo_capabilities->zoom = |
RetrieveUserControlRange(device_fd_.get(), V4L2_CID_ZOOM_ABSOLUTE); |
- photo_capabilities->focus_mode = mojom::MeteringMode::NONE; |
+ v4l2_queryctrl manual_focus_ctrl = {}; |
+ manual_focus_ctrl.id = V4L2_CID_FOCUS_ABSOLUTE; |
+ if (RunIoctl(device_fd_.get(), VIDIOC_QUERYCTRL, &manual_focus_ctrl)) |
+ photo_capabilities->supported_focus_modes.push_back(MeteringMode::MANUAL); |
+ |
+ v4l2_queryctrl auto_focus_ctrl = {}; |
+ auto_focus_ctrl.id = V4L2_CID_FOCUS_AUTO; |
+ if (RunIoctl(device_fd_.get(), VIDIOC_QUERYCTRL, &auto_focus_ctrl)) { |
+ photo_capabilities->supported_focus_modes.push_back( |
+ MeteringMode::CONTINUOUS); |
+ } |
+ |
+ photo_capabilities->current_focus_mode = MeteringMode::NONE; |
v4l2_control auto_focus_current = {}; |
auto_focus_current.id = V4L2_CID_FOCUS_AUTO; |
if (HANDLE_EINTR( |
ioctl(device_fd_.get(), VIDIOC_G_CTRL, &auto_focus_current)) >= 0) { |
- photo_capabilities->focus_mode = auto_focus_current.value |
- ? mojom::MeteringMode::CONTINUOUS |
- : mojom::MeteringMode::MANUAL; |
+ photo_capabilities->current_focus_mode = auto_focus_current.value |
+ ? MeteringMode::CONTINUOUS |
+ : MeteringMode::MANUAL; |
} |
- photo_capabilities->exposure_mode = mojom::MeteringMode::NONE; |
+ v4l2_queryctrl auto_exposure_ctrl = {}; |
+ auto_exposure_ctrl.id = V4L2_CID_EXPOSURE_AUTO; |
+ if (RunIoctl(device_fd_.get(), VIDIOC_QUERYCTRL, &auto_exposure_ctrl)) { |
+ photo_capabilities->supported_exposure_modes.push_back( |
+ MeteringMode::MANUAL); |
+ photo_capabilities->supported_exposure_modes.push_back( |
+ MeteringMode::CONTINUOUS); |
+ } |
+ |
+ photo_capabilities->current_exposure_mode = MeteringMode::NONE; |
v4l2_control exposure_current = {}; |
exposure_current.id = V4L2_CID_EXPOSURE_AUTO; |
if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_G_CTRL, &exposure_current)) >= |
0) { |
- photo_capabilities->exposure_mode = |
+ photo_capabilities->current_exposure_mode = |
exposure_current.value == V4L2_EXPOSURE_MANUAL |
- ? mojom::MeteringMode::MANUAL |
- : mojom::MeteringMode::CONTINUOUS; |
+ ? MeteringMode::MANUAL |
+ : MeteringMode::CONTINUOUS; |
} |
- photo_capabilities->white_balance_mode = mojom::MeteringMode::NONE; |
+ photo_capabilities->color_temperature = RetrieveUserControlRange( |
+ device_fd_.get(), V4L2_CID_WHITE_BALANCE_TEMPERATURE); |
+ if (photo_capabilities->color_temperature) { |
+ photo_capabilities->supported_white_balance_modes.push_back( |
+ MeteringMode::MANUAL); |
+ } |
+ |
+ v4l2_queryctrl white_balance_ctrl = {}; |
+ white_balance_ctrl.id = V4L2_CID_AUTO_WHITE_BALANCE; |
+ if (RunIoctl(device_fd_.get(), VIDIOC_QUERYCTRL, &white_balance_ctrl)) { |
+ photo_capabilities->supported_white_balance_modes.push_back( |
+ MeteringMode::CONTINUOUS); |
+ } |
+ |
+ photo_capabilities->current_white_balance_mode = MeteringMode::NONE; |
v4l2_control white_balance_current = {}; |
white_balance_current.id = V4L2_CID_AUTO_WHITE_BALANCE; |
if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_G_CTRL, |
&white_balance_current)) >= 0) { |
- photo_capabilities->white_balance_mode = |
- white_balance_current.value ? mojom::MeteringMode::CONTINUOUS |
- : mojom::MeteringMode::MANUAL; |
+ photo_capabilities->current_white_balance_mode = |
+ white_balance_current.value ? MeteringMode::CONTINUOUS |
+ : MeteringMode::MANUAL; |
} |
- photo_capabilities->color_temperature = RetrieveUserControlRange( |
- device_fd_.get(), V4L2_CID_WHITE_BALANCE_TEMPERATURE); |
- |
photo_capabilities->iso = mojom::Range::New(); |
photo_capabilities->height = mojom::Range::New(); |
photo_capabilities->width = mojom::Range::New(); |