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

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 interface and impl (no tests). Created 5 years 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 "base/single_thread_task_runner.h" 7 #include "base/single_thread_task_runner.h"
8 #include "base/values.h" 8 #include "base/values.h"
9 #include "media/cast/net/cast_transport_defines.h" 9 #include "media/cast/net/cast_transport_defines.h"
10 #include "media/cast/net/udp_transport.h" 10 #include "media/cast/net/udp_transport.h"
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
44 int32 max_burst_size = 44 int32 max_burst_size =
45 LookupOptionWithDefault(options, kOptionPacerMaxBurstSize, 45 LookupOptionWithDefault(options, kOptionPacerMaxBurstSize,
46 kMaxBurstSize) * kMaxIpPacketSize; 46 kMaxBurstSize) * kMaxIpPacketSize;
47 int32 min_send_buffer_size = 47 int32 min_send_buffer_size =
48 LookupOptionWithDefault(options, kOptionSendBufferMinSize, 0); 48 LookupOptionWithDefault(options, kOptionSendBufferMinSize, 0);
49 return std::max(max_burst_size, min_send_buffer_size); 49 return std::max(max_burst_size, min_send_buffer_size);
50 } 50 }
51 51
52 } // namespace 52 } // namespace
53 53
54 CastTransportSender::CreateParams::CreateParams(
55 net::NetLog* log,
56 base::TickClock* input_clock,
57 net::IPEndPoint local_addr,
58 net::IPEndPoint remote_addr,
59 Client* transport_client,
60 base::TimeDelta transport_logging_flush_interval,
61 scoped_ptr<base::DictionaryValue> options,
62 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
63 : net_log(log),
64 clock(input_clock),
65 local_end_point(local_addr),
66 remote_end_point(remote_addr),
67 client(transport_client),
68 logging_flush_interval(transport_logging_flush_interval),
69 optional_config(options.Pass()),
70 transport_task_runner(task_runner) {}
71
72 CastTransportSender::CreateParams::~CreateParams() {}
73
74 CastTransportSender::Client::~Client() {}
75
54 scoped_ptr<CastTransportSender> CastTransportSender::Create( 76 scoped_ptr<CastTransportSender> CastTransportSender::Create(
55 net::NetLog* net_log, 77 const CreateParams& params) {
56 base::TickClock* clock,
57 const net::IPEndPoint& local_end_point,
58 const net::IPEndPoint& remote_end_point,
59 scoped_ptr<base::DictionaryValue> options,
60 const CastTransportStatusCallback& status_callback,
61 const BulkRawEventsCallback& raw_events_callback,
62 base::TimeDelta raw_events_callback_interval,
63 const PacketReceiverCallback& packet_callback,
64 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner) {
65 return scoped_ptr<CastTransportSender>( 78 return scoped_ptr<CastTransportSender>(
66 new CastTransportSenderImpl(net_log, 79 new CastTransportSenderImpl(params, nullptr));
67 clock,
68 local_end_point,
69 remote_end_point,
70 options.Pass(),
71 status_callback,
72 raw_events_callback,
73 raw_events_callback_interval,
74 transport_task_runner.get(),
75 packet_callback,
76 NULL));
77 } 80 }
78 81
79 PacketReceiverCallback CastTransportSender::PacketReceiverForTesting() { 82 PacketReceiverCallback CastTransportSender::PacketReceiverForTesting() {
80 return PacketReceiverCallback(); 83 return PacketReceiverCallback();
81 } 84 }
82 85
83 CastTransportSenderImpl::CastTransportSenderImpl( 86 CastTransportSenderImpl::CastTransportSenderImpl(
84 net::NetLog* net_log, 87 const CreateParams& params,
85 base::TickClock* clock,
86 const net::IPEndPoint& local_end_point,
87 const net::IPEndPoint& remote_end_point,
88 scoped_ptr<base::DictionaryValue> options,
89 const CastTransportStatusCallback& status_callback,
90 const BulkRawEventsCallback& raw_events_callback,
91 base::TimeDelta raw_events_callback_interval,
92 const scoped_refptr<base::SingleThreadTaskRunner>& transport_task_runner,
93 const PacketReceiverCallback& packet_callback,
94 PacketSender* external_transport) 88 PacketSender* external_transport)
95 : clock_(clock), 89 : transport_client_(params.client),
96 status_callback_(status_callback), 90 clock_(params.clock),
97 transport_task_runner_(transport_task_runner), 91 transport_task_runner_(params.transport_task_runner),
92 logging_flush_interval_(params.logging_flush_interval),
98 transport_(external_transport 93 transport_(external_transport
99 ? nullptr 94 ? nullptr
100 : new UdpTransport(net_log, 95 : new UdpTransport(params,
101 transport_task_runner, 96 GetTransportSendBufferSize(
102 local_end_point, 97 *(params.optional_config)))),
103 remote_end_point, 98 pacer_(LookupOptionWithDefault(*(params.optional_config),
104 GetTransportSendBufferSize(*options),
105 status_callback)),
106 pacer_(LookupOptionWithDefault(*options,
107 kOptionPacerTargetBurstSize, 99 kOptionPacerTargetBurstSize,
108 kTargetBurstSize), 100 kTargetBurstSize),
109 LookupOptionWithDefault(*options, 101 LookupOptionWithDefault(*(params.optional_config),
110 kOptionPacerMaxBurstSize, 102 kOptionPacerMaxBurstSize,
111 kMaxBurstSize), 103 kMaxBurstSize),
112 clock, 104 params.clock,
113 raw_events_callback.is_null() ? nullptr : &recent_packet_events_, 105 params.logging_flush_interval > base::TimeDelta()
106 ? &recent_packet_events_
107 : nullptr,
114 external_transport ? external_transport : transport_.get(), 108 external_transport ? external_transport : transport_.get(),
115 transport_task_runner), 109 params.transport_task_runner),
116 raw_events_callback_(raw_events_callback),
117 raw_events_callback_interval_(raw_events_callback_interval),
118 last_byte_acked_for_audio_(0), 110 last_byte_acked_for_audio_(0),
119 packet_callback_(packet_callback),
120 weak_factory_(this) { 111 weak_factory_(this) {
121 DCHECK(clock_); 112 DCHECK(params.clock);
122 if (!raw_events_callback_.is_null()) { 113
123 DCHECK(raw_events_callback_interval > base::TimeDelta()); 114 if (logging_flush_interval_ > base::TimeDelta()) {
124 transport_task_runner->PostDelayedTask( 115 transport_task_runner_->PostDelayedTask(
125 FROM_HERE, 116 FROM_HERE, base::Bind(&CastTransportSenderImpl::SendRawEvents,
126 base::Bind(&CastTransportSenderImpl::SendRawEvents, 117 weak_factory_.GetWeakPtr()),
127 weak_factory_.GetWeakPtr()), 118 logging_flush_interval_);
128 raw_events_callback_interval);
129 } 119 }
130 if (transport_) { 120 if (transport_) {
131 if (options->HasKey(kOptionDscp)) { 121 if (params.optional_config->HasKey(kOptionDscp)) {
132 // The default DSCP value for cast is AF41. Which gives it a higher 122 // The default DSCP value for cast is AF41. Which gives it a higher
133 // priority over other traffic. 123 // priority over other traffic.
134 transport_->SetDscp(net::DSCP_AF41); 124 transport_->SetDscp(net::DSCP_AF41);
135 } 125 }
136 #if defined(OS_WIN) 126 #if defined(OS_WIN)
137 if (!options->HasKey(kOptionDisableNonBlockingIO)) { 127 if (!params.optional_config->HasKey(kOptionDisableNonBlockingIO)) {
138 transport_->UseNonBlockingIO(); 128 transport_->UseNonBlockingIO();
139 } 129 }
140 #endif 130 #endif
141 transport_->StartReceiving( 131 transport_->StartReceiving(
142 base::Bind(&CastTransportSenderImpl::OnReceivedPacket, 132 base::Bind(&CastTransportSenderImpl::OnReceivedPacket,
143 base::Unretained(this))); 133 base::Unretained(this)));
144 int wifi_options = 0; 134 int wifi_options = 0;
145 if (options->HasKey(kOptionWifiDisableScan)) { 135 if (params.optional_config->HasKey(kOptionWifiDisableScan)) {
146 wifi_options |= net::WIFI_OPTIONS_DISABLE_SCAN; 136 wifi_options |= net::WIFI_OPTIONS_DISABLE_SCAN;
147 } 137 }
148 if (options->HasKey(kOptionWifiMediaStreamingMode)) { 138 if (params.optional_config->HasKey(kOptionWifiMediaStreamingMode)) {
149 wifi_options |= net::WIFI_OPTIONS_MEDIA_STREAMING_MODE; 139 wifi_options |= net::WIFI_OPTIONS_MEDIA_STREAMING_MODE;
150 } 140 }
151 if (wifi_options) { 141 if (wifi_options) {
152 wifi_options_autoreset_ = net::SetWifiOptions(wifi_options); 142 wifi_options_autoreset_ = net::SetWifiOptions(wifi_options);
153 } 143 }
154 } 144 }
155 } 145 }
156 146
157 CastTransportSenderImpl::~CastTransportSenderImpl() { 147 CastTransportSenderImpl::~CastTransportSenderImpl() {
158 if (transport_) { 148 if (transport_) {
159 transport_->StopReceiving(); 149 transport_->StopReceiving();
160 } 150 }
161 } 151 }
162 152
163 void CastTransportSenderImpl::InitializeAudio( 153 void CastTransportSenderImpl::InitializeAudio(
164 const CastTransportRtpConfig& config, 154 const CastTransportRtpConfig& config,
165 const RtcpCastMessageCallback& cast_message_cb, 155 const RtcpCastMessageCallback& cast_message_cb,
166 const RtcpRttCallback& rtt_cb) { 156 const RtcpRttCallback& rtt_cb) {
167 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) 157 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
168 << "Unsafe to send audio with encryption DISABLED."; 158 << "Unsafe to send audio with encryption DISABLED.";
159 DCHECK(transport_client_);
169 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { 160 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
170 status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); 161 transport_client_->OnStatusChange(TRANSPORT_AUDIO_UNINITIALIZED);
171 return; 162 return;
172 } 163 }
173 164
174 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); 165 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_));
175 if (audio_sender_->Initialize(config)) { 166 if (audio_sender_->Initialize(config)) {
176 // Audio packets have a higher priority. 167 // Audio packets have a higher priority.
177 pacer_.RegisterAudioSsrc(config.ssrc); 168 pacer_.RegisterAudioSsrc(config.ssrc);
178 pacer_.RegisterPrioritySsrc(config.ssrc); 169 pacer_.RegisterPrioritySsrc(config.ssrc);
179 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); 170 transport_client_->OnStatusChange(TRANSPORT_AUDIO_INITIALIZED);
180 } else { 171 } else {
181 audio_sender_.reset(); 172 audio_sender_.reset();
182 status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); 173 transport_client_->OnStatusChange(TRANSPORT_AUDIO_UNINITIALIZED);
183 return; 174 return;
184 } 175 }
185 176
186 audio_rtcp_session_.reset( 177 audio_rtcp_session_.reset(new Rtcp(
187 new Rtcp(base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, 178 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
188 weak_factory_.GetWeakPtr(), config.ssrc, 179 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb),
189 cast_message_cb), 180 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
190 rtt_cb, 181 weak_factory_.GetWeakPtr(), AUDIO_EVENT),
191 base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, 182 clock_, &pacer_, config.ssrc, config.feedback_ssrc));
192 weak_factory_.GetWeakPtr(), AUDIO_EVENT),
193 clock_,
194 &pacer_,
195 config.ssrc,
196 config.feedback_ssrc));
197 pacer_.RegisterAudioSsrc(config.ssrc); 183 pacer_.RegisterAudioSsrc(config.ssrc);
198 AddValidSsrc(config.feedback_ssrc); 184 AddValidSsrc(config.feedback_ssrc);
199 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); 185 transport_client_->OnStatusChange(TRANSPORT_AUDIO_INITIALIZED);
200 } 186 }
201 187
202 void CastTransportSenderImpl::InitializeVideo( 188 void CastTransportSenderImpl::InitializeVideo(
203 const CastTransportRtpConfig& config, 189 const CastTransportRtpConfig& config,
204 const RtcpCastMessageCallback& cast_message_cb, 190 const RtcpCastMessageCallback& cast_message_cb,
205 const RtcpRttCallback& rtt_cb) { 191 const RtcpRttCallback& rtt_cb) {
206 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) 192 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
207 << "Unsafe to send video with encryption DISABLED."; 193 << "Unsafe to send video with encryption DISABLED.";
194 DCHECK(transport_client_);
208 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { 195 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
209 status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); 196 transport_client_->OnStatusChange(TRANSPORT_VIDEO_UNINITIALIZED);
210 return; 197 return;
211 } 198 }
212 199
213 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); 200 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_));
214 if (!video_sender_->Initialize(config)) { 201 if (!video_sender_->Initialize(config)) {
215 video_sender_.reset(); 202 video_sender_.reset();
216 status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); 203 transport_client_->OnStatusChange(TRANSPORT_VIDEO_UNINITIALIZED);
217 return; 204 return;
218 } 205 }
219 206
220 video_rtcp_session_.reset( 207 video_rtcp_session_.reset(new Rtcp(
221 new Rtcp(base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, 208 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
222 weak_factory_.GetWeakPtr(), config.ssrc, 209 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb),
223 cast_message_cb), 210 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
224 rtt_cb, 211 weak_factory_.GetWeakPtr(), VIDEO_EVENT),
225 base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, 212 clock_, &pacer_, config.ssrc, config.feedback_ssrc));
226 weak_factory_.GetWeakPtr(), VIDEO_EVENT),
227 clock_,
228 &pacer_,
229 config.ssrc,
230 config.feedback_ssrc));
231 pacer_.RegisterVideoSsrc(config.ssrc); 213 pacer_.RegisterVideoSsrc(config.ssrc);
232 AddValidSsrc(config.feedback_ssrc); 214 AddValidSsrc(config.feedback_ssrc);
233 status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED); 215 transport_client_->OnStatusChange(TRANSPORT_VIDEO_INITIALIZED);
234 } 216 }
235 217
236 namespace { 218 namespace {
237 void EncryptAndSendFrame(const EncodedFrame& frame, 219 void EncryptAndSendFrame(const EncodedFrame& frame,
238 TransportEncryptionHandler* encryptor, 220 TransportEncryptionHandler* encryptor,
239 RtpSender* sender) { 221 RtpSender* sender) {
240 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this 222 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this
241 // issue is still under investigation. http://crbug.com/519022 223 // issue is still under investigation. http://crbug.com/519022
242 if (encryptor->is_activated() && !frame.data.empty()) { 224 if (encryptor->is_activated() && !frame.data.empty()) {
243 EncodedFrame encrypted_frame; 225 EncodedFrame encrypted_frame;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
329 } 311 }
330 } 312 }
331 313
332 PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() { 314 PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() {
333 return base::Bind( 315 return base::Bind(
334 base::IgnoreResult(&CastTransportSenderImpl::OnReceivedPacket), 316 base::IgnoreResult(&CastTransportSenderImpl::OnReceivedPacket),
335 weak_factory_.GetWeakPtr()); 317 weak_factory_.GetWeakPtr());
336 } 318 }
337 319
338 void CastTransportSenderImpl::SendRawEvents() { 320 void CastTransportSenderImpl::SendRawEvents() {
339 DCHECK(!raw_events_callback_.is_null()); 321 DCHECK(transport_client_ && logging_flush_interval_ > base::TimeDelta());
340 322
341 if (!recent_frame_events_.empty() || !recent_packet_events_.empty()) { 323 if (!recent_frame_events_.empty() || !recent_packet_events_.empty()) {
342 scoped_ptr<std::vector<FrameEvent>> frame_events( 324 scoped_ptr<std::vector<FrameEvent>> frame_events(
343 new std::vector<FrameEvent>()); 325 new std::vector<FrameEvent>());
344 frame_events->swap(recent_frame_events_); 326 frame_events->swap(recent_frame_events_);
345 scoped_ptr<std::vector<PacketEvent>> packet_events( 327 scoped_ptr<std::vector<PacketEvent>> packet_events(
346 new std::vector<PacketEvent>()); 328 new std::vector<PacketEvent>());
347 packet_events->swap(recent_packet_events_); 329 packet_events->swap(recent_packet_events_);
348 raw_events_callback_.Run(frame_events.Pass(), packet_events.Pass()); 330 transport_client_->OnReceivedLoggingEvents(frame_events.Pass(),
331 packet_events.Pass());
349 } 332 }
350 333
351 transport_task_runner_->PostDelayedTask( 334 transport_task_runner_->PostDelayedTask(
352 FROM_HERE, 335 FROM_HERE, base::Bind(&CastTransportSenderImpl::SendRawEvents,
353 base::Bind(&CastTransportSenderImpl::SendRawEvents, 336 weak_factory_.GetWeakPtr()),
354 weak_factory_.GetWeakPtr()), 337 logging_flush_interval_);
355 raw_events_callback_interval_);
356 } 338 }
357 339
358 bool CastTransportSenderImpl::OnReceivedPacket(scoped_ptr<Packet> packet) { 340 bool CastTransportSenderImpl::OnReceivedPacket(scoped_ptr<Packet> packet) {
359 const uint8_t* const data = &packet->front(); 341 const uint8_t* const data = &packet->front();
360 const size_t length = packet->size(); 342 const size_t length = packet->size();
361 uint32 ssrc; 343 uint32 ssrc;
362 if (Rtcp::IsRtcpPacket(data, length)) { 344 if (Rtcp::IsRtcpPacket(data, length)) {
363 ssrc = Rtcp::GetSsrcOfSender(data, length); 345 ssrc = Rtcp::GetSsrcOfSender(data, length);
364 } else if (!RtpParser::ParseSsrc(data, length, &ssrc)) { 346 } else if (!RtpParser::ParseSsrc(data, length, &ssrc)) {
365 VLOG(1) << "Invalid RTP packet."; 347 VLOG(1) << "Invalid RTP packet.";
366 return false; 348 return false;
367 } 349 }
368 if (valid_ssrcs_.find(ssrc) == valid_ssrcs_.end()) { 350 if (valid_ssrcs_.find(ssrc) == valid_ssrcs_.end()) {
369 VLOG(1) << "Stale packet received."; 351 VLOG(1) << "Stale packet received.";
370 return false; 352 return false;
371 } 353 }
372 354
373 if (audio_rtcp_session_ && 355 if (audio_rtcp_session_ &&
374 audio_rtcp_session_->IncomingRtcpPacket(data, length)) { 356 audio_rtcp_session_->IncomingRtcpPacket(data, length)) {
375 return true; 357 return true;
376 } 358 }
377 if (video_rtcp_session_ && 359 if (video_rtcp_session_ &&
378 video_rtcp_session_->IncomingRtcpPacket(data, length)) { 360 video_rtcp_session_->IncomingRtcpPacket(data, length)) {
379 return true; 361 return true;
380 } 362 }
381 if (packet_callback_.is_null()) { 363 DCHECK(transport_client_);
364 if (!transport_client_->OnReceivedPackets(packet.Pass())) {
382 VLOG(1) << "Stale packet received."; 365 VLOG(1) << "Stale packet received.";
383 return false; 366 return false;
384 } 367 }
385 packet_callback_.Run(packet.Pass());
386 return true; 368 return true;
387 } 369 }
388 370
389 void CastTransportSenderImpl::OnReceivedLogMessage( 371 void CastTransportSenderImpl::OnReceivedLogMessage(
390 EventMediaType media_type, 372 EventMediaType media_type,
391 const RtcpReceiverLogMessage& log) { 373 const RtcpReceiverLogMessage& log) {
392 if (raw_events_callback_.is_null()) 374 if ((!transport_client_) || (logging_flush_interval_ == base::TimeDelta()))
393 return; 375 return;
394 376
395 // Add received log messages into our log system. 377 // Add received log messages into our log system.
396 for (const RtcpReceiverFrameLogMessage& frame_log_message : log) { 378 for (const RtcpReceiverFrameLogMessage& frame_log_message : log) {
397 for (const RtcpReceiverEventLogMessage& event_log_message : 379 for (const RtcpReceiverEventLogMessage& event_log_message :
398 frame_log_message.event_log_messages_) { 380 frame_log_message.event_log_messages_) {
399 switch (event_log_message.type) { 381 switch (event_log_message.type) {
400 case PACKET_RECEIVED: { 382 case PACKET_RECEIVED: {
401 recent_packet_events_.push_back(PacketEvent()); 383 recent_packet_events_.push_back(PacketEvent());
402 PacketEvent& receive_event = recent_packet_events_.back(); 384 PacketEvent& receive_event = recent_packet_events_.back();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
470 } 452 }
471 453
472 void CastTransportSenderImpl::SendRtcpFromRtpReceiver( 454 void CastTransportSenderImpl::SendRtcpFromRtpReceiver(
473 uint32 ssrc, 455 uint32 ssrc,
474 uint32 sender_ssrc, 456 uint32 sender_ssrc,
475 const RtcpTimeData& time_data, 457 const RtcpTimeData& time_data,
476 const RtcpCastMessage* cast_message, 458 const RtcpCastMessage* cast_message,
477 base::TimeDelta target_delay, 459 base::TimeDelta target_delay,
478 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, 460 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events,
479 const RtpReceiverStatistics* rtp_receiver_statistics) { 461 const RtpReceiverStatistics* rtp_receiver_statistics) {
480 const Rtcp rtcp(RtcpCastMessageCallback(), 462 const Rtcp rtcp(RtcpCastMessageCallback(), RtcpRttCallback(),
481 RtcpRttCallback(), 463 RtcpLogMessageCallback(), clock_, &pacer_, ssrc, sender_ssrc);
482 RtcpLogMessageCallback(),
483 clock_,
484 &pacer_,
485 ssrc,
486 sender_ssrc);
487 rtcp.SendRtcpFromRtpReceiver(time_data, 464 rtcp.SendRtcpFromRtpReceiver(time_data,
488 cast_message, 465 cast_message,
489 target_delay, 466 target_delay,
490 rtcp_events, 467 rtcp_events,
491 rtp_receiver_statistics); 468 rtp_receiver_statistics);
492 } 469 }
493 470
494 } // namespace cast 471 } // namespace cast
495 } // namespace media 472 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698