From dbdf36c437d80dbc3824252b727c13ada91ddaf3 Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Wed, 8 May 2024 08:38:30 +0000 Subject: [PATCH] Add key_interval command line argument to codec test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:42225151, b/337757868 Change-Id: I5b085bdb334cb6cfb304424a466fc119196d14d4 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/350200 Reviewed-by: Sergey Silkin Reviewed-by: Åsa Persson Reviewed-by: Mirko Bonadei Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/main@{#42267} --- .../codecs/test/video_codec_test.cc | 28 +++++++++++++------ test/video_codec_tester.cc | 5 +++- test/video_codec_tester.h | 1 + 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/modules/video_coding/codecs/test/video_codec_test.cc b/modules/video_coding/codecs/test/video_codec_test.cc index 67522b6434..e7a7f7504c 100644 --- a/modules/video_coding/codecs/test/video_codec_test.cc +++ b/modules/video_coding/codecs/test/video_codec_test.cc @@ -66,6 +66,10 @@ ABSL_FLAG(absl::optional, "Encode target frame rate of the top temporal layer in fps."); ABSL_FLAG(bool, screencast, false, "Enable screen encoding mode."); ABSL_FLAG(bool, frame_drop, true, "Enable frame dropping."); +ABSL_FLAG(int, + key_interval, + std::numeric_limits::max(), + "Keyframe interval in frames."); ABSL_FLAG(int, num_frames, 300, "Number of frames to encode and/or decode."); ABSL_FLAG(std::string, field_trials, "", "Field trials to apply."); ABSL_FLAG(std::string, test_name, "", "Test name."); @@ -562,21 +566,27 @@ TEST(VideoCodecTest, DISABLED_EncodeDecode) { return DataRate::KilobitsPerSec(std::stoi(str)); }); + Frequency framerate = Frequency::Hertz( + absl::GetFlag(FLAGS_framerate_fps) + .value_or(absl::GetFlag(FLAGS_input_framerate_fps))); + EncodingSettings encoding_settings = VideoCodecTester::CreateEncodingSettings( CodecNameToCodecType(absl::GetFlag(FLAGS_encoder)), absl::GetFlag(FLAGS_scalability_mode), absl::GetFlag(FLAGS_width).value_or(absl::GetFlag(FLAGS_input_width)), absl::GetFlag(FLAGS_height).value_or(absl::GetFlag(FLAGS_input_height)), - {bitrate}, - Frequency::Hertz( - absl::GetFlag(FLAGS_framerate_fps) - .value_or(absl::GetFlag(FLAGS_input_framerate_fps))), - absl::GetFlag(FLAGS_screencast), absl::GetFlag(FLAGS_frame_drop)); + {bitrate}, framerate, absl::GetFlag(FLAGS_screencast), + absl::GetFlag(FLAGS_frame_drop)); - std::map frame_settings = - VideoCodecTester::CreateFrameSettings(encoding_settings, - absl::GetFlag(FLAGS_num_frames), - /*timestamp_rtp=*/90000); + int num_frames = absl::GetFlag(FLAGS_num_frames); + int key_interval = absl::GetFlag(FLAGS_key_interval); + uint32_t timestamp_rtp = 90000; + std::map frame_settings; + for (int frame_num = 0; frame_num < num_frames; ++frame_num) { + encoding_settings.keyframe = (frame_num % (key_interval + 1) == 0); + frame_settings.emplace(timestamp_rtp, encoding_settings); + timestamp_rtp += k90kHz / framerate; + } // TODO(webrtc:14852): Pass encoder and decoder names directly, and update // logged test name (implies lossing history in the chromeperf dashboard). diff --git a/test/video_codec_tester.cc b/test/video_codec_tester.cc index 78ed83c51b..4c9fc40c62 100644 --- a/test/video_codec_tester.cc +++ b/test/video_codec_tester.cc @@ -953,7 +953,10 @@ class Encoder : public EncodedImageCallback { } last_encoding_settings_ = encoding_settings; - int error = encoder_->Encode(input_frame, /*frame_types=*/nullptr); + std::vector frame_types = { + encoding_settings.keyframe ? VideoFrameType::kVideoFrameKey + : VideoFrameType::kVideoFrameDelta}; + int error = encoder_->Encode(input_frame, &frame_types); if (error != 0) { RTC_LOG(LS_WARNING) << "Encode failed with error code " << error diff --git a/test/video_codec_tester.h b/test/video_codec_tester.h index b4c14a8e1e..7032cc8520 100644 --- a/test/video_codec_tester.h +++ b/test/video_codec_tester.h @@ -53,6 +53,7 @@ class VideoCodecTester { ScalabilityMode scalability_mode = ScalabilityMode::kL1T1; VideoCodecMode content_type = VideoCodecMode::kRealtimeVideo; bool frame_drop = true; + bool keyframe = false; struct LayerSettings { Resolution resolution;