/* * Copyright (c) 2014 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_CALL_TEST_H_ #define TEST_CALL_TEST_H_ #include #include #include #include #include "absl/types/optional.h" #include "api/rtc_event_log/rtc_event_log.h" #include "api/task_queue/task_queue_base.h" #include "api/task_queue/task_queue_factory.h" #include "api/test/video/function_video_decoder_factory.h" #include "api/test/video/function_video_encoder_factory.h" #include "api/units/time_delta.h" #include "api/video/video_bitrate_allocator_factory.h" #include "call/call.h" #include "modules/audio_device/include/test_audio_device.h" #include "test/encoder_settings.h" #include "test/fake_decoder.h" #include "test/fake_videorenderer.h" #include "test/fake_vp8_encoder.h" #include "test/frame_generator_capturer.h" #include "test/rtp_rtcp_observer.h" #include "test/run_loop.h" #include "test/scoped_key_value_config.h" namespace webrtc { namespace test { class BaseTest; class CallTest : public ::testing::Test, public RtpPacketSinkInterface { public: CallTest(); virtual ~CallTest(); static constexpr size_t kNumSsrcs = 6; static const int kNumSimulcastStreams = 3; static const int kDefaultWidth = 320; static const int kDefaultHeight = 180; static const int kDefaultFramerate = 30; static constexpr TimeDelta kDefaultTimeout = TimeDelta::Seconds(30); static constexpr TimeDelta kLongTimeout = TimeDelta::Seconds(120); enum classPayloadTypes : uint8_t { kSendRtxPayloadType = 98, kRtxRedPayloadType = 99, kVideoSendPayloadType = 100, kAudioSendPayloadType = 103, kRedPayloadType = 118, kUlpfecPayloadType = 119, kFlexfecPayloadType = 120, kPayloadTypeH264 = 122, kPayloadTypeVP8 = 123, kPayloadTypeVP9 = 124, kPayloadTypeGeneric = 125, kFakeVideoSendPayloadType = 126, }; static const uint32_t kSendRtxSsrcs[kNumSsrcs]; static const uint32_t kVideoSendSsrcs[kNumSsrcs]; static const uint32_t kAudioSendSsrc; static const uint32_t kFlexfecSendSsrc; static const uint32_t kReceiverLocalVideoSsrc; static const uint32_t kReceiverLocalAudioSsrc; static const int kNackRtpHistoryMs; static const std::map payload_type_map_; protected: void RegisterRtpExtension(const RtpExtension& extension); // RunBaseTest overwrites the audio_state of the send and receive Call configs // to simplify test code. void RunBaseTest(BaseTest* test); void CreateCalls(); void CreateCalls(const Call::Config& sender_config, const Call::Config& receiver_config); void CreateSenderCall(); void CreateSenderCall(const Call::Config& config); void CreateReceiverCall(const Call::Config& config); void DestroyCalls(); void CreateVideoSendConfig(VideoSendStream::Config* video_config, size_t num_video_streams, size_t num_used_ssrcs, Transport* send_transport); void CreateAudioAndFecSendConfigs(size_t num_audio_streams, size_t num_flexfec_streams, Transport* send_transport); void SetAudioConfig(const AudioSendStream::Config& config); void SetSendFecConfig(std::vector video_send_ssrcs); void SetSendUlpFecConfig(VideoSendStream::Config* send_config); void SetReceiveUlpFecConfig( VideoReceiveStreamInterface::Config* receive_config); void CreateSendConfig(size_t num_video_streams, size_t num_audio_streams, size_t num_flexfec_streams, Transport* send_transport); void CreateMatchingVideoReceiveConfigs( const VideoSendStream::Config& video_send_config, Transport* rtcp_send_transport); void CreateMatchingVideoReceiveConfigs( const VideoSendStream::Config& video_send_config, Transport* rtcp_send_transport, bool send_side_bwe, VideoDecoderFactory* decoder_factory, absl::optional decode_sub_stream, bool receiver_reference_time_report, int rtp_history_ms); void AddMatchingVideoReceiveConfigs( std::vector* receive_configs, const VideoSendStream::Config& video_send_config, Transport* rtcp_send_transport, bool send_side_bwe, VideoDecoderFactory* decoder_factory, absl::optional decode_sub_stream, bool receiver_reference_time_report, int rtp_history_ms); void CreateMatchingAudioAndFecConfigs(Transport* rtcp_send_transport); void CreateMatchingAudioConfigs(Transport* transport, std::string sync_group); static AudioReceiveStreamInterface::Config CreateMatchingAudioConfig( const AudioSendStream::Config& send_config, rtc::scoped_refptr audio_decoder_factory, Transport* transport, std::string sync_group); void CreateMatchingFecConfig( Transport* transport, const VideoSendStream::Config& video_send_config); void CreateMatchingReceiveConfigs(Transport* rtcp_send_transport); void CreateFrameGeneratorCapturerWithDrift(Clock* drift_clock, float speed, int framerate, int width, int height); void CreateFrameGeneratorCapturer(int framerate, int width, int height); void CreateFakeAudioDevices( std::unique_ptr capturer, std::unique_ptr renderer); void CreateVideoStreams(); void CreateVideoSendStreams(); void CreateVideoSendStream(const VideoEncoderConfig& encoder_config); void CreateAudioStreams(); void CreateFlexfecStreams(); void ConnectVideoSourcesToStreams(); void Start(); void StartVideoStreams(); void Stop(); void StopVideoStreams(); void DestroyStreams(); void DestroyVideoSendStreams(); void SetFakeVideoCaptureRotation(VideoRotation rotation); void SetVideoDegradation(DegradationPreference preference); VideoSendStream::Config* GetVideoSendConfig(); void SetVideoSendConfig(const VideoSendStream::Config& config); VideoEncoderConfig* GetVideoEncoderConfig(); void SetVideoEncoderConfig(const VideoEncoderConfig& config); VideoSendStream* GetVideoSendStream(); FlexfecReceiveStream::Config* GetFlexFecConfig(); TaskQueueBase* task_queue() { return task_queue_.get(); } // RtpPacketSinkInterface implementation. void OnRtpPacket(const RtpPacketReceived& packet) override; test::RunLoop loop_; Clock* const clock_; test::ScopedKeyValueConfig field_trials_; std::unique_ptr task_queue_factory_; std::unique_ptr send_event_log_; std::unique_ptr recv_event_log_; std::unique_ptr sender_call_; std::unique_ptr send_transport_; std::vector video_send_configs_; std::vector video_encoder_configs_; std::vector video_send_streams_; AudioSendStream::Config audio_send_config_; AudioSendStream* audio_send_stream_; std::unique_ptr receiver_call_; std::unique_ptr receive_transport_; std::vector video_receive_configs_; std::vector video_receive_streams_; std::vector audio_receive_configs_; std::vector audio_receive_streams_; std::vector flexfec_receive_configs_; std::vector flexfec_receive_streams_; test::FrameGeneratorCapturer* frame_generator_capturer_; std::vector>> video_sources_; DegradationPreference degradation_preference_ = DegradationPreference::MAINTAIN_FRAMERATE; std::unique_ptr fec_controller_factory_; std::unique_ptr network_state_predictor_factory_; std::unique_ptr network_controller_factory_; test::FunctionVideoEncoderFactory fake_encoder_factory_; int fake_encoder_max_bitrate_ = -1; test::FunctionVideoDecoderFactory fake_decoder_factory_; std::unique_ptr bitrate_allocator_factory_; // Number of simulcast substreams. size_t num_video_streams_; size_t num_audio_streams_; size_t num_flexfec_streams_; rtc::scoped_refptr audio_decoder_factory_; rtc::scoped_refptr audio_encoder_factory_; test::FakeVideoRenderer fake_renderer_; private: absl::optional GetRtpExtensionByUri( const std::string& uri) const; void AddRtpExtensionByUri(const std::string& uri, std::vector* extensions) const; std::unique_ptr task_queue_; std::vector rtp_extensions_; rtc::scoped_refptr apm_send_; rtc::scoped_refptr apm_recv_; rtc::scoped_refptr fake_send_audio_device_; rtc::scoped_refptr fake_recv_audio_device_; }; class BaseTest : public RtpRtcpObserver { public: BaseTest(); explicit BaseTest(TimeDelta timeout); virtual ~BaseTest(); virtual void PerformTest() = 0; virtual bool ShouldCreateReceivers() const = 0; virtual size_t GetNumVideoStreams() const; virtual size_t GetNumAudioStreams() const; virtual size_t GetNumFlexfecStreams() const; virtual std::unique_ptr CreateCapturer(); virtual std::unique_ptr CreateRenderer(); virtual void OnFakeAudioDevicesCreated( TestAudioDeviceModule* send_audio_device, TestAudioDeviceModule* recv_audio_device); virtual void ModifySenderBitrateConfig(BitrateConstraints* bitrate_config); virtual void ModifyReceiverBitrateConfig(BitrateConstraints* bitrate_config); virtual void OnCallsCreated(Call* sender_call, Call* receiver_call); virtual std::unique_ptr CreateSendTransport( TaskQueueBase* task_queue, Call* sender_call); virtual std::unique_ptr CreateReceiveTransport( TaskQueueBase* task_queue); virtual void ModifyVideoConfigs( VideoSendStream::Config* send_config, std::vector* receive_configs, VideoEncoderConfig* encoder_config); virtual void ModifyVideoCaptureStartResolution(int* width, int* heigt, int* frame_rate); virtual void ModifyVideoDegradationPreference( DegradationPreference* degradation_preference); virtual void OnVideoStreamsCreated( VideoSendStream* send_stream, const std::vector& receive_streams); virtual void ModifyAudioConfigs( AudioSendStream::Config* send_config, std::vector* receive_configs); virtual void OnAudioStreamsCreated( AudioSendStream* send_stream, const std::vector& receive_streams); virtual void ModifyFlexfecConfigs( std::vector* receive_configs); virtual void OnFlexfecStreamsCreated( const std::vector& receive_streams); virtual void OnFrameGeneratorCapturerCreated( FrameGeneratorCapturer* frame_generator_capturer); virtual void OnStreamsStopped(); }; class SendTest : public BaseTest { public: explicit SendTest(TimeDelta timeout); bool ShouldCreateReceivers() const override; }; class EndToEndTest : public BaseTest { public: EndToEndTest(); explicit EndToEndTest(TimeDelta timeout); bool ShouldCreateReceivers() const override; }; } // namespace test } // namespace webrtc #endif // TEST_CALL_TEST_H_