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

Side by Side Diff: remoting/protocol/webrtc_frame_scheduler_simple.cc

Issue 2425873002: Add network parameters fields in FrameStatsMessage (Closed)
Patch Set: . Created 4 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "remoting/protocol/webrtc_frame_scheduler_simple.h" 5 #include "remoting/protocol/webrtc_frame_scheduler_simple.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "remoting/protocol/frame_stats.h"
9 #include "remoting/protocol/webrtc_dummy_video_encoder.h" 10 #include "remoting/protocol/webrtc_dummy_video_encoder.h"
10 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h" 11 #include "third_party/webrtc/modules/desktop_capture/desktop_frame.h"
11 12
12 namespace remoting { 13 namespace remoting {
13 namespace protocol { 14 namespace protocol {
14 15
15 namespace { 16 namespace {
16 17
17 // Number of samples used to estimate processing time for the next frame. 18 // Number of samples used to estimate processing time for the next frame.
18 const int kStatsWindow = 5; 19 const int kStatsWindow = 5;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 64
64 void WebrtcFrameSchedulerSimple::OnKeyFrameRequested() { 65 void WebrtcFrameSchedulerSimple::OnKeyFrameRequested() {
65 DCHECK(thread_checker_.CalledOnValidThread()); 66 DCHECK(thread_checker_.CalledOnValidThread());
66 key_frame_request_ = true; 67 key_frame_request_ = true;
67 ScheduleNextFrame(base::TimeTicks::Now()); 68 ScheduleNextFrame(base::TimeTicks::Now());
68 } 69 }
69 70
70 void WebrtcFrameSchedulerSimple::OnChannelParameters(int packet_loss, 71 void WebrtcFrameSchedulerSimple::OnChannelParameters(int packet_loss,
71 base::TimeDelta rtt) { 72 base::TimeDelta rtt) {
72 DCHECK(thread_checker_.CalledOnValidThread()); 73 DCHECK(thread_checker_.CalledOnValidThread());
74
75 rtt_estimate_ = rtt;
73 } 76 }
74 77
75 void WebrtcFrameSchedulerSimple::OnTargetBitrateChanged(int bitrate_kbps) { 78 void WebrtcFrameSchedulerSimple::OnTargetBitrateChanged(int bitrate_kbps) {
76 DCHECK(thread_checker_.CalledOnValidThread()); 79 DCHECK(thread_checker_.CalledOnValidThread());
77 base::TimeTicks now = base::TimeTicks::Now(); 80 base::TimeTicks now = base::TimeTicks::Now();
78 pacing_bucket_.UpdateRate(bitrate_kbps * 1000 / 8, now); 81 pacing_bucket_.UpdateRate(bitrate_kbps * 1000 / 8, now);
79 ScheduleNextFrame(now); 82 ScheduleNextFrame(now);
80 } 83 }
81 84
82 void WebrtcFrameSchedulerSimple::Start( 85 void WebrtcFrameSchedulerSimple::Start(
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 151
149 params_out->vpx_max_quantizer = 63; 152 params_out->vpx_max_quantizer = 63;
150 153
151 params_out->clear_active_map = !top_off_is_active_; 154 params_out->clear_active_map = !top_off_is_active_;
152 155
153 return true; 156 return true;
154 } 157 }
155 158
156 void WebrtcFrameSchedulerSimple::OnFrameEncoded( 159 void WebrtcFrameSchedulerSimple::OnFrameEncoded(
157 const WebrtcVideoEncoder::EncodedFrame& encoded_frame, 160 const WebrtcVideoEncoder::EncodedFrame& encoded_frame,
158 const webrtc::EncodedImageCallback::Result& send_result) { 161 const webrtc::EncodedImageCallback::Result& send_result,
162 HostFrameStats* frame_stats) {
159 DCHECK(thread_checker_.CalledOnValidThread()); 163 DCHECK(thread_checker_.CalledOnValidThread());
160 DCHECK(frame_pending_); 164 DCHECK(frame_pending_);
161 frame_pending_ = false; 165 frame_pending_ = false;
162 166
163 base::TimeTicks now = base::TimeTicks::Now(); 167 base::TimeTicks now = base::TimeTicks::Now();
168
169 if (frame_stats) {
170 // Calculate |send_pending_delay| before refilling |pacing_bucket_|.
171 frame_stats->send_pending_delay =
172 std::max(base::TimeDelta(), pacing_bucket_.GetEmptyTime() - now);
173 }
174
164 pacing_bucket_.RefillOrSpill(encoded_frame.data.size(), now); 175 pacing_bucket_.RefillOrSpill(encoded_frame.data.size(), now);
165 176
166 if (encoded_frame.data.empty()) { 177 if (encoded_frame.data.empty()) {
167 top_off_is_active_ = false; 178 top_off_is_active_ = false;
168 } else { 179 } else {
169 frame_processing_delay_us_.Record( 180 frame_processing_delay_us_.Record(
170 (now - last_capture_started_time_).InMicroseconds()); 181 (now - last_capture_started_time_).InMicroseconds());
171 182
172 // Top-off until the target quantizer value is reached. 183 // Top-off until the target quantizer value is reached.
173 top_off_is_active_ = encoded_frame.quantizer > kTargetQuantizerForVp8TopOff; 184 top_off_is_active_ = encoded_frame.quantizer > kTargetQuantizerForVp8TopOff;
174 } 185 }
175 186
176 ScheduleNextFrame(now); 187 ScheduleNextFrame(now);
188
189 if (frame_stats) {
190 frame_stats->rtt_estimate = rtt_estimate_;
191 frame_stats->bandwidth_estimate_kbps = pacing_bucket_.rate() * 8 / 1000;
192 }
177 } 193 }
178 194
179 void WebrtcFrameSchedulerSimple::ScheduleNextFrame(base::TimeTicks now) { 195 void WebrtcFrameSchedulerSimple::ScheduleNextFrame(base::TimeTicks now) {
180 DCHECK(thread_checker_.CalledOnValidThread()); 196 DCHECK(thread_checker_.CalledOnValidThread());
181 197
182 if (paused_ || pacing_bucket_.rate() == 0 || capture_callback_.is_null() || 198 if (paused_ || pacing_bucket_.rate() == 0 || capture_callback_.is_null() ||
183 frame_pending_) { 199 frame_pending_) {
184 return; 200 return;
185 } 201 }
186 202
(...skipping 21 matching lines...) Expand all
208 void WebrtcFrameSchedulerSimple::CaptureNextFrame() { 224 void WebrtcFrameSchedulerSimple::CaptureNextFrame() {
209 DCHECK(thread_checker_.CalledOnValidThread()); 225 DCHECK(thread_checker_.CalledOnValidThread());
210 DCHECK(!frame_pending_); 226 DCHECK(!frame_pending_);
211 last_capture_started_time_ = base::TimeTicks::Now(); 227 last_capture_started_time_ = base::TimeTicks::Now();
212 frame_pending_ = true; 228 frame_pending_ = true;
213 capture_callback_.Run(); 229 capture_callback_.Run();
214 } 230 }
215 231
216 } // namespace protocol 232 } // namespace protocol
217 } // namespace remoting 233 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/protocol/webrtc_frame_scheduler_simple.h ('k') | remoting/protocol/webrtc_video_stream.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698