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