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

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

Issue 1709863002: Add Cast PLI support on sender side. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 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/sender/video_sender.cc
diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc
index 1c39ecbc786c8646b1d92a2262857839cf8348bf..fb753b8d8120b94b7736db7b6a91ec427f3ce88c 100644
--- a/media/cast/sender/video_sender.cc
+++ b/media/cast/sender/video_sender.cc
@@ -41,6 +41,12 @@ const int kConstantTimeMs = 75;
// available to handle the occasional more-complex frames).
const int kTargetUtilizationPercentage = 75;
+// This is the minimum duration between two key frame requests. Too many Key
+// frames will reduce the dependency among frames, but reduce the picture
+// quality as well.
+const base::TimeDelta kMinKeyFrameRequestDuration =
miu 2016/02/26 23:36:07 Static initializer foo: In Chromium code, we can o
xjz 2016/02/27 05:53:32 Done.
+ base::TimeDelta::FromMilliseconds(500);
+
// Extract capture begin/end timestamps from |video_frame|'s metadata and log
// it.
void LogVideoCaptureTimestamps(CastEnvironment* cast_environment,
@@ -134,11 +140,11 @@ VideoSender::VideoSender(
transport_config.aes_iv_mask = video_config.aes_iv_mask;
transport_sender->InitializeVideo(
- transport_config,
- base::Bind(&VideoSender::OnReceivedCastFeedback,
- weak_factory_.GetWeakPtr()),
+ transport_config, base::Bind(&VideoSender::OnReceivedCastFeedback,
+ weak_factory_.GetWeakPtr()),
base::Bind(&VideoSender::OnMeasuredRoundTripTime,
- weak_factory_.GetWeakPtr()));
+ weak_factory_.GetWeakPtr()),
+ base::Bind(&VideoSender::OnReceivedPli, weak_factory_.GetWeakPtr()));
}
VideoSender::~VideoSender() {
@@ -154,6 +160,16 @@ void VideoSender::InsertRawVideoFrame(
return;
}
+ // Request a key frame when receive the PLI and it has been passed more than
+ // |kMinKeyFrameRequestDuration| frome encoding last key frame.
+ if (picture_lost_at_receiver_) {
miu 2016/02/26 23:36:07 The client may call InsertRawVideoFrame() several
xjz 2016/02/27 05:53:32 Done.
+ base::TimeDelta duration;
+ if (last_encoded_key_frame_ != base::TimeTicks())
+ duration = reference_time - last_encoded_key_frame_;
+ if (duration > kMinKeyFrameRequestDuration)
+ video_encoder_->GenerateKeyFrame();
+ }
+
const RtpTimeTicks rtp_timestamp =
RtpTimeTicks::FromTimeDelta(video_frame->timestamp(), kVideoFrequency);
LogVideoCaptureTimestamps(cast_environment_.get(), *video_frame,
@@ -306,6 +322,9 @@ void VideoSender::OnEncodedVideoFrame(
frames_in_encoder_--;
DCHECK_GE(frames_in_encoder_, 0);
+ if (encoded_frame->dependency == EncodedFrame::KEY)
+ last_encoded_key_frame_ = encoded_frame->reference_time;
+
duration_in_encoder_ =
last_enqueued_frame_reference_time_ - encoded_frame->reference_time;

Powered by Google App Engine
This is Rietveld 408576698