Chromium Code Reviews| 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 ddc69dc7ba1c91fc4ec5cd8d47851cbd1e382284..918656d21472a1de3ab8899c4594efd377dde3c2 100644 |
| --- a/media/capture/video/linux/v4l2_capture_delegate.cc |
| +++ b/media/capture/video/linux/v4l2_capture_delegate.cc |
| @@ -330,6 +330,80 @@ void V4L2CaptureDelegate::TakePhoto( |
| take_photo_callbacks_.push(std::move(callback)); |
| } |
| +void V4L2CaptureDelegate::GetPhotoCapabilities( |
| + VideoCaptureDevice::GetPhotoCapabilitiesCallback callback) { |
| + DCHECK(v4l2_task_runner_->BelongsToCurrentThread()); |
| + |
| + mojom::PhotoCapabilitiesPtr photo_capabilities = |
| + mojom::PhotoCapabilities::New(); |
| + |
| + photo_capabilities->zoom = mojom::Range::New(); |
| + v4l2_queryctrl zoom_range = {}; |
| + zoom_range.id = V4L2_CID_ZOOM_ABSOLUTE; |
| + zoom_range.type = V4L2_CTRL_TYPE_INTEGER; |
| + if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_QUERYCTRL, &zoom_range)) >= |
| + 0) { |
| + photo_capabilities->zoom->max = zoom_range.maximum * 100; |
| + photo_capabilities->zoom->min = zoom_range.minimum * 100; |
| + } |
|
xianglu
2016/09/20 22:18:40
What should be done if there is an error reading t
mcasas
2016/09/21 22:04:58
Nothing, l.340 initializes zoom_range.{minimum,
m
|
| + v4l2_control zoom_current = {}; |
| + zoom_current.id = V4L2_CID_ZOOM_ABSOLUTE; |
| + if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_G_CTRL, &zoom_current)) >= 0) |
| + photo_capabilities->zoom->current = zoom_current.value * 100; |
| + |
| + photo_capabilities->focus_mode = mojom::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->exposure_mode = mojom::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 = |
| + exposure_current.value == V4L2_EXPOSURE_MANUAL |
| + ? mojom::MeteringMode::MANUAL |
| + : mojom::MeteringMode::CONTINUOUS; |
| + } |
| + |
| + photo_capabilities->white_balance_mode = mojom::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->iso = mojom::Range::New(); |
| + photo_capabilities->height = mojom::Range::New(); |
| + photo_capabilities->width = mojom::Range::New(); |
| + photo_capabilities->exposure_compensation = mojom::Range::New(); |
| + photo_capabilities->fill_light_mode = mojom::FillLightMode::NONE; |
| + photo_capabilities->red_eye_reduction = false; |
| + callback.Run(std::move(photo_capabilities)); |
| +} |
| + |
| +void V4L2CaptureDelegate::SetPhotoOptions( |
| + mojom::PhotoSettingsPtr settings, |
| + VideoCaptureDevice::SetPhotoOptionsCallback callback) { |
| + if (settings->has_zoom) { |
| + v4l2_control zoom_current = {}; |
| + zoom_current.id = V4L2_CID_ZOOM_ABSOLUTE; |
| + zoom_current.value = settings->zoom / 100; |
| + if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_S_CTRL, &zoom_current)) < 0) |
| + DLOG(ERROR) << "Error setting zoom value to " << settings->zoom; |
|
xianglu
2016/09/20 22:18:40
Should it be settings->zoom / 100?
mcasas
2016/09/21 22:04:58
Done.
|
| + } |
| + callback.Run(true); |
| +} |
| + |
| void V4L2CaptureDelegate::SetRotation(int rotation) { |
| DCHECK(v4l2_task_runner_->BelongsToCurrentThread()); |
| DCHECK(rotation >= 0 && rotation < 360 && rotation % 90 == 0); |