aboutsummaryrefslogtreecommitdiff
path: root/webrtc/voice_engine/include/voe_rtp_rtcp.h
blob: 6d17501772add165092bbcef142b0f1b5e372aba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
/*
 *  Copyright (c) 2012 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.
 */

// This sub-API supports the following functionalities:
//
//  - Callbacks for RTP and RTCP events such as modified SSRC or CSRC.
//  - SSRC handling.
//  - Transmission of RTCP sender reports.
//  - Obtaining RTCP data from incoming RTCP sender reports.
//  - RTP and RTCP statistics (jitter, packet loss, RTT etc.).
//  - Redundant Coding (RED)
//  - Writing RTP and RTCP packets to binary files for off-line analysis of
//    the call quality.
//
// Usage example, omitting error checking:
//
//  using namespace webrtc;
//  VoiceEngine* voe = VoiceEngine::Create();
//  VoEBase* base = VoEBase::GetInterface(voe);
//  VoERTP_RTCP* rtp_rtcp  = VoERTP_RTCP::GetInterface(voe);
//  base->Init();
//  int ch = base->CreateChannel();
//  ...
//  rtp_rtcp->SetLocalSSRC(ch, 12345);
//  ...
//  base->DeleteChannel(ch);
//  base->Terminate();
//  base->Release();
//  rtp_rtcp->Release();
//  VoiceEngine::Delete(voe);
//
#ifndef WEBRTC_VOICE_ENGINE_VOE_RTP_RTCP_H
#define WEBRTC_VOICE_ENGINE_VOE_RTP_RTCP_H

#include <vector>
#include "webrtc/common_types.h"

namespace webrtc {

class VoiceEngine;

// VoERTPObserver
class WEBRTC_DLLEXPORT VoERTPObserver {
 public:
  virtual void OnIncomingCSRCChanged(int channel,
                                     unsigned int CSRC,
                                     bool added) = 0;

  virtual void OnIncomingSSRCChanged(int channel, unsigned int SSRC) = 0;

 protected:
  virtual ~VoERTPObserver() {}
};

// CallStatistics
struct CallStatistics {
  unsigned short fractionLost;
  unsigned int cumulativeLost;
  unsigned int extendedMax;
  unsigned int jitterSamples;
  int64_t rttMs;
  size_t bytesSent;
  int packetsSent;
  size_t bytesReceived;
  int packetsReceived;
  // The capture ntp time (in local timebase) of the first played out audio
  // frame.
  int64_t capture_start_ntp_time_ms_;
};

// See section 6.4.1 in http://www.ietf.org/rfc/rfc3550.txt for details.
struct SenderInfo {
  uint32_t NTP_timestamp_high;
  uint32_t NTP_timestamp_low;
  uint32_t RTP_timestamp;
  uint32_t sender_packet_count;
  uint32_t sender_octet_count;
};

// See section 6.4.2 in http://www.ietf.org/rfc/rfc3550.txt for details.
struct ReportBlock {
  uint32_t sender_SSRC;  // SSRC of sender
  uint32_t source_SSRC;
  uint8_t fraction_lost;
  uint32_t cumulative_num_packets_lost;
  uint32_t extended_highest_sequence_number;
  uint32_t interarrival_jitter;
  uint32_t last_SR_timestamp;
  uint32_t delay_since_last_SR;
};

// VoERTP_RTCP
class WEBRTC_DLLEXPORT VoERTP_RTCP {
 public:
  // Factory for the VoERTP_RTCP sub-API. Increases an internal
  // reference counter if successful. Returns NULL if the API is not
  // supported or if construction fails.
  static VoERTP_RTCP* GetInterface(VoiceEngine* voiceEngine);

  // Releases the VoERTP_RTCP sub-API and decreases an internal
  // reference counter. Returns the new reference count. This value should
  // be zero for all sub-API:s before the VoiceEngine object can be safely
  // deleted.
  virtual int Release() = 0;

  // Sets the local RTP synchronization source identifier (SSRC) explicitly.
  virtual int SetLocalSSRC(int channel, unsigned int ssrc) = 0;

  // Gets the local RTP SSRC of a specified |channel|.
  virtual int GetLocalSSRC(int channel, unsigned int& ssrc) = 0;

  // Gets the SSRC of the incoming RTP packets.
  virtual int GetRemoteSSRC(int channel, unsigned int& ssrc) = 0;

  // Sets the status of rtp-audio-level-indication on a specific |channel|.
  virtual int SetSendAudioLevelIndicationStatus(int channel,
                                                bool enable,
                                                unsigned char id = 1) = 0;

