diff --git a/media/base/video_adapter.cc b/media/base/video_adapter.cc index 1d0beb5959..487845d2dc 100644 --- a/media/base/video_adapter.cc +++ b/media/base/video_adapter.cc @@ -379,6 +379,11 @@ void VideoAdapter::OnSinkWants(const rtc::VideoSinkWants& sink_wants) { } auto res = *sink_wants.requested_resolution; + if (res.width < res.height) { + // Adjust `res` to landscape mode. + res.width = sink_wants.requested_resolution->height; + res.height = sink_wants.requested_resolution->width; + } auto pixel_count = res.width * res.height; output_format_request_.target_landscape_aspect_ratio = std::make_pair(res.width, res.height); diff --git a/media/base/video_adapter_unittest.cc b/media/base/video_adapter_unittest.cc index aab96dcf82..5011438363 100644 --- a/media/base/video_adapter_unittest.cc +++ b/media/base/video_adapter_unittest.cc @@ -1281,6 +1281,31 @@ TEST_P(VideoAdapterTest, UseRequestedResolutionInsteadOfOnOutputFormatRequest) { } } +TEST_P(VideoAdapterTest, RequestedResolutionIsOrientationAgnostic) { + // Request 1280x720 when frame is 720x1280. + { + adapter_.OnSinkWants( + BuildSinkWants(Resolution{.width = 1280, .height = 720}, + /* any_active_without_requested_resolution= */ false)); + + EXPECT_THAT( + AdaptFrameResolution(/* input frame */ {.width = 720, .height = 1280}) + .first, + Eq(Resolution{.width = 720, .height = 1280})); + } + // Request 720x1280 when frame is 1280x720. + { + adapter_.OnSinkWants( + BuildSinkWants(Resolution{.width = 720, .height = 1280}, + /* any_active_without_requested_resolution= */ false)); + + EXPECT_THAT( + AdaptFrameResolution(/* input frame */ {.width = 1280, .height = 720}) + .first, + Eq(Resolution{.width = 1280, .height = 720})); + } +} + class VideoAdapterWithSourceAlignmentTest : public VideoAdapterTest { protected: static constexpr int kSourceResolutionAlignment = 7;