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

Side by Side Diff: webrtc/voice_engine/test/auto_test/fakes/conference_transport.cc

Issue 1236793003: Add LoudestFilter in ConferenceTransport (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: avoiding C++11 map.erase signature Created 5 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) 2015 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2015 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 "webrtc/voice_engine/test/auto_test/fakes/conference_transport.h" 11 #include "webrtc/voice_engine/test/auto_test/fakes/conference_transport.h"
12 12
13 #include <string> 13 #include <string>
14 14
15 #include "webrtc/base/byteorder.h" 15 #include "webrtc/base/byteorder.h"
16 #include "webrtc/base/timeutils.h" 16 #include "webrtc/base/timeutils.h"
17 #include "webrtc/test/testsupport/fileutils.h"
18 #include "webrtc/system_wrappers/interface/sleep.h" 17 #include "webrtc/system_wrappers/interface/sleep.h"
19 18
20 namespace { 19 namespace {
21 static const unsigned int kReflectorSsrc = 0x0000; 20 static const unsigned int kReflectorSsrc = 0x0000;
22 static const unsigned int kLocalSsrc = 0x0001; 21 static const unsigned int kLocalSsrc = 0x0001;
23 static const unsigned int kFirstRemoteSsrc = 0x0002; 22 static const unsigned int kFirstRemoteSsrc = 0x0002;
24 static const webrtc::CodecInst kCodecInst = 23 static const webrtc::CodecInst kCodecInst =
25 {120, "opus", 48000, 960, 2, 64000}; 24 {120, "opus", 48000, 960, 2, 64000};
25 static const int kAudioLevelHeaderId = 1;
26 26
27 static unsigned int ParseSsrc(const void* data, size_t len, bool rtcp) { 27 static unsigned int ParseRtcpSsrc(const void* data, size_t len) {
28 const size_t ssrc_pos = (!rtcp) ? 8 : 4; 28 const size_t ssrc_pos = 4;
29 unsigned int ssrc = 0; 29 unsigned int ssrc = 0;
30 if (len >= (ssrc_pos + sizeof(ssrc))) { 30 if (len >= (ssrc_pos + sizeof(ssrc))) {
31 ssrc = rtc::GetBE32(static_cast<const char*>(data) + ssrc_pos); 31 ssrc = rtc::GetBE32(static_cast<const char*>(data) + ssrc_pos);
32 } 32 }
33 return ssrc; 33 return ssrc;
34 } 34 }
35 } // namespace 35 } // namespace
36 36
37 namespace voetest { 37 namespace voetest {
38 38
39 ConferenceTransport::ConferenceTransport() 39 ConferenceTransport::ConferenceTransport()
40 : pq_crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()), 40 : pq_crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()),
41 stream_crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()), 41 stream_crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()),
42 packet_event_(webrtc::EventWrapper::Create()), 42 packet_event_(webrtc::EventWrapper::Create()),
43 thread_(webrtc::ThreadWrapper::CreateThread(Run, 43 thread_(webrtc::ThreadWrapper::CreateThread(Run,
44 this, 44 this,
45 "ConferenceTransport")), 45 "ConferenceTransport")),
46 rtt_ms_(0), 46 rtt_ms_(0),
47 stream_count_(0) { 47 stream_count_(0),
48 rtp_header_parser_(webrtc::RtpHeaderParser::Create()) {
49 rtp_header_parser_->
50 RegisterRtpHeaderExtension(webrtc::kRtpExtensionAudioLevel,
51 kAudioLevelHeaderId);
52
48 local_voe_ = webrtc::VoiceEngine::Create(); 53 local_voe_ = webrtc::VoiceEngine::Create();
49 local_base_ = webrtc::VoEBase::GetInterface(local_voe_); 54 local_base_ = webrtc::VoEBase::GetInterface(local_voe_);
50 local_network_ = webrtc::VoENetwork::GetInterface(local_voe_); 55 local_network_ = webrtc::VoENetwork::GetInterface(local_voe_);
51 local_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(local_voe_); 56 local_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(local_voe_);
52 57
53 // In principle, we can use one VoiceEngine to achieve the same goal. Well, in 58 // In principle, we can use one VoiceEngine to achieve the same goal. Well, in
54 // here, we use two engines to make it more like reality. 59 // here, we use two engines to make it more like reality.
55 remote_voe_ = webrtc::VoiceEngine::Create(); 60 remote_voe_ = webrtc::VoiceEngine::Create();
56 remote_base_ = webrtc::VoEBase::GetInterface(remote_voe_); 61 remote_base_ = webrtc::VoEBase::GetInterface(remote_voe_);
57 remote_codec_ = webrtc::VoECodec::GetInterface(remote_voe_); 62 remote_codec_ = webrtc::VoECodec::GetInterface(remote_voe_);
58 remote_network_ = webrtc::VoENetwork::GetInterface(remote_voe_); 63 remote_network_ = webrtc::VoENetwork::GetInterface(remote_voe_);
59 remote_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(remote_voe_); 64 remote_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(remote_voe_);
60 remote_file_ = webrtc::VoEFile::GetInterface(remote_voe_); 65 remote_file_ = webrtc::VoEFile::GetInterface(remote_voe_);
61 66
62 EXPECT_EQ(0, local_base_->Init()); 67 EXPECT_EQ(0, local_base_->Init());
63 local_sender_ = local_base_->CreateChannel(); 68 local_sender_ = local_base_->CreateChannel();
64 EXPECT_EQ(0, local_network_->RegisterExternalTransport(local_sender_, *this)); 69 EXPECT_EQ(0, local_network_->RegisterExternalTransport(local_sender_, *this));
65 EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(local_sender_, kLocalSsrc)); 70 EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(local_sender_, kLocalSsrc));
71 EXPECT_EQ(0, local_rtp_rtcp_->
72 SetSendAudioLevelIndicationStatus(local_sender_, true,
73 kAudioLevelHeaderId));
74
66 EXPECT_EQ(0, local_base_->StartSend(local_sender_)); 75 EXPECT_EQ(0, local_base_->StartSend(local_sender_));
67 76
68 EXPECT_EQ(0, remote_base_->Init()); 77 EXPECT_EQ(0, remote_base_->Init());
69 reflector_ = remote_base_->CreateChannel(); 78 reflector_ = remote_base_->CreateChannel();
70 EXPECT_EQ(0, remote_network_->RegisterExternalTransport(reflector_, *this)); 79 EXPECT_EQ(0, remote_network_->RegisterExternalTransport(reflector_, *this));
71 EXPECT_EQ(0, remote_rtp_rtcp_->SetLocalSSRC(reflector_, kReflectorSsrc)); 80 EXPECT_EQ(0, remote_rtp_rtcp_->SetLocalSSRC(reflector_, kReflectorSsrc));
72 81
73 thread_->Start(); 82 thread_->Start();
74 thread_->SetPriority(webrtc::kHighPriority); 83 thread_->SetPriority(webrtc::kHighPriority);
75 } 84 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
126 webrtc::CriticalSectionScoped lock(pq_crit_.get()); 135 webrtc::CriticalSectionScoped lock(pq_crit_.get());
127 packet_queue_.push_back(Packet(type, channel, data, len, rtc::Time())); 136 packet_queue_.push_back(Packet(type, channel, data, len, rtc::Time()));
128 } 137 }
129 packet_event_->Set(); 138 packet_event_->Set();
130 } 139 }
131 140
132 // This simulates the flow of RTP and RTCP packets. Complications like that 141 // This simulates the flow of RTP and RTCP packets. Complications like that
133 // a packet is first sent to the reflector, and then forwarded to the receiver 142 // a packet is first sent to the reflector, and then forwarded to the receiver
134 // are simplified, in this particular case, to a direct link between the sender 143 // are simplified, in this particular case, to a direct link between the sender
135 // and the receiver. 144 // and the receiver.
136 void ConferenceTransport::SendPacket(const Packet& packet) const { 145 void ConferenceTransport::SendPacket(const Packet& packet) {
137 unsigned int sender_ssrc;
138 int destination = -1; 146 int destination = -1;
147
139 switch (packet.type_) { 148 switch (packet.type_) {
140 case Packet::Rtp: 149 case Packet::Rtp: {
141 sender_ssrc = ParseSsrc(packet.data_, packet.len_, false); 150 webrtc::RTPHeader rtp_header;
142 if (sender_ssrc == kLocalSsrc) { 151 rtp_header_parser_->Parse(packet.data_, packet.len_, &rtp_header);
152 if (rtp_header.ssrc == kLocalSsrc) {
143 remote_network_->ReceivedRTPPacket(reflector_, packet.data_, 153 remote_network_->ReceivedRTPPacket(reflector_, packet.data_,
144 packet.len_, webrtc::PacketTime()); 154 packet.len_, webrtc::PacketTime());
145 } else { 155 } else {
146 destination = GetReceiverChannelForSsrc(sender_ssrc); 156 if (loudest_filter_.ForwardThisPacket(rtp_header)) {
147 if (destination != -1) { 157 destination = GetReceiverChannelForSsrc(rtp_header.ssrc);
148 local_network_->ReceivedRTPPacket(destination, packet.data_, 158 if (destination != -1) {
149 packet.len_, 159 local_network_->ReceivedRTPPacket(destination, packet.data_,
150 webrtc::PacketTime()); 160 packet.len_,
161 webrtc::PacketTime());
162 }
151 } 163 }
152 } 164 }
153 break; 165 break;
154 case Packet::Rtcp: 166 }
155 sender_ssrc = ParseSsrc(packet.data_, packet.len_, true); 167 case Packet::Rtcp: {
168 unsigned int sender_ssrc = ParseRtcpSsrc(packet.data_, packet.len_);
156 if (sender_ssrc == kLocalSsrc) { 169 if (sender_ssrc == kLocalSsrc) {
157 remote_network_->ReceivedRTCPPacket(reflector_, packet.data_, 170 remote_network_->ReceivedRTCPPacket(reflector_, packet.data_,
158 packet.len_); 171 packet.len_);
159 } else if (sender_ssrc == kReflectorSsrc) { 172 } else if (sender_ssrc == kReflectorSsrc) {
160 local_network_->ReceivedRTCPPacket(local_sender_, packet.data_, 173 local_network_->ReceivedRTCPPacket(local_sender_, packet.data_,
161 packet.len_); 174 packet.len_);
162 } else { 175 } else {
163 destination = GetReceiverChannelForSsrc(sender_ssrc); 176 destination = GetReceiverChannelForSsrc(sender_ssrc);
164 if (destination != -1) { 177 if (destination != -1) {
165 local_network_->ReceivedRTCPPacket(destination, packet.data_, 178 local_network_->ReceivedRTCPPacket(destination, packet.data_,
166 packet.len_); 179 packet.len_);
167 } 180 }
168 } 181 }
169 break; 182 break;
183 }
170 } 184 }
171 } 185 }
172 186
173 bool ConferenceTransport::DispatchPackets() { 187 bool ConferenceTransport::DispatchPackets() {
174 switch (packet_event_->Wait(1000)) { 188 switch (packet_event_->Wait(1000)) {
175 case webrtc::kEventSignaled: 189 case webrtc::kEventSignaled:
176 break; 190 break;
177 case webrtc::kEventTimeout: 191 case webrtc::kEventTimeout:
178 return true; 192 return true;
179 case webrtc::kEventError: 193 case webrtc::kEventError:
(...skipping 20 matching lines...) Expand all
200 214
201 SendPacket(packet); 215 SendPacket(packet);
202 } 216 }
203 return true; 217 return true;
204 } 218 }
205 219
206 void ConferenceTransport::SetRtt(unsigned int rtt_ms) { 220 void ConferenceTransport::SetRtt(unsigned int rtt_ms) {
207 rtt_ms_ = rtt_ms; 221 rtt_ms_ = rtt_ms;
208 } 222 }
209 223
210 unsigned int ConferenceTransport::AddStream() { 224 unsigned int ConferenceTransport::AddStream(std::string file_name,
211 const std::string kInputFileName = 225 webrtc::FileFormats format) {
212 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
213
214 const int new_sender = remote_base_->CreateChannel(); 226 const int new_sender = remote_base_->CreateChannel();
215 EXPECT_EQ(0, remote_network_->RegisterExternalTransport(new_sender, *this)); 227 EXPECT_EQ(0, remote_network_->RegisterExternalTransport(new_sender, *this));
216 228
217 const unsigned int remote_ssrc = kFirstRemoteSsrc + stream_count_++; 229 const unsigned int remote_ssrc = kFirstRemoteSsrc + stream_count_++;
218 EXPECT_EQ(0, remote_rtp_rtcp_->SetLocalSSRC(new_sender, remote_ssrc)); 230 EXPECT_EQ(0, remote_rtp_rtcp_->SetLocalSSRC(new_sender, remote_ssrc));
231 EXPECT_EQ(0, remote_rtp_rtcp_->
232 SetSendAudioLevelIndicationStatus(new_sender, true, kAudioLevelHeaderId));
219 233
220 EXPECT_EQ(0, remote_codec_->SetSendCodec(new_sender, kCodecInst)); 234 EXPECT_EQ(0, remote_codec_->SetSendCodec(new_sender, kCodecInst));
221 EXPECT_EQ(0, remote_base_->StartSend(new_sender)); 235 EXPECT_EQ(0, remote_base_->StartSend(new_sender));
222 EXPECT_EQ(0, remote_file_->StartPlayingFileAsMicrophone( 236 EXPECT_EQ(0, remote_file_->StartPlayingFileAsMicrophone(
223 new_sender, kInputFileName.c_str(), true, false, 237 new_sender, file_name.c_str(), true, false, format, 1.0));
224 webrtc::kFileFormatPcm32kHzFile, 1.0));
225 238
226 const int new_receiver = local_base_->CreateChannel(); 239 const int new_receiver = local_base_->CreateChannel();
227 EXPECT_EQ(0, local_base_->AssociateSendChannel(new_receiver, local_sender_)); 240 EXPECT_EQ(0, local_base_->AssociateSendChannel(new_receiver, local_sender_));
228 241
229 EXPECT_EQ(0, local_network_->RegisterExternalTransport(new_receiver, *this)); 242 EXPECT_EQ(0, local_network_->RegisterExternalTransport(new_receiver, *this));
230 // Receive channels have to have the same SSRC in order to send receiver 243 // Receive channels have to have the same SSRC in order to send receiver
231 // reports with this SSRC. 244 // reports with this SSRC.
232 EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(new_receiver, kLocalSsrc)); 245 EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(new_receiver, kLocalSsrc));
233 246
234 { 247 {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 bool ConferenceTransport::GetReceiverStatistics(unsigned int id, 279 bool ConferenceTransport::GetReceiverStatistics(unsigned int id,
267 webrtc::CallStatistics* stats) { 280 webrtc::CallStatistics* stats) {
268 int dst = GetReceiverChannelForSsrc(id); 281 int dst = GetReceiverChannelForSsrc(id);
269 if (dst == -1) { 282 if (dst == -1) {
270 return false; 283 return false;
271 } 284 }
272 EXPECT_EQ(0, local_rtp_rtcp_->GetRTCPStatistics(dst, *stats)); 285 EXPECT_EQ(0, local_rtp_rtcp_->GetRTCPStatistics(dst, *stats));
273 return true; 286 return true;
274 } 287 }
275 } // namespace voetest 288 } // namespace voetest
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698