Index: webrtc/video/video_quality_test.cc |
diff --git a/webrtc/video/video_quality_test.cc b/webrtc/video/video_quality_test.cc |
index c606c86c1800c74f1fd1f89da2366c73c10ed94c..aa1c9b17289df15cd9d698ea130bc494fdd20289 100644 |
--- a/webrtc/video/video_quality_test.cc |
+++ b/webrtc/video/video_quality_test.cc |
@@ -7,9 +7,8 @@ |
* in the file PATENTS. All contributing project authors may |
* be found in the AUTHORS file in the root of the source tree. |
*/ |
-#include "webrtc/video/video_quality_test.h" |
- |
#include <stdio.h> |
+ |
#include <algorithm> |
#include <deque> |
#include <map> |
@@ -18,6 +17,7 @@ |
#include <vector> |
#include "testing/gtest/include/gtest/gtest.h" |
+ |
#include "webrtc/base/checks.h" |
#include "webrtc/base/event.h" |
#include "webrtc/base/format_macros.h" |
@@ -32,8 +32,8 @@ |
#include "webrtc/test/run_loop.h" |
#include "webrtc/test/statistics.h" |
#include "webrtc/test/testsupport/fileutils.h" |
-#include "webrtc/test/vcm_capturer.h" |
#include "webrtc/test/video_renderer.h" |
+#include "webrtc/video/video_quality_test.h" |
#include "webrtc/voice_engine/include/voe_base.h" |
#include "webrtc/voice_engine/include/voe_codec.h" |
@@ -99,6 +99,7 @@ |
class VideoAnalyzer : public PacketReceiver, |
public Transport, |
public rtc::VideoSinkInterface<VideoFrame>, |
+ public VideoCaptureInput, |
public EncodedFrameObserver { |
public: |
VideoAnalyzer(test::LayerFilteringTransport* transport, |
@@ -109,10 +110,10 @@ |
FILE* graph_data_output_file, |
const std::string& graph_title, |
uint32_t ssrc_to_analyze) |
- : transport_(transport), |
+ : input_(nullptr), |
+ transport_(transport), |
receiver_(nullptr), |
send_stream_(nullptr), |
- captured_frame_forwarder_(this), |
test_label_(test_label), |
graph_data_output_file_(graph_data_output_file), |
graph_title_(graph_title), |
@@ -168,19 +169,6 @@ |
virtual void SetReceiver(PacketReceiver* receiver) { receiver_ = receiver; } |
- void SetSendStream(VideoSendStream* stream) { |
- rtc::CritScope lock(&crit_); |
- RTC_DCHECK(!send_stream_); |
- send_stream_ = stream; |
- } |
- |
- rtc::VideoSinkInterface<VideoFrame>* InputInterface() { |
- return &captured_frame_forwarder_; |
- } |
- rtc::VideoSourceInterface<VideoFrame>* OutputInterface() { |
- return &captured_frame_forwarder_; |
- } |
- |
DeliveryStatus DeliverPacket(MediaType media_type, |
const uint8_t* packet, |
size_t length, |
@@ -208,6 +196,17 @@ |
void MeasuredEncodeTiming(int64_t ntp_time_ms, int encode_time_ms) { |
rtc::CritScope crit(&comparison_lock_); |
samples_encode_time_ms_[ntp_time_ms] = encode_time_ms; |
+ } |
+ |
+ void IncomingCapturedFrame(const VideoFrame& video_frame) override { |
+ VideoFrame copy = video_frame; |
+ copy.set_timestamp(copy.ntp_time_ms() * 90); |
+ { |
+ rtc::CritScope lock(&crit_); |
+ frames_.push_back(copy); |
+ } |
+ |
+ input_->IncomingCapturedFrame(video_frame); |
} |
void PreEncodeOnFrame(const VideoFrame& video_frame) { |
@@ -347,8 +346,10 @@ |
} |
EncodedFrameObserver* encode_timing_proxy() { return &encode_timing_proxy_; } |
+ VideoCaptureInput* input_; |
test::LayerFilteringTransport* const transport_; |
PacketReceiver* receiver_; |
+ VideoSendStream* send_stream_; |
private: |
struct FrameComparison { |
@@ -696,55 +697,6 @@ |
} |
} |
- // Implements VideoSinkInterface to receive captured frames from a |
- // FrameGeneratorCapturer. Implements VideoSourceInterface to be able to act |
- // as a source to VideoSendStream. |
- // It forwards all input frames to the VideoAnalyzer for later comparison and |
- // forwards the captured frames to the VideoSendStream. |
- class CapturedFrameForwarder : public rtc::VideoSinkInterface<VideoFrame>, |
- public rtc::VideoSourceInterface<VideoFrame> { |
- public: |
- explicit CapturedFrameForwarder(VideoAnalyzer* analyzer) |
- : analyzer_(analyzer), send_stream_input_(nullptr) {} |
- |
- private: |
- void OnFrame(const VideoFrame& video_frame) override { |
- VideoFrame copy = video_frame; |
- copy.set_timestamp(copy.ntp_time_ms() * 90); |
- |
- analyzer_->AddCapturedFrameForComparison(video_frame); |
- rtc::CritScope lock(&crit_); |
- if (send_stream_input_) |
- send_stream_input_->OnFrame(video_frame); |
- } |
- |
- // Called when |send_stream_.SetSource()| is called. |
- void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink, |
- const rtc::VideoSinkWants& wants) override { |
- rtc::CritScope lock(&crit_); |
- RTC_DCHECK(!send_stream_input_ || send_stream_input_ == sink); |
- send_stream_input_ = sink; |
- } |
- |
- // Called by |send_stream_| when |send_stream_.SetSource()| is called. |
- void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override { |
- rtc::CritScope lock(&crit_); |
- RTC_DCHECK(sink == send_stream_input_); |
- send_stream_input_ = nullptr; |
- } |
- |
- VideoAnalyzer* const analyzer_; |
- rtc::CriticalSection crit_; |
- rtc::VideoSinkInterface<VideoFrame>* send_stream_input_ GUARDED_BY(crit_); |
- }; |
- |
- void AddCapturedFrameForComparison(const VideoFrame& video_frame) { |
- rtc::CritScope lock(&crit_); |
- frames_.push_back(video_frame); |
- } |
- |
- VideoSendStream* send_stream_; |
- CapturedFrameForwarder captured_frame_forwarder_; |
const std::string test_label_; |
FILE* const graph_data_output_file_; |
const std::string graph_title_; |
@@ -1076,20 +1028,21 @@ |
} |
} |
-void VideoQualityTest::CreateCapturer() { |
+void VideoQualityTest::CreateCapturer(VideoCaptureInput* input) { |
if (params_.screenshare.enabled) { |
test::FrameGeneratorCapturer* frame_generator_capturer = |
- new test::FrameGeneratorCapturer(clock_, frame_generator_.release(), |
- params_.common.fps); |
+ new test::FrameGeneratorCapturer( |
+ clock_, input, frame_generator_.release(), params_.common.fps); |
EXPECT_TRUE(frame_generator_capturer->Init()); |
capturer_.reset(frame_generator_capturer); |
} else { |
if (params_.video.clip_name.empty()) { |
- capturer_.reset(test::VcmCapturer::Create( |
- params_.common.width, params_.common.height, params_.common.fps)); |
+ capturer_.reset(test::VideoCapturer::Create(input, params_.common.width, |
+ params_.common.height, |
+ params_.common.fps, clock_)); |
} else { |
capturer_.reset(test::FrameGeneratorCapturer::CreateFromYuvFile( |
- test::ResourcePath(params_.video.clip_name, "yuv"), |
+ input, test::ResourcePath(params_.video.clip_name, "yuv"), |
params_.common.width, params_.common.height, params_.common.fps, |
clock_)); |
ASSERT_TRUE(capturer_) << "Could not create capturer for " |
@@ -1174,12 +1127,10 @@ |
SetupScreenshare(); |
CreateVideoStreams(); |
- analyzer.SetSendStream(video_send_stream_); |
- video_send_stream_->SetSource(analyzer.OutputInterface()); |
- |
- CreateCapturer(); |
- rtc::VideoSinkWants wants; |
- capturer_->AddOrUpdateSink(analyzer.InputInterface(), wants); |
+ analyzer.input_ = video_send_stream_->Input(); |
+ analyzer.send_stream_ = video_send_stream_; |
+ |
+ CreateCapturer(&analyzer); |
video_send_stream_->Start(); |
for (VideoReceiveStream* receive_stream : video_receive_streams_) |
@@ -1271,8 +1222,7 @@ |
video_send_config_.Copy(), video_encoder_config_.Copy()); |
VideoReceiveStream* video_receive_stream = |
call->CreateVideoReceiveStream(video_receive_configs_[stream_id].Copy()); |
- CreateCapturer(); |
- video_send_stream_->SetSource(capturer_.get()); |
+ CreateCapturer(video_send_stream_->Input()); |
AudioReceiveStream* audio_receive_stream = nullptr; |
if (params_.audio) { |