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..c96fb1bb329e70aab232a13798da55ed18ea1ae2 100644 |
--- a/content/renderer/media/webrtc/webrtc_video_capturer_adapter_unittest.cc |
+++ b/content/renderer/media/webrtc/webrtc_video_capturer_adapter_unittest.cc |
@@ -24,14 +24,14 @@ 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()); |
- } |
- ~WebRtcVideoCapturerAdapterTest() override { |
- adapter_.RemoveSink(this); |
+ adapter_->AddOrUpdateSink(this, rtc::VideoSinkWants()); |
} |
+ ~WebRtcVideoCapturerAdapterTest() override { adapter_->RemoveSink(this); } |
void TestSourceCropFrame(int capture_width, |
int capture_height, |
@@ -48,7 +48,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 +62,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 +85,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; |
+ const gfx::Size kSize(kInputWidth, kInputHeight); |
+ scoped_refptr<media::VideoFrame> frame = media::VideoFrame::CreateFrame( |
+ media::PIXEL_FORMAT_I420, kSize, gfx::Rect(kSize), kSize, |
+ 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 +154,44 @@ TEST_F(WebRtcVideoCapturerAdapterTest, SendsWithCopyTextureFrameCallback) { |
TestSourceTextureFrame(); |
} |
+TEST_F(WebRtcVideoCapturerAdapterTest, |
+ NonScreencastAdapterDoesNotAdaptContentHintDetail) { |
+ // Non-screenshare adapter should not adapt frames when detailed is set. |
+ TestContentHintResolutionAdaptation( |
+ false, blink::WebMediaStreamTrack::ContentHintType::None, true, |
+ blink::WebMediaStreamTrack::ContentHintType::VideoDetailed, false); |
+} |
+ |
+TEST_F(WebRtcVideoCapturerAdapterTest, |
+ NonScreencastAdapterAdaptsContentHintFluid) { |
+ // Non-screenshare adapter should still adapt frames when fluid is set. |
+ TestContentHintResolutionAdaptation( |
+ false, blink::WebMediaStreamTrack::ContentHintType::None, true, |
+ blink::WebMediaStreamTrack::ContentHintType::VideoFluid, true); |
+} |
+ |
+TEST_F(WebRtcVideoCapturerAdapterTest, |
+ ScreencastAdapterAdaptsContentHintFluid) { |
+ // Screenshare adapter should adapt frames when fluid is set. |
+ TestContentHintResolutionAdaptation( |
+ true, blink::WebMediaStreamTrack::ContentHintType::None, false, |
+ blink::WebMediaStreamTrack::ContentHintType::VideoFluid, true); |
+} |
+ |
+TEST_F(WebRtcVideoCapturerAdapterTest, |
+ ScreencastAdapterDoesNotAdaptContentHintDetailed) { |
+ // Screenshare adapter should still not adapt frames when detailed is set. |
+ TestContentHintResolutionAdaptation( |
+ true, blink::WebMediaStreamTrack::ContentHintType::None, false, |
+ blink::WebMediaStreamTrack::ContentHintType::VideoDetailed, false); |
+} |
+ |
+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 |