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 "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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |