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

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: Separate Pli message from Cast message. 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 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 &CastTransportSenderImpl::OnReceivedPacket, base::Unretained(this))); 91 &CastTransportSenderImpl::OnReceivedPacket, base::Unretained(this)));
92 } 92 }
93 93
94 CastTransportSenderImpl::~CastTransportSenderImpl() { 94 CastTransportSenderImpl::~CastTransportSenderImpl() {
95 transport_->StopReceiving(); 95 transport_->StopReceiving();
96 } 96 }
97 97
98 void CastTransportSenderImpl::InitializeAudio( 98 void CastTransportSenderImpl::InitializeAudio(
99 const CastTransportRtpConfig& config, 99 const CastTransportRtpConfig& config,
100 const RtcpCastMessageCallback& cast_message_cb, 100 const RtcpCastMessageCallback& cast_message_cb,
101 const RtcpRttCallback& rtt_cb) { 101 const RtcpRttCallback& rtt_cb,
102 const RtcpPliCallback& pli_cb) {
102 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) 103 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
103 << "Unsafe to send audio with encryption DISABLED."; 104 << "Unsafe to send audio with encryption DISABLED.";
104 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { 105 if (!audio_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
105 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); 106 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED);
106 return; 107 return;
107 } 108 }
108 109
109 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); 110 audio_sender_.reset(new RtpSender(transport_task_runner_, &pacer_));
110 if (audio_sender_->Initialize(config)) { 111 if (audio_sender_->Initialize(config)) {
111 // Audio packets have a higher priority. 112 // Audio packets have a higher priority.
112 pacer_.RegisterAudioSsrc(config.ssrc); 113 pacer_.RegisterAudioSsrc(config.ssrc);
113 pacer_.RegisterPrioritySsrc(config.ssrc); 114 pacer_.RegisterPrioritySsrc(config.ssrc);
114 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); 115 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED);
115 } else { 116 } else {
116 audio_sender_.reset(); 117 audio_sender_.reset();
117 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED); 118 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_UNINITIALIZED);
118 return; 119 return;
119 } 120 }
120 121
121 audio_rtcp_session_.reset(new SenderRtcpSession( 122 audio_rtcp_session_.reset(new SenderRtcpSession(
122 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, 123 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
123 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), 124 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb),
124 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, 125 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
125 weak_factory_.GetWeakPtr(), AUDIO_EVENT), 126 weak_factory_.GetWeakPtr(), AUDIO_EVENT),
126 clock_, &pacer_, config.ssrc, config.feedback_ssrc)); 127 pli_cb, clock_, &pacer_, config.ssrc, config.feedback_ssrc));
127 pacer_.RegisterAudioSsrc(config.ssrc); 128 pacer_.RegisterAudioSsrc(config.ssrc);
128 AddValidSsrc(config.feedback_ssrc); 129 AddValidSsrc(config.feedback_ssrc);
129 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED); 130 transport_client_->OnStatusChanged(TRANSPORT_AUDIO_INITIALIZED);
130 } 131 }
131 132
132 void CastTransportSenderImpl::InitializeVideo( 133 void CastTransportSenderImpl::InitializeVideo(
133 const CastTransportRtpConfig& config, 134 const CastTransportRtpConfig& config,
134 const RtcpCastMessageCallback& cast_message_cb, 135 const RtcpCastMessageCallback& cast_message_cb,
135 const RtcpRttCallback& rtt_cb) { 136 const RtcpRttCallback& rtt_cb,
137 const RtcpPliCallback& pli_cb) {
136 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty()) 138 LOG_IF(WARNING, config.aes_key.empty() || config.aes_iv_mask.empty())
137 << "Unsafe to send video with encryption DISABLED."; 139 << "Unsafe to send video with encryption DISABLED.";
138 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) { 140 if (!video_encryptor_.Initialize(config.aes_key, config.aes_iv_mask)) {
139 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); 141 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED);
140 return; 142 return;
141 } 143 }
142 144
143 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_)); 145 video_sender_.reset(new RtpSender(transport_task_runner_, &pacer_));
144 if (!video_sender_->Initialize(config)) { 146 if (!video_sender_->Initialize(config)) {
145 video_sender_.reset(); 147 video_sender_.reset();
146 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED); 148 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_UNINITIALIZED);
147 return; 149 return;
148 } 150 }
149 151
150 video_rtcp_session_.reset(new SenderRtcpSession( 152 video_rtcp_session_.reset(new SenderRtcpSession(
151 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage, 153 base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
152 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb), 154 weak_factory_.GetWeakPtr(), config.ssrc, cast_message_cb),
153 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, 155 rtt_cb, base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
154 weak_factory_.GetWeakPtr(), VIDEO_EVENT), 156 weak_factory_.GetWeakPtr(), VIDEO_EVENT),
155 clock_, &pacer_, config.ssrc, config.feedback_ssrc)); 157 pli_cb, clock_, &pacer_, config.ssrc, config.feedback_ssrc));
156 pacer_.RegisterVideoSsrc(config.ssrc); 158 pacer_.RegisterVideoSsrc(config.ssrc);
157 AddValidSsrc(config.feedback_ssrc); 159 AddValidSsrc(config.feedback_ssrc);
158 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED); 160 transport_client_->OnStatusChanged(TRANSPORT_VIDEO_INITIALIZED);
159 } 161 }
160 162
161 namespace { 163 namespace {
162 void EncryptAndSendFrame(const EncodedFrame& frame, 164 void EncryptAndSendFrame(const EncodedFrame& frame,
163 TransportEncryptionHandler* encryptor, 165 TransportEncryptionHandler* encryptor,
164 RtpSender* sender) { 166 RtpSender* sender) {
165 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this 167 // TODO(miu): We probably shouldn't attempt to send an empty frame, but this
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 wifi_options_autoreset_ = net::SetWifiOptions(wifi_options); 415 wifi_options_autoreset_ = net::SetWifiOptions(wifi_options);
414 } 416 }
415 417
416 // TODO(isheriff): This interface needs clean up. 418 // TODO(isheriff): This interface needs clean up.
417 // https://crbug.com/569259 419 // https://crbug.com/569259
418 void CastTransportSenderImpl::SendRtcpFromRtpReceiver( 420 void CastTransportSenderImpl::SendRtcpFromRtpReceiver(
419 uint32_t ssrc, 421 uint32_t ssrc,
420 uint32_t sender_ssrc, 422 uint32_t sender_ssrc,
421 const RtcpTimeData& time_data, 423 const RtcpTimeData& time_data,
422 const RtcpCastMessage* cast_message, 424 const RtcpCastMessage* cast_message,
425 const RtcpPliMessage* pli_message,
423 base::TimeDelta target_delay, 426 base::TimeDelta target_delay,
424 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events, 427 const ReceiverRtcpEventSubscriber::RtcpEvents* rtcp_events,
425 const RtpReceiverStatistics* rtp_receiver_statistics) { 428 const RtpReceiverStatistics* rtp_receiver_statistics) {
426 const ReceiverRtcpSession rtcp(clock_, &pacer_, ssrc, sender_ssrc); 429 const ReceiverRtcpSession rtcp(clock_, &pacer_, ssrc, sender_ssrc);
427 rtcp.SendRtcpReport(time_data, cast_message, target_delay, rtcp_events, 430 rtcp.SendRtcpReport(time_data, cast_message, pli_message, target_delay,
428 rtp_receiver_statistics); 431 rtcp_events, rtp_receiver_statistics);
429 } 432 }
430 433
431 } // namespace cast 434 } // namespace cast
432 } // namespace media 435 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698