blob: 5f700b614f3ab69bfe7d52bf1930aab797bc79dc [file] [log] [blame]
ossuf515ab82016-12-07 04:52:58 -08001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020010#ifndef CALL_CALL_H_
11#define CALL_CALL_H_
ossuf515ab82016-12-07 04:52:58 -080012
zsteina5e0df62017-06-14 11:41:48 -070013#include <algorithm>
zstein7cb69d52017-05-08 11:52:38 -070014#include <memory>
ossuf515ab82016-12-07 04:52:58 -080015#include <string>
16#include <vector>
17
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "call/audio_receive_stream.h"
19#include "call/audio_send_stream.h"
Paulina Hensman11b34f42018-04-09 14:24:52 +020020#include "call/call_config.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "call/flexfec_receive_stream.h"
22#include "call/rtp_transport_controller_send_interface.h"
23#include "call/video_receive_stream.h"
24#include "call/video_send_stream.h"
Mirko Bonadei71207422017-09-15 13:58:09 +020025#include "common_types.h" // NOLINT(build/include)
Alex Narest78609d52017-10-20 10:37:47 +020026#include "rtc_base/bitrateallocationstrategy.h"
Danil Chapovalov292a73e2017-12-07 17:00:40 +010027#include "rtc_base/copyonwritebuffer.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "rtc_base/networkroute.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "rtc_base/socket.h"
ossuf515ab82016-12-07 04:52:58 -080030
31namespace webrtc {
32
Yves Gerey665174f2018-06-19 15:03:05 +020033enum class MediaType { ANY, AUDIO, VIDEO, DATA };
ossuf515ab82016-12-07 04:52:58 -080034
35class PacketReceiver {
36 public:
37 enum DeliveryStatus {
38 DELIVERY_OK,
39 DELIVERY_UNKNOWN_SSRC,
40 DELIVERY_PACKET_ERROR,
41 };
42
43 virtual DeliveryStatus DeliverPacket(MediaType media_type,
Danil Chapovalov292a73e2017-12-07 17:00:40 +010044 rtc::CopyOnWriteBuffer packet,
ossuf515ab82016-12-07 04:52:58 -080045 const PacketTime& packet_time) = 0;
46
47 protected:
48 virtual ~PacketReceiver() {}
49};
50
51// A Call instance can contain several send and/or receive streams. All streams
52// are assumed to have the same remote endpoint and will share bitrate estimates
53// etc.
54class Call {
55 public:
Niels Möller8366e172018-02-14 12:20:13 +010056 using Config = CallConfig;
ossuf515ab82016-12-07 04:52:58 -080057
58 struct Stats {
59 std::string ToString(int64_t time_ms) const;
60
61 int send_bandwidth_bps = 0; // Estimated available send bandwidth.
62 int max_padding_bitrate_bps = 0; // Cumulative configured max padding.
63 int recv_bandwidth_bps = 0; // Estimated available receive bandwidth.
64 int64_t pacer_delay_ms = 0;
65 int64_t rtt_ms = -1;
66 };
67
68 static Call* Create(const Call::Config& config);
69
zstein7cb69d52017-05-08 11:52:38 -070070 // Allows mocking |transport_send| for testing.
71 static Call* Create(
72 const Call::Config& config,
73 std::unique_ptr<RtpTransportControllerSendInterface> transport_send);
74
ossuf515ab82016-12-07 04:52:58 -080075 virtual AudioSendStream* CreateAudioSendStream(
76 const AudioSendStream::Config& config) = 0;
77 virtual void DestroyAudioSendStream(AudioSendStream* send_stream) = 0;
78
79 virtual AudioReceiveStream* CreateAudioReceiveStream(
80 const AudioReceiveStream::Config& config) = 0;
81 virtual void DestroyAudioReceiveStream(
82 AudioReceiveStream* receive_stream) = 0;
83
84 virtual VideoSendStream* CreateVideoSendStream(
85 VideoSendStream::Config config,
86 VideoEncoderConfig encoder_config) = 0;
Ying Wang3b790f32018-01-19 17:58:57 +010087 virtual VideoSendStream* CreateVideoSendStream(
88 VideoSendStream::Config config,
89 VideoEncoderConfig encoder_config,
90 std::unique_ptr<FecController> fec_controller);
ossuf515ab82016-12-07 04:52:58 -080091 virtual void DestroyVideoSendStream(VideoSendStream* send_stream) = 0;
92
93 virtual VideoReceiveStream* CreateVideoReceiveStream(
94 VideoReceiveStream::Config configuration) = 0;
95 virtual void DestroyVideoReceiveStream(
96 VideoReceiveStream* receive_stream) = 0;
97
brandtrfb45c6c2017-01-27 06:47:55 -080098 // In order for a created VideoReceiveStream to be aware that it is
99 // protected by a FlexfecReceiveStream, the latter should be created before
100 // the former.
ossuf515ab82016-12-07 04:52:58 -0800101 virtual FlexfecReceiveStream* CreateFlexfecReceiveStream(
brandtr446fcb62016-12-08 04:14:24 -0800102 const FlexfecReceiveStream::Config& config) = 0;
ossuf515ab82016-12-07 04:52:58 -0800103 virtual void DestroyFlexfecReceiveStream(
104 FlexfecReceiveStream* receive_stream) = 0;
105
106 // All received RTP and RTCP packets for the call should be inserted to this
107 // PacketReceiver. The PacketReceiver pointer is valid as long as the
108 // Call instance exists.
109 virtual PacketReceiver* Receiver() = 0;
110
Sebastian Jansson8f83b422018-02-21 13:07:13 +0100111 // This is used to access the transport controller send instance owned by
112 // Call. The send transport controller is currently owned by Call for legacy
113 // reasons. (for instance variants of call tests are built on this assumtion)
114 // TODO(srte): Move ownership of transport controller send out of Call and
115 // remove this method interface.
116 virtual RtpTransportControllerSendInterface* GetTransportControllerSend() = 0;
117
ossuf515ab82016-12-07 04:52:58 -0800118 // Returns the call statistics, such as estimated send and receive bandwidth,
119 // pacing delay, etc.
120 virtual Stats GetStats() const = 0;
121
Alex Narest78609d52017-10-20 10:37:47 +0200122 virtual void SetBitrateAllocationStrategy(
123 std::unique_ptr<rtc::BitrateAllocationStrategy>
124 bitrate_allocation_strategy) = 0;
125
ossuf515ab82016-12-07 04:52:58 -0800126 // TODO(skvlad): When the unbundled case with multiple streams for the same
127 // media type going over different networks is supported, track the state
128 // for each stream separately. Right now it's global per media type.
129 virtual void SignalChannelNetworkState(MediaType media,
130 NetworkState state) = 0;
131
132 virtual void OnTransportOverheadChanged(
133 MediaType media,
134 int transport_overhead_per_packet) = 0;
135
ossuf515ab82016-12-07 04:52:58 -0800136 virtual void OnSentPacket(const rtc::SentPacket& sent_packet) = 0;
137
138 virtual ~Call() {}
139};
140
141} // namespace webrtc
142
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200143#endif // CALL_CALL_H_