OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/media/engine/webrtcvideocapturer.h" | 11 #include "webrtc/media/engine/webrtcvideocapturer.h" |
12 | 12 |
13 #include "webrtc/base/arraysize.h" | 13 #include "webrtc/base/arraysize.h" |
14 #include "webrtc/base/bind.h" | 14 #include "webrtc/base/bind.h" |
15 #include "webrtc/base/checks.h" | 15 #include "webrtc/base/checks.h" |
16 #include "webrtc/base/criticalsection.h" | 16 #include "webrtc/base/criticalsection.h" |
17 #include "webrtc/base/logging.h" | 17 #include "webrtc/base/logging.h" |
18 #include "webrtc/base/safe_conversions.h" | 18 #include "webrtc/base/safe_conversions.h" |
19 #include "webrtc/base/thread.h" | 19 #include "webrtc/base/thread.h" |
20 #include "webrtc/base/timeutils.h" | 20 #include "webrtc/base/timeutils.h" |
21 | 21 |
22 #include "webrtc/base/win32.h" // Need this to #include the impl files. | 22 #include "webrtc/base/win32.h" // Need this to #include the impl files. |
23 #include "webrtc/modules/video_capture/video_capture_factory.h" | 23 #include "webrtc/modules/video_capture/video_capture_factory.h" |
24 #include "webrtc/system_wrappers/include/field_trial.h" | 24 #include "webrtc/system_wrappers/include/field_trial.h" |
25 | 25 |
26 namespace cricket { | 26 namespace cricket { |
27 | 27 |
| 28 namespace { |
28 struct kVideoFourCCEntry { | 29 struct kVideoFourCCEntry { |
29 uint32_t fourcc; | 30 uint32_t fourcc; |
30 webrtc::RawVideoType webrtc_type; | 31 webrtc::VideoType webrtc_type; |
31 }; | 32 }; |
32 | 33 |
33 // This indicates our format preferences and defines a mapping between | 34 // This indicates our format preferences and defines a mapping between |
34 // webrtc::RawVideoType (from video_capture_defines.h) to our FOURCCs. | 35 // webrtc::RawVideoType (from video_capture_defines.h) to our FOURCCs. |
35 static kVideoFourCCEntry kSupportedFourCCs[] = { | 36 kVideoFourCCEntry kSupportedFourCCs[] = { |
36 { FOURCC_I420, webrtc::kVideoI420 }, // 12 bpp, no conversion. | 37 {FOURCC_I420, webrtc::VideoType::kI420}, // 12 bpp, no conversion. |
37 { FOURCC_YV12, webrtc::kVideoYV12 }, // 12 bpp, no conversion. | 38 {FOURCC_YV12, webrtc::VideoType::kYV12}, // 12 bpp, no conversion. |
38 { FOURCC_YUY2, webrtc::kVideoYUY2 }, // 16 bpp, fast conversion. | 39 {FOURCC_YUY2, webrtc::VideoType::kYUY2}, // 16 bpp, fast conversion. |
39 { FOURCC_UYVY, webrtc::kVideoUYVY }, // 16 bpp, fast conversion. | 40 {FOURCC_UYVY, webrtc::VideoType::kUYVY}, // 16 bpp, fast conversion. |
40 { FOURCC_NV12, webrtc::kVideoNV12 }, // 12 bpp, fast conversion. | 41 {FOURCC_NV12, webrtc::VideoType::kNV12}, // 12 bpp, fast conversion. |
41 { FOURCC_NV21, webrtc::kVideoNV21 }, // 12 bpp, fast conversion. | 42 {FOURCC_NV21, webrtc::VideoType::kNV21}, // 12 bpp, fast conversion. |
42 { FOURCC_MJPG, webrtc::kVideoMJPEG }, // compressed, slow conversion. | 43 {FOURCC_MJPG, webrtc::VideoType::kMJPEG}, // compressed, slow conversion. |
43 { FOURCC_ARGB, webrtc::kVideoARGB }, // 32 bpp, slow conversion. | 44 {FOURCC_ARGB, webrtc::VideoType::kARGB}, // 32 bpp, slow conversion. |
44 { FOURCC_24BG, webrtc::kVideoRGB24 }, // 24 bpp, slow conversion. | 45 {FOURCC_24BG, webrtc::VideoType::kRGB24}, // 24 bpp, slow conversion. |
45 }; | 46 }; |
46 | 47 |
47 class WebRtcVcmFactory : public WebRtcVcmFactoryInterface { | 48 bool CapabilityToFormat(const webrtc::VideoCaptureCapability& cap, |
48 public: | 49 VideoFormat* format) { |
49 virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create( | |
50 const char* device) { | |
51 return webrtc::VideoCaptureFactory::Create(device); | |
52 } | |
53 virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo() { | |
54 return webrtc::VideoCaptureFactory::CreateDeviceInfo(); | |
55 } | |
56 virtual void DestroyDeviceInfo(webrtc::VideoCaptureModule::DeviceInfo* info) { | |
57 delete info; | |
58 } | |
59 }; | |
60 | |
61 static bool CapabilityToFormat(const webrtc::VideoCaptureCapability& cap, | |
62 VideoFormat* format) { | |
63 uint32_t fourcc = 0; | 50 uint32_t fourcc = 0; |
64 for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) { | 51 for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) { |
65 if (kSupportedFourCCs[i].webrtc_type == cap.rawType) { | 52 if (kSupportedFourCCs[i].webrtc_type == cap.videoType) { |
66 fourcc = kSupportedFourCCs[i].fourcc; | 53 fourcc = kSupportedFourCCs[i].fourcc; |
67 break; | 54 break; |
68 } | 55 } |
69 } | 56 } |
70 if (fourcc == 0) { | 57 if (fourcc == 0) { |
71 return false; | 58 return false; |
72 } | 59 } |
73 | 60 |
74 format->fourcc = fourcc; | 61 format->fourcc = fourcc; |
75 format->width = cap.width; | 62 format->width = cap.width; |
76 format->height = cap.height; | 63 format->height = cap.height; |
77 format->interval = VideoFormat::FpsToInterval(cap.maxFPS); | 64 format->interval = VideoFormat::FpsToInterval(cap.maxFPS); |
78 return true; | 65 return true; |
79 } | 66 } |
80 | 67 |
81 static bool FormatToCapability(const VideoFormat& format, | 68 bool FormatToCapability(const VideoFormat& format, |
82 webrtc::VideoCaptureCapability* cap) { | 69 webrtc::VideoCaptureCapability* cap) { |
83 webrtc::RawVideoType webrtc_type = webrtc::kVideoUnknown; | 70 webrtc::VideoType webrtc_type = webrtc::VideoType::kUnknown; |
84 for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) { | 71 for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) { |
85 if (kSupportedFourCCs[i].fourcc == format.fourcc) { | 72 if (kSupportedFourCCs[i].fourcc == format.fourcc) { |
86 webrtc_type = kSupportedFourCCs[i].webrtc_type; | 73 webrtc_type = kSupportedFourCCs[i].webrtc_type; |
87 break; | 74 break; |
88 } | 75 } |
89 } | 76 } |
90 if (webrtc_type == webrtc::kVideoUnknown) { | 77 if (webrtc_type == webrtc::VideoType::kUnknown) { |
91 return false; | 78 return false; |
92 } | 79 } |
93 | 80 |
94 cap->width = format.width; | 81 cap->width = format.width; |
95 cap->height = format.height; | 82 cap->height = format.height; |
96 cap->maxFPS = VideoFormat::IntervalToFps(format.interval); | 83 cap->maxFPS = VideoFormat::IntervalToFps(format.interval); |
97 cap->rawType = webrtc_type; | 84 cap->videoType = webrtc_type; |
98 cap->interlaced = false; | 85 cap->interlaced = false; |
99 return true; | 86 return true; |
100 } | 87 } |
101 | 88 |
| 89 } // namespace |
| 90 |
| 91 class WebRtcVcmFactory : public WebRtcVcmFactoryInterface { |
| 92 public: |
| 93 virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create( |
| 94 const char* device) { |
| 95 return webrtc::VideoCaptureFactory::Create(device); |
| 96 } |
| 97 virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo() { |
| 98 return webrtc::VideoCaptureFactory::CreateDeviceInfo(); |
| 99 } |
| 100 virtual void DestroyDeviceInfo(webrtc::VideoCaptureModule::DeviceInfo* info) { |
| 101 delete info; |
| 102 } |
| 103 }; |
| 104 |
102 /////////////////////////////////////////////////////////////////////////// | 105 /////////////////////////////////////////////////////////////////////////// |
103 // Implementation of class WebRtcVideoCapturer | 106 // Implementation of class WebRtcVideoCapturer |
104 /////////////////////////////////////////////////////////////////////////// | 107 /////////////////////////////////////////////////////////////////////////// |
105 | 108 |
106 WebRtcVideoCapturer::WebRtcVideoCapturer() | 109 WebRtcVideoCapturer::WebRtcVideoCapturer() |
107 : factory_(new WebRtcVcmFactory), | 110 : factory_(new WebRtcVcmFactory), |
108 module_(nullptr), | 111 module_(nullptr), |
109 captured_frames_(0), | 112 captured_frames_(0), |
110 start_thread_(nullptr), | 113 start_thread_(nullptr), |
111 async_invoker_(nullptr) {} | 114 async_invoker_(nullptr) {} |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 std::vector<VideoFormat> supported; | 161 std::vector<VideoFormat> supported; |
159 int32_t num_caps = info->NumberOfCapabilities(vcm_id); | 162 int32_t num_caps = info->NumberOfCapabilities(vcm_id); |
160 for (int32_t i = 0; i < num_caps; ++i) { | 163 for (int32_t i = 0; i < num_caps; ++i) { |
161 webrtc::VideoCaptureCapability cap; | 164 webrtc::VideoCaptureCapability cap; |
162 if (info->GetCapability(vcm_id, i, cap) != -1) { | 165 if (info->GetCapability(vcm_id, i, cap) != -1) { |
163 VideoFormat format; | 166 VideoFormat format; |
164 if (CapabilityToFormat(cap, &format)) { | 167 if (CapabilityToFormat(cap, &format)) { |
165 supported.push_back(format); | 168 supported.push_back(format); |
166 } else { | 169 } else { |
167 LOG(LS_WARNING) << "Ignoring unsupported WebRTC capture format " | 170 LOG(LS_WARNING) << "Ignoring unsupported WebRTC capture format " |
168 << cap.rawType; | 171 << static_cast<int>(cap.videoType); |
169 } | 172 } |
170 } | 173 } |
171 } | 174 } |
172 factory_->DestroyDeviceInfo(info); | 175 factory_->DestroyDeviceInfo(info); |
173 | 176 |
174 if (supported.empty()) { | 177 if (supported.empty()) { |
175 LOG(LS_ERROR) << "Failed to find usable formats for id: " << device.id; | 178 LOG(LS_ERROR) << "Failed to find usable formats for id: " << device.id; |
176 return false; | 179 return false; |
177 } | 180 } |
178 | 181 |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
341 if (1 == captured_frames_) { | 344 if (1 == captured_frames_) { |
342 LOG(LS_INFO) << "Captured frame size " | 345 LOG(LS_INFO) << "Captured frame size " |
343 << sample.width() << "x" << sample.height() | 346 << sample.width() << "x" << sample.height() |
344 << ". Expected format " << GetCaptureFormat()->ToString(); | 347 << ". Expected format " << GetCaptureFormat()->ToString(); |
345 } | 348 } |
346 | 349 |
347 VideoCapturer::OnFrame(sample, sample.width(), sample.height()); | 350 VideoCapturer::OnFrame(sample, sample.width(), sample.height()); |
348 } | 351 } |
349 | 352 |
350 } // namespace cricket | 353 } // namespace cricket |
OLD | NEW |