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

Unified Diff: media/cast/video_sender/video_sender.cc

Issue 252923007: Cast: Fix two video freezing problems (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: hide max outstanding frames from cast library users Created 6 years, 8 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/video_sender/video_sender.cc
diff --git a/media/cast/video_sender/video_sender.cc b/media/cast/video_sender/video_sender.cc
index ee0e3d14ff1635733db753fa429a8fb713778195..8fae0804702c5d110bc213c949f001d495a762c9 100644
--- a/media/cast/video_sender/video_sender.cc
+++ b/media/cast/video_sender/video_sender.cc
@@ -61,6 +61,7 @@ VideoSender::VideoSender(
rtcp_feedback_(new LocalRtcpVideoSenderFeedback(this)),
last_acked_frame_id_(-1),
last_sent_frame_id_(-1),
+ frames_in_encoder_(0),
duplicate_ack_(0),
last_skip_count_(0),
current_requested_bitrate_(video_config.start_bitrate),
@@ -88,6 +89,13 @@ VideoSender::VideoSender(
cast_environment, video_config, max_unacked_frames_));
}
+
+ media::cast::transport::CastTransportVideoConfig transport_config;
+ transport_config.codec = video_config.codec;
+ transport_config.rtp.config = video_config.rtp_config;
+ transport_config.rtp.max_outstanding_frames = max_unacked_frames_ + 1;
+ transport_sender_->InitializeVideo(transport_config);
+
rtcp_.reset(
new Rtcp(cast_environment_,
rtcp_feedback_.get(),
@@ -96,7 +104,7 @@ VideoSender::VideoSender(
NULL,
video_config.rtcp_mode,
base::TimeDelta::FromMilliseconds(video_config.rtcp_interval),
- video_config.sender_ssrc,
+ video_config.rtp_config.ssrc,
video_config.incoming_feedback_ssrc,
video_config.rtcp_c_name));
rtcp_->SetCastReceiverEventHistorySize(kReceiverRtcpEventHistorySize);
@@ -150,11 +158,13 @@ void VideoSender::InsertRawVideoFrame(
"timestamp", capture_time.ToInternalValue(),
"rtp_timestamp", GetVideoRtpTimestamp(capture_time));
- if (!video_encoder_->EncodeVideoFrame(
+ if (video_encoder_->EncodeVideoFrame(
video_frame,
capture_time,
base::Bind(&VideoSender::SendEncodedVideoFrameMainThread,
weak_factory_.GetWeakPtr()))) {
+ frames_in_encoder_++;
+ UpdateFramesInFlight();
}
}
@@ -168,6 +178,8 @@ void VideoSender::SendEncodedVideoFrameMainThread(
<< static_cast<int>(encoded_frame->frame_id);
}
+ DCHECK_GT(frames_in_encoder_, 0);
+ frames_in_encoder_--;
uint32 frame_id = encoded_frame->frame_id;
cast_environment_->Logging()->InsertEncodedFrameEvent(
last_send_time_, kVideoFrameEncoded, encoded_frame->rtp_timestamp,
@@ -296,10 +308,14 @@ void VideoSender::ResendCheck() {
VLOG(1) << "ACK timeout resend first key frame";
ResendFrame(0);
} else {
- DCHECK_LE(0, last_acked_frame_id_);
- uint32 frame_id = static_cast<uint32>(last_acked_frame_id_ + 1);
- VLOG(1) << "ACK timeout resend frame:" << static_cast<int>(frame_id);
- ResendFrame(frame_id);
+ if (last_acked_frame_id_ == last_sent_frame_id_) {
+ // Last frame acked, no point in doing anything
Alpha Left Google 2014/04/29 00:55:05 Please have a test for this case. This is a third
hubbe 2014/04/29 17:19:58 Actually, the problem is that without this if-stat
+ } else {
+ DCHECK_LE(0, last_acked_frame_id_);
+ uint32 frame_id = static_cast<uint32>(last_acked_frame_id_ + 1);
+ VLOG(1) << "ACK timeout resend frame:" << static_cast<int>(frame_id);
+ ResendFrame(frame_id);
+ }
}
}
}
@@ -443,9 +459,11 @@ void VideoSender::UpdateFramesInFlight() {
} else {
frames_in_flight = static_cast<uint32>(last_sent_frame_id_) + 1;
}
+ frames_in_flight += frames_in_encoder_;
VLOG(2) << frames_in_flight
<< " Frames in flight; last sent: " << last_sent_frame_id_
- << " last acked:" << last_acked_frame_id_;
+ << " last acked:" << last_acked_frame_id_
+ << " frames in encoder: " << frames_in_encoder_;
if (frames_in_flight >= max_unacked_frames_) {
video_encoder_->SkipNextFrame(true);
return;

Powered by Google App Engine
This is Rietveld 408576698