1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef CALL_DEGRADED_CALL_H_ 12*d9f75844SAndroid Build Coastguard Worker #define CALL_DEGRADED_CALL_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h> 15*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 16*d9f75844SAndroid Build Coastguard Worker 17*d9f75844SAndroid Build Coastguard Worker #include <map> 18*d9f75844SAndroid Build Coastguard Worker #include <memory> 19*d9f75844SAndroid Build Coastguard Worker #include <string> 20*d9f75844SAndroid Build Coastguard Worker #include <vector> 21*d9f75844SAndroid Build Coastguard Worker 22*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 23*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/call/transport.h" 25*d9f75844SAndroid Build Coastguard Worker #include "api/fec_controller.h" 26*d9f75844SAndroid Build Coastguard Worker #include "api/media_types.h" 27*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_headers.h" 28*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/pending_task_safety_flag.h" 29*d9f75844SAndroid Build Coastguard Worker #include "api/test/simulated_network.h" 30*d9f75844SAndroid Build Coastguard Worker #include "call/audio_receive_stream.h" 31*d9f75844SAndroid Build Coastguard Worker #include "call/audio_send_stream.h" 32*d9f75844SAndroid Build Coastguard Worker #include "call/call.h" 33*d9f75844SAndroid Build Coastguard Worker #include "call/fake_network_pipe.h" 34*d9f75844SAndroid Build Coastguard Worker #include "call/flexfec_receive_stream.h" 35*d9f75844SAndroid Build Coastguard Worker #include "call/packet_receiver.h" 36*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_transport_controller_send_interface.h" 37*d9f75844SAndroid Build Coastguard Worker #include "call/simulated_network.h" 38*d9f75844SAndroid Build Coastguard Worker #include "call/video_receive_stream.h" 39*d9f75844SAndroid Build Coastguard Worker #include "call/video_send_stream.h" 40*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/copy_on_write_buffer.h" 41*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network/sent_packet.h" 42*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/task_queue.h" 43*d9f75844SAndroid Build Coastguard Worker #include "system_wrappers/include/clock.h" 44*d9f75844SAndroid Build Coastguard Worker #include "video/config/video_encoder_config.h" 45*d9f75844SAndroid Build Coastguard Worker 46*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 47*d9f75844SAndroid Build Coastguard Worker class DegradedCall : public Call, private PacketReceiver { 48*d9f75844SAndroid Build Coastguard Worker public: 49*d9f75844SAndroid Build Coastguard Worker struct TimeScopedNetworkConfig : public BuiltInNetworkBehaviorConfig { 50*d9f75844SAndroid Build Coastguard Worker TimeDelta duration = TimeDelta::PlusInfinity(); 51*d9f75844SAndroid Build Coastguard Worker }; 52*d9f75844SAndroid Build Coastguard Worker 53*d9f75844SAndroid Build Coastguard Worker explicit DegradedCall( 54*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<Call> call, 55*d9f75844SAndroid Build Coastguard Worker const std::vector<TimeScopedNetworkConfig>& send_configs, 56*d9f75844SAndroid Build Coastguard Worker const std::vector<TimeScopedNetworkConfig>& receive_configs); 57*d9f75844SAndroid Build Coastguard Worker ~DegradedCall() override; 58*d9f75844SAndroid Build Coastguard Worker 59*d9f75844SAndroid Build Coastguard Worker // Implements Call. 60*d9f75844SAndroid Build Coastguard Worker AudioSendStream* CreateAudioSendStream( 61*d9f75844SAndroid Build Coastguard Worker const AudioSendStream::Config& config) override; 62*d9f75844SAndroid Build Coastguard Worker void DestroyAudioSendStream(AudioSendStream* send_stream) override; 63*d9f75844SAndroid Build Coastguard Worker 64*d9f75844SAndroid Build Coastguard Worker AudioReceiveStreamInterface* CreateAudioReceiveStream( 65*d9f75844SAndroid Build Coastguard Worker const AudioReceiveStreamInterface::Config& config) override; 66*d9f75844SAndroid Build Coastguard Worker void DestroyAudioReceiveStream( 67*d9f75844SAndroid Build Coastguard Worker AudioReceiveStreamInterface* receive_stream) override; 68*d9f75844SAndroid Build Coastguard Worker 69*d9f75844SAndroid Build Coastguard Worker VideoSendStream* CreateVideoSendStream( 70*d9f75844SAndroid Build Coastguard Worker VideoSendStream::Config config, 71*d9f75844SAndroid Build Coastguard Worker VideoEncoderConfig encoder_config) override; 72*d9f75844SAndroid Build Coastguard Worker VideoSendStream* CreateVideoSendStream( 73*d9f75844SAndroid Build Coastguard Worker VideoSendStream::Config config, 74*d9f75844SAndroid Build Coastguard Worker VideoEncoderConfig encoder_config, 75*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<FecController> fec_controller) override; 76*d9f75844SAndroid Build Coastguard Worker void DestroyVideoSendStream(VideoSendStream* send_stream) override; 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker VideoReceiveStreamInterface* CreateVideoReceiveStream( 79*d9f75844SAndroid Build Coastguard Worker VideoReceiveStreamInterface::Config configuration) override; 80*d9f75844SAndroid Build Coastguard Worker void DestroyVideoReceiveStream( 81*d9f75844SAndroid Build Coastguard Worker VideoReceiveStreamInterface* receive_stream) override; 82*d9f75844SAndroid Build Coastguard Worker 83*d9f75844SAndroid Build Coastguard Worker FlexfecReceiveStream* CreateFlexfecReceiveStream( 84*d9f75844SAndroid Build Coastguard Worker const FlexfecReceiveStream::Config config) override; 85*d9f75844SAndroid Build Coastguard Worker void DestroyFlexfecReceiveStream( 86*d9f75844SAndroid Build Coastguard Worker FlexfecReceiveStream* receive_stream) override; 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker void AddAdaptationResource(rtc::scoped_refptr<Resource> resource) override; 89*d9f75844SAndroid Build Coastguard Worker 90*d9f75844SAndroid Build Coastguard Worker PacketReceiver* Receiver() override; 91*d9f75844SAndroid Build Coastguard Worker 92*d9f75844SAndroid Build Coastguard Worker RtpTransportControllerSendInterface* GetTransportControllerSend() override; 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker Stats GetStats() const override; 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker const FieldTrialsView& trials() const override; 97*d9f75844SAndroid Build Coastguard Worker 98*d9f75844SAndroid Build Coastguard Worker TaskQueueBase* network_thread() const override; 99*d9f75844SAndroid Build Coastguard Worker TaskQueueBase* worker_thread() const override; 100*d9f75844SAndroid Build Coastguard Worker 101*d9f75844SAndroid Build Coastguard Worker void SignalChannelNetworkState(MediaType media, NetworkState state) override; 102*d9f75844SAndroid Build Coastguard Worker void OnAudioTransportOverheadChanged( 103*d9f75844SAndroid Build Coastguard Worker int transport_overhead_per_packet) override; 104*d9f75844SAndroid Build Coastguard Worker void OnLocalSsrcUpdated(AudioReceiveStreamInterface& stream, 105*d9f75844SAndroid Build Coastguard Worker uint32_t local_ssrc) override; 106*d9f75844SAndroid Build Coastguard Worker void OnLocalSsrcUpdated(VideoReceiveStreamInterface& stream, 107*d9f75844SAndroid Build Coastguard Worker uint32_t local_ssrc) override; 108*d9f75844SAndroid Build Coastguard Worker void OnLocalSsrcUpdated(FlexfecReceiveStream& stream, 109*d9f75844SAndroid Build Coastguard Worker uint32_t local_ssrc) override; 110*d9f75844SAndroid Build Coastguard Worker void OnUpdateSyncGroup(AudioReceiveStreamInterface& stream, 111*d9f75844SAndroid Build Coastguard Worker absl::string_view sync_group) override; 112*d9f75844SAndroid Build Coastguard Worker void OnSentPacket(const rtc::SentPacket& sent_packet) override; 113*d9f75844SAndroid Build Coastguard Worker 114*d9f75844SAndroid Build Coastguard Worker protected: 115*d9f75844SAndroid Build Coastguard Worker // Implements PacketReceiver. 116*d9f75844SAndroid Build Coastguard Worker DeliveryStatus DeliverPacket(MediaType media_type, 117*d9f75844SAndroid Build Coastguard Worker rtc::CopyOnWriteBuffer packet, 118*d9f75844SAndroid Build Coastguard Worker int64_t packet_time_us) override; 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker private: 121*d9f75844SAndroid Build Coastguard Worker class FakeNetworkPipeOnTaskQueue { 122*d9f75844SAndroid Build Coastguard Worker public: 123*d9f75844SAndroid Build Coastguard Worker FakeNetworkPipeOnTaskQueue( 124*d9f75844SAndroid Build Coastguard Worker TaskQueueBase* task_queue, 125*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<PendingTaskSafetyFlag> call_alive, 126*d9f75844SAndroid Build Coastguard Worker Clock* clock, 127*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<NetworkBehaviorInterface> network_behavior); 128*d9f75844SAndroid Build Coastguard Worker 129*d9f75844SAndroid Build Coastguard Worker void SendRtp(const uint8_t* packet, 130*d9f75844SAndroid Build Coastguard Worker size_t length, 131*d9f75844SAndroid Build Coastguard Worker const PacketOptions& options, 132*d9f75844SAndroid Build Coastguard Worker Transport* transport); 133*d9f75844SAndroid Build Coastguard Worker void SendRtcp(const uint8_t* packet, size_t length, Transport* transport); 134*d9f75844SAndroid Build Coastguard Worker 135*d9f75844SAndroid Build Coastguard Worker void AddActiveTransport(Transport* transport); 136*d9f75844SAndroid Build Coastguard Worker void RemoveActiveTransport(Transport* transport); 137*d9f75844SAndroid Build Coastguard Worker 138*d9f75844SAndroid Build Coastguard Worker private: 139*d9f75844SAndroid Build Coastguard Worker // Try to process packets on the fake network queue. 140*d9f75844SAndroid Build Coastguard Worker // Returns true if call resulted in a delayed process, false if queue empty. 141*d9f75844SAndroid Build Coastguard Worker bool Process(); 142*d9f75844SAndroid Build Coastguard Worker 143*d9f75844SAndroid Build Coastguard Worker Clock* const clock_; 144*d9f75844SAndroid Build Coastguard Worker TaskQueueBase* const task_queue_; 145*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<PendingTaskSafetyFlag> call_alive_; 146*d9f75844SAndroid Build Coastguard Worker FakeNetworkPipe pipe_; 147*d9f75844SAndroid Build Coastguard Worker absl::optional<int64_t> next_process_ms_ RTC_GUARDED_BY(&task_queue_); 148*d9f75844SAndroid Build Coastguard Worker }; 149*d9f75844SAndroid Build Coastguard Worker 150*d9f75844SAndroid Build Coastguard Worker class ThreadedPacketReceiver : public PacketReceiver { 151*d9f75844SAndroid Build Coastguard Worker public: 152*d9f75844SAndroid Build Coastguard Worker ThreadedPacketReceiver(webrtc::TaskQueueBase* worker_thread, 153*d9f75844SAndroid Build Coastguard Worker webrtc::TaskQueueBase* network_thread, 154*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<PendingTaskSafetyFlag> call_alive, 155*d9f75844SAndroid Build Coastguard Worker PacketReceiver* receiver); 156*d9f75844SAndroid Build Coastguard Worker ~ThreadedPacketReceiver() override; 157*d9f75844SAndroid Build Coastguard Worker 158*d9f75844SAndroid Build Coastguard Worker DeliveryStatus DeliverPacket(MediaType media_type, 159*d9f75844SAndroid Build Coastguard Worker rtc::CopyOnWriteBuffer packet, 160*d9f75844SAndroid Build Coastguard Worker int64_t packet_time_us) override; 161*d9f75844SAndroid Build Coastguard Worker 162*d9f75844SAndroid Build Coastguard Worker private: 163*d9f75844SAndroid Build Coastguard Worker webrtc::TaskQueueBase* const worker_thread_; 164*d9f75844SAndroid Build Coastguard Worker webrtc::TaskQueueBase* const network_thread_; 165*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<PendingTaskSafetyFlag> call_alive_; 166*d9f75844SAndroid Build Coastguard Worker webrtc::PacketReceiver* const receiver_; 167*d9f75844SAndroid Build Coastguard Worker }; 168*d9f75844SAndroid Build Coastguard Worker 169*d9f75844SAndroid Build Coastguard Worker // For audio/video send stream, a TransportAdapter instance is used to 170*d9f75844SAndroid Build Coastguard Worker // intercept packets to be sent, and put them into a common FakeNetworkPipe 171*d9f75844SAndroid Build Coastguard Worker // in such as way that they will eventually (unless dropped) be forwarded to 172*d9f75844SAndroid Build Coastguard Worker // the correct Transport for that stream. 173*d9f75844SAndroid Build Coastguard Worker class FakeNetworkPipeTransportAdapter : public Transport { 174*d9f75844SAndroid Build Coastguard Worker public: 175*d9f75844SAndroid Build Coastguard Worker FakeNetworkPipeTransportAdapter(FakeNetworkPipeOnTaskQueue* fake_network, 176*d9f75844SAndroid Build Coastguard Worker Call* call, 177*d9f75844SAndroid Build Coastguard Worker Clock* clock, 178*d9f75844SAndroid Build Coastguard Worker Transport* real_transport); 179*d9f75844SAndroid Build Coastguard Worker ~FakeNetworkPipeTransportAdapter(); 180*d9f75844SAndroid Build Coastguard Worker 181*d9f75844SAndroid Build Coastguard Worker bool SendRtp(const uint8_t* packet, 182*d9f75844SAndroid Build Coastguard Worker size_t length, 183*d9f75844SAndroid Build Coastguard Worker const PacketOptions& options) override; 184*d9f75844SAndroid Build Coastguard Worker bool SendRtcp(const uint8_t* packet, size_t length) override; 185*d9f75844SAndroid Build Coastguard Worker 186*d9f75844SAndroid Build Coastguard Worker private: 187*d9f75844SAndroid Build Coastguard Worker FakeNetworkPipeOnTaskQueue* const network_pipe_; 188*d9f75844SAndroid Build Coastguard Worker Call* const call_; 189*d9f75844SAndroid Build Coastguard Worker Clock* const clock_; 190*d9f75844SAndroid Build Coastguard Worker Transport* const real_transport_; 191*d9f75844SAndroid Build Coastguard Worker }; 192*d9f75844SAndroid Build Coastguard Worker 193*d9f75844SAndroid Build Coastguard Worker void SetClientBitratePreferences( 194*d9f75844SAndroid Build Coastguard Worker const webrtc::BitrateSettings& preferences) override; 195*d9f75844SAndroid Build Coastguard Worker void UpdateSendNetworkConfig(); 196*d9f75844SAndroid Build Coastguard Worker void UpdateReceiveNetworkConfig(); 197*d9f75844SAndroid Build Coastguard Worker 198*d9f75844SAndroid Build Coastguard Worker Clock* const clock_; 199*d9f75844SAndroid Build Coastguard Worker const std::unique_ptr<Call> call_; 200*d9f75844SAndroid Build Coastguard Worker // For cancelling tasks on the network thread when DegradedCall is destroyed 201*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<PendingTaskSafetyFlag> call_alive_; 202*d9f75844SAndroid Build Coastguard Worker size_t send_config_index_; 203*d9f75844SAndroid Build Coastguard Worker const std::vector<TimeScopedNetworkConfig> send_configs_; 204*d9f75844SAndroid Build Coastguard Worker SimulatedNetwork* send_simulated_network_; 205*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<FakeNetworkPipeOnTaskQueue> send_pipe_; 206*d9f75844SAndroid Build Coastguard Worker std::map<AudioSendStream*, std::unique_ptr<FakeNetworkPipeTransportAdapter>> 207*d9f75844SAndroid Build Coastguard Worker audio_send_transport_adapters_; 208*d9f75844SAndroid Build Coastguard Worker std::map<VideoSendStream*, std::unique_ptr<FakeNetworkPipeTransportAdapter>> 209*d9f75844SAndroid Build Coastguard Worker video_send_transport_adapters_; 210*d9f75844SAndroid Build Coastguard Worker 211*d9f75844SAndroid Build Coastguard Worker size_t receive_config_index_; 212*d9f75844SAndroid Build Coastguard Worker const std::vector<TimeScopedNetworkConfig> receive_configs_; 213*d9f75844SAndroid Build Coastguard Worker SimulatedNetwork* receive_simulated_network_; 214*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<FakeNetworkPipe> receive_pipe_; 215*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<ThreadedPacketReceiver> packet_receiver_; 216*d9f75844SAndroid Build Coastguard Worker }; 217*d9f75844SAndroid Build Coastguard Worker 218*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 219*d9f75844SAndroid Build Coastguard Worker 220*d9f75844SAndroid Build Coastguard Worker #endif // CALL_DEGRADED_CALL_H_ 221