Index: webrtc/voice_engine/test/auto_test/fakes/conference_transport.cc |
diff --git a/webrtc/voice_engine/test/auto_test/fakes/conference_transport.cc b/webrtc/voice_engine/test/auto_test/fakes/conference_transport.cc |
deleted file mode 100644 |
index 305b236b6ddfb428e582f3e8ac387746d63b054a..0000000000000000000000000000000000000000 |
--- a/webrtc/voice_engine/test/auto_test/fakes/conference_transport.cc |
+++ /dev/null |
@@ -1,307 +0,0 @@ |
-/* |
- * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
- |
-#include "webrtc/voice_engine/test/auto_test/fakes/conference_transport.h" |
- |
-#include <string> |
- |
-#include "webrtc/rtc_base/byteorder.h" |
-#include "webrtc/rtc_base/timeutils.h" |
-#include "webrtc/system_wrappers/include/sleep.h" |
-#include "webrtc/voice_engine/channel_proxy.h" |
-#include "webrtc/voice_engine/voice_engine_impl.h" |
- |
-namespace webrtc { |
-namespace voetest { |
- |
-namespace { |
- |
-static const unsigned int kReflectorSsrc = 0x0000; |
-static const unsigned int kLocalSsrc = 0x0001; |
-static const unsigned int kFirstRemoteSsrc = 0x0002; |
-static const webrtc::CodecInst kCodecInst = {120, "opus", 48000, 960, 2, 64000}; |
-static const int kAudioLevelHeaderId = 1; |
- |
-static unsigned int ParseRtcpSsrc(const void* data, size_t len) { |
- const size_t ssrc_pos = 4; |
- unsigned int ssrc = 0; |
- if (len >= (ssrc_pos + sizeof(ssrc))) { |
- ssrc = rtc::GetBE32(static_cast<const char*>(data) + ssrc_pos); |
- } |
- return ssrc; |
-} |
- |
-} // namespace |
- |
-ConferenceTransport::ConferenceTransport() |
- : packet_event_(webrtc::EventWrapper::Create()), |
- thread_(Run, this, "ConferenceTransport"), |
- rtt_ms_(0), |
- stream_count_(0), |
- rtp_header_parser_(webrtc::RtpHeaderParser::Create()) { |
- rtp_header_parser_-> |
- RegisterRtpHeaderExtension(webrtc::kRtpExtensionAudioLevel, |
- kAudioLevelHeaderId); |
- |
- local_voe_ = webrtc::VoiceEngine::Create(); |
- local_base_ = webrtc::VoEBase::GetInterface(local_voe_); |
- local_network_ = webrtc::VoENetwork::GetInterface(local_voe_); |
- local_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(local_voe_); |
- |
- local_apm_ = webrtc::AudioProcessing::Create(); |
- local_base_->Init(nullptr, local_apm_.get(), nullptr); |
- |
- // In principle, we can use one VoiceEngine to achieve the same goal. Well, in |
- // here, we use two engines to make it more like reality. |
- remote_voe_ = webrtc::VoiceEngine::Create(); |
- remote_base_ = webrtc::VoEBase::GetInterface(remote_voe_); |
- remote_codec_ = webrtc::VoECodec::GetInterface(remote_voe_); |
- remote_network_ = webrtc::VoENetwork::GetInterface(remote_voe_); |
- remote_rtp_rtcp_ = webrtc::VoERTP_RTCP::GetInterface(remote_voe_); |
- remote_file_ = webrtc::VoEFile::GetInterface(remote_voe_); |
- |
- remote_apm_ = webrtc::AudioProcessing::Create(); |
- remote_base_->Init(nullptr, remote_apm_.get(), nullptr); |
- |
- local_sender_ = local_base_->CreateChannel(); |
- static_cast<webrtc::VoiceEngineImpl*>(local_voe_) |
- ->GetChannelProxy(local_sender_) |
- ->RegisterLegacyReceiveCodecs(); |
- EXPECT_EQ(0, local_network_->RegisterExternalTransport(local_sender_, *this)); |
- EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(local_sender_, kLocalSsrc)); |
- EXPECT_EQ(0, local_rtp_rtcp_-> |
- SetSendAudioLevelIndicationStatus(local_sender_, true, |
- kAudioLevelHeaderId)); |
- EXPECT_EQ(0, local_base_->StartSend(local_sender_)); |
- |
- reflector_ = remote_base_->CreateChannel(); |
- static_cast<webrtc::VoiceEngineImpl*>(remote_voe_) |
- ->GetChannelProxy(reflector_) |
- ->RegisterLegacyReceiveCodecs(); |
- EXPECT_EQ(0, remote_network_->RegisterExternalTransport(reflector_, *this)); |
- EXPECT_EQ(0, remote_rtp_rtcp_->SetLocalSSRC(reflector_, kReflectorSsrc)); |
- |
- thread_.Start(); |
- thread_.SetPriority(rtc::kHighPriority); |
-} |
- |
-ConferenceTransport::~ConferenceTransport() { |
- // Must stop sending, otherwise DispatchPackets() cannot quit. |
- EXPECT_EQ(0, remote_network_->DeRegisterExternalTransport(reflector_)); |
- EXPECT_EQ(0, local_network_->DeRegisterExternalTransport(local_sender_)); |
- |
- while (!streams_.empty()) { |
- auto stream = streams_.begin(); |
- RemoveStream(stream->first); |
- } |
- |
- thread_.Stop(); |
- |
- remote_file_->Release(); |
- remote_rtp_rtcp_->Release(); |
- remote_network_->Release(); |
- remote_base_->Release(); |
- |
- local_rtp_rtcp_->Release(); |
- local_network_->Release(); |
- local_base_->Release(); |
- |
- EXPECT_TRUE(webrtc::VoiceEngine::Delete(remote_voe_)); |
- EXPECT_TRUE(webrtc::VoiceEngine::Delete(local_voe_)); |
-} |
- |
-bool ConferenceTransport::SendRtp(const uint8_t* data, |
- size_t len, |
- const webrtc::PacketOptions& options) { |
- StorePacket(Packet::Rtp, data, len); |
- return true; |
-} |
- |
-bool ConferenceTransport::SendRtcp(const uint8_t* data, size_t len) { |
- StorePacket(Packet::Rtcp, data, len); |
- return true; |
-} |
- |
-int ConferenceTransport::GetReceiverChannelForSsrc(unsigned int sender_ssrc) |
- const { |
- rtc::CritScope lock(&stream_crit_); |
- auto it = streams_.find(sender_ssrc); |
- if (it != streams_.end()) { |
- return it->second.second; |
- } |
- return -1; |
-} |
- |
-void ConferenceTransport::StorePacket(Packet::Type type, |
- const void* data, |
- size_t len) { |
- { |
- rtc::CritScope lock(&pq_crit_); |
- packet_queue_.push_back(Packet(type, data, len, rtc::TimeMillis())); |
- } |
- packet_event_->Set(); |
-} |
- |
-// This simulates the flow of RTP and RTCP packets. Complications like that |
-// a packet is first sent to the reflector, and then forwarded to the receiver |
-// are simplified, in this particular case, to a direct link between the sender |
-// and the receiver. |
-void ConferenceTransport::SendPacket(const Packet& packet) { |
- int destination = -1; |
- |
- switch (packet.type_) { |
- case Packet::Rtp: { |
- webrtc::RTPHeader rtp_header; |
- rtp_header_parser_->Parse(packet.data_, packet.len_, &rtp_header); |
- if (rtp_header.ssrc == kLocalSsrc) { |
- remote_network_->ReceivedRTPPacket(reflector_, packet.data_, |
- packet.len_, webrtc::PacketTime()); |
- } else { |
- if (loudest_filter_.ForwardThisPacket(rtp_header)) { |
- destination = GetReceiverChannelForSsrc(rtp_header.ssrc); |
- if (destination != -1) { |
- local_network_->ReceivedRTPPacket(destination, packet.data_, |
- packet.len_, |
- webrtc::PacketTime()); |
- } |
- } |
- } |
- break; |
- } |
- case Packet::Rtcp: { |
- unsigned int sender_ssrc = ParseRtcpSsrc(packet.data_, packet.len_); |
- if (sender_ssrc == kLocalSsrc) { |
- remote_network_->ReceivedRTCPPacket(reflector_, packet.data_, |
- packet.len_); |
- } else if (sender_ssrc == kReflectorSsrc) { |
- local_network_->ReceivedRTCPPacket(local_sender_, packet.data_, |
- packet.len_); |
- } else { |
- destination = GetReceiverChannelForSsrc(sender_ssrc); |
- if (destination != -1) { |
- local_network_->ReceivedRTCPPacket(destination, packet.data_, |
- packet.len_); |
- } |
- } |
- break; |
- } |
- } |
-} |
- |
-bool ConferenceTransport::DispatchPackets() { |
- switch (packet_event_->Wait(1000)) { |
- case webrtc::kEventSignaled: |
- break; |
- case webrtc::kEventTimeout: |
- return true; |
- case webrtc::kEventError: |
- ADD_FAILURE() << "kEventError encountered."; |
- return true; |
- } |
- |
- while (true) { |
- Packet packet; |
- { |
- rtc::CritScope lock(&pq_crit_); |
- if (packet_queue_.empty()) |
- break; |
- packet = packet_queue_.front(); |
- packet_queue_.pop_front(); |
- } |
- |
- int32_t elapsed_time_ms = rtc::TimeSince(packet.send_time_ms_); |
- int32_t sleep_ms = rtt_ms_ / 2 - elapsed_time_ms; |
- if (sleep_ms > 0) { |
- // Every packet should be delayed by half of RTT. |
- webrtc::SleepMs(sleep_ms); |
- } |
- |
- SendPacket(packet); |
- } |
- return true; |
-} |
- |
-void ConferenceTransport::SetRtt(unsigned int rtt_ms) { |
- rtt_ms_ = rtt_ms; |
-} |
- |
-unsigned int ConferenceTransport::AddStream(std::string file_name, |
- webrtc::FileFormats format) { |
- const int new_sender = remote_base_->CreateChannel(); |
- static_cast<webrtc::VoiceEngineImpl*>(remote_voe_) |
- ->GetChannelProxy(new_sender) |
- ->RegisterLegacyReceiveCodecs(); |
- EXPECT_EQ(0, remote_network_->RegisterExternalTransport(new_sender, *this)); |
- |
- const unsigned int remote_ssrc = kFirstRemoteSsrc + stream_count_++; |
- EXPECT_EQ(0, remote_rtp_rtcp_->SetLocalSSRC(new_sender, remote_ssrc)); |
- EXPECT_EQ(0, remote_rtp_rtcp_-> |
- SetSendAudioLevelIndicationStatus(new_sender, true, kAudioLevelHeaderId)); |
- |
- EXPECT_EQ(0, remote_codec_->SetSendCodec(new_sender, kCodecInst)); |
- EXPECT_EQ(0, remote_base_->StartSend(new_sender)); |
- EXPECT_EQ(0, remote_file_->StartPlayingFileAsMicrophone( |
- new_sender, file_name.c_str(), true, false, format, 1.0)); |
- |
- const int new_receiver = local_base_->CreateChannel(); |
- static_cast<webrtc::VoiceEngineImpl*>(local_voe_) |
- ->GetChannelProxy(new_receiver) |
- ->RegisterLegacyReceiveCodecs(); |
- EXPECT_EQ(0, local_base_->AssociateSendChannel(new_receiver, local_sender_)); |
- |
- EXPECT_EQ(0, local_network_->RegisterExternalTransport(new_receiver, *this)); |
- // Receive channels have to have the same SSRC in order to send receiver |
- // reports with this SSRC. |
- EXPECT_EQ(0, local_rtp_rtcp_->SetLocalSSRC(new_receiver, kLocalSsrc)); |
- |
- { |
- rtc::CritScope lock(&stream_crit_); |
- streams_[remote_ssrc] = std::make_pair(new_sender, new_receiver); |
- } |
- return remote_ssrc; // remote ssrc used as stream id. |
-} |
- |
-bool ConferenceTransport::RemoveStream(unsigned int id) { |
- rtc::CritScope lock(&stream_crit_); |
- auto it = streams_.find(id); |
- if (it == streams_.end()) { |
- return false; |
- } |
- EXPECT_EQ(0, remote_network_-> |
- DeRegisterExternalTransport(it->second.second)); |
- EXPECT_EQ(0, local_network_-> |
- DeRegisterExternalTransport(it->second.first)); |
- EXPECT_EQ(0, remote_base_->DeleteChannel(it->second.second)); |
- EXPECT_EQ(0, local_base_->DeleteChannel(it->second.first)); |
- streams_.erase(it); |
- return true; |
-} |
- |
-bool ConferenceTransport::StartPlayout(unsigned int id) { |
- int dst = GetReceiverChannelForSsrc(id); |
- if (dst == -1) { |
- return false; |
- } |
- EXPECT_EQ(0, local_base_->StartPlayout(dst)); |
- return true; |
-} |
- |
-bool ConferenceTransport::GetReceiverStatistics(unsigned int id, |
- webrtc::CallStatistics* stats) { |
- int dst = GetReceiverChannelForSsrc(id); |
- if (dst == -1) { |
- return false; |
- } |
- EXPECT_EQ(0, local_rtp_rtcp_->GetRTCPStatistics(dst, *stats)); |
- return true; |
-} |
- |
-} // namespace voetest |
-} // namespace webrtc |