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_SENDER_IMPL_H_
25 #define MEDIA_CAST_NET_CAST_TRANSPORT_SENDER_IMPL_H_
29 #include "base/callback.h"
30 #include "base/gtest_prod_util.h"
31 #include "base/memory/ref_counted.h"
32 #include "base/memory/scoped_ptr.h"
33 #include "base/memory/weak_ptr.h"
34 #include "base/time/tick_clock.h"
35 #include "base/time/time.h"
36 #include "media/cast/common/transport_encryption_handler.h"
37 #include "media/cast/logging/logging_defines.h"
38 #include "media/cast/logging/simple_event_subscriber.h"
39 #include "media/cast/net/cast_transport_config.h"
40 #include "media/cast/net/cast_transport_sender.h"
41 #include "media/cast/net/pacing/paced_sender.h"
42 #include "media/cast/net/rtcp/rtcp.h"
43 #include "media/cast/net/rtp/rtp_parser.h"
44 #include "media/cast/net/rtp/rtp_sender.h"
45 #include "net/base/network_interfaces.h"
52 class CastTransportSenderImpl
: public CastTransportSender
{
54 // |external_transport| is only used for testing.
55 // |raw_events_callback|: Raw events will be returned on this callback
56 // which will be invoked every |raw_events_callback_interval|.
57 // This can be a null callback, i.e. if user is not interested in raw events.
58 // |raw_events_callback_interval|: This can be |base::TimeDelta()| if
59 // |raw_events_callback| is a null callback.
60 // |options| contains optional settings for the transport, possible
62 // "DSCP" (value ignored) - turns DSCP on
63 // "non_blocking_io" (value ignored) - Windows only.
64 // Turns on non-blocking IO for socket.
65 // "pacer_target_burst_size": int - specifies how many packets to send
67 // "pacer_max_burst_size": int - specifies how many pakcets to send
69 // "send_buffer_min_size": int - specifies the minimum socket send buffer
71 // "disable_wifi_scan" (value ignored) - disable wifi scans while streaming
72 // "media_streaming_mode" (value ignored) - turn media streaming mode on
73 // Note, these options may be ignored on some platforms.
74 // TODO(hubbe): Too many callbacks, replace with an interface.
75 CastTransportSenderImpl(
77 base::TickClock
* clock
,
78 const net::IPEndPoint
& local_end_point
,
79 const net::IPEndPoint
& remote_end_point
,
80 scoped_ptr
<base::DictionaryValue
> options
,
81 const CastTransportStatusCallback
& status_callback
,
82 const BulkRawEventsCallback
& raw_events_callback
,
83 base::TimeDelta raw_events_callback_interval
,
84 const scoped_refptr
<base::SingleThreadTaskRunner
>& transport_task_runner
,
85 const PacketReceiverCallback
& packet_callback
,
86 PacketSender
* external_transport
);
88 ~CastTransportSenderImpl() final
;
90 // CastTransportSender implementation.
91 void InitializeAudio(const CastTransportRtpConfig
& config
,
92 const RtcpCastMessageCallback
& cast_message_cb
,
93 const RtcpRttCallback
& rtt_cb
) final
;
94 void InitializeVideo(const CastTransportRtpConfig
& config
,
95 const RtcpCastMessageCallback
& cast_message_cb
,
96 const RtcpRttCallback
& rtt_cb
) final
;
97 void InsertFrame(uint32 ssrc
, const EncodedFrame
& frame
) final
;
99 void SendSenderReport(uint32 ssrc
,
100 base::TimeTicks current_time
,
101 uint32 current_time_as_rtp_timestamp
) final
;
103 void CancelSendingFrames(uint32 ssrc
,
104 const std::vector
<uint32
>& frame_ids
) final
;
106 void ResendFrameForKickstart(uint32 ssrc
, uint32 frame_id
) final
;
108 PacketReceiverCallback
PacketReceiverForTesting() final
;
110 // CastTransportReceiver implementation.
111 void AddValidSsrc(uint32 ssrc
) final
;
113 void SendRtcpFromRtpReceiver(
116 const RtcpTimeData
& time_data
,
117 const RtcpCastMessage
* cast_message
,
118 base::TimeDelta target_delay
,
119 const ReceiverRtcpEventSubscriber::RtcpEvents
* rtcp_events
,
120 const RtpReceiverStatistics
* rtp_receiver_statistics
) final
;
123 FRIEND_TEST_ALL_PREFIXES(CastTransportSenderImplTest
, NacksCancelRetransmits
);
124 FRIEND_TEST_ALL_PREFIXES(CastTransportSenderImplTest
, CancelRetransmits
);
125 FRIEND_TEST_ALL_PREFIXES(CastTransportSenderImplTest
, Kickstart
);
126 FRIEND_TEST_ALL_PREFIXES(CastTransportSenderImplTest
,
127 DedupRetransmissionWithAudio
);
129 // Resend packets for the stream identified by |ssrc|.
130 // If |cancel_rtx_if_not_in_list| is true then transmission of packets for the
131 // frames but not in the list will be dropped.
132 // See PacedSender::ResendPackets() to see how |dedup_info| works.
133 void ResendPackets(uint32 ssrc
,
134 const MissingFramesAndPacketsMap
& missing_packets
,
135 bool cancel_rtx_if_not_in_list
,
136 const DedupInfo
& dedup_info
);
138 // If |raw_events_callback_| is non-null, calls it with events collected
139 // by |event_subscriber_| since last call.
140 void SendRawEvents();
142 // Called when a packet is received.
143 bool OnReceivedPacket(scoped_ptr
<Packet
> packet
);
145 // Called when a log message is received.
146 void OnReceivedLogMessage(EventMediaType media_type
,
147 const RtcpReceiverLogMessage
& log
);
149 // Called when a RTCP Cast message is received.
150 void OnReceivedCastMessage(uint32 ssrc
,
151 const RtcpCastMessageCallback
& cast_message_cb
,
152 const RtcpCastMessage
& cast_message
);
154 base::TickClock
* clock_
; // Not owned by this class.
155 CastTransportStatusCallback status_callback_
;
156 scoped_refptr
<base::SingleThreadTaskRunner
> transport_task_runner_
;
158 LoggingImpl logging_
;
160 // Interface to a UDP socket.
161 scoped_ptr
<UdpTransport
> transport_
;
163 // Packet sender that performs pacing.
166 // Packetizer for audio and video frames.
167 scoped_ptr
<RtpSender
> audio_sender_
;
168 scoped_ptr
<RtpSender
> video_sender_
;
170 // Maintains RTCP session for audio and video.
171 scoped_ptr
<Rtcp
> audio_rtcp_session_
;
172 scoped_ptr
<Rtcp
> video_rtcp_session_
;
174 // Encrypts data in EncodedFrames before they are sent. Note that it's
175 // important for the encryption to happen here, in code that would execute in
176 // the main browser process, for security reasons. This helps to mitigate
177 // the damage that could be caused by a compromised renderer process.
178 TransportEncryptionHandler audio_encryptor_
;
179 TransportEncryptionHandler video_encryptor_
;
181 // This is non-null iff |raw_events_callback_| is non-null.
182 scoped_ptr
<SimpleEventSubscriber
> event_subscriber_
;
184 BulkRawEventsCallback raw_events_callback_
;
185 base::TimeDelta raw_events_callback_interval_
;
187 // Right after a frame is sent we record the number of bytes sent to the
188 // socket. We record the corresponding bytes sent for the most recent ACKed
190 int64 last_byte_acked_for_audio_
;
192 // Packets that don't match these ssrcs are ignored.
193 std::set
<uint32
> valid_ssrcs_
;
195 // Called with incoming packets. (Unless they match the
196 // channels created by Initialize{Audio,Video}.
197 PacketReceiverCallback packet_callback_
;
199 scoped_ptr
<net::ScopedWifiOptions
> wifi_options_autoreset_
;
201 base::WeakPtrFactory
<CastTransportSenderImpl
> weak_factory_
;
203 DISALLOW_COPY_AND_ASSIGN(CastTransportSenderImpl
);
209 #endif // MEDIA_CAST_NET_CAST_TRANSPORT_SENDER_IMPL_H_