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

Side by Side Diff: webrtc/test/direct_transport.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 #include "webrtc/test/direct_transport.h" 10 #include "webrtc/test/direct_transport.h"
11 11
12 #include "webrtc/call/call.h" 12 #include "webrtc/call/call.h"
13 #include "webrtc/system_wrappers/include/clock.h" 13 #include "webrtc/system_wrappers/include/clock.h"
14 #include "webrtc/test/single_threaded_task_queue.h"
14 15
15 namespace webrtc { 16 namespace webrtc {
16 namespace test { 17 namespace test {
17 18
18 DirectTransport::DirectTransport( 19 DirectTransport::DirectTransport(
20 SingleThreadedTaskQueue* task_queue,
19 Call* send_call, 21 Call* send_call,
20 const std::map<uint8_t, MediaType>& payload_type_map) 22 const std::map<uint8_t, MediaType>& payload_type_map)
21 : DirectTransport(FakeNetworkPipe::Config(), send_call, payload_type_map) {} 23 : DirectTransport(task_queue,
24 FakeNetworkPipe::Config(),
25 send_call,
26 payload_type_map) {
27 RTC_DCHECK(task_queue);
28 }
22 29
23 DirectTransport::DirectTransport( 30 DirectTransport::DirectTransport(
31 SingleThreadedTaskQueue* task_queue,
24 const FakeNetworkPipe::Config& config, 32 const FakeNetworkPipe::Config& config,
25 Call* send_call, 33 Call* send_call,
26 const std::map<uint8_t, MediaType>& payload_type_map) 34 const std::map<uint8_t, MediaType>& payload_type_map)
27 : DirectTransport( 35 : DirectTransport(
36 task_queue,
28 config, 37 config,
29 send_call, 38 send_call,
30 std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map))) {} 39 std::unique_ptr<Demuxer>(new DemuxerImpl(payload_type_map))) {
40 RTC_DCHECK(task_queue);
41 }
31 42
32 DirectTransport::DirectTransport(const FakeNetworkPipe::Config& config, 43 DirectTransport::DirectTransport(SingleThreadedTaskQueue* task_queue,
44 const FakeNetworkPipe::Config& config,
33 Call* send_call, 45 Call* send_call,
34 std::unique_ptr<Demuxer> demuxer) 46 std::unique_ptr<Demuxer> demuxer)
35 : send_call_(send_call), 47 : send_call_(send_call),
36 packet_event_(false, false),
37 thread_(NetworkProcess, this, "NetworkProcess"),
38 clock_(Clock::GetRealTimeClock()), 48 clock_(Clock::GetRealTimeClock()),
39 shutting_down_(false), 49 task_queue_(task_queue),
40 fake_network_(clock_, config, std::move(demuxer)) { 50 fake_network_(clock_, config, std::move(demuxer)) {
41 thread_.Start();
42 if (send_call_) { 51 if (send_call_) {
43 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp); 52 send_call_->SignalChannelNetworkState(MediaType::AUDIO, kNetworkUp);
44 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp); 53 send_call_->SignalChannelNetworkState(MediaType::VIDEO, kNetworkUp);
45 } 54 }
55 SendPackets();
46 } 56 }
47 57
48 DirectTransport::~DirectTransport() { StopSending(); } 58 DirectTransport::~DirectTransport() {
59 RTC_DCHECK_RUN_ON(&thread_checker_);
60 // Constructor updates |next_task_|, so it's guaranteed to be initialized.
61 task_queue_->CancelTask(next_task_);
62 }
49 63
50 void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) { 64 void DirectTransport::SetConfig(const FakeNetworkPipe::Config& config) {
51 fake_network_.SetConfig(config); 65 fake_network_.SetConfig(config);
52 } 66 }
53 67
54 void DirectTransport::StopSending() {
55 {
56 rtc::CritScope crit(&lock_);
57 shutting_down_ = true;
58 }
59
60 packet_event_.Set();
61 thread_.Stop();
62 }
63
64 void DirectTransport::SetReceiver(PacketReceiver* receiver) { 68 void DirectTransport::SetReceiver(PacketReceiver* receiver) {
65 fake_network_.SetReceiver(receiver); 69 fake_network_.SetReceiver(receiver);
66 } 70 }
67 71
68 bool DirectTransport::SendRtp(const uint8_t* data, 72 bool DirectTransport::SendRtp(const uint8_t* data,
69 size_t length, 73 size_t length,
70 const PacketOptions& options) { 74 const PacketOptions& options) {
75 // TODO(eladalon): !!! Protect this, too?
71 if (send_call_) { 76 if (send_call_) {
72 rtc::SentPacket sent_packet(options.packet_id, 77 rtc::SentPacket sent_packet(options.packet_id,
73 clock_->TimeInMilliseconds()); 78 clock_->TimeInMilliseconds());
74 send_call_->OnSentPacket(sent_packet); 79 send_call_->OnSentPacket(sent_packet);
75 } 80 }
76 fake_network_.SendPacket(data, length); 81 fake_network_.SendPacket(data, length);
77 packet_event_.Set();
78 return true; 82 return true;
79 } 83 }
80 84
81 bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) { 85 bool DirectTransport::SendRtcp(const uint8_t* data, size_t length) {
82 fake_network_.SendPacket(data, length); 86 fake_network_.SendPacket(data, length);
83 packet_event_.Set();
84 return true; 87 return true;
85 } 88 }
86 89
87 int DirectTransport::GetAverageDelayMs() { 90 int DirectTransport::GetAverageDelayMs() {
88 return fake_network_.AverageDelay(); 91 return fake_network_.AverageDelay();
89 } 92 }
90 93
91 DirectTransport::ForceDemuxer::ForceDemuxer(MediaType media_type) 94 DirectTransport::ForceDemuxer::ForceDemuxer(MediaType media_type)
92 : media_type_(media_type) {} 95 : media_type_(media_type) {}
93 96
94 void DirectTransport::ForceDemuxer::SetReceiver(PacketReceiver* receiver) { 97 void DirectTransport::ForceDemuxer::SetReceiver(PacketReceiver* receiver) {
95 packet_receiver_ = receiver; 98 packet_receiver_ = receiver;
96 } 99 }
97 100
98 void DirectTransport::ForceDemuxer::DeliverPacket( 101 void DirectTransport::ForceDemuxer::DeliverPacket(
99 const NetworkPacket* packet, 102 const NetworkPacket* packet,
100 const PacketTime& packet_time) { 103 const PacketTime& packet_time) {
101 if (!packet_receiver_) 104 if (!packet_receiver_)
102 return; 105 return;
103 packet_receiver_->DeliverPacket(media_type_, packet->data(), 106 packet_receiver_->DeliverPacket(media_type_, packet->data(),
104 packet->data_length(), packet_time); 107 packet->data_length(), packet_time);
105 } 108 }
106 109
107 bool DirectTransport::NetworkProcess(void* transport) { 110 void DirectTransport::SendPackets() {
108 return static_cast<DirectTransport*>(transport)->SendPackets(); 111 RTC_DCHECK_RUN_ON(&thread_checker_);
109 }
110 112
111 bool DirectTransport::SendPackets() { 113 fake_network_.Process(); // Actual work.
112 fake_network_.Process(); 114
113 int64_t wait_time_ms = fake_network_.TimeUntilNextProcess(); 115 next_task_ = task_queue_->PostTask([this]() { // Schedule next call.
114 if (wait_time_ms > 0) { 116 SendPackets();
stefan-webrtc 2017/08/14 11:34:54 This will busy loop, won't it?
eladalon 2017/08/14 15:38:00 It doesn't execute SendPackets(), but rather sched
stefan-webrtc 2017/08/14 16:30:21 But can't we delay the task until it's time to act
eladalon 2017/08/14 17:08:26 More things might be working on this task than thi
eladalon 2017/08/14 17:17:54 I mean to say, we have two options here: 1. Wait()
115 packet_event_.Wait(static_cast<int>(wait_time_ms)); 117 });
116 }
117 rtc::CritScope crit(&lock_);
118 return shutting_down_ ? false : true;
119 } 118 }
120 } // namespace test 119 } // namespace test
121 } // namespace webrtc 120 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698