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

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

Issue 445933002: Cast: Move retransmission to the transport (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed test compile Created 6 years, 4 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 | Annotate | Revision Log
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 "base/single_thread_task_runner.h" 7 #include "base/single_thread_task_runner.h"
8 #include "media/cast/net/cast_transport_config.h" 8 #include "media/cast/net/cast_transport_config.h"
9 #include "media/cast/net/cast_transport_defines.h" 9 #include "media/cast/net/cast_transport_defines.h"
10 #include "media/cast/net/udp_transport.h" 10 #include "media/cast/net/udp_transport.h"
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
104 pacer_.RegisterAudioSsrc(config.ssrc); 104 pacer_.RegisterAudioSsrc(config.ssrc);
105 pacer_.RegisterPrioritySsrc(config.ssrc); 105 pacer_.RegisterPrioritySsrc(config.ssrc);
106 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); 106 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED);
107 } else { 107 } else {
108 audio_sender_.reset(); 108 audio_sender_.reset();
109 status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED); 109 status_callback_.Run(TRANSPORT_AUDIO_UNINITIALIZED);
110 return; 110 return;
111 } 111 }
112 112
113 audio_rtcp_session_.reset( 113 audio_rtcp_session_.reset(
114 new Rtcp(cast_message_cb, 114 new Rtcp(base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
115 weak_factory_.GetWeakPtr(), config.ssrc,
116 cast_message_cb),
115 rtt_cb, 117 rtt_cb,
116 base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, 118 base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
117 weak_factory_.GetWeakPtr(), AUDIO_EVENT), 119 weak_factory_.GetWeakPtr(), AUDIO_EVENT),
118 clock_, 120 clock_,
119 &pacer_, 121 &pacer_,
120 config.ssrc, 122 config.ssrc,
121 config.feedback_ssrc)); 123 config.feedback_ssrc));
122 pacer_.RegisterAudioSsrc(config.ssrc); 124 pacer_.RegisterAudioSsrc(config.ssrc);
123 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED); 125 status_callback_.Run(TRANSPORT_AUDIO_INITIALIZED);
124 } 126 }
(...skipping 10 matching lines...) Expand all
135 } 137 }
136 138
137 video_sender_.reset(new RtpSender(clock_, transport_task_runner_, &pacer_)); 139 video_sender_.reset(new RtpSender(clock_, transport_task_runner_, &pacer_));
138 if (!video_sender_->Initialize(config)) { 140 if (!video_sender_->Initialize(config)) {
139 video_sender_.reset(); 141 video_sender_.reset();
140 status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED); 142 status_callback_.Run(TRANSPORT_VIDEO_UNINITIALIZED);
141 return; 143 return;
142 } 144 }
143 145
144 video_rtcp_session_.reset( 146 video_rtcp_session_.reset(
145 new Rtcp(cast_message_cb, 147 new Rtcp(base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
148 weak_factory_.GetWeakPtr(), config.ssrc,
149 cast_message_cb),
146 rtt_cb, 150 rtt_cb,
147 base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage, 151 base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
148 weak_factory_.GetWeakPtr(), VIDEO_EVENT), 152 weak_factory_.GetWeakPtr(), VIDEO_EVENT),
149 clock_, 153 clock_,
150 &pacer_, 154 &pacer_,
151 config.ssrc, 155 config.ssrc,
152 config.feedback_ssrc)); 156 config.feedback_ssrc));
153 pacer_.RegisterVideoSsrc(config.ssrc); 157 pacer_.RegisterVideoSsrc(config.ssrc);
154 status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED); 158 status_callback_.Run(TRANSPORT_VIDEO_INITIALIZED);
155 } 159 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 audio_sender_->send_packet_count(), audio_sender_->send_octet_count()); 199 audio_sender_->send_packet_count(), audio_sender_->send_octet_count());
196 } else if (video_sender_ && ssrc == video_sender_->ssrc()) { 200 } else if (video_sender_ && ssrc == video_sender_->ssrc()) {
197 video_rtcp_session_->SendRtcpFromRtpSender( 201 video_rtcp_session_->SendRtcpFromRtpSender(
198 current_time, current_time_as_rtp_timestamp, 202 current_time, current_time_as_rtp_timestamp,
199 video_sender_->send_packet_count(), video_sender_->send_octet_count()); 203 video_sender_->send_packet_count(), video_sender_->send_octet_count());
200 } else { 204 } else {
201 NOTREACHED() << "Invalid request for sending RTCP packet."; 205 NOTREACHED() << "Invalid request for sending RTCP packet.";
202 } 206 }
203 } 207 }
204 208
209 void CastTransportSenderImpl::CancelSendingFrames(
210 uint32 ssrc,
211 const std::vector<uint32>& frame_ids) {
212 if (audio_sender_ && ssrc == audio_sender_->ssrc()) {
213 audio_sender_->CancelSendingFrames(frame_ids);
214 } else if (video_sender_ && ssrc == video_sender_->ssrc()) {
215 video_sender_->CancelSendingFrames(frame_ids);
216 } else {
217 NOTREACHED() << "Invalid request for cancel sending.";
218 }
219 }
220
221 void CastTransportSenderImpl::ResendFrameForKickstart(uint32 ssrc,
222 uint32 frame_id) {
223 if (audio_sender_ && ssrc == audio_sender_->ssrc()) {
224 DCHECK(audio_rtcp_session_);
225 audio_sender_->ResendFrameForKickstart(frame_id,
226 audio_rtcp_session_->rtt());
227 } else if (video_sender_ && ssrc == video_sender_->ssrc()) {
228 DCHECK(video_rtcp_session_);
229 video_sender_->ResendFrameForKickstart(frame_id,
230 video_rtcp_session_->rtt());
231 } else {
232 NOTREACHED() << "Invalid request for kickstart.";
233 }
234 }
235
205 void CastTransportSenderImpl::ResendPackets( 236 void CastTransportSenderImpl::ResendPackets(
206 bool is_audio, 237 uint32 ssrc,
207 const MissingFramesAndPacketsMap& missing_packets, 238 const MissingFramesAndPacketsMap& missing_packets,
208 bool cancel_rtx_if_not_in_list, 239 bool cancel_rtx_if_not_in_list,
209 base::TimeDelta dedupe_window) { 240 base::TimeDelta dedupe_window) {
210 if (is_audio) { 241 if (audio_sender_ && ssrc == audio_sender_->ssrc()) {
211 DCHECK(audio_sender_) << "Audio sender uninitialized";
212 audio_sender_->ResendPackets(missing_packets, 242 audio_sender_->ResendPackets(missing_packets,
213 cancel_rtx_if_not_in_list, 243 cancel_rtx_if_not_in_list,
214 dedupe_window); 244 dedupe_window);
215 } else { 245 } else if (video_sender_ && ssrc == video_sender_->ssrc()) {
216 DCHECK(video_sender_) << "Video sender uninitialized";
217 video_sender_->ResendPackets(missing_packets, 246 video_sender_->ResendPackets(missing_packets,
218 cancel_rtx_if_not_in_list, 247 cancel_rtx_if_not_in_list,
219 dedupe_window); 248 dedupe_window);
249 } else {
250 NOTREACHED() << "Invalid request for retransmission.";
220 } 251 }
221 } 252 }
222 253
223 PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() { 254 PacketReceiverCallback CastTransportSenderImpl::PacketReceiverForTesting() {
224 return base::Bind(&CastTransportSenderImpl::OnReceivedPacket, 255 return base::Bind(&CastTransportSenderImpl::OnReceivedPacket,
225 weak_factory_.GetWeakPtr()); 256 weak_factory_.GetWeakPtr());
226 } 257 }
227 258
228 void CastTransportSenderImpl::SendRawEvents() { 259 void CastTransportSenderImpl::SendRawEvents() {
229 DCHECK(event_subscriber_.get()); 260 DCHECK(event_subscriber_.get());
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
286 break; 317 break;
287 default: 318 default:
288 VLOG(2) << "Received log message via RTCP that we did not expect: " 319 VLOG(2) << "Received log message via RTCP that we did not expect: "
289 << static_cast<int>(event_it->type); 320 << static_cast<int>(event_it->type);
290 break; 321 break;
291 } 322 }
292 } 323 }
293 } 324 }
294 } 325 }
295 326
327 void CastTransportSenderImpl::OnReceivedCastMessage(
328 uint32 ssrc,
329 const RtcpCastMessageCallback& cast_message_cb,
330 const RtcpCastMessage& cast_message) {
331 if (!cast_message_cb.is_null())
332 cast_message_cb.Run(cast_message);
333
334 if (cast_message.missing_frames_and_packets.empty())
335 return;
336
337 base::TimeDelta rtt;
338 if (video_sender_ && video_sender_->ssrc() == ssrc) {
339 rtt = video_rtcp_session_->rtt();
340 }
341
342 // This call does two things.
343 // 1. Specifies that retransmissions for packets not listed in the set are
344 // cancelled.
345 // 2. Specifies a deduplication window. For video this would be the most
346 // recent RTT. For audio there is no deduplication.
347 ResendPackets(ssrc,
348 cast_message.missing_frames_and_packets,
349 true,
350 rtt);
351 }
352
296 } // namespace cast 353 } // namespace cast
297 } // namespace media 354 } // 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