diff --git a/api/test/videocodec_test_stats.cc b/api/test/videocodec_test_stats.cc index df4591996a..91af574497 100644 --- a/api/test/videocodec_test_stats.cc +++ b/api/test/videocodec_test_stats.cc @@ -15,6 +15,13 @@ namespace webrtc { namespace test { +VideoCodecTestStats::FrameStatistics::FrameStatistics(size_t frame_number, + size_t rtp_timestamp, + size_t spatial_idx) + : frame_number(frame_number), + rtp_timestamp(rtp_timestamp), + spatial_idx(spatial_idx) {} + std::string VideoCodecTestStats::FrameStatistics::ToString() const { rtc::StringBuilder ss; ss << "frame_number " << frame_number; @@ -39,10 +46,6 @@ std::string VideoCodecTestStats::FrameStatistics::ToString() const { return ss.Release(); } -VideoCodecTestStats::VideoStatistics::VideoStatistics() = default; -VideoCodecTestStats::VideoStatistics::VideoStatistics(const VideoStatistics&) = - default; - std::string VideoCodecTestStats::VideoStatistics::ToString( std::string prefix) const { rtc::StringBuilder ss; @@ -86,15 +89,5 @@ std::string VideoCodecTestStats::VideoStatistics::ToString( return ss.Release(); } -VideoCodecTestStats::FrameStatistics::FrameStatistics(size_t frame_number, - size_t rtp_timestamp, - size_t spatial_idx) - : frame_number(frame_number), - rtp_timestamp(rtp_timestamp), - spatial_idx(spatial_idx) {} - -VideoCodecTestStats::FrameStatistics::FrameStatistics( - const FrameStatistics& rhs) = default; - } // namespace test } // namespace webrtc diff --git a/api/test/videocodec_test_stats.h b/api/test/videocodec_test_stats.h index 85384ef264..620f7640f9 100644 --- a/api/test/videocodec_test_stats.h +++ b/api/test/videocodec_test_stats.h @@ -29,7 +29,6 @@ class VideoCodecTestStats { FrameStatistics(size_t frame_number, size_t rtp_timestamp, size_t spatial_idx); - FrameStatistics(const FrameStatistics& rhs); std::string ToString() const; @@ -74,9 +73,6 @@ class VideoCodecTestStats { }; struct VideoStatistics { - VideoStatistics(); - VideoStatistics(const VideoStatistics&); - std::string ToString(std::string prefix) const; size_t target_bitrate_kbps = 0; @@ -122,28 +118,11 @@ class VideoCodecTestStats { virtual ~VideoCodecTestStats() = default; - // Creates a FrameStatistics for the next frame to be processed. - virtual void AddFrame(const FrameStatistics& frame_stat) = 0; - - // Returns the FrameStatistics corresponding to |frame_number| or |timestamp|. - virtual FrameStatistics* GetFrame(size_t frame_number, - size_t spatial_idx) = 0; - virtual FrameStatistics* GetFrameWithTimestamp(size_t timestamp, - size_t spatial_idx) = 0; + virtual std::vector GetFrameStatistics() = 0; virtual std::vector SliceAndCalcLayerVideoStatistic( size_t first_frame_num, size_t last_frame_num) = 0; - - virtual VideoStatistics SliceAndCalcAggregatedVideoStatistic( - size_t first_frame_num, - size_t last_frame_num) = 0; - - virtual void PrintFrameStatistics() = 0; - - virtual size_t Size(size_t spatial_idx) = 0; - - virtual void Clear() = 0; }; } // namespace test diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn index dfe183b459..ad09396013 100644 --- a/modules/video_coding/BUILD.gn +++ b/modules/video_coding/BUILD.gn @@ -568,6 +568,7 @@ if (rtc_include_tests) { ":video_codec_interface", ":video_coding", ":video_coding_utility", + ":videocodec_test_stats_impl", ":webrtc_vp9_helpers", "..:module_api", "../..:webrtc_common", @@ -638,14 +639,13 @@ if (rtc_include_tests) { sources = [ "codecs/test/videocodec_test_fixture_impl.cc", "codecs/test/videocodec_test_fixture_impl.h", - "codecs/test/videocodec_test_stats_impl.cc", - "codecs/test/videocodec_test_stats_impl.h", ] deps = [ ":codec_globals_headers", ":video_codec_interface", ":video_codecs_test_framework", ":video_coding_utility", + ":videocodec_test_stats_impl", ":webrtc_vp9_helpers", "../..:webrtc_common", "../../api:array_view", @@ -667,16 +667,28 @@ if (rtc_include_tests) { "../../system_wrappers", "../../test:fileutils", "../../test:perf_test", - "../../test:test_common", "../../test:test_support", "../../test:video_test_common", "../../test:video_test_support", - "../rtp_rtcp:rtp_rtcp_format", "//third_party/abseil-cpp/absl/memory", "//third_party/abseil-cpp/absl/types:optional", ] } + rtc_source_set("videocodec_test_stats_impl") { + testonly = true + sources = [ + "codecs/test/videocodec_test_stats_impl.cc", + "codecs/test/videocodec_test_stats_impl.h", + ] + deps = [ + "../../api:videocodec_test_fixture_api", + "../../rtc_base:checks", + "../../test:test_common", + "../rtp_rtcp:rtp_rtcp_format", + ] + } + rtc_source_set("video_coding_modules_tests") { testonly = true defines = [] @@ -816,6 +828,7 @@ if (rtc_include_tests) { ":video_coding", ":video_coding_utility", ":videocodec_test_impl", + ":videocodec_test_stats_impl", ":webrtc_h264", ":webrtc_vp8", ":webrtc_vp8_temporal_layers", diff --git a/modules/video_coding/codecs/test/videocodec_test_stats_impl.cc b/modules/video_coding/codecs/test/videocodec_test_stats_impl.cc index 4a7f97800f..1e9db7ff9a 100644 --- a/modules/video_coding/codecs/test/videocodec_test_stats_impl.cc +++ b/modules/video_coding/codecs/test/videocodec_test_stats_impl.cc @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -56,6 +57,22 @@ FrameStatistics* VideoCodecTestStatsImpl::GetFrameWithTimestamp( return GetFrame(rtp_timestamp_to_frame_num_[layer_idx][timestamp], layer_idx); } +std::vector VideoCodecTestStatsImpl::GetFrameStatistics() { + size_t capacity = 0; + for (const auto& layer_stat : layer_stats_) { + capacity += layer_stat.second.size(); + } + + std::vector frame_statistics; + frame_statistics.reserve(capacity); + for (const auto& layer_stat : layer_stats_) { + std::copy(layer_stat.second.cbegin(), layer_stat.second.cend(), + std::back_inserter(frame_statistics)); + } + + return frame_statistics; +} + std::vector VideoCodecTestStatsImpl::SliceAndCalcLayerVideoStatistic( size_t first_frame_num, diff --git a/modules/video_coding/codecs/test/videocodec_test_stats_impl.h b/modules/video_coding/codecs/test/videocodec_test_stats_impl.h index 905db5c7ea..aee55cbbea 100644 --- a/modules/video_coding/codecs/test/videocodec_test_stats_impl.h +++ b/modules/video_coding/codecs/test/videocodec_test_stats_impl.h @@ -27,26 +27,26 @@ class VideoCodecTestStatsImpl : public VideoCodecTestStats { ~VideoCodecTestStatsImpl() override; // Creates a FrameStatistics for the next frame to be processed. - void AddFrame(const FrameStatistics& frame_stat) override; + void AddFrame(const FrameStatistics& frame_stat); // Returns the FrameStatistics corresponding to |frame_number| or |timestamp|. - FrameStatistics* GetFrame(size_t frame_number, size_t spatial_idx) override; - FrameStatistics* GetFrameWithTimestamp(size_t timestamp, - size_t spatial_idx) override; + FrameStatistics* GetFrame(size_t frame_number, size_t spatial_idx); + FrameStatistics* GetFrameWithTimestamp(size_t timestamp, size_t spatial_idx); + // Implements VideoCodecTestStats. + std::vector GetFrameStatistics() override; std::vector SliceAndCalcLayerVideoStatistic( size_t first_frame_num, size_t last_frame_num) override; - VideoStatistics SliceAndCalcAggregatedVideoStatistic( - size_t first_frame_num, - size_t last_frame_num) override; + VideoStatistics SliceAndCalcAggregatedVideoStatistic(size_t first_frame_num, + size_t last_frame_num); - void PrintFrameStatistics() override; + void PrintFrameStatistics(); - size_t Size(size_t spatial_idx) override; + size_t Size(size_t spatial_idx); - void Clear() override; + void Clear(); private: VideoCodecTestStats::FrameStatistics AggregateFrameStatistic( diff --git a/modules/video_coding/codecs/test/videocodec_test_stats_impl_unittest.cc b/modules/video_coding/codecs/test/videocodec_test_stats_impl_unittest.cc index 077a858aef..6477b6ab8c 100644 --- a/modules/video_coding/codecs/test/videocodec_test_stats_impl_unittest.cc +++ b/modules/video_coding/codecs/test/videocodec_test_stats_impl_unittest.cc @@ -10,13 +10,24 @@ #include "modules/video_coding/codecs/test/videocodec_test_stats_impl.h" +#include + +#include "test/gmock.h" #include "test/gtest.h" namespace webrtc { namespace test { + using FrameStatistics = VideoCodecTestStatsImpl::FrameStatistics; + namespace { + const size_t kTimestamp = 12345; + +using ::testing::AllOf; +using ::testing::Contains; +using ::testing::Field; + } // namespace TEST(StatsTest, AddAndGetFrame) { @@ -55,5 +66,25 @@ TEST(StatsTest, AddFrameLayering) { } } +TEST(StatsTest, GetFrameStatistics) { + VideoCodecTestStatsImpl stats; + + stats.AddFrame(FrameStatistics(0, kTimestamp, 0)); + stats.AddFrame(FrameStatistics(0, kTimestamp, 1)); + stats.AddFrame(FrameStatistics(1, kTimestamp + 3000, 0)); + stats.AddFrame(FrameStatistics(1, kTimestamp + 3000, 1)); + + const std::vector frame_stats = stats.GetFrameStatistics(); + + auto field_matcher = [](size_t frame_number, size_t spatial_idx) { + return AllOf(Field(&FrameStatistics::frame_number, frame_number), + Field(&FrameStatistics::spatial_idx, spatial_idx)); + }; + EXPECT_THAT(frame_stats, Contains(field_matcher(0, 0))); + EXPECT_THAT(frame_stats, Contains(field_matcher(0, 1))); + EXPECT_THAT(frame_stats, Contains(field_matcher(1, 0))); + EXPECT_THAT(frame_stats, Contains(field_matcher(1, 1))); +} + } // namespace test } // namespace webrtc diff --git a/modules/video_coding/codecs/test/videoprocessor.cc b/modules/video_coding/codecs/test/videoprocessor.cc index 3e10c5d027..c228869e09 100644 --- a/modules/video_coding/codecs/test/videoprocessor.cc +++ b/modules/video_coding/codecs/test/videoprocessor.cc @@ -164,7 +164,7 @@ VideoProcessor::VideoProcessor(webrtc::VideoEncoder* encoder, VideoDecoderList* decoders, FrameReader* input_frame_reader, const VideoCodecTestFixture::Config& config, - VideoCodecTestStats* stats, + VideoCodecTestStatsImpl* stats, IvfFileWriterMap* encoded_frame_writers, FrameWriterList* decoded_frame_writers) : config_(config), diff --git a/modules/video_coding/codecs/test/videoprocessor.h b/modules/video_coding/codecs/test/videoprocessor.h index aab636f343..48f11f86b1 100644 --- a/modules/video_coding/codecs/test/videoprocessor.h +++ b/modules/video_coding/codecs/test/videoprocessor.h @@ -23,7 +23,6 @@ #include "api/task_queue/queued_task.h" #include "api/task_queue/task_queue_base.h" #include "api/test/videocodec_test_fixture.h" -#include "api/test/videocodec_test_stats.h" #include "api/video/encoded_image.h" #include "api/video/video_bitrate_allocation.h" #include "api/video/video_bitrate_allocator.h" @@ -32,6 +31,7 @@ #include "api/video_codecs/video_encoder.h" #include "common_types.h" // NOLINT(build/include) #include "modules/include/module_common_types.h" +#include "modules/video_coding/codecs/test/videocodec_test_stats_impl.h" #include "modules/video_coding/include/video_codec_interface.h" #include "modules/video_coding/utility/ivf_file_writer.h" #include "rtc_base/buffer.h" @@ -64,7 +64,7 @@ class VideoProcessor { VideoDecoderList* decoders, FrameReader* input_frame_reader, const VideoCodecTestFixture::Config& config, - VideoCodecTestStats* stats, + VideoCodecTestStatsImpl* stats, IvfFileWriterMap* encoded_frame_writers, FrameWriterList* decoded_frame_writers); ~VideoProcessor(); @@ -187,7 +187,7 @@ class VideoProcessor { // Test input/output. VideoCodecTestFixture::Config config_ RTC_GUARDED_BY(sequence_checker_); const size_t num_simulcast_or_spatial_layers_; - VideoCodecTestStats* const stats_; + VideoCodecTestStatsImpl* const stats_; // Codecs. webrtc::VideoEncoder* const encoder_;