| 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 |