Index: media/cast/sender/video_sender.cc |
diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc |
index 8c99da9e403c28ae6a690e59a6a67f6b42040728..15c5c8907eae9ad9119de79906da979a73e27140 100644 |
--- a/media/cast/sender/video_sender.cc |
+++ b/media/cast/sender/video_sender.cc |
@@ -29,26 +29,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, |
+ false), |
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 +68,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 +199,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 +230,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 +237,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. |
@@ -384,16 +349,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 |