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

Unified 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: IPC 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 side-by-side diff with in-line comments
Download patch
Index: media/cast/net/cast_transport_sender_impl.cc
diff --git a/media/cast/net/cast_transport_sender_impl.cc b/media/cast/net/cast_transport_sender_impl.cc
index 248c69d6bb1e9c3b5d227ef45746aa122c533292..705a17652d274cdf67e7526d9fec3ed7583c5467 100644
--- a/media/cast/net/cast_transport_sender_impl.cc
+++ b/media/cast/net/cast_transport_sender_impl.cc
@@ -111,8 +111,11 @@ void CastTransportSenderImpl::InitializeAudio(
}
audio_rtcp_session_.reset(
- new Rtcp(cast_message_cb,
- rtt_cb,
+ new Rtcp(base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
+ weak_factory_.GetWeakPtr(), config.ssrc,
+ cast_message_cb),
+ base::Bind(&CastTransportSenderImpl::OnReceivedRtt,
+ weak_factory_.GetWeakPtr(), rtt_cb),
base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
weak_factory_.GetWeakPtr(), AUDIO_EVENT),
clock_,
@@ -142,8 +145,11 @@ void CastTransportSenderImpl::InitializeVideo(
}
video_rtcp_session_.reset(
- new Rtcp(cast_message_cb,
- rtt_cb,
+ new Rtcp(base::Bind(&CastTransportSenderImpl::OnReceivedCastMessage,
hubbe 2014/08/11 19:11:49 Do we really want one rtcp object for audio and on
Alpha Left Google 2014/08/11 21:03:17 Yes we do. RTCP object maintain some states intern
+ weak_factory_.GetWeakPtr(), config.ssrc,
+ cast_message_cb),
+ base::Bind(&CastTransportSenderImpl::OnReceivedRtt,
+ weak_factory_.GetWeakPtr(), rtt_cb),
base::Bind(&CastTransportSenderImpl::OnReceivedLogMessage,
weak_factory_.GetWeakPtr(), VIDEO_EVENT),
clock_,
@@ -202,21 +208,49 @@ void CastTransportSenderImpl::SendSenderReport(
}
}
+void CastTransportSenderImpl::CancelSendingFrames(
+ uint32 ssrc,
+ const std::set<uint32>& frame_ids) {
+ // Cancel resends of acked frames.
+ MissingFramesAndPacketsMap missing_frames_and_packets;
+ PacketIdSet missing;
+ for (std::set<uint32>::const_iterator it = frame_ids.begin();
+ it != frame_ids.end(); ++it) {
+ missing_frames_and_packets[*it] = missing;
+ }
+ ResendPackets(ssrc, missing_frames_and_packets, true, base::TimeDelta());
hubbe 2014/08/11 19:11:50 Why not call audio/video_sender->CancelSendingFram
Alpha Left Google 2014/08/11 21:03:18 Done.
+}
+
+void CastTransportSenderImpl::ResendFrameForKickstart(uint32 ssrc,
+ uint32 frame_id) {
+ // Send the last packet of the encoded frame to kick start
+ // retransmission. This gives enough information to the receiver what
+ // packets and frames are missing.
+ MissingFramesAndPacketsMap missing_frames_and_packets;
+ PacketIdSet missing;
+ missing.insert(kRtcpCastLastPacket);
+ missing_frames_and_packets.insert(std::make_pair(frame_id, missing));
+
+ // Sending this extra packet is to kick-start the session. There is
+ // no need to optimize re-transmission for this case.
+ ResendPackets(ssrc, missing_frames_and_packets, false, most_recent_rtt_);
hubbe 2014/08/11 19:11:49 Why not call audio/video_sender_->ResendFrameForKi
Alpha Left Google 2014/08/11 21:03:17 Done.
+}
+
void CastTransportSenderImpl::ResendPackets(
- bool is_audio,
+ uint32 ssrc,
const MissingFramesAndPacketsMap& missing_packets,
bool cancel_rtx_if_not_in_list,
base::TimeDelta dedupe_window) {
- if (is_audio) {
- DCHECK(audio_sender_) << "Audio sender uninitialized";
+ if (audio_sender_ && ssrc == audio_sender_->ssrc()) {
audio_sender_->ResendPackets(missing_packets,
cancel_rtx_if_not_in_list,
dedupe_window);
- } else {
- DCHECK(video_sender_) << "Video sender uninitialized";
+ } else if (video_sender_ && ssrc == video_sender_->ssrc()) {
video_sender_->ResendPackets(missing_packets,
cancel_rtx_if_not_in_list,
dedupe_window);
+ } else {
+ NOTREACHED() << "Invalid request for retransmission.";
}
}
@@ -293,5 +327,39 @@ void CastTransportSenderImpl::OnReceivedLogMessage(
}
}
+void CastTransportSenderImpl::OnReceivedRtt(const RtcpRttCallback& rtt_cb,
+ base::TimeDelta rtt,
+ base::TimeDelta avg_rtt,
+ base::TimeDelta min_rtt,
+ base::TimeDelta max_rtt) {
+ if (!rtt_cb.is_null())
+ rtt_cb.Run(rtt, avg_rtt, min_rtt, max_rtt);
+
+ most_recent_rtt_ = rtt;
hubbe 2014/08/11 19:11:49 Seems like it would be cleaner to just have the rt
Alpha Left Google 2014/08/11 21:03:18 Done.
+}
+
+void CastTransportSenderImpl::OnReceivedCastMessage(
+ uint32 ssrc,
+ const RtcpCastMessageCallback& cast_message_cb,
+ const RtcpCastMessage& cast_message) {
+ if (!cast_message_cb.is_null())
+ cast_message_cb.Run(cast_message);
+
+ if (cast_message.missing_frames_and_packets.empty())
+ return;
+
+ const bool is_audio = audio_sender_ && audio_sender_->ssrc() == ssrc;
+
+ // This call does two things.
+ // 1. Specifies that retransmissions for packets not listed in the set are
+ // cancelled.
+ // 2. Specifies a deduplication window. For video this would be the most
+ // recent RTT. For audio there is no deduplication.
+ ResendPackets(ssrc,
+ cast_message.missing_frames_and_packets,
+ true,
+ is_audio ? base::TimeDelta() : most_recent_rtt_);
+}
+
} // namespace cast
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698