Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Side by Side Diff: webrtc/call/call_perf_tests.cc

Issue 2998923002: Use SingleThreadedTaskQueue in DirectTransport (Closed)
Patch Set: . Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2013 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 <algorithm> 11 #include <algorithm>
12 #include <limits> 12 #include <limits>
13 #include <memory> 13 #include <memory>
14 #include <string> 14 #include <string>
15 15
16 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h" 16 #include "webrtc/api/audio_codecs/builtin_audio_encoder_factory.h"
17 #include "webrtc/call/call.h" 17 #include "webrtc/call/call.h"
18 #include "webrtc/config.h" 18 #include "webrtc/config.h"
19 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" 19 #include "webrtc/logging/rtc_event_log/rtc_event_log.h"
20 #include "webrtc/modules/audio_coding/include/audio_coding_module.h" 20 #include "webrtc/modules/audio_coding/include/audio_coding_module.h"
21 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h" 21 #include "webrtc/modules/audio_mixer/audio_mixer_impl.h"
22 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" 22 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
23 #include "webrtc/rtc_base/checks.h" 23 #include "webrtc/rtc_base/checks.h"
24 #include "webrtc/rtc_base/constructormagic.h" 24 #include "webrtc/rtc_base/ptr_util.h"
25 #include "webrtc/rtc_base/thread_annotations.h" 25 #include "webrtc/rtc_base/thread_annotations.h"
26 #include "webrtc/system_wrappers/include/metrics_default.h" 26 #include "webrtc/system_wrappers/include/metrics_default.h"
27 #include "webrtc/test/call_test.h" 27 #include "webrtc/test/call_test.h"
28 #include "webrtc/test/direct_transport.h" 28 #include "webrtc/test/direct_transport.h"
29 #include "webrtc/test/drifting_clock.h" 29 #include "webrtc/test/drifting_clock.h"
30 #include "webrtc/test/encoder_settings.h" 30 #include "webrtc/test/encoder_settings.h"
31 #include "webrtc/test/fake_audio_device.h" 31 #include "webrtc/test/fake_audio_device.h"
32 #include "webrtc/test/fake_encoder.h" 32 #include "webrtc/test/fake_encoder.h"
33 #include "webrtc/test/field_trial.h" 33 #include "webrtc/test/field_trial.h"
34 #include "webrtc/test/frame_generator.h" 34 #include "webrtc/test/frame_generator.h"
35 #include "webrtc/test/frame_generator_capturer.h" 35 #include "webrtc/test/frame_generator_capturer.h"
36 #include "webrtc/test/gtest.h" 36 #include "webrtc/test/gtest.h"
37 #include "webrtc/test/rtp_rtcp_observer.h" 37 #include "webrtc/test/rtp_rtcp_observer.h"
38 #include "webrtc/test/single_threaded_task_queue.h"
38 #include "webrtc/test/testsupport/fileutils.h" 39 #include "webrtc/test/testsupport/fileutils.h"
39 #include "webrtc/test/testsupport/perf_test.h" 40 #include "webrtc/test/testsupport/perf_test.h"
40 #include "webrtc/video/transport_adapter.h" 41 #include "webrtc/video/transport_adapter.h"
41 #include "webrtc/voice_engine/include/voe_base.h" 42 #include "webrtc/voice_engine/include/voe_base.h"
42 43
43 using webrtc::test::DriftingClock; 44 using webrtc::test::DriftingClock;
44 using webrtc::test::FakeAudioDevice; 45 using webrtc::test::FakeAudioDevice;
45 46
46 namespace webrtc { 47 namespace webrtc {
47 48
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
136 137
137 void CallPerfTest::TestAudioVideoSync(FecMode fec, 138 void CallPerfTest::TestAudioVideoSync(FecMode fec,
138 CreateOrder create_first, 139 CreateOrder create_first,
139 float video_ntp_speed, 140 float video_ntp_speed,
140 float video_rtp_speed, 141 float video_rtp_speed,
141 float audio_rtp_speed) { 142 float audio_rtp_speed) {
142 const char* kSyncGroup = "av_sync"; 143 const char* kSyncGroup = "av_sync";
143 const uint32_t kAudioSendSsrc = 1234; 144 const uint32_t kAudioSendSsrc = 1234;
144 const uint32_t kAudioRecvSsrc = 5678; 145 const uint32_t kAudioRecvSsrc = 5678;
145 146
146 metrics::Reset(); 147 int send_channel_id;
147 rtc::scoped_refptr<AudioProcessing> audio_processing = 148 int recv_channel_id;
148 AudioProcessing::Create();
149 VoiceEngine* voice_engine = VoiceEngine::Create();
150 VoEBase* voe_base = VoEBase::GetInterface(voice_engine);
151 FakeAudioDevice fake_audio_device(
152 FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000),
153 FakeAudioDevice::CreateDiscardRenderer(48000), audio_rtp_speed);
154 EXPECT_EQ(0, voe_base->Init(&fake_audio_device, audio_processing.get(),
155 decoder_factory_));
156 VoEBase::ChannelConfig config;
157 config.enable_voice_pacing = true;
158 int send_channel_id = voe_base->CreateChannel(config);
159 int recv_channel_id = voe_base->CreateChannel();
160
161 AudioState::Config send_audio_state_config;
162 send_audio_state_config.voice_engine = voice_engine;
163 send_audio_state_config.audio_mixer = AudioMixerImpl::Create();
164 send_audio_state_config.audio_processing = audio_processing;
165 Call::Config sender_config(event_log_.get());
166
167 sender_config.audio_state = AudioState::Create(send_audio_state_config);
168 Call::Config receiver_config(event_log_.get());
169 receiver_config.audio_state = sender_config.audio_state;
170 CreateCalls(sender_config, receiver_config);
171
172
173 VideoRtcpAndSyncObserver observer(Clock::GetRealTimeClock());
174 149
175 FakeNetworkPipe::Config audio_net_config; 150 FakeNetworkPipe::Config audio_net_config;
176 audio_net_config.queue_delay_ms = 500; 151 audio_net_config.queue_delay_ms = 500;
177 audio_net_config.loss_percent = 5; 152 audio_net_config.loss_percent = 5;
178 153
154 rtc::scoped_refptr<AudioProcessing> audio_processing;
155 VoiceEngine* voice_engine;
156 VoEBase* voe_base;
157 std::unique_ptr<FakeAudioDevice> fake_audio_device;
158 VideoRtcpAndSyncObserver observer(Clock::GetRealTimeClock());
159
179 std::map<uint8_t, MediaType> audio_pt_map; 160 std::map<uint8_t, MediaType> audio_pt_map;
180 std::map<uint8_t, MediaType> video_pt_map; 161 std::map<uint8_t, MediaType> video_pt_map;
181 std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_),
182 std::inserter(audio_pt_map, audio_pt_map.end()),
183 [](const std::pair<const uint8_t, MediaType>& pair) {
184 return pair.second == MediaType::AUDIO;
185 });
186 std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_),
187 std::inserter(video_pt_map, video_pt_map.end()),
188 [](const std::pair<const uint8_t, MediaType>& pair) {
189 return pair.second == MediaType::VIDEO;
190 });
191 162
192 test::PacketTransport audio_send_transport(sender_call_.get(), &observer, 163 std::unique_ptr<test::PacketTransport> audio_send_transport;
193 test::PacketTransport::kSender, 164 std::unique_ptr<test::PacketTransport> video_send_transport;
194 audio_pt_map, audio_net_config); 165 std::unique_ptr<test::PacketTransport> receive_transport;
195 audio_send_transport.SetReceiver(receiver_call_->Receiver());
196 166
197 test::PacketTransport video_send_transport( 167 AudioSendStream* audio_send_stream;
198 sender_call_.get(), &observer, test::PacketTransport::kSender, 168 AudioReceiveStream* audio_receive_stream;
199 video_pt_map, FakeNetworkPipe::Config()); 169 std::unique_ptr<DriftingClock> drifting_clock;
200 video_send_transport.SetReceiver(receiver_call_->Receiver());
201 170
202 test::PacketTransport receive_transport( 171 task_queue_.SendTask([&]() {
nisse-webrtc 2017/08/18 11:08:29 Check what coding style says about capture-everyth
eladalon 2017/08/18 12:12:37 * When there weren't too many objects to capture,
203 receiver_call_.get(), &observer, test::PacketTransport::kReceiver, 172 metrics::Reset();
204 payload_type_map_, FakeNetworkPipe::Config()); 173 audio_processing = AudioProcessing::Create();
205 receive_transport.SetReceiver(sender_call_->Receiver()); 174 voice_engine = VoiceEngine::Create();
175 voe_base = VoEBase::GetInterface(voice_engine);
176 fake_audio_device = rtc::MakeUnique<FakeAudioDevice>(
177 FakeAudioDevice::CreatePulsedNoiseCapturer(256, 48000),
178 FakeAudioDevice::CreateDiscardRenderer(48000), audio_rtp_speed);
179 EXPECT_EQ(0, voe_base->Init(fake_audio_device.get(), audio_processing.get(),
180 decoder_factory_));
181 VoEBase::ChannelConfig config;
182 config.enable_voice_pacing = true;
183 send_channel_id = voe_base->CreateChannel(config);
184 recv_channel_id = voe_base->CreateChannel();
206 185
207 CreateSendConfig(1, 0, 0, &video_send_transport); 186 AudioState::Config send_audio_state_config;
208 CreateMatchingReceiveConfigs(&receive_transport); 187 send_audio_state_config.voice_engine = voice_engine;
188 send_audio_state_config.audio_mixer = AudioMixerImpl::Create();
189 send_audio_state_config.audio_processing = audio_processing;
190 Call::Config sender_config(event_log_.get());
209 191
210 AudioSendStream::Config audio_send_config(&audio_send_transport); 192 sender_config.audio_state = AudioState::Create(send_audio_state_config);
211 audio_send_config.voe_channel_id = send_channel_id; 193 Call::Config receiver_config(event_log_.get());
212 audio_send_config.rtp.ssrc = kAudioSendSsrc; 194 receiver_config.audio_state = sender_config.audio_state;
213 audio_send_config.send_codec_spec = 195 CreateCalls(sender_config, receiver_config);
214 rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
215 {kAudioSendPayloadType, {"ISAC", 16000, 1}});
216 audio_send_config.encoder_factory = CreateBuiltinAudioEncoderFactory();
217 AudioSendStream* audio_send_stream =
218 sender_call_->CreateAudioSendStream(audio_send_config);
219 196
220 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs; 197 std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_),
221 if (fec == FecMode::kOn) { 198 std::inserter(audio_pt_map, audio_pt_map.end()),
222 video_send_config_.rtp.ulpfec.red_payload_type = kRedPayloadType; 199 [](const std::pair<const uint8_t, MediaType>& pair) {
223 video_send_config_.rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType; 200 return pair.second == MediaType::AUDIO;
224 video_receive_configs_[0].rtp.ulpfec.red_payload_type = kRedPayloadType; 201 });
225 video_receive_configs_[0].rtp.ulpfec.ulpfec_payload_type = 202 std::copy_if(std::begin(payload_type_map_), std::end(payload_type_map_),
226 kUlpfecPayloadType; 203 std::inserter(video_pt_map, video_pt_map.end()),
227 } 204 [](const std::pair<const uint8_t, MediaType>& pair) {
228 video_receive_configs_[0].rtp.nack.rtp_history_ms = 1000; 205 return pair.second == MediaType::VIDEO;
229 video_receive_configs_[0].renderer = &observer; 206 });
230 video_receive_configs_[0].sync_group = kSyncGroup;
231 207
232 AudioReceiveStream::Config audio_recv_config; 208 audio_send_transport = rtc::MakeUnique<test::PacketTransport>(
233 audio_recv_config.rtp.remote_ssrc = kAudioSendSsrc; 209 &task_queue_, sender_call_.get(), &observer,
234 audio_recv_config.rtp.local_ssrc = kAudioRecvSsrc; 210 test::PacketTransport::kSender, audio_pt_map, audio_net_config);
235 audio_recv_config.voe_channel_id = recv_channel_id; 211 audio_send_transport->SetReceiver(receiver_call_->Receiver());
236 audio_recv_config.sync_group = kSyncGroup;
237 audio_recv_config.decoder_factory = decoder_factory_;
238 audio_recv_config.decoder_map = {{kAudioSendPayloadType, {"ISAC", 16000, 1}}};
239 212
240 AudioReceiveStream* audio_receive_stream; 213 video_send_transport = rtc::MakeUnique<test::PacketTransport>(
214 &task_queue_, sender_call_.get(), &observer,
215 test::PacketTransport::kSender, video_pt_map,
216 FakeNetworkPipe::Config());
217 video_send_transport->SetReceiver(receiver_call_->Receiver());
241 218
242 if (create_first == CreateOrder::kAudioFirst) { 219 receive_transport = rtc::MakeUnique<test::PacketTransport>(
243 audio_receive_stream = 220 &task_queue_, receiver_call_.get(), &observer,
244 receiver_call_->CreateAudioReceiveStream(audio_recv_config); 221 test::PacketTransport::kReceiver, payload_type_map_,
245 CreateVideoStreams(); 222 FakeNetworkPipe::Config());
246 } else { 223 receive_transport->SetReceiver(sender_call_->Receiver());
247 CreateVideoStreams();
248 audio_receive_stream =
249 receiver_call_->CreateAudioReceiveStream(audio_recv_config);
250 }
251 EXPECT_EQ(1u, video_receive_streams_.size());
252 observer.set_receive_stream(video_receive_streams_[0]);
253 DriftingClock drifting_clock(clock_, video_ntp_speed);
254 CreateFrameGeneratorCapturerWithDrift(&drifting_clock, video_rtp_speed,
255 kDefaultFramerate, kDefaultWidth,
256 kDefaultHeight);
257 224
258 Start(); 225 CreateSendConfig(1, 0, 0, video_send_transport.get());
226 CreateMatchingReceiveConfigs(receive_transport.get());
259 227
260 audio_send_stream->Start(); 228 AudioSendStream::Config audio_send_config(audio_send_transport.get());
261 audio_receive_stream->Start(); 229 audio_send_config.voe_channel_id = send_channel_id;
230 audio_send_config.rtp.ssrc = kAudioSendSsrc;
231 audio_send_config.send_codec_spec =
232 rtc::Optional<AudioSendStream::Config::SendCodecSpec>(
233 {kAudioSendPayloadType, {"ISAC", 16000, 1}});
234 audio_send_config.encoder_factory = CreateBuiltinAudioEncoderFactory();
235 audio_send_stream = sender_call_->CreateAudioSendStream(audio_send_config);
236
237 video_send_config_.rtp.nack.rtp_history_ms = kNackRtpHistoryMs;
238 if (fec == FecMode::kOn) {
239 video_send_config_.rtp.ulpfec.red_payload_type = kRedPayloadType;
240 video_send_config_.rtp.ulpfec.ulpfec_payload_type = kUlpfecPayloadType;
241 video_receive_configs_[0].rtp.ulpfec.red_payload_type = kRedPayloadType;
242 video_receive_configs_[0].rtp.ulpfec.ulpfec_payload_type =
243 kUlpfecPayloadType;
244 }
245 video_receive_configs_[0].rtp.nack.rtp_history_ms = 1000;
246 video_receive_configs_[0].renderer = &observer;
247 video_receive_configs_[0].sync_group = kSyncGroup;
248
249 AudioReceiveStream::Config audio_recv_config;
250 audio_recv_config.rtp.remote_ssrc = kAudioSendSsrc;
251 audio_recv_config.rtp.local_ssrc = kAudioRecvSsrc;
252 audio_recv_config.voe_channel_id = recv_channel_id;
253 audio_recv_config.sync_group = kSyncGroup;
254 audio_recv_config.decoder_factory = decoder_factory_;
255 audio_recv_config.decoder_map = {
256 {kAudioSendPayloadType, {"ISAC", 16000, 1}}};
257
258 if (create_first == CreateOrder::kAudioFirst) {
259 audio_receive_stream =
260 receiver_call_->CreateAudioReceiveStream(audio_recv_config);
261 CreateVideoStreams();
262 } else {
263 CreateVideoStreams();
264 audio_receive_stream =
265 receiver_call_->CreateAudioReceiveStream(audio_recv_config);
266 }
267 EXPECT_EQ(1u, video_receive_streams_.size());
268 observer.set_receive_stream(video_receive_streams_[0]);
269 drifting_clock = rtc::MakeUnique<DriftingClock>(clock_, video_ntp_speed);
270 CreateFrameGeneratorCapturerWithDrift(drifting_clock.get(), video_rtp_speed,
271 kDefaultFramerate, kDefaultWidth,
272 kDefaultHeight);
273
274 Start();
275
276 audio_send_stream->Start();
277 audio_receive_stream->Start();
278 });
262 279
263 EXPECT_TRUE(observer.Wait()) 280 EXPECT_TRUE(observer.Wait())
264 << "Timed out while waiting for audio and video to be synchronized."; 281 << "Timed out while waiting for audio and video to be synchronized.";
265 282
266 audio_send_stream->Stop(); 283 task_queue_.SendTask([&]() {
267 audio_receive_stream->Stop(); 284 audio_send_stream->Stop();
285 audio_receive_stream->Stop();
268 286
269 Stop(); 287 Stop();
270 video_send_transport.StopSending();
271 audio_send_transport.StopSending();
272 receive_transport.StopSending();
273 288
274 DestroyStreams(); 289 DestroyStreams();
275 290
276 sender_call_->DestroyAudioSendStream(audio_send_stream); 291 video_send_transport.reset();
277 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream); 292 audio_send_transport.reset();
293 receive_transport.reset();
278 294
279 voe_base->DeleteChannel(send_channel_id); 295 sender_call_->DestroyAudioSendStream(audio_send_stream);
280 voe_base->DeleteChannel(recv_channel_id); 296 receiver_call_->DestroyAudioReceiveStream(audio_receive_stream);
281 voe_base->Release();
282 297
283 DestroyCalls(); 298 voe_base->DeleteChannel(send_channel_id);
299 voe_base->DeleteChannel(recv_channel_id);
300 voe_base->Release();
284 301
285 VoiceEngine::Delete(voice_engine); 302 DestroyCalls();
303
304 VoiceEngine::Delete(voice_engine);
305
306 fake_audio_device.reset();
307 });
286 308
287 observer.PrintResults(); 309 observer.PrintResults();
288 310
289 // In quick test synchronization may not be achieved in time. 311 // In quick test synchronization may not be achieved in time.
290 if (!field_trial::IsEnabled("WebRTC-QuickPerfTest")) { 312 if (!field_trial::IsEnabled("WebRTC-QuickPerfTest")) {
291 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AVSyncOffsetInMs")); 313 EXPECT_EQ(1, metrics::NumSamples("WebRTC.Video.AVSyncOffsetInMs"));
292 } 314 }
293 } 315 }
294 316
295 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoNtpDrift) { 317 TEST_F(CallPerfTest, PlaysOutAudioAndVideoInSyncWithVideoNtpDrift) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
328 clock_(Clock::GetRealTimeClock()), 350 clock_(Clock::GetRealTimeClock()),
329 threshold_ms_(threshold_ms), 351 threshold_ms_(threshold_ms),
330 start_time_ms_(start_time_ms), 352 start_time_ms_(start_time_ms),
331 run_time_ms_(run_time_ms), 353 run_time_ms_(run_time_ms),
332 creation_time_ms_(clock_->TimeInMilliseconds()), 354 creation_time_ms_(clock_->TimeInMilliseconds()),
333 capturer_(nullptr), 355 capturer_(nullptr),
334 rtp_start_timestamp_set_(false), 356 rtp_start_timestamp_set_(false),
335 rtp_start_timestamp_(0) {} 357 rtp_start_timestamp_(0) {}
336 358
337 private: 359 private:
338 test::PacketTransport* CreateSendTransport(Call* sender_call) override { 360 test::PacketTransport* CreateSendTransport(
339 return new test::PacketTransport(sender_call, this, 361 test::SingleThreadedTaskQueueForTesting* task_queue,
362 Call* sender_call) override {
363 return new test::PacketTransport(task_queue, sender_call, this,
340 test::PacketTransport::kSender, 364 test::PacketTransport::kSender,
341 payload_type_map_, net_config_); 365 payload_type_map_, net_config_);
342 } 366 }
343 367
344 test::PacketTransport* CreateReceiveTransport() override { 368 test::PacketTransport* CreateReceiveTransport(
345 return new test::PacketTransport(nullptr, this, 369 test::SingleThreadedTaskQueueForTesting* task_queue) override {
370 return new test::PacketTransport(task_queue, nullptr, this,
346 test::PacketTransport::kReceiver, 371 test::PacketTransport::kReceiver,
347 payload_type_map_, net_config_); 372 payload_type_map_, net_config_);
348 } 373 }
349 374
350 void OnFrame(const VideoFrame& video_frame) override { 375 void OnFrame(const VideoFrame& video_frame) override {
351 rtc::CritScope lock(&crit_); 376 rtc::CritScope lock(&crit_);
352 if (video_frame.ntp_time_ms() <= 0) { 377 if (video_frame.ntp_time_ms() <= 0) {
353 // Haven't got enough RTCP SR in order to calculate the capture ntp 378 // Haven't got enough RTCP SR in order to calculate the capture ntp
354 // time. 379 // time.
355 return; 380 return;
(...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after
754 uint32_t last_set_bitrate_kbps_; 779 uint32_t last_set_bitrate_kbps_;
755 VideoSendStream* send_stream_; 780 VideoSendStream* send_stream_;
756 test::FrameGeneratorCapturer* frame_generator_; 781 test::FrameGeneratorCapturer* frame_generator_;
757 VideoEncoderConfig encoder_config_; 782 VideoEncoderConfig encoder_config_;
758 } test; 783 } test;
759 784
760 RunBaseTest(&test); 785 RunBaseTest(&test);
761 } 786 }
762 787
763 } // namespace webrtc 788 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698