Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(923)

Side by Side Diff: media/cast/transport/pacing/paced_sender.h

Issue 248493002: Cast: Deduplicate packets in paced sender and always send older packets first (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_ 5 #ifndef MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_
6 #define MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_ 6 #define MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_
7 7
8 #include <list> 8 #include <list>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/memory/weak_ptr.h" 13 #include "base/memory/weak_ptr.h"
14 #include "base/single_thread_task_runner.h" 14 #include "base/single_thread_task_runner.h"
15 #include "base/threading/non_thread_safe.h" 15 #include "base/threading/non_thread_safe.h"
16 #include "base/time/default_tick_clock.h" 16 #include "base/time/default_tick_clock.h"
17 #include "base/time/tick_clock.h" 17 #include "base/time/tick_clock.h"
18 #include "base/time/time.h" 18 #include "base/time/time.h"
19 #include "media/cast/transport/cast_transport_config.h" 19 #include "media/cast/transport/cast_transport_config.h"
20 #include "media/cast/transport/transport/udp_transport.h" 20 #include "media/cast/transport/transport/udp_transport.h"
21 21
22 namespace media { 22 namespace media {
23 namespace cast { 23 namespace cast {
24 24
25 class LoggingImpl; 25 class LoggingImpl;
26 26
27 namespace transport { 27 namespace transport {
28 28
29 // Use std::pair for free comparison operators.
30 // { capture_time, ssrc, packet_id }
31 typedef std::pair<base::TimeTicks, std::pair<unsigned int, uint16> > PacketKey;
miu 2014/04/24 00:09:06 ssrc is defined as uint32 in other parts of the co
miu 2014/04/24 00:09:06 I'm wondering whether PacketKey should be in cast_
hubbe 2014/04/24 18:36:42 I don't think so. The sort order is specific to th
hubbe 2014/04/24 18:36:42 Done.
32 typedef std::vector<std::pair<PacketKey, PacketRef> > SendPacketVector;
33
29 // We have this pure virtual class to enable mocking. 34 // We have this pure virtual class to enable mocking.
30 class PacedPacketSender { 35 class PacedPacketSender {
31 public: 36 public:
32 // Inform the pacer / sender of the total number of packets. 37 virtual bool SendPackets(const SendPacketVector& packets) = 0;
33 virtual bool SendPackets(const PacketList& packets) = 0; 38 virtual bool ResendPackets(const SendPacketVector& packets) = 0;
34 virtual bool ResendPackets(const PacketList& packets) = 0; 39 virtual bool SendRtcpPacket(unsigned int ssrc, PacketRef packet) = 0;
35 virtual bool SendRtcpPacket(PacketRef packet) = 0;
36 40
37 virtual ~PacedPacketSender() {} 41 virtual ~PacedPacketSender() {}
42
43 static PacketKey MakePacketKey(const base::TimeTicks& ticks,
44 unsigned int ssrc,
45 uint16 packet_id);
38 }; 46 };
39 47
40 class PacedSender : public PacedPacketSender, 48 class PacedSender : public PacedPacketSender,
41 public base::NonThreadSafe, 49 public base::NonThreadSafe,
42 public base::SupportsWeakPtr<PacedSender> { 50 public base::SupportsWeakPtr<PacedSender> {
43 public: 51 public:
44 // The |external_transport| should only be used by the Cast receiver and for 52 // The |external_transport| should only be used by the Cast receiver and for
45 // testing. 53 // testing.
46 PacedSender( 54 PacedSender(
47 base::TickClock* clock, 55 base::TickClock* clock,
48 LoggingImpl* logging, 56 LoggingImpl* logging,
49 PacketSender* external_transport, 57 PacketSender* external_transport,
50 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner); 58 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner);
51 59
52 virtual ~PacedSender(); 60 virtual ~PacedSender();
53 61
54 // These must be called before non-RTCP packets are sent. 62 // These must be called before non-RTCP packets are sent.
55 void RegisterAudioSsrc(uint32 audio_ssrc); 63 void RegisterAudioSsrc(uint32 audio_ssrc);
56 void RegisterVideoSsrc(uint32 video_ssrc); 64 void RegisterVideoSsrc(uint32 video_ssrc);
57 65
58 // PacedPacketSender implementation. 66 // PacedPacketSender implementation.
59 virtual bool SendPackets(const PacketList& packets) OVERRIDE; 67 virtual bool SendPackets(const SendPacketVector& packets) OVERRIDE;
60 virtual bool ResendPackets(const PacketList& packets) OVERRIDE; 68 virtual bool ResendPackets(const SendPacketVector& packets) OVERRIDE;
61 virtual bool SendRtcpPacket(PacketRef packet) OVERRIDE; 69 virtual bool SendRtcpPacket(unsigned int ssrc, PacketRef packet) OVERRIDE;
62 70
63 private: 71 private:
64 // Actually sends the packets to the transport. 72 // Actually sends the packets to the transport.
65 void SendStoredPackets(); 73 void SendStoredPackets();
66 void LogPacketEvent(const Packet& packet, bool retransmit); 74 void LogPacketEvent(const Packet& packet, bool retransmit);
67 75
68 enum PacketType { 76 enum PacketType {
69 PacketType_RTCP, 77 PacketType_RTCP,
70 PacketType_Resend, 78 PacketType_Resend,
71 PacketType_Normal 79 PacketType_Normal
(...skipping 21 matching lines...) Expand all
93 // resend packets have second highest priority and then comes everything 101 // resend packets have second highest priority and then comes everything
94 // else. 102 // else.
95 PacketRef GetNextPacket(PacketType* packet_type); 103 PacketRef GetNextPacket(PacketType* packet_type);
96 104
97 base::TickClock* const clock_; // Not owned by this class. 105 base::TickClock* const clock_; // Not owned by this class.
98 LoggingImpl* const logging_; // Not owned by this class. 106 LoggingImpl* const logging_; // Not owned by this class.
99 PacketSender* transport_; // Not owned by this class. 107 PacketSender* transport_; // Not owned by this class.
100 scoped_refptr<base::SingleThreadTaskRunner> transport_task_runner_; 108 scoped_refptr<base::SingleThreadTaskRunner> transport_task_runner_;
101 uint32 audio_ssrc_; 109 uint32 audio_ssrc_;
102 uint32 video_ssrc_; 110 uint32 video_ssrc_;
103 // Note: We can't combine the |packet_list_| and the |resend_packet_list_| 111 std::map<PacketKey, std::pair<PacketType, PacketRef> > packet_list_;
miu 2014/04/24 00:09:06 nit: Maybe comment here (or above, where PacketKey
hubbe 2014/04/24 18:36:42 Done.
104 // since then we might get reordering of the retransmitted packets.
105 std::deque<PacketRef> rtcp_packet_list_;
106 std::deque<PacketRef> resend_packet_list_;
107 std::deque<PacketRef> packet_list_;
108 112
109 // Maximum burst size for the next three bursts. 113 // Maximum burst size for the next three bursts.
110 size_t max_burst_size_; 114 size_t max_burst_size_;
111 size_t next_max_burst_size_; 115 size_t next_max_burst_size_;
112 size_t next_next_max_burst_size_; 116 size_t next_next_max_burst_size_;
113 // Number of packets already sent in the current burst. 117 // Number of packets already sent in the current burst.
114 size_t current_burst_size_; 118 size_t current_burst_size_;
115 // This is when the current burst ends. 119 // This is when the current burst ends.
116 base::TimeTicks burst_end_; 120 base::TimeTicks burst_end_;
117 121
118 State state_; 122 State state_;
119 123
120 // NOTE: Weak pointers must be invalidated before all other member variables. 124 // NOTE: Weak pointers must be invalidated before all other member variables.
121 base::WeakPtrFactory<PacedSender> weak_factory_; 125 base::WeakPtrFactory<PacedSender> weak_factory_;
122 126
123 DISALLOW_COPY_AND_ASSIGN(PacedSender); 127 DISALLOW_COPY_AND_ASSIGN(PacedSender);
124 }; 128 };
125 129
126 } // namespace transport 130 } // namespace transport
127 } // namespace cast 131 } // namespace cast
128 } // namespace media 132 } // namespace media
129 133
130 #endif // MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_ 134 #endif // MEDIA_CAST_TRANSPORT_PACING_PACED_SENDER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698