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

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: Address dcheng's comments. Created 4 years, 9 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
« no previous file with comments | « media/cast/sender/video_sender.h ('k') | media/cast/sender/video_sender_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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..56b2296ca2c9044689145d6c98f062d1181ca9e8 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 in milliseconds that the sender sends key frame
+// request to the encoder on receiving Pli messages. This is used to prevent
+// sending multiple requests while the sender is waiting for an encoded key
+// frame or receiving multiple Pli messages in a short period.
+const int64_t kMinKeyFrameRequestOnPliIntervalMs = 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() {
@@ -192,6 +198,21 @@ void VideoSender::InsertRawVideoFrame(
return;
}
+ // Request a key frame when a Pli message was received, and it has been passed
+ // long enough from the last time sending key frame request on receiving a Pli
+ // message.
+ if (picture_lost_at_receiver_) {
+ const int64_t min_attemp_interval_ms =
+ std::max(kMinKeyFrameRequestOnPliIntervalMs,
+ 6 * target_playout_delay_.InMilliseconds());
+ if (last_time_attempted_to_resolve_pli_.is_null() ||
+ ((reference_time - last_time_attempted_to_resolve_pli_)
+ .InMilliseconds() > min_attemp_interval_ms)) {
+ video_encoder_->GenerateKeyFrame();
+ last_time_attempted_to_resolve_pli_ = reference_time;
+ }
+ }
+
// Two video frames are needed to compute the exact media duration added by
// the next frame. If there are no frames in the encoder, compute a guess
// based on the configured |max_frame_rate_|. Any error introduced by this
« no previous file with comments | « media/cast/sender/video_sender.h ('k') | media/cast/sender/video_sender_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698