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;