diff options
author | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-08-08 14:30:41 +0200 |
---|---|---|
committer | Jocelyn Turcotte <jocelyn.turcotte@digia.com> | 2014-08-12 13:49:54 +0200 |
commit | ab0a50979b9eb4dfa3320eff7e187e41efedf7a9 (patch) | |
tree | 498dfb8a97ff3361a9f7486863a52bb4e26bb898 /chromium/media/cast/net/pacing | |
parent | 4ce69f7403811819800e7c5ae1318b2647e778d1 (diff) |
Update Chromium to beta version 37.0.2062.68
Change-Id: I188e3b5aff1bec75566014291b654eb19f5bc8ca
Reviewed-by: Andras Becsi <andras.becsi@digia.com>
Diffstat (limited to 'chromium/media/cast/net/pacing')
-rw-r--r-- | chromium/media/cast/net/pacing/mock_paced_packet_sender.cc | 17 | ||||
-rw-r--r-- | chromium/media/cast/net/pacing/mock_paced_packet_sender.h | 27 | ||||
-rw-r--r-- | chromium/media/cast/net/pacing/paced_sender.cc | 148 | ||||
-rw-r--r-- | chromium/media/cast/net/pacing/paced_sender.gyp | 22 | ||||
-rw-r--r-- | chromium/media/cast/net/pacing/paced_sender.h | 83 | ||||
-rw-r--r-- | chromium/media/cast/net/pacing/paced_sender_unittest.cc | 257 |
6 files changed, 0 insertions, 554 deletions
diff --git a/chromium/media/cast/net/pacing/mock_paced_packet_sender.cc b/chromium/media/cast/net/pacing/mock_paced_packet_sender.cc deleted file mode 100644 index 6caf8f6390e..00000000000 --- a/chromium/media/cast/net/pacing/mock_paced_packet_sender.cc +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/cast/net/pacing/mock_paced_packet_sender.h" - -namespace media { -namespace cast { - -MockPacedPacketSender::MockPacedPacketSender() { -} - -MockPacedPacketSender::~MockPacedPacketSender() { -} - -} // namespace cast -} // namespace media diff --git a/chromium/media/cast/net/pacing/mock_paced_packet_sender.h b/chromium/media/cast/net/pacing/mock_paced_packet_sender.h deleted file mode 100644 index 9933516f14c..00000000000 --- a/chromium/media/cast/net/pacing/mock_paced_packet_sender.h +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_CAST_NET_PACING_MOCK_PACED_PACKET_SENDER_H_ -#define MEDIA_CAST_NET_PACING_MOCK_PACED_PACKET_SENDER_H_ - -#include "media/cast/net/pacing/paced_sender.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace media { -namespace cast { - -class MockPacedPacketSender : public PacedPacketSender { - public: - MockPacedPacketSender(); - virtual ~MockPacedPacketSender(); - - MOCK_METHOD1(SendPackets, bool(const PacketList& packets)); - MOCK_METHOD1(ResendPackets, bool(const PacketList& packets)); - MOCK_METHOD1(SendRtcpPacket, bool(const Packet& packet)); -}; - -} // namespace cast -} // namespace media - -#endif // MEDIA_CAST_NET_PACING_MOCK_PACED_PACKET_SENDER_H_ diff --git a/chromium/media/cast/net/pacing/paced_sender.cc b/chromium/media/cast/net/pacing/paced_sender.cc deleted file mode 100644 index 8a07380df0d..00000000000 --- a/chromium/media/cast/net/pacing/paced_sender.cc +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "media/cast/net/pacing/paced_sender.h" - -#include "base/bind.h" -#include "base/message_loop/message_loop.h" - -namespace media { -namespace cast { - -static const int64 kPacingIntervalMs = 10; -// Each frame will be split into no more than kPacingMaxBurstsPerFrame -// bursts of packets. -static const size_t kPacingMaxBurstsPerFrame = 3; - -PacedSender::PacedSender(scoped_refptr<CastEnvironment> cast_environment, - PacketSender* transport) - : cast_environment_(cast_environment), - burst_size_(1), - packets_sent_in_burst_(0), - transport_(transport), - weak_factory_(this) { - ScheduleNextSend(); -} - -PacedSender::~PacedSender() {} - -bool PacedSender::SendPackets(const PacketList& packets) { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - cast_environment_->Logging()->InsertPacketListEvent(kPacketSentToPacer, - packets); - return SendPacketsToTransport(packets, &packet_list_); -} - -bool PacedSender::ResendPackets(const PacketList& packets) { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - cast_environment_->Logging()->InsertPacketListEvent(kPacketRetransmited, - packets); - return SendPacketsToTransport(packets, &resend_packet_list_); -} - -bool PacedSender::SendPacketsToTransport(const PacketList& packets, - PacketList* packets_not_sent) { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - UpdateBurstSize(packets.size()); - - if (!packets_not_sent->empty()) { - packets_not_sent->insert(packets_not_sent->end(), - packets.begin(), packets.end()); - return true; - } - PacketList packets_to_send; - PacketList::const_iterator first_to_store_it = packets.begin(); - - size_t max_packets_to_send_now = burst_size_ - packets_sent_in_burst_; - if (max_packets_to_send_now > 0) { - size_t packets_to_send_now = std::min(max_packets_to_send_now, - packets.size()); - - std::advance(first_to_store_it, packets_to_send_now); - packets_to_send.insert(packets_to_send.begin(), - packets.begin(), first_to_store_it); - } - packets_not_sent->insert(packets_not_sent->end(), - first_to_store_it, packets.end()); - packets_sent_in_burst_ += packets_to_send.size(); - if (packets_to_send.empty()) return true; - - cast_environment_->Logging()->InsertPacketListEvent(kPacketSentToNetwork, - packets); - return transport_->SendPackets(packets_to_send); -} - -bool PacedSender::SendRtcpPacket(const Packet& packet) { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - // We pass the RTCP packets straight through. - return transport_->SendPacket(packet); -} - -void PacedSender::ScheduleNextSend() { - base::TimeDelta time_to_next = time_last_process_ - - cast_environment_->Clock()->NowTicks() + - base::TimeDelta::FromMilliseconds(kPacingIntervalMs); - - time_to_next = std::max(time_to_next, base::TimeDelta()); - - cast_environment_->PostDelayedTask(CastEnvironment::MAIN, FROM_HERE, - base::Bind(&PacedSender::SendNextPacketBurst, weak_factory_.GetWeakPtr()), - time_to_next); -} - -void PacedSender::SendNextPacketBurst() { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - SendStoredPackets(); - time_last_process_ = cast_environment_->Clock()->NowTicks(); - ScheduleNextSend(); -} - -void PacedSender::SendStoredPackets() { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - if (packet_list_.empty() && resend_packet_list_.empty()) return; - - size_t packets_to_send = burst_size_; - PacketList packets_to_resend; - - // Send our re-send packets first. - if (!resend_packet_list_.empty()) { - PacketList::iterator it = resend_packet_list_.begin(); - size_t packets_to_send_now = std::min(packets_to_send, - resend_packet_list_.size()); - std::advance(it, packets_to_send_now); - packets_to_resend.insert(packets_to_resend.begin(), - resend_packet_list_.begin(), it); - resend_packet_list_.erase(resend_packet_list_.begin(), it); - packets_to_send -= packets_to_resend.size(); - } - if (!packet_list_.empty() && packets_to_send > 0) { - PacketList::iterator it = packet_list_.begin(); - size_t packets_to_send_now = std::min(packets_to_send, - packet_list_.size()); - - std::advance(it, packets_to_send_now); - packets_to_resend.insert(packets_to_resend.end(), - packet_list_.begin(), it); - packet_list_.erase(packet_list_.begin(), it); - - if (packet_list_.empty()) { - burst_size_ = 1; // Reset burst size after we sent the last stored packet - packets_sent_in_burst_ = 0; - } - } - transport_->SendPackets(packets_to_resend); -} - -void PacedSender::UpdateBurstSize(size_t packets_to_send) { - DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); - packets_to_send = std::max(packets_to_send, - resend_packet_list_.size() + packet_list_.size()); - - packets_to_send += (kPacingMaxBurstsPerFrame - 1); // Round up. - burst_size_ = std::max(packets_to_send / kPacingMaxBurstsPerFrame, - burst_size_); -} - -} // namespace cast -} // namespace media diff --git a/chromium/media/cast/net/pacing/paced_sender.gyp b/chromium/media/cast/net/pacing/paced_sender.gyp deleted file mode 100644 index 1947dd4ec40..00000000000 --- a/chromium/media/cast/net/pacing/paced_sender.gyp +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright 2013 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -{ - 'targets': [ - { - 'target_name': 'cast_paced_sender', - 'type': 'static_library', - 'include_dirs': [ - '<(DEPTH)/', - ], - 'sources': [ - 'paced_sender.h', - 'paced_sender.cc', - ], - 'dependencies': [ - '<(DEPTH)/base/base.gyp:base', - ], - }, - ], # targets -} diff --git a/chromium/media/cast/net/pacing/paced_sender.h b/chromium/media/cast/net/pacing/paced_sender.h deleted file mode 100644 index 89283257134..00000000000 --- a/chromium/media/cast/net/pacing/paced_sender.h +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef MEDIA_CAST_NET_PACING_PACED_SENDER_H_ -#define MEDIA_CAST_NET_PACING_PACED_SENDER_H_ - -#include <list> -#include <vector> - -#include "base/basictypes.h" -#include "base/memory/scoped_ptr.h" -#include "base/memory/weak_ptr.h" -#include "base/threading/non_thread_safe.h" -#include "base/time/default_tick_clock.h" -#include "base/time/tick_clock.h" -#include "base/time/time.h" -#include "media/cast/cast_config.h" -#include "media/cast/cast_environment.h" - -namespace media { -namespace cast { - -// We have this pure virtual class to enable mocking. -class PacedPacketSender { - public: - // Inform the pacer / sender of the total number of packets. - virtual bool SendPackets(const PacketList& packets) = 0; - - virtual bool ResendPackets(const PacketList& packets) = 0; - - virtual bool SendRtcpPacket(const Packet& packet) = 0; - - virtual ~PacedPacketSender() {} -}; - -class PacedSender : public PacedPacketSender, - public base::NonThreadSafe, - public base::SupportsWeakPtr<PacedSender> { - public: - PacedSender(scoped_refptr<CastEnvironment> cast_environment, - PacketSender* transport); - virtual ~PacedSender(); - - virtual bool SendPackets(const PacketList& packets) OVERRIDE; - - virtual bool ResendPackets(const PacketList& packets) OVERRIDE; - - virtual bool SendRtcpPacket(const Packet& packet) OVERRIDE; - - protected: - // Schedule a delayed task on the main cast thread when it's time to send the - // next packet burst. - void ScheduleNextSend(); - - // Process any pending packets in the queue(s). - void SendNextPacketBurst(); - - private: - bool SendPacketsToTransport(const PacketList& packets, - PacketList* packets_not_sent); - void SendStoredPackets(); - void UpdateBurstSize(size_t num_of_packets); - - scoped_refptr<CastEnvironment> cast_environment_; - size_t burst_size_; - size_t packets_sent_in_burst_; - base::TimeTicks time_last_process_; - // Note: We can't combine the |packet_list_| and the |resend_packet_list_| - // since then we might get reordering of the retransmitted packets. - PacketList packet_list_; - PacketList resend_packet_list_; - PacketSender* transport_; - - base::WeakPtrFactory<PacedSender> weak_factory_; - - DISALLOW_COPY_AND_ASSIGN(PacedSender); -}; - -} // namespace cast -} // namespace media - -#endif // MEDIA_CAST_NET_PACING_PACED_SENDER_H_ diff --git a/chromium/media/cast/net/pacing/paced_sender_unittest.cc b/chromium/media/cast/net/pacing/paced_sender_unittest.cc deleted file mode 100644 index 15b81362f69..00000000000 --- a/chromium/media/cast/net/pacing/paced_sender_unittest.cc +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "base/test/simple_test_tick_clock.h" -#include "media/cast/net/pacing/paced_sender.h" -#include "media/cast/test/fake_task_runner.h" -#include "testing/gmock/include/gmock/gmock.h" - -namespace media { -namespace cast { - -using testing::_; - -static const uint8 kValue = 123; -static const size_t kSize1 = 100; -static const size_t kSize2 = 101; -static const size_t kSize3 = 102; -static const size_t kSize4 = 103; -static const size_t kNackSize = 104; -static const int64 kStartMillisecond = GG_INT64_C(12345678900000); - -class TestPacketSender : public PacketSender { - public: - virtual bool SendPackets(const PacketList& packets) OVERRIDE { - PacketList::const_iterator it = packets.begin(); - for (; it != packets.end(); ++it) { - EXPECT_FALSE(expected_packet_size_.empty()); - size_t expected_packet_size = expected_packet_size_.front(); - expected_packet_size_.pop_front(); - EXPECT_EQ(expected_packet_size, it->size()); - } - return true; - } - - virtual bool SendPacket(const Packet& packet) OVERRIDE { - return true; - } - - void AddExpectedSize(int expected_packet_size, int repeat_count) { - for (int i = 0; i < repeat_count; ++i) { - expected_packet_size_.push_back(expected_packet_size); - } - } - - private: - std::list<int> expected_packet_size_; -}; - -class PacedSenderTest : public ::testing::Test { - protected: - PacedSenderTest() { - testing_clock_.Advance( - base::TimeDelta::FromMilliseconds(kStartMillisecond)); - } - - virtual ~PacedSenderTest() {} - - virtual void SetUp() { - task_runner_ = new test::FakeTaskRunner(&testing_clock_); - cast_environment_ = new CastEnvironment(&testing_clock_, task_runner_, - task_runner_, task_runner_, task_runner_, task_runner_, - GetDefaultCastLoggingConfig()); - paced_sender_.reset(new PacedSender(cast_environment_, &mock_transport_)); - } - - PacketList CreatePacketList(size_t packet_size, int num_of_packets_in_frame) { - PacketList packets; - for (int i = 0; i < num_of_packets_in_frame; ++i) { - packets.push_back(Packet(packet_size, kValue)); - } - return packets; - } - - base::SimpleTestTickClock testing_clock_; - TestPacketSender mock_transport_; - scoped_refptr<test::FakeTaskRunner> task_runner_; - scoped_ptr<PacedSender> paced_sender_; - scoped_refptr<CastEnvironment> cast_environment_; -}; - -TEST_F(PacedSenderTest, PassThroughRtcp) { - mock_transport_.AddExpectedSize(kSize1, 1); - PacketList packets = CreatePacketList(kSize1, 1); - - EXPECT_TRUE(paced_sender_->SendPackets(packets)); - EXPECT_TRUE(paced_sender_->ResendPackets(packets)); - - mock_transport_.AddExpectedSize(kSize2, 1); - EXPECT_TRUE(paced_sender_->SendRtcpPacket(Packet(kSize2, kValue))); -} - -TEST_F(PacedSenderTest, BasicPace) { - int num_of_packets = 9; - PacketList packets = CreatePacketList(kSize1, num_of_packets); - - mock_transport_.AddExpectedSize(kSize1, 3); - EXPECT_TRUE(paced_sender_->SendPackets(packets)); - - // Check that we get the next burst. - mock_transport_.AddExpectedSize(kSize1, 3); - - base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); - - // If we call process too early make sure we don't send any packets. - timeout = base::TimeDelta::FromMilliseconds(5); - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); - - // Check that we get the next burst. - mock_transport_.AddExpectedSize(kSize1, 3); - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); - - // Check that we don't get any more packets. - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); -} - -TEST_F(PacedSenderTest, PaceWithNack) { - // Testing what happen when we get multiple NACK requests for a fully lost - // frames just as we sent the first packets in a frame. - int num_of_packets_in_frame = 9; - int num_of_packets_in_nack = 9; - - PacketList first_frame_packets = - CreatePacketList(kSize1, num_of_packets_in_frame); - - PacketList second_frame_packets = - CreatePacketList(kSize2, num_of_packets_in_frame); - - PacketList nack_packets = - CreatePacketList(kNackSize, num_of_packets_in_nack); - - // Check that the first burst of the frame go out on the wire. - mock_transport_.AddExpectedSize(kSize1, 3); - EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); - - // Add first NACK request. - EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets)); - - // Check that we get the first NACK burst. - mock_transport_.AddExpectedSize(kNackSize, 5); - base::TimeDelta timeout = base::TimeDelta::FromMilliseconds(10); - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); - - // Add second NACK request. - EXPECT_TRUE(paced_sender_->ResendPackets(nack_packets)); - - // Check that we get the next NACK burst. - mock_transport_.AddExpectedSize(kNackSize, 7); - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); - - // End of NACK plus a packet from the oldest frame. - mock_transport_.AddExpectedSize(kNackSize, 6); - mock_transport_.AddExpectedSize(kSize1, 1); - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); - - // Add second frame. - // Make sure we don't delay the second frame due to the previous packets. - EXPECT_TRUE(paced_sender_->SendPackets(second_frame_packets)); - - // Last packets of frame 1 and the first packets of frame 2. - mock_transport_.AddExpectedSize(kSize1, 5); - mock_transport_.AddExpectedSize(kSize2, 2); - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); - - // Last packets of frame 2. - mock_transport_.AddExpectedSize(kSize2, 7); - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); - - // No more packets. - testing_clock_.Advance(timeout); - task_runner_->RunTasks(); -} - -TEST_F(PacedSenderTest, PaceWith60fps) { - // Testing what happen when we get multiple NACK requests for a fully lost - // frames just as we sent the first packets in a frame. - int num_of_packets_in_frame = 9; - - PacketList first_frame_packets = - CreatePacketList(kSize1, num_of_packets_in_frame); - - PacketList second_frame_packets = - CreatePacketList(kSize2, num_of_packets_in_frame); - - PacketList third_frame_packets = - CreatePacketList(kSize3, num_of_packets_in_frame); - - PacketList fourth_frame_packets = - CreatePacketList(kSize4, num_of_packets_in_frame); - - base::TimeDelta timeout_10ms = base::TimeDelta::FromMilliseconds(10); - - // Check that the first burst of the frame go out on the wire. - mock_transport_.AddExpectedSize(kSize1, 3); - EXPECT_TRUE(paced_sender_->SendPackets(first_frame_packets)); - - mock_transport_.AddExpectedSize(kSize1, 3); - testing_clock_.Advance(timeout_10ms); - task_runner_->RunTasks(); - - testing_clock_.Advance(base::TimeDelta::FromMilliseconds(6)); - - // Add second frame, after 16 ms. - EXPECT_TRUE(paced_sender_->SendPackets(second_frame_packets)); - testing_clock_.Advance(base::TimeDelta::FromMilliseconds(4)); - - mock_transport_.AddExpectedSize(kSize1, 3); - mock_transport_.AddExpectedSize(kSize2, 1); - testing_clock_.Advance(timeout_10ms); - task_runner_->RunTasks(); - - mock_transport_.AddExpectedSize(kSize2, 4); - testing_clock_.Advance(timeout_10ms); - task_runner_->RunTasks(); - - testing_clock_.Advance(base::TimeDelta::FromMilliseconds(3)); - - // Add third frame, after 33 ms. - EXPECT_TRUE(paced_sender_->SendPackets(third_frame_packets)); - mock_transport_.AddExpectedSize(kSize2, 4); - mock_transport_.AddExpectedSize(kSize3, 1); - - testing_clock_.Advance(base::TimeDelta::FromMilliseconds(7)); - task_runner_->RunTasks(); - - // Add fourth frame, after 50 ms. - EXPECT_TRUE(paced_sender_->SendPackets(fourth_frame_packets)); - - mock_transport_.AddExpectedSize(kSize3, 6); - testing_clock_.Advance(timeout_10ms); - task_runner_->RunTasks(); - - mock_transport_.AddExpectedSize(kSize3, 2); - mock_transport_.AddExpectedSize(kSize4, 4); - testing_clock_.Advance(timeout_10ms); - task_runner_->RunTasks(); - - mock_transport_.AddExpectedSize(kSize4, 5); - testing_clock_.Advance(timeout_10ms); - task_runner_->RunTasks(); - - testing_clock_.Advance(timeout_10ms); - task_runner_->RunTasks(); -} - -} // namespace cast -} // namespace media |