Home | History | Annotate | Download | only in pacing
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef MEDIA_CAST_NET_PACING_PACED_SENDER_H_
      6 #define MEDIA_CAST_NET_PACING_PACED_SENDER_H_
      7 
      8 #include <list>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "base/memory/weak_ptr.h"
     14 #include "base/threading/non_thread_safe.h"
     15 #include "base/time/default_tick_clock.h"
     16 #include "base/time/tick_clock.h"
     17 #include "base/time/time.h"
     18 #include "media/cast/cast_config.h"
     19 #include "media/cast/cast_environment.h"
     20 
     21 namespace media {
     22 namespace cast {
     23 
     24 // We have this pure virtual class to enable mocking.
     25 class PacedPacketSender {
     26  public:
     27   // Inform the pacer / sender of the total number of packets.
     28   virtual bool SendPackets(const PacketList& packets) = 0;
     29 
     30   virtual bool ResendPackets(const PacketList& packets) = 0;
     31 
     32   virtual bool SendRtcpPacket(const Packet& packet) = 0;
     33 
     34   virtual ~PacedPacketSender() {}
     35 };
     36 
     37 class PacedSender : public PacedPacketSender,
     38                     public base::NonThreadSafe,
     39                     public base::SupportsWeakPtr<PacedSender> {
     40  public:
     41   PacedSender(scoped_refptr<CastEnvironment> cast_environment,
     42               PacketSender* transport);
     43   virtual ~PacedSender();
     44 
     45   virtual bool SendPackets(const PacketList& packets) OVERRIDE;
     46 
     47   virtual bool ResendPackets(const PacketList& packets) OVERRIDE;
     48 
     49   virtual bool SendRtcpPacket(const Packet& packet) OVERRIDE;
     50 
     51  protected:
     52   // Schedule a delayed task on the main cast thread when it's time to send the
     53   // next packet burst.
     54   void ScheduleNextSend();
     55 
     56   // Process any pending packets in the queue(s).
     57   void SendNextPacketBurst();
     58 
     59  private:
     60   bool SendPacketsToTransport(const PacketList& packets,
     61                               PacketList* packets_not_sent);
     62   void SendStoredPackets();
     63   void UpdateBurstSize(size_t num_of_packets);
     64 
     65   scoped_refptr<CastEnvironment> cast_environment_;
     66   size_t burst_size_;
     67   size_t packets_sent_in_burst_;
     68   base::TimeTicks time_last_process_;
     69   // Note: We can't combine the |packet_list_| and the |resend_packet_list_|
     70   // since then we might get reordering of the retransmitted packets.
     71   PacketList packet_list_;
     72   PacketList resend_packet_list_;
     73   PacketSender* transport_;
     74 
     75   base::WeakPtrFactory<PacedSender> weak_factory_;
     76 
     77   DISALLOW_COPY_AND_ASSIGN(PacedSender);
     78 };
     79 
     80 }  // namespace cast
     81 }  // namespace media
     82 
     83 #endif  // MEDIA_CAST_NET_PACING_PACED_SENDER_H_
     84