Index: webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h |
diff --git a/webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h b/webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h |
index cee5a58f8ec81d839b8db13f54dc0cdd3c1d63d3..11397c1c597ab9bde4a5633a25dd9994534d244a 100644 |
--- a/webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h |
+++ b/webrtc/voice_engine/test/auto_test/fixtures/after_initialization_fixture.h |
@@ -15,6 +15,7 @@ |
#include "webrtc/base/scoped_ptr.h" |
#include "webrtc/common_types.h" |
+#include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
#include "webrtc/system_wrappers/interface/atomic32.h" |
#include "webrtc/system_wrappers/interface/critical_section_wrapper.h" |
#include "webrtc/system_wrappers/interface/event_wrapper.h" |
@@ -26,24 +27,27 @@ class TestErrorObserver; |
class LoopBackTransport : public webrtc::Transport { |
public: |
- LoopBackTransport(webrtc::VoENetwork* voe_network) |
+ LoopBackTransport(webrtc::VoENetwork* voe_network, int channel) |
: crit_(webrtc::CriticalSectionWrapper::CreateCriticalSection()), |
packet_event_(webrtc::EventWrapper::Create()), |
- thread_(webrtc::ThreadWrapper::CreateThread( |
- NetworkProcess, this, "LoopBackTransport")), |
- voe_network_(voe_network), transmitted_packets_(0) { |
+ thread_(webrtc::ThreadWrapper::CreateThread(NetworkProcess, |
+ this, |
+ "LoopBackTransport")), |
+ channel_(channel), |
+ voe_network_(voe_network), |
+ transmitted_packets_(0) { |
thread_->Start(); |
} |
~LoopBackTransport() { thread_->Stop(); } |
- int SendPacket(int channel, const void* data, size_t len) override { |
- StorePacket(Packet::Rtp, channel, data, len); |
+ int SendPacket(const void* data, size_t len) override { |
+ StorePacket(Packet::Rtp, data, len); |
return static_cast<int>(len); |
} |
- int SendRTCPPacket(int channel, const void* data, size_t len) override { |
- StorePacket(Packet::Rtcp, channel, data, len); |
+ int SendRTCPPacket(const void* data, size_t len) override { |
+ StorePacket(Packet::Rtcp, data, len); |
return static_cast<int>(len); |
} |
@@ -57,28 +61,32 @@ class LoopBackTransport : public webrtc::Transport { |
} |
} |
+ void AddChannel(uint32_t ssrc, int channel) { |
+ webrtc::CriticalSectionScoped lock(crit_.get()); |
+ channels_[ssrc] = channel; |
+ } |
+ |
private: |
struct Packet { |
enum Type { Rtp, Rtcp, } type; |
Packet() : len(0) {} |
- Packet(Type type, int channel, const void* data, size_t len) |
- : type(type), channel(channel), len(len) { |
+ Packet(Type type, const void* data, size_t len) |
+ : type(type), len(len) { |
assert(len <= 1500); |
memcpy(this->data, data, len); |
} |
- int channel; |
uint8_t data[1500]; |
size_t len; |
}; |
- void StorePacket(Packet::Type type, int channel, |
+ void StorePacket(Packet::Type type, |
const void* data, |
size_t len) { |
{ |
webrtc::CriticalSectionScoped lock(crit_.get()); |
- packet_queue_.push_back(Packet(type, channel, data, len)); |
+ packet_queue_.push_back(Packet(type, data, len)); |
} |
packet_event_->Set(); |
} |
@@ -100,21 +108,34 @@ class LoopBackTransport : public webrtc::Transport { |
while (true) { |
Packet p; |
+ int channel = channel_; |
{ |
webrtc::CriticalSectionScoped lock(crit_.get()); |
if (packet_queue_.empty()) |
break; |
p = packet_queue_.front(); |
packet_queue_.pop_front(); |
+ |
+ if (p.type == Packet::Rtp) { |
+ uint32_t ssrc = |
+ webrtc::ByteReader<uint32_t>::ReadBigEndian(&p.data[8]); |
+ if (channels_[ssrc] != 0) |
+ channel = channels_[ssrc]; |
+ } |
+ // TODO(pbos): Add RTCP SSRC muxing/demuxing if anything requires it. |
} |
+ // Minimum RTP header size. |
+ if (p.len < 12) |
+ continue; |
+ |
switch (p.type) { |
case Packet::Rtp: |
- voe_network_->ReceivedRTPPacket(p.channel, p.data, p.len, |
+ voe_network_->ReceivedRTPPacket(channel, p.data, p.len, |
webrtc::PacketTime()); |
break; |
case Packet::Rtcp: |
- voe_network_->ReceivedRTCPPacket(p.channel, p.data, p.len); |
+ voe_network_->ReceivedRTCPPacket(channel, p.data, p.len); |
break; |
} |
++transmitted_packets_; |
@@ -126,6 +147,8 @@ class LoopBackTransport : public webrtc::Transport { |
const rtc::scoped_ptr<webrtc::EventWrapper> packet_event_; |
const rtc::scoped_ptr<webrtc::ThreadWrapper> thread_; |
std::deque<Packet> packet_queue_ GUARDED_BY(crit_.get()); |
+ const int channel_; |
+ std::map<uint32_t, int> channels_ GUARDED_BY(crit_.get()); |
webrtc::VoENetwork* const voe_network_; |
webrtc::Atomic32 transmitted_packets_; |
}; |