Compared the original CL: https://webrtc-review.googlesource.com/c/src/+/94782 This new CL added backward compatible functions to WebRtcMediaEngineFactory so that internal projects will not be broken. Because of that, now we can revert all the changes to SDK and PeerConnection and do it in following CLs. This makes this CL cleaner. One temporary disadvantage of this is the media engine now need to take a dependency onto builtin video bitrate factory, but practically it just moved code around and should not result in a large binary size change. We can remove this dependency later if needed. Bug: webrtc:9513 Change-Id: I38708762ff365e4ca05974b99fac71edc739a756 Reviewed-on: https://webrtc-review.googlesource.com/c/109040 Commit-Queue: Jiawei Ou <ouj@fb.com> Reviewed-by: Kári Helgason <kthelgason@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Reviewed-by: Seth Hampson <shampson@webrtc.org> Reviewed-by: Sebastian Jansson <srte@webrtc.org> Cr-Commit-Position: refs/heads/master@{#25574}
307 lines
11 KiB
C++
307 lines
11 KiB
C++
/*
|
|
* 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 <memory>
|
|
#include <vector>
|
|
|
|
#include "api/test/video/function_video_decoder_factory.h"
|
|
#include "api/test/video/function_video_encoder_factory.h"
|
|
#include "api/video/video_bitrate_allocator_factory.h"
|
|
#include "call/call.h"
|
|
#include "call/rtp_transport_controller_send.h"
|
|
#include "logging/rtc_event_log/rtc_event_log.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/single_threaded_task_queue.h"
|
|
|
|
namespace webrtc {
|
|
namespace test {
|
|
|
|
class BaseTest;
|
|
|
|
class CallTest : public ::testing::Test {
|
|
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 const int kDefaultTimeoutMs;
|
|
static const int kLongTimeoutMs;
|
|
enum classPayloadTypes : uint8_t {
|
|
kSendRtxPayloadType = 98,
|
|
kRtxRedPayloadType = 99,
|
|
kVideoSendPayloadType = 100,
|
|
kAudioSendPayloadType = 103,
|
|
kRedPayloadType = 118,
|
|
kUlpfecPayloadType = 119,
|
|
kFlexfecPayloadType = 120,
|
|
kPayloadTypeH264 = 122,
|
|
kPayloadTypeVP8 = 123,
|
|
kPayloadTypeVP9 = 124,
|
|
kFakeVideoSendPayloadType = 125,
|
|
};
|
|
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<uint8_t, MediaType> payload_type_map_;
|
|
|
|
protected:
|
|
// 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<uint32_t> video_send_ssrcs);
|
|
void SetSendUlpFecConfig(VideoSendStream::Config* send_config);
|
|
void SetReceiveUlpFecConfig(VideoReceiveStream::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<size_t> decode_sub_stream,
|
|
bool receiver_reference_time_report,
|
|
int rtp_history_ms);
|
|
void AddMatchingVideoReceiveConfigs(
|
|
std::vector<VideoReceiveStream::Config>* receive_configs,
|
|
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);
|
|
|
|
void CreateMatchingAudioAndFecConfigs(Transport* rtcp_send_transport);
|
|
void CreateMatchingAudioConfigs(Transport* transport, std::string sync_group);
|
|
static AudioReceiveStream::Config CreateMatchingAudioConfig(
|
|
const AudioSendStream::Config& send_config,
|
|
rtc::scoped_refptr<AudioDecoderFactory> 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<TestAudioDeviceModule::Capturer> capturer,
|
|
std::unique_ptr<TestAudioDeviceModule::Renderer> renderer);
|
|
|
|
void CreateVideoStreams();
|
|
void CreateVideoSendStreams();
|
|
void CreateVideoSendStream(const VideoEncoderConfig& encoder_config);
|
|
void CreateAudioStreams();
|
|
void CreateFlexfecStreams();
|
|
|
|
void ConnectVideoSourcesToStreams();
|
|
|
|
void AssociateFlexfecStreamsWithVideoStreams();
|
|
void DissociateFlexfecStreamsFromVideoStreams();
|
|
|
|
void Start();
|
|
void StartVideoStreams();
|
|
void StartVideoCapture();
|
|
void Stop();
|
|
void StopVideoCapture();
|
|
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();
|
|
|
|
Clock* const clock_;
|
|
|
|
std::unique_ptr<webrtc::RtcEventLog> send_event_log_;
|
|
std::unique_ptr<webrtc::RtcEventLog> recv_event_log_;
|
|
std::unique_ptr<Call> sender_call_;
|
|
RtpTransportControllerSend* sender_call_transport_controller_;
|
|
std::unique_ptr<PacketTransport> send_transport_;
|
|
std::vector<VideoSendStream::Config> video_send_configs_;
|
|
std::vector<VideoEncoderConfig> video_encoder_configs_;
|
|
std::vector<VideoSendStream*> video_send_streams_;
|
|
AudioSendStream::Config audio_send_config_;
|
|
AudioSendStream* audio_send_stream_;
|
|
|
|
std::unique_ptr<Call> receiver_call_;
|
|
std::unique_ptr<PacketTransport> receive_transport_;
|
|
std::vector<VideoReceiveStream::Config> video_receive_configs_;
|
|
std::vector<VideoReceiveStream*> video_receive_streams_;
|
|
std::vector<AudioReceiveStream::Config> audio_receive_configs_;
|
|
std::vector<AudioReceiveStream*> audio_receive_streams_;
|
|
std::vector<FlexfecReceiveStream::Config> flexfec_receive_configs_;
|
|
std::vector<FlexfecReceiveStream*> flexfec_receive_streams_;
|
|
|
|
test::FrameGeneratorCapturer* frame_generator_capturer_;
|
|
std::vector<rtc::VideoSourceInterface<VideoFrame>*> video_sources_;
|
|
std::vector<std::unique_ptr<TestVideoCapturer>> video_capturers_;
|
|
DegradationPreference degradation_preference_ =
|
|
DegradationPreference::MAINTAIN_FRAMERATE;
|
|
|
|
std::unique_ptr<FecControllerFactoryInterface> fec_controller_factory_;
|
|
std::unique_ptr<NetworkControllerFactoryInterface>
|
|
bbr_network_controller_factory_;
|
|
|
|
test::FunctionVideoEncoderFactory fake_encoder_factory_;
|
|
int fake_encoder_max_bitrate_ = -1;
|
|
test::FunctionVideoDecoderFactory fake_decoder_factory_;
|
|
std::unique_ptr<VideoBitrateAllocatorFactory> 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<AudioDecoderFactory> audio_decoder_factory_;
|
|
rtc::scoped_refptr<AudioEncoderFactory> audio_encoder_factory_;
|
|
test::FakeVideoRenderer fake_renderer_;
|
|
|
|
SingleThreadedTaskQueueForTesting task_queue_;
|
|
|
|
private:
|
|
rtc::scoped_refptr<AudioProcessing> apm_send_;
|
|
rtc::scoped_refptr<AudioProcessing> apm_recv_;
|
|
rtc::scoped_refptr<TestAudioDeviceModule> fake_send_audio_device_;
|
|
rtc::scoped_refptr<TestAudioDeviceModule> fake_recv_audio_device_;
|
|
};
|
|
|
|
class BaseTest : public RtpRtcpObserver {
|
|
public:
|
|
BaseTest();
|
|
explicit BaseTest(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<TestAudioDeviceModule::Capturer> CreateCapturer();
|
|
virtual std::unique_ptr<TestAudioDeviceModule::Renderer> CreateRenderer();
|
|
virtual void OnFakeAudioDevicesCreated(
|
|
TestAudioDeviceModule* send_audio_device,
|
|
TestAudioDeviceModule* recv_audio_device);
|
|
|
|
virtual void ModifySenderCallConfig(Call::Config* config);
|
|
virtual void ModifyReceiverCallConfig(Call::Config* config);
|
|
|
|
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<VideoReceiveStream::Config>* receive_configs,
|
|
VideoEncoderConfig* encoder_config);
|
|
virtual void ModifyVideoCaptureStartResolution(int* width,
|
|
int* heigt,
|
|
int* frame_rate);
|
|
virtual void OnVideoStreamsCreated(
|
|
VideoSendStream* send_stream,
|
|
const std::vector<VideoReceiveStream*>& receive_streams);
|
|
|
|
virtual void ModifyAudioConfigs(
|
|
AudioSendStream::Config* send_config,
|
|
std::vector<AudioReceiveStream::Config>* receive_configs);
|
|
virtual void OnAudioStreamsCreated(
|
|
AudioSendStream* send_stream,
|
|
const std::vector<AudioReceiveStream*>& receive_streams);
|
|
|
|
virtual void ModifyFlexfecConfigs(
|
|
std::vector<FlexfecReceiveStream::Config>* receive_configs);
|
|
virtual void OnFlexfecStreamsCreated(
|
|
const std::vector<FlexfecReceiveStream*>& receive_streams);
|
|
|
|
virtual void OnFrameGeneratorCapturerCreated(
|
|
FrameGeneratorCapturer* frame_generator_capturer);
|
|
|
|
virtual void OnStreamsStopped();
|
|
};
|
|
|
|
class SendTest : public BaseTest {
|
|
public:
|
|
explicit SendTest(int timeout_ms);
|
|
|
|
bool ShouldCreateReceivers() const override;
|
|
};
|
|
|
|
class EndToEndTest : public BaseTest {
|
|
public:
|
|
EndToEndTest();
|
|
explicit EndToEndTest(int timeout_ms);
|
|
|
|
bool ShouldCreateReceivers() const override;
|
|
};
|
|
|
|
} // namespace test
|
|
} // namespace webrtc
|
|
|
|
#endif // TEST_CALL_TEST_H_
|