1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2013 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 #ifndef CALL_CALL_H_ 11*d9f75844SAndroid Build Coastguard Worker #define CALL_CALL_H_ 12*d9f75844SAndroid Build Coastguard Worker 13*d9f75844SAndroid Build Coastguard Worker #include <algorithm> 14*d9f75844SAndroid Build Coastguard Worker #include <memory> 15*d9f75844SAndroid Build Coastguard Worker #include <string> 16*d9f75844SAndroid Build Coastguard Worker #include <vector> 17*d9f75844SAndroid Build Coastguard Worker 18*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h" 19*d9f75844SAndroid Build Coastguard Worker #include "api/adaptation/resource.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/media_types.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/task_queue/task_queue_base.h" 22*d9f75844SAndroid Build Coastguard Worker #include "call/audio_receive_stream.h" 23*d9f75844SAndroid Build Coastguard Worker #include "call/audio_send_stream.h" 24*d9f75844SAndroid Build Coastguard Worker #include "call/call_config.h" 25*d9f75844SAndroid Build Coastguard Worker #include "call/flexfec_receive_stream.h" 26*d9f75844SAndroid Build Coastguard Worker #include "call/packet_receiver.h" 27*d9f75844SAndroid Build Coastguard Worker #include "call/rtp_transport_controller_send_interface.h" 28*d9f75844SAndroid Build Coastguard Worker #include "call/video_receive_stream.h" 29*d9f75844SAndroid Build Coastguard Worker #include "call/video_send_stream.h" 30*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/copy_on_write_buffer.h" 31*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network/sent_packet.h" 32*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/network_route.h" 33*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/ref_count.h" 34*d9f75844SAndroid Build Coastguard Worker 35*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 36*d9f75844SAndroid Build Coastguard Worker 37*d9f75844SAndroid Build Coastguard Worker // A Call represents a two-way connection carrying zero or more outgoing 38*d9f75844SAndroid Build Coastguard Worker // and incoming media streams, transported over one or more RTP transports. 39*d9f75844SAndroid Build Coastguard Worker 40*d9f75844SAndroid Build Coastguard Worker // A Call instance can contain several send and/or receive streams. All streams 41*d9f75844SAndroid Build Coastguard Worker // are assumed to have the same remote endpoint and will share bitrate estimates 42*d9f75844SAndroid Build Coastguard Worker // etc. 43*d9f75844SAndroid Build Coastguard Worker 44*d9f75844SAndroid Build Coastguard Worker // When using the PeerConnection API, there is an one to one relationship 45*d9f75844SAndroid Build Coastguard Worker // between the PeerConnection and the Call. 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Worker class Call { 48*d9f75844SAndroid Build Coastguard Worker public: 49*d9f75844SAndroid Build Coastguard Worker using Config = CallConfig; 50*d9f75844SAndroid Build Coastguard Worker 51*d9f75844SAndroid Build Coastguard Worker struct Stats { 52*d9f75844SAndroid Build Coastguard Worker std::string ToString(int64_t time_ms) const; 53*d9f75844SAndroid Build Coastguard Worker 54*d9f75844SAndroid Build Coastguard Worker int send_bandwidth_bps = 0; // Estimated available send bandwidth. 55*d9f75844SAndroid Build Coastguard Worker int max_padding_bitrate_bps = 0; // Cumulative configured max padding. 56*d9f75844SAndroid Build Coastguard Worker int recv_bandwidth_bps = 0; // Estimated available receive bandwidth. 57*d9f75844SAndroid Build Coastguard Worker int64_t pacer_delay_ms = 0; 58*d9f75844SAndroid Build Coastguard Worker int64_t rtt_ms = -1; 59*d9f75844SAndroid Build Coastguard Worker }; 60*d9f75844SAndroid Build Coastguard Worker 61*d9f75844SAndroid Build Coastguard Worker static Call* Create(const Call::Config& config); 62*d9f75844SAndroid Build Coastguard Worker static Call* Create(const Call::Config& config, 63*d9f75844SAndroid Build Coastguard Worker Clock* clock, 64*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<RtpTransportControllerSendInterface> 65*d9f75844SAndroid Build Coastguard Worker transportControllerSend); 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker virtual AudioSendStream* CreateAudioSendStream( 68*d9f75844SAndroid Build Coastguard Worker const AudioSendStream::Config& config) = 0; 69*d9f75844SAndroid Build Coastguard Worker 70*d9f75844SAndroid Build Coastguard Worker virtual void DestroyAudioSendStream(AudioSendStream* send_stream) = 0; 71*d9f75844SAndroid Build Coastguard Worker 72*d9f75844SAndroid Build Coastguard Worker virtual AudioReceiveStreamInterface* CreateAudioReceiveStream( 73*d9f75844SAndroid Build Coastguard Worker const AudioReceiveStreamInterface::Config& config) = 0; 74*d9f75844SAndroid Build Coastguard Worker virtual void DestroyAudioReceiveStream( 75*d9f75844SAndroid Build Coastguard Worker AudioReceiveStreamInterface* receive_stream) = 0; 76*d9f75844SAndroid Build Coastguard Worker 77*d9f75844SAndroid Build Coastguard Worker virtual VideoSendStream* CreateVideoSendStream( 78*d9f75844SAndroid Build Coastguard Worker VideoSendStream::Config config, 79*d9f75844SAndroid Build Coastguard Worker VideoEncoderConfig encoder_config) = 0; 80*d9f75844SAndroid Build Coastguard Worker virtual VideoSendStream* CreateVideoSendStream( 81*d9f75844SAndroid Build Coastguard Worker VideoSendStream::Config config, 82*d9f75844SAndroid Build Coastguard Worker VideoEncoderConfig encoder_config, 83*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<FecController> fec_controller); 84*d9f75844SAndroid Build Coastguard Worker virtual void DestroyVideoSendStream(VideoSendStream* send_stream) = 0; 85*d9f75844SAndroid Build Coastguard Worker 86*d9f75844SAndroid Build Coastguard Worker virtual VideoReceiveStreamInterface* CreateVideoReceiveStream( 87*d9f75844SAndroid Build Coastguard Worker VideoReceiveStreamInterface::Config configuration) = 0; 88*d9f75844SAndroid Build Coastguard Worker virtual void DestroyVideoReceiveStream( 89*d9f75844SAndroid Build Coastguard Worker VideoReceiveStreamInterface* receive_stream) = 0; 90*d9f75844SAndroid Build Coastguard Worker 91*d9f75844SAndroid Build Coastguard Worker // In order for a created VideoReceiveStreamInterface to be aware that it is 92*d9f75844SAndroid Build Coastguard Worker // protected by a FlexfecReceiveStream, the latter should be created before 93*d9f75844SAndroid Build Coastguard Worker // the former. 94*d9f75844SAndroid Build Coastguard Worker virtual FlexfecReceiveStream* CreateFlexfecReceiveStream( 95*d9f75844SAndroid Build Coastguard Worker const FlexfecReceiveStream::Config config) = 0; 96*d9f75844SAndroid Build Coastguard Worker virtual void DestroyFlexfecReceiveStream( 97*d9f75844SAndroid Build Coastguard Worker FlexfecReceiveStream* receive_stream) = 0; 98*d9f75844SAndroid Build Coastguard Worker 99*d9f75844SAndroid Build Coastguard Worker // When a resource is overused, the Call will try to reduce the load on the 100*d9f75844SAndroid Build Coastguard Worker // sysem, for example by reducing the resolution or frame rate of encoded 101*d9f75844SAndroid Build Coastguard Worker // streams. 102*d9f75844SAndroid Build Coastguard Worker virtual void AddAdaptationResource(rtc::scoped_refptr<Resource> resource) = 0; 103*d9f75844SAndroid Build Coastguard Worker 104*d9f75844SAndroid Build Coastguard Worker // All received RTP and RTCP packets for the call should be inserted to this 105*d9f75844SAndroid Build Coastguard Worker // PacketReceiver. The PacketReceiver pointer is valid as long as the 106*d9f75844SAndroid Build Coastguard Worker // Call instance exists. 107*d9f75844SAndroid Build Coastguard Worker virtual PacketReceiver* Receiver() = 0; 108*d9f75844SAndroid Build Coastguard Worker 109*d9f75844SAndroid Build Coastguard Worker // This is used to access the transport controller send instance owned by 110*d9f75844SAndroid Build Coastguard Worker // Call. The send transport controller is currently owned by Call for legacy 111*d9f75844SAndroid Build Coastguard Worker // reasons. (for instance variants of call tests are built on this assumtion) 112*d9f75844SAndroid Build Coastguard Worker // TODO(srte): Move ownership of transport controller send out of Call and 113*d9f75844SAndroid Build Coastguard Worker // remove this method interface. 114*d9f75844SAndroid Build Coastguard Worker virtual RtpTransportControllerSendInterface* GetTransportControllerSend() = 0; 115*d9f75844SAndroid Build Coastguard Worker 116*d9f75844SAndroid Build Coastguard Worker // Returns the call statistics, such as estimated send and receive bandwidth, 117*d9f75844SAndroid Build Coastguard Worker // pacing delay, etc. 118*d9f75844SAndroid Build Coastguard Worker virtual Stats GetStats() const = 0; 119*d9f75844SAndroid Build Coastguard Worker 120*d9f75844SAndroid Build Coastguard Worker // TODO(skvlad): When the unbundled case with multiple streams for the same 121*d9f75844SAndroid Build Coastguard Worker // media type going over different networks is supported, track the state 122*d9f75844SAndroid Build Coastguard Worker // for each stream separately. Right now it's global per media type. 123*d9f75844SAndroid Build Coastguard Worker virtual void SignalChannelNetworkState(MediaType media, 124*d9f75844SAndroid Build Coastguard Worker NetworkState state) = 0; 125*d9f75844SAndroid Build Coastguard Worker 126*d9f75844SAndroid Build Coastguard Worker virtual void OnAudioTransportOverheadChanged( 127*d9f75844SAndroid Build Coastguard Worker int transport_overhead_per_packet) = 0; 128*d9f75844SAndroid Build Coastguard Worker 129*d9f75844SAndroid Build Coastguard Worker // Called when a receive stream's local ssrc has changed and association with 130*d9f75844SAndroid Build Coastguard Worker // send streams needs to be updated. 131*d9f75844SAndroid Build Coastguard Worker virtual void OnLocalSsrcUpdated(AudioReceiveStreamInterface& stream, 132*d9f75844SAndroid Build Coastguard Worker uint32_t local_ssrc) = 0; 133*d9f75844SAndroid Build Coastguard Worker virtual void OnLocalSsrcUpdated(VideoReceiveStreamInterface& stream, 134*d9f75844SAndroid Build Coastguard Worker uint32_t local_ssrc) = 0; 135*d9f75844SAndroid Build Coastguard Worker virtual void OnLocalSsrcUpdated(FlexfecReceiveStream& stream, 136*d9f75844SAndroid Build Coastguard Worker uint32_t local_ssrc) = 0; 137*d9f75844SAndroid Build Coastguard Worker 138*d9f75844SAndroid Build Coastguard Worker virtual void OnUpdateSyncGroup(AudioReceiveStreamInterface& stream, 139*d9f75844SAndroid Build Coastguard Worker absl::string_view sync_group) = 0; 140*d9f75844SAndroid Build Coastguard Worker 141*d9f75844SAndroid Build Coastguard Worker virtual void OnSentPacket(const rtc::SentPacket& sent_packet) = 0; 142*d9f75844SAndroid Build Coastguard Worker 143*d9f75844SAndroid Build Coastguard Worker virtual void SetClientBitratePreferences( 144*d9f75844SAndroid Build Coastguard Worker const BitrateSettings& preferences) = 0; 145*d9f75844SAndroid Build Coastguard Worker 146*d9f75844SAndroid Build Coastguard Worker virtual const FieldTrialsView& trials() const = 0; 147*d9f75844SAndroid Build Coastguard Worker 148*d9f75844SAndroid Build Coastguard Worker virtual TaskQueueBase* network_thread() const = 0; 149*d9f75844SAndroid Build Coastguard Worker virtual TaskQueueBase* worker_thread() const = 0; 150*d9f75844SAndroid Build Coastguard Worker ~Call()151*d9f75844SAndroid Build Coastguard Worker virtual ~Call() {} 152*d9f75844SAndroid Build Coastguard Worker }; 153*d9f75844SAndroid Build Coastguard Worker 154*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 155*d9f75844SAndroid Build Coastguard Worker 156*d9f75844SAndroid Build Coastguard Worker #endif // CALL_CALL_H_ 157