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

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

Powered by Google App Engine
This is Rietveld 408576698