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

Unified Diff: remoting/protocol/connection_unittest.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
« no previous file with comments | « remoting/host/desktop_session_proxy.cc ('k') | remoting/protocol/webrtc_frame_scheduler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: remoting/protocol/connection_unittest.cc
diff --git a/remoting/protocol/connection_unittest.cc b/remoting/protocol/connection_unittest.cc
index 1217aea7b3673ad11c6a521940ccbc90c54372b8..b1e40f6e5c2d432dc8d341a9943716bb2bb13bee 100644
--- a/remoting/protocol/connection_unittest.cc
+++ b/remoting/protocol/connection_unittest.cc
@@ -76,19 +76,25 @@ class TestScreenCapturer : public webrtc::DesktopCapturer {
void Start(Callback* callback) override {
callback_ = callback;
}
+
void CaptureFrame() override {
+ if (capture_request_index_to_fail_ >= 0) {
+ capture_request_index_to_fail_--;
+ if (capture_request_index_to_fail_ < 0) {
+ callback_->OnCaptureResult(
+ webrtc::DesktopCapturer::Result::ERROR_TEMPORARY, nullptr);
+ return;
+ }
+ }
+
// Return black 100x100 frame.
std::unique_ptr<webrtc::DesktopFrame> frame(
new webrtc::BasicDesktopFrame(webrtc::DesktopSize(100, 100)));
- memset(frame->data(), 0, frame->stride() * frame->size().height());
-
- // Set updated_region only for the first frame, as the frame content
- // doesn't change.
- if (!first_frame_sent_) {
- first_frame_sent_ = true;
- frame->mutable_updated_region()->SetRect(
- webrtc::DesktopRect::MakeSize(frame->size()));
- }
+ memset(frame->data(), frame_index_,
+ frame->stride() * frame->size().height());
+ frame_index_++;
+ frame->mutable_updated_region()->SetRect(
+ webrtc::DesktopRect::MakeSize(frame->size()));
callback_->OnCaptureResult(webrtc::DesktopCapturer::Result::SUCCESS,
std::move(frame));
@@ -102,9 +108,13 @@ class TestScreenCapturer : public webrtc::DesktopCapturer {
return true;
}
+ void FailNthFrame(int n) { capture_request_index_to_fail_ = n; }
+
private:
Callback* callback_ = nullptr;
- bool first_frame_sent_ = false;
+ int frame_index_ = 0;
+
+ int capture_request_index_to_fail_ = -1;
};
static const int kAudioSampleRate = AudioPacket::SAMPLING_RATE_48000;
@@ -346,7 +356,14 @@ class ConnectionTest : public testing::Test,
run_loop_->Quit();
}
- void WaitFirstVideoFrame() {
+ void WaitNextVideoFrame() {
+ size_t received_frames =
+ is_using_webrtc()
+ ? client_video_renderer_.GetFrameConsumer()
+ ->received_frames()
+ .size()
+ : client_video_renderer_.GetVideoStub()->received_packets().size();
+
base::RunLoop run_loop;
// Expect frames to be passed to FrameConsumer when WebRTC is used, or to
@@ -364,7 +381,7 @@ class ConnectionTest : public testing::Test,
if (is_using_webrtc()) {
EXPECT_EQ(
client_video_renderer_.GetFrameConsumer()->received_frames().size(),
- 1U);
+ received_frames + 1);
EXPECT_EQ(
client_video_renderer_.GetVideoStub()->received_packets().size(), 0U);
client_video_renderer_.GetFrameConsumer()->set_on_frame_callback(
@@ -374,7 +391,8 @@ class ConnectionTest : public testing::Test,
client_video_renderer_.GetFrameConsumer()->received_frames().size(),
0U);
EXPECT_EQ(
- client_video_renderer_.GetVideoStub()->received_packets().size(), 1U);
+ client_video_renderer_.GetVideoStub()->received_packets().size(),
+ received_frames + 1);
client_video_renderer_.GetVideoStub()->set_on_frame_callback(
base::Closure());
}
@@ -494,7 +512,7 @@ TEST_P(ConnectionTest, Video) {
host_connection_->StartVideoStream(
base::MakeUnique<TestScreenCapturer>());
- WaitFirstVideoFrame();
+ WaitNextVideoFrame();
}
// Verifies that the VideoStream doesn't loose any video frames while the
@@ -510,7 +528,7 @@ TEST_P(ConnectionTest, VideoWithSlowSignaling) {
host_connection_->StartVideoStream(
base::WrapUnique(new TestScreenCapturer()));
- WaitFirstVideoFrame();
+ WaitNextVideoFrame();
}
TEST_P(ConnectionTest, DestroyOnIncomingMessage) {
@@ -554,7 +572,7 @@ TEST_P(ConnectionTest, VideoStats) {
base::MakeUnique<TestScreenCapturer>());
video_stream->SetEventTimestampsSource(input_event_timestamps_source);
- WaitFirstVideoFrame();
+ WaitNextVideoFrame();
base::TimeTicks finish_time = base::TimeTicks::Now();
@@ -597,5 +615,49 @@ TEST_P(ConnectionTest, Audio) {
client_audio_player_.Verify();
}
+TEST_P(ConnectionTest, FirstCaptureFailed) {
+ Connect();
+
+ base::TimeTicks event_timestamp = base::TimeTicks::FromInternalValue(42);
+
+ scoped_refptr<InputEventTimestampsSourceImpl> input_event_timestamps_source =
+ new InputEventTimestampsSourceImpl();
+ input_event_timestamps_source->OnEventReceived(
+ InputEventTimestamps{event_timestamp, base::TimeTicks::Now()});
+
+ auto capturer = base::MakeUnique<TestScreenCapturer>();
+ capturer->FailNthFrame(0);
+ auto video_stream = host_connection_->StartVideoStream(std::move(capturer));
+ video_stream->SetEventTimestampsSource(input_event_timestamps_source);
+
+ WaitNextVideoFrame();
+
+ // Currently stats work in this test only for WebRTC because for ICE
+ // connections stats are reported by SoftwareVideoRenderer which is not used
+ // in this test.
+ // TODO(sergeyu): Fix this.
+ if (is_using_webrtc()) {
+ WaitFirstFrameStats();
+
+ // Verify that the event timestamp received before the first frame gets used
+ // for the second frame.
+ const FrameStats& stats = client_video_renderer_.GetFrameStatsConsumer()
+ ->received_stats()
+ .front();
+ EXPECT_EQ(event_timestamp, stats.host_stats.latest_event_timestamp);
+ }
+}
+
+TEST_P(ConnectionTest, SecondCaptureFailed) {
+ Connect();
+
+ auto capturer = base::MakeUnique<TestScreenCapturer>();
+ capturer->FailNthFrame(1);
+ auto video_stream = host_connection_->StartVideoStream(std::move(capturer));
+
+ WaitNextVideoFrame();
+ WaitNextVideoFrame();
+}
+
} // namespace protocol
} // namespace remoting
« no previous file with comments | « remoting/host/desktop_session_proxy.cc ('k') | remoting/protocol/webrtc_frame_scheduler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698