From 7c1ccfa881e9672edf33f1ff35d963b84c358302 Mon Sep 17 00:00:00 2001 From: Rasmus Brandt Date: Fri, 25 May 2018 11:58:44 +0200 Subject: [PATCH] Move VisualizationParams to VideoCodecTestFixture::Config. Bug: None Change-Id: I0a725535c840dda2704dfff33f5e5d3bef3fc0a7 Reviewed-on: https://webrtc-review.googlesource.com/78882 Commit-Queue: Rasmus Brandt Reviewed-by: Sergey Silkin Reviewed-by: Fredrik Solenberg Cr-Commit-Position: refs/heads/master@{#23422} --- api/test/videocodec_test_fixture.h | 17 +++--- .../test/videocodec_test_fixture_impl.cc | 57 +++++++++---------- .../test/videocodec_test_fixture_impl.h | 6 +- .../codecs/test/videocodec_test_libvpx.cc | 40 +++++-------- .../codecs/test/videocodec_test_mediacodec.cc | 12 ++-- .../codecs/test/videocodec_test_openh264.cc | 5 +- .../test/videocodec_test_parameterized.cc | 7 +-- .../test/videocodec_test_videotoolbox.cc | 6 +- 8 files changed, 60 insertions(+), 90 deletions(-) diff --git a/api/test/videocodec_test_fixture.h b/api/test/videocodec_test_fixture.h index 68e063750c..817ce05a79 100644 --- a/api/test/videocodec_test_fixture.h +++ b/api/test/videocodec_test_fixture.h @@ -52,12 +52,7 @@ struct BitstreamThresholds { size_t max_max_nalu_size_bytes; }; -// Should video files be saved persistently to disk for post-run visualization? -struct VisualizationParams { - bool save_encoded_ivf; - bool save_decoded_y4m; -}; - +// NOTE: This class is still under development and may change without notice. class VideoCodecTestFixture { public: class EncodedFrameChecker { @@ -66,6 +61,7 @@ class VideoCodecTestFixture { virtual void CheckEncodedFrame(webrtc::VideoCodecType codec, const EncodedImage& encoded_frame) const = 0; }; + struct Config { Config(); void SetCodecSettings(std::string codec_name, @@ -141,6 +137,12 @@ class VideoCodecTestFixture { // Print out frame level stats. bool print_frame_level_stats = false; + + // Should video be saved persistently to disk for post-run visualization? + struct VisualizationParams { + bool save_encoded_ivf = false; + bool save_decoded_y4m = false; + } visualization_params; }; virtual ~VideoCodecTestFixture() = default; @@ -148,8 +150,7 @@ class VideoCodecTestFixture { virtual void RunTest(const std::vector& rate_profiles, const std::vector* rc_thresholds, const std::vector* quality_thresholds, - const BitstreamThresholds* bs_thresholds, - const VisualizationParams* visualization_params) = 0; + const BitstreamThresholds* bs_thresholds) = 0; virtual VideoCodecTestStats& GetStats() = 0; }; 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 7a19529075..575c97e0fc 100644 --- a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc +++ b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.cc @@ -384,17 +384,16 @@ void VideoCodecTestFixtureImpl::RunTest( const std::vector& rate_profiles, const std::vector* rc_thresholds, const std::vector* quality_thresholds, - const BitstreamThresholds* bs_thresholds, - const VisualizationParams* visualization_params) { + const BitstreamThresholds* bs_thresholds) { RTC_DCHECK(!rate_profiles.empty()); // To emulate operation on a production VideoStreamEncoder, we call the // codecs on a task queue. rtc::test::TaskQueueForTest task_queue("VidProc TQ"); - SetUpAndInitObjects( - &task_queue, static_cast(rate_profiles[0].target_kbps), - static_cast(rate_profiles[0].input_fps), visualization_params); + SetUpAndInitObjects(&task_queue, + static_cast(rate_profiles[0].target_kbps), + static_cast(rate_profiles[0].input_fps)); PrintSettings(&task_queue); ProcessAllFrames(&task_queue, rate_profiles); ReleaseAndCloseObjects(&task_queue); @@ -610,8 +609,7 @@ VideoCodecTestStats& VideoCodecTestFixtureImpl::GetStats() { void VideoCodecTestFixtureImpl::SetUpAndInitObjects( rtc::test::TaskQueueForTest* task_queue, int initial_bitrate_kbps, - int initial_framerate_fps, - const VisualizationParams* visualization_params) { + int initial_framerate_fps) { config_.codec_settings.minBitrate = 0; config_.codec_settings.startBitrate = initial_bitrate_kbps; config_.codec_settings.maxFramerate = initial_framerate_fps; @@ -622,34 +620,31 @@ void VideoCodecTestFixtureImpl::SetUpAndInitObjects( config_.codec_settings.height)); EXPECT_TRUE(source_frame_reader_->Init()); + RTC_DCHECK(encoded_frame_writers_.empty()); + RTC_DCHECK(decoded_frame_writers_.empty()); const size_t num_simulcast_or_spatial_layers = std::max( config_.NumberOfSimulcastStreams(), config_.NumberOfSpatialLayers()); + for (size_t simulcast_svc_idx = 0; + simulcast_svc_idx < num_simulcast_or_spatial_layers; + ++simulcast_svc_idx) { + const std::string output_filename_base = OutputPath() + + FilenameWithParams(config_) + "_" + + std::to_string(simulcast_svc_idx); - if (visualization_params) { - RTC_DCHECK(encoded_frame_writers_.empty()); - RTC_DCHECK(decoded_frame_writers_.empty()); - for (size_t simulcast_svc_idx = 0; - simulcast_svc_idx < num_simulcast_or_spatial_layers; - ++simulcast_svc_idx) { - const std::string output_filename_base = - OutputPath() + FilenameWithParams(config_) + "_" + - std::to_string(simulcast_svc_idx); + if (config_.visualization_params.save_encoded_ivf) { + rtc::File post_encode_file = + rtc::File::Create(output_filename_base + ".ivf"); + encoded_frame_writers_.push_back( + IvfFileWriter::Wrap(std::move(post_encode_file), 0)); + } - if (visualization_params->save_encoded_ivf) { - rtc::File post_encode_file = - rtc::File::Create(output_filename_base + ".ivf"); - encoded_frame_writers_.push_back( - IvfFileWriter::Wrap(std::move(post_encode_file), 0)); - } - - if (visualization_params->save_decoded_y4m) { - FrameWriter* decoded_frame_writer = new Y4mFrameWriterImpl( - output_filename_base + ".y4m", config_.codec_settings.width, - config_.codec_settings.height, initial_framerate_fps); - EXPECT_TRUE(decoded_frame_writer->Init()); - decoded_frame_writers_.push_back( - std::unique_ptr(decoded_frame_writer)); - } + if (config_.visualization_params.save_decoded_y4m) { + FrameWriter* decoded_frame_writer = new Y4mFrameWriterImpl( + output_filename_base + ".y4m", config_.codec_settings.width, + config_.codec_settings.height, initial_framerate_fps); + EXPECT_TRUE(decoded_frame_writer->Init()); + decoded_frame_writers_.push_back( + std::unique_ptr(decoded_frame_writer)); } } diff --git a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.h b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.h index 5861699e26..a54f6bd7b8 100644 --- a/modules/video_coding/codecs/test/videocodec_test_fixture_impl.h +++ b/modules/video_coding/codecs/test/videocodec_test_fixture_impl.h @@ -53,8 +53,7 @@ class VideoCodecTestFixtureImpl : public VideoCodecTestFixture { void RunTest(const std::vector& rate_profiles, const std::vector* rc_thresholds, const std::vector* quality_thresholds, - const BitstreamThresholds* bs_thresholds, - const VisualizationParams* visualization_params) override; + const BitstreamThresholds* bs_thresholds) override; VideoCodecTestStats& GetStats() override; @@ -65,8 +64,7 @@ class VideoCodecTestFixtureImpl : public VideoCodecTestFixture { void DestroyEncoderAndDecoder(); void SetUpAndInitObjects(rtc::test::TaskQueueForTest* task_queue, int initial_bitrate_kbps, - int initial_framerate_fps, - const VisualizationParams* visualization_params); + int initial_framerate_fps); void ReleaseAndCloseObjects(rtc::test::TaskQueueForTest* task_queue); void ProcessAllFrames(rtc::TaskQueue* task_queue, diff --git a/modules/video_coding/codecs/test/videocodec_test_libvpx.cc b/modules/video_coding/codecs/test/videocodec_test_libvpx.cc index f65b9e6f35..700b8635bc 100644 --- a/modules/video_coding/codecs/test/videocodec_test_libvpx.cc +++ b/modules/video_coding/codecs/test/videocodec_test_libvpx.cc @@ -104,8 +104,7 @@ TEST(VideoCodecTestLibvpx, HighBitrateVP9) { std::vector quality_thresholds = {{37, 36, 0.94, 0.92}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } TEST(VideoCodecTestLibvpx, ChangeBitrateVP9) { @@ -129,8 +128,7 @@ TEST(VideoCodecTestLibvpx, ChangeBitrateVP9) { std::vector quality_thresholds = { {34, 33, 0.90, 0.88}, {38, 35, 0.95, 0.91}, {35, 34, 0.93, 0.90}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } TEST(VideoCodecTestLibvpx, ChangeFramerateVP9) { @@ -156,8 +154,7 @@ TEST(VideoCodecTestLibvpx, ChangeFramerateVP9) { std::vector quality_thresholds = { {33, 32, 0.89, 0.87}, {33.5, 32, 0.90, 0.86}, {33.5, 31.5, 0.90, 0.85}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } TEST(VideoCodecTestLibvpx, DenoiserOnVP9) { @@ -176,8 +173,7 @@ TEST(VideoCodecTestLibvpx, DenoiserOnVP9) { std::vector quality_thresholds = {{37.5, 36, 0.94, 0.93}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } TEST(VideoCodecTestLibvpx, VeryLowBitrateVP9) { @@ -195,8 +191,7 @@ TEST(VideoCodecTestLibvpx, VeryLowBitrateVP9) { std::vector quality_thresholds = {{28, 25, 0.80, 0.65}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } // TODO(marpan): Add temporal layer test for VP9, once changes are in @@ -223,8 +218,7 @@ TEST(VideoCodecTestLibvpx, HighBitrateVP8) { // than quality of x86 version. Use lower thresholds for now. std::vector quality_thresholds = {{35, 33, 0.91, 0.89}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } // The tests below are currently disabled for Android. For ARM, the encoder @@ -267,8 +261,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_ChangeBitrateVP8) { std::vector quality_thresholds = { {31.8, 31, 0.86, 0.85}, {36, 34.8, 0.92, 0.90}, {33.5, 32, 0.90, 0.88}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } // TODO(webrtc:9267): Fails on iOS @@ -308,8 +301,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_ChangeFramerateVP8) { std::vector quality_thresholds = { {31, 30, 0.85, 0.84}, {31.5, 30.5, 0.86, 0.84}, {30.5, 29, 0.83, 0.78}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } #if defined(WEBRTC_ANDROID) @@ -343,8 +335,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_TemporalLayersVP8) { std::vector quality_thresholds = {{31, 30, 0.85, 0.84}, {31, 28, 0.85, 0.75}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } // TODO(webrtc:9267): Fails on iOS @@ -370,8 +361,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_MultiresVP8) { {5, 1, 5, 0.2, 0.3, 0.1, 0, 1}}; std::vector quality_thresholds = {{34, 32, 0.90, 0.88}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } #if defined(WEBRTC_ANDROID) @@ -397,8 +387,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_SimulcastVP8) { {20, 5, 90, 0.8, 0.5, 0.3, 0, 1}}; std::vector quality_thresholds = {{34, 32, 0.90, 0.88}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } #if defined(WEBRTC_ANDROID) @@ -423,8 +412,7 @@ TEST(VideoCodecTestLibvpx, MAYBE_SvcVP9) { {5, 1, 5, 0.2, 0.3, 0.1, 0, 1}}; std::vector quality_thresholds = {{36, 34, 0.93, 0.91}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } TEST(VideoCodecTestLibvpx, DISABLED_MultiresVP8RdPerf) { @@ -444,7 +432,7 @@ TEST(VideoCodecTestLibvpx, DISABLED_MultiresVP8RdPerf) { std::vector rate_profiles = { {bitrate_kbps, 30, config.num_frames}}; - fixture->RunTest(rate_profiles, nullptr, nullptr, nullptr, nullptr); + fixture->RunTest(rate_profiles, nullptr, nullptr, nullptr); rd_stats[bitrate_kbps] = fixture->GetStats().SliceAndCalcLayerVideoStatistic( @@ -471,7 +459,7 @@ TEST(VideoCodecTestLibvpx, DISABLED_SvcVP9RdPerf) { std::vector rate_profiles = { {bitrate_kbps, 30, config.num_frames}}; - fixture->RunTest(rate_profiles, nullptr, nullptr, nullptr, nullptr); + fixture->RunTest(rate_profiles, nullptr, nullptr, nullptr); rd_stats[bitrate_kbps] = fixture->GetStats().SliceAndCalcLayerVideoStatistic( diff --git a/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc b/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc index 1529fb006d..fc49c92b7b 100644 --- a/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc +++ b/modules/video_coding/codecs/test/videocodec_test_mediacodec.cc @@ -65,8 +65,7 @@ TEST(VideoCodecTestMediaCodec, ForemanCif500kbpsVp8) { std::vector quality_thresholds = {{36, 31, 0.92, 0.86}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } TEST(VideoCodecTestMediaCodec, ForemanCif500kbpsH264CBP) { @@ -89,8 +88,7 @@ TEST(VideoCodecTestMediaCodec, ForemanCif500kbpsH264CBP) { std::vector quality_thresholds = {{36, 31, 0.92, 0.86}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } // TODO(brandtr): Enable this test when we have trybots/buildbots with @@ -117,8 +115,7 @@ TEST(VideoCodecTestMediaCodec, DISABLED_ForemanCif500kbpsH264CHP) { std::vector quality_thresholds = {{37, 35, 0.93, 0.91}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } TEST(VideoCodecTestMediaCodec, ForemanMixedRes100kbpsVp8H264) { @@ -146,8 +143,7 @@ TEST(VideoCodecTestMediaCodec, ForemanMixedRes100kbpsVp8H264) { auto fixture = CreateTestFixtureWithConfig(config); fixture->RunTest(rate_profiles, nullptr /* rc_thresholds */, - &quality_thresholds, nullptr /* bs_thresholds */, - nullptr /* visualization_params */); + &quality_thresholds, nullptr /* bs_thresholds */); } } } diff --git a/modules/video_coding/codecs/test/videocodec_test_openh264.cc b/modules/video_coding/codecs/test/videocodec_test_openh264.cc index 3a0561a6a3..c8a6ba209c 100644 --- a/modules/video_coding/codecs/test/videocodec_test_openh264.cc +++ b/modules/video_coding/codecs/test/videocodec_test_openh264.cc @@ -54,8 +54,7 @@ TEST(VideoCodecTestOpenH264, ConstantHighBitrate) { std::vector quality_thresholds = {{37, 35, 0.93, 0.91}}; - fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, nullptr); } // H264: Enable SingleNalUnit packetization mode. Encoder should split @@ -82,7 +81,7 @@ TEST(VideoCodecTestOpenH264, SingleNalUnit) { BitstreamThresholds bs_thresholds = {config.max_payload_size_bytes}; fixture->RunTest(rate_profiles, &rc_thresholds, &quality_thresholds, - &bs_thresholds, nullptr); + &bs_thresholds); } } // namespace test diff --git a/modules/video_coding/codecs/test/videocodec_test_parameterized.cc b/modules/video_coding/codecs/test/videocodec_test_parameterized.cc index a9118c5eca..0d49b80d95 100644 --- a/modules/video_coding/codecs/test/videocodec_test_parameterized.cc +++ b/modules/video_coding/codecs/test/videocodec_test_parameterized.cc @@ -32,10 +32,6 @@ const bool kFrameDropperOn = false; // Test settings. const bool kUseSingleCore = false; const bool kMeasureCpu = false; -const VisualizationParams kVisualizationParams = { - false, // save_encoded_ivf - false, // save_decoded_y4m -}; const int kNumFrames = 30; } // namespace @@ -79,8 +75,7 @@ class VideoCodecTestParameterized {bitrate_, framerate, kNumFrames}}; fixture_ = CreateVideoCodecTestFixture(config); - fixture_->RunTest(rate_profiles, nullptr, nullptr, nullptr, - &kVisualizationParams); + fixture_->RunTest(rate_profiles, nullptr, nullptr, nullptr); } std::unique_ptr fixture_; const size_t bitrate_; diff --git a/modules/video_coding/codecs/test/videocodec_test_videotoolbox.cc b/modules/video_coding/codecs/test/videocodec_test_videotoolbox.cc index 787162fc8c..c91f3401f8 100644 --- a/modules/video_coding/codecs/test/videocodec_test_videotoolbox.cc +++ b/modules/video_coding/codecs/test/videocodec_test_videotoolbox.cc @@ -65,8 +65,7 @@ MAYBE_TEST(VideoCodecTestVideoToolbox, ForemanCif500kbpsH264CBP) { std::vector quality_thresholds = {{33, 29, 0.9, 0.82}}; - fixture->RunTest(rate_profiles, nullptr, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, nullptr, &quality_thresholds, nullptr); } MAYBE_TEST(VideoCodecTestVideoToolbox, ForemanCif500kbpsH264CHP) { @@ -83,8 +82,7 @@ MAYBE_TEST(VideoCodecTestVideoToolbox, ForemanCif500kbpsH264CHP) { std::vector quality_thresholds = {{33, 30, 0.91, 0.83}}; - fixture->RunTest(rate_profiles, nullptr, &quality_thresholds, nullptr, - nullptr); + fixture->RunTest(rate_profiles, nullptr, &quality_thresholds, nullptr); } } // namespace test