OLD | NEW |
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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 &CastTransportSenderImpl::OnReceivedPacket, base::Unretained(this))); | 90 &CastTransportSenderImpl::OnReceivedPacket, base::Unretained(this))); |
91 } | 91 } |
92 | 92 |
93 CastTransportSenderImpl::~CastTransportSenderImpl() { | 93 CastTransportSenderImpl::~CastTransportSenderImpl() { |
94 transport_->StopReceiving(); | 94 transport_->StopReceiving(); |
95 } | 95 } |
96 | 96 |
97 void CastTransportSenderImpl::InitializeAudio( | 97 void CastTransportSenderImpl::InitializeAudio( |
98 const CastTransportRtpConfig& config, | 98 const CastTransportRtpConfig& config, |
99 const RtcpCastMessageCallback& cast_message_cb, | 99 const RtcpCastMessageCallback& cast_message_cb, |
100 const RtcpRttCallback& rtt_cb) { | 100 const RtcpRttCallback& rtt_cb, |
| 101 const RtcpPliCallback& pli_cb) { |
101 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) | 102 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) |
102 << "Unsafe to send audio with encryption DISABLED."; | 103 << "Unsafe to send audio with encryption DISABLED."; |
103 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { | 104 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { |
104 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); | 105 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); |
105 return; | 106 return; |
106 } | 107 } |
107 | 108 |
108 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); | 109 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); |
109 if (audio_sender_->Initialize(config)) { | 110 if (audio_sender_->Initialize(config)) { |
110 // Audio packets have a higher priority. | 111 // Audio packets have a higher priority. |
111 pacer_.RegisterAudioSsrc(config.ssrc); | 112 pacer_.RegisterAudioSsrc(config.ssrc); |
112 pacer_.RegisterPrioritySsrc(config.ssrc); | 113 pacer_.RegisterPrioritySsrc(config.ssrc); |
113 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); | 114 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); |
114 } else { | 115 } else { |
115 audio_sender_.reset(); | 116 audio_sender_.reset(); |
116 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); | 117 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); |
117 return; | 118 return; |
118 } | 119 } |
119 | 120 |
120 audio_rtcp_session_.reset(new SenderRtcpSession( | 121 audio_rtcp_session_.reset(new SenderRtcpSession( |
121 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, | 122 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, |
122 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), | 123 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), |
123 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, | 124 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, |
124 weak_factory_.GetWeakPtr(), AUDIO_EVENT), | 125 weak_factory_.GetWeakPtr(), AUDIO_EVENT), |
125 clock_, &pacer_, config.ssrc, config.feedback_ssrc)); | 126 pli_cb, clock_, &pacer_, config.ssrc, config.feedback_ssrc)); |
126 pacer_.RegisterAudioSsrc(config.ssrc); | 127 pacer_.RegisterAudioSsrc(config.ssrc); |
127 valid_sender_ssrcs_.insert(config.feedback_ssrc); | 128 valid_sender_ssrcs_.insert(config.feedback_ssrc); |
128 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); | 129 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); |
129 } | 130 } |
130 | 131 |
131 void CastTransportSenderImpl::InitializeVideo( | 132 void CastTransportSenderImpl::InitializeVideo( |
132 const CastTransportRtpConfig& config, | 133 const CastTransportRtpConfig& config, |
133 const RtcpCastMessageCallback& cast_message_cb, | 134 const RtcpCastMessageCallback& cast_message_cb, |
134 const RtcpRttCallback& rtt_cb) { | 135 const RtcpRttCallback& rtt_cb, |
| 136 const RtcpPliCallback& pli_cb) { |
135 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) | 137 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) |
136 << "Unsafe to send video with encryption DISABLED."; | 138 << "Unsafe to send video with encryption DISABLED."; |
137 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { | 139 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { |
138 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); | 140 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); |
139 return; | 141 return; |
140 } | 142 } |
141 | 143 |
142 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); | 144 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); |
143 if (!video_sender_->Initialize(config)) { | 145 if (!video_sender_->Initialize(config)) { |
144 video_sender_.reset(); | 146 video_sender_.reset(); |
145 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); | 147 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); |
146 return; | 148 return; |
147 } | 149 } |
148 | 150 |
149 video_rtcp_session_.reset(new SenderRtcpSession( | 151 video_rtcp_session_.reset(new SenderRtcpSession( |
150 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, | 152 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, |
151 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), | 153 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), |
152 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, | 154 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, |
153 weak_factory_.GetWeakPtr(), VIDEO_EVENT), | 155 weak_factory_.GetWeakPtr(), VIDEO_EVENT), |
154 clock_, &pacer_, config.ssrc, config.feedback_ssrc)); | 156 pli_cb, clock_, &pacer_, config.ssrc, config.feedback_ssrc)); |
155 pacer_.RegisterVideoSsrc(config.ssrc); | 157 pacer_.RegisterVideoSsrc(config.ssrc); |
156 valid_sender_ssrcs_.insert(config.feedback_ssrc); | 158 valid_sender_ssrcs_.insert(config.feedback_ssrc); |
157 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED); | 159 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED); |
158 } | 160 } |
159 | 161 |
160 namespace { | 162 namespace { |
161 void EncryptAndSendFrame(const EncodedFrame& frame, | 163 void EncryptAndSendFrame(const EncodedFrame& frame, |
162 TransportEncryptionHandler* encryptor, | 164 TransportEncryptionHandler* encryptor, |
163 RtpSender* sender) { | 165 RtpSender* sender) { |
164 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this | 166 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this |
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
442 const RtcpCastMessage& cast_message, | 444 const RtcpCastMessage& cast_message, |
443 base::TimeDelta target_delay) { | 445 base::TimeDelta target_delay) { |
444 if (!rtcp_builder_at_rtp_receiver_) { | 446 if (!rtcp_builder_at_rtp_receiver_) { |
445 VLOG(1) << "rtcp_builder_at_rtp_receiver_ is not initialized before " | 447 VLOG(1) << "rtcp_builder_at_rtp_receiver_ is not initialized before " |
446 "calling CastTransportSenderImpl::AddCastFeedback."; | 448 "calling CastTransportSenderImpl::AddCastFeedback."; |
447 return; | 449 return; |
448 } | 450 } |
449 rtcp_builder_at_rtp_receiver_->AddCast(cast_message, target_delay); | 451 rtcp_builder_at_rtp_receiver_->AddCast(cast_message, target_delay); |
450 } | 452 } |
451 | 453 |
| 454 void CastTransportSenderImpl::AddPli(const RtcpPliMessage& pli_message) { |
| 455 if (!rtcp_builder_at_rtp_receiver_) { |
| 456 VLOG(1) << "rtcp_builder_at_rtp_receiver_ is not initialized before " |
| 457 "calling CastTransportSenderImpl::AddPli."; |
| 458 return; |
| 459 } |
| 460 rtcp_builder_at_rtp_receiver_->AddPli(pli_message); |
| 461 } |
| 462 |
452 void CastTransportSenderImpl::AddRtcpEvents( | 463 void CastTransportSenderImpl::AddRtcpEvents( |
453 const ReceiverRtcpEventSubscriber::RtcpEvents& rtcp_events) { | 464 const ReceiverRtcpEventSubscriber::RtcpEvents& rtcp_events) { |
454 if (!rtcp_builder_at_rtp_receiver_) { | 465 if (!rtcp_builder_at_rtp_receiver_) { |
455 VLOG(1) << "rtcp_builder_at_rtp_receiver_ is not initialized before " | 466 VLOG(1) << "rtcp_builder_at_rtp_receiver_ is not initialized before " |
456 "calling CastTransportSenderImpl::AddRtcpEvents."; | 467 "calling CastTransportSenderImpl::AddRtcpEvents."; |
457 return; | 468 return; |
458 } | 469 } |
459 rtcp_builder_at_rtp_receiver_->AddReceiverLog(rtcp_events); | 470 rtcp_builder_at_rtp_receiver_->AddReceiverLog(rtcp_events); |
460 } | 471 } |
461 | 472 |
(...skipping 13 matching lines...) Expand all Loading... |
475 "calling CastTransportSenderImpl::SendRtcpFromRtpReceiver."; | 486 "calling CastTransportSenderImpl::SendRtcpFromRtpReceiver."; |
476 return; | 487 return; |
477 } | 488 } |
478 pacer_.SendRtcpPacket(rtcp_builder_at_rtp_receiver_->local_ssrc(), | 489 pacer_.SendRtcpPacket(rtcp_builder_at_rtp_receiver_->local_ssrc(), |
479 rtcp_builder_at_rtp_receiver_->Finish()); | 490 rtcp_builder_at_rtp_receiver_->Finish()); |
480 rtcp_builder_at_rtp_receiver_.reset(); | 491 rtcp_builder_at_rtp_receiver_.reset(); |
481 } | 492 } |
482 | 493 |
483 } // namespace cast | 494 } // namespace cast |
484 } // namespace media | 495 } // namespace media |
OLD | NEW |