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

Side by Side Diff: media/cast/net/cast_transport_sender_impl.cc

Issue 1515023002: Simplify interface for media/cast: CastTransportSenderImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: New version: move creating UdpTransport out and use setters for options. Created 4 years, 11 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 2014 The Chromium Authors. All rights reserved. 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 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 #include "media/cast/net/cast_transport_sender_impl.h" 5 #include "media/cast/net/cast_transport_sender_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <algorithm> 8 #include <algorithm>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
11 11
12 #include "base/single_thread_task_runner.h" 12 #include "base/single_thread_task_runner.h"
13 #include "base/values.h"
14 #include "build/build_config.h" 13 #include "build/build_config.h"
15 #include "media/cast/net/cast_transport_defines.h" 14 #include "media/cast/net/cast_transport_defines.h"
16 #include "media/cast/net/rtcp/receiver_rtcp_session.h" 15 #include "media/cast/net/rtcp/receiver_rtcp_session.h"
17 #include "media/cast/net/rtcp/sender_rtcp_session.h" 16 #include "media/cast/net/rtcp/sender_rtcp_session.h"
18 #include "media/cast/net/udp_transport.h"
19 #include "net/base/net_errors.h" 17 #include "net/base/net_errors.h"
20 #include "net/base/network_interfaces.h"
21 18
22 namespace media { 19 namespace media {
23 namespace cast { 20 namespace cast {
24 21
25 namespace { 22 namespace {
26 23
27 // See header file for what these mean.
28 const char kOptionDscp[] = "DSCP";
29 #if defined(OS_WIN)
30 const char kOptionDisableNonBlockingIO[] = "disable_non_blocking_io";
31 #endif
32 const char kOptionPacerTargetBurstSize[] = "pacer_target_burst_size";
33 const char kOptionPacerMaxBurstSize[] = "pacer_max_burst_size";
34 const char kOptionSendBufferMinSize[] = "send_buffer_min_size";
35 const char kOptionWifiDisableScan[] = "disable_wifi_scan";
36 const char kOptionWifiMediaStreamingMode[] = "media_streaming_mode";
37
38 int LookupOptionWithDefault(const base::DictionaryValue& options,
39 const std::string& path,
40 int default_value) {
41 int ret;
42 if (options.GetInteger(path, &ret)) {
43 return ret;
44 } else {
45 return default_value;
46 }
47 }
48
49 int32_t GetTransportSendBufferSize(const base::DictionaryValue& options) {
50 // Socket send buffer size needs to be at least greater than one burst
51 // size.
52 int32_t max_burst_size =
53 LookupOptionWithDefault(options, kOptionPacerMaxBurstSize,
54 kMaxBurstSize) *
55 kMaxIpPacketSize;
56 int32_t min_send_buffer_size =
57 LookupOptionWithDefault(options, kOptionSendBufferMinSize, 0);
58 return std::max(max_burst_size, min_send_buffer_size);
59 }
60 24
61 } // namespace 25 } // namespace
62 26
63 scoped_ptr<CastTransportSender> CastTransportSender::Create( 27 scoped_ptr<CastTransportSender> CastTransportSender::Create(
64 net::NetLog* net_log, 28 base::TickClock* clock, // Owned by the caller.
65 base::TickClock* clock, 29 base::TimeDelta logging_flush_interval,
66 const net::IPEndPoint& local_end_point, 30 scoped_ptr<Client> client,
67 const net::IPEndPoint& remote_end_point, 31 scoped_ptr<PacketSender> transport,
68 scoped_ptr<base::DictionaryValue> options,
69 const CastTransportStatusCallback& status_callback,
70 const BulkRawEventsCallback& raw_events_callback,
71 base::TimeDelta raw_events_callback_interval,
72 const PacketReceiverCallback& packet_callback,
73 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) { 32 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) {
74 return scoped_ptr<CastTransportSender>(new CastTransportSenderImpl( 33 return scoped_ptr<CastTransportSender>(new CastTransportSenderImpl(
75 net_log, clock, local_end_point, remote_end_point, std::move(options), 34 clock, logging_flush_interval, std::move(client), std::move(transport),
76 status_callback, raw_events_callback, raw_events_callback_interval, 35 transport_task_runner.get()));
77 transport_task_runner.get(), packet_callback, NULL));
78 } 36 }
79 37
80 PacketReceiverCallback CastTransportSender::PacketReceiverForTesting() { 38 PacketReceiverCallback CastTransportSender::PacketReceiverForTesting() {
81 return PacketReceiverCallback(); 39 return PacketReceiverCallback();
82 } 40 }
83 41
84 CastTransportSenderImpl::CastTransportSenderImpl( 42 CastTransportSenderImpl::CastTransportSenderImpl(
85 net::NetLog* net_log,
86 base::TickClock* clock, 43 base::TickClock* clock,
87 const net::IPEndPoint& local_end_point, 44 base::TimeDelta logging_flush_interval,
88 const net::IPEndPoint& remote_end_point, 45 scoped_ptr<Client> client,
89 scoped_ptr<base::DictionaryValue> options, 46 scoped_ptr<PacketSender> transport,
90 const CastTransportStatusCallback& status_callback, 47 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner)
91 const BulkRawEventsCallback& raw_events_callback,
92 base::TimeDelta raw_events_callback_interval,
93 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner,
94 const PacketReceiverCallback& packet_callback,
95 PacketSender* external_transport)
96 : clock_(clock), 48 : clock_(clock),
97 status_callback_(status_callback), 49 logging_flush_interval_(logging_flush_interval),
50 transport_client_(std::move(client)),
51 transport_(std::move(transport)),
98 transport_task_runner_(transport_task_runner), 52 transport_task_runner_(transport_task_runner),
99 transport_(external_transport 53 pacer_(kTargetBurstSize,
100 ? nullptr 54 kMaxBurstSize,
101 : new UdpTransport(net_log,
102 transport_task_runner,
103 local_end_point,
104 remote_end_point,
105 GetTransportSendBufferSize(*options),
106 status_callback)),
107 pacer_(LookupOptionWithDefault(*options,
108 kOptionPacerTargetBurstSize,
109 kTargetBurstSize),
110 LookupOptionWithDefault(*options,
111 kOptionPacerMaxBurstSize,
112 kMaxBurstSize),
113 clock, 55 clock,
114 raw_events_callback.is_null() ? nullptr : &recent_packet_events_, 56 logging_flush_interval > base::TimeDelta() ? &recent_packet_events_
115 external_transport ? external_transport : transport_.get(), 57 : nullptr,
58 transport_.get(),
116 transport_task_runner), 59 transport_task_runner),
117 raw_events_callback_(raw_events_callback),
118 raw_events_callback_interval_(raw_events_callback_interval),
119 last_byte_acked_for_audio_(0), 60 last_byte_acked_for_audio_(0),
120 packet_callback_(packet_callback),
121 weak_factory_(this) { 61 weak_factory_(this) {
122 DCHECK(clock_); 62 DCHECK(clock);
miu 2016/01/27 02:18:04 Since the whole class assumes |transport_client_|,
xjz 2016/01/30 01:19:26 Done.
123 if (!raw_events_callback_.is_null()) { 63 if (logging_flush_interval_ > base::TimeDelta()) {
124 DCHECK(raw_events_callback_interval > base::TimeDelta()); 64 transport_task_runner_->PostDelayedTask(
125 transport_task_runner->PostDelayedTask( 65 FROM_HERE, base::Bind(&CastTransportSenderImpl::SendRawEvents,
126 FROM_HERE, 66 weak_factory_.GetWeakPtr()),
127 base::Bind(&CastTransportSenderImpl::SendRawEvents, 67 logging_flush_interval_);
128 weak_factory_.GetWeakPtr()),
129 raw_events_callback_interval);
130 } 68 }
131 if (transport_) { 69 transport_->StartReceiving(base::Bind(
132 if (options->HasKey(kOptionDscp)) { 70 &CastTransportSenderImpl::OnReceivedPacket, base::Unretained(this)));
133 // The default DSCP value for cast is AF41. Which gives it a higher
134 // priority over other traffic.
135 transport_->SetDscp(net::DSCP_AF41);
136 }
137 #if defined(OS_WIN)
138 if (!options->HasKey(kOptionDisableNonBlockingIO)) {
139 transport_->UseNonBlockingIO();
140 }
141 #endif
142 transport_->StartReceiving(
143 base::Bind(&CastTransportSenderImpl::OnReceivedPacket,
144 base::Unretained(this)));
145 int wifi_options = 0;
146 if (options->HasKey(kOptionWifiDisableScan)) {
147 wifi_options |= net::WIFI_OPTIONS_DISABLE_SCAN;
148 }
149 if (options->HasKey(kOptionWifiMediaStreamingMode)) {
150 wifi_options |= net::WIFI_OPTIONS_MEDIA_STREAMING_MODE;
151 }
152 if (wifi_options) {
153 wifi_options_autoreset_ = net::SetWifiOptions(wifi_options);
154 }
155 }
156 } 71 }
157 72
158 CastTransportSenderImpl::~CastTransportSenderImpl() { 73 CastTransportSenderImpl::~CastTransportSenderImpl() {
159 if (transport_) { 74 transport_->StopReceiving();
160 transport_->StopReceiving();
161 }
162 } 75 }
163 76
164 void CastTransportSenderImpl::InitializeAudio( 77 void CastTransportSenderImpl::InitializeAudio(
165 const CastTransportRtpConfig& config, 78 const CastTransportRtpConfig& config,
166 const RtcpCastMessageCallback& cast_message_cb, 79 const RtcpCastMessageCallback& cast_message_cb,
167 const RtcpRttCallback& rtt_cb) { 80 const RtcpRttCallback& rtt_cb) {
168 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) 81 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
169 << "Unsafe to send audio with encryption DISABLED."; 82 << "Unsafe to send audio with encryption DISABLED.";
170 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { 83 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
171 status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); 84 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED);
172 return; 85 return;
173 } 86 }
174 87
175 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); 88 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_));
176 if (audio_sender_->Initialize(config)) { 89 if (audio_sender_->Initialize(config)) {
177 // Audio packets have a higher priority. 90 // Audio packets have a higher priority.
178 pacer_.RegisterAudioSsrc(config.ssrc); 91 pacer_.RegisterAudioSsrc(config.ssrc);
179 pacer_.RegisterPrioritySsrc(config.ssrc); 92 pacer_.RegisterPrioritySsrc(config.ssrc);
180 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); 93 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED);
181 } else { 94 } else {
182 audio_sender_.reset(); 95 audio_sender_.reset();
183 status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); 96 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED);
184 return; 97 return;
185 } 98 }
186 99
187 audio_rtcp_session_.reset(new SenderRtcpSession( 100 audio_rtcp_session_.reset(new SenderRtcpSession(
188 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, 101 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
189 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), 102 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb),
190 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, 103 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
191 weak_factory_.GetWeakPtr(), AUDIO_EVENT), 104 weak_factory_.GetWeakPtr(), AUDIO_EVENT),
192 clock_, &pacer_, config.ssrc, config.feedback_ssrc)); 105 clock_, &pacer_, config.ssrc, config.feedback_ssrc));
193 pacer_.RegisterAudioSsrc(config.ssrc); 106 pacer_.RegisterAudioSsrc(config.ssrc);
194 AddValidSsrc(config.feedback_ssrc); 107 AddValidSsrc(config.feedback_ssrc);
195 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); 108 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED);
196 } 109 }
197 110
198 void CastTransportSenderImpl::InitializeVideo( 111 void CastTransportSenderImpl::InitializeVideo(
199 const CastTransportRtpConfig& config, 112 const CastTransportRtpConfig& config,
200 const RtcpCastMessageCallback& cast_message_cb, 113 const RtcpCastMessageCallback& cast_message_cb,
201 const RtcpRttCallback& rtt_cb) { 114 const RtcpRttCallback& rtt_cb) {
202 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) 115 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
203 << "Unsafe to send video with encryption DISABLED."; 116 << "Unsafe to send video with encryption DISABLED.";
204 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { 117 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
205 status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); 118 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED);
206 return; 119 return;
207 } 120 }
208 121
209 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); 122 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_));
210 if (!video_sender_->Initialize(config)) { 123 if (!video_sender_->Initialize(config)) {
211 video_sender_.reset(); 124 video_sender_.reset();
212 status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); 125 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED);
213 return; 126 return;
214 } 127 }
215 128
216 video_rtcp_session_.reset(new SenderRtcpSession( 129 video_rtcp_session_.reset(new SenderRtcpSession(
217 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, 130 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
218 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), 131 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb),
219 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, 132 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
220 weak_factory_.GetWeakPtr(), VIDEO_EVENT), 133 weak_factory_.GetWeakPtr(), VIDEO_EVENT),
221 clock_, &pacer_, config.ssrc, config.feedback_ssrc)); 134 clock_, &pacer_, config.ssrc, config.feedback_ssrc));
222 pacer_.RegisterVideoSsrc(config.ssrc); 135 pacer_.RegisterVideoSsrc(config.ssrc);
223 AddValidSsrc(config.feedback_ssrc); 136 AddValidSsrc(config.feedback_ssrc);
224 status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED); 137 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED);
225 } 138 }
226 139
227 namespace { 140 namespace {
228 void EncryptAndSendFrame(const EncodedFrame& frame, 141 void EncryptAndSendFrame(const EncodedFrame& frame,
229 TransportEncryptionHandler* encryptor, 142 TransportEncryptionHandler* encryptor,
230 RtpSender* sender) { 143 RtpSender* sender) {
231 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this 144 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this
232 // issue is still under investigation. http://crbug.com/519022 145 // issue is still under investigation. http://crbug.com/519022
233 if (encryptor->is_activated() && !frame.data.empty()) { 146 if (encryptor->is_activated() && !frame.data.empty()) {
234 EncodedFrame encrypted_frame; 147 EncodedFrame encrypted_frame;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 } 233 }
321 } 234 }
322 235
323 PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() { 236 PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() {
324 return base::Bind( 237 return base::Bind(
325 base::IgnoreResult(&CastTransportSenderImpl::OnReceivedPacket), 238 base::IgnoreResult(&CastTransportSenderImpl::OnReceivedPacket),
326 weak_factory_.GetWeakPtr()); 239 weak_factory_.GetWeakPtr());
327 } 240 }
328 241
329 void CastTransportSenderImpl::SendRawEvents() { 242 void CastTransportSenderImpl::SendRawEvents() {
330 DCHECK(!raw_events_callback_.is_null()); 243 DCHECK(logging_flush_interval_ > base::TimeDelta());
331 244
332 if (!recent_frame_events_.empty() || !recent_packet_events_.empty()) { 245 if (!recent_frame_events_.empty() || !recent_packet_events_.empty()) {
333 scoped_ptr<std::vector<FrameEvent>> frame_events( 246 scoped_ptr<std::vector<FrameEvent>> frame_events(
334 new std::vector<FrameEvent>()); 247 new std::vector<FrameEvent>());
335 frame_events->swap(recent_frame_events_); 248 frame_events->swap(recent_frame_events_);
336 scoped_ptr<std::vector<PacketEvent>> packet_events( 249 scoped_ptr<std::vector<PacketEvent>> packet_events(
337 new std::vector<PacketEvent>()); 250 new std::vector<PacketEvent>());
338 packet_events->swap(recent_packet_events_); 251 packet_events->swap(recent_packet_events_);
339 raw_events_callback_.Run(std::move(frame_events), std::move(packet_events)); 252 transport_client_->OnLoggingEventsReceived(std::move(frame_events),
253 std::move(packet_events));
340 } 254 }
341 255
342 transport_task_runner_->PostDelayedTask( 256 transport_task_runner_->PostDelayedTask(
343 FROM_HERE, 257 FROM_HERE, base::Bind(&CastTransportSenderImpl::SendRawEvents,
344 base::Bind(&CastTransportSenderImpl::SendRawEvents, 258 weak_factory_.GetWeakPtr()),
345 weak_factory_.GetWeakPtr()), 259 logging_flush_interval_);
346 raw_events_callback_interval_);
347 } 260 }
348 261
349 bool CastTransportSenderImpl::OnReceivedPacket(scoped_ptr<Packet> packet) { 262 bool CastTransportSenderImpl::OnReceivedPacket(scoped_ptr<Packet> packet) {
350 const uint8_t* const data = &packet->front(); 263 const uint8_t* const data = &packet->front();
351 const size_t length = packet->size(); 264 const size_t length = packet->size();
352 uint32_t ssrc; 265 uint32_t ssrc;
353 if (IsRtcpPacket(data, length)) { 266 if (IsRtcpPacket(data, length)) {
354 ssrc = GetSsrcOfSender(data, length); 267 ssrc = GetSsrcOfSender(data, length);
355 } else if (!RtpParser::ParseSsrc(data, length, &ssrc)) { 268 } else if (!RtpParser::ParseSsrc(data, length, &ssrc)) {
356 VLOG(1) << "Invalid RTP packet."; 269 VLOG(1) << "Invalid RTP packet.";
357 return false; 270 return false;
358 } 271 }
359 if (valid_ssrcs_.find(ssrc) == valid_ssrcs_.end()) { 272 if (valid_ssrcs_.find(ssrc) == valid_ssrcs_.end()) {
360 VLOG(1) << "Stale packet received."; 273 VLOG(1) << "Stale packet received.";
361 return false; 274 return false;
362 } 275 }
363 276
364 if (audio_rtcp_session_ && 277 if (audio_rtcp_session_ &&
365 audio_rtcp_session_->IncomingRtcpPacket(data, length)) { 278 audio_rtcp_session_->IncomingRtcpPacket(data, length)) {
366 return true; 279 return true;
367 } 280 }
368 if (video_rtcp_session_ && 281 if (video_rtcp_session_ &&
369 video_rtcp_session_->IncomingRtcpPacket(data, length)) { 282 video_rtcp_session_->IncomingRtcpPacket(data, length)) {
370 return true; 283 return true;
371 } 284 }
372 if (packet_callback_.is_null()) { 285 transport_client_->ProcessRtpPacket(std::move(packet));
373 VLOG(1) << "Stale packet received.";
374 return false;
375 }
376 packet_callback_.Run(std::move(packet));
377 return true; 286 return true;
378 } 287 }
379 288
380 void CastTransportSenderImpl::OnReceivedLogMessage( 289 void CastTransportSenderImpl::OnReceivedLogMessage(
381 EventMediaType media_type, 290 EventMediaType media_type,
382 const RtcpReceiverLogMessage& log) { 291 const RtcpReceiverLogMessage& log) {
383 if (raw_events_callback_.is_null()) 292 if (logging_flush_interval_ <= base::TimeDelta())
384 return; 293 return;
385 294
386 // Add received log messages into our log system. 295 // Add received log messages into our log system.
387 for (const RtcpReceiverFrameLogMessage& frame_log_message : log) { 296 for (const RtcpReceiverFrameLogMessage& frame_log_message : log) {
388 for (const RtcpReceiverEventLogMessage& event_log_message : 297 for (const RtcpReceiverEventLogMessage& event_log_message :
389 frame_log_message.event_log_messages_) { 298 frame_log_message.event_log_messages_) {
390 switch (event_log_message.type) { 299 switch (event_log_message.type) {
391 case PACKET_RECEIVED: { 300 case PACKET_RECEIVED: {
392 recent_packet_events_.push_back(PacketEvent()); 301 recent_packet_events_.push_back(PacketEvent());
393 PacketEvent& receive_event = recent_packet_events_.back(); 302 PacketEvent& receive_event = recent_packet_events_.back();
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
453 ResendPackets(ssrc, 362 ResendPackets(ssrc,
454 cast_message.missing_frames_and_packets, 363 cast_message.missing_frames_and_packets,
455 true, 364 true,
456 dedup_info); 365 dedup_info);
457 } 366 }
458 367
459 void CastTransportSenderImpl::AddValidSsrc(uint32_t ssrc) { 368 void CastTransportSenderImpl::AddValidSsrc(uint32_t ssrc) {
460 valid_ssrcs_.insert(ssrc); 369 valid_ssrcs_.insert(ssrc);
461 } 370 }
462 371
372 PacedSender* CastTransportSenderImpl::GetPacedSender() {
373 return &pacer_;
374 }
375
376 void CastTransportSenderImpl::SetWifiOptions(int wifi_options) {
377 wifi_options_autoreset_ = net::SetWifiOptions(wifi_options);
378 }
379
463 // TODO(isheriff): This interface needs clean up. 380 // TODO(isheriff): This interface needs clean up.
464 // https://crbug.com/569259 381 // https://crbug.com/569259
465 void CastTransportSenderImpl::SendRtcpFromRtpReceiver( 382 void CastTransportSenderImpl::SendRtcpFromRtpReceiver(
466 uint32_t ssrc, 383 uint32_t ssrc,
467 uint32_t sender_ssrc, 384 uint32_t sender_ssrc,
468 const RtcpTimeData& time_data, 385 const RtcpTimeData& time_data,
469 const RtcpCastMessage* cast_message, 386 const RtcpCastMessage* cast_message,
470 base::TimeDelta target_delay, 387 base::TimeDelta target_delay,
471 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, 388 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events,
472 const RtpReceiverStatistics* rtp_receiver_statistics) { 389 const RtpReceiverStatistics* rtp_receiver_statistics) {
473 const ReceiverRtcpSession rtcp(clock_, &pacer_, ssrc, sender_ssrc); 390 const ReceiverRtcpSession rtcp(clock_, &pacer_, ssrc, sender_ssrc);
474 rtcp.SendRtcpReport(time_data, cast_message, target_delay, rtcp_events, 391 rtcp.SendRtcpReport(time_data, cast_message, target_delay, rtcp_events,
475 rtp_receiver_statistics); 392 rtp_receiver_statistics);
476 } 393 }
477 394
478 } // namespace cast 395 } // namespace cast
479 } // namespace media 396 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698