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

Unified Diff: remoting/protocol/webrtc_video_stream.cc

Issue 2616213002: Fix WebrtcVideoStream to handle failed capture requests. (Closed)
Patch Set: Created 3 years, 11 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: remoting/protocol/webrtc_video_stream.cc
diff --git a/remoting/protocol/webrtc_video_stream.cc b/remoting/protocol/webrtc_video_stream.cc
index 7e2434b41dbf374e61d59c339078d430585b6ad9..7450fb5cc04af6b8d5a3aacb4a0ba607ea208ffa 100644
--- a/remoting/protocol/webrtc_video_stream.cc
+++ b/remoting/protocol/webrtc_video_stream.cc
@@ -139,26 +139,33 @@ void WebrtcVideoStream::OnCaptureResult(
std::unique_ptr<webrtc::DesktopFrame> frame) {
DCHECK(thread_checker_.CalledOnValidThread());
- // TODO(sergeyu): Handle ERROR_PERMANENT result here.
-
- webrtc::DesktopVector dpi =
- frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi)
- : frame->dpi();
-
- if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) {
- frame_size_ = frame->size();
- frame_dpi_ = dpi;
- if (observer_)
- observer_->OnVideoSizeChanged(this, frame_size_, frame_dpi_);
- }
-
captured_frame_timestamps_->capture_ended_time = base::TimeTicks::Now();
captured_frame_timestamps_->capture_delay =
- base::TimeDelta::FromMilliseconds(frame->capture_time_ms());
+ base::TimeDelta::FromMilliseconds(frame ? frame->capture_time_ms() : 0);
WebrtcVideoEncoder::FrameParams frame_params;
- if (!scheduler_->GetEncoderFrameParams(*frame, &frame_params))
+ if (!scheduler_->OnFrameCaptured(frame.get(), &frame_params)) {
return;
+ }
+
+ // TODO(sergeyu): Handle ERROR_PERMANENT result here.
+ if (frame) {
+ webrtc::DesktopVector dpi =
+ frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi)
+ : frame->dpi();
+
+ if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) {
+ frame_size_ = frame->size();
+ frame_dpi_ = dpi;
+ if (observer_)
+ observer_->OnVideoSizeChanged(this, frame_size_, frame_dpi_);
+ }
+ } else {
+ // Save event timestamps to be used for the next frame.
+ next_frame_input_event_timestamps_ =
+ captured_frame_timestamps_->input_event_timestamps;
+ captured_frame_timestamps_->input_event_timestamps = InputEventTimestamps();
+ }
base::PostTaskAndReplyWithResult(
encode_task_runner_.get(), FROM_HERE,
@@ -185,7 +192,11 @@ void WebrtcVideoStream::CaptureNextFrame() {
captured_frame_timestamps_.reset(new FrameTimestamps());
captured_frame_timestamps_->capture_started_time = base::TimeTicks::Now();
- if (event_timestamps_source_) {
+ if (!next_frame_input_event_timestamps_.is_null()) {
+ captured_frame_timestamps_->input_event_timestamps =
+ next_frame_input_event_timestamps_;
+ next_frame_input_event_timestamps_ = InputEventTimestamps();
+ } else if (event_timestamps_source_) {
captured_frame_timestamps_->input_event_timestamps =
event_timestamps_source_->TakeLastEventTimestamps();
}
@@ -202,7 +213,7 @@ WebrtcVideoStream::EncodedFrameWithTimestamps WebrtcVideoStream::EncodeFrame(
EncodedFrameWithTimestamps result;
result.timestamps = std::move(timestamps);
result.timestamps->encode_started_time = base::TimeTicks::Now();
- result.frame = encoder->Encode(*frame, params);
+ result.frame = encoder->Encode(frame.get(), params);
result.timestamps->encode_ended_time = base::TimeTicks::Now();
return result;
}
@@ -210,6 +221,13 @@ WebrtcVideoStream::EncodedFrameWithTimestamps WebrtcVideoStream::EncodeFrame(
void WebrtcVideoStream::OnFrameEncoded(EncodedFrameWithTimestamps frame) {
DCHECK(thread_checker_.CalledOnValidThread());
+ HostFrameStats stats;
+ scheduler_->OnFrameEncoded(frame.frame.get(), &stats);
+
+ if (!frame.frame) {
+ return;
+ }
+
webrtc::EncodedImageCallback::Result result =
webrtc_transport_->video_encoder_factory()->SendEncodedFrame(
*frame.frame, frame.timestamps->capture_started_time);
@@ -219,12 +237,9 @@ void WebrtcVideoStream::OnFrameEncoded(EncodedFrameWithTimestamps frame) {
return;
}
- HostFrameStats stats;
- scheduler_->OnFrameEncoded(*frame.frame, result, &stats);
-
// Send FrameStats message.
if (video_stats_dispatcher_.is_connected()) {
- stats.frame_size = frame.frame->data.size();
+ stats.frame_size = frame.frame ? frame.frame->data.size() : 0;
if (!frame.timestamps->input_event_timestamps.is_null()) {
stats.capture_pending_delay =
« remoting/protocol/webrtc_frame_scheduler_simple.cc ('K') | « remoting/protocol/webrtc_video_stream.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698