Index: media/cast/sender/video_sender.cc |
diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc |
index 0d826903fd466565ca931d1c7000e7cf16fa0a5f..aff09c1ec22554307518a23c84b14a2dbfc6451a 100644 |
--- a/media/cast/sender/video_sender.cc |
+++ b/media/cast/sender/video_sender.cc |
@@ -13,7 +13,6 @@ |
#include "base/message_loop/message_loop.h" |
#include "media/cast/cast_defines.h" |
#include "media/cast/net/cast_transport_config.h" |
-#include "media/cast/net/rtcp/rtcp_defines.h" |
#include "media/cast/sender/external_video_encoder.h" |
#include "media/cast/sender/video_encoder_impl.h" |
@@ -29,26 +28,18 @@ VideoSender::VideoSender( |
const CreateVideoEncodeAcceleratorCallback& create_vea_cb, |
const CreateVideoEncodeMemoryCallback& create_video_encode_mem_cb, |
CastTransportSender* const transport_sender) |
- : cast_environment_(cast_environment), |
+ : FrameSender( |
+ cast_environment, |
+ transport_sender, |
+ base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), |
+ kVideoFrequency, |
+ video_config.ssrc), |
target_playout_delay_(video_config.target_playout_delay), |
- transport_sender_(transport_sender), |
max_unacked_frames_( |
std::min(kMaxUnackedFrames, |
1 + static_cast<int>(target_playout_delay_ * |
video_config.max_frame_rate / |
base::TimeDelta::FromSeconds(1)))), |
- rtcp_(cast_environment_, |
- this, |
- transport_sender_, |
- NULL, // paced sender. |
- NULL, |
- video_config.rtcp_mode, |
- base::TimeDelta::FromMilliseconds(video_config.rtcp_interval), |
- video_config.ssrc, |
- video_config.incoming_feedback_ssrc, |
- video_config.rtcp_c_name, |
- VIDEO_EVENT), |
- rtp_timestamp_helper_(kVideoFrequency), |
num_aggressive_rtcp_reports_sent_(0), |
frames_in_encoder_(0), |
last_sent_frame_id_(0), |
@@ -76,13 +67,18 @@ VideoSender::VideoSender( |
media::cast::CastTransportRtpConfig transport_config; |
transport_config.ssrc = video_config.ssrc; |
+ transport_config.feedback_ssrc = video_config.incoming_feedback_ssrc; |
+ transport_config.c_name = video_config.rtcp_c_name; |
transport_config.rtp_payload_type = video_config.rtp_payload_type; |
transport_config.stored_frames = max_unacked_frames_; |
transport_config.aes_key = video_config.aes_key; |
transport_config.aes_iv_mask = video_config.aes_iv_mask; |
- transport_sender_->InitializeVideo(transport_config); |
- rtcp_.SetCastReceiverEventHistorySize(kReceiverRtcpEventHistorySize); |
+ transport_sender->InitializeVideo( |
+ transport_config, |
+ base::Bind(&VideoSender::OnReceivedCastFeedback, |
+ weak_factory_.GetWeakPtr()), |
+ base::Bind(&VideoSender::OnReceivedRtt, weak_factory_.GetWeakPtr())); |
memset(frame_id_to_rtp_timestamp_, 0, sizeof(frame_id_to_rtp_timestamp_)); |
} |
@@ -202,41 +198,20 @@ void VideoSender::SendEncodedVideoFrame( |
transport_sender_->InsertCodedVideoFrame(*encoded_frame); |
} |
-void VideoSender::IncomingRtcpPacket(scoped_ptr<Packet> packet) { |
- DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
- rtcp_.IncomingRtcpPacket(&packet->front(), packet->size()); |
-} |
- |
-void VideoSender::ScheduleNextRtcpReport() { |
- DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
- base::TimeDelta time_to_next = rtcp_.TimeToSendNextRtcpReport() - |
- cast_environment_->Clock()->NowTicks(); |
- |
- time_to_next = std::max( |
- time_to_next, base::TimeDelta::FromMilliseconds(kMinSchedulingDelayMs)); |
- |
- cast_environment_->PostDelayedTask( |
- CastEnvironment::MAIN, |
- FROM_HERE, |
- base::Bind(&VideoSender::SendRtcpReport, |
- weak_factory_.GetWeakPtr(), |
- true), |
- time_to_next); |
-} |
- |
-void VideoSender::SendRtcpReport(bool schedule_future_reports) { |
+void VideoSender::ResendCheck() { |
DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
- const base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
- uint32 now_as_rtp_timestamp = 0; |
- if (rtp_timestamp_helper_.GetCurrentTimeAsRtpTimestamp( |
- now, &now_as_rtp_timestamp)) { |
- rtcp_.SendRtcpFromRtpSender(now, now_as_rtp_timestamp); |
- } else { |
- // |rtp_timestamp_helper_| should have stored a mapping by this point. |
- NOTREACHED(); |
+ DCHECK(!last_send_time_.is_null()); |
+ const base::TimeDelta time_since_last_send = |
+ cast_environment_->Clock()->NowTicks() - last_send_time_; |
+ if (time_since_last_send > target_playout_delay_) { |
+ if (latest_acked_frame_id_ == last_sent_frame_id_) { |
+ // Last frame acked, no point in doing anything |
+ } else { |
+ VLOG(1) << "ACK timeout; last acked frame: " << latest_acked_frame_id_; |
+ ResendForKickstart(); |
+ } |
} |
- if (schedule_future_reports) |
- ScheduleNextRtcpReport(); |
+ ScheduleNextResendCheck(); |
} |
void VideoSender::ScheduleNextResendCheck() { |
@@ -254,22 +229,6 @@ void VideoSender::ScheduleNextResendCheck() { |
time_to_next); |
} |
-void VideoSender::ResendCheck() { |
- DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
- DCHECK(!last_send_time_.is_null()); |
- const base::TimeDelta time_since_last_send = |
- cast_environment_->Clock()->NowTicks() - last_send_time_; |
- if (time_since_last_send > target_playout_delay_) { |
- if (latest_acked_frame_id_ == last_sent_frame_id_) { |
- // Last frame acked, no point in doing anything |
- } else { |
- VLOG(1) << "ACK timeout; last acked frame: " << latest_acked_frame_id_; |
- ResendForKickstart(); |
- } |
- } |
- ScheduleNextResendCheck(); |
-} |
- |
void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { |
DCHECK(cast_environment_->CurrentlyOn(CastEnvironment::MAIN)); |
@@ -277,7 +236,12 @@ void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { |
base::TimeDelta avg_rtt; |
base::TimeDelta min_rtt; |
base::TimeDelta max_rtt; |
- if (rtcp_.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt)) { |
+ if (is_rtt_available()) { |
+ rtt = rtt_; |
+ avg_rtt = avg_rtt_; |
+ min_rtt = min_rtt_; |
+ max_rtt = max_rtt_; |
+ |
congestion_control_.UpdateRtt(rtt); |
// Don't use a RTT lower than our average. |
@@ -300,11 +264,11 @@ void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { |
if (last_send_time_.is_null()) |
return; // Cannot get an ACK without having first sent a frame. |
- if (cast_feedback.missing_frames_and_packets_.empty()) { |
- video_encoder_->LatestFrameIdToReference(cast_feedback.ack_frame_id_); |
+ if (cast_feedback.missing_frames_and_packets.empty()) { |
+ video_encoder_->LatestFrameIdToReference(cast_feedback.ack_frame_id); |
// We only count duplicate ACKs when we have sent newer frames. |
- if (latest_acked_frame_id_ == cast_feedback.ack_frame_id_ && |
+ if (latest_acked_frame_id_ == cast_feedback.ack_frame_id && |
latest_acked_frame_id_ != last_sent_frame_id_) { |
duplicate_ack_counter_++; |
} else { |
@@ -322,36 +286,36 @@ void VideoSender::OnReceivedCastFeedback(const RtcpCastMessage& cast_feedback) { |
// A NACK is also used to cancel pending re-transmissions. |
transport_sender_->ResendPackets( |
- false, cast_feedback.missing_frames_and_packets_, true, rtt); |
+ false, cast_feedback.missing_frames_and_packets, true, rtt); |
} |
base::TimeTicks now = cast_environment_->Clock()->NowTicks(); |
- congestion_control_.AckFrame(cast_feedback.ack_frame_id_, now); |
+ congestion_control_.AckFrame(cast_feedback.ack_frame_id, now); |
RtpTimestamp rtp_timestamp = |
- frame_id_to_rtp_timestamp_[cast_feedback.ack_frame_id_ & 0xff]; |
+ frame_id_to_rtp_timestamp_[cast_feedback.ack_frame_id & 0xff]; |
cast_environment_->Logging()->InsertFrameEvent(now, |
FRAME_ACK_RECEIVED, |
VIDEO_EVENT, |
rtp_timestamp, |
- cast_feedback.ack_frame_id_); |
+ cast_feedback.ack_frame_id); |
const bool is_acked_out_of_order = |
- static_cast<int32>(cast_feedback.ack_frame_id_ - |
+ static_cast<int32>(cast_feedback.ack_frame_id - |
latest_acked_frame_id_) < 0; |
VLOG(2) << "Received ACK" << (is_acked_out_of_order ? " out-of-order" : "") |
- << " for frame " << cast_feedback.ack_frame_id_; |
+ << " for frame " << cast_feedback.ack_frame_id; |
if (!is_acked_out_of_order) { |
// Cancel resends of acked frames. |
MissingFramesAndPacketsMap missing_frames_and_packets; |
PacketIdSet missing; |
- while (latest_acked_frame_id_ != cast_feedback.ack_frame_id_) { |
+ while (latest_acked_frame_id_ != cast_feedback.ack_frame_id) { |
latest_acked_frame_id_++; |
missing_frames_and_packets[latest_acked_frame_id_] = missing; |
} |
transport_sender_->ResendPackets( |
false, missing_frames_and_packets, true, rtt); |
- latest_acked_frame_id_ = cast_feedback.ack_frame_id_; |
+ latest_acked_frame_id_ = cast_feedback.ack_frame_id; |
} |
} |
@@ -384,16 +348,10 @@ void VideoSender::ResendForKickstart() { |
std::make_pair(last_sent_frame_id_, missing)); |
last_send_time_ = cast_environment_->Clock()->NowTicks(); |
- base::TimeDelta rtt; |
- base::TimeDelta avg_rtt; |
- base::TimeDelta min_rtt; |
- base::TimeDelta max_rtt; |
- rtcp_.Rtt(&rtt, &avg_rtt, &min_rtt, &max_rtt); |
- |
// Sending this extra packet is to kick-start the session. There is |
// no need to optimize re-transmission for this case. |
transport_sender_->ResendPackets(false, missing_frames_and_packets, |
- false, rtt); |
+ false, rtt_); |
} |
} // namespace cast |