blob: e04dbc068ee1fb1d7cf5b063787ad51f8e85e8a1 [file] [log] [blame]
pbos@webrtc.org29d58392013-05-16 12:08:031/*
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 04:47:3111#include "test/vcm_capturer.h"
pbos@webrtc.org29d58392013-05-16 12:08:0312
Mirko Bonadei92ea95e2017-09-15 04:47:3113#include "modules/video_capture/video_capture_factory.h"
14#include "rtc_base/logging.h"
15#include "call/video_send_stream.h"
pbos@webrtc.org29d58392013-05-16 12:08:0316namespace webrtc {
17namespace test {
18
sprangc5d62e22017-04-03 06:53:0419VcmCapturer::VcmCapturer() : started_(false), sink_(nullptr), vcm_(nullptr) {}
pbos@webrtc.org29d58392013-05-16 12:08:0320
Tarun Chawla8e857d12017-05-31 13:50:5721bool VcmCapturer::Init(size_t width,
22 size_t height,
23 size_t target_fps,
24 size_t capture_device_index) {
sprangc5d62e22017-04-03 06:53:0425 std::unique_ptr<VideoCaptureModule::DeviceInfo> device_info(
26 VideoCaptureFactory::CreateDeviceInfo());
pbos@webrtc.org29d58392013-05-16 12:08:0327
28 char device_name[256];
29 char unique_name[256];
Tarun Chawla8e857d12017-05-31 13:50:5730 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:0333 Destroy();
34 return false;
35 }
36
nisseb29b9c82016-12-12 08:22:5637 vcm_ = webrtc::VideoCaptureFactory::Create(unique_name);
38 vcm_->RegisterCaptureDataCallback(this);
pbos@webrtc.org29d58392013-05-16 12:08:0339
pbos@webrtc.org375deb42013-05-21 09:32:2240 device_info->GetCapability(vcm_->CurrentDeviceName(), 0, capability_);
pbos@webrtc.org29d58392013-05-16 12:08:0341
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 14:18:0545 capability_.videoType = VideoType::kI420;
pbos@webrtc.org29d58392013-05-16 12:08:0346
pbos@webrtc.org375deb42013-05-21 09:32:2247 if (vcm_->StartCapture(capability_) != 0) {
pbos@webrtc.org29d58392013-05-16 12:08:0348 Destroy();
49 return false;
50 }
51
sprangc5d62e22017-04-03 06:53:0452 RTC_CHECK(vcm_->CaptureStarted());
pbos@webrtc.org29d58392013-05-16 12:08:0353
54 return true;
55}
56
perkja49cbd32016-09-16 14:53:4157VcmCapturer* VcmCapturer::Create(size_t width,
Peter Boström4b91bd02015-06-26 04:58:1658 size_t height,
Tarun Chawla8e857d12017-05-31 13:50:5759 size_t target_fps,
60 size_t capture_device_index) {
sprangc5d62e22017-04-03 06:53:0461 std::unique_ptr<VcmCapturer> vcm_capturer(new VcmCapturer());
Tarun Chawla8e857d12017-05-31 13:50:5762 if (!vcm_capturer->Init(width, height, target_fps, capture_device_index)) {
sprangc5d62e22017-04-03 06:53:0463 LOG(LS_WARNING) << "Failed to create VcmCapturer(w = " << width
64 << ", h = " << height << ", fps = " << target_fps << ")";
65 return nullptr;
pbos@webrtc.org29d58392013-05-16 12:08:0366 }
sprangc5d62e22017-04-03 06:53:0467 return vcm_capturer.release();
pbos@webrtc.org29d58392013-05-16 12:08:0368}
69
70
Peter Boström1e737c62015-10-23 12:45:5571void VcmCapturer::Start() {
72 rtc::CritScope lock(&crit_);
73 started_ = true;
74}
pbos@webrtc.org29d58392013-05-16 12:08:0375
Peter Boström1e737c62015-10-23 12:45:5576void VcmCapturer::Stop() {
77 rtc::CritScope lock(&crit_);
78 started_ = false;
79}
pbos@webrtc.org29d58392013-05-16 12:08:0380
perkja49cbd32016-09-16 14:53:4181void VcmCapturer::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
82 const rtc::VideoSinkWants& wants) {
83 rtc::CritScope lock(&crit_);
philipelb5b0b982016-11-08 10:09:5284 RTC_CHECK(!sink_ || sink_ == sink);
perkja49cbd32016-09-16 14:53:4185 sink_ = sink;
sprangc5d62e22017-04-03 06:53:0486 VideoCapturer::AddOrUpdateSink(sink, wants);
perkja49cbd32016-09-16 14:53:4187}
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:0395void VcmCapturer::Destroy() {
Peter Boström1d194412016-03-21 15:44:3196 if (!vcm_)
pbos@webrtc.org29d58392013-05-16 12:08:0397 return;
pbos@webrtc.org29d58392013-05-16 12:08:0398
pbos@webrtc.org375deb42013-05-21 09:32:2299 vcm_->StopCapture();
100 vcm_->DeRegisterCaptureDataCallback();
Peter Boström1d194412016-03-21 15:44:31101 // Release reference to VCM.
102 vcm_ = nullptr;
pbos@webrtc.org29d58392013-05-16 12:08:03103}
104
105VcmCapturer::~VcmCapturer() { Destroy(); }
106
nisseb29b9c82016-12-12 08:22:56107void VcmCapturer::OnFrame(const VideoFrame& frame) {
Peter Boström1e737c62015-10-23 12:45:55108 rtc::CritScope lock(&crit_);
sprangc5d62e22017-04-03 06:53:04109 if (started_ && sink_) {
110 rtc::Optional<VideoFrame> out_frame = AdaptFrame(frame);
111 if (out_frame)
112 sink_->OnFrame(*out_frame);
113 }
pbos@webrtc.org29d58392013-05-16 12:08:03114}
115
pbos@webrtc.org29d58392013-05-16 12:08:03116} // test
117} // webrtc