| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2011 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 #ifndef SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ | 11 #ifndef SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ |
| 12 #define SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ | 12 #define SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ |
| 13 | 13 |
| 14 #include <deque> | 14 #include <deque> |
| 15 | 15 |
| 16 #include "webrtc/base/scoped_ptr.h" | 16 #include "webrtc/base/scoped_ptr.h" |
| 17 #include "webrtc/common_types.h" | 17 #include "webrtc/common_types.h" |
| 18 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 18 #include "webrtc/system_wrappers/interface/atomic32.h" | 19 #include "webrtc/system_wrappers/interface/atomic32.h" |
| 19 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" | 20 #include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
| 20 #include "webrtc/system_wrappers/interface/event_wrapper.h" | 21 #include "webrtc/system_wrappers/interface/event_wrapper.h" |
| 21 #include "webrtc/system_wrappers/interface/sleep.h" | 22 #include "webrtc/system_wrappers/interface/sleep.h" |
| 22 #include "webrtc/system_wrappers/interface/thread_wrapper.h" | 23 #include "webrtc/system_wrappers/interface/thread_wrapper.h" |
| 23 #include "webrtc/voice_engine/test/auto_test/fixtures/before_initialization_fixt
ure.h" | 24 #include "webrtc/voice_engine/test/auto_test/fixtures/before_initialization_fixt
ure.h" |
| 24 | 25 |
| 25 class TestErrorObserver; | 26 class TestErrorObserver; |
| 26 | 27 |
| 27 class LoopBackTransport : public webrtc::Transport { | 28 class LoopBackTransport : public webrtc::Transport { |
| 28 public: | 29 public: |
| 29 LoopBackTransport(webrtc::VoENetwork* voe_network) | 30 LoopBackTransport(webrtc::VoENetwork* voe_network, int channel) |
| 30 : crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()), | 31 : crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()), |
| 31 packet_event_(webrtc::EventWrapper::Create()), | 32 packet_event_(webrtc::EventWrapper::Create()), |
| 32 thread_(webrtc::ThreadWrapper::CreateThread( | 33 thread_(webrtc::ThreadWrapper::CreateThread(NetworkProcess, |
| 33 NetworkProcess, this, "LoopBackTransport")), | 34 this, |
| 34 voe_network_(voe_network), transmitted_packets_(0) { | 35 "LoopBackTransport")), |
| 36 channel_(channel), |
| 37 voe_network_(voe_network), |
| 38 transmitted_packets_(0) { |
| 35 thread_->Start(); | 39 thread_->Start(); |
| 36 } | 40 } |
| 37 | 41 |
| 38 ~LoopBackTransport() { thread_->Stop(); } | 42 ~LoopBackTransport() { thread_->Stop(); } |
| 39 | 43 |
| 40 int SendPacket(int channel, const void* data, size_t len) override { | 44 int SendPacket(const void* data, size_t len) override { |
| 41 StorePacket(Packet::Rtp, channel, data, len); | 45 StorePacket(Packet::Rtp, data, len); |
| 42 return static_cast<int>(len); | 46 return static_cast<int>(len); |
| 43 } | 47 } |
| 44 | 48 |
| 45 int SendRTCPPacket(int channel, const void* data, size_t len) override { | 49 int SendRTCPPacket(const void* data, size_t len) override { |
| 46 StorePacket(Packet::Rtcp, channel, data, len); | 50 StorePacket(Packet::Rtcp, data, len); |
| 47 return static_cast<int>(len); | 51 return static_cast<int>(len); |
| 48 } | 52 } |
| 49 | 53 |
| 50 void WaitForTransmittedPackets(int32_t packet_count) { | 54 void WaitForTransmittedPackets(int32_t packet_count) { |
| 51 enum { | 55 enum { |
| 52 kSleepIntervalMs = 10 | 56 kSleepIntervalMs = 10 |
| 53 }; | 57 }; |
| 54 int32_t limit = transmitted_packets_.Value() + packet_count; | 58 int32_t limit = transmitted_packets_.Value() + packet_count; |
| 55 while (transmitted_packets_.Value() < limit) { | 59 while (transmitted_packets_.Value() < limit) { |
| 56 webrtc::SleepMs(kSleepIntervalMs); | 60 webrtc::SleepMs(kSleepIntervalMs); |
| 57 } | 61 } |
| 58 } | 62 } |
| 59 | 63 |
| 64 void AddChannel(uint32_t ssrc, int channel) { |
| 65 webrtc::CriticalSectionScoped lock(crit_.get()); |
| 66 channels_[ssrc] = channel; |
| 67 } |
| 68 |
| 60 private: | 69 private: |
| 61 struct Packet { | 70 struct Packet { |
| 62 enum Type { Rtp, Rtcp, } type; | 71 enum Type { Rtp, Rtcp, } type; |
| 63 | 72 |
| 64 Packet() : len(0) {} | 73 Packet() : len(0) {} |
| 65 Packet(Type type, int channel, const void* data, size_t len) | 74 Packet(Type type, const void* data, size_t len) |
| 66 : type(type), channel(channel), len(len) { | 75 : type(type), len(len) { |
| 67 assert(len <= 1500); | 76 assert(len <= 1500); |
| 68 memcpy(this->data, data, len); | 77 memcpy(this->data, data, len); |
| 69 } | 78 } |
| 70 | 79 |
| 71 int channel; | |
| 72 uint8_t data[1500]; | 80 uint8_t data[1500]; |
| 73 size_t len; | 81 size_t len; |
| 74 }; | 82 }; |
| 75 | 83 |
| 76 void StorePacket(Packet::Type type, int channel, | 84 void StorePacket(Packet::Type type, |
| 77 const void* data, | 85 const void* data, |
| 78 size_t len) { | 86 size_t len) { |
| 79 { | 87 { |
| 80 webrtc::CriticalSectionScoped lock(crit_.get()); | 88 webrtc::CriticalSectionScoped lock(crit_.get()); |
| 81 packet_queue_.push_back(Packet(type, channel, data, len)); | 89 packet_queue_.push_back(Packet(type, data, len)); |
| 82 } | 90 } |
| 83 packet_event_->Set(); | 91 packet_event_->Set(); |
| 84 } | 92 } |
| 85 | 93 |
| 86 static bool NetworkProcess(void* transport) { | 94 static bool NetworkProcess(void* transport) { |
| 87 return static_cast<LoopBackTransport*>(transport)->SendPackets(); | 95 return static_cast<LoopBackTransport*>(transport)->SendPackets(); |
| 88 } | 96 } |
| 89 | 97 |
| 90 bool SendPackets() { | 98 bool SendPackets() { |
| 91 switch (packet_event_->Wait(10)) { | 99 switch (packet_event_->Wait(10)) { |
| 92 case webrtc::kEventSignaled: | 100 case webrtc::kEventSignaled: |
| 93 break; | 101 break; |
| 94 case webrtc::kEventTimeout: | 102 case webrtc::kEventTimeout: |
| 95 break; | 103 break; |
| 96 case webrtc::kEventError: | 104 case webrtc::kEventError: |
| 97 // TODO(pbos): Log a warning here? | 105 // TODO(pbos): Log a warning here? |
| 98 return true; | 106 return true; |
| 99 } | 107 } |
| 100 | 108 |
| 101 while (true) { | 109 while (true) { |
| 102 Packet p; | 110 Packet p; |
| 111 int channel = channel_; |
| 103 { | 112 { |
| 104 webrtc::CriticalSectionScoped lock(crit_.get()); | 113 webrtc::CriticalSectionScoped lock(crit_.get()); |
| 105 if (packet_queue_.empty()) | 114 if (packet_queue_.empty()) |
| 106 break; | 115 break; |
| 107 p = packet_queue_.front(); | 116 p = packet_queue_.front(); |
| 108 packet_queue_.pop_front(); | 117 packet_queue_.pop_front(); |
| 118 |
| 119 if (p.type == Packet::Rtp) { |
| 120 uint32_t ssrc = |
| 121 webrtc::ByteReader<uint32_t>::ReadBigEndian(&p.data[8]); |
| 122 if (channels_[ssrc] != 0) |
| 123 channel = channels_[ssrc]; |
| 124 } |
| 125 // TODO(pbos): Add RTCP SSRC muxing/demuxing if anything requires it. |
| 109 } | 126 } |
| 110 | 127 |
| 128 // Minimum RTP header size. |
| 129 if (p.len < 12) |
| 130 continue; |
| 131 |
| 111 switch (p.type) { | 132 switch (p.type) { |
| 112 case Packet::Rtp: | 133 case Packet::Rtp: |
| 113 voe_network_->ReceivedRTPPacket(p.channel, p.data, p.len, | 134 voe_network_->ReceivedRTPPacket(channel, p.data, p.len, |
| 114 webrtc::PacketTime()); | 135 webrtc::PacketTime()); |
| 115 break; | 136 break; |
| 116 case Packet::Rtcp: | 137 case Packet::Rtcp: |
| 117 voe_network_->ReceivedRTCPPacket(p.channel, p.data, p.len); | 138 voe_network_->ReceivedRTCPPacket(channel, p.data, p.len); |
| 118 break; | 139 break; |
| 119 } | 140 } |
| 120 ++transmitted_packets_; | 141 ++transmitted_packets_; |
| 121 } | 142 } |
| 122 return true; | 143 return true; |
| 123 } | 144 } |
| 124 | 145 |
| 125 const rtc::scoped_ptr<webrtc::CriticalSectionWrapper> crit_; | 146 const rtc::scoped_ptr<webrtc::CriticalSectionWrapper> crit_; |
| 126 const rtc::scoped_ptr<webrtc::EventWrapper> packet_event_; | 147 const rtc::scoped_ptr<webrtc::EventWrapper> packet_event_; |
| 127 const rtc::scoped_ptr<webrtc::ThreadWrapper> thread_; | 148 const rtc::scoped_ptr<webrtc::ThreadWrapper> thread_; |
| 128 std::deque<Packet> packet_queue_ GUARDED_BY(crit_.get()); | 149 std::deque<Packet> packet_queue_ GUARDED_BY(crit_.get()); |
| 150 const int channel_; |
| 151 std::map<uint32_t, int> channels_ GUARDED_BY(crit_.get()); |
| 129 webrtc::VoENetwork* const voe_network_; | 152 webrtc::VoENetwork* const voe_network_; |
| 130 webrtc::Atomic32 transmitted_packets_; | 153 webrtc::Atomic32 transmitted_packets_; |
| 131 }; | 154 }; |
| 132 | 155 |
| 133 // This fixture initializes the voice engine in addition to the work | 156 // This fixture initializes the voice engine in addition to the work |
| 134 // done by the before-initialization fixture. It also registers an error | 157 // done by the before-initialization fixture. It also registers an error |
| 135 // observer which will fail tests on error callbacks. This fixture is | 158 // observer which will fail tests on error callbacks. This fixture is |
| 136 // useful to tests that want to run before we have started any form of | 159 // useful to tests that want to run before we have started any form of |
| 137 // streaming through the voice engine. | 160 // streaming through the voice engine. |
| 138 class AfterInitializationFixture : public BeforeInitializationFixture { | 161 class AfterInitializationFixture : public BeforeInitializationFixture { |
| 139 public: | 162 public: |
| 140 AfterInitializationFixture(); | 163 AfterInitializationFixture(); |
| 141 virtual ~AfterInitializationFixture(); | 164 virtual ~AfterInitializationFixture(); |
| 142 | 165 |
| 143 protected: | 166 protected: |
| 144 rtc::scoped_ptr<TestErrorObserver> error_observer_; | 167 rtc::scoped_ptr<TestErrorObserver> error_observer_; |
| 145 }; | 168 }; |
| 146 | 169 |
| 147 #endif // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ | 170 #endif // SRC_VOICE_ENGINE_MAIN_TEST_AUTO_TEST_STANDARD_TEST_BASE_AFTER_INIT_H_ |
| OLD | NEW |