  // Sets the status of receiving rtp-audio-level-indication on a specific
  // |channel|.
  virtual int SetReceiveAudioLevelIndicationStatus(int channel,
                                                   bool enable,
                                                   unsigned char id = 1) {
    // TODO(wu): Remove default implementation once talk is updated.
    return 0;
  }

  // Sets the status of sending absolute sender time on a specific |channel|.
  virtual int SetSendAbsoluteSenderTimeStatus(int channel,
                                              bool enable,
                                              unsigned char id) = 0;

  // Sets status of receiving absolute sender time on a specific |channel|.
  virtual int SetReceiveAbsoluteSenderTimeStatus(int channel,
                                                 bool enable,
                                                 unsigned char id) = 0;

  // Sets the RTCP status on a specific |channel|.
  virtual int SetRTCPStatus(int channel, bool enable) = 0;

  // Gets the RTCP status on a specific |channel|.
  virtual int GetRTCPStatus(int channel, bool& enabled) = 0;

  // Sets the canonical name (CNAME) parameter for RTCP reports on a
  // specific |channel|.
  virtual int SetRTCP_CNAME(int channel, const char cName[256]) = 0;

  // TODO(holmer): Remove this API once it has been removed from
  // fakewebrtcvoiceengine.h.
  virtual int GetRTCP_CNAME(int channel, char cName[256]) { return -1; }

  // Gets the canonical name (CNAME) parameter for incoming RTCP reports
  // on a specific channel.
  virtual int GetRemoteRTCP_CNAME(int channel, char cName[256]) = 0;

  // Gets RTCP data from incoming RTCP Sender Reports.
  virtual int GetRemoteRTCPData(int channel,
                                unsigned int& NTPHigh,
                                unsigned int& NTPLow,
                                unsigned int& timestamp,
                                unsigned int& playoutTimestamp,
                                unsigned int* jitter = NULL,
                                unsigned short* fractionLost = NULL) = 0;

  // Gets RTP statistics for a specific |channel|.
  virtual int GetRTPStatistics(int channel,
                               unsigned int& averageJitterMs,
                               unsigned int& maxJitterMs,
                               unsigned int& discardedPackets) = 0;

  // Gets RTCP statistics for a specific |channel|.
  virtual int GetRTCPStatistics(int channel, CallStatistics& stats) = 0;

  // Gets the report block parts of the last received RTCP Sender Report (SR),
  // or RTCP Receiver Report (RR) on a specified |channel|. Each vector
  // element also contains the SSRC of the sender in addition to a report
  // block.
  virtual int GetRemoteRTCPReportBlocks(
      int channel,
      std::vector<ReportBlock>* receive_blocks) = 0;

  // Sets the Redundant Coding (RED) status on a specific |channel|.
  // TODO(minyue): Make SetREDStatus() pure virtual when fakewebrtcvoiceengine
  // in talk is ready.
  virtual int SetREDStatus(int channel, bool enable, int redPayloadtype = -1) {
    return -1;
  }

  // Gets the RED status on a specific |channel|.
  // TODO(minyue): Make GetREDStatus() pure virtual when fakewebrtcvoiceengine
  // in talk is ready.
  virtual int GetREDStatus(int channel, bool& enabled, int& redPayloadtype) {
    return -1;
  }

  // Sets the Forward Error Correction (FEC) status on a specific |channel|.
  // TODO(minyue): Remove SetFECStatus() when SetFECStatus() is replaced by
  // SetREDStatus() in fakewebrtcvoiceengine.
  virtual int SetFECStatus(int channel, bool enable, int redPayloadtype = -1) {
    return SetREDStatus(channel, enable, redPayloadtype);
  };

  // Gets the FEC status on a specific |channel|.
  // TODO(minyue): Remove GetFECStatus() when GetFECStatus() is replaced by
  // GetREDStatus() in fakewebrtcvoiceengine.
  virtual int GetFECStatus(int channel, bool& enabled, int& redPayloadtype) {
    return SetREDStatus(channel, enabled, redPayloadtype);
  }

  // This function enables Negative Acknowledgment (NACK) using RTCP,
  // implemented based on RFC 4585. NACK retransmits RTP packets if lost on
  // the network. This creates a lossless transport at the expense of delay.
  // If using NACK, NACK should be enabled on both endpoints in a call.
  virtual int SetNACKStatus(int channel, bool enable, int maxNoPackets) = 0;

 protected:
  VoERTP_RTCP() {}
  virtual ~VoERTP_RTCP() {}
};

}  // namespace webrtc

#endif  // #ifndef WEBRTC_VOICE_ENGINE_VOE_RTP_RTCP_H