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

Unified Diff: content/renderer/media/webrtc/webrtc_video_capturer_adapter_unittest.cc

Issue 2585313002: Propagate MediaStreamTrack video content hints. (Closed)
Patch Set: remove else from else-if Created 4 years 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: content/renderer/media/webrtc/webrtc_video_capturer_adapter_unittest.cc
diff --git a/content/renderer/media/webrtc/webrtc_video_capturer_adapter_unittest.cc b/content/renderer/media/webrtc/webrtc_video_capturer_adapter_unittest.cc
index 45c52dd9fa8a8b1ed3fd11b96b5eba7b48c98613..bf3a2804a2660af9d7ffc648a08363b40c2aee53 100644
--- a/content/renderer/media/webrtc/webrtc_video_capturer_adapter_unittest.cc
+++ b/content/renderer/media/webrtc/webrtc_video_capturer_adapter_unittest.cc
@@ -24,13 +24,15 @@ class WebRtcVideoCapturerAdapterTest
public ::testing::Test {
public:
WebRtcVideoCapturerAdapterTest()
- : adapter_(false),
+ : adapter_(new WebRtcVideoCapturerAdapter(
+ false,
+ blink::WebMediaStreamTrack::ContentHintType::None)),
output_frame_width_(0),
output_frame_height_(0) {
- adapter_.AddOrUpdateSink(this, rtc::VideoSinkWants());
+ adapter_->AddOrUpdateSink(this, rtc::VideoSinkWants());
}
~WebRtcVideoCapturerAdapterTest() override {
- adapter_.RemoveSink(this);
+ adapter_->RemoveSink(this);
}
void TestSourceCropFrame(int capture_width,
@@ -48,7 +50,7 @@ class WebRtcVideoCapturerAdapterTest
scoped_refptr<media::VideoFrame> frame = media::VideoFrame::CreateFrame(
media::PIXEL_FORMAT_I420, coded_size, view_rect, natural_size,
base::TimeDelta());
- adapter_.OnFrameCaptured(frame);
+ adapter_->OnFrameCaptured(frame);
EXPECT_EQ(natural_width, output_frame_width_);
EXPECT_EQ(natural_height, output_frame_height_);
}
@@ -62,7 +64,7 @@ class WebRtcVideoCapturerAdapterTest
media::PIXEL_FORMAT_ARGB, holders, base::Bind(&ReleaseMailboxCB),
gfx::Size(10, 10), gfx::Rect(10, 10), gfx::Size(10, 10),
base::TimeDelta());
- adapter_.OnFrameCaptured(frame);
+ adapter_->OnFrameCaptured(frame);
ASSERT_TRUE(output_frame_);
rtc::scoped_refptr<webrtc::VideoFrameBuffer> texture_frame =
output_frame_->video_frame_buffer();
@@ -85,11 +87,54 @@ class WebRtcVideoCapturerAdapterTest
output_frame_height_ = frame.height();
}
+ void TestContentHintResolutionAdaptation(
+ bool is_screencast,
+ blink::WebMediaStreamTrack::ContentHintType construction_content_hint,
+ bool expect_initial_downscale,
+ blink::WebMediaStreamTrack::ContentHintType set_content_hint,
+ bool expect_final_downscale) {
+ // Reset and configure adapter to the test.
+ adapter_->RemoveSink(this);
+ adapter_.reset(new WebRtcVideoCapturerAdapter(is_screencast,
+ construction_content_hint));
+
+ const int kInputWidth = 1280;
+ const int kInputHeight = 720;
+ gfx::Size size(kInputWidth, kInputHeight);
emircan 2016/12/19 21:14:27 const
pbos 2016/12/19 21:42:26 Done.
+ scoped_refptr<media::VideoFrame> frame = media::VideoFrame::CreateFrame(
+ media::PIXEL_FORMAT_I420, size, gfx::Rect(size), size,
+ base::TimeDelta());
+
+ // Request smaller scale to make sure scaling normally kicks in.
+ rtc::VideoSinkWants wants;
+ wants.max_pixel_count = rtc::Optional<int>(kInputWidth * kInputHeight / 2);
+ adapter_->AddOrUpdateSink(this, wants);
+
+ adapter_->OnFrameCaptured(frame);
+ if (expect_initial_downscale) {
+ EXPECT_LT(output_frame_width_, kInputWidth);
+ EXPECT_LT(output_frame_height_, kInputHeight);
+ } else {
+ EXPECT_EQ(kInputWidth, output_frame_width_);
+ EXPECT_EQ(kInputHeight, output_frame_height_);
+ }
+
+ adapter_->SetContentHint(set_content_hint);
+ adapter_->OnFrameCaptured(frame);
+ if (expect_final_downscale) {
+ EXPECT_LT(output_frame_width_, kInputWidth);
+ EXPECT_LT(output_frame_height_, kInputHeight);
+ } else {
+ EXPECT_EQ(kInputWidth, output_frame_width_);
+ EXPECT_EQ(kInputHeight, output_frame_height_);
+ }
+ }
+
private:
const base::MessageLoopForIO message_loop_;
const ChildProcess child_process_;
- WebRtcVideoCapturerAdapter adapter_;
+ std::unique_ptr<WebRtcVideoCapturerAdapter> adapter_;
base::Optional<webrtc::VideoFrame> output_frame_;
int output_frame_width_;
int output_frame_height_;
@@ -111,4 +156,28 @@ TEST_F(WebRtcVideoCapturerAdapterTest, SendsWithCopyTextureFrameCallback) {
TestSourceTextureFrame();
}
+TEST_F(WebRtcVideoCapturerAdapterTest, DoesNotAdaptContentHintDetail) {
+ // Non-screenshare adapter should not adapt frames when detailed is set.
emircan 2016/12/19 21:14:27 Can you parameterize these tests using GetParam()
pbos 2016/12/19 21:42:26 I added the corresponding transitions instead, hop
emircan 2016/12/19 22:37:53 I would highly recommend it because you can easily
pbos 2016/12/19 22:44:27 Ack, will go with this now be because 2/5 paramete
+ TestContentHintResolutionAdaptation(
+ false, blink::WebMediaStreamTrack::ContentHintType::None, true,
+ blink::WebMediaStreamTrack::ContentHintType::VideoDetailed, false);
+}
+
+TEST_F(WebRtcVideoCapturerAdapterTest,
+ DoesAdaptScreencastWithFluidContentHint) {
+ // Screenshare adapter should adapt frames when fluid is set.
+ TestContentHintResolutionAdaptation(
+ true, blink::WebMediaStreamTrack::ContentHintType::None, false,
+ blink::WebMediaStreamTrack::ContentHintType::VideoFluid, true);
+}
+
+TEST_F(WebRtcVideoCapturerAdapterTest,
+ RespectsConstructionTimeContentHint) {
+ // Non-screenshare adapter constructed with detailed content hint should not
+ // adapt before SetContentHint is run.
+ TestContentHintResolutionAdaptation(
+ false, blink::WebMediaStreamTrack::ContentHintType::VideoDetailed, false,
+ blink::WebMediaStreamTrack::ContentHintType::VideoFluid, true);
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698