blob: 3cd1db1c80dfdf44c2df4c651dcf73f77686eecc [file] [log] [blame]
pbos@webrtc.org29d58392013-05-16 12:08:03 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "test/vcm_capturer.h"
pbos@webrtc.org29d58392013-05-16 12:08:03 +000012
Yves Gerey665174f2018-06-19 15:03:05 +020013#include "call/video_send_stream.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "modules/video_capture/video_capture_factory.h"
15#include "rtc_base/logging.h"
pbos@webrtc.org29d58392013-05-16 12:08:03 +000016namespace webrtc {
17namespace test {
18
sprangc5d62e22017-04-02 23:53:04 -070019VcmCapturer::VcmCapturer() : started_(false), sink_(nullptr), vcm_(nullptr) {}
pbos@webrtc.org29d58392013-05-16 12:08:03 +000020
Tarun Chawla8e857d12017-05-31 19:20:57 +053021bool VcmCapturer::Init(size_t width,
22 size_t height,
23 size_t target_fps,
24 size_t capture_device_index) {
sprangc5d62e22017-04-02 23:53:04 -070025 std::unique_ptr<VideoCaptureModule::DeviceInfo> device_info(
26 VideoCaptureFactory::CreateDeviceInfo());
pbos@webrtc.org29d58392013-05-16 12:08:03 +000027
28 char device_name[256];
29 char unique_name[256];
Tarun Chawla8e857d12017-05-31 19:20:57 +053030 if (device_info->GetDeviceName(static_cast<uint32_t>(capture_device_index),
31 device_name, sizeof(device_name), unique_name,
32 sizeof(unique_name)) != 0) {
pbos@webrtc.org29d58392013-05-16 12:08:03 +000033 Destroy();
34 return false;
35 }
36
nisseb29b9c82016-12-12 00:22:56 -080037 vcm_ = webrtc::VideoCaptureFactory::Create(unique_name);
38 vcm_->RegisterCaptureDataCallback(this);
pbos@webrtc.org29d58392013-05-16 12:08:03 +000039
pbos@webrtc.org375deb42013-05-21 09:32:22 +000040 device_info->GetCapability(vcm_->CurrentDeviceName(), 0, capability_);
pbos@webrtc.org29d58392013-05-16 12:08:03 +000041
42 capability_.width = static_cast<int32_t>(width);
43 capability_.height = static_cast<int32_t>(height);
44 capability_.maxFPS = static_cast<int32_t>(target_fps);
nisseeb44b392017-04-28 07:18:05 -070045 capability_.videoType = VideoType::kI420;
pbos@webrtc.org29d58392013-05-16 12:08:03 +000046
pbos@webrtc.org375deb42013-05-21 09:32:22 +000047 if (vcm_->StartCapture(capability_) != 0) {
pbos@webrtc.org29d58392013-05-16 12:08:03 +000048 Destroy();
49 return false;
50 }
51
sprangc5d62e22017-04-02 23:53:04 -070052 RTC_CHECK(vcm_->CaptureStarted());
pbos@webrtc.org29d58392013-05-16 12:08:03 +000053
54 return true;
55}
56
perkja49cbd32016-09-16 07:53:41 -070057VcmCapturer* VcmCapturer::Create(size_t width,
Peter Boström4b91bd02015-06-26 06:58:16 +020058 size_t height,
Tarun Chawla8e857d12017-05-31 19:20:57 +053059 size_t target_fps,
60 size_t capture_device_index) {
sprangc5d62e22017-04-02 23:53:04 -070061 std::unique_ptr<VcmCapturer> vcm_capturer(new VcmCapturer());
Tarun Chawla8e857d12017-05-31 19:20:57 +053062 if (!vcm_capturer->Init(width, height, target_fps, capture_device_index)) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010063 RTC_LOG(LS_WARNING) << "Failed to create VcmCapturer(w = " << width
64 << ", h = " << height << ", fps = " << target_fps
65 << ")";
sprangc5d62e22017-04-02 23:53:04 -070066 return nullptr;
pbos@webrtc.org29d58392013-05-16 12:08:03 +000067 }
sprangc5d62e22017-04-02 23:53:04 -070068 return vcm_capturer.release();
pbos@webrtc.org29d58392013-05-16 12:08:03 +000069}
70
Peter Boström1e737c62015-10-23 14:45:55 +020071void VcmCapturer::Start() {
72 rtc::CritScope lock(&crit_);
73 started_ = true;
74}
pbos@webrtc.org29d58392013-05-16 12:08:03 +000075
Peter Boström1e737c62015-10-23 14:45:55 +020076void VcmCapturer::Stop() {
77 rtc::CritScope lock(&crit_);
78 started_ = false;
79}
pbos@webrtc.org29d58392013-05-16 12:08:03 +000080
perkja49cbd32016-09-16 07:53:41 -070081void VcmCapturer::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
82 const rtc::VideoSinkWants& wants) {
83 rtc::CritScope lock(&crit_);
philipelb5b0b982016-11-08 02:09:52 -080084 RTC_CHECK(!sink_ || sink_ == sink);
perkja49cbd32016-09-16 07:53:41 -070085 sink_ = sink;
Sebastian Janssonf1f363f2018-08-13 14:24:58 +020086 TestVideoCapturer::AddOrUpdateSink(sink, wants);
perkja49cbd32016-09-16 07:53:41 -070087}
88
89void VcmCapturer::RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) {
90 rtc::CritScope lock(&crit_);
91 RTC_CHECK(sink_ == sink);
92 sink_ = nullptr;
93}
94
pbos@webrtc.org29d58392013-05-16 12:08:03 +000095void VcmCapturer::Destroy() {
Peter Boström1d194412016-03-21 16:44:31 +010096 if (!vcm_)
pbos@webrtc.org29d58392013-05-16 12:08:03 +000097 return;
pbos@webrtc.org29d58392013-05-16 12:08:03 +000098
pbos@webrtc.org375deb42013-05-21 09:32:22 +000099 vcm_->StopCapture();
100 vcm_->DeRegisterCaptureDataCallback();
Peter Boström1d194412016-03-21 16:44:31 +0100101 // Release reference to VCM.
102 vcm_ = nullptr;
pbos@webrtc.org29d58392013-05-16 12:08:03 +0000103}
104
Yves Gerey665174f2018-06-19 15:03:05 +0200105VcmCapturer::~VcmCapturer() {
106 Destroy();
107}
pbos@webrtc.org29d58392013-05-16 12:08:03 +0000108
nisseb29b9c82016-12-12 00:22:56 -0800109void VcmCapturer::OnFrame(const VideoFrame& frame) {
Peter Boström1e737c62015-10-23 14:45:55 +0200110 rtc::CritScope lock(&crit_);
sprangc5d62e22017-04-02 23:53:04 -0700111 if (started_ && sink_) {
Danil Chapovalov431abd92018-06-18 12:54:17 +0200112 absl::optional<VideoFrame> out_frame = AdaptFrame(frame);
sprangc5d62e22017-04-02 23:53:04 -0700113 if (out_frame)
114 sink_->OnFrame(*out_frame);
115 }
pbos@webrtc.org29d58392013-05-16 12:08:03 +0000116}
117
Yves Gerey665174f2018-06-19 15:03:05 +0200118} // namespace test
119} // namespace webrtc