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

Unified Diff: remoting/protocol/webrtc_frame_scheduler.cc

Issue 2035803002: Fix WebRtcFrameScheduler to wait for first key frame request. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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 | « remoting/protocol/webrtc_frame_scheduler.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/protocol/webrtc_frame_scheduler.cc
diff --git a/remoting/protocol/webrtc_frame_scheduler.cc b/remoting/protocol/webrtc_frame_scheduler.cc
index f1671378a01b1cc1aee3183422209256ddc7962c..b4ad00a24eb519067b67cfdd936c09069fe5aef6 100644
--- a/remoting/protocol/webrtc_frame_scheduler.cc
+++ b/remoting/protocol/webrtc_frame_scheduler.cc
@@ -7,7 +7,10 @@
#include <algorithm>
#include <memory>
+#include "base/location.h"
#include "base/logging.h"
+#include "base/single_thread_task_runner.h"
+#include "base/threading/thread_task_runner_handle.h"
#include "remoting/base/constants.h"
#include "remoting/proto/video.pb.h"
@@ -38,6 +41,7 @@ WebRtcFrameScheduler::WebRtcFrameScheduler(
std::unique_ptr<VideoEncoder> encoder)
: target_bitrate_kbps_(kDefaultTargetBitrateKbps),
last_quantizer_(kMaxQuantizer),
+ main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
encode_task_runner_(encode_task_runner),
capturer_(std::move(capturer)),
webrtc_transport_(webrtc_transport),
@@ -65,8 +69,6 @@ void WebRtcFrameScheduler::Start() {
webrtc_transport_->video_encoder_factory()->SetTargetBitrateCallback(
base::Bind(&WebRtcFrameScheduler::SetTargetBitrate,
base::Unretained(this)));
- capture_timer_->Start(FROM_HERE, base::TimeDelta::FromSeconds(1) / 30, this,
- &WebRtcFrameScheduler::CaptureNextFrame);
}
void WebRtcFrameScheduler::Stop() {
@@ -97,6 +99,17 @@ void WebRtcFrameScheduler::SetKeyFrameRequest() {
VLOG(1) << "Request key frame";
base::AutoLock lock(lock_);
key_frame_request_ = true;
+ if (!received_first_frame_request_) {
+ received_first_frame_request_ = true;
+ main_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&WebRtcFrameScheduler::StartCaptureTimer,
+ weak_factory_.GetWeakPtr()));
+ }
+}
+
+void WebRtcFrameScheduler::StartCaptureTimer() {
+ capture_timer_->Start(FROM_HERE, base::TimeDelta::FromSeconds(1) / 30, this,
+ &WebRtcFrameScheduler::CaptureNextFrame);
}
void WebRtcFrameScheduler::SetTargetBitrate(int target_bitrate_kbps) {
@@ -130,8 +143,9 @@ void WebRtcFrameScheduler::OnCaptureCompleted(webrtc::DesktopFrame* frame) {
// If unchanged and does not need top-off, return.
if (!frame || (frame->updated_region().is_empty() &&
- last_quantizer_ <= kTargetQuantizerForTopOff))
+ last_quantizer_ <= kTargetQuantizerForTopOff)) {
return;
+ }
last_capture_completed_ticks_ = captured_ticks;
@@ -162,6 +176,7 @@ void WebRtcFrameScheduler::CaptureNextFrame() {
VLOG(1) << "Capture/encode still pending..";
return;
}
+
capture_pending_ = true;
VLOG(1) << "Capture next frame after "
<< (base::TimeTicks::Now() - last_capture_started_ticks_)
@@ -210,8 +225,6 @@ void WebRtcFrameScheduler::OnFrameEncoded(std::unique_ptr<VideoPacket> packet) {
// Simplistic adaptation of frame polling in the range 5 FPS to 30 FPS.
uint32_t next_sched_ms = std::max(
33, std::min(static_cast<int>(encoded_bits / target_bitrate_kbps_), 200));
- // TODO(isheriff): Investigate why first frame fails to send at times.
- // This gets resolved through a PLI request.
if (webrtc_transport_->video_encoder_factory()->SendEncodedFrame(
std::move(packet)) >= 0) {
VLOG(1) << " Send duration "
« no previous file with comments | « remoting/protocol/webrtc_frame_scheduler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698