pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 1 | /* |
| 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 | |
pbos@webrtc.org | 16e03b7 | 2013-10-28 16:32:01 +0000 | [diff] [blame] | 11 | #include "webrtc/test/frame_generator_capturer.h" |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 12 | |
Peter Boström | f2f8283 | 2015-05-01 13:00:41 +0200 | [diff] [blame] | 13 | #include "webrtc/base/criticalsection.h" |
pbos | 12411ef | 2015-11-23 14:47:56 -0800 | [diff] [blame] | 14 | #include "webrtc/base/platform_thread.h" |
Henrik Kjellander | 98f5351 | 2015-10-28 18:17:40 +0100 | [diff] [blame] | 15 | #include "webrtc/system_wrappers/include/clock.h" |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 16 | #include "webrtc/system_wrappers/include/event_wrapper.h" |
Henrik Kjellander | 98f5351 | 2015-10-28 18:17:40 +0100 | [diff] [blame] | 17 | #include "webrtc/system_wrappers/include/sleep.h" |
pbos | 12411ef | 2015-11-23 14:47:56 -0800 | [diff] [blame] | 18 | #include "webrtc/test/frame_generator.h" |
pbos@webrtc.org | 16e03b7 | 2013-10-28 16:32:01 +0000 | [diff] [blame] | 19 | #include "webrtc/video_send_stream.h" |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 20 | |
| 21 | namespace webrtc { |
| 22 | namespace test { |
| 23 | |
perkj | a8ba195 | 2017-02-27 06:52:10 -0800 | [diff] [blame] | 24 | FrameGeneratorCapturer* FrameGeneratorCapturer::Create(int width, |
| 25 | int height, |
Peter Boström | 4b91bd0 | 2015-06-26 06:58:16 +0200 | [diff] [blame] | 26 | int target_fps, |
| 27 | Clock* clock) { |
andresp@webrtc.org | ab65495 | 2013-09-19 12:14:03 +0000 | [diff] [blame] | 28 | FrameGeneratorCapturer* capturer = new FrameGeneratorCapturer( |
perkj | a8ba195 | 2017-02-27 06:52:10 -0800 | [diff] [blame] | 29 | clock, FrameGenerator::CreateSquareGenerator(width, height), target_fps); |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 30 | if (!capturer->Init()) { |
| 31 | delete capturer; |
| 32 | return NULL; |
| 33 | } |
| 34 | |
| 35 | return capturer; |
| 36 | } |
| 37 | |
andresp@webrtc.org | ab65495 | 2013-09-19 12:14:03 +0000 | [diff] [blame] | 38 | FrameGeneratorCapturer* FrameGeneratorCapturer::CreateFromYuvFile( |
sprang@webrtc.org | 131bea8 | 2015-02-18 12:46:06 +0000 | [diff] [blame] | 39 | const std::string& file_name, |
andresp@webrtc.org | ab65495 | 2013-09-19 12:14:03 +0000 | [diff] [blame] | 40 | size_t width, |
| 41 | size_t height, |
| 42 | int target_fps, |
| 43 | Clock* clock) { |
| 44 | FrameGeneratorCapturer* capturer = new FrameGeneratorCapturer( |
perkj | a49cbd3 | 2016-09-16 07:53:41 -0700 | [diff] [blame] | 45 | clock, FrameGenerator::CreateFromYuvFile( |
| 46 | std::vector<std::string>(1, file_name), width, height, 1), |
andresp@webrtc.org | ab65495 | 2013-09-19 12:14:03 +0000 | [diff] [blame] | 47 | target_fps); |
| 48 | if (!capturer->Init()) { |
| 49 | delete capturer; |
| 50 | return NULL; |
| 51 | } |
| 52 | |
| 53 | return capturer; |
| 54 | } |
| 55 | |
perkj | a8ba195 | 2017-02-27 06:52:10 -0800 | [diff] [blame] | 56 | FrameGeneratorCapturer::FrameGeneratorCapturer( |
| 57 | Clock* clock, |
| 58 | std::unique_ptr<FrameGenerator> frame_generator, |
| 59 | int target_fps) |
perkj | a49cbd3 | 2016-09-16 07:53:41 -0700 | [diff] [blame] | 60 | : clock_(clock), |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 61 | sending_(false), |
perkj | a49cbd3 | 2016-09-16 07:53:41 -0700 | [diff] [blame] | 62 | sink_(nullptr), |
perkj | 803d97f | 2016-11-01 11:45:46 -0700 | [diff] [blame] | 63 | sink_wants_observer_(nullptr), |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 64 | tick_(EventTimerWrapper::Create()), |
| 65 | thread_(FrameGeneratorCapturer::Run, this, "FrameGeneratorCapturer"), |
perkj | a8ba195 | 2017-02-27 06:52:10 -0800 | [diff] [blame] | 66 | frame_generator_(std::move(frame_generator)), |
wu@webrtc.org | cd70119 | 2014-04-24 22:10:24 +0000 | [diff] [blame] | 67 | target_fps_(target_fps), |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 68 | first_frame_capture_time_(-1) { |
perkj | a8ba195 | 2017-02-27 06:52:10 -0800 | [diff] [blame] | 69 | RTC_DCHECK(frame_generator_); |
perkj | a49cbd3 | 2016-09-16 07:53:41 -0700 | [diff] [blame] | 70 | RTC_DCHECK_GT(target_fps, 0); |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 71 | } |
| 72 | |
| 73 | FrameGeneratorCapturer::~FrameGeneratorCapturer() { |
| 74 | Stop(); |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 75 | |
| 76 | thread_.Stop(); |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 77 | } |
| 78 | |
Per | ba7dc72 | 2016-04-19 15:01:23 +0200 | [diff] [blame] | 79 | void FrameGeneratorCapturer::SetFakeRotation(VideoRotation rotation) { |
| 80 | rtc::CritScope cs(&lock_); |
| 81 | fake_rotation_ = rotation; |
| 82 | } |
| 83 | |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 84 | bool FrameGeneratorCapturer::Init() { |
pbos@webrtc.org | 9401524 | 2013-10-16 11:05:37 +0000 | [diff] [blame] | 85 | // This check is added because frame_generator_ might be file based and should |
| 86 | // not crash because a file moved. |
| 87 | if (frame_generator_.get() == NULL) |
| 88 | return false; |
| 89 | |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 90 | if (!tick_->StartTimer(true, 1000 / target_fps_)) |
| 91 | return false; |
| 92 | thread_.Start(); |
| 93 | thread_.SetPriority(rtc::kHighPriority); |
| 94 | return true; |
| 95 | } |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 96 | |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 97 | bool FrameGeneratorCapturer::Run(void* obj) { |
| 98 | static_cast<FrameGeneratorCapturer*>(obj)->InsertFrame(); |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 99 | return true; |
| 100 | } |
| 101 | |
| 102 | void FrameGeneratorCapturer::InsertFrame() { |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 103 | { |
Peter Boström | f2f8283 | 2015-05-01 13:00:41 +0200 | [diff] [blame] | 104 | rtc::CritScope cs(&lock_); |
andresp@webrtc.org | ab65495 | 2013-09-19 12:14:03 +0000 | [diff] [blame] | 105 | if (sending_) { |
Miguel Casas-Sanchez | 4765070 | 2015-05-29 17:21:40 -0700 | [diff] [blame] | 106 | VideoFrame* frame = frame_generator_->NextFrame(); |
perkj@webrtc.org | af612d5 | 2015-03-18 09:51:05 +0000 | [diff] [blame] | 107 | frame->set_ntp_time_ms(clock_->CurrentNtpInMilliseconds()); |
Per | ba7dc72 | 2016-04-19 15:01:23 +0200 | [diff] [blame] | 108 | frame->set_rotation(fake_rotation_); |
wu@webrtc.org | cd70119 | 2014-04-24 22:10:24 +0000 | [diff] [blame] | 109 | if (first_frame_capture_time_ == -1) { |
perkj@webrtc.org | af612d5 | 2015-03-18 09:51:05 +0000 | [diff] [blame] | 110 | first_frame_capture_time_ = frame->ntp_time_ms(); |
wu@webrtc.org | cd70119 | 2014-04-24 22:10:24 +0000 | [diff] [blame] | 111 | } |
perkj | a49cbd3 | 2016-09-16 07:53:41 -0700 | [diff] [blame] | 112 | if (sink_) |
| 113 | sink_->OnFrame(*frame); |
andresp@webrtc.org | ab65495 | 2013-09-19 12:14:03 +0000 | [diff] [blame] | 114 | } |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 115 | } |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 116 | tick_->Wait(WEBRTC_EVENT_INFINITE); |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 117 | } |
| 118 | |
| 119 | void FrameGeneratorCapturer::Start() { |
Peter Boström | f2f8283 | 2015-05-01 13:00:41 +0200 | [diff] [blame] | 120 | rtc::CritScope cs(&lock_); |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 121 | sending_ = true; |
| 122 | } |
| 123 | |
| 124 | void FrameGeneratorCapturer::Stop() { |
Peter Boström | f2f8283 | 2015-05-01 13:00:41 +0200 | [diff] [blame] | 125 | rtc::CritScope cs(&lock_); |
pbos@webrtc.org | 26d1210 | 2013-05-29 13:41:03 +0000 | [diff] [blame] | 126 | sending_ = false; |
| 127 | } |
sprang | 867fb52 | 2015-08-03 04:38:41 -0700 | [diff] [blame] | 128 | |
perkj | fa10b55 | 2016-10-02 23:45:26 -0700 | [diff] [blame] | 129 | void FrameGeneratorCapturer::ChangeResolution(size_t width, size_t height) { |
| 130 | rtc::CritScope cs(&lock_); |
| 131 | frame_generator_->ChangeResolution(width, height); |
| 132 | } |
| 133 | |
perkj | 803d97f | 2016-11-01 11:45:46 -0700 | [diff] [blame] | 134 | void FrameGeneratorCapturer::SetSinkWantsObserver(SinkWantsObserver* observer) { |
| 135 | rtc::CritScope cs(&lock_); |
| 136 | RTC_DCHECK(!sink_wants_observer_); |
| 137 | sink_wants_observer_ = observer; |
| 138 | } |
| 139 | |
perkj | a49cbd3 | 2016-09-16 07:53:41 -0700 | [diff] [blame] | 140 | void FrameGeneratorCapturer::AddOrUpdateSink( |
| 141 | rtc::VideoSinkInterface<VideoFrame>* sink, |
| 142 | const rtc::VideoSinkWants& wants) { |
| 143 | rtc::CritScope cs(&lock_); |
perkj | 803d97f | 2016-11-01 11:45:46 -0700 | [diff] [blame] | 144 | RTC_CHECK(!sink_ || sink_ == sink); |
perkj | a49cbd3 | 2016-09-16 07:53:41 -0700 | [diff] [blame] | 145 | sink_ = sink; |
perkj | 803d97f | 2016-11-01 11:45:46 -0700 | [diff] [blame] | 146 | if (sink_wants_observer_) |
| 147 | sink_wants_observer_->OnSinkWantsChanged(sink, wants); |
perkj | a49cbd3 | 2016-09-16 07:53:41 -0700 | [diff] [blame] | 148 | } |
| 149 | |
| 150 | void FrameGeneratorCapturer::RemoveSink( |
| 151 | rtc::VideoSinkInterface<VideoFrame>* sink) { |
| 152 | rtc::CritScope cs(&lock_); |
| 153 | RTC_CHECK(sink_ == sink); |
| 154 | sink_ = nullptr; |
| 155 | } |
| 156 | |
sprang | 867fb52 | 2015-08-03 04:38:41 -0700 | [diff] [blame] | 157 | void FrameGeneratorCapturer::ForceFrame() { |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 158 | tick_->Set(); |
sprang | 867fb52 | 2015-08-03 04:38:41 -0700 | [diff] [blame] | 159 | } |
ilnik | 2a420ce | 2017-03-16 09:43:44 -0700 | [diff] [blame^] | 160 | } // test |
| 161 | } // webrtc |