From 788f57760386b8a7acdbb8c585b502097885a2ec Mon Sep 17 00:00:00 2001 From: Mirta Dvornicic Date: Wed, 13 Feb 2019 17:35:40 +0100 Subject: [PATCH] Update the resolution check for VP8 simulcast. To support non-default values of scale_resolution_down_by. Bug: webrtc:10069 Change-Id: I7efb39cc06a895986f9583acc2180245c009a7fa Reviewed-on: https://webrtc-review.googlesource.com/c/121650 Commit-Queue: Mirta Dvornicic Reviewed-by: Rasmus Brandt Reviewed-by: Ilya Nikolaevskiy Cr-Commit-Position: refs/heads/master@{#26677} --- .../codecs/vp8/test/vp8_impl_unittest.cc | 26 +++++++++++++------ .../video_coding/utility/simulcast_utility.cc | 18 ++++++++++--- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc b/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc index 06d9448cb4..555f9783cc 100644 --- a/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc +++ b/modules/video_coding/codecs/vp8/test/vp8_impl_unittest.cc @@ -242,30 +242,30 @@ TEST_F(TestVp8Impl, DecodedColorSpaceEqualsEncodedColorSpace) { TEST_F(TestVp8Impl, ChecksSimulcastSettings) { codec_settings_.numberOfSimulcastStreams = 2; - // Reslutions are not scaled by 2, temporal layers do not match. + // Resolutions are not in ascending order, temporal layers do not match. codec_settings_.simulcastStream[0] = {kWidth, kHeight, kFramerateFps, 2, 4000, 3000, 2000, 80}; - codec_settings_.simulcastStream[1] = {kWidth, kHeight, 30, 3, - 4000, 3000, 2000, 80}; + codec_settings_.simulcastStream[1] = {kWidth / 2, kHeight / 2, 30, 3, + 4000, 3000, 2000, 80}; EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERR_SIMULCAST_PARAMETERS_NOT_SUPPORTED, encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize)); codec_settings_.numberOfSimulcastStreams = 3; - // Reslutions are not scaled by 2. + // Resolutions are not in ascending order. codec_settings_.simulcastStream[0] = { kWidth / 2, kHeight / 2, kFramerateFps, 1, 4000, 3000, 2000, 80}; codec_settings_.simulcastStream[1] = { - kWidth / 2, kHeight / 2, kFramerateFps, 1, 4000, 3000, 2000, 80}; + kWidth / 2 - 1, kHeight / 2 - 1, kFramerateFps, 1, 4000, 3000, 2000, 80}; codec_settings_.simulcastStream[2] = {kWidth, kHeight, 30, 1, 4000, 3000, 2000, 80}; EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERR_SIMULCAST_PARAMETERS_NOT_SUPPORTED, encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize)); - // Reslutions are not scaled by 2. + // Resolutions are not in ascending order. codec_settings_.simulcastStream[0] = {kWidth, kHeight, kFramerateFps, 1, 4000, 3000, 2000, 80}; codec_settings_.simulcastStream[1] = {kWidth, kHeight, kFramerateFps, 1, 4000, 3000, 2000, 80}; - codec_settings_.simulcastStream[2] = {kWidth, kHeight, kFramerateFps, 1, - 4000, 3000, 2000, 80}; + codec_settings_.simulcastStream[2] = { + kWidth - 1, kHeight - 1, kFramerateFps, 1, 4000, 3000, 2000, 80}; EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERR_SIMULCAST_PARAMETERS_NOT_SUPPORTED, encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize)); // Temporal layers do not match. @@ -296,6 +296,16 @@ TEST_F(TestVp8Impl, ChecksSimulcastSettings) { 4000, 3000, 2000, 80}; EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize)); + // Everything fine: custom scaling, top resolution matches video, temporal + // settings are the same for all layers. + codec_settings_.simulcastStream[0] = { + kWidth / 4, kHeight / 4, kFramerateFps, 1, 4000, 3000, 2000, 80}; + codec_settings_.simulcastStream[1] = {kWidth, kHeight, kFramerateFps, 1, + 4000, 3000, 2000, 80}; + codec_settings_.simulcastStream[2] = {kWidth, kHeight, kFramerateFps, 1, + 4000, 3000, 2000, 80}; + EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, + encoder_->InitEncode(&codec_settings_, kNumCores, kMaxPayloadSize)); } #if defined(WEBRTC_ANDROID) diff --git a/modules/video_coding/utility/simulcast_utility.cc b/modules/video_coding/utility/simulcast_utility.cc index 99666828ca..b517455cca 100644 --- a/modules/video_coding/utility/simulcast_utility.cc +++ b/modules/video_coding/utility/simulcast_utility.cc @@ -47,10 +47,20 @@ bool SimulcastUtility::ValidSimulcastResolutions(const VideoCodec& codec, return false; } } - for (int i = 1; i < num_streams; ++i) { - if (codec.simulcastStream[i].width != - codec.simulcastStream[i - 1].width * 2) { - return false; + if (codec.codecType == webrtc::kVideoCodecVP8) { + for (int i = 1; i < num_streams; ++i) { + if (codec.simulcastStream[i].width < codec.simulcastStream[i - 1].width) { + return false; + } + } + } else { + // TODO(mirtad): H264 encoder implementation still assumes the default + // resolution downscaling is used. + for (int i = 1; i < num_streams; ++i) { + if (codec.simulcastStream[i].width != + codec.simulcastStream[i - 1].width * 2) { + return false; + } } } return true;