1 // Copyright 2014 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.
5 // This class maintains a send transport for audio and video in a Cast
7 // Audio, video frames and RTCP messages are submitted to this object
8 // and then packetized and paced to the underlying UDP socket.
10 // The hierarchy of send transport in a Cast Streaming session:
12 // CastTransportSender RTP RTCP
13 // ------------------------------------------------------------------
14 // TransportEncryptionHandler (A/V)
15 // RtpSender (A/V) Rtcp (A/V)
16 // PacedSender (Shared)
17 // UdpTransport (Shared)
19 // There are objects of TransportEncryptionHandler, RtpSender and Rtcp
20 // for each audio and video stream.
21 // PacedSender and UdpTransport are shared between all RTP and RTCP
24 #ifndef MEDIA_CAST_NET_CAST_TRANSPORT_IMPL_H_
25 #define MEDIA_CAST_NET_CAST_TRANSPORT_IMPL_H_
27 #include "base/callback.h"
28 #include "base/gtest_prod_util.h"
29 #include "base/memory/ref_counted.h"
30 #include "base/memory/scoped_ptr.h"
31 #include "base/memory/weak_ptr.h"
32 #include "base/time/tick_clock.h"
33 #include "base/time/time.h"
34 #include "base/timer/timer.h"
35 #include "media/cast/common/transport_encryption_handler.h"
36 #include "media/cast/logging/logging_defines.h"
37 #include "media/cast/logging/simple_event_subscriber.h"
38 #include "media/cast/net/cast_transport_config.h"
39 #include "media/cast/net/cast_transport_sender.h"
40 #include "media/cast/net/pacing/paced_sender.h"
41 #include "media/cast/net/rtcp/rtcp.h"
42 #include "media/cast/net/rtp/rtp_sender.h"
49 class CastTransportSenderImpl : public CastTransportSender {
51 // |external_transport| is only used for testing.
52 // |raw_events_callback|: Raw events will be returned on this callback
53 // which will be invoked every |raw_events_callback_interval|.
54 // This can be a null callback, i.e. if user is not interested in raw events.
55 // |raw_events_callback_interval|: This can be |base::TimeDelta()| if
56 // |raw_events_callback| is a null callback.
57 // |options| contains optional settings for the transport, possible
59 // "DSCP" (value ignored) - turns DSCP on
60 // "pacer_target_burst_size": int - specifies how many packets to send
62 // "pacer_max_burst_size": int - specifies how many pakcets to send
64 // "disable_wifi_scan" (value ignored) - disable wifi scans while streaming
65 // "media_streaming_mode" (value ignored) - turn media streaming mode on
66 // Note, these options may be ignored on some platforms.
67 CastTransportSenderImpl(
69 base::TickClock* clock,
70 const net::IPEndPoint& remote_end_point,
71 scoped_ptr<base::DictionaryValue> options,
72 const CastTransportStatusCallback& status_callback,
73 const BulkRawEventsCallback& raw_events_callback,
74 base::TimeDelta raw_events_callback_interval,
75 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner,
76 PacketSender* external_transport);
78 virtual ~CastTransportSenderImpl();
80 virtual void InitializeAudio(const CastTransportRtpConfig& config,
81 const RtcpCastMessageCallback& cast_message_cb,
82 const RtcpRttCallback& rtt_cb) OVERRIDE;
83 virtual void InitializeVideo(const CastTransportRtpConfig& config,
84 const RtcpCastMessageCallback& cast_message_cb,
85 const RtcpRttCallback& rtt_cb) OVERRIDE;
86 virtual void InsertFrame(uint32 ssrc, const EncodedFrame& frame) OVERRIDE;
88 virtual void SendSenderReport(
90 base::TimeTicks current_time,
91 uint32 current_time_as_rtp_timestamp) OVERRIDE;
93 virtual void CancelSendingFrames(
95 const std::vector<uint32>& frame_ids) OVERRIDE;
97 virtual void ResendFrameForKickstart(uint32 ssrc, uint32 frame_id) OVERRIDE;
99 virtual PacketReceiverCallback PacketReceiverForTesting() OVERRIDE;
102 FRIEND_TEST_ALL_PREFIXES(CastTransportSenderImplTest, NacksCancelRetransmits);
103 FRIEND_TEST_ALL_PREFIXES(CastTransportSenderImplTest, CancelRetransmits);
104 FRIEND_TEST_ALL_PREFIXES(CastTransportSenderImplTest, Kickstart);
105 FRIEND_TEST_ALL_PREFIXES(CastTransportSenderImplTest,
106 DedupRetransmissionWithAudio);
108 // Resend packets for the stream identified by |ssrc|.
109 // If |cancel_rtx_if_not_in_list| is true then transmission of packets for the
110 // frames but not in the list will be dropped.
111 // See PacedSender::ResendPackets() to see how |dedup_info| works.
112 void ResendPackets(uint32 ssrc,
113 const MissingFramesAndPacketsMap& missing_packets,
114 bool cancel_rtx_if_not_in_list,
115 const DedupInfo& dedup_info);
117 // If |raw_events_callback_| is non-null, calls it with events collected
118 // by |event_subscriber_| since last call.
119 void SendRawEvents();
121 // Called when a packet is received.
122 void OnReceivedPacket(scoped_ptr<Packet> packet);
124 // Called when a log message is received.
125 void OnReceivedLogMessage(EventMediaType media_type,
126 const RtcpReceiverLogMessage& log);
128 // Called when a RTCP Cast message is received.
129 void OnReceivedCastMessage(uint32 ssrc,
130 const RtcpCastMessageCallback& cast_message_cb,
131 const RtcpCastMessage& cast_message);
133 base::TickClock* clock_; // Not owned by this class.
134 CastTransportStatusCallback status_callback_;
135 scoped_refptr<base::SingleThreadTaskRunner> transport_task_runner_;
137 LoggingImpl logging_;
139 // Interface to a UDP socket.
140 scoped_ptr<UdpTransport> transport_;
142 // Packet sender that performs pacing.
145 // Packetizer for audio and video frames.
146 scoped_ptr<RtpSender> audio_sender_;
147 scoped_ptr<RtpSender> video_sender_;
149 // Maintains RTCP session for audio and video.
150 scoped_ptr<Rtcp> audio_rtcp_session_;
151 scoped_ptr<Rtcp> video_rtcp_session_;
153 // Encrypts data in EncodedFrames before they are sent. Note that it's
154 // important for the encryption to happen here, in code that would execute in
155 // the main browser process, for security reasons. This helps to mitigate
156 // the damage that could be caused by a compromised renderer process.
157 TransportEncryptionHandler audio_encryptor_;
158 TransportEncryptionHandler video_encryptor_;
160 // This is non-null iff |raw_events_callback_| is non-null.
161 scoped_ptr<SimpleEventSubscriber> event_subscriber_;
163 BulkRawEventsCallback raw_events_callback_;
164 base::TimeDelta raw_events_callback_interval_;
166 // Right after a frame is sent we record the number of bytes sent to the
167 // socket. We record the corresponding bytes sent for the most recent ACKed
169 int64 last_byte_acked_for_audio_;
171 scoped_ptr<net::ScopedWifiOptions> wifi_options_autoreset_;
173 base::WeakPtrFactory<CastTransportSenderImpl> weak_factory_;
175 DISALLOW_COPY_AND_ASSIGN(CastTransportSenderImpl);
181 #endif // MEDIA_CAST_NET_CAST_TRANSPORT_IMPL_H_