From bbbae4253d6b72cd2d289e8692f756b29ac07400 Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Thu, 5 Sep 2019 16:06:50 +0200 Subject: [PATCH] Refactor video analyzer injection helper Separate renderer part into steps and make it easier to add more steps as separate interceptors. Bug: webrtc:10138 Change-Id: I667fc85d0da4fb59090e69caa4c32bd4afc3bd05 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/151645 Commit-Queue: Artem Titov Reviewed-by: Ilya Nikolaevskiy Reviewed-by: Mirko Bonadei Cr-Commit-Position: refs/heads/master@{#29082} --- ...video_quality_analyzer_injection_helper.cc | 78 ++++++++++++++----- 1 file changed, 58 insertions(+), 20 deletions(-) diff --git a/test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.cc b/test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.cc index f56ea4f547..d0c990545b 100644 --- a/test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.cc +++ b/test/pc/e2e/analyzer/video/video_quality_analyzer_injection_helper.cc @@ -22,29 +22,63 @@ namespace webrtc_pc_e2e { namespace { +class VideoFrameInterceptor { + public: + virtual ~VideoFrameInterceptor() = default; + + // Performs desired actions with video frame. It may change video frame. + virtual void OnVideoFrame(VideoFrame* frame) = 0; +}; + +class VideoAnalyzerCapturingInterceptor : public VideoFrameInterceptor { + public: + VideoAnalyzerCapturingInterceptor(std::string stream_label, + VideoQualityAnalyzerInterface* analyzer) + : stream_label_(std::move(stream_label)), analyzer_(analyzer) { + RTC_DCHECK(analyzer_); + } + ~VideoAnalyzerCapturingInterceptor() override = default; + + void OnVideoFrame(VideoFrame* frame) override { + uint16_t frame_id = analyzer_->OnFrameCaptured(stream_label_, *frame); + frame->set_id(frame_id); + } + + private: + const std::string stream_label_; + VideoQualityAnalyzerInterface* analyzer_; +}; + +class VideoWriterInterceptor : public VideoFrameInterceptor { + public: + VideoWriterInterceptor(test::VideoFrameWriter* video_writer) + : video_writer_(video_writer) {} + ~VideoWriterInterceptor() override = default; + + void OnVideoFrame(VideoFrame* frame) override { + bool result = video_writer_->WriteFrame(*frame); + RTC_CHECK(result) << "Failed to write frame"; + } + + private: + test::VideoFrameWriter* video_writer_; +}; + // Intercepts generated frames and passes them also to video quality analyzer // and into video frame writer, if the last one is provided. class InterceptingFrameGenerator : public test::FrameGenerator { public: - InterceptingFrameGenerator(std::string stream_label, - std::unique_ptr delegate, - VideoQualityAnalyzerInterface* analyzer, - test::VideoFrameWriter* video_writer) - : stream_label_(std::move(stream_label)), - delegate_(std::move(delegate)), - analyzer_(analyzer), - video_writer_(video_writer) { - RTC_DCHECK(analyzer_); - } + InterceptingFrameGenerator( + std::unique_ptr delegate, + std::vector> interceptors) + : delegate_(std::move(delegate)), + interceptors_(std::move(interceptors)) {} ~InterceptingFrameGenerator() override = default; VideoFrame* NextFrame() override { VideoFrame* frame = delegate_->NextFrame(); - uint16_t frame_id = analyzer_->OnFrameCaptured(stream_label_, *frame); - frame->set_id(frame_id); - if (video_writer_) { - bool result = video_writer_->WriteFrame(*frame); - RTC_CHECK(result) << "Failed to write frame"; + for (auto& interceptor : interceptors_) { + interceptor->OnVideoFrame(frame); } return frame; } @@ -54,10 +88,8 @@ class InterceptingFrameGenerator : public test::FrameGenerator { } private: - std::string stream_label_; std::unique_ptr delegate_; - VideoQualityAnalyzerInterface* analyzer_; - test::VideoFrameWriter* video_writer_; + std::vector> interceptors_; }; // Implements the video sink, that forwards rendered frames to the video quality @@ -130,8 +162,14 @@ VideoQualityAnalyzerInjectionHelper::WrapFrameGenerator( std::string stream_label, std::unique_ptr delegate, test::VideoFrameWriter* writer) const { - return absl::make_unique( - std::move(stream_label), std::move(delegate), analyzer_.get(), writer); + std::vector> interceptors; + interceptors.push_back(absl::make_unique( + std::move(stream_label), analyzer_.get())); + if (writer) { + interceptors.push_back(absl::make_unique(writer)); + } + return absl::make_unique(std::move(delegate), + std::move(interceptors)); } std::unique_ptr>