/* * 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 "call/call.h" #include "call/rtp_transport_controller_send.h" #include "logging/rtc_event_log/rtc_event_log.h" #include "test/encoder_settings.h" #include "test/fake_audio_device.h" #include "test/fake_decoder.h" #include "test/fake_encoder.h" #include "test/fake_videorenderer.h" #include "test/frame_generator_capturer.h" #include "test/rtp_rtcp_observer.h" #include "test/single_threaded_task_queue.h" namespace webrtc { class VoEBase; namespace test { class BaseTest; class CallTest : public ::testing::Test { public: CallTest(); virtual ~CallTest(); static const size_t kNumSsrcs = 3; static const int kDefaultWidth = 320; static const int kDefaultHeight = 180; static const int kDefaultFramerate = 30; static const int kDefaultTimeoutMs; static const int kLongTimeoutMs; static const uint8_t kVideoSendPayloadType; static const uint8_t kSendRtxPayloadType; static const uint8_t kFakeVideoSendPayloadType; static const uint8_t kRedPayloadType; static const uint8_t kRtxRedPayloadType; static const uint8_t kUlpfecPayloadType; static const uint8_t kFlexfecPayloadType; static const uint8_t kAudioSendPayloadType; static const uint8_t kPayloadTypeH264; static const uint8_t kPayloadTypeVP8; static const uint8_t kPayloadTypeVP9; 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 uint8_t kDefaultKeepalivePayloadType; static const std::map payload_type_map_; protected: // RunBaseTest overwrites the audio_state and the voice_engine of the send and // receive Call configs to simplify test code and avoid having old VoiceEngine // APIs in the tests. void RunBaseTest(BaseTest* test); void CreateCalls(const Call::Config& sender_config, const Call::Config& receiver_config); void CreateSenderCall(const Call::Config& config); void CreateReceiverCall(const Call::Config& config); void DestroyCalls(); void CreateSendConfig(size_t num_video_streams, size_t num_audio_streams, size_t num_flexfec_streams, Transport* send_transport); 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 CreateAudioStreams(); void CreateFlexfecStreams(); void AssociateFlexfecStreamsWithVideoStreams(); void DissociateFlexfecStreamsFromVideoStreams(); void Start(); void Stop(); void DestroyStreams(); void SetFakeVideoCaptureRotation(VideoRotation rotation); Clock* const clock_; std::unique_ptr event_log_; std::unique_ptr sender_call_; RtpTransportControllerSend* sender_call_transport_controller_; std::unique_ptr send_transport_; VideoSendStream::Config video_send_config_; VideoEncoderConfig video_encoder_config_; VideoSendStream* video_send_stream_; 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_; std::unique_ptr frame_generator_capturer_; test::FakeEncoder fake_encoder_; std::vector> allocated_decoders_; size_t num_video_streams_; size_t num_audio_streams_; size_t num_flexfec_streams_; rtc::scoped_refptr decoder_factory_; rtc::scoped_refptr encoder_factory_; test::FakeVideoRenderer fake_renderer_; SingleThreadedTaskQueueForTesting task_queue_; private: // TODO(holmer): Remove once VoiceEngine is fully refactored to the new API. // These methods are used to set up legacy voice engines and channels which is // necessary while voice engine is being refactored to the new stream API. struct VoiceEngineState { VoiceEngineState() : voice_engine(nullptr), base(nullptr), channel_id(-1) {} VoiceEngine* voice_engine; VoEBase* base; int channel_id; }; void CreateVoiceEngines(); void DestroyVoiceEngines(); VoiceEngineState voe_send_; VoiceEngineState voe_recv_; rtc::scoped_refptr apm_send_; rtc::scoped_refptr apm_recv_; // The audio devices must outlive the voice engines. std::unique_ptr fake_send_audio_device_; std::unique_ptr fake_recv_audio_device_; }; class BaseTest : public RtpRtcpObserver { public: BaseTest(); explicit BaseTest(unsigned int timeout_ms); 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(FakeAudioDevice* send_audio_device, FakeAudioDevice* recv_audio_device); virtual Call::Config GetSenderCallConfig(); virtual Call::Config GetReceiverCallConfig(); virtual void OnRtpTransportControllerSendCreated( RtpTransportControllerSend* controller); virtual void OnCallsCreated(Call* sender_call, Call* receiver_call); virtual test::PacketTransport* CreateSendTransport( SingleThreadedTaskQueueForTesting* task_queue, Call* sender_call); virtual test::PacketTransport* CreateReceiveTransport( SingleThreadedTaskQueueForTesting* 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 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(); std::unique_ptr event_log_; }; class SendTest : public BaseTest { public: explicit SendTest(unsigned int timeout_ms); bool ShouldCreateReceivers() const override; }; class EndToEndTest : public BaseTest { public: EndToEndTest(); explicit EndToEndTest(unsigned int timeout_ms); bool ShouldCreateReceivers() const override; }; } // namespace test } // namespace webrtc #endif // TEST_CALL_TEST_H_