| 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 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 { FOURCC_NV12, webrtc::kVideoNV12 }, // 12 bpp, fast conversion. | 40 { FOURCC_NV12, webrtc::kVideoNV12 }, // 12 bpp, fast conversion. |
| 41 { FOURCC_NV21, webrtc::kVideoNV21 }, // 12 bpp, fast conversion. | 41 { FOURCC_NV21, webrtc::kVideoNV21 }, // 12 bpp, fast conversion. |
| 42 { FOURCC_MJPG, webrtc::kVideoMJPEG }, // compressed, slow conversion. | 42 { FOURCC_MJPG, webrtc::kVideoMJPEG }, // compressed, slow conversion. |
| 43 { FOURCC_ARGB, webrtc::kVideoARGB }, // 32 bpp, slow conversion. | 43 { FOURCC_ARGB, webrtc::kVideoARGB }, // 32 bpp, slow conversion. |
| 44 { FOURCC_24BG, webrtc::kVideoRGB24 }, // 24 bpp, slow conversion. | 44 { FOURCC_24BG, webrtc::kVideoRGB24 }, // 24 bpp, slow conversion. |
| 45 }; | 45 }; |
| 46 | 46 |
| 47 class WebRtcVcmFactory : public WebRtcVcmFactoryInterface { | 47 class WebRtcVcmFactory : public WebRtcVcmFactoryInterface { |
| 48 public: | 48 public: |
| 49 virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create( | 49 virtual rtc::scoped_refptr<webrtc::VideoCaptureModule> Create( |
| 50 int id, | |
| 51 const char* device) { | 50 const char* device) { |
| 52 return webrtc::VideoCaptureFactory::Create(id, device); | 51 return webrtc::VideoCaptureFactory::Create(device); |
| 53 } | 52 } |
| 54 virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo(int id) { | 53 virtual webrtc::VideoCaptureModule::DeviceInfo* CreateDeviceInfo() { |
| 55 return webrtc::VideoCaptureFactory::CreateDeviceInfo(id); | 54 return webrtc::VideoCaptureFactory::CreateDeviceInfo(); |
| 56 } | 55 } |
| 57 virtual void DestroyDeviceInfo(webrtc::VideoCaptureModule::DeviceInfo* info) { | 56 virtual void DestroyDeviceInfo(webrtc::VideoCaptureModule::DeviceInfo* info) { |
| 58 delete info; | 57 delete info; |
| 59 } | 58 } |
| 60 }; | 59 }; |
| 61 | 60 |
| 62 static bool CapabilityToFormat(const webrtc::VideoCaptureCapability& cap, | 61 static bool CapabilityToFormat(const webrtc::VideoCaptureCapability& cap, |
| 63 VideoFormat* format) { | 62 VideoFormat* format) { |
| 64 uint32_t fourcc = 0; | 63 uint32_t fourcc = 0; |
| 65 for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) { | 64 for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) { |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 | 121 |
| 123 WebRtcVideoCapturer::~WebRtcVideoCapturer() {} | 122 WebRtcVideoCapturer::~WebRtcVideoCapturer() {} |
| 124 | 123 |
| 125 bool WebRtcVideoCapturer::Init(const Device& device) { | 124 bool WebRtcVideoCapturer::Init(const Device& device) { |
| 126 RTC_DCHECK(!start_thread_); | 125 RTC_DCHECK(!start_thread_); |
| 127 if (module_) { | 126 if (module_) { |
| 128 LOG(LS_ERROR) << "The capturer is already initialized"; | 127 LOG(LS_ERROR) << "The capturer is already initialized"; |
| 129 return false; | 128 return false; |
| 130 } | 129 } |
| 131 | 130 |
| 132 webrtc::VideoCaptureModule::DeviceInfo* info = factory_->CreateDeviceInfo(0); | 131 webrtc::VideoCaptureModule::DeviceInfo* info = factory_->CreateDeviceInfo(); |
| 133 if (!info) { | 132 if (!info) { |
| 134 return false; | 133 return false; |
| 135 } | 134 } |
| 136 | 135 |
| 137 // Find the desired camera, by name. | 136 // Find the desired camera, by name. |
| 138 // In the future, comparing IDs will be more robust. | 137 // In the future, comparing IDs will be more robust. |
| 139 // TODO(juberti): Figure what's needed to allow this. | 138 // TODO(juberti): Figure what's needed to allow this. |
| 140 int num_cams = info->NumberOfDevices(); | 139 int num_cams = info->NumberOfDevices(); |
| 141 char vcm_id[256] = ""; | 140 char vcm_id[256] = ""; |
| 142 bool found = false; | 141 bool found = false; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 172 } | 171 } |
| 173 } | 172 } |
| 174 } | 173 } |
| 175 factory_->DestroyDeviceInfo(info); | 174 factory_->DestroyDeviceInfo(info); |
| 176 | 175 |
| 177 if (supported.empty()) { | 176 if (supported.empty()) { |
| 178 LOG(LS_ERROR) << "Failed to find usable formats for id: " << device.id; | 177 LOG(LS_ERROR) << "Failed to find usable formats for id: " << device.id; |
| 179 return false; | 178 return false; |
| 180 } | 179 } |
| 181 | 180 |
| 182 module_ = factory_->Create(0, vcm_id); | 181 module_ = factory_->Create(vcm_id); |
| 183 if (!module_) { | 182 if (!module_) { |
| 184 LOG(LS_ERROR) << "Failed to create capturer for id: " << device.id; | 183 LOG(LS_ERROR) << "Failed to create capturer for id: " << device.id; |
| 185 return false; | 184 return false; |
| 186 } | 185 } |
| 187 | 186 |
| 188 // It is safe to change member attributes now. | 187 // It is safe to change member attributes now. |
| 189 SetId(device.id); | 188 SetId(device.id); |
| 190 SetSupportedFormats(supported); | 189 SetSupportedFormats(supported); |
| 191 | 190 |
| 192 return true; | 191 return true; |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 266 | 265 |
| 267 SetCaptureFormat(&capture_format); | 266 SetCaptureFormat(&capture_format); |
| 268 | 267 |
| 269 webrtc::VideoCaptureCapability cap; | 268 webrtc::VideoCaptureCapability cap; |
| 270 if (!FormatToCapability(capture_format, &cap)) { | 269 if (!FormatToCapability(capture_format, &cap)) { |
| 271 LOG(LS_ERROR) << "Invalid capture format specified"; | 270 LOG(LS_ERROR) << "Invalid capture format specified"; |
| 272 return CS_FAILED; | 271 return CS_FAILED; |
| 273 } | 272 } |
| 274 | 273 |
| 275 int64_t start = rtc::TimeMillis(); | 274 int64_t start = rtc::TimeMillis(); |
| 276 module_->RegisterCaptureDataCallback(*this); | 275 module_->RegisterCaptureDataCallback(this); |
| 277 if (module_->StartCapture(cap) != 0) { | 276 if (module_->StartCapture(cap) != 0) { |
| 278 LOG(LS_ERROR) << "Camera '" << GetId() << "' failed to start"; | 277 LOG(LS_ERROR) << "Camera '" << GetId() << "' failed to start"; |
| 279 module_->DeRegisterCaptureDataCallback(); | 278 module_->DeRegisterCaptureDataCallback(); |
| 280 async_invoker_.reset(); | 279 async_invoker_.reset(); |
| 281 SetCaptureFormat(nullptr); | 280 SetCaptureFormat(nullptr); |
| 282 start_thread_ = nullptr; | 281 start_thread_ = nullptr; |
| 283 return CS_FAILED; | 282 return CS_FAILED; |
| 284 } | 283 } |
| 285 | 284 |
| 286 LOG(LS_INFO) << "Camera '" << GetId() << "' started with format " | 285 LOG(LS_INFO) << "Camera '" << GetId() << "' started with format " |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 return false; | 329 return false; |
| 331 } | 330 } |
| 332 | 331 |
| 333 fourccs->clear(); | 332 fourccs->clear(); |
| 334 for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) { | 333 for (size_t i = 0; i < arraysize(kSupportedFourCCs); ++i) { |
| 335 fourccs->push_back(kSupportedFourCCs[i].fourcc); | 334 fourccs->push_back(kSupportedFourCCs[i].fourcc); |
| 336 } | 335 } |
| 337 return true; | 336 return true; |
| 338 } | 337 } |
| 339 | 338 |
| 340 void WebRtcVideoCapturer::OnIncomingCapturedFrame( | 339 void WebRtcVideoCapturer::OnFrame( |
| 341 const int32_t id, | |
| 342 const webrtc::VideoFrame& sample) { | 340 const webrtc::VideoFrame& sample) { |
| 343 // This can only happen between Start() and Stop(). | 341 // This can only happen between Start() and Stop(). |
| 344 RTC_DCHECK(start_thread_); | 342 RTC_DCHECK(start_thread_); |
| 345 RTC_DCHECK(async_invoker_); | 343 RTC_DCHECK(async_invoker_); |
| 346 | 344 |
| 347 ++captured_frames_; | 345 ++captured_frames_; |
| 348 // Log the size and pixel aspect ratio of the first captured frame. | 346 // Log the size and pixel aspect ratio of the first captured frame. |
| 349 if (1 == captured_frames_) { | 347 if (1 == captured_frames_) { |
| 350 LOG(LS_INFO) << "Captured frame size " | 348 LOG(LS_INFO) << "Captured frame size " |
| 351 << sample.width() << "x" << sample.height() | 349 << sample.width() << "x" << sample.height() |
| 352 << ". Expected format " << GetCaptureFormat()->ToString(); | 350 << ". Expected format " << GetCaptureFormat()->ToString(); |
| 353 } | 351 } |
| 354 | 352 |
| 355 OnFrame(sample, sample.width(), sample.height()); | 353 VideoCapturer::OnFrame(sample, sample.width(), sample.height()); |
| 356 } | |
| 357 | |
| 358 void WebRtcVideoCapturer::OnCaptureDelayChanged(const int32_t id, | |
| 359 const int32_t delay) { | |
| 360 LOG(LS_INFO) << "Capture delay changed to " << delay << " ms"; | |
| 361 } | 354 } |
| 362 | 355 |
| 363 } // namespace cricket | 356 } // namespace cricket |
| OLD | NEW |