From a1f78a4fa6f20cd76167a18d1ec1b6842294ef8c Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Fri, 21 Dec 2018 09:04:47 +0000 Subject: [PATCH] Revert "Refactor rate profile update." This reverts commit b6cdfdc165d76d86a67d829e0ccec50c36106e73. Reason for revert: breaks downstream projects Original change's description: > Refactor rate profile update. > > RateProfile::frame_num specifies frame at which this rate profile > should be applied. > > Bug: none > Change-Id: I003ee43f44299a49d83f547558284817bfaeacc0 > Reviewed-on: https://webrtc-review.googlesource.com/c/115242 > Reviewed-by: Ilya Nikolaevskiy > Reviewed-by: Seth Hampson > Commit-Queue: Sergey Silkin > Cr-Commit-Position: refs/heads/master@{#26080} TBR=ilnik@webrtc.org,shampson@webrtc.org,ssilkin@webrtc.org Change-Id: I5957a0169841008436d1db70403d3694bf25d5cf No-Presubmit: true No-Tree-Checks: true No-Try: true Bug: none Reviewed-on: https://webrtc-review.googlesource.com/c/115400 Reviewed-by: Sergey Silkin Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/master@{#26081} --- api/test/videocodec_test_fixture.h | 4 +- .../test/videocodec_test_fixture_impl.cc | 50 +++++++++++-------- .../codecs/test/videocodec_test_libvpx.cc | 47 +++++++++-------- .../codecs/test/videocodec_test_mediacodec.cc | 11 ++-- .../codecs/test/videocodec_test_openh264.cc | 4 +- .../test/videocodec_test_parameterized.cc | 3 +- 6 files changed, 66 insertions(+), 53 deletions(-) diff --git a/api/test/videocodec_test_fixture.h b/api/test/videocodec_test_fixture.h index 67f9d02676..925c60c3c9 100644 --- a/api/test/videocodec_test_fixture.h +++ b/api/test/videocodec_test_fixture.h @@ -22,11 +22,11 @@ namespace webrtc { namespace test { -// Rates for the encoder and the frame number when to apply profile. +// Rates for the encoder and the frame number when to change profile. struct RateProfile { size_t target_kbps; size_t input_fps; - size_t frame_num; + size_t frame_index_rate_update; }; struct RateControlThresholds { diff --git a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc index c9c84ed377..e6b2f7b2c1 100644 --- a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc +++ b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc @@ -422,22 +422,27 @@ void VideoCodecTestFixtureImpl::RunTest( void VideoCodecTestFixtureImpl::ProcessAllFrames( rtc::TaskQueue* task_queue, const std::vector& rate_profiles) { + // Process all frames. + size_t rate_update_index = 0; + // Set initial rates. - auto rate_profile = rate_profiles.begin(); - task_queue->PostTask([this, rate_profile] { - processor_->SetRates(rate_profile->target_kbps, rate_profile->input_fps); + task_queue->PostTask([this, &rate_profiles, rate_update_index] { + processor_->SetRates(rate_profiles[rate_update_index].target_kbps, + rate_profiles[rate_update_index].input_fps); }); cpu_process_time_->Start(); - for (size_t frame_num = 0; frame_num < config_.num_frames; ++frame_num) { - auto next_rate_profile = std::next(rate_profile); - if (next_rate_profile != rate_profiles.end() && - frame_num == next_rate_profile->frame_num) { - rate_profile = next_rate_profile; - task_queue->PostTask([this, rate_profile] { - processor_->SetRates(rate_profile->target_kbps, - rate_profile->input_fps); + for (size_t frame_number = 0; frame_number < config_.num_frames; + ++frame_number) { + if (frame_number == + rate_profiles[rate_update_index].frame_index_rate_update) { + ++rate_update_index; + RTC_DCHECK_GT(rate_profiles.size(), rate_update_index); + + task_queue->PostTask([this, &rate_profiles, rate_update_index] { + processor_->SetRates(rate_profiles[rate_update_index].target_kbps, + rate_profiles[rate_update_index].input_fps); }); } @@ -446,7 +451,7 @@ void VideoCodecTestFixtureImpl::ProcessAllFrames( if (RunEncodeInRealTime(config_)) { // Roughly pace the frames. const size_t frame_duration_ms = - rtc::kNumMillisecsPerSec / rate_profile->input_fps; + rtc::kNumMillisecsPerSec / rate_profiles[rate_update_index].input_fps; SleepMs(static_cast(frame_duration_ms)); } } @@ -467,13 +472,14 @@ void VideoCodecTestFixtureImpl::AnalyzeAllFrames( const std::vector* rc_thresholds, const std::vector* quality_thresholds, const BitstreamThresholds* bs_thresholds) { - for (size_t rate_profile_idx = 0; rate_profile_idx < rate_profiles.size(); - ++rate_profile_idx) { - const size_t first_frame_num = rate_profiles[rate_profile_idx].frame_num; + for (size_t rate_update_idx = 0; rate_update_idx < rate_profiles.size(); + ++rate_update_idx) { + const size_t first_frame_num = + (rate_update_idx == 0) + ? 0 + : rate_profiles[rate_update_idx - 1].frame_index_rate_update; const size_t last_frame_num = - rate_profile_idx + 1 < rate_profiles.size() - ? rate_profiles[rate_profile_idx + 1].frame_num - 1 - : config_.num_frames - 1; + rate_profiles[rate_update_idx].frame_index_rate_update - 1; RTC_CHECK(last_frame_num >= first_frame_num); std::vector layer_stats = @@ -489,14 +495,14 @@ void VideoCodecTestFixtureImpl::AnalyzeAllFrames( printf("%s\n", send_stat.ToString("send_").c_str()); const RateControlThresholds* rc_threshold = - rc_thresholds ? &(*rc_thresholds)[rate_profile_idx] : nullptr; + rc_thresholds ? &(*rc_thresholds)[rate_update_idx] : nullptr; const QualityThresholds* quality_threshold = - quality_thresholds ? &(*quality_thresholds)[rate_profile_idx] : nullptr; + quality_thresholds ? &(*quality_thresholds)[rate_update_idx] : nullptr; VerifyVideoStatistic(send_stat, rc_threshold, quality_threshold, bs_thresholds, - rate_profiles[rate_profile_idx].target_kbps, - rate_profiles[rate_profile_idx].input_fps); + rate_profiles[rate_update_idx].target_kbps, + rate_profiles[rate_update_idx].input_fps); } if (config_.print_frame_level_stats) { diff --git a/modules/video_coding/codecs/test/videocodec_test_libvpx.cc b/modules/video_coding/codecs/test/videocodec_test_libvpx.cc index 9665d1c51b..445b0c299d 100644 --- a/modules/video_coding/codecs/test/videocodec_test_libvpx.cc +++ b/modules/video_coding/codecs/test/videocodec_test_libvpx.cc @@ -100,7 +100,7 @@ TEST(VideoCodecTestLibvpx, HighBitrateVP9) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{500, 30, 0}}; + std::vector rate_profiles = {{500, 30, kNumFramesShort}}; std::vector rc_thresholds = { {5, 1, 0, 1, 0.3, 0.1, 0, 1}}; @@ -119,9 +119,9 @@ TEST(VideoCodecTestLibvpx, ChangeBitrateVP9) { auto fixture = CreateVideoCodecTestFixture(config); std::vector rate_profiles = { - {200, 30, 0}, // target_kbps, input_fps, frame_num - {700, 30, 100}, - {500, 30, 200}}; + {200, 30, 100}, // target_kbps, input_fps, frame_index_rate_update + {700, 30, 200}, + {500, 30, kNumFramesLong}}; std::vector rc_thresholds = { {5, 2, 0, 1, 0.5, 0.1, 0, 1}, @@ -143,9 +143,9 @@ TEST(VideoCodecTestLibvpx, ChangeFramerateVP9) { auto fixture = CreateVideoCodecTestFixture(config); std::vector rate_profiles = { - {100, 24, 0}, // target_kbps, input_fps, frame_num - {100, 15, 100}, - {100, 10, 200}}; + {100, 24, 100}, // target_kbps, input_fps, frame_index_rate_update + {100, 15, 200}, + {100, 10, kNumFramesLong}}; // Framerate mismatch should be lower for lower framerate. std::vector rc_thresholds = { @@ -169,7 +169,7 @@ TEST(VideoCodecTestLibvpx, DenoiserOnVP9) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{500, 30, 0}}; + std::vector rate_profiles = {{500, 30, kNumFramesShort}}; std::vector rc_thresholds = { {5, 1, 0, 1, 0.3, 0.1, 0, 1}}; @@ -187,7 +187,7 @@ TEST(VideoCodecTestLibvpx, VeryLowBitrateVP9) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{50, 30, 0}}; + std::vector rate_profiles = {{50, 30, kNumFramesLong}}; std::vector rc_thresholds = { {15, 3, 75, 1, 0.5, 0.4, 1, 1}}; @@ -211,7 +211,7 @@ TEST(VideoCodecTestLibvpx, HighBitrateVP8) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{500, 30, 0}}; + std::vector rate_profiles = {{500, 30, kNumFramesShort}}; std::vector rc_thresholds = { {5, 1, 0, 1, 0.2, 0.1, 0, 1}}; @@ -248,9 +248,9 @@ TEST(VideoCodecTestLibvpx, MAYBE_ChangeBitrateVP8) { auto fixture = CreateVideoCodecTestFixture(config); std::vector rate_profiles = { - {200, 30, 0}, // target_kbps, input_fps, frame_num - {800, 30, 100}, - {500, 30, 200}}; + {200, 30, 100}, // target_kbps, input_fps, frame_index_rate_update + {800, 30, 200}, + {500, 30, kNumFramesLong}}; std::vector rc_thresholds = { {5, 1, 0, 1, 0.2, 0.1, 0, 1}, @@ -282,9 +282,9 @@ TEST(VideoCodecTestLibvpx, MAYBE_ChangeFramerateVP8) { auto fixture = CreateVideoCodecTestFixture(config); std::vector rate_profiles = { - {80, 24, 0}, // target_kbps, input_fps, frame_index_rate_update - {80, 15, 100}, - {80, 10, 200}}; + {80, 24, 100}, // target_kbps, input_fps, frame_index_rate_update + {80, 15, 200}, + {80, 10, kNumFramesLong}}; #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) std::vector rc_thresholds = { @@ -321,7 +321,8 @@ TEST(VideoCodecTestLibvpx, MAYBE_TemporalLayersVP8) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{200, 30, 0}, {400, 30, 150}}; + std::vector rate_profiles = {{200, 30, 150}, + {400, 30, kNumFramesLong}}; #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) std::vector rc_thresholds = { @@ -357,7 +358,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_MultiresVP8) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{1500, 30, 0}}; + std::vector rate_profiles = {{1500, 30, config.num_frames}}; #if defined(WEBRTC_ARCH_ARM) || defined(WEBRTC_ARCH_ARM64) std::vector rc_thresholds = { {3.5, 1.04, 6, 0.18, 0.14, 0.07, 0, 1}}; @@ -398,7 +399,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_SimulcastVP8) { CreateVideoCodecTestFixture(config, std::move(internal_decoder_factory), std::move(adapted_encoder_factory)); - std::vector rate_profiles = {{1500, 30, 0}}; + std::vector rate_profiles = {{1500, 30, config.num_frames}}; std::vector rc_thresholds = { {20, 5, 90, 1, 0.5, 0.3, 0, 1}}; @@ -423,7 +424,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_SvcVP9) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{1500, 30, 0}}; + std::vector rate_profiles = {{1500, 30, config.num_frames}}; std::vector rc_thresholds = { {5, 1, 5, 1, 0.3, 0.1, 0, 1}}; @@ -446,7 +447,8 @@ TEST(VideoCodecTestLibvpx, DISABLED_MultiresVP8RdPerf) { std::map> rd_stats; for (size_t bitrate_kbps : kBitrateRdPerfKbps) { - std::vector rate_profiles = {{bitrate_kbps, 30, 0}}; + std::vector rate_profiles = { + {bitrate_kbps, 30, config.num_frames}}; fixture->RunTest(rate_profiles, nullptr, nullptr, nullptr); @@ -472,7 +474,8 @@ TEST(VideoCodecTestLibvpx, DISABLED_SvcVP9RdPerf) { std::map> rd_stats; for (size_t bitrate_kbps : kBitrateRdPerfKbps) { - std::vector rate_profiles = {{bitrate_kbps, 30, 0}}; + std::vector rate_profiles = { + {bitrate_kbps, 30, config.num_frames}}; fixture->RunTest(rate_profiles, nullptr, nullptr, nullptr); diff --git a/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc b/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc index 916f033dfc..edfc211c22 100644 --- a/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc +++ b/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc @@ -54,7 +54,8 @@ TEST(VideoCodecTestMediaCodec, ForemanCif500kbpsVp8) { 352, 288); auto fixture = CreateTestFixtureWithConfig(config); - std::vector rate_profiles = {{500, kForemanFramerateFps, 0}}; + std::vector rate_profiles = { + {500, kForemanFramerateFps, kForemanNumFrames}}; // The thresholds below may have to be tweaked to let even poor MediaCodec // implementations pass. If this test fails on the bots, disable it and @@ -76,7 +77,8 @@ TEST(VideoCodecTestMediaCodec, ForemanCif500kbpsH264CBP) { 352, 288); auto fixture = CreateTestFixtureWithConfig(config); - std::vector rate_profiles = {{500, kForemanFramerateFps, 0}}; + std::vector rate_profiles = { + {500, kForemanFramerateFps, kForemanNumFrames}}; // The thresholds below may have to be tweaked to let even poor MediaCodec // implementations pass. If this test fails on the bots, disable it and @@ -102,7 +104,8 @@ TEST(VideoCodecTestMediaCodec, DISABLED_ForemanCif500kbpsH264CHP) { 352, 288); auto fixture = CreateTestFixtureWithConfig(config); - std::vector rate_profiles = {{500, kForemanFramerateFps, 0}}; + std::vector rate_profiles = { + {500, kForemanFramerateFps, kForemanNumFrames}}; // The thresholds below may have to be tweaked to let even poor MediaCodec // implementations pass. If this test fails on the bots, disable it and @@ -123,7 +126,7 @@ TEST(VideoCodecTestMediaCodec, ForemanMixedRes100kbpsVp8H264) { const std::vector> resolutions = { {128, 96}, {160, 120}, {176, 144}, {240, 136}, {320, 240}, {480, 272}}; const std::vector rate_profiles = { - {100, kForemanFramerateFps, 0}}; + {100, kForemanFramerateFps, kNumFrames}}; const std::vector quality_thresholds = { {29, 26, 0.8, 0.75}}; diff --git a/modules/video_coding/codecs/test/videocodec_test_openh264.cc b/modules/video_coding/codecs/test/videocodec_test_openh264.cc index ed2171c8e1..bd4bb52b85 100644 --- a/modules/video_coding/codecs/test/videocodec_test_openh264.cc +++ b/modules/video_coding/codecs/test/videocodec_test_openh264.cc @@ -45,7 +45,7 @@ TEST(VideoCodecTestOpenH264, ConstantHighBitrate) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{500, 30, 0}}; + std::vector rate_profiles = {{500, 30, kNumFrames}}; std::vector rc_thresholds = { {5, 1, 0, 0.1, 0.2, 0.1, 0, 1}}; @@ -69,7 +69,7 @@ TEST(VideoCodecTestOpenH264, SingleNalUnit) { config.encoded_frame_checker = frame_checker.get(); auto fixture = CreateVideoCodecTestFixture(config); - std::vector rate_profiles = {{500, 30, 0}}; + std::vector rate_profiles = {{500, 30, kNumFrames}}; std::vector rc_thresholds = { {5, 1, 0, 0.1, 0.2, 0.1, 0, 1}}; diff --git a/modules/video_coding/codecs/test/videocodec_test_parameterized.cc b/modules/video_coding/codecs/test/videocodec_test_parameterized.cc index d0ee265a41..efc80add2d 100644 --- a/modules/video_coding/codecs/test/videocodec_test_parameterized.cc +++ b/modules/video_coding/codecs/test/videocodec_test_parameterized.cc @@ -67,7 +67,8 @@ class VideoCodecTestParameterized kDenoisingOn, kFrameDropperOn, kSpatialResizeOn, width, height); - std::vector rate_profiles = {{bitrate_, framerate, 0}}; + std::vector rate_profiles = { + {bitrate_, framerate, kNumFrames}}; fixture_ = CreateVideoCodecTestFixture(config); fixture_->RunTest(rate_profiles, nullptr, nullptr, nullptr);