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

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: after comments 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 kInvalidAudioLevel = 128;
26 static const int kEnergyHeaderId = 1;
26 27
27 static unsigned int ParseSsrc(const void* data, size_t len, bool rtcp) { 28 static unsigned int ParseRtcpSsrc(const void* data, size_t len) {
28 const size_t ssrc_pos = (!rtcp) ? 8 : 4; 29 const size_t ssrc_pos = 4;
29 unsigned int ssrc = 0; 30 unsigned int ssrc = 0;
30 if (len >= (ssrc_pos + sizeof(ssrc))) { 31 if (len >= (ssrc_pos + sizeof(ssrc))) {
31 ssrc = rtc::GetBE32(static_cast<const char*>(data) + ssrc_pos); 32 ssrc = rtc::GetBE32(static_cast<const char*>(data) + ssrc_pos);
32 } 33 }
33 return ssrc; 34 return ssrc;
34 } 35 }
35 } // namespace 36 } // namespace
36 37
37 namespace voetest { 38 namespace voetest {
38 39
39 ConferenceTransport::ConferenceTransport() 40 ConferenceTransport::ConferenceTransport()
40 : pq_crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()), 41 : pq_crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()),
41 stream_crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()), 42 stream_crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()),
42 packet_event_(webrtc::EventWrapper::Create()), 43 packet_event_(webrtc::EventWrapper::Create()),
43 thread_(webrtc::ThreadWrapper::CreateThread(Run, 44 thread_(webrtc::ThreadWrapper::CreateThread(Run,
44 this, 45 this,
45 "ConferenceTransport")), 46 "ConferenceTransport")),
46 rtt_ms_(0), 47 rtt_ms_(0),
47 stream_count_(0) { 48 stream_count_(0),
49 rtp_header_parser_(webrtc::RtpHeaderParser::Create()) {
50 rtp_header_parser_->
51 RegisterRtpHeaderExtension(webrtc::kRtpExtensionAudioLevel,
52 kEnergyHeaderId);
53
48 local_voe_ = webrtc::VoiceEngine::Create(); 54 local_voe_ = webrtc::VoiceEngine::Create();
49 local_base_ = webrtc::VoEBase::GetInterface(local_voe_); 55 local_base_ = webrtc::VoEBase::GetInterface(local_voe_);
50 local_network_ = webrtc::VoENetwork::GetInterface(local_voe_); 56 local_network_ = webrtc::VoENetwork::GetInterface(local_voe_);
51 local_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(local_voe_); 57 local_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(local_voe_);
52 58
53 // In principle, we can use one VoiceEngine to achieve the same goal. Well, in 59 // 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. 60 // here, we use two engines to make it more like reality.
55 remote_voe_ = webrtc::VoiceEngine::Create(); 61 remote_voe_ = webrtc::VoiceEngine::Create();
56 remote_base_ = webrtc::VoEBase::GetInterface(remote_voe_); 62 remote_base_ = webrtc::VoEBase::GetInterface(remote_voe_);
57 remote_codec_ = webrtc::VoECodec::GetInterface(remote_voe_); 63 remote_codec_ = webrtc::VoECodec::GetInterface(remote_voe_);
58 remote_network_ = webrtc::VoENetwork::GetInterface(remote_voe_); 64 remote_network_ = webrtc::VoENetwork::GetInterface(remote_voe_);
59 remote_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(remote_voe_); 65 remote_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(remote_voe_);
60 remote_file_ = webrtc::VoEFile::GetInterface(remote_voe_); 66 remote_file_ = webrtc::VoEFile::GetInterface(remote_voe_);
61 67
62 EXPECT_EQ(0, local_base_->Init()); 68 EXPECT_EQ(0, local_base_->Init());
63 local_sender_ = local_base_->CreateChannel(); 69 local_sender_ = local_base_->CreateChannel();
64 EXPECT_EQ(0, local_network_->RegisterExternalTransport(local_sender_, *this)); 70 EXPECT_EQ(0, local_network_->RegisterExternalTransport(local_sender_, *this));
65 EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(local_sender_, kLocalSsrc)); 71 EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(local_sender_, kLocalSsrc));
72 EXPECT_EQ(0, local_rtp_rtcp_->
73 SetSendAudioLevelIndicationStatus(local_sender_, true, kEnergyHeaderId));
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 int audio_level = rtp_header.extension.hasAudioLevel ?
157 rtp_header.extension.audioLevel & 0x7f : kInvalidAudioLevel;
158 if (!loudest_filter_.DecideForward(rtp_header.ssrc, audio_level)) {
159 break;
160 }
161 destination = GetReceiverChannelForSsrc(rtp_header.ssrc);
147 if (destination != -1) { 162 if (destination != -1) {
148 local_network_->ReceivedRTPPacket(destination, packet.data_, 163 local_network_->ReceivedRTPPacket(destination, packet.data_,
149 packet.len_, 164 packet.len_,
150 webrtc::PacketTime()); 165 webrtc::PacketTime());
151 } 166 }
152 } 167 }
153 break; 168 break;
154 case Packet::Rtcp: 169 }
155 sender_ssrc = ParseSsrc(packet.data_, packet.len_, true); 170 case Packet::Rtcp: {
171 unsigned int sender_ssrc = ParseRtcpSsrc(packet.data_, packet.len_);
156 if (sender_ssrc == kLocalSsrc) { 172 if (sender_ssrc == kLocalSsrc) {
157 remote_network_->ReceivedRTCPPacket(reflector_, packet.data_, 173 remote_network_->ReceivedRTCPPacket(reflector_, packet.data_,
158 packet.len_); 174 packet.len_);
159 } else if (sender_ssrc == kReflectorSsrc) { 175 } else if (sender_ssrc == kReflectorSsrc) {
160 local_network_->ReceivedRTCPPacket(local_sender_, packet.data_, 176 local_network_->ReceivedRTCPPacket(local_sender_, packet.data_,
161 packet.len_); 177 packet.len_);
162 } else { 178 } else {
163 destination = GetReceiverChannelForSsrc(sender_ssrc); 179 destination = GetReceiverChannelForSsrc(sender_ssrc);
164 if (destination != -1) { 180 if (destination != -1) {
165 local_network_->ReceivedRTCPPacket(destination, packet.data_, 181 local_network_->ReceivedRTCPPacket(destination, packet.data_,
166 packet.len_); 182 packet.len_);
167 } 183 }
168 } 184 }
169 break; 185 break;
186 }
170 } 187 }
171 } 188 }
172 189
173 bool ConferenceTransport::DispatchPackets() { 190 bool ConferenceTransport::DispatchPackets() {
174 switch (packet_event_->Wait(1000)) { 191 switch (packet_event_->Wait(1000)) {
175 case webrtc::kEventSignaled: 192 case webrtc::kEventSignaled:
176 break; 193 break;
177 case webrtc::kEventTimeout: 194 case webrtc::kEventTimeout:
178 return true; 195 return true;
179 case webrtc::kEventError: 196 case webrtc::kEventError:
(...skipping 20 matching lines...) Expand all
200 217
201 SendPacket(packet); 218 SendPacket(packet);
202 } 219 }
203 return true; 220 return true;
204 } 221 }
205 222
206 void ConferenceTransport::SetRtt(unsigned int rtt_ms) { 223 void ConferenceTransport::SetRtt(unsigned int rtt_ms) {
207 rtt_ms_ = rtt_ms; 224 rtt_ms_ = rtt_ms;
208 } 225 }
209 226
210 unsigned int ConferenceTransport::AddStream() { 227 unsigned int ConferenceTransport::AddStream(std::string file_name,
211 const std::string kInputFileName = 228 webrtc::FileFormats format) {
212 webrtc::test::ResourcePath("audio_coding/testfile32kHz", "pcm");
213
214 const int new_sender = remote_base_->CreateChannel(); 229 const int new_sender = remote_base_->CreateChannel();
215 EXPECT_EQ(0, remote_network_->RegisterExternalTransport(new_sender, *this)); 230 EXPECT_EQ(0, remote_network_->RegisterExternalTransport(new_sender, *this));
216 231
217 const unsigned int remote_ssrc = kFirstRemoteSsrc + stream_count_++; 232 const unsigned int remote_ssrc = kFirstRemoteSsrc + stream_count_++;
218 EXPECT_EQ(0, remote_rtp_rtcp_->SetLocalSSRC(new_sender, remote_ssrc)); 233 EXPECT_EQ(0, remote_rtp_rtcp_->SetLocalSSRC(new_sender, remote_ssrc));
234 EXPECT_EQ(0, remote_rtp_rtcp_->
235 SetSendAudioLevelIndicationStatus(new_sender, true, kEnergyHeaderId));
219 236
220 EXPECT_EQ(0, remote_codec_->SetSendCodec(new_sender, kCodecInst)); 237 EXPECT_EQ(0, remote_codec_->SetSendCodec(new_sender, kCodecInst));
221 EXPECT_EQ(0, remote_base_->StartSend(new_sender)); 238 EXPECT_EQ(0, remote_base_->StartSend(new_sender));
222 EXPECT_EQ(0, remote_file_->StartPlayingFileAsMicrophone( 239 EXPECT_EQ(0, remote_file_->StartPlayingFileAsMicrophone(
223 new_sender, kInputFileName.c_str(), true, false, 240 new_sender, file_name.c_str(), true, false, format, 1.0));
224 webrtc::kFileFormatPcm32kHzFile, 1.0));
225 241
226 const int new_receiver = local_base_->CreateChannel(); 242 const int new_receiver = local_base_->CreateChannel();
227 EXPECT_EQ(0, local_base_->AssociateSendChannel(new_receiver, local_sender_)); 243 EXPECT_EQ(0, local_base_->AssociateSendChannel(new_receiver, local_sender_));
228 244
229 EXPECT_EQ(0, local_network_->RegisterExternalTransport(new_receiver, *this)); 245 EXPECT_EQ(0, local_network_->RegisterExternalTransport(new_receiver, *this));
230 // Receive channels have to have the same SSRC in order to send receiver 246 // Receive channels have to have the same SSRC in order to send receiver
231 // reports with this SSRC. 247 // reports with this SSRC.
232 EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(new_receiver, kLocalSsrc)); 248 EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(new_receiver, kLocalSsrc));
233 249
234 { 250 {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
266 bool ConferenceTransport::GetReceiverStatistics(unsigned int id, 282 bool ConferenceTransport::GetReceiverStatistics(unsigned int id,
267 webrtc::CallStatistics* stats) { 283 webrtc::CallStatistics* stats) {
268 int dst = GetReceiverChannelForSsrc(id); 284 int dst = GetReceiverChannelForSsrc(id);
269 if (dst == -1) { 285 if (dst == -1) {
270 return false; 286 return false;
271 } 287 }
272 EXPECT_EQ(0, local_rtp_rtcp_->GetRTCPStatistics(dst, *stats)); 288 EXPECT_EQ(0, local_rtp_rtcp_->GetRTCPStatistics(dst, *stats));
273 return true; 289 return true;
274 } 290 }
275 } // namespace voetest 291 } // namespace voetest
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698