Reland "Replace VideoDecoder with VideoDecoderFactory in VideoReceiveStream config."
This is a reland of 529d0d9795b81dbed5e4231f15d3752a5fc0df32
Original change's description:
> Replace VideoDecoder with VideoDecoderFactory in VideoReceiveStream config.
>
> Preparation for deleting EnableFrameRecordning, and also a step
> towards landing of the new VideoStreamDecoder.
>
> Bug: webrtc:9106
> Change-Id: I50964ee458b08a702ec69b82a62e4995c57cee82
> Reviewed-on: https://webrtc-review.googlesource.com/97660
> Commit-Queue: Niels Moller <nisse@webrtc.org>
> Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
> Reviewed-by: Anders Carlsson <andersc@webrtc.org>
> Reviewed-by: Sebastian Jansson <srte@webrtc.org>
> Reviewed-by: Erik Språng <sprang@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#24861}
Bug: webrtc:9106
Change-Id: I2eb894773b3f33ff6a980e8008e8248607e32668
Reviewed-on: https://webrtc-review.googlesource.com/102480
Reviewed-by: Sebastian Jansson <srte@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#24882}diff --git a/test/BUILD.gn b/test/BUILD.gn
index 574aa4e..7456365 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -540,7 +540,6 @@
"constants.h",
"drifting_clock.cc",
"drifting_clock.h",
- "encoder_proxy_factory.h",
"encoder_settings.cc",
"encoder_settings.h",
"fake_videorenderer.h",
@@ -555,6 +554,8 @@
"rtp_rtcp_observer.h",
"statistics.cc",
"statistics.h",
+ "video_decoder_proxy_factory.h",
+ "video_encoder_proxy_factory.h",
"win/run_loop_win.cc",
]
if (!is_win) {
diff --git a/test/call_test.cc b/test/call_test.cc
index 89ac329..f4fbf22 100644
--- a/test/call_test.cc
+++ b/test/call_test.cc
@@ -52,6 +52,7 @@
fake_encoder->SetMaxBitrate(fake_encoder_max_bitrate_);
return fake_encoder;
}),
+ fake_decoder_factory_([]() { return absl::make_unique<FakeDecoder>(); }),
num_video_streams_(1),
num_audio_streams_(0),
num_flexfec_streams_(0),
@@ -314,20 +315,22 @@
const VideoSendStream::Config& video_send_config,
Transport* rtcp_send_transport) {
CreateMatchingVideoReceiveConfigs(video_send_config, rtcp_send_transport,
- true, absl::nullopt, false, 0);
+ true, &fake_decoder_factory_, absl::nullopt,
+ false, 0);
}
void CallTest::CreateMatchingVideoReceiveConfigs(
const VideoSendStream::Config& video_send_config,
Transport* rtcp_send_transport,
bool send_side_bwe,
+ VideoDecoderFactory* decoder_factory,
absl::optional<size_t> decode_sub_stream,
bool receiver_reference_time_report,
int rtp_history_ms) {
AddMatchingVideoReceiveConfigs(
&video_receive_configs_, video_send_config, rtcp_send_transport,
- send_side_bwe, decode_sub_stream, receiver_reference_time_report,
- rtp_history_ms);
+ send_side_bwe, decoder_factory, decode_sub_stream,
+ receiver_reference_time_report, rtp_history_ms);
}
void CallTest::AddMatchingVideoReceiveConfigs(
@@ -335,6 +338,7 @@
const VideoSendStream::Config& video_send_config,
Transport* rtcp_send_transport,
bool send_side_bwe,
+ VideoDecoderFactory* decoder_factory,
absl::optional<size_t> decode_sub_stream,
bool receiver_reference_time_report,
int rtp_history_ms) {
@@ -362,15 +366,14 @@
video_recv_config.rtp.remote_ssrc = video_send_config.rtp.ssrcs[i];
VideoReceiveStream::Decoder decoder;
+ decoder.payload_type = video_send_config.rtp.payload_type;
+ decoder.video_format = SdpVideoFormat(video_send_config.rtp.payload_name);
// Force fake decoders on non-selected simulcast streams.
if (!decode_sub_stream || i == *decode_sub_stream) {
- decoder = test::CreateMatchingDecoder(video_send_config);
+ decoder.decoder_factory = decoder_factory;
} else {
- decoder.decoder = new test::FakeDecoder();
- decoder.payload_type = video_send_config.rtp.payload_type;
- decoder.video_format = SdpVideoFormat(video_send_config.rtp.payload_name);
+ decoder.decoder_factory = &fake_decoder_factory_;
}
- allocated_decoders_.emplace_back(decoder.decoder);
video_recv_config.decoders.push_back(decoder);
receive_configs->emplace_back(std::move(video_recv_config));
}
@@ -433,7 +436,6 @@
void CallTest::CreateMatchingReceiveConfigs(Transport* rtcp_send_transport) {
video_receive_configs_.clear();
- allocated_decoders_.clear();
for (VideoSendStream::Config& video_send_config : video_send_configs_) {
CreateMatchingVideoReceiveConfigs(video_send_config, rtcp_send_transport);
}
@@ -635,7 +637,6 @@
receiver_call_->DestroyFlexfecReceiveStream(flexfec_recv_stream);
video_receive_streams_.clear();
- allocated_decoders_.clear();
}
void CallTest::DestroyVideoSendStreams() {
diff --git a/test/call_test.h b/test/call_test.h
index eb96cfd..7a5c3e9 100644
--- a/test/call_test.h
+++ b/test/call_test.h
@@ -22,6 +22,7 @@
#include "test/fake_videorenderer.h"
#include "test/fake_vp8_encoder.h"
#include "test/frame_generator_capturer.h"
+#include "test/function_video_decoder_factory.h"
#include "test/function_video_encoder_factory.h"
#include "test/rtp_rtcp_observer.h"
#include "test/single_threaded_task_queue.h"
@@ -103,6 +104,7 @@
const VideoSendStream::Config& video_send_config,
Transport* rtcp_send_transport,
bool send_side_bwe,
+ VideoDecoderFactory* decoder_factory,
absl::optional<size_t> decode_sub_stream,
bool receiver_reference_time_report,
int rtp_history_ms);
@@ -111,6 +113,7 @@
const VideoSendStream::Config& video_send_config,
Transport* rtcp_send_transport,
bool send_side_bwe,
+ VideoDecoderFactory* decoder_factory,
absl::optional<size_t> decode_sub_stream,
bool receiver_reference_time_report,
int rtp_history_ms);
@@ -201,7 +204,7 @@
test::FunctionVideoEncoderFactory fake_encoder_factory_;
int fake_encoder_max_bitrate_ = -1;
- std::vector<std::unique_ptr<VideoDecoder>> allocated_decoders_;
+ test::FunctionVideoDecoderFactory fake_decoder_factory_;
// Number of simulcast substreams.
size_t num_video_streams_;
size_t num_audio_streams_;
diff --git a/test/encoder_settings.cc b/test/encoder_settings.cc
index 1013433..945559b 100644
--- a/test/encoder_settings.cc
+++ b/test/encoder_settings.cc
@@ -12,13 +12,7 @@
#include <algorithm>
#include <string>
-#include "media/engine/internaldecoderfactory.h"
-#include "modules/video_coding/codecs/h264/include/h264.h"
-#include "modules/video_coding/codecs/multiplex/include/multiplex_decoder_adapter.h"
-#include "modules/video_coding/codecs/vp8/include/vp8.h"
-#include "modules/video_coding/codecs/vp9/include/vp9.h"
#include "rtc_base/refcountedobject.h"
-#include "test/fake_decoder.h"
namespace webrtc {
namespace test {
@@ -128,18 +122,6 @@
VideoReceiveStream::Decoder decoder;
decoder.payload_type = payload_type;
decoder.video_format = SdpVideoFormat(payload_name);
- if (payload_name == "H264") {
- decoder.decoder = H264Decoder::Create().release();
- } else if (payload_name == "VP8") {
- decoder.decoder = VP8Decoder::Create().release();
- } else if (payload_name == "VP9") {
- decoder.decoder = VP9Decoder::Create().release();
- } else if (payload_name == "multiplex") {
- decoder.decoder = new MultiplexDecoderAdapter(
- new InternalDecoderFactory(), SdpVideoFormat(cricket::kVp9CodecName));
- } else {
- decoder.decoder = new FakeDecoder();
- }
return decoder;
}
diff --git a/test/function_video_decoder_factory.h b/test/function_video_decoder_factory.h
index 00b0168..984f853 100644
--- a/test/function_video_decoder_factory.h
+++ b/test/function_video_decoder_factory.h
@@ -28,6 +28,10 @@
public:
explicit FunctionVideoDecoderFactory(
std::function<std::unique_ptr<VideoDecoder>()> create)
+ : create_([create](const SdpVideoFormat&) { return create(); }) {}
+ explicit FunctionVideoDecoderFactory(
+ std::function<std::unique_ptr<VideoDecoder>(const SdpVideoFormat&)>
+ create)
: create_(std::move(create)) {}
// Unused by tests.
@@ -37,12 +41,13 @@
}
std::unique_ptr<VideoDecoder> CreateVideoDecoder(
- const SdpVideoFormat& /* format */) override {
- return create_();
+ const SdpVideoFormat& format) override {
+ return create_(format);
}
private:
- const std::function<std::unique_ptr<VideoDecoder>()> create_;
+ const std::function<std::unique_ptr<VideoDecoder>(const SdpVideoFormat&)>
+ create_;
};
} // namespace test
diff --git a/test/scenario/video_stream.cc b/test/scenario/video_stream.cc
index be77d23..b85034f 100644
--- a/test/scenario/video_stream.cc
+++ b/test/scenario/video_stream.cc
@@ -13,6 +13,7 @@
#include <utility>
#include "media/base/mediaconstants.h"
+#include "media/engine/internaldecoderfactory.h"
#include "media/engine/internalencoderfactory.h"
#include "media/engine/webrtcvideoengine.h"
#include "test/call_test.h"
@@ -283,7 +284,9 @@
SendVideoStream* send_stream,
size_t chosen_stream,
Transport* feedback_transport)
- : receiver_(receiver), config_(config) {
+ : receiver_(receiver),
+ config_(config),
+ decoder_factory_(absl::make_unique<InternalDecoderFactory>()) {
renderer_ = absl::make_unique<FakeVideoRenderer>();
VideoReceiveStream::Config recv_config(feedback_transport);
recv_config.rtp.remb = !config.stream.packet_feedback;
@@ -305,7 +308,7 @@
VideoReceiveStream::Decoder decoder =
CreateMatchingDecoder(CodecTypeToPayloadType(config.encoder.codec),
CodecTypeToPayloadString(config.encoder.codec));
- decoder_.reset(decoder.decoder);
+ decoder.decoder_factory = decoder_factory_.get();
recv_config.decoders.push_back(decoder);
if (config.stream.use_flexfec) {
diff --git a/test/scenario/video_stream.h b/test/scenario/video_stream.h
index f1d2129..e669618 100644
--- a/test/scenario/video_stream.h
+++ b/test/scenario/video_stream.h
@@ -79,7 +79,7 @@
std::unique_ptr<rtc::VideoSinkInterface<webrtc::VideoFrame>> renderer_;
CallClient* const receiver_;
const VideoStreamConfig config_;
- std::unique_ptr<VideoDecoder> decoder_;
+ std::unique_ptr<VideoDecoderFactory> decoder_factory_;
};
// VideoStreamPair represents a video streaming session. It can be used to
diff --git a/test/video_decoder_proxy_factory.h b/test/video_decoder_proxy_factory.h
new file mode 100644
index 0000000..250750c
--- /dev/null
+++ b/test/video_decoder_proxy_factory.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef TEST_VIDEO_DECODER_PROXY_FACTORY_H_
+#define TEST_VIDEO_DECODER_PROXY_FACTORY_H_
+
+#include <memory>
+#include <vector>
+
+#include "absl/memory/memory.h"
+#include "api/video_codecs/video_decoder.h"
+#include "api/video_codecs/video_decoder_factory.h"
+
+namespace webrtc {
+namespace test {
+
+// An decoder factory with a single underlying VideoDecoder object, intended for
+// test purposes. Each call to CreateVideoDecoder returns a proxy for the same
+// decoder, typically an instance of FakeDecoder or MockEncoder.
+class VideoDecoderProxyFactory final : public VideoDecoderFactory {
+ public:
+ explicit VideoDecoderProxyFactory(VideoDecoder* decoder)
+ : decoder_(decoder) {}
+
+ // Unused by tests.
+ std::vector<SdpVideoFormat> GetSupportedFormats() const override {
+ RTC_NOTREACHED();
+ return {};
+ }
+
+ std::unique_ptr<VideoDecoder> CreateVideoDecoder(
+ const SdpVideoFormat& format) override {
+ return absl::make_unique<DecoderProxy>(decoder_);
+ }
+
+ private:
+ // Wrapper class, since CreateVideoDecoder needs to surrender
+ // ownership to the object it returns.
+ class DecoderProxy final : public VideoDecoder {
+ public:
+ explicit DecoderProxy(VideoDecoder* decoder) : decoder_(decoder) {}
+
+ private:
+ int32_t Decode(const EncodedImage& input_image,
+ bool missing_frames,
+ const CodecSpecificInfo* codec_specific_info,
+ int64_t render_time_ms) override {
+ return decoder_->Decode(input_image, missing_frames, codec_specific_info,
+ render_time_ms);
+ }
+ int32_t InitDecode(const VideoCodec* config,
+ int32_t number_of_cores) override {
+ return decoder_->InitDecode(config, number_of_cores);
+ }
+ int32_t RegisterDecodeCompleteCallback(
+ DecodedImageCallback* callback) override {
+ return decoder_->RegisterDecodeCompleteCallback(callback);
+ }
+ int32_t Release() override { return decoder_->Release(); }
+ bool PrefersLateDecoding() const { return decoder_->PrefersLateDecoding(); }
+ const char* ImplementationName() const override {
+ return decoder_->ImplementationName();
+ }
+
+ VideoDecoder* const decoder_;
+ };
+
+ VideoDecoder* const decoder_;
+};
+
+} // namespace test
+} // namespace webrtc
+
+#endif // TEST_VIDEO_DECODER_PROXY_FACTORY_H_
diff --git a/test/encoder_proxy_factory.h b/test/video_encoder_proxy_factory.h
similarity index 92%
rename from test/encoder_proxy_factory.h
rename to test/video_encoder_proxy_factory.h
index 8672a46..e7289c0 100644
--- a/test/encoder_proxy_factory.h
+++ b/test/video_encoder_proxy_factory.h
@@ -8,8 +8,8 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#ifndef TEST_ENCODER_PROXY_FACTORY_H_
-#define TEST_ENCODER_PROXY_FACTORY_H_
+#ifndef TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
+#define TEST_VIDEO_ENCODER_PROXY_FACTORY_H_
#include <memory>
#include <vector>
@@ -24,9 +24,9 @@
// An encoder factory with a single underlying VideoEncoder object,
// intended for test purposes. Each call to CreateVideoEncoder returns
// a proxy for the same encoder, typically an instance of FakeEncoder.
-class EncoderProxyFactory final : public VideoEncoderFactory {
+class VideoEncoderProxyFactory final : public VideoEncoderFactory {
public:
- explicit EncoderProxyFactory(VideoEncoder* encoder) : encoder_(encoder) {
+ explicit VideoEncoderProxyFactory(VideoEncoder* encoder) : encoder_(encoder) {
codec_info_.is_hardware_accelerated = false;
codec_info_.has_internal_source = false;
}
@@ -100,4 +100,4 @@
} // namespace test
} // namespace webrtc
-#endif // TEST_ENCODER_PROXY_FACTORY_H_
+#endif // TEST_VIDEO_ENCODER_PROXY_FACTORY_H_