diff --git a/webrtc/media/base/fakemediaengine.h b/webrtc/media/base/fakemediaengine.h index 0b080afde7..921623cb03 100644 --- a/webrtc/media/base/fakemediaengine.h +++ b/webrtc/media/base/fakemediaengine.h @@ -774,13 +774,7 @@ class FakeBaseEngine { class FakeVoiceEngine : public FakeBaseEngine { public: - FakeVoiceEngine(webrtc::AudioDeviceModule* adm, - const rtc::scoped_refptr& - audio_encoder_factory, - const rtc::scoped_refptr& - audio_decoder_factory, - rtc::scoped_refptr audio_mixer, - rtc::scoped_refptr apm) { + FakeVoiceEngine() { // Add a fake audio codec. Note that the name must not be "" as there are // sanity checks against that. codecs_.push_back(AudioCodec(101, "fake_audio_codec", 0, 0, 1)); @@ -843,8 +837,6 @@ class FakeVideoEngine : public FakeBaseEngine { codecs_.push_back(VideoCodec(0, "fake_video_codec")); } - void Init() {} - bool SetOptions(const VideoOptions& options) { options_ = options; options_changed_ = true; @@ -895,55 +887,50 @@ class FakeMediaEngine : public CompositeMediaEngine { public: FakeMediaEngine() - : CompositeMediaEngine(nullptr, - nullptr, - nullptr, - nullptr, - nullptr) {} + : CompositeMediaEngine(std::tuple<>(), + std::tuple<>()) { + } + virtual ~FakeMediaEngine() {} void SetAudioCodecs(const std::vector& codecs) { - voice_.SetCodecs(codecs); + voice().SetCodecs(codecs); } void SetVideoCodecs(const std::vector& codecs) { - video_.SetCodecs(codecs); + video().SetCodecs(codecs); } void SetAudioRtpHeaderExtensions( const std::vector& extensions) { - voice_.set_rtp_header_extensions(extensions); + voice().set_rtp_header_extensions(extensions); } void SetVideoRtpHeaderExtensions( const std::vector& extensions) { - video_.set_rtp_header_extensions(extensions); + video().set_rtp_header_extensions(extensions); } void SetAudioRtpHeaderExtensions( const std::vector& extensions) { - voice_.set_rtp_header_extensions(extensions); + voice().set_rtp_header_extensions(extensions); } void SetVideoRtpHeaderExtensions( const std::vector& extensions) { - video_.set_rtp_header_extensions(extensions); + video().set_rtp_header_extensions(extensions); } FakeVoiceMediaChannel* GetVoiceChannel(size_t index) { - return voice_.GetChannel(index); + return voice().GetChannel(index); } FakeVideoMediaChannel* GetVideoChannel(size_t index) { - return video_.GetChannel(index); + return video().GetChannel(index); } - bool capture() const { return video_.capture_; } - bool options_changed() const { - return video_.options_changed_; - } - void clear_options_changed() { - video_.options_changed_ = false; - } + bool capture() const { return video().capture_; } + bool options_changed() const { return video().options_changed_; } + void clear_options_changed() { video().options_changed_ = false; } void set_fail_create_channel(bool fail) { - voice_.set_fail_create_channel(fail); - video_.set_fail_create_channel(fail); + voice().set_fail_create_channel(fail); + video().set_fail_create_channel(fail); } }; diff --git a/webrtc/media/base/mediaengine.h b/webrtc/media/base/mediaengine.h index 8ce60753d0..52a55f93bb 100644 --- a/webrtc/media/base/mediaengine.h +++ b/webrtc/media/base/mediaengine.h @@ -109,71 +109,65 @@ class MediaEngineFactory { // CompositeMediaEngine constructs a MediaEngine from separate // voice and video engine classes. -template +template class CompositeMediaEngine : public MediaEngineInterface { public: - CompositeMediaEngine( - webrtc::AudioDeviceModule* adm, - const rtc::scoped_refptr& - audio_encoder_factory, - const rtc::scoped_refptr& - audio_decoder_factory, - rtc::scoped_refptr audio_mixer, - rtc::scoped_refptr audio_processing) - : voice_(adm, - audio_encoder_factory, - audio_decoder_factory, - audio_mixer, - audio_processing) {} + template + CompositeMediaEngine(std::tuple first_args, + std::tuple second_args) + : engines_(std::piecewise_construct, + std::move(first_args), + std::move(second_args)) {} + virtual ~CompositeMediaEngine() {} virtual bool Init() { - voice_.Init(); - video_.Init(); + voice().Init(); return true; } virtual rtc::scoped_refptr GetAudioState() const { - return voice_.GetAudioState(); + return voice().GetAudioState(); } virtual VoiceMediaChannel* CreateChannel(webrtc::Call* call, const MediaConfig& config, const AudioOptions& options) { - return voice_.CreateChannel(call, config, options); + return voice().CreateChannel(call, config, options); } virtual VideoMediaChannel* CreateVideoChannel(webrtc::Call* call, const MediaConfig& config, const VideoOptions& options) { - return video_.CreateChannel(call, config, options); + return video().CreateChannel(call, config, options); } - virtual int GetInputLevel() { - return voice_.GetInputLevel(); - } + virtual int GetInputLevel() { return voice().GetInputLevel(); } virtual const std::vector& audio_send_codecs() { - return voice_.send_codecs(); + return voice().send_codecs(); } virtual const std::vector& audio_recv_codecs() { - return voice_.recv_codecs(); + return voice().recv_codecs(); } virtual RtpCapabilities GetAudioCapabilities() { - return voice_.GetCapabilities(); + return voice().GetCapabilities(); } - virtual std::vector video_codecs() { return video_.codecs(); } + virtual std::vector video_codecs() { return video().codecs(); } virtual RtpCapabilities GetVideoCapabilities() { - return video_.GetCapabilities(); + return video().GetCapabilities(); } virtual bool StartAecDump(rtc::PlatformFile file, int64_t max_size_bytes) { - return voice_.StartAecDump(file, max_size_bytes); + return voice().StartAecDump(file, max_size_bytes); } - virtual void StopAecDump() { - voice_.StopAecDump(); - } + virtual void StopAecDump() { voice().StopAecDump(); } protected: - VOICE voice_; - VIDEO video_; + VOICE& voice() { return engines_.first; } + VIDEO& video() { return engines_.second; } + const VOICE& voice() const { return engines_.first; } + const VIDEO& video() const { return engines_.second; } + + private: + std::pair engines_; }; enum DataChannelType { DCT_NONE = 0, DCT_RTP = 1, DCT_SCTP = 2, DCT_QUIC = 3 }; diff --git a/webrtc/media/base/videoengine_unittest.h b/webrtc/media/base/videoengine_unittest.h index 77062ecf49..64fda56849 100644 --- a/webrtc/media/base/videoengine_unittest.h +++ b/webrtc/media/base/videoengine_unittest.h @@ -64,7 +64,9 @@ class VideoMediaChannelTest : public testing::Test, public sigslot::has_slots<> { protected: VideoMediaChannelTest() - : call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))) {} + : call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))), + engine_(nullptr /* external_encoder_factory */, + nullptr /* external_decoder_factory */) {} virtual cricket::VideoCodec DefaultCodec() = 0; @@ -73,7 +75,6 @@ class VideoMediaChannelTest : public testing::Test, } virtual void SetUp() { - engine_.Init(); cricket::MediaConfig media_config; // Disabling cpu overuse detection actually disables quality scaling too; it // implies DegradationPreference kMaintainResolution. Automatic scaling diff --git a/webrtc/media/engine/nullwebrtcvideoengine.h b/webrtc/media/engine/nullwebrtcvideoengine.h index 2fe87f4bad..9c687b9db7 100644 --- a/webrtc/media/engine/nullwebrtcvideoengine.h +++ b/webrtc/media/engine/nullwebrtcvideoengine.h @@ -33,31 +33,15 @@ class WebRtcVideoEncoderFactory; // CompositeMediaEngine. class NullWebRtcVideoEngine { public: - NullWebRtcVideoEngine() {} - ~NullWebRtcVideoEngine() {} + std::vector codecs() const { return std::vector(); } - void SetExternalDecoderFactory(WebRtcVideoDecoderFactory* decoder_factory) {} - void SetExternalEncoderFactory(WebRtcVideoEncoderFactory* encoder_factory) {} - - void Init() {} - - const std::vector& codecs() { - return codecs_; - } - - RtpCapabilities GetCapabilities() { - RtpCapabilities capabilities; - return capabilities; - } + RtpCapabilities GetCapabilities() const { return RtpCapabilities(); } VideoMediaChannel* CreateChannel(webrtc::Call* call, const MediaConfig& config, const VideoOptions& options) { return nullptr; } - - private: - std::vector codecs_; }; } // namespace cricket diff --git a/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc b/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc index e1a2964722..5fa7b011f2 100644 --- a/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc +++ b/webrtc/media/engine/nullwebrtcvideoengine_unittest.cc @@ -25,18 +25,14 @@ class WebRtcMediaEngineNullVideo const rtc::scoped_refptr& audio_encoder_factory, const rtc::scoped_refptr& - audio_decoder_factory, - WebRtcVideoEncoderFactory* video_encoder_factory, - WebRtcVideoDecoderFactory* video_decoder_factory) + audio_decoder_factory) : CompositeMediaEngine( - adm, - audio_encoder_factory, - audio_decoder_factory, - nullptr, - webrtc::AudioProcessing::Create()) { - video_.SetExternalDecoderFactory(video_decoder_factory); - video_.SetExternalEncoderFactory(video_encoder_factory); - } + std::forward_as_tuple(adm, + audio_encoder_factory, + audio_decoder_factory, + nullptr, + webrtc::AudioProcessing::Create()), + std::forward_as_tuple()) {} }; // Simple test to check if NullWebRtcVideoEngine implements the methods @@ -44,7 +40,7 @@ class WebRtcMediaEngineNullVideo TEST(NullWebRtcVideoEngineTest, CheckInterface) { WebRtcMediaEngineNullVideo engine( nullptr, webrtc::MockAudioEncoderFactory::CreateUnusedFactory(), - webrtc::MockAudioDecoderFactory::CreateUnusedFactory(), nullptr, nullptr); + webrtc::MockAudioDecoderFactory::CreateUnusedFactory()); EXPECT_TRUE(engine.Init()); } diff --git a/webrtc/media/engine/webrtcmediaengine.cc b/webrtc/media/engine/webrtcmediaengine.cc index 774b6b7f90..3a61ad73bb 100644 --- a/webrtc/media/engine/webrtcmediaengine.cc +++ b/webrtc/media/engine/webrtcmediaengine.cc @@ -24,65 +24,33 @@ namespace cricket { -class WebRtcMediaEngine2 -#ifdef HAVE_WEBRTC_VIDEO - : public CompositeMediaEngine { -#else - : public CompositeMediaEngine { -#endif - public: - WebRtcMediaEngine2( - webrtc::AudioDeviceModule* adm, - const rtc::scoped_refptr& - audio_encoder_factory, - const rtc::scoped_refptr& - audio_decoder_factory, - WebRtcVideoEncoderFactory* video_encoder_factory, - WebRtcVideoDecoderFactory* video_decoder_factory, - rtc::scoped_refptr audio_mixer, - rtc::scoped_refptr audio_processing) -#ifdef HAVE_WEBRTC_VIDEO - : CompositeMediaEngine( - adm, - audio_encoder_factory, - audio_decoder_factory, - audio_mixer, - audio_processing){ -#else - : CompositeMediaEngine( - adm, - audio_encoder_factory, - audio_decoder_factory, - audio_mixer, - audio_processing) { -#endif - video_.SetExternalDecoderFactory(video_decoder_factory); - video_.SetExternalEncoderFactory(video_encoder_factory); - } -}; +namespace { -} // namespace cricket - -cricket::MediaEngineInterface* CreateWebRtcMediaEngine( +MediaEngineInterface* CreateWebRtcMediaEngine( webrtc::AudioDeviceModule* adm, const rtc::scoped_refptr& audio_encoder_factory, const rtc::scoped_refptr& audio_decoder_factory, - cricket::WebRtcVideoEncoderFactory* video_encoder_factory, - cricket::WebRtcVideoDecoderFactory* video_decoder_factory, + WebRtcVideoEncoderFactory* video_encoder_factory, + WebRtcVideoDecoderFactory* video_decoder_factory, rtc::scoped_refptr audio_mixer, rtc::scoped_refptr audio_processing) { - return new cricket::WebRtcMediaEngine2( - adm, audio_encoder_factory, audio_decoder_factory, video_encoder_factory, - video_decoder_factory, audio_mixer, audio_processing); +#ifdef HAVE_WEBRTC_VIDEO + typedef WebRtcVideoEngine VideoEngine; + std::tuple video_args( + video_encoder_factory, video_decoder_factory); +#else + typedef NullWebRtcVideoEngine VideoEngine; + std::tuple<> video_args; +#endif + return new CompositeMediaEngine( + std::forward_as_tuple(adm, audio_encoder_factory, audio_decoder_factory, + audio_mixer, audio_processing), + std::move(video_args)); } -void DestroyWebRtcMediaEngine(cricket::MediaEngineInterface* media_engine) { - delete media_engine; -} - -namespace cricket { +} // namespace // TODO(ossu): Backwards-compatible interface. Will be deprecated once the // audio decoder factory is fully plumbed and used throughout WebRTC. diff --git a/webrtc/media/engine/webrtcvideoengine.cc b/webrtc/media/engine/webrtcvideoengine.cc index 284eb9a643..a21f63359d 100644 --- a/webrtc/media/engine/webrtcvideoengine.cc +++ b/webrtc/media/engine/webrtcvideoengine.cc @@ -68,8 +68,6 @@ class EncoderFactoryAdapter { bool is_conference_mode_screenshare) const = 0; virtual std::vector GetSupportedCodecs() const = 0; - - virtual std::unique_ptr clone() const = 0; }; class DecoderFactoryAdapter { @@ -79,12 +77,13 @@ class DecoderFactoryAdapter { virtual std::unique_ptr CreateVideoDecoder( const VideoCodec& codec, const VideoDecoderParams& decoder_params) const = 0; - - virtual std::unique_ptr clone() const = 0; }; namespace { +std::vector AssignPayloadTypesAndAddAssociatedRtxCodecs( + const std::vector& input_codecs); + // Wraps cricket::WebRtcVideoEncoderFactory* into common EncoderFactoryAdapter // interface. // TODO(magjed): Add wrapper class for future webrtc::VideoEncoderFactory @@ -107,11 +106,6 @@ class CricketEncoderFactoryAdapter : public EncoderFactoryAdapter { std::vector GetSupportedCodecs() const override; - std::unique_ptr clone() const override { - return std::unique_ptr( - new CricketEncoderFactoryAdapter(*this)); - } - const std::unique_ptr internal_encoder_factory_; WebRtcVideoEncoderFactory* const external_encoder_factory_; }; @@ -132,11 +126,6 @@ class CricketDecoderFactoryAdapter : public DecoderFactoryAdapter { const VideoCodec& codec, const VideoDecoderParams& decoder_params) const override; - std::unique_ptr clone() const override { - return std::unique_ptr( - new CricketDecoderFactoryAdapter(*this)); - } - const std::unique_ptr internal_decoder_factory_; WebRtcVideoDecoderFactory* const external_decoder_factory_; }; @@ -402,12 +391,13 @@ void DefaultUnsignalledSsrcHandler::SetDefaultSink( } } -WebRtcVideoEngine::WebRtcVideoEngine() - : initialized_(false), - decoder_factory_(new CricketDecoderFactoryAdapter( - nullptr /* external_decoder_factory */)), - encoder_factory_(new CricketEncoderFactoryAdapter( - nullptr /* external_encoder_factory */)) { +WebRtcVideoEngine::WebRtcVideoEngine( + WebRtcVideoEncoderFactory* external_video_encoder_factory, + WebRtcVideoDecoderFactory* external_video_decoder_factory) + : decoder_factory_( + new CricketDecoderFactoryAdapter(external_video_decoder_factory)), + encoder_factory_( + new CricketEncoderFactoryAdapter(external_video_encoder_factory)) { LOG(LS_INFO) << "WebRtcVideoEngine::WebRtcVideoEngine()"; } @@ -415,19 +405,13 @@ WebRtcVideoEngine::~WebRtcVideoEngine() { LOG(LS_INFO) << "WebRtcVideoEngine::~WebRtcVideoEngine"; } -void WebRtcVideoEngine::Init() { - LOG(LS_INFO) << "WebRtcVideoEngine::Init"; - initialized_ = true; -} - WebRtcVideoChannel* WebRtcVideoEngine::CreateChannel( webrtc::Call* call, const MediaConfig& config, const VideoOptions& options) { - RTC_DCHECK(initialized_); LOG(LS_INFO) << "CreateChannel. Options: " << options.ToString(); - return new WebRtcVideoChannel(call, config, options, *encoder_factory_, - *decoder_factory_); + return new WebRtcVideoChannel(call, config, options, encoder_factory_.get(), + decoder_factory_.get()); } std::vector WebRtcVideoEngine::codecs() const { @@ -460,23 +444,12 @@ RtpCapabilities WebRtcVideoEngine::GetCapabilities() const { return capabilities; } -void WebRtcVideoEngine::SetExternalDecoderFactory( - WebRtcVideoDecoderFactory* decoder_factory) { - RTC_DCHECK(!initialized_); - decoder_factory_.reset(new CricketDecoderFactoryAdapter(decoder_factory)); -} - -void WebRtcVideoEngine::SetExternalEncoderFactory( - WebRtcVideoEncoderFactory* encoder_factory) { - RTC_DCHECK(!initialized_); - encoder_factory_.reset(new CricketEncoderFactoryAdapter(encoder_factory)); -} - +namespace { // This function will assign dynamic payload types (in the range [96, 127]) to // the input codecs, and also add associated RTX codecs for recognized codecs // (VP8, VP9, H264, and RED). It will also add default feedback params to the // codecs. -static std::vector AssignPayloadTypesAndAddAssociatedRtxCodecs( +std::vector AssignPayloadTypesAndAddAssociatedRtxCodecs( const std::vector& input_codecs) { static const int kFirstDynamicPayloadType = 96; static const int kLastDynamicPayloadType = 127; @@ -513,6 +486,7 @@ static std::vector AssignPayloadTypesAndAddAssociatedRtxCodecs( } return output_codecs; } +} // namespace std::vector CricketEncoderFactoryAdapter::GetSupportedCodecs() const { @@ -540,14 +514,14 @@ WebRtcVideoChannel::WebRtcVideoChannel( webrtc::Call* call, const MediaConfig& config, const VideoOptions& options, - const EncoderFactoryAdapter& encoder_factory, - const DecoderFactoryAdapter& decoder_factory) + const EncoderFactoryAdapter* encoder_factory, + const DecoderFactoryAdapter* decoder_factory) : VideoMediaChannel(config), call_(call), unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_), video_config_(config.video), - encoder_factory_(encoder_factory.clone()), - decoder_factory_(decoder_factory.clone()), + encoder_factory_(encoder_factory), + decoder_factory_(decoder_factory), default_send_options_(options), last_stats_log_ms_(-1) { RTC_DCHECK(thread_checker_.CalledOnValidThread()); @@ -1052,7 +1026,7 @@ bool WebRtcVideoChannel::AddSendStream(const StreamParams& sp) { config.periodic_alr_bandwidth_probing = video_config_.periodic_alr_bandwidth_probing; WebRtcVideoSendStream* stream = new WebRtcVideoSendStream( - call_, sp, std::move(config), default_send_options_, *encoder_factory_, + call_, sp, std::move(config), default_send_options_, encoder_factory_, video_config_.enable_cpu_overuse_detection, bitrate_config_.max_bitrate_bps, send_codec_, send_rtp_extensions_, send_params_); @@ -1163,7 +1137,7 @@ bool WebRtcVideoChannel::AddRecvStream(const StreamParams& sp, config.sync_group = sp.sync_label; receive_streams_[ssrc] = new WebRtcVideoReceiveStream( - call_, sp, std::move(config), *decoder_factory_, default_stream, + call_, sp, std::move(config), decoder_factory_, default_stream, recv_codecs_, flexfec_config); return true; @@ -1502,7 +1476,7 @@ WebRtcVideoChannel::WebRtcVideoSendStream::WebRtcVideoSendStream( const StreamParams& sp, webrtc::VideoSendStream::Config config, const VideoOptions& options, - const EncoderFactoryAdapter& encoder_factory, + const EncoderFactoryAdapter* encoder_factory, bool enable_cpu_overuse_detection, int max_bitrate_bps, const rtc::Optional& codec_settings, @@ -1516,7 +1490,7 @@ WebRtcVideoChannel::WebRtcVideoSendStream::WebRtcVideoSendStream( call_(call), enable_cpu_overuse_detection_(enable_cpu_overuse_detection), source_(nullptr), - encoder_factory_(encoder_factory.clone()), + encoder_factory_(encoder_factory), stream_(nullptr), encoder_sink_(nullptr), parameters_(std::move(config), options, max_bitrate_bps, codec_settings), @@ -2103,7 +2077,7 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream( webrtc::Call* call, const StreamParams& sp, webrtc::VideoReceiveStream::Config config, - const DecoderFactoryAdapter& decoder_factory, + const DecoderFactoryAdapter* decoder_factory, bool default_stream, const std::vector& recv_codecs, const webrtc::FlexfecReceiveStream::Config& flexfec_config) @@ -2114,7 +2088,7 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::WebRtcVideoReceiveStream( config_(std::move(config)), flexfec_config_(flexfec_config), flexfec_stream_(nullptr), - decoder_factory_(decoder_factory.clone()), + decoder_factory_(decoder_factory), sink_(NULL), first_frame_timestamp_(-1), estimated_remote_start_ntp_time_ms_(0) { diff --git a/webrtc/media/engine/webrtcvideoengine.h b/webrtc/media/engine/webrtcvideoengine.h index e61f42228d..8c8aefb140 100644 --- a/webrtc/media/engine/webrtcvideoengine.h +++ b/webrtc/media/engine/webrtcvideoengine.h @@ -97,12 +97,13 @@ class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler { // WebRtcVideoEngine is used for the new native WebRTC Video API (webrtc:1667). class WebRtcVideoEngine { public: - WebRtcVideoEngine(); + // Video engine does not take ownership of the video codec factories and the + // caller needs to make sure they outlive the video engine. Internal SW video + // codecs will be added on top of the external codecs. + WebRtcVideoEngine(WebRtcVideoEncoderFactory* external_video_encoder_factory, + WebRtcVideoDecoderFactory* external_video_decoder_factory); virtual ~WebRtcVideoEngine(); - // Basic video engine implementation. - void Init(); - WebRtcVideoChannel* CreateChannel(webrtc::Call* call, const MediaConfig& config, const VideoOptions& options); @@ -110,21 +111,9 @@ class WebRtcVideoEngine { std::vector codecs() const; RtpCapabilities GetCapabilities() const; - // Set a WebRtcVideoDecoderFactory for external decoding. Video engine does - // not take the ownership of |decoder_factory|. The caller needs to make sure - // that |decoder_factory| outlives the video engine. - void SetExternalDecoderFactory(WebRtcVideoDecoderFactory* decoder_factory); - // Set a WebRtcVideoEncoderFactory for external encoding. Video engine does - // not take the ownership of |encoder_factory|. The caller needs to make sure - // that |encoder_factory| outlives the video engine. - virtual void SetExternalEncoderFactory( - WebRtcVideoEncoderFactory* encoder_factory); - private: - bool initialized_; - - std::unique_ptr decoder_factory_; - std::unique_ptr encoder_factory_; + const std::unique_ptr decoder_factory_; + const std::unique_ptr encoder_factory_; }; class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { @@ -132,8 +121,8 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { WebRtcVideoChannel(webrtc::Call* call, const MediaConfig& config, const VideoOptions& options, - const EncoderFactoryAdapter& encoder_factory, - const DecoderFactoryAdapter& decoder_factory); + const EncoderFactoryAdapter* encoder_factory, + const DecoderFactoryAdapter* decoder_factory); ~WebRtcVideoChannel() override; // VideoMediaChannel implementation @@ -261,7 +250,7 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { const StreamParams& sp, webrtc::VideoSendStream::Config config, const VideoOptions& options, - const EncoderFactoryAdapter& encoder_factory, + const EncoderFactoryAdapter* encoder_factory, bool enable_cpu_overuse_detection, int max_bitrate_bps, const rtc::Optional& codec_settings, @@ -338,9 +327,9 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { webrtc::Call* const call_; const bool enable_cpu_overuse_detection_; rtc::VideoSourceInterface* source_ - RTC_ACCESS_ON(&thread_checker_); - std::unique_ptr encoder_factory_ - RTC_ACCESS_ON(&thread_checker_); + ACCESS_ON(&thread_checker_); + const EncoderFactoryAdapter* const encoder_factory_ + ACCESS_ON(&thread_checker_); webrtc::VideoSendStream* stream_ RTC_ACCESS_ON(&thread_checker_); rtc::VideoSinkInterface* encoder_sink_ @@ -371,7 +360,7 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { webrtc::Call* call, const StreamParams& sp, webrtc::VideoReceiveStream::Config config, - const DecoderFactoryAdapter& decoder_factory, + const DecoderFactoryAdapter* decoder_factory, bool default_stream, const std::vector& recv_codecs, const webrtc::FlexfecReceiveStream::Config& flexfec_config); @@ -432,7 +421,7 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { webrtc::FlexfecReceiveStream::Config flexfec_config_; webrtc::FlexfecReceiveStream* flexfec_stream_; - std::unique_ptr decoder_factory_; + const DecoderFactoryAdapter* decoder_factory_; DecoderMap allocated_decoders_; rtc::CriticalSection sink_lock_; @@ -496,8 +485,8 @@ class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport { rtc::Optional send_codec_; rtc::Optional> send_rtp_extensions_; - std::unique_ptr encoder_factory_; - std::unique_ptr decoder_factory_; + const EncoderFactoryAdapter* const encoder_factory_; + const DecoderFactoryAdapter* const decoder_factory_; std::vector recv_codecs_; std::vector recv_rtp_extensions_; // See reason for keeping track of the FlexFEC payload type separately in diff --git a/webrtc/media/engine/webrtcvideoengine_unittest.cc b/webrtc/media/engine/webrtcvideoengine_unittest.cc index 1306082abf..683ccd5747 100644 --- a/webrtc/media/engine/webrtcvideoengine_unittest.cc +++ b/webrtc/media/engine/webrtcvideoengine_unittest.cc @@ -147,7 +147,7 @@ class WebRtcVideoEngineTest : public ::testing::Test { explicit WebRtcVideoEngineTest(const char* field_trials) : override_field_trials_(field_trials), call_(webrtc::Call::Create(webrtc::Call::Config(&event_log_))), - engine_() { + engine_(&encoder_factory_, &decoder_factory_) { std::vector engine_codecs = engine_.codecs(); RTC_DCHECK(!engine_codecs.empty()); bool codec_set = false; @@ -172,11 +172,9 @@ class WebRtcVideoEngineTest : public ::testing::Test { // present. cricket::VideoCodec GetEngineCodec(const std::string& name); - VideoMediaChannel* SetUpForExternalEncoderFactory( - cricket::WebRtcVideoEncoderFactory* encoder_factory); + VideoMediaChannel* SetUpForExternalEncoderFactory(); VideoMediaChannel* SetUpForExternalDecoderFactory( - cricket::WebRtcVideoDecoderFactory* decoder_factory, const std::vector& codecs); void TestExtendedEncoderOveruse(bool use_external_encoder); @@ -186,6 +184,8 @@ class WebRtcVideoEngineTest : public ::testing::Test { // Used in WebRtcVideoEngineVoiceTest, but defined here so it's properly // initialized when the constructor is called. std::unique_ptr call_; + cricket::FakeWebRtcVideoEncoderFactory encoder_factory_; + cricket::FakeWebRtcVideoDecoderFactory decoder_factory_; WebRtcVideoEngine engine_; VideoCodec default_codec_; std::map default_apt_rtx_types_; @@ -273,11 +273,9 @@ TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeCapturer) { // dtor is called. cricket::FakeVideoCapturer capturer; - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("VP8"); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); // Add CVO extension. @@ -305,11 +303,9 @@ TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) { // dtor is called. cricket::FakeVideoCapturer capturer; - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("VP8"); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); // Add CVO extension. const int id = 1; cricket::VideoSendParameters parameters; @@ -329,12 +325,10 @@ TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionBeforeAddSendStream) { TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) { cricket::FakeVideoCapturer capturer; - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); - encoder_factory.AddSupportedVideoCodecType("VP9"); + encoder_factory_.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("VP9"); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(kSsrc))); // Set capturer. @@ -364,7 +358,6 @@ TEST_F(WebRtcVideoEngineTest, CVOSetHeaderExtensionAfterCapturer) { } TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) { - engine_.Init(); std::unique_ptr channel( engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); @@ -377,7 +370,6 @@ TEST_F(WebRtcVideoEngineTest, SetSendFailsBeforeSettingCodecs) { } TEST_F(WebRtcVideoEngineTest, GetStatsWithoutSendCodecsSetDoesNotCrash) { - engine_.Init(); std::unique_ptr channel( engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); EXPECT_TRUE(channel->AddSendStream(StreamParams::CreateLegacy(123))); @@ -386,16 +378,14 @@ TEST_F(WebRtcVideoEngineTest, GetStatsWithoutSendCodecsSetDoesNotCrash) { } TEST_F(WebRtcVideoEngineTest, UseExternalFactoryForVp8WhenSupported) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("VP8"); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); channel->OnReadyToSend(true); EXPECT_TRUE( channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); - EXPECT_EQ(0, encoder_factory.GetNumCreatedEncoders()); + EXPECT_EQ(0, encoder_factory_.GetNumCreatedEncoders()); EXPECT_TRUE(channel->SetSend(true)); cricket::FakeVideoCapturer capturer; EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer)); @@ -403,11 +393,11 @@ TEST_F(WebRtcVideoEngineTest, UseExternalFactoryForVp8WhenSupported) { capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); // Sending one frame will have allocate the encoder. - ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1)); - EXPECT_TRUE_WAIT(encoder_factory.encoders()[0]->GetNumEncodedFrames() > 0, + ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(1)); + EXPECT_TRUE_WAIT(encoder_factory_.encoders()[0]->GetNumEncodedFrames() > 0, kTimeout); - int num_created_encoders = encoder_factory.GetNumCreatedEncoders(); + int num_created_encoders = encoder_factory_.GetNumCreatedEncoders(); EXPECT_EQ(num_created_encoders, 1); // Setting codecs of the same type should not reallocate any encoders @@ -415,11 +405,11 @@ TEST_F(WebRtcVideoEngineTest, UseExternalFactoryForVp8WhenSupported) { cricket::VideoSendParameters parameters; parameters.codecs.push_back(GetEngineCodec("VP8")); EXPECT_TRUE(channel->SetSendParameters(parameters)); - EXPECT_EQ(num_created_encoders, encoder_factory.GetNumCreatedEncoders()); + EXPECT_EQ(num_created_encoders, encoder_factory_.GetNumCreatedEncoders()); // Remove stream previously added to free the external encoder instance. EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); - EXPECT_EQ(0u, encoder_factory.encoders().size()); + EXPECT_EQ(0u, encoder_factory_.encoders().size()); } // Test that when an external encoder factory supports a codec we don't @@ -443,12 +433,9 @@ TEST_F(WebRtcVideoEngineTest, RtxCodecAddedForExternalCodec) { h264_high.params[kH264FmtpProfileLevelId] = *ProfileLevelIdToString( ProfileLevelId(webrtc::H264::kProfileHigh, kLevel1)); - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodec(h264_constrained_baseline); - encoder_factory.AddSupportedVideoCodec(h264_constrained_high); - encoder_factory.AddSupportedVideoCodec(h264_high); - engine_.SetExternalEncoderFactory(&encoder_factory); - engine_.Init(); + encoder_factory_.AddSupportedVideoCodec(h264_constrained_baseline); + encoder_factory_.AddSupportedVideoCodec(h264_constrained_high); + encoder_factory_.AddSupportedVideoCodec(h264_high); // First figure out what payload types the test codecs got assigned. const std::vector codecs = engine_.codecs(); @@ -464,15 +451,13 @@ TEST_F(WebRtcVideoEngineTest, RtxCodecAddedForExternalCodec) { void WebRtcVideoEngineTest::TestExtendedEncoderOveruse( bool use_external_encoder) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); std::unique_ptr channel; FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_)); call_.reset(fake_call); if (use_external_encoder) { - channel.reset(SetUpForExternalEncoderFactory(&encoder_factory)); + encoder_factory_.AddSupportedVideoCodecType("VP8"); + channel.reset(SetUpForExternalEncoderFactory()); } else { - engine_.Init(); channel.reset( engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); } @@ -500,11 +485,9 @@ TEST_F(WebRtcVideoEngineTest, DisablesFullEncoderTimeForNonExternalEncoders) { #if !defined(RTC_DISABLE_VP9) TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP9"); + encoder_factory_.AddSupportedVideoCodecType("VP9"); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); EXPECT_TRUE( channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc))); @@ -512,12 +495,10 @@ TEST_F(WebRtcVideoEngineTest, CanConstructDecoderForVp9EncoderFactory) { #endif // !defined(RTC_DISABLE_VP9) TEST_F(WebRtcVideoEngineTest, PropagatesInputFrameTimestamp) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("VP8"); FakeCall* fake_call = new FakeCall(webrtc::Call::Config(&event_log_)); call_.reset(fake_call); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); EXPECT_TRUE( channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); @@ -578,16 +559,12 @@ cricket::VideoCodec WebRtcVideoEngineTest::GetEngineCodec( return cricket::VideoCodec(); } -VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalEncoderFactory( - cricket::WebRtcVideoEncoderFactory* encoder_factory) { - engine_.SetExternalEncoderFactory(encoder_factory); - engine_.Init(); - +VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalEncoderFactory() { VideoMediaChannel* channel = engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()); cricket::VideoSendParameters parameters; // We need to look up the codec in the engine to get the correct payload type. - for (const VideoCodec& codec : encoder_factory->supported_codecs()) + for (const VideoCodec& codec : encoder_factory_.supported_codecs()) parameters.codecs.push_back(GetEngineCodec(codec.name)); EXPECT_TRUE(channel->SetSendParameters(parameters)); @@ -596,11 +573,7 @@ VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalEncoderFactory( } VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalDecoderFactory( - cricket::WebRtcVideoDecoderFactory* decoder_factory, const std::vector& codecs) { - engine_.SetExternalDecoderFactory(decoder_factory); - engine_.Init(); - VideoMediaChannel* channel = engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions()); cricket::VideoRecvParameters parameters; @@ -611,11 +584,9 @@ VideoMediaChannel* WebRtcVideoEngineTest::SetUpForExternalDecoderFactory( } TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("VP8"); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); std::vector ssrcs = MAKE_VECTOR(kSsrcs3); @@ -629,15 +600,15 @@ TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) { capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); - ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); + ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2)); // Verify that encoders are configured for simulcast through adapter // (increasing resolution and only configured to send one stream each). int prev_width = -1; - for (size_t i = 0; i < encoder_factory.encoders().size(); ++i) { - ASSERT_TRUE(encoder_factory.encoders()[i]->WaitForInitEncode()); + for (size_t i = 0; i < encoder_factory_.encoders().size(); ++i) { + ASSERT_TRUE(encoder_factory_.encoders()[i]->WaitForInitEncode()); webrtc::VideoCodec codec_settings = - encoder_factory.encoders()[i]->GetCodecSettings(); + encoder_factory_.encoders()[i]->GetCodecSettings(); EXPECT_EQ(0, codec_settings.numberOfSimulcastStreams); EXPECT_GT(codec_settings.width, prev_width); prev_width = codec_settings.width; @@ -646,33 +617,27 @@ TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8Factories) { EXPECT_TRUE(channel->SetVideoSend(ssrcs.front(), true, nullptr, nullptr)); channel.reset(); - ASSERT_EQ(0u, encoder_factory.encoders().size()); + ASSERT_EQ(0u, encoder_factory_.encoders().size()); } TEST_F(WebRtcVideoEngineTest, ChannelWithExternalH264CanChangeToInternalVp8) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("H264"); + encoder_factory_.AddSupportedVideoCodecType("H264"); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); EXPECT_TRUE( channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); - ASSERT_EQ(1u, encoder_factory.encoders().size()); + ASSERT_EQ(1u, encoder_factory_.encoders().size()); cricket::VideoSendParameters parameters; parameters.codecs.push_back(GetEngineCodec("VP8")); EXPECT_TRUE(channel->SetSendParameters(parameters)); - ASSERT_EQ(0u, encoder_factory.encoders().size()); + ASSERT_EQ(0u, encoder_factory_.encoders().size()); } TEST_F(WebRtcVideoEngineTest, DontUseExternalEncoderFactoryForUnsupportedCodecs) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("H264"); - - engine_.SetExternalEncoderFactory(&encoder_factory); - engine_.Init(); + encoder_factory_.AddSupportedVideoCodecType("H264"); std::unique_ptr channel( engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); @@ -683,17 +648,13 @@ TEST_F(WebRtcVideoEngineTest, EXPECT_TRUE( channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); // Make sure DestroyVideoEncoder was called on the factory. - ASSERT_EQ(0u, encoder_factory.encoders().size()); + ASSERT_EQ(0u, encoder_factory_.encoders().size()); } TEST_F(WebRtcVideoEngineTest, UsesSimulcastAdapterForVp8WithCombinedVP8AndH264Factory) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); - encoder_factory.AddSupportedVideoCodecType("H264"); - - engine_.SetExternalEncoderFactory(&encoder_factory); - engine_.Init(); + encoder_factory_.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("H264"); std::unique_ptr channel( engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); @@ -716,24 +677,20 @@ TEST_F(WebRtcVideoEngineTest, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); - ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); - ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); + ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2)); + ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode()); EXPECT_EQ(webrtc::kVideoCodecVP8, - encoder_factory.encoders()[0]->GetCodecSettings().codecType); + encoder_factory_.encoders()[0]->GetCodecSettings().codecType); channel.reset(); // Make sure DestroyVideoEncoder was called on the factory. - EXPECT_EQ(0u, encoder_factory.encoders().size()); + EXPECT_EQ(0u, encoder_factory_.encoders().size()); } TEST_F(WebRtcVideoEngineTest, DestroysNonSimulcastEncoderFromCombinedVP8AndH264Factory) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); - encoder_factory.AddSupportedVideoCodecType("H264"); - - engine_.SetExternalEncoderFactory(&encoder_factory); - engine_.Init(); + encoder_factory_.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("H264"); std::unique_ptr channel( engine_.CreateChannel(call_.get(), GetMediaConfig(), VideoOptions())); @@ -743,7 +700,7 @@ TEST_F(WebRtcVideoEngineTest, EXPECT_TRUE( channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); - ASSERT_EQ(1u, encoder_factory.encoders().size()); + ASSERT_EQ(1u, encoder_factory_.encoders().size()); // Send a frame of 720p. This should trigger a "real" encoder initialization. cricket::VideoFormat format( @@ -752,21 +709,19 @@ TEST_F(WebRtcVideoEngineTest, EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, nullptr, &capturer)); EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format)); EXPECT_TRUE(capturer.CaptureFrame()); - ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); + ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode()); EXPECT_EQ(webrtc::kVideoCodecH264, - encoder_factory.encoders()[0]->GetCodecSettings().codecType); + encoder_factory_.encoders()[0]->GetCodecSettings().codecType); channel.reset(); // Make sure DestroyVideoEncoder was called on the factory. - ASSERT_EQ(0u, encoder_factory.encoders().size()); + ASSERT_EQ(0u, encoder_factory_.encoders().size()); } TEST_F(WebRtcVideoEngineTest, SimulcastDisabledForH264) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("H264"); + encoder_factory_.AddSupportedVideoCodecType("H264"); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); const std::vector ssrcs = MAKE_VECTOR(kSsrcs3); EXPECT_TRUE( @@ -780,9 +735,9 @@ TEST_F(WebRtcVideoEngineTest, SimulcastDisabledForH264) { EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(format)); EXPECT_TRUE(capturer.CaptureFrame()); - ASSERT_EQ(1u, encoder_factory.encoders().size()); - FakeWebRtcVideoEncoder* encoder = encoder_factory.encoders()[0]; - ASSERT_TRUE(encoder_factory.encoders()[0]->WaitForInitEncode()); + ASSERT_EQ(1u, encoder_factory_.encoders().size()); + FakeWebRtcVideoEncoder* encoder = encoder_factory_.encoders()[0]; + ASSERT_TRUE(encoder_factory_.encoders()[0]->WaitForInitEncode()); EXPECT_EQ(webrtc::kVideoCodecH264, encoder->GetCodecSettings().codecType); EXPECT_EQ(1u, encoder->GetCodecSettings().numberOfSimulcastStreams); EXPECT_TRUE(channel->SetVideoSend(ssrcs[0], true, nullptr, nullptr)); @@ -801,7 +756,6 @@ TEST_F(WebRtcVideoEngineTest, }; // FlexFEC is not active without field trial. - engine_.Init(); const std::vector codecs_before = engine_.codecs(); EXPECT_EQ(codecs_before.end(), std::find_if(codecs_before.begin(), codecs_before.end(), is_flexfec)); @@ -816,10 +770,7 @@ TEST_F(WebRtcVideoEngineTest, // Test that external codecs are added to the end of the supported codec list. TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecs) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("FakeExternalCodec"); - engine_.SetExternalEncoderFactory(&encoder_factory); - engine_.Init(); + encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec"); std::vector codecs(engine_.codecs()); ASSERT_GE(codecs.size(), 2u); @@ -835,42 +786,38 @@ TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecs) { // does show up in the codec list after it was added. TEST_F(WebRtcVideoEngineTest, ReportSupportedExternalCodecsWithAddedCodec) { // Set up external encoder factory with first codec, and initialize engine. - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("FakeExternalCodec1"); - engine_.SetExternalEncoderFactory(&encoder_factory); - engine_.Init(); + encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec1"); // The first external codec will appear last in the vector. std::vector codecs_before(engine_.codecs()); EXPECT_EQ("FakeExternalCodec1", codecs_before.back().name); // Add second codec. - encoder_factory.AddSupportedVideoCodecType("FakeExternalCodec2"); + encoder_factory_.AddSupportedVideoCodecType("FakeExternalCodec2"); std::vector codecs_after(engine_.codecs()); EXPECT_EQ(codecs_before.size() + 1, codecs_after.size()); EXPECT_EQ("FakeExternalCodec2", codecs_after.back().name); } TEST_F(WebRtcVideoEngineTest, RegisterExternalDecodersIfSupported) { - cricket::FakeWebRtcVideoDecoderFactory decoder_factory; - decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8); + decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8); cricket::VideoRecvParameters parameters; parameters.codecs.push_back(GetEngineCodec("VP8")); std::unique_ptr channel( - SetUpForExternalDecoderFactory(&decoder_factory, parameters.codecs)); + SetUpForExternalDecoderFactory(parameters.codecs)); EXPECT_TRUE( channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc))); - ASSERT_EQ(1u, decoder_factory.decoders().size()); + ASSERT_EQ(1u, decoder_factory_.decoders().size()); // Setting codecs of the same type should not reallocate the decoder. EXPECT_TRUE(channel->SetRecvParameters(parameters)); - EXPECT_EQ(1, decoder_factory.GetNumCreatedDecoders()); + EXPECT_EQ(1, decoder_factory_.GetNumCreatedDecoders()); // Remove stream previously added to free the external decoder instance. EXPECT_TRUE(channel->RemoveRecvStream(kSsrc)); - EXPECT_EQ(0u, decoder_factory.decoders().size()); + EXPECT_EQ(0u, decoder_factory_.decoders().size()); } // Verifies that we can set up decoders that are not internally supported. @@ -879,20 +826,17 @@ TEST_F(WebRtcVideoEngineTest, RegisterExternalH264DecoderIfSupported) { // can't even query the WebRtcVideoDecoderFactory for supported codecs. // For now we add a FakeWebRtcVideoEncoderFactory to add H264 to supported // codecs. - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("H264"); - engine_.SetExternalEncoderFactory(&encoder_factory); - cricket::FakeWebRtcVideoDecoderFactory decoder_factory; - decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecH264); + encoder_factory_.AddSupportedVideoCodecType("H264"); + decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecH264); std::vector codecs; codecs.push_back(GetEngineCodec("H264")); std::unique_ptr channel( - SetUpForExternalDecoderFactory(&decoder_factory, codecs)); + SetUpForExternalDecoderFactory(codecs)); EXPECT_TRUE( channel->AddRecvStream(cricket::StreamParams::CreateLegacy(kSsrc))); - ASSERT_EQ(1u, decoder_factory.decoders().size()); + ASSERT_EQ(1u, decoder_factory_.decoders().size()); } class WebRtcVideoChannelBaseTest @@ -915,31 +859,28 @@ class WebRtcVideoChannelBaseTest // Verifies that id given in stream params is passed to the decoder factory. TEST_F(WebRtcVideoEngineTest, StreamParamsIdPassedToDecoderFactory) { - cricket::FakeWebRtcVideoDecoderFactory decoder_factory; - decoder_factory.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8); + decoder_factory_.AddSupportedVideoCodecType(webrtc::kVideoCodecVP8); cricket::VideoRecvParameters parameters; parameters.codecs.push_back(GetEngineCodec("VP8")); std::unique_ptr channel( - SetUpForExternalDecoderFactory(&decoder_factory, parameters.codecs)); + SetUpForExternalDecoderFactory(parameters.codecs)); StreamParams sp = cricket::StreamParams::CreateLegacy(kSsrc); sp.id = "FakeStreamParamsId"; EXPECT_TRUE(channel->AddRecvStream(sp)); - EXPECT_EQ(1u, decoder_factory.decoders().size()); + EXPECT_EQ(1u, decoder_factory_.decoders().size()); - std::vector params = decoder_factory.params(); + std::vector params = decoder_factory_.params(); ASSERT_EQ(1u, params.size()); EXPECT_EQ(sp.id, params[0].receive_stream_id); } TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) { - cricket::FakeWebRtcVideoEncoderFactory encoder_factory; - encoder_factory.AddSupportedVideoCodecType("VP8"); + encoder_factory_.AddSupportedVideoCodecType("VP8"); std::unique_ptr fake_call( new FakeCall(webrtc::Call::Config(&event_log_))); - std::unique_ptr channel( - SetUpForExternalEncoderFactory(&encoder_factory)); + std::unique_ptr channel(SetUpForExternalEncoderFactory()); ASSERT_TRUE( channel->AddSendStream(cricket::StreamParams::CreateLegacy(kSsrc))); cricket::VideoCodec codec = GetEngineCodec("VP8"); @@ -956,14 +897,14 @@ TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) { EXPECT_EQ(cricket::CS_RUNNING, capturer.Start(capturer.GetSupportedFormats()->front())); EXPECT_TRUE(capturer.CaptureFrame()); - ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(1)); + ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(1)); EXPECT_EQ(webrtc::kRealtimeVideo, - encoder_factory.encoders().back()->GetCodecSettings().mode); + encoder_factory_.encoders().back()->GetCodecSettings().mode); EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); EXPECT_TRUE(capturer.CaptureFrame()); // No change in content type, keep current encoder. - EXPECT_EQ(1, encoder_factory.GetNumCreatedEncoders()); + EXPECT_EQ(1, encoder_factory_.GetNumCreatedEncoders()); options.is_screencast.emplace(true); EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); @@ -971,14 +912,14 @@ TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) { // Change to screen content, recreate encoder. For the simulcast encoder // adapter case, this will result in two calls since InitEncode triggers a // a new instance. - ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(2)); + ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(2)); EXPECT_EQ(webrtc::kScreensharing, - encoder_factory.encoders().back()->GetCodecSettings().mode); + encoder_factory_.encoders().back()->GetCodecSettings().mode); EXPECT_TRUE(channel->SetVideoSend(kSsrc, true, &options, &capturer)); EXPECT_TRUE(capturer.CaptureFrame()); // Still screen content, no need to update encoder. - EXPECT_EQ(2, encoder_factory.GetNumCreatedEncoders()); + EXPECT_EQ(2, encoder_factory_.GetNumCreatedEncoders()); options.is_screencast.emplace(false); options.video_noise_reduction.emplace(false); @@ -986,13 +927,13 @@ TEST_F(WebRtcVideoEngineTest, DISABLED_RecreatesEncoderOnContentTypeChange) { // Change back to regular video content, update encoder. Also change // a non |is_screencast| option just to verify it doesn't affect recreation. EXPECT_TRUE(capturer.CaptureFrame()); - ASSERT_TRUE(encoder_factory.WaitForCreatedVideoEncoders(3)); + ASSERT_TRUE(encoder_factory_.WaitForCreatedVideoEncoders(3)); EXPECT_EQ(webrtc::kRealtimeVideo, - encoder_factory.encoders().back()->GetCodecSettings().mode); + encoder_factory_.encoders().back()->GetCodecSettings().mode); // Remove stream previously added to free the external encoder instance. EXPECT_TRUE(channel->RemoveSendStream(kSsrc)); - EXPECT_EQ(0u, encoder_factory.encoders().size()); + EXPECT_EQ(0u, encoder_factory_.encoders().size()); } #define WEBRTC_BASE_TEST(test) \ @@ -1060,7 +1001,6 @@ class WebRtcVideoChannelTest : public WebRtcVideoEngineTest { : WebRtcVideoEngineTest(field_trials), last_ssrc_(0) {} void SetUp() override { fake_call_.reset(new FakeCall(webrtc::Call::Config(&event_log_))); - engine_.Init(); channel_.reset(engine_.CreateChannel(fake_call_.get(), GetMediaConfig(), VideoOptions())); channel_->OnReadyToSend(true); @@ -1979,19 +1919,11 @@ class Vp9SettingsTest : public WebRtcVideoChannelTest { virtual ~Vp9SettingsTest() {} protected: - void SetUp() override { - engine_.SetExternalEncoderFactory(&encoder_factory_); - - WebRtcVideoChannelTest::SetUp(); - } - void TearDown() override { // Remove references to encoder_factory_ since this will be destroyed // before channel_ and engine_. ASSERT_TRUE(channel_->SetSendParameters(send_parameters_)); } - - cricket::FakeWebRtcVideoEncoderFactory encoder_factory_; }; TEST_F(Vp9SettingsTest, VerifyVp9SpecificSettings) { @@ -4498,10 +4430,11 @@ TEST_F(WebRtcVideoChannelTest, ConfiguresLocalSsrcOnExistingReceivers) { class WebRtcVideoChannelSimulcastTest : public testing::Test { public: WebRtcVideoChannelSimulcastTest() - : fake_call_(webrtc::Call::Config(&event_log_)), last_ssrc_(0) {} + : fake_call_(webrtc::Call::Config(&event_log_)), + engine_(&encoder_factory_, &decoder_factory_), + last_ssrc_(0) {} void SetUp() override { - engine_.Init(); channel_.reset( engine_.CreateChannel(&fake_call_, GetMediaConfig(), VideoOptions())); channel_->OnReadyToSend(true); @@ -4657,6 +4590,8 @@ class WebRtcVideoChannelSimulcastTest : public testing::Test { webrtc::RtcEventLogNullImpl event_log_; FakeCall fake_call_; + cricket::FakeWebRtcVideoEncoderFactory encoder_factory_; + cricket::FakeWebRtcVideoDecoderFactory decoder_factory_; WebRtcVideoEngine engine_; std::unique_ptr channel_; uint32_t last_ssrc_;