1/*
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 */
10#ifndef WEBRTC_CALL_H_
11#define WEBRTC_CALL_H_
12
13#include <string>
14#include <vector>
15
16#include "webrtc/common_types.h"
17#include "webrtc/audio_receive_stream.h"
18#include "webrtc/audio_send_stream.h"
19#include "webrtc/audio_state.h"
20#include "webrtc/base/socket.h"
21#include "webrtc/video_receive_stream.h"
22#include "webrtc/video_send_stream.h"
23
24namespace webrtc {
25
26class AudioProcessing;
27
28const char* Version();
29
30enum class MediaType {
31  ANY,
32  AUDIO,
33  VIDEO,
34  DATA
35};
36
37class PacketReceiver {
38 public:
39  enum DeliveryStatus {
40    DELIVERY_OK,
41    DELIVERY_UNKNOWN_SSRC,
42    DELIVERY_PACKET_ERROR,
43  };
44
45  virtual DeliveryStatus DeliverPacket(MediaType media_type,
46                                       const uint8_t* packet,
47                                       size_t length,
48                                       const PacketTime& packet_time) = 0;
49
50 protected:
51  virtual ~PacketReceiver() {}
52};
53
54// Callback interface for reporting when a system overuse is detected.
55class LoadObserver {
56 public:
57  enum Load { kOveruse, kUnderuse };
58
59  // Triggered when overuse is detected or when we believe the system can take
60  // more load.
61  virtual void OnLoadUpdate(Load load) = 0;
62
63 protected:
64  virtual ~LoadObserver() {}
65};
66
67// A Call instance can contain several send and/or receive streams. All streams
68// are assumed to have the same remote endpoint and will share bitrate estimates
69// etc.
70class Call {
71 public:
72  struct Config {
73    static const int kDefaultStartBitrateBps;
74
75    // Bitrate config used until valid bitrate estimates are calculated. Also
76    // used to cap total bitrate used.
77    struct BitrateConfig {
78      int min_bitrate_bps = 0;
79      int start_bitrate_bps = kDefaultStartBitrateBps;
80      int max_bitrate_bps = -1;
81    } bitrate_config;
82
83    // AudioState which is possibly shared between multiple calls.
84    // TODO(solenberg): Change this to a shared_ptr once we can use C++11.
85    rtc::scoped_refptr<AudioState> audio_state;
86
87    // Audio Processing Module to be used in this call.
88    // TODO(solenberg): Change this to a shared_ptr once we can use C++11.
89    AudioProcessing* audio_processing = nullptr;
90  };
91
92  struct Stats {
93    int send_bandwidth_bps = 0;
94    int recv_bandwidth_bps = 0;
95    int64_t pacer_delay_ms = 0;
96    int64_t rtt_ms = -1;
97  };
98
99  static Call* Create(const Call::Config& config);
100
101  virtual AudioSendStream* CreateAudioSendStream(
102      const AudioSendStream::Config& config) = 0;
103  virtual void DestroyAudioSendStream(AudioSendStream* send_stream) = 0;
104
105  virtual AudioReceiveStream* CreateAudioReceiveStream(
106      const AudioReceiveStream::Config& config) = 0;
107  virtual void DestroyAudioReceiveStream(
108      AudioReceiveStream* receive_stream) = 0;
109
110  virtual VideoSendStream* CreateVideoSendStream(
111      const VideoSendStream::Config& config,
112      const VideoEncoderConfig& encoder_config) = 0;
113  virtual void DestroyVideoSendStream(VideoSendStream* send_stream) = 0;
114
115  virtual VideoReceiveStream* CreateVideoReceiveStream(
116      const VideoReceiveStream::Config& config) = 0;
117  virtual void DestroyVideoReceiveStream(
118      VideoReceiveStream* receive_stream) = 0;
119
120  // All received RTP and RTCP packets for the call should be inserted to this
121  // PacketReceiver. The PacketReceiver pointer is valid as long as the
122  // Call instance exists.
123  virtual PacketReceiver* Receiver() = 0;
124
125  // Returns the call statistics, such as estimated send and receive bandwidth,
126  // pacing delay, etc.
127  virtual Stats GetStats() const = 0;
128
129  // TODO(pbos): Like BitrateConfig above this is currently per-stream instead
130  // of maximum for entire Call. This should be fixed along with the above.
131  // Specifying a start bitrate (>0) will currently reset the current bitrate
132  // estimate. This is due to how the 'x-google-start-bitrate' flag is currently
133  // implemented.
134  virtual void SetBitrateConfig(
135      const Config::BitrateConfig& bitrate_config) = 0;
136  virtual void SignalNetworkState(NetworkState state) = 0;
137
138  virtual void OnSentPacket(const rtc::SentPacket& sent_packet) = 0;
139
140  virtual ~Call() {}
141};
142
143}  // namespace webrtc
144
145#endif  // WEBRTC_CALL_H_
146