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

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

Issue 1709863002: Add Cast PLI support on sender side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address dcheng's comments. Created 4 years, 9 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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW
« no previous file with comments | « media/cast/net/cast_transport_sender_impl.h ('k') | media/cast/net/cast_transport_sender_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698