1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2010 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker #include "media/base/video_adapter.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <limits>
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker #include <string>
16*d9f75844SAndroid Build Coastguard Worker #include <utility>
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Worker #include "api/video/resolution.h"
19*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame.h"
20*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_source_interface.h"
21*d9f75844SAndroid Build Coastguard Worker #include "media/base/fake_frame_source.h"
22*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/arraysize.h"
23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/time_utils.h"
24*d9f75844SAndroid Build Coastguard Worker #include "test/field_trial.h"
25*d9f75844SAndroid Build Coastguard Worker #include "test/gmock.h"
26*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker namespace cricket {
29*d9f75844SAndroid Build Coastguard Worker namespace {
30*d9f75844SAndroid Build Coastguard Worker const int kWidth = 1280;
31*d9f75844SAndroid Build Coastguard Worker const int kHeight = 720;
32*d9f75844SAndroid Build Coastguard Worker const int kDefaultFps = 30;
33*d9f75844SAndroid Build Coastguard Worker
34*d9f75844SAndroid Build Coastguard Worker using ::testing::_;
35*d9f75844SAndroid Build Coastguard Worker using ::testing::Eq;
36*d9f75844SAndroid Build Coastguard Worker using ::testing::Pair;
37*d9f75844SAndroid Build Coastguard Worker using webrtc::Resolution;
38*d9f75844SAndroid Build Coastguard Worker
BuildSinkWants(absl::optional<int> target_pixel_count,int max_pixel_count,int max_framerate_fps,int sink_alignment=1)39*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkWants BuildSinkWants(absl::optional<int> target_pixel_count,
40*d9f75844SAndroid Build Coastguard Worker int max_pixel_count,
41*d9f75844SAndroid Build Coastguard Worker int max_framerate_fps,
42*d9f75844SAndroid Build Coastguard Worker int sink_alignment = 1) {
43*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkWants wants;
44*d9f75844SAndroid Build Coastguard Worker wants.target_pixel_count = target_pixel_count;
45*d9f75844SAndroid Build Coastguard Worker wants.max_pixel_count = max_pixel_count;
46*d9f75844SAndroid Build Coastguard Worker wants.max_framerate_fps = max_framerate_fps;
47*d9f75844SAndroid Build Coastguard Worker wants.resolution_alignment = sink_alignment;
48*d9f75844SAndroid Build Coastguard Worker wants.is_active = true;
49*d9f75844SAndroid Build Coastguard Worker wants.aggregates.emplace(rtc::VideoSinkWants::Aggregates());
50*d9f75844SAndroid Build Coastguard Worker wants.aggregates->any_active_without_requested_resolution = false;
51*d9f75844SAndroid Build Coastguard Worker return wants;
52*d9f75844SAndroid Build Coastguard Worker }
53*d9f75844SAndroid Build Coastguard Worker
BuildSinkWants(absl::optional<webrtc::Resolution> requested_resolution,bool any_active_without_requested_resolution)54*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkWants BuildSinkWants(
55*d9f75844SAndroid Build Coastguard Worker absl::optional<webrtc::Resolution> requested_resolution,
56*d9f75844SAndroid Build Coastguard Worker bool any_active_without_requested_resolution) {
57*d9f75844SAndroid Build Coastguard Worker rtc::VideoSinkWants wants;
58*d9f75844SAndroid Build Coastguard Worker wants.max_framerate_fps = kDefaultFps;
59*d9f75844SAndroid Build Coastguard Worker wants.resolution_alignment = 1;
60*d9f75844SAndroid Build Coastguard Worker wants.is_active = true;
61*d9f75844SAndroid Build Coastguard Worker if (requested_resolution) {
62*d9f75844SAndroid Build Coastguard Worker wants.target_pixel_count = requested_resolution->PixelCount();
63*d9f75844SAndroid Build Coastguard Worker wants.max_pixel_count = requested_resolution->PixelCount();
64*d9f75844SAndroid Build Coastguard Worker wants.requested_resolution.emplace(rtc::VideoSinkWants::FrameSize(
65*d9f75844SAndroid Build Coastguard Worker requested_resolution->width, requested_resolution->height));
66*d9f75844SAndroid Build Coastguard Worker } else {
67*d9f75844SAndroid Build Coastguard Worker wants.target_pixel_count = kWidth * kHeight;
68*d9f75844SAndroid Build Coastguard Worker wants.max_pixel_count = kWidth * kHeight;
69*d9f75844SAndroid Build Coastguard Worker }
70*d9f75844SAndroid Build Coastguard Worker wants.aggregates.emplace(rtc::VideoSinkWants::Aggregates());
71*d9f75844SAndroid Build Coastguard Worker wants.aggregates->any_active_without_requested_resolution =
72*d9f75844SAndroid Build Coastguard Worker any_active_without_requested_resolution;
73*d9f75844SAndroid Build Coastguard Worker return wants;
74*d9f75844SAndroid Build Coastguard Worker }
75*d9f75844SAndroid Build Coastguard Worker
76*d9f75844SAndroid Build Coastguard Worker } // namespace
77*d9f75844SAndroid Build Coastguard Worker
78*d9f75844SAndroid Build Coastguard Worker class VideoAdapterTest : public ::testing::Test,
79*d9f75844SAndroid Build Coastguard Worker public ::testing::WithParamInterface<bool> {
80*d9f75844SAndroid Build Coastguard Worker public:
VideoAdapterTest()81*d9f75844SAndroid Build Coastguard Worker VideoAdapterTest() : VideoAdapterTest("", 1) {}
VideoAdapterTest(const std::string & field_trials,int source_resolution_alignment)82*d9f75844SAndroid Build Coastguard Worker explicit VideoAdapterTest(const std::string& field_trials,
83*d9f75844SAndroid Build Coastguard Worker int source_resolution_alignment)
84*d9f75844SAndroid Build Coastguard Worker : override_field_trials_(field_trials),
85*d9f75844SAndroid Build Coastguard Worker frame_source_(std::make_unique<FakeFrameSource>(
86*d9f75844SAndroid Build Coastguard Worker kWidth,
87*d9f75844SAndroid Build Coastguard Worker kHeight,
88*d9f75844SAndroid Build Coastguard Worker VideoFormat::FpsToInterval(kDefaultFps) /
89*d9f75844SAndroid Build Coastguard Worker rtc::kNumNanosecsPerMicrosec)),
90*d9f75844SAndroid Build Coastguard Worker adapter_(source_resolution_alignment),
91*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_(std::make_unique<VideoAdapterWrapper>(&adapter_)),
92*d9f75844SAndroid Build Coastguard Worker use_new_format_request_(GetParam()) {}
93*d9f75844SAndroid Build Coastguard Worker
94*d9f75844SAndroid Build Coastguard Worker protected:
95*d9f75844SAndroid Build Coastguard Worker // Wrap a VideoAdapter and collect stats.
96*d9f75844SAndroid Build Coastguard Worker class VideoAdapterWrapper {
97*d9f75844SAndroid Build Coastguard Worker public:
98*d9f75844SAndroid Build Coastguard Worker struct Stats {
99*d9f75844SAndroid Build Coastguard Worker int captured_frames = 0;
100*d9f75844SAndroid Build Coastguard Worker int dropped_frames = 0;
101*d9f75844SAndroid Build Coastguard Worker bool last_adapt_was_no_op = false;
102*d9f75844SAndroid Build Coastguard Worker
103*d9f75844SAndroid Build Coastguard Worker int cropped_width = 0;
104*d9f75844SAndroid Build Coastguard Worker int cropped_height = 0;
105*d9f75844SAndroid Build Coastguard Worker int out_width = 0;
106*d9f75844SAndroid Build Coastguard Worker int out_height = 0;
107*d9f75844SAndroid Build Coastguard Worker };
108*d9f75844SAndroid Build Coastguard Worker
VideoAdapterWrapper(VideoAdapter * adapter)109*d9f75844SAndroid Build Coastguard Worker explicit VideoAdapterWrapper(VideoAdapter* adapter)
110*d9f75844SAndroid Build Coastguard Worker : video_adapter_(adapter) {}
111*d9f75844SAndroid Build Coastguard Worker
AdaptFrame(const webrtc::VideoFrame & frame)112*d9f75844SAndroid Build Coastguard Worker void AdaptFrame(const webrtc::VideoFrame& frame) {
113*d9f75844SAndroid Build Coastguard Worker const int in_width = frame.width();
114*d9f75844SAndroid Build Coastguard Worker const int in_height = frame.height();
115*d9f75844SAndroid Build Coastguard Worker int cropped_width;
116*d9f75844SAndroid Build Coastguard Worker int cropped_height;
117*d9f75844SAndroid Build Coastguard Worker int out_width;
118*d9f75844SAndroid Build Coastguard Worker int out_height;
119*d9f75844SAndroid Build Coastguard Worker if (video_adapter_->AdaptFrameResolution(
120*d9f75844SAndroid Build Coastguard Worker in_width, in_height,
121*d9f75844SAndroid Build Coastguard Worker frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec,
122*d9f75844SAndroid Build Coastguard Worker &cropped_width, &cropped_height, &out_width, &out_height)) {
123*d9f75844SAndroid Build Coastguard Worker stats_.cropped_width = cropped_width;
124*d9f75844SAndroid Build Coastguard Worker stats_.cropped_height = cropped_height;
125*d9f75844SAndroid Build Coastguard Worker stats_.out_width = out_width;
126*d9f75844SAndroid Build Coastguard Worker stats_.out_height = out_height;
127*d9f75844SAndroid Build Coastguard Worker stats_.last_adapt_was_no_op =
128*d9f75844SAndroid Build Coastguard Worker (in_width == cropped_width && in_height == cropped_height &&
129*d9f75844SAndroid Build Coastguard Worker in_width == out_width && in_height == out_height);
130*d9f75844SAndroid Build Coastguard Worker } else {
131*d9f75844SAndroid Build Coastguard Worker ++stats_.dropped_frames;
132*d9f75844SAndroid Build Coastguard Worker }
133*d9f75844SAndroid Build Coastguard Worker ++stats_.captured_frames;
134*d9f75844SAndroid Build Coastguard Worker }
135*d9f75844SAndroid Build Coastguard Worker
GetStats() const136*d9f75844SAndroid Build Coastguard Worker Stats GetStats() const { return stats_; }
137*d9f75844SAndroid Build Coastguard Worker
138*d9f75844SAndroid Build Coastguard Worker private:
139*d9f75844SAndroid Build Coastguard Worker VideoAdapter* video_adapter_;
140*d9f75844SAndroid Build Coastguard Worker Stats stats_;
141*d9f75844SAndroid Build Coastguard Worker };
142*d9f75844SAndroid Build Coastguard Worker
VerifyAdaptedResolution(const VideoAdapterWrapper::Stats & stats,int cropped_width,int cropped_height,int out_width,int out_height)143*d9f75844SAndroid Build Coastguard Worker void VerifyAdaptedResolution(const VideoAdapterWrapper::Stats& stats,
144*d9f75844SAndroid Build Coastguard Worker int cropped_width,
145*d9f75844SAndroid Build Coastguard Worker int cropped_height,
146*d9f75844SAndroid Build Coastguard Worker int out_width,
147*d9f75844SAndroid Build Coastguard Worker int out_height) {
148*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cropped_width, stats.cropped_width);
149*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(cropped_height, stats.cropped_height);
150*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_width, stats.out_width);
151*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_height, stats.out_height);
152*d9f75844SAndroid Build Coastguard Worker }
153*d9f75844SAndroid Build Coastguard Worker
OnOutputFormatRequest(int width,int height,const absl::optional<int> & fps)154*d9f75844SAndroid Build Coastguard Worker void OnOutputFormatRequest(int width,
155*d9f75844SAndroid Build Coastguard Worker int height,
156*d9f75844SAndroid Build Coastguard Worker const absl::optional<int>& fps) {
157*d9f75844SAndroid Build Coastguard Worker if (use_new_format_request_) {
158*d9f75844SAndroid Build Coastguard Worker absl::optional<std::pair<int, int>> target_aspect_ratio =
159*d9f75844SAndroid Build Coastguard Worker std::make_pair(width, height);
160*d9f75844SAndroid Build Coastguard Worker absl::optional<int> max_pixel_count = width * height;
161*d9f75844SAndroid Build Coastguard Worker absl::optional<int> max_fps = fps;
162*d9f75844SAndroid Build Coastguard Worker adapter_.OnOutputFormatRequest(target_aspect_ratio, max_pixel_count,
163*d9f75844SAndroid Build Coastguard Worker max_fps);
164*d9f75844SAndroid Build Coastguard Worker return;
165*d9f75844SAndroid Build Coastguard Worker }
166*d9f75844SAndroid Build Coastguard Worker adapter_.OnOutputFormatRequest(
167*d9f75844SAndroid Build Coastguard Worker VideoFormat(width, height, fps ? VideoFormat::FpsToInterval(*fps) : 0,
168*d9f75844SAndroid Build Coastguard Worker cricket::FOURCC_I420));
169*d9f75844SAndroid Build Coastguard Worker }
170*d9f75844SAndroid Build Coastguard Worker
171*d9f75844SAndroid Build Coastguard Worker // Return pair of <out resolution, cropping>
AdaptFrameResolution(webrtc::Resolution res)172*d9f75844SAndroid Build Coastguard Worker std::pair<webrtc::Resolution, webrtc::Resolution> AdaptFrameResolution(
173*d9f75844SAndroid Build Coastguard Worker webrtc::Resolution res) {
174*d9f75844SAndroid Build Coastguard Worker webrtc::Resolution out;
175*d9f75844SAndroid Build Coastguard Worker webrtc::Resolution cropped;
176*d9f75844SAndroid Build Coastguard Worker timestamp_ns_ += 1000000000;
177*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(
178*d9f75844SAndroid Build Coastguard Worker res.width, res.height, timestamp_ns_, &cropped.width, &cropped.height,
179*d9f75844SAndroid Build Coastguard Worker &out.width, &out.height));
180*d9f75844SAndroid Build Coastguard Worker return std::make_pair(out, cropped);
181*d9f75844SAndroid Build Coastguard Worker }
182*d9f75844SAndroid Build Coastguard Worker
183*d9f75844SAndroid Build Coastguard Worker webrtc::test::ScopedFieldTrials override_field_trials_;
184*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<FakeFrameSource> frame_source_;
185*d9f75844SAndroid Build Coastguard Worker VideoAdapter adapter_;
186*d9f75844SAndroid Build Coastguard Worker int64_t timestamp_ns_ = 0;
187*d9f75844SAndroid Build Coastguard Worker int cropped_width_;
188*d9f75844SAndroid Build Coastguard Worker int cropped_height_;
189*d9f75844SAndroid Build Coastguard Worker int out_width_;
190*d9f75844SAndroid Build Coastguard Worker int out_height_;
191*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<VideoAdapterWrapper> adapter_wrapper_;
192*d9f75844SAndroid Build Coastguard Worker const bool use_new_format_request_;
193*d9f75844SAndroid Build Coastguard Worker };
194*d9f75844SAndroid Build Coastguard Worker
195*d9f75844SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(OnOutputFormatRequests,
196*d9f75844SAndroid Build Coastguard Worker VideoAdapterTest,
197*d9f75844SAndroid Build Coastguard Worker ::testing::Values(true, false));
198*d9f75844SAndroid Build Coastguard Worker
199*d9f75844SAndroid Build Coastguard Worker // Do not adapt the frame rate or the resolution. Expect no frame drop, no
200*d9f75844SAndroid Build Coastguard Worker // cropping, and no resolution change.
TEST_P(VideoAdapterTest,AdaptNothing)201*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptNothing) {
202*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
203*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
204*d9f75844SAndroid Build Coastguard Worker
205*d9f75844SAndroid Build Coastguard Worker // Verify no frame drop and no resolution change.
206*d9f75844SAndroid Build Coastguard Worker VideoAdapterWrapper::Stats stats = adapter_wrapper_->GetStats();
207*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(stats.captured_frames, 10);
208*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, stats.dropped_frames);
209*d9f75844SAndroid Build Coastguard Worker VerifyAdaptedResolution(stats, kWidth, kHeight, kWidth, kHeight);
210*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(stats.last_adapt_was_no_op);
211*d9f75844SAndroid Build Coastguard Worker }
212*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,AdaptZeroInterval)213*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptZeroInterval) {
214*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, absl::nullopt);
215*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 40; ++i)
216*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
217*d9f75844SAndroid Build Coastguard Worker
218*d9f75844SAndroid Build Coastguard Worker // Verify no crash and that frames aren't dropped.
219*d9f75844SAndroid Build Coastguard Worker VideoAdapterWrapper::Stats stats = adapter_wrapper_->GetStats();
220*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(stats.captured_frames, 40);
221*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, stats.dropped_frames);
222*d9f75844SAndroid Build Coastguard Worker VerifyAdaptedResolution(stats, kWidth, kHeight, kWidth, kHeight);
223*d9f75844SAndroid Build Coastguard Worker }
224*d9f75844SAndroid Build Coastguard Worker
225*d9f75844SAndroid Build Coastguard Worker // Adapt the frame rate to be half of the capture rate at the beginning. Expect
226*d9f75844SAndroid Build Coastguard Worker // the number of dropped frames to be half of the number the captured frames.
TEST_P(VideoAdapterTest,AdaptFramerateToHalf)227*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFramerateToHalf) {
228*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, kDefaultFps / 2);
229*d9f75844SAndroid Build Coastguard Worker
230*d9f75844SAndroid Build Coastguard Worker // Capture 10 frames and verify that every other frame is dropped. The first
231*d9f75844SAndroid Build Coastguard Worker // frame should not be dropped.
232*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
233*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
234*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(adapter_wrapper_->GetStats().captured_frames, 10);
235*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(5, adapter_wrapper_->GetStats().dropped_frames);
236*d9f75844SAndroid Build Coastguard Worker }
237*d9f75844SAndroid Build Coastguard Worker
238*d9f75844SAndroid Build Coastguard Worker // Adapt the frame rate to be two thirds of the capture rate at the beginning.
239*d9f75844SAndroid Build Coastguard Worker // Expect the number of dropped frames to be one thirds of the number the
240*d9f75844SAndroid Build Coastguard Worker // captured frames.
TEST_P(VideoAdapterTest,AdaptFramerateToTwoThirds)241*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFramerateToTwoThirds) {
242*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, kDefaultFps * 2 / 3);
243*d9f75844SAndroid Build Coastguard Worker
244*d9f75844SAndroid Build Coastguard Worker // Capture 10 frames and verify that every third frame is dropped. The first
245*d9f75844SAndroid Build Coastguard Worker // frame should not be dropped.
246*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
247*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
248*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(adapter_wrapper_->GetStats().captured_frames, 10);
249*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3, adapter_wrapper_->GetStats().dropped_frames);
250*d9f75844SAndroid Build Coastguard Worker }
251*d9f75844SAndroid Build Coastguard Worker
252*d9f75844SAndroid Build Coastguard Worker // Request frame rate twice as high as captured frame rate. Expect no frame
253*d9f75844SAndroid Build Coastguard Worker // drop.
TEST_P(VideoAdapterTest,AdaptFramerateHighLimit)254*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFramerateHighLimit) {
255*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, kDefaultFps * 2);
256*d9f75844SAndroid Build Coastguard Worker
257*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
258*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
259*d9f75844SAndroid Build Coastguard Worker
260*d9f75844SAndroid Build Coastguard Worker // Verify no frame drop.
261*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, adapter_wrapper_->GetStats().dropped_frames);
262*d9f75844SAndroid Build Coastguard Worker }
263*d9f75844SAndroid Build Coastguard Worker
264*d9f75844SAndroid Build Coastguard Worker // Adapt the frame rate to be half of the capture rate. No resolution limit set.
265*d9f75844SAndroid Build Coastguard Worker // Expect the number of dropped frames to be half of the number the captured
266*d9f75844SAndroid Build Coastguard Worker // frames.
TEST_P(VideoAdapterTest,AdaptFramerateToHalfWithNoPixelLimit)267*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFramerateToHalfWithNoPixelLimit) {
268*d9f75844SAndroid Build Coastguard Worker adapter_.OnOutputFormatRequest(absl::nullopt, absl::nullopt, kDefaultFps / 2);
269*d9f75844SAndroid Build Coastguard Worker
270*d9f75844SAndroid Build Coastguard Worker // Capture 10 frames and verify that every other frame is dropped. The first
271*d9f75844SAndroid Build Coastguard Worker // frame should not be dropped.
272*d9f75844SAndroid Build Coastguard Worker int expected_dropped_frames = 0;
273*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
274*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
275*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(adapter_wrapper_->GetStats().captured_frames, i + 1);
276*d9f75844SAndroid Build Coastguard Worker if (i % 2 == 1)
277*d9f75844SAndroid Build Coastguard Worker ++expected_dropped_frames;
278*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(expected_dropped_frames,
279*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->GetStats().dropped_frames);
280*d9f75844SAndroid Build Coastguard Worker VerifyAdaptedResolution(adapter_wrapper_->GetStats(), kWidth, kHeight,
281*d9f75844SAndroid Build Coastguard Worker kWidth, kHeight);
282*d9f75844SAndroid Build Coastguard Worker }
283*d9f75844SAndroid Build Coastguard Worker }
284*d9f75844SAndroid Build Coastguard Worker
285*d9f75844SAndroid Build Coastguard Worker // Adapt the frame rate to be half of the capture rate after capturing no less
286*d9f75844SAndroid Build Coastguard Worker // than 10 frames. Expect no frame dropped before adaptation and frame dropped
287*d9f75844SAndroid Build Coastguard Worker // after adaptation.
TEST_P(VideoAdapterTest,AdaptFramerateOntheFly)288*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFramerateOntheFly) {
289*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, kDefaultFps);
290*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
291*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
292*d9f75844SAndroid Build Coastguard Worker
293*d9f75844SAndroid Build Coastguard Worker // Verify no frame drop before adaptation.
294*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, adapter_wrapper_->GetStats().dropped_frames);
295*d9f75844SAndroid Build Coastguard Worker
296*d9f75844SAndroid Build Coastguard Worker // Adapt the frame rate.
297*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, kDefaultFps / 2);
298*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 20; ++i)
299*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
300*d9f75844SAndroid Build Coastguard Worker
301*d9f75844SAndroid Build Coastguard Worker // Verify frame drop after adaptation.
302*d9f75844SAndroid Build Coastguard Worker EXPECT_GT(adapter_wrapper_->GetStats().dropped_frames, 0);
303*d9f75844SAndroid Build Coastguard Worker }
304*d9f75844SAndroid Build Coastguard Worker
305*d9f75844SAndroid Build Coastguard Worker // Do not adapt the frame rate or the resolution. Expect no frame drop, no
306*d9f75844SAndroid Build Coastguard Worker // cropping, and no resolution change.
TEST_P(VideoAdapterTest,AdaptFramerateRequestMax)307*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFramerateRequestMax) {
308*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt,
309*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max(),
310*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
311*d9f75844SAndroid Build Coastguard Worker
312*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
313*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
314*d9f75844SAndroid Build Coastguard Worker
315*d9f75844SAndroid Build Coastguard Worker // Verify no frame drop and no resolution change.
316*d9f75844SAndroid Build Coastguard Worker VideoAdapterWrapper::Stats stats = adapter_wrapper_->GetStats();
317*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(stats.captured_frames, 10);
318*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, stats.dropped_frames);
319*d9f75844SAndroid Build Coastguard Worker VerifyAdaptedResolution(stats, kWidth, kHeight, kWidth, kHeight);
320*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(stats.last_adapt_was_no_op);
321*d9f75844SAndroid Build Coastguard Worker }
322*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,AdaptFramerateRequestZero)323*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFramerateRequestZero) {
324*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
325*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(absl::nullopt, std::numeric_limits<int>::max(), 0));
326*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
327*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
328*d9f75844SAndroid Build Coastguard Worker
329*d9f75844SAndroid Build Coastguard Worker // Verify no crash and that frames aren't dropped.
330*d9f75844SAndroid Build Coastguard Worker VideoAdapterWrapper::Stats stats = adapter_wrapper_->GetStats();
331*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(stats.captured_frames, 10);
332*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(10, stats.dropped_frames);
333*d9f75844SAndroid Build Coastguard Worker }
334*d9f75844SAndroid Build Coastguard Worker
335*d9f75844SAndroid Build Coastguard Worker // Adapt the frame rate to be half of the capture rate at the beginning. Expect
336*d9f75844SAndroid Build Coastguard Worker // the number of dropped frames to be half of the number the captured frames.
TEST_P(VideoAdapterTest,AdaptFramerateRequestHalf)337*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFramerateRequestHalf) {
338*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(
339*d9f75844SAndroid Build Coastguard Worker absl::nullopt, std::numeric_limits<int>::max(), kDefaultFps / 2));
340*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
341*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
342*d9f75844SAndroid Build Coastguard Worker
343*d9f75844SAndroid Build Coastguard Worker // Verify no crash and that frames aren't dropped.
344*d9f75844SAndroid Build Coastguard Worker VideoAdapterWrapper::Stats stats = adapter_wrapper_->GetStats();
345*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(stats.captured_frames, 10);
346*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(5, stats.dropped_frames);
347*d9f75844SAndroid Build Coastguard Worker VerifyAdaptedResolution(stats, kWidth, kHeight, kWidth, kHeight);
348*d9f75844SAndroid Build Coastguard Worker }
349*d9f75844SAndroid Build Coastguard Worker
350*d9f75844SAndroid Build Coastguard Worker // Set a very high output pixel resolution. Expect no cropping or resolution
351*d9f75844SAndroid Build Coastguard Worker // change.
TEST_P(VideoAdapterTest,AdaptFrameResolutionHighLimit)352*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFrameResolutionHighLimit) {
353*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth * 10, kHeight * 10, kDefaultFps);
354*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0, &cropped_width_,
355*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
356*d9f75844SAndroid Build Coastguard Worker &out_height_));
357*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kWidth, cropped_width_);
358*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kHeight, cropped_height_);
359*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kWidth, out_width_);
360*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kHeight, out_height_);
361*d9f75844SAndroid Build Coastguard Worker }
362*d9f75844SAndroid Build Coastguard Worker
363*d9f75844SAndroid Build Coastguard Worker // Adapt the frame resolution to be the same as capture resolution. Expect no
364*d9f75844SAndroid Build Coastguard Worker // cropping or resolution change.
TEST_P(VideoAdapterTest,AdaptFrameResolutionIdentical)365*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFrameResolutionIdentical) {
366*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, kDefaultFps);
367*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0, &cropped_width_,
368*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
369*d9f75844SAndroid Build Coastguard Worker &out_height_));
370*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kWidth, cropped_width_);
371*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kHeight, cropped_height_);
372*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kWidth, out_width_);
373*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kHeight, out_height_);
374*d9f75844SAndroid Build Coastguard Worker }
375*d9f75844SAndroid Build Coastguard Worker
376*d9f75844SAndroid Build Coastguard Worker // Adapt the frame resolution to be a quarter of the capture resolution. Expect
377*d9f75844SAndroid Build Coastguard Worker // no cropping, but a resolution change.
TEST_P(VideoAdapterTest,AdaptFrameResolutionQuarter)378*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFrameResolutionQuarter) {
379*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth / 2, kHeight / 2, kDefaultFps);
380*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0, &cropped_width_,
381*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
382*d9f75844SAndroid Build Coastguard Worker &out_height_));
383*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kWidth, cropped_width_);
384*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kHeight, cropped_height_);
385*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kWidth / 2, out_width_);
386*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kHeight / 2, out_height_);
387*d9f75844SAndroid Build Coastguard Worker }
388*d9f75844SAndroid Build Coastguard Worker
389*d9f75844SAndroid Build Coastguard Worker // Adapt the pixel resolution to 0. Expect frame drop.
TEST_P(VideoAdapterTest,AdaptFrameResolutionDrop)390*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFrameResolutionDrop) {
391*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth * 0, kHeight * 0, kDefaultFps);
392*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0,
393*d9f75844SAndroid Build Coastguard Worker &cropped_width_, &cropped_height_,
394*d9f75844SAndroid Build Coastguard Worker &out_width_, &out_height_));
395*d9f75844SAndroid Build Coastguard Worker }
396*d9f75844SAndroid Build Coastguard Worker
397*d9f75844SAndroid Build Coastguard Worker // Adapt the frame resolution to be a quarter of the capture resolution at the
398*d9f75844SAndroid Build Coastguard Worker // beginning. Expect no cropping but a resolution change.
TEST_P(VideoAdapterTest,AdaptResolution)399*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptResolution) {
400*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth / 2, kHeight / 2, kDefaultFps);
401*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
402*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
403*d9f75844SAndroid Build Coastguard Worker
404*d9f75844SAndroid Build Coastguard Worker // Verify no frame drop, no cropping, and resolution change.
405*d9f75844SAndroid Build Coastguard Worker VideoAdapterWrapper::Stats stats = adapter_wrapper_->GetStats();
406*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(0, stats.dropped_frames);
407*d9f75844SAndroid Build Coastguard Worker VerifyAdaptedResolution(stats, kWidth, kHeight, kWidth / 2, kHeight / 2);
408*d9f75844SAndroid Build Coastguard Worker }
409*d9f75844SAndroid Build Coastguard Worker
410*d9f75844SAndroid Build Coastguard Worker // Adapt the frame resolution to be a quarter of the capture resolution after
411*d9f75844SAndroid Build Coastguard Worker // capturing no less than 10 frames. Expect no resolution change before
412*d9f75844SAndroid Build Coastguard Worker // adaptation and resolution change after adaptation.
TEST_P(VideoAdapterTest,AdaptResolutionOnTheFly)413*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptResolutionOnTheFly) {
414*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, kDefaultFps);
415*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
416*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
417*d9f75844SAndroid Build Coastguard Worker
418*d9f75844SAndroid Build Coastguard Worker // Verify no resolution change before adaptation.
419*d9f75844SAndroid Build Coastguard Worker VerifyAdaptedResolution(adapter_wrapper_->GetStats(), kWidth, kHeight, kWidth,
420*d9f75844SAndroid Build Coastguard Worker kHeight);
421*d9f75844SAndroid Build Coastguard Worker
422*d9f75844SAndroid Build Coastguard Worker // Adapt the frame resolution.
423*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth / 2, kHeight / 2, kDefaultFps);
424*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
425*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
426*d9f75844SAndroid Build Coastguard Worker
427*d9f75844SAndroid Build Coastguard Worker // Verify resolution change after adaptation.
428*d9f75844SAndroid Build Coastguard Worker VerifyAdaptedResolution(adapter_wrapper_->GetStats(), kWidth, kHeight,
429*d9f75844SAndroid Build Coastguard Worker kWidth / 2, kHeight / 2);
430*d9f75844SAndroid Build Coastguard Worker }
431*d9f75844SAndroid Build Coastguard Worker
432*d9f75844SAndroid Build Coastguard Worker // Drop all frames for resolution 0x0.
TEST_P(VideoAdapterTest,DropAllFrames)433*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, DropAllFrames) {
434*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth * 0, kHeight * 0, kDefaultFps);
435*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
436*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
437*d9f75844SAndroid Build Coastguard Worker
438*d9f75844SAndroid Build Coastguard Worker // Verify all frames are dropped.
439*d9f75844SAndroid Build Coastguard Worker VideoAdapterWrapper::Stats stats = adapter_wrapper_->GetStats();
440*d9f75844SAndroid Build Coastguard Worker EXPECT_GE(stats.captured_frames, 10);
441*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(stats.captured_frames, stats.dropped_frames);
442*d9f75844SAndroid Build Coastguard Worker }
443*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestOnOutputFormatRequest)444*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestOnOutputFormatRequest) {
445*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
446*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
447*d9f75844SAndroid Build Coastguard Worker &out_height_));
448*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
449*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, cropped_height_);
450*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
451*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, out_height_);
452*d9f75844SAndroid Build Coastguard Worker
453*d9f75844SAndroid Build Coastguard Worker // Format request 640x400.
454*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 400, absl::nullopt);
455*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
456*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
457*d9f75844SAndroid Build Coastguard Worker &out_height_));
458*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
459*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, cropped_height_);
460*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
461*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, out_height_);
462*d9f75844SAndroid Build Coastguard Worker
463*d9f75844SAndroid Build Coastguard Worker // Request 1280x720, higher than input, but aspect 16:9. Expect cropping but
464*d9f75844SAndroid Build Coastguard Worker // no scaling.
465*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(1280, 720, absl::nullopt);
466*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
467*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
468*d9f75844SAndroid Build Coastguard Worker &out_height_));
469*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
470*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
471*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
472*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
473*d9f75844SAndroid Build Coastguard Worker
474*d9f75844SAndroid Build Coastguard Worker // Request 0x0.
475*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(0, 0, absl::nullopt);
476*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
477*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
478*d9f75844SAndroid Build Coastguard Worker &out_height_));
479*d9f75844SAndroid Build Coastguard Worker
480*d9f75844SAndroid Build Coastguard Worker // Request 320x200. Expect scaling, but no cropping.
481*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(320, 200, absl::nullopt);
482*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
483*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
484*d9f75844SAndroid Build Coastguard Worker &out_height_));
485*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
486*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, cropped_height_);
487*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(320, out_width_);
488*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(200, out_height_);
489*d9f75844SAndroid Build Coastguard Worker
490*d9f75844SAndroid Build Coastguard Worker // Request resolution close to 2/3 scale. Expect adapt down. Scaling to 2/3
491*d9f75844SAndroid Build Coastguard Worker // is not optimized and not allowed, therefore 1/2 scaling will be used
492*d9f75844SAndroid Build Coastguard Worker // instead.
493*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(424, 265, absl::nullopt);
494*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
495*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
496*d9f75844SAndroid Build Coastguard Worker &out_height_));
497*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
498*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, cropped_height_);
499*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(320, out_width_);
500*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(200, out_height_);
501*d9f75844SAndroid Build Coastguard Worker
502*d9f75844SAndroid Build Coastguard Worker // Request resolution of 3 / 8. Expect adapt down.
503*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640 * 3 / 8, 400 * 3 / 8, absl::nullopt);
504*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
505*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
506*d9f75844SAndroid Build Coastguard Worker &out_height_));
507*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
508*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, cropped_height_);
509*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640 * 3 / 8, out_width_);
510*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400 * 3 / 8, out_height_);
511*d9f75844SAndroid Build Coastguard Worker
512*d9f75844SAndroid Build Coastguard Worker // Switch back up. Expect adapt.
513*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(320, 200, absl::nullopt);
514*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
515*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
516*d9f75844SAndroid Build Coastguard Worker &out_height_));
517*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
518*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, cropped_height_);
519*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(320, out_width_);
520*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(200, out_height_);
521*d9f75844SAndroid Build Coastguard Worker
522*d9f75844SAndroid Build Coastguard Worker // Format request 480x300.
523*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(480, 300, absl::nullopt);
524*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
525*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
526*d9f75844SAndroid Build Coastguard Worker &out_height_));
527*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
528*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, cropped_height_);
529*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
530*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(300, out_height_);
531*d9f75844SAndroid Build Coastguard Worker }
532*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestViewRequestPlusCameraSwitch)533*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestViewRequestPlusCameraSwitch) {
534*d9f75844SAndroid Build Coastguard Worker // Start at HD.
535*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
536*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
537*d9f75844SAndroid Build Coastguard Worker &out_height_));
538*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
539*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
540*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
541*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
542*d9f75844SAndroid Build Coastguard Worker
543*d9f75844SAndroid Build Coastguard Worker // Format request for VGA.
544*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, absl::nullopt);
545*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
546*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
547*d9f75844SAndroid Build Coastguard Worker &out_height_));
548*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
549*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
550*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
551*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
552*d9f75844SAndroid Build Coastguard Worker
553*d9f75844SAndroid Build Coastguard Worker // Now, the camera reopens at VGA.
554*d9f75844SAndroid Build Coastguard Worker // Both the frame and the output format should be 640x360.
555*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 360, 0, &cropped_width_,
556*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
557*d9f75844SAndroid Build Coastguard Worker &out_height_));
558*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
559*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
560*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
561*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
562*d9f75844SAndroid Build Coastguard Worker
563*d9f75844SAndroid Build Coastguard Worker // And another view request comes in for 640x360, which should have no
564*d9f75844SAndroid Build Coastguard Worker // real impact.
565*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, absl::nullopt);
566*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 360, 0, &cropped_width_,
567*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
568*d9f75844SAndroid Build Coastguard Worker &out_height_));
569*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
570*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
571*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
572*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
573*d9f75844SAndroid Build Coastguard Worker }
574*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestVgaWidth)575*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestVgaWidth) {
576*d9f75844SAndroid Build Coastguard Worker // Requested output format is 640x360.
577*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, absl::nullopt);
578*d9f75844SAndroid Build Coastguard Worker
579*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
580*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
581*d9f75844SAndroid Build Coastguard Worker &out_height_));
582*d9f75844SAndroid Build Coastguard Worker // Expect cropping.
583*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
584*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
585*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
586*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
587*d9f75844SAndroid Build Coastguard Worker
588*d9f75844SAndroid Build Coastguard Worker // But if frames come in at 640x360, we shouldn't adapt them down.
589*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 360, 0, &cropped_width_,
590*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
591*d9f75844SAndroid Build Coastguard Worker &out_height_));
592*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
593*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
594*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
595*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
596*d9f75844SAndroid Build Coastguard Worker
597*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
598*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
599*d9f75844SAndroid Build Coastguard Worker &out_height_));
600*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
601*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
602*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
603*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
604*d9f75844SAndroid Build Coastguard Worker }
605*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestOnResolutionRequestInSmallSteps)606*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestOnResolutionRequestInSmallSteps) {
607*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
608*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
609*d9f75844SAndroid Build Coastguard Worker &out_height_));
610*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
611*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
612*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
613*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
614*d9f75844SAndroid Build Coastguard Worker
615*d9f75844SAndroid Build Coastguard Worker // Adapt down one step.
616*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 1280 * 720 - 1,
617*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
618*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
619*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
620*d9f75844SAndroid Build Coastguard Worker &out_height_));
621*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
622*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
623*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(960, out_width_);
624*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(540, out_height_);
625*d9f75844SAndroid Build Coastguard Worker
626*d9f75844SAndroid Build Coastguard Worker // Adapt down one step more.
627*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 960 * 540 - 1,
628*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
629*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
630*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
631*d9f75844SAndroid Build Coastguard Worker &out_height_));
632*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
633*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
634*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
635*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
636*d9f75844SAndroid Build Coastguard Worker
637*d9f75844SAndroid Build Coastguard Worker // Adapt down one step more.
638*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 640 * 360 - 1,
639*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
640*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
641*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
642*d9f75844SAndroid Build Coastguard Worker &out_height_));
643*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
644*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
645*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
646*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_height_);
647*d9f75844SAndroid Build Coastguard Worker
648*d9f75844SAndroid Build Coastguard Worker // Adapt up one step.
649*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
650*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(640 * 360, 960 * 540, std::numeric_limits<int>::max()));
651*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
652*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
653*d9f75844SAndroid Build Coastguard Worker &out_height_));
654*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
655*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
656*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
657*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
658*d9f75844SAndroid Build Coastguard Worker
659*d9f75844SAndroid Build Coastguard Worker // Adapt up one step more.
660*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
661*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(960 * 540, 1280 * 720, std::numeric_limits<int>::max()));
662*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
663*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
664*d9f75844SAndroid Build Coastguard Worker &out_height_));
665*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
666*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
667*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(960, out_width_);
668*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(540, out_height_);
669*d9f75844SAndroid Build Coastguard Worker
670*d9f75844SAndroid Build Coastguard Worker // Adapt up one step more.
671*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
672*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(1280 * 720, 1920 * 1080, std::numeric_limits<int>::max()));
673*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
674*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
675*d9f75844SAndroid Build Coastguard Worker &out_height_));
676*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
677*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
678*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
679*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
680*d9f75844SAndroid Build Coastguard Worker }
681*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestOnResolutionRequestMaxZero)682*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestOnResolutionRequestMaxZero) {
683*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
684*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
685*d9f75844SAndroid Build Coastguard Worker &out_height_));
686*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
687*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
688*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
689*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
690*d9f75844SAndroid Build Coastguard Worker
691*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
692*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(absl::nullopt, 0, std::numeric_limits<int>::max()));
693*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
694*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
695*d9f75844SAndroid Build Coastguard Worker &out_height_));
696*d9f75844SAndroid Build Coastguard Worker }
697*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestOnResolutionRequestInLargeSteps)698*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestOnResolutionRequestInLargeSteps) {
699*d9f75844SAndroid Build Coastguard Worker // Large step down.
700*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 640 * 360 - 1,
701*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
702*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
703*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
704*d9f75844SAndroid Build Coastguard Worker &out_height_));
705*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
706*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
707*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
708*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_height_);
709*d9f75844SAndroid Build Coastguard Worker
710*d9f75844SAndroid Build Coastguard Worker // Large step up.
711*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
712*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(1280 * 720, 1920 * 1080, std::numeric_limits<int>::max()));
713*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
714*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
715*d9f75844SAndroid Build Coastguard Worker &out_height_));
716*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
717*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
718*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
719*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
720*d9f75844SAndroid Build Coastguard Worker }
721*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestOnOutputFormatRequestCapsMaxResolution)722*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestOnOutputFormatRequestCapsMaxResolution) {
723*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 640 * 360 - 1,
724*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
725*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
726*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
727*d9f75844SAndroid Build Coastguard Worker &out_height_));
728*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
729*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
730*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
731*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_height_);
732*d9f75844SAndroid Build Coastguard Worker
733*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, absl::nullopt);
734*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
735*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
736*d9f75844SAndroid Build Coastguard Worker &out_height_));
737*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
738*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
739*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
740*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_height_);
741*d9f75844SAndroid Build Coastguard Worker
742*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 960 * 720,
743*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
744*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
745*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
746*d9f75844SAndroid Build Coastguard Worker &out_height_));
747*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
748*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
749*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
750*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
751*d9f75844SAndroid Build Coastguard Worker }
752*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestOnResolutionRequestReset)753*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestOnResolutionRequestReset) {
754*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
755*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
756*d9f75844SAndroid Build Coastguard Worker &out_height_));
757*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
758*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
759*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
760*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
761*d9f75844SAndroid Build Coastguard Worker
762*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 640 * 360 - 1,
763*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
764*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
765*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
766*d9f75844SAndroid Build Coastguard Worker &out_height_));
767*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
768*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
769*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
770*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_height_);
771*d9f75844SAndroid Build Coastguard Worker
772*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt,
773*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max(),
774*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
775*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
776*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
777*d9f75844SAndroid Build Coastguard Worker &out_height_));
778*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
779*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
780*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
781*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
782*d9f75844SAndroid Build Coastguard Worker }
783*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestOnOutputFormatRequestResolutionReset)784*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestOnOutputFormatRequestResolutionReset) {
785*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
786*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
787*d9f75844SAndroid Build Coastguard Worker &out_height_));
788*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
789*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
790*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
791*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
792*d9f75844SAndroid Build Coastguard Worker
793*d9f75844SAndroid Build Coastguard Worker adapter_.OnOutputFormatRequest(absl::nullopt, 640 * 360 - 1, absl::nullopt);
794*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
795*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
796*d9f75844SAndroid Build Coastguard Worker &out_height_));
797*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
798*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
799*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
800*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_height_);
801*d9f75844SAndroid Build Coastguard Worker
802*d9f75844SAndroid Build Coastguard Worker adapter_.OnOutputFormatRequest(absl::nullopt, absl::nullopt, absl::nullopt);
803*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(1280, 720, 0, &cropped_width_,
804*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
805*d9f75844SAndroid Build Coastguard Worker &out_height_));
806*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, cropped_width_);
807*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, cropped_height_);
808*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1280, out_width_);
809*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(720, out_height_);
810*d9f75844SAndroid Build Coastguard Worker }
811*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestOnOutputFormatRequestFpsReset)812*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestOnOutputFormatRequestFpsReset) {
813*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, kDefaultFps / 2);
814*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i)
815*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
816*d9f75844SAndroid Build Coastguard Worker
817*d9f75844SAndroid Build Coastguard Worker // Verify frame drop.
818*d9f75844SAndroid Build Coastguard Worker const int dropped_frames = adapter_wrapper_->GetStats().dropped_frames;
819*d9f75844SAndroid Build Coastguard Worker EXPECT_GT(dropped_frames, 0);
820*d9f75844SAndroid Build Coastguard Worker
821*d9f75844SAndroid Build Coastguard Worker // Reset frame rate.
822*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, absl::nullopt);
823*d9f75844SAndroid Build Coastguard Worker for (int i = 0; i < 20; ++i)
824*d9f75844SAndroid Build Coastguard Worker adapter_wrapper_->AdaptFrame(frame_source_->GetFrame());
825*d9f75844SAndroid Build Coastguard Worker
826*d9f75844SAndroid Build Coastguard Worker // Verify no frame drop after reset.
827*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(dropped_frames, adapter_wrapper_->GetStats().dropped_frames);
828*d9f75844SAndroid Build Coastguard Worker }
829*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,RequestAspectRatio)830*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, RequestAspectRatio) {
831*d9f75844SAndroid Build Coastguard Worker // Request aspect ratio 320/180 (16:9), smaller than input, but no resolution
832*d9f75844SAndroid Build Coastguard Worker // limit. Expect cropping but no scaling.
833*d9f75844SAndroid Build Coastguard Worker adapter_.OnOutputFormatRequest(std::make_pair(320, 180), absl::nullopt,
834*d9f75844SAndroid Build Coastguard Worker absl::nullopt);
835*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
836*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
837*d9f75844SAndroid Build Coastguard Worker &out_height_));
838*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
839*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
840*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
841*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
842*d9f75844SAndroid Build Coastguard Worker }
843*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,RequestAspectRatioWithDifferentOrientation)844*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, RequestAspectRatioWithDifferentOrientation) {
845*d9f75844SAndroid Build Coastguard Worker // Request 720x1280, higher than input, but aspect 16:9. Orientation should
846*d9f75844SAndroid Build Coastguard Worker // not matter, expect cropping but no scaling.
847*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(720, 1280, absl::nullopt);
848*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
849*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
850*d9f75844SAndroid Build Coastguard Worker &out_height_));
851*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
852*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
853*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
854*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
855*d9f75844SAndroid Build Coastguard Worker }
856*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,InvalidAspectRatioIgnored)857*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, InvalidAspectRatioIgnored) {
858*d9f75844SAndroid Build Coastguard Worker // Request aspect ratio 320/0. Expect no cropping.
859*d9f75844SAndroid Build Coastguard Worker adapter_.OnOutputFormatRequest(std::make_pair(320, 0), absl::nullopt,
860*d9f75844SAndroid Build Coastguard Worker absl::nullopt);
861*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 400, 0, &cropped_width_,
862*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
863*d9f75844SAndroid Build Coastguard Worker &out_height_));
864*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
865*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, cropped_height_);
866*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
867*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(400, out_height_);
868*d9f75844SAndroid Build Coastguard Worker }
869*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestCroppingWithResolutionRequest)870*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestCroppingWithResolutionRequest) {
871*d9f75844SAndroid Build Coastguard Worker // Ask for 640x360 (16:9 aspect).
872*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, absl::nullopt);
873*d9f75844SAndroid Build Coastguard Worker // Send 640x480 (4:3 aspect).
874*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
875*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
876*d9f75844SAndroid Build Coastguard Worker &out_height_));
877*d9f75844SAndroid Build Coastguard Worker // Expect cropping to 16:9 format and no scaling.
878*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
879*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
880*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
881*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
882*d9f75844SAndroid Build Coastguard Worker
883*d9f75844SAndroid Build Coastguard Worker // Adapt down one step.
884*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 640 * 360 - 1,
885*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
886*d9f75844SAndroid Build Coastguard Worker // Expect cropping to 16:9 format and 3/4 scaling.
887*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
888*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
889*d9f75844SAndroid Build Coastguard Worker &out_height_));
890*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
891*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
892*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
893*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_height_);
894*d9f75844SAndroid Build Coastguard Worker
895*d9f75844SAndroid Build Coastguard Worker // Adapt down one step more.
896*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 480 * 270 - 1,
897*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
898*d9f75844SAndroid Build Coastguard Worker // Expect cropping to 16:9 format and 1/2 scaling.
899*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
900*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
901*d9f75844SAndroid Build Coastguard Worker &out_height_));
902*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
903*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
904*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(320, out_width_);
905*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(180, out_height_);
906*d9f75844SAndroid Build Coastguard Worker
907*d9f75844SAndroid Build Coastguard Worker // Adapt up one step.
908*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
909*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(480 * 270, 640 * 360, std::numeric_limits<int>::max()));
910*d9f75844SAndroid Build Coastguard Worker // Expect cropping to 16:9 format and 3/4 scaling.
911*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
912*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
913*d9f75844SAndroid Build Coastguard Worker &out_height_));
914*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
915*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
916*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_width_);
917*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_height_);
918*d9f75844SAndroid Build Coastguard Worker
919*d9f75844SAndroid Build Coastguard Worker // Adapt up one step more.
920*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
921*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(640 * 360, 960 * 540, std::numeric_limits<int>::max()));
922*d9f75844SAndroid Build Coastguard Worker // Expect cropping to 16:9 format and no scaling.
923*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
924*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
925*d9f75844SAndroid Build Coastguard Worker &out_height_));
926*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
927*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
928*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
929*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
930*d9f75844SAndroid Build Coastguard Worker
931*d9f75844SAndroid Build Coastguard Worker // Try to adapt up one step more.
932*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
933*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(960 * 540, 1280 * 720, std::numeric_limits<int>::max()));
934*d9f75844SAndroid Build Coastguard Worker // Expect cropping to 16:9 format and no scaling.
935*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
936*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
937*d9f75844SAndroid Build Coastguard Worker &out_height_));
938*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
939*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height_);
940*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
941*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
942*d9f75844SAndroid Build Coastguard Worker }
943*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestCroppingOddResolution)944*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestCroppingOddResolution) {
945*d9f75844SAndroid Build Coastguard Worker // Ask for 640x360 (16:9 aspect), with 3/16 scaling.
946*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, absl::nullopt);
947*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt,
948*d9f75844SAndroid Build Coastguard Worker 640 * 360 * 3 / 16 * 3 / 16,
949*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
950*d9f75844SAndroid Build Coastguard Worker
951*d9f75844SAndroid Build Coastguard Worker // Send 640x480 (4:3 aspect).
952*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 480, 0, &cropped_width_,
953*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
954*d9f75844SAndroid Build Coastguard Worker &out_height_));
955*d9f75844SAndroid Build Coastguard Worker
956*d9f75844SAndroid Build Coastguard Worker // Instead of getting the exact aspect ratio with cropped resolution 640x360,
957*d9f75844SAndroid Build Coastguard Worker // the resolution should be adjusted to get a perfect scale factor instead.
958*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width_);
959*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(368, cropped_height_);
960*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(120, out_width_);
961*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(69, out_height_);
962*d9f75844SAndroid Build Coastguard Worker }
963*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,TestAdaptToVerySmallResolution)964*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestAdaptToVerySmallResolution) {
965*d9f75844SAndroid Build Coastguard Worker // Ask for 1920x1080 (16:9 aspect), with 1/16 scaling.
966*d9f75844SAndroid Build Coastguard Worker const int w = 1920;
967*d9f75844SAndroid Build Coastguard Worker const int h = 1080;
968*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(w, h, absl::nullopt);
969*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, w * h * 1 / 16 * 1 / 16,
970*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
971*d9f75844SAndroid Build Coastguard Worker
972*d9f75844SAndroid Build Coastguard Worker // Send 1920x1080 (16:9 aspect).
973*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(
974*d9f75844SAndroid Build Coastguard Worker w, h, 0, &cropped_width_, &cropped_height_, &out_width_, &out_height_));
975*d9f75844SAndroid Build Coastguard Worker
976*d9f75844SAndroid Build Coastguard Worker // Instead of getting the exact aspect ratio with cropped resolution 1920x1080
977*d9f75844SAndroid Build Coastguard Worker // the resolution should be adjusted to get a perfect scale factor instead.
978*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1920, cropped_width_);
979*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(1072, cropped_height_);
980*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(120, out_width_);
981*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(67, out_height_);
982*d9f75844SAndroid Build Coastguard Worker
983*d9f75844SAndroid Build Coastguard Worker // Adapt back up one step to 3/32.
984*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(w * h * 3 / 32 * 3 / 32,
985*d9f75844SAndroid Build Coastguard Worker w * h * 1 / 8 * 1 / 8,
986*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
987*d9f75844SAndroid Build Coastguard Worker
988*d9f75844SAndroid Build Coastguard Worker // Send 1920x1080 (16:9 aspect).
989*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(
990*d9f75844SAndroid Build Coastguard Worker w, h, 0, &cropped_width_, &cropped_height_, &out_width_, &out_height_));
991*d9f75844SAndroid Build Coastguard Worker
992*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(160, out_width_);
993*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(90, out_height_);
994*d9f75844SAndroid Build Coastguard Worker }
995*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,AdaptFrameResolutionDropWithResolutionRequest)996*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptFrameResolutionDropWithResolutionRequest) {
997*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(0, 0, kDefaultFps);
998*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0,
999*d9f75844SAndroid Build Coastguard Worker &cropped_width_, &cropped_height_,
1000*d9f75844SAndroid Build Coastguard Worker &out_width_, &out_height_));
1001*d9f75844SAndroid Build Coastguard Worker
1002*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(960 * 540,
1003*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max(),
1004*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
1005*d9f75844SAndroid Build Coastguard Worker
1006*d9f75844SAndroid Build Coastguard Worker // Still expect all frames to be dropped
1007*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0,
1008*d9f75844SAndroid Build Coastguard Worker &cropped_width_, &cropped_height_,
1009*d9f75844SAndroid Build Coastguard Worker &out_width_, &out_height_));
1010*d9f75844SAndroid Build Coastguard Worker
1011*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt, 640 * 480 - 1,
1012*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
1013*d9f75844SAndroid Build Coastguard Worker
1014*d9f75844SAndroid Build Coastguard Worker // Still expect all frames to be dropped
1015*d9f75844SAndroid Build Coastguard Worker EXPECT_FALSE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0,
1016*d9f75844SAndroid Build Coastguard Worker &cropped_width_, &cropped_height_,
1017*d9f75844SAndroid Build Coastguard Worker &out_width_, &out_height_));
1018*d9f75844SAndroid Build Coastguard Worker }
1019*d9f75844SAndroid Build Coastguard Worker
1020*d9f75844SAndroid Build Coastguard Worker // Test that we will adapt to max given a target pixel count close to max.
TEST_P(VideoAdapterTest,TestAdaptToMax)1021*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, TestAdaptToMax) {
1022*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, kDefaultFps);
1023*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(640 * 360 - 1 /* target */,
1024*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max(),
1025*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
1026*d9f75844SAndroid Build Coastguard Worker
1027*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(640, 360, 0, &cropped_width_,
1028*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_,
1029*d9f75844SAndroid Build Coastguard Worker &out_height_));
1030*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width_);
1031*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height_);
1032*d9f75844SAndroid Build Coastguard Worker }
1033*d9f75844SAndroid Build Coastguard Worker
1034*d9f75844SAndroid Build Coastguard Worker // Test adjusting to 16:9 in landscape, and 9:16 in portrait.
TEST(VideoAdapterTestMultipleOrientation,TestNormal)1035*d9f75844SAndroid Build Coastguard Worker TEST(VideoAdapterTestMultipleOrientation, TestNormal) {
1036*d9f75844SAndroid Build Coastguard Worker VideoAdapter video_adapter;
1037*d9f75844SAndroid Build Coastguard Worker video_adapter.OnOutputFormatRequest(std::make_pair(640, 360), 640 * 360,
1038*d9f75844SAndroid Build Coastguard Worker std::make_pair(360, 640), 360 * 640, 30);
1039*d9f75844SAndroid Build Coastguard Worker
1040*d9f75844SAndroid Build Coastguard Worker int cropped_width;
1041*d9f75844SAndroid Build Coastguard Worker int cropped_height;
1042*d9f75844SAndroid Build Coastguard Worker int out_width;
1043*d9f75844SAndroid Build Coastguard Worker int out_height;
1044*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(video_adapter.AdaptFrameResolution(
1045*d9f75844SAndroid Build Coastguard Worker /* in_width= */ 640, /* in_height= */ 480, /* in_timestamp_ns= */ 0,
1046*d9f75844SAndroid Build Coastguard Worker &cropped_width, &cropped_height, &out_width, &out_height));
1047*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_width);
1048*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_height);
1049*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_width);
1050*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_height);
1051*d9f75844SAndroid Build Coastguard Worker
1052*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(video_adapter.AdaptFrameResolution(
1053*d9f75844SAndroid Build Coastguard Worker /* in_width= */ 480, /* in_height= */ 640,
1054*d9f75844SAndroid Build Coastguard Worker /* in_timestamp_ns= */ rtc::kNumNanosecsPerSec / 30, &cropped_width,
1055*d9f75844SAndroid Build Coastguard Worker &cropped_height, &out_width, &out_height));
1056*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_width);
1057*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_height);
1058*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_width);
1059*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_height);
1060*d9f75844SAndroid Build Coastguard Worker }
1061*d9f75844SAndroid Build Coastguard Worker
1062*d9f75844SAndroid Build Coastguard Worker // Force output to be 9:16, even for landscape input.
TEST(VideoAdapterTestMultipleOrientation,TestForcePortrait)1063*d9f75844SAndroid Build Coastguard Worker TEST(VideoAdapterTestMultipleOrientation, TestForcePortrait) {
1064*d9f75844SAndroid Build Coastguard Worker VideoAdapter video_adapter;
1065*d9f75844SAndroid Build Coastguard Worker video_adapter.OnOutputFormatRequest(std::make_pair(360, 640), 640 * 360,
1066*d9f75844SAndroid Build Coastguard Worker std::make_pair(360, 640), 360 * 640, 30);
1067*d9f75844SAndroid Build Coastguard Worker
1068*d9f75844SAndroid Build Coastguard Worker int cropped_width;
1069*d9f75844SAndroid Build Coastguard Worker int cropped_height;
1070*d9f75844SAndroid Build Coastguard Worker int out_width;
1071*d9f75844SAndroid Build Coastguard Worker int out_height;
1072*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(video_adapter.AdaptFrameResolution(
1073*d9f75844SAndroid Build Coastguard Worker /* in_width= */ 640, /* in_height= */ 480, /* in_timestamp_ns= */ 0,
1074*d9f75844SAndroid Build Coastguard Worker &cropped_width, &cropped_height, &out_width, &out_height));
1075*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, cropped_width);
1076*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, cropped_height);
1077*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(270, out_width);
1078*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(480, out_height);
1079*d9f75844SAndroid Build Coastguard Worker
1080*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(video_adapter.AdaptFrameResolution(
1081*d9f75844SAndroid Build Coastguard Worker /* in_width= */ 480, /* in_height= */ 640,
1082*d9f75844SAndroid Build Coastguard Worker /* in_timestamp_ns= */ rtc::kNumNanosecsPerSec / 30, &cropped_width,
1083*d9f75844SAndroid Build Coastguard Worker &cropped_height, &out_width, &out_height));
1084*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, cropped_width);
1085*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, cropped_height);
1086*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(360, out_width);
1087*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(640, out_height);
1088*d9f75844SAndroid Build Coastguard Worker }
1089*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,AdaptResolutionInStepsFirst3_4)1090*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptResolutionInStepsFirst3_4) {
1091*d9f75844SAndroid Build Coastguard Worker const int kWidth = 1280;
1092*d9f75844SAndroid Build Coastguard Worker const int kHeight = 720;
1093*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, absl::nullopt); // 16:9 aspect.
1094*d9f75844SAndroid Build Coastguard Worker
1095*d9f75844SAndroid Build Coastguard Worker // Scale factors: 3/4, 2/3, 3/4, 2/3, ...
1096*d9f75844SAndroid Build Coastguard Worker // Scale : 3/4, 1/2, 3/8, 1/4, 3/16, 1/8.
1097*d9f75844SAndroid Build Coastguard Worker const int kExpectedWidths[] = {960, 640, 480, 320, 240, 160};
1098*d9f75844SAndroid Build Coastguard Worker const int kExpectedHeights[] = {540, 360, 270, 180, 135, 90};
1099*d9f75844SAndroid Build Coastguard Worker
1100*d9f75844SAndroid Build Coastguard Worker int request_width = kWidth;
1101*d9f75844SAndroid Build Coastguard Worker int request_height = kHeight;
1102*d9f75844SAndroid Build Coastguard Worker
1103*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(kExpectedWidths); ++i) {
1104*d9f75844SAndroid Build Coastguard Worker // Adapt down one step.
1105*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt,
1106*d9f75844SAndroid Build Coastguard Worker request_width * request_height - 1,
1107*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
1108*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0,
1109*d9f75844SAndroid Build Coastguard Worker &cropped_width_, &cropped_height_,
1110*d9f75844SAndroid Build Coastguard Worker &out_width_, &out_height_));
1111*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kExpectedWidths[i], out_width_);
1112*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kExpectedHeights[i], out_height_);
1113*d9f75844SAndroid Build Coastguard Worker request_width = out_width_;
1114*d9f75844SAndroid Build Coastguard Worker request_height = out_height_;
1115*d9f75844SAndroid Build Coastguard Worker }
1116*d9f75844SAndroid Build Coastguard Worker }
1117*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,AdaptResolutionInStepsFirst2_3)1118*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptResolutionInStepsFirst2_3) {
1119*d9f75844SAndroid Build Coastguard Worker const int kWidth = 1920;
1120*d9f75844SAndroid Build Coastguard Worker const int kHeight = 1080;
1121*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, absl::nullopt); // 16:9 aspect.
1122*d9f75844SAndroid Build Coastguard Worker
1123*d9f75844SAndroid Build Coastguard Worker // Scale factors: 2/3, 3/4, 2/3, 3/4, ...
1124*d9f75844SAndroid Build Coastguard Worker // Scale: 2/3, 1/2, 1/3, 1/4, 1/6, 1/8, 1/12.
1125*d9f75844SAndroid Build Coastguard Worker const int kExpectedWidths[] = {1280, 960, 640, 480, 320, 240, 160};
1126*d9f75844SAndroid Build Coastguard Worker const int kExpectedHeights[] = {720, 540, 360, 270, 180, 135, 90};
1127*d9f75844SAndroid Build Coastguard Worker
1128*d9f75844SAndroid Build Coastguard Worker int request_width = kWidth;
1129*d9f75844SAndroid Build Coastguard Worker int request_height = kHeight;
1130*d9f75844SAndroid Build Coastguard Worker
1131*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(kExpectedWidths); ++i) {
1132*d9f75844SAndroid Build Coastguard Worker // Adapt down one step.
1133*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt,
1134*d9f75844SAndroid Build Coastguard Worker request_width * request_height - 1,
1135*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
1136*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0,
1137*d9f75844SAndroid Build Coastguard Worker &cropped_width_, &cropped_height_,
1138*d9f75844SAndroid Build Coastguard Worker &out_width_, &out_height_));
1139*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kExpectedWidths[i], out_width_);
1140*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kExpectedHeights[i], out_height_);
1141*d9f75844SAndroid Build Coastguard Worker request_width = out_width_;
1142*d9f75844SAndroid Build Coastguard Worker request_height = out_height_;
1143*d9f75844SAndroid Build Coastguard Worker }
1144*d9f75844SAndroid Build Coastguard Worker }
1145*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,AdaptResolutionInStepsFirst2x2_3)1146*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptResolutionInStepsFirst2x2_3) {
1147*d9f75844SAndroid Build Coastguard Worker const int kWidth = 1440;
1148*d9f75844SAndroid Build Coastguard Worker const int kHeight = 1080;
1149*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kWidth, kHeight, absl::nullopt); // 4:3 aspect.
1150*d9f75844SAndroid Build Coastguard Worker
1151*d9f75844SAndroid Build Coastguard Worker // Scale factors: 2/3, 2/3, 3/4, 2/3, 3/4, ...
1152*d9f75844SAndroid Build Coastguard Worker // Scale : 2/3, 4/9, 1/3, 2/9, 1/6, 1/9, 1/12, 1/18, 1/24, 1/36.
1153*d9f75844SAndroid Build Coastguard Worker const int kExpectedWidths[] = {960, 640, 480, 320, 240, 160, 120, 80, 60, 40};
1154*d9f75844SAndroid Build Coastguard Worker const int kExpectedHeights[] = {720, 480, 360, 240, 180, 120, 90, 60, 45, 30};
1155*d9f75844SAndroid Build Coastguard Worker
1156*d9f75844SAndroid Build Coastguard Worker int request_width = kWidth;
1157*d9f75844SAndroid Build Coastguard Worker int request_height = kHeight;
1158*d9f75844SAndroid Build Coastguard Worker
1159*d9f75844SAndroid Build Coastguard Worker for (size_t i = 0; i < arraysize(kExpectedWidths); ++i) {
1160*d9f75844SAndroid Build Coastguard Worker // Adapt down one step.
1161*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(absl::nullopt,
1162*d9f75844SAndroid Build Coastguard Worker request_width * request_height - 1,
1163*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max()));
1164*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(kWidth, kHeight, 0,
1165*d9f75844SAndroid Build Coastguard Worker &cropped_width_, &cropped_height_,
1166*d9f75844SAndroid Build Coastguard Worker &out_width_, &out_height_));
1167*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kExpectedWidths[i], out_width_);
1168*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(kExpectedHeights[i], out_height_);
1169*d9f75844SAndroid Build Coastguard Worker request_width = out_width_;
1170*d9f75844SAndroid Build Coastguard Worker request_height = out_height_;
1171*d9f75844SAndroid Build Coastguard Worker }
1172*d9f75844SAndroid Build Coastguard Worker }
1173*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterTest,AdaptResolutionWithSinkAlignment)1174*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, AdaptResolutionWithSinkAlignment) {
1175*d9f75844SAndroid Build Coastguard Worker constexpr int kSourceWidth = 1280;
1176*d9f75844SAndroid Build Coastguard Worker constexpr int kSourceHeight = 720;
1177*d9f75844SAndroid Build Coastguard Worker constexpr int kSourceFramerate = 30;
1178*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedWidth = 480;
1179*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedHeight = 270;
1180*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedFramerate = 30;
1181*d9f75844SAndroid Build Coastguard Worker
1182*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kRequestedWidth, kRequestedHeight, kRequestedFramerate);
1183*d9f75844SAndroid Build Coastguard Worker
1184*d9f75844SAndroid Build Coastguard Worker int frame_num = 1;
1185*d9f75844SAndroid Build Coastguard Worker for (const int sink_alignment : {2, 3, 4, 5}) {
1186*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
1187*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(absl::nullopt, std::numeric_limits<int>::max(),
1188*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max(), sink_alignment));
1189*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(
1190*d9f75844SAndroid Build Coastguard Worker kSourceWidth, kSourceHeight,
1191*d9f75844SAndroid Build Coastguard Worker frame_num * rtc::kNumNanosecsPerSec / kSourceFramerate, &cropped_width_,
1192*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_, &out_height_));
1193*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_width_ % sink_alignment, 0);
1194*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_height_ % sink_alignment, 0);
1195*d9f75844SAndroid Build Coastguard Worker
1196*d9f75844SAndroid Build Coastguard Worker ++frame_num;
1197*d9f75844SAndroid Build Coastguard Worker }
1198*d9f75844SAndroid Build Coastguard Worker }
1199*d9f75844SAndroid Build Coastguard Worker
1200*d9f75844SAndroid Build Coastguard Worker // Verify the cases the OnOutputFormatRequest is ignored and
1201*d9f75844SAndroid Build Coastguard Worker // requested_resolution is used instead.
TEST_P(VideoAdapterTest,UseRequestedResolutionInsteadOfOnOutputFormatRequest)1202*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterTest, UseRequestedResolutionInsteadOfOnOutputFormatRequest) {
1203*d9f75844SAndroid Build Coastguard Worker {
1204*d9f75844SAndroid Build Coastguard Worker // Both new and old API active => Use OnOutputFormatRequest
1205*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, kDefaultFps);
1206*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
1207*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(Resolution{.width = 960, .height = 540},
1208*d9f75844SAndroid Build Coastguard Worker /* any_active_without_requested_resolution= */ true));
1209*d9f75844SAndroid Build Coastguard Worker
1210*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(
1211*d9f75844SAndroid Build Coastguard Worker AdaptFrameResolution(/* input frame */ {.width = 1280, .height = 720})
1212*d9f75844SAndroid Build Coastguard Worker .first,
1213*d9f75844SAndroid Build Coastguard Worker Eq(Resolution{.width = 640, .height = 360}));
1214*d9f75844SAndroid Build Coastguard Worker }
1215*d9f75844SAndroid Build Coastguard Worker {
1216*d9f75844SAndroid Build Coastguard Worker // New API active, old API inactive, ignore OnOutputFormatRequest and use
1217*d9f75844SAndroid Build Coastguard Worker // requested_resolution.
1218*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, kDefaultFps);
1219*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
1220*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(Resolution{.width = 960, .height = 540},
1221*d9f75844SAndroid Build Coastguard Worker /* any_active_without_requested_resolution= */ false));
1222*d9f75844SAndroid Build Coastguard Worker
1223*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(
1224*d9f75844SAndroid Build Coastguard Worker AdaptFrameResolution(/* input frame */ {.width = 1280, .height = 720})
1225*d9f75844SAndroid Build Coastguard Worker .first,
1226*d9f75844SAndroid Build Coastguard Worker Eq(Resolution{.width = 960, .height = 540}));
1227*d9f75844SAndroid Build Coastguard Worker }
1228*d9f75844SAndroid Build Coastguard Worker
1229*d9f75844SAndroid Build Coastguard Worker {
1230*d9f75844SAndroid Build Coastguard Worker // New API inactive, old API inactive, use OnOutputFormatRequest.
1231*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, kDefaultFps);
1232*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
1233*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(absl::nullopt,
1234*d9f75844SAndroid Build Coastguard Worker /* any_active_without_requested_resolution= */ false));
1235*d9f75844SAndroid Build Coastguard Worker
1236*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(
1237*d9f75844SAndroid Build Coastguard Worker AdaptFrameResolution(/* input frame */ {.width = 1280, .height = 720})
1238*d9f75844SAndroid Build Coastguard Worker .first,
1239*d9f75844SAndroid Build Coastguard Worker Eq(Resolution{.width = 640, .height = 360}));
1240*d9f75844SAndroid Build Coastguard Worker }
1241*d9f75844SAndroid Build Coastguard Worker
1242*d9f75844SAndroid Build Coastguard Worker {
1243*d9f75844SAndroid Build Coastguard Worker // New API active, old API inactive, remember OnOutputFormatRequest.
1244*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(640, 360, kDefaultFps);
1245*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
1246*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(Resolution{.width = 960, .height = 540},
1247*d9f75844SAndroid Build Coastguard Worker /* any_active_without_requested_resolution= */ false));
1248*d9f75844SAndroid Build Coastguard Worker
1249*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(
1250*d9f75844SAndroid Build Coastguard Worker AdaptFrameResolution(/* input frame */ {.width = 1280, .height = 720})
1251*d9f75844SAndroid Build Coastguard Worker .first,
1252*d9f75844SAndroid Build Coastguard Worker Eq(Resolution{.width = 960, .height = 540}));
1253*d9f75844SAndroid Build Coastguard Worker
1254*d9f75844SAndroid Build Coastguard Worker // This is ignored since there is not any active NOT using
1255*d9f75844SAndroid Build Coastguard Worker // requested_resolution.
1256*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(320, 180, kDefaultFps);
1257*d9f75844SAndroid Build Coastguard Worker
1258*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(
1259*d9f75844SAndroid Build Coastguard Worker AdaptFrameResolution(/* input frame */ {.width = 1280, .height = 720})
1260*d9f75844SAndroid Build Coastguard Worker .first,
1261*d9f75844SAndroid Build Coastguard Worker Eq(Resolution{.width = 960, .height = 540}));
1262*d9f75844SAndroid Build Coastguard Worker
1263*d9f75844SAndroid Build Coastguard Worker // Disable new API => fallback to last OnOutputFormatRequest.
1264*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(
1265*d9f75844SAndroid Build Coastguard Worker BuildSinkWants(absl::nullopt,
1266*d9f75844SAndroid Build Coastguard Worker /* any_active_without_requested_resolution= */ false));
1267*d9f75844SAndroid Build Coastguard Worker
1268*d9f75844SAndroid Build Coastguard Worker EXPECT_THAT(
1269*d9f75844SAndroid Build Coastguard Worker AdaptFrameResolution(/* input frame */ {.width = 1280, .height = 720})
1270*d9f75844SAndroid Build Coastguard Worker .first,
1271*d9f75844SAndroid Build Coastguard Worker Eq(Resolution{.width = 320, .height = 180}));
1272*d9f75844SAndroid Build Coastguard Worker }
1273*d9f75844SAndroid Build Coastguard Worker }
1274*d9f75844SAndroid Build Coastguard Worker
1275*d9f75844SAndroid Build Coastguard Worker class VideoAdapterWithSourceAlignmentTest : public VideoAdapterTest {
1276*d9f75844SAndroid Build Coastguard Worker protected:
1277*d9f75844SAndroid Build Coastguard Worker static constexpr int kSourceResolutionAlignment = 7;
1278*d9f75844SAndroid Build Coastguard Worker
VideoAdapterWithSourceAlignmentTest()1279*d9f75844SAndroid Build Coastguard Worker VideoAdapterWithSourceAlignmentTest()
1280*d9f75844SAndroid Build Coastguard Worker : VideoAdapterTest(/*field_trials=*/"", kSourceResolutionAlignment) {}
1281*d9f75844SAndroid Build Coastguard Worker };
1282*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterWithSourceAlignmentTest,AdaptResolution)1283*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterWithSourceAlignmentTest, AdaptResolution) {
1284*d9f75844SAndroid Build Coastguard Worker constexpr int kSourceWidth = 1280;
1285*d9f75844SAndroid Build Coastguard Worker constexpr int kSourceHeight = 720;
1286*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedWidth = 480;
1287*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedHeight = 270;
1288*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedFramerate = 30;
1289*d9f75844SAndroid Build Coastguard Worker
1290*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kRequestedWidth, kRequestedHeight, kRequestedFramerate);
1291*d9f75844SAndroid Build Coastguard Worker
1292*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(
1293*d9f75844SAndroid Build Coastguard Worker kSourceWidth, kSourceHeight, /*in_timestamp_ns=*/0, &cropped_width_,
1294*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_, &out_height_));
1295*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_width_ % kSourceResolutionAlignment, 0);
1296*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_height_ % kSourceResolutionAlignment, 0);
1297*d9f75844SAndroid Build Coastguard Worker }
1298*d9f75844SAndroid Build Coastguard Worker
TEST_P(VideoAdapterWithSourceAlignmentTest,AdaptResolutionWithSinkAlignment)1299*d9f75844SAndroid Build Coastguard Worker TEST_P(VideoAdapterWithSourceAlignmentTest, AdaptResolutionWithSinkAlignment) {
1300*d9f75844SAndroid Build Coastguard Worker constexpr int kSourceWidth = 1280;
1301*d9f75844SAndroid Build Coastguard Worker constexpr int kSourceHeight = 720;
1302*d9f75844SAndroid Build Coastguard Worker // 7 and 8 neither divide 480 nor 270.
1303*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedWidth = 480;
1304*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedHeight = 270;
1305*d9f75844SAndroid Build Coastguard Worker constexpr int kRequestedFramerate = 30;
1306*d9f75844SAndroid Build Coastguard Worker constexpr int kSinkResolutionAlignment = 8;
1307*d9f75844SAndroid Build Coastguard Worker
1308*d9f75844SAndroid Build Coastguard Worker OnOutputFormatRequest(kRequestedWidth, kRequestedHeight, kRequestedFramerate);
1309*d9f75844SAndroid Build Coastguard Worker
1310*d9f75844SAndroid Build Coastguard Worker adapter_.OnSinkWants(BuildSinkWants(
1311*d9f75844SAndroid Build Coastguard Worker absl::nullopt, std::numeric_limits<int>::max(),
1312*d9f75844SAndroid Build Coastguard Worker std::numeric_limits<int>::max(), kSinkResolutionAlignment));
1313*d9f75844SAndroid Build Coastguard Worker EXPECT_TRUE(adapter_.AdaptFrameResolution(
1314*d9f75844SAndroid Build Coastguard Worker kSourceWidth, kSourceHeight, /*in_timestamp_ns=*/0, &cropped_width_,
1315*d9f75844SAndroid Build Coastguard Worker &cropped_height_, &out_width_, &out_height_));
1316*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_width_ % kSourceResolutionAlignment, 0);
1317*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_height_ % kSourceResolutionAlignment, 0);
1318*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_width_ % kSinkResolutionAlignment, 0);
1319*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(out_height_ % kSinkResolutionAlignment, 0);
1320*d9f75844SAndroid Build Coastguard Worker }
1321*d9f75844SAndroid Build Coastguard Worker
1322*d9f75844SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(OnOutputFormatRequests,
1323*d9f75844SAndroid Build Coastguard Worker VideoAdapterWithSourceAlignmentTest,
1324*d9f75844SAndroid Build Coastguard Worker ::testing::Values(true, false));
1325*d9f75844SAndroid Build Coastguard Worker
1326*d9f75844SAndroid Build Coastguard Worker } // namespace cricket
1327