From 5d957e29f772c45a8b0efce3d014e53679809e8d Mon Sep 17 00:00:00 2001 From: "sprang@webrtc.org" Date: Wed, 16 Oct 2013 11:37:54 +0000 Subject: [PATCH] Wired up max packet size and added simple test. BUG=2428 R=mflodman@webrtc.org, pbos@webrtc.org Review URL: https://webrtc-codereview.appspot.com/2384004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@4973 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../internal/video_send_stream.cc | 2 + .../new_include/video_send_stream.h | 5 +- webrtc/video_engine/test/send_stream_tests.cc | 46 +++++++++++++++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/webrtc/video_engine/internal/video_send_stream.cc b/webrtc/video_engine/internal/video_send_stream.cc index 34cafc87b6..a0a99e076f 100644 --- a/webrtc/video_engine/internal/video_send_stream.cc +++ b/webrtc/video_engine/internal/video_send_stream.cc @@ -166,6 +166,8 @@ VideoSendStream::VideoSendStream(newapi::Transport* transport, assert(network_ != NULL); network_->RegisterSendTransport(channel_, transport_adapter_); + network_->SetMTU(channel_, config_.rtp.max_packet_size + + VideoSendStream::Config::kDefaultPacketOverheader); if (config.encoder) { external_codec_ = ViEExternalCodec::GetInterface(video_engine); diff --git a/webrtc/video_engine/new_include/video_send_stream.h b/webrtc/video_engine/new_include/video_send_stream.h index 8570f0609d..9ae78bd40c 100644 --- a/webrtc/video_engine/new_include/video_send_stream.h +++ b/webrtc/video_engine/new_include/video_send_stream.h @@ -84,8 +84,11 @@ class VideoSendStream { start_state(NULL) {} VideoCodec codec; + static const size_t kDefaultPacketOverheader = 20 + 20; // IPv4 + TCP + static const size_t kDefaultMaxPacketSize = 1500 - kDefaultPacketOverheader; struct Rtp { - Rtp() : mode(newapi::kRtcpReducedSize), max_packet_size(0) {} + Rtp() : mode(newapi::kRtcpReducedSize), + max_packet_size(kDefaultMaxPacketSize) {} newapi::RtcpMode mode; std::vector ssrcs; diff --git a/webrtc/video_engine/test/send_stream_tests.cc b/webrtc/video_engine/test/send_stream_tests.cc index c2e4b30255..1c9f32d9ae 100644 --- a/webrtc/video_engine/test/send_stream_tests.cc +++ b/webrtc/video_engine/test/send_stream_tests.cc @@ -105,6 +105,7 @@ TEST_F(VideoSendStreamTest, SendsSetSsrc) { scoped_ptr call(Call::Create(call_config)); VideoSendStream::Config send_config = GetSendTestConfig(call.get()); + send_config.rtp.max_packet_size = 128; RunSendTest(call.get(), send_config, &observer); } @@ -431,4 +432,49 @@ TEST_F(VideoSendStreamTest, RetransmitsNackOverRtx) { TestNackRetransmission(kSendRtxSsrc); } +TEST_F(VideoSendStreamTest, MaxPacketSize) { + class PacketSizeObserver : public SendTransportObserver { + public: + PacketSizeObserver(size_t max_length) : SendTransportObserver(30 * 1000), + max_length_(max_length), accumulated_size_(0) {} + + virtual bool SendRTP(const uint8_t* packet, size_t length) OVERRIDE { + RTPHeader header; + EXPECT_TRUE( + rtp_header_parser_->Parse(packet, static_cast(length), &header)); + + EXPECT_TRUE(length <= max_length_); + + accumulated_size_ += length; + + // Marker bit set indicates last fragment of a packet + if (header.markerBit) { + if (accumulated_size_ + length > max_length_) { + // The packet was fragmented, total size was larger than max size, + // but size of individual fragments were within size limit => pass! + send_test_complete_->Set(); + } + accumulated_size_ = 0; // Last fragment, reset packet size + } + + return true; + } + + private: + size_t max_length_; + size_t accumulated_size_; + }; + + static const uint32_t kMaxPacketSize = 128; + + PacketSizeObserver observer(kMaxPacketSize); + Call::Config call_config(&observer); + scoped_ptr call(Call::Create(call_config)); + + VideoSendStream::Config send_config = GetSendTestConfig(call.get()); + send_config.rtp.max_packet_size = kMaxPacketSize; + + RunSendTest(call.get(), send_config, &observer); +} + } // namespace webrtc