| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|