summaryrefslogtreecommitdiffstats
path: root/chromium/media/cast/net/pacing
diff options
context:
space:
mode:
authorJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-08-08 14:30:41 +0200
committerJocelyn Turcotte <jocelyn.turcotte@digia.com>2014-08-12 13:49:54 +0200
commitab0a50979b9eb4dfa3320eff7e187e41efedf7a9 (patch)
tree498dfb8a97ff3361a9f7486863a52bb4e26bb898 /chromium/media/cast/net/pacing
parent4ce69f7403811819800e7c5ae1318b2647e778d1 (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.cc17
-rw-r--r--chromium/media/cast/net/pacing/mock_paced_packet_sender.h27
-rw-r--r--chromium/media/cast/net/pacing/paced_sender.cc148
-rw-r--r--chromium/media/cast/net/pacing/paced_sender.gyp22
-rw-r--r--chromium/media/cast/net/pacing/paced_sender.h83
-rw-r--r--chromium/media/cast/net/pacing/paced_sender_unittest.cc257
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