OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/capture/video/linux/v4l2_capture_delegate.h" | 5 #include "media/capture/video/linux/v4l2_capture_delegate.h" |
6 | 6 |
7 #include <linux/version.h> | 7 #include <linux/version.h> |
8 #include <linux/videodev2.h> | 8 #include <linux/videodev2.h> |
9 #include <poll.h> | 9 #include <poll.h> |
10 #include <sys/fcntl.h> | 10 #include <sys/fcntl.h> |
11 #include <sys/ioctl.h> | 11 #include <sys/ioctl.h> |
12 #include <sys/mman.h> | 12 #include <sys/mman.h> |
13 #include <utility> | 13 #include <utility> |
14 | 14 |
15 #include "base/bind.h" | 15 #include "base/bind.h" |
16 #include "base/files/file_enumerator.h" | 16 #include "base/files/file_enumerator.h" |
17 #include "base/posix/eintr_wrapper.h" | 17 #include "base/posix/eintr_wrapper.h" |
18 #include "base/strings/stringprintf.h" | 18 #include "base/strings/stringprintf.h" |
19 #include "build/build_config.h" | 19 #include "build/build_config.h" |
20 #include "media/base/bind_to_current_loop.h" | 20 #include "media/base/bind_to_current_loop.h" |
21 #include "media/capture/video/blob_utils.h" | 21 #include "media/capture/video/blob_utils.h" |
22 #include "media/capture/video/linux/video_capture_device_linux.h" | 22 #include "media/capture/video/linux/video_capture_device_linux.h" |
23 | 23 |
| 24 using media::mojom::MeteringMode; |
| 25 |
24 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) | 26 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 6, 0) |
25 // 16 bit depth, Realsense F200. | 27 // 16 bit depth, Realsense F200. |
26 #define V4L2_PIX_FMT_Z16 v4l2_fourcc('Z', '1', '6', ' ') | 28 #define V4L2_PIX_FMT_Z16 v4l2_fourcc('Z', '1', '6', ' ') |
27 #endif | 29 #endif |
28 | 30 |
29 // TODO(aleksandar.stojiljkovic): Wrap this with kernel version check once the | 31 // TODO(aleksandar.stojiljkovic): Wrap this with kernel version check once the |
30 // format is introduced to kernel. | 32 // format is introduced to kernel. |
31 // See https://crbug.com/661877 | 33 // See https://crbug.com/661877 |
32 #ifndef V4L2_PIX_FMT_INVZ | 34 #ifndef V4L2_PIX_FMT_INVZ |
33 // 16 bit depth, Realsense SR300. | 35 // 16 bit depth, Realsense SR300. |
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 DCHECK(v4l2_task_runner_->BelongsToCurrentThread()); | 545 DCHECK(v4l2_task_runner_->BelongsToCurrentThread()); |
544 if (!device_fd_.is_valid() || !is_capturing_) | 546 if (!device_fd_.is_valid() || !is_capturing_) |
545 return; | 547 return; |
546 | 548 |
547 mojom::PhotoCapabilitiesPtr photo_capabilities = | 549 mojom::PhotoCapabilitiesPtr photo_capabilities = |
548 mojom::PhotoCapabilities::New(); | 550 mojom::PhotoCapabilities::New(); |
549 | 551 |
550 photo_capabilities->zoom = | 552 photo_capabilities->zoom = |
551 RetrieveUserControlRange(device_fd_.get(), V4L2_CID_ZOOM_ABSOLUTE); | 553 RetrieveUserControlRange(device_fd_.get(), V4L2_CID_ZOOM_ABSOLUTE); |
552 | 554 |
553 photo_capabilities->focus_mode = mojom::MeteringMode::NONE; | 555 v4l2_queryctrl manual_focus_ctrl = {}; |
| 556 manual_focus_ctrl.id = V4L2_CID_FOCUS_ABSOLUTE; |
| 557 if (RunIoctl(device_fd_.get(), VIDIOC_QUERYCTRL, &manual_focus_ctrl)) |
| 558 photo_capabilities->supported_focus_modes.push_back(MeteringMode::MANUAL); |
| 559 |
| 560 v4l2_queryctrl auto_focus_ctrl = {}; |
| 561 auto_focus_ctrl.id = V4L2_CID_FOCUS_AUTO; |
| 562 if (RunIoctl(device_fd_.get(), VIDIOC_QUERYCTRL, &auto_focus_ctrl)) { |
| 563 photo_capabilities->supported_focus_modes.push_back( |
| 564 MeteringMode::CONTINUOUS); |
| 565 } |
| 566 |
| 567 photo_capabilities->current_focus_mode = MeteringMode::NONE; |
554 v4l2_control auto_focus_current = {}; | 568 v4l2_control auto_focus_current = {}; |
555 auto_focus_current.id = V4L2_CID_FOCUS_AUTO; | 569 auto_focus_current.id = V4L2_CID_FOCUS_AUTO; |
556 if (HANDLE_EINTR( | 570 if (HANDLE_EINTR( |
557 ioctl(device_fd_.get(), VIDIOC_G_CTRL, &auto_focus_current)) >= 0) { | 571 ioctl(device_fd_.get(), VIDIOC_G_CTRL, &auto_focus_current)) >= 0) { |
558 photo_capabilities->focus_mode = auto_focus_current.value | 572 photo_capabilities->current_focus_mode = auto_focus_current.value |
559 ? mojom::MeteringMode::CONTINUOUS | 573 ? MeteringMode::CONTINUOUS |
560 : mojom::MeteringMode::MANUAL; | 574 : MeteringMode::MANUAL; |
561 } | 575 } |
562 | 576 |
563 photo_capabilities->exposure_mode = mojom::MeteringMode::NONE; | 577 v4l2_queryctrl auto_exposure_ctrl = {}; |
| 578 auto_exposure_ctrl.id = V4L2_CID_EXPOSURE_AUTO; |
| 579 if (RunIoctl(device_fd_.get(), VIDIOC_QUERYCTRL, &auto_exposure_ctrl)) { |
| 580 photo_capabilities->supported_exposure_modes.push_back( |
| 581 MeteringMode::MANUAL); |
| 582 photo_capabilities->supported_exposure_modes.push_back( |
| 583 MeteringMode::CONTINUOUS); |
| 584 } |
| 585 |
| 586 photo_capabilities->current_exposure_mode = MeteringMode::NONE; |
564 v4l2_control exposure_current = {}; | 587 v4l2_control exposure_current = {}; |
565 exposure_current.id = V4L2_CID_EXPOSURE_AUTO; | 588 exposure_current.id = V4L2_CID_EXPOSURE_AUTO; |
566 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_G_CTRL, &exposure_current)) >= | 589 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_G_CTRL, &exposure_current)) >= |
567 0) { | 590 0) { |
568 photo_capabilities->exposure_mode = | 591 photo_capabilities->current_exposure_mode = |
569 exposure_current.value == V4L2_EXPOSURE_MANUAL | 592 exposure_current.value == V4L2_EXPOSURE_MANUAL |
570 ? mojom::MeteringMode::MANUAL | 593 ? MeteringMode::MANUAL |
571 : mojom::MeteringMode::CONTINUOUS; | 594 : MeteringMode::CONTINUOUS; |
572 } | 595 } |
573 | 596 |
574 photo_capabilities->white_balance_mode = mojom::MeteringMode::NONE; | 597 photo_capabilities->color_temperature = RetrieveUserControlRange( |
| 598 device_fd_.get(), V4L2_CID_WHITE_BALANCE_TEMPERATURE); |
| 599 if (photo_capabilities->color_temperature) { |
| 600 photo_capabilities->supported_white_balance_modes.push_back( |
| 601 MeteringMode::MANUAL); |
| 602 } |
| 603 |
| 604 v4l2_queryctrl white_balance_ctrl = {}; |
| 605 white_balance_ctrl.id = V4L2_CID_AUTO_WHITE_BALANCE; |
| 606 if (RunIoctl(device_fd_.get(), VIDIOC_QUERYCTRL, &white_balance_ctrl)) { |
| 607 photo_capabilities->supported_white_balance_modes.push_back( |
| 608 MeteringMode::CONTINUOUS); |
| 609 } |
| 610 |
| 611 photo_capabilities->current_white_balance_mode = MeteringMode::NONE; |
575 v4l2_control white_balance_current = {}; | 612 v4l2_control white_balance_current = {}; |
576 white_balance_current.id = V4L2_CID_AUTO_WHITE_BALANCE; | 613 white_balance_current.id = V4L2_CID_AUTO_WHITE_BALANCE; |
577 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_G_CTRL, | 614 if (HANDLE_EINTR(ioctl(device_fd_.get(), VIDIOC_G_CTRL, |
578 &white_balance_current)) >= 0) { | 615 &white_balance_current)) >= 0) { |
579 photo_capabilities->white_balance_mode = | 616 photo_capabilities->current_white_balance_mode = |
580 white_balance_current.value ? mojom::MeteringMode::CONTINUOUS | 617 white_balance_current.value ? MeteringMode::CONTINUOUS |
581 : mojom::MeteringMode::MANUAL; | 618 : MeteringMode::MANUAL; |
582 } | 619 } |
583 | 620 |
584 photo_capabilities->color_temperature = RetrieveUserControlRange( | |
585 device_fd_.get(), V4L2_CID_WHITE_BALANCE_TEMPERATURE); | |
586 | |
587 photo_capabilities->iso = mojom::Range::New(); | 621 photo_capabilities->iso = mojom::Range::New(); |
588 photo_capabilities->height = mojom::Range::New(); | 622 photo_capabilities->height = mojom::Range::New(); |
589 photo_capabilities->width = mojom::Range::New(); | 623 photo_capabilities->width = mojom::Range::New(); |
590 photo_capabilities->exposure_compensation = mojom::Range::New(); | 624 photo_capabilities->exposure_compensation = mojom::Range::New(); |
591 photo_capabilities->red_eye_reduction = mojom::RedEyeReduction::NEVER; | 625 photo_capabilities->red_eye_reduction = mojom::RedEyeReduction::NEVER; |
592 photo_capabilities->torch = false; | 626 photo_capabilities->torch = false; |
593 | 627 |
594 photo_capabilities->brightness = | 628 photo_capabilities->brightness = |
595 RetrieveUserControlRange(device_fd_.get(), V4L2_CID_BRIGHTNESS); | 629 RetrieveUserControlRange(device_fd_.get(), V4L2_CID_BRIGHTNESS); |
596 photo_capabilities->contrast = | 630 photo_capabilities->contrast = |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
816 DLOG(ERROR) << "Error mmap()ing a V4L2 buffer into userspace"; | 850 DLOG(ERROR) << "Error mmap()ing a V4L2 buffer into userspace"; |
817 return false; | 851 return false; |
818 } | 852 } |
819 start_ = static_cast<uint8_t*>(start); | 853 start_ = static_cast<uint8_t*>(start); |
820 length_ = buffer.length; | 854 length_ = buffer.length; |
821 payload_size_ = 0; | 855 payload_size_ = 0; |
822 return true; | 856 return true; |
823 } | 857 } |
824 | 858 |
825 } // namespace media | 859 } // namespace media |
OLD | NEW |