• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2012 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 
11 #ifndef WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_DEFINES_H_
12 #define WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_DEFINES_H_
13 
14 #include <stddef.h>
15 #include <list>
16 
17 #include "webrtc/modules/interface/module_common_types.h"
18 #include "webrtc/system_wrappers/interface/clock.h"
19 #include "webrtc/typedefs.h"
20 
21 #define RTCP_CNAME_SIZE 256    // RFC 3550 page 44, including null termination
22 #define IP_PACKET_SIZE 1500    // we assume ethernet
23 #define MAX_NUMBER_OF_PARALLEL_TELEPHONE_EVENTS 10
24 #define TIMEOUT_SEI_MESSAGES_MS 30000   // in milliseconds
25 
26 namespace webrtc {
27 
28 const int kVideoPayloadTypeFrequency = 90000;
29 
30 // Minimum RTP header size in bytes.
31 const uint8_t kRtpHeaderSize = 12;
32 
33 struct AudioPayload
34 {
35     uint32_t    frequency;
36     uint8_t     channels;
37     uint32_t    rate;
38 };
39 
40 struct VideoPayload
41 {
42     RtpVideoCodecTypes   videoCodecType;
43     uint32_t       maxRate;
44 };
45 
46 union PayloadUnion
47 {
48     AudioPayload Audio;
49     VideoPayload Video;
50 };
51 
52 enum RTCPMethod
53 {
54     kRtcpOff          = 0,
55     kRtcpCompound     = 1,
56     kRtcpNonCompound = 2
57 };
58 
59 enum RTPAliveType
60 {
61     kRtpDead   = 0,
62     kRtpNoRtp = 1,
63     kRtpAlive  = 2
64 };
65 
66 enum ProtectionType {
67   kUnprotectedPacket,
68   kProtectedPacket
69 };
70 
71 enum StorageType {
72   kDontStore,
73   kDontRetransmit,
74   kAllowRetransmission
75 };
76 
77 enum RTPExtensionType
78 {
79    kRtpExtensionNone,
80    kRtpExtensionTransmissionTimeOffset,
81    kRtpExtensionAudioLevel,
82    kRtpExtensionAbsoluteSendTime
83 };
84 
85 enum RTCPAppSubTypes
86 {
87     kAppSubtypeBwe     = 0x00
88 };
89 
90 enum RTCPPacketType
91 {
92     kRtcpReport         = 0x0001,
93     kRtcpSr             = 0x0002,
94     kRtcpRr             = 0x0004,
95     kRtcpBye            = 0x0008,
96     kRtcpPli            = 0x0010,
97     kRtcpNack           = 0x0020,
98     kRtcpFir            = 0x0040,
99     kRtcpTmmbr          = 0x0080,
100     kRtcpTmmbn          = 0x0100,
101     kRtcpSrReq          = 0x0200,
102     kRtcpXrVoipMetric   = 0x0400,
103     kRtcpApp            = 0x0800,
104     kRtcpSli            = 0x4000,
105     kRtcpRpsi           = 0x8000,
106     kRtcpRemb           = 0x10000,
107     kRtcpTransmissionTimeOffset = 0x20000,
108     kRtcpXrReceiverReferenceTime = 0x40000,
109     kRtcpXrDlrrReportBlock = 0x80000
110 };
111 
112 enum KeyFrameRequestMethod
113 {
114     kKeyFrameReqFirRtp    = 1,
115     kKeyFrameReqPliRtcp   = 2,
116     kKeyFrameReqFirRtcp   = 3
117 };
118 
119 enum RtpRtcpPacketType
120 {
121     kPacketRtp        = 0,
122     kPacketKeepAlive = 1
123 };
124 
125 enum NACKMethod
126 {
127     kNackOff      = 0,
128     kNackRtcp     = 2
129 };
130 
131 enum RetransmissionMode {
132   kRetransmitOff          = 0x0,
133   kRetransmitFECPackets   = 0x1,
134   kRetransmitBaseLayer    = 0x2,
135   kRetransmitHigherLayers = 0x4,
136   kRetransmitAllPackets   = 0xFF
137 };
138 
139 enum RtxMode {
140   kRtxOff                 = 0x0,
141   kRtxRetransmitted       = 0x1,  // Only send retransmissions over RTX.
142   kRtxRedundantPayloads   = 0x2   // Preventively send redundant payloads
143                                   // instead of padding.
144 };
145 
146 const int kRtxHeaderSize = 2;
147 
148 struct RTCPSenderInfo
149 {
150     uint32_t NTPseconds;
151     uint32_t NTPfraction;
152     uint32_t RTPtimeStamp;
153     uint32_t sendPacketCount;
154     uint32_t sendOctetCount;
155 };
156 
157 struct RTCPReportBlock {
RTCPReportBlockRTCPReportBlock158   RTCPReportBlock()
159       : remoteSSRC(0), sourceSSRC(0), fractionLost(0), cumulativeLost(0),
160         extendedHighSeqNum(0), jitter(0), lastSR(0),
161         delaySinceLastSR(0) {}
162 
RTCPReportBlockRTCPReportBlock163   RTCPReportBlock(uint32_t remote_ssrc,
164                   uint32_t source_ssrc,
165                   uint8_t fraction_lost,
166                   uint32_t cumulative_lost,
167                   uint32_t extended_high_sequence_number,
168                   uint32_t jitter,
169                   uint32_t last_sender_report,
170                   uint32_t delay_since_last_sender_report)
171       : remoteSSRC(remote_ssrc),
172         sourceSSRC(source_ssrc),
173         fractionLost(fraction_lost),
174         cumulativeLost(cumulative_lost),
175         extendedHighSeqNum(extended_high_sequence_number),
176         jitter(jitter),
177         lastSR(last_sender_report),
178         delaySinceLastSR(delay_since_last_sender_report) {}
179 
180   // Fields as described by RFC 3550 6.4.2.
181   uint32_t remoteSSRC;  // SSRC of sender of this report.
182   uint32_t sourceSSRC;  // SSRC of the RTP packet sender.
183   uint8_t fractionLost;
184   uint32_t cumulativeLost;  // 24 bits valid.
185   uint32_t extendedHighSeqNum;
186   uint32_t jitter;
187   uint32_t lastSR;
188   uint32_t delaySinceLastSR;
189 };
190 
191 struct RtcpReceiveTimeInfo {
192   // Fields as described by RFC 3611 4.5.
193   uint32_t sourceSSRC;
194   uint32_t lastRR;
195   uint32_t delaySinceLastRR;
196 };
197 
198 typedef std::list<RTCPReportBlock> ReportBlockList;
199 
200 struct RtpState {
RtpStateRtpState201   RtpState()
202       : sequence_number(0),
203         start_timestamp(0),
204         timestamp(0),
205         capture_time_ms(-1),
206         last_timestamp_time_ms(-1),
207         media_has_been_sent(false) {}
208   uint16_t sequence_number;
209   uint32_t start_timestamp;
210   uint32_t timestamp;
211   int64_t capture_time_ms;
212   int64_t last_timestamp_time_ms;
213   bool media_has_been_sent;
214 };
215 
216 class RtpData
217 {
218 public:
~RtpData()219     virtual ~RtpData() {}
220 
221     virtual int32_t OnReceivedPayloadData(
222         const uint8_t* payloadData,
223         const uint16_t payloadSize,
224         const WebRtcRTPHeader* rtpHeader) = 0;
225 
226     virtual bool OnRecoveredPacket(const uint8_t* packet,
227                                    int packet_length) = 0;
228 };
229 
230 class RtcpFeedback
231 {
232 public:
OnApplicationDataReceived(const int32_t,const uint8_t,const uint32_t,const uint16_t,const uint8_t *)233     virtual void OnApplicationDataReceived(const int32_t /*id*/,
234                                            const uint8_t /*subType*/,
235                                            const uint32_t /*name*/,
236                                            const uint16_t /*length*/,
237                                            const uint8_t* /*data*/)  {};
238 
OnXRVoIPMetricReceived(const int32_t,const RTCPVoIPMetric *)239     virtual void OnXRVoIPMetricReceived(
240         const int32_t /*id*/,
241         const RTCPVoIPMetric* /*metric*/)  {};
242 
OnReceiveReportReceived(const int32_t id,const uint32_t senderSSRC)243     virtual void OnReceiveReportReceived(const int32_t id,
244                                          const uint32_t senderSSRC)  {};
245 
246 protected:
~RtcpFeedback()247     virtual ~RtcpFeedback() {}
248 };
249 
250 class RtpFeedback
251 {
252 public:
~RtpFeedback()253     virtual ~RtpFeedback() {}
254 
255     // Receiving payload change or SSRC change. (return success!)
256     /*
257     *   channels    - number of channels in codec (1 = mono, 2 = stereo)
258     */
259     virtual int32_t OnInitializeDecoder(
260         const int32_t id,
261         const int8_t payloadType,
262         const char payloadName[RTP_PAYLOAD_NAME_SIZE],
263         const int frequency,
264         const uint8_t channels,
265         const uint32_t rate) = 0;
266 
267     virtual void OnIncomingSSRCChanged( const int32_t id,
268                                         const uint32_t ssrc) = 0;
269 
270     virtual void OnIncomingCSRCChanged( const int32_t id,
271                                         const uint32_t CSRC,
272                                         const bool added) = 0;
273 
274     virtual void ResetStatistics(uint32_t ssrc) = 0;
275 };
276 
277 class RtpAudioFeedback {
278  public:
279 
280   virtual void OnPlayTelephoneEvent(const int32_t id,
281                                     const uint8_t event,
282                                     const uint16_t lengthMs,
283                                     const uint8_t volume) = 0;
284  protected:
~RtpAudioFeedback()285   virtual ~RtpAudioFeedback() {}
286 };
287 
288 class RtcpIntraFrameObserver {
289  public:
290   virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) = 0;
291 
292   virtual void OnReceivedSLI(uint32_t ssrc,
293                              uint8_t picture_id) = 0;
294 
295   virtual void OnReceivedRPSI(uint32_t ssrc,
296                               uint64_t picture_id) = 0;
297 
298   virtual void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) = 0;
299 
~RtcpIntraFrameObserver()300   virtual ~RtcpIntraFrameObserver() {}
301 };
302 
303 class RtcpBandwidthObserver {
304  public:
305   // REMB or TMMBR
306   virtual void OnReceivedEstimatedBitrate(const uint32_t bitrate) = 0;
307 
308   virtual void OnReceivedRtcpReceiverReport(
309       const ReportBlockList& report_blocks,
310       uint16_t rtt,
311       int64_t now_ms) = 0;
312 
~RtcpBandwidthObserver()313   virtual ~RtcpBandwidthObserver() {}
314 };
315 
316 class RtcpRttStats {
317  public:
318   virtual void OnRttUpdate(uint32_t rtt) = 0;
319 
320   virtual uint32_t LastProcessedRtt() const = 0;
321 
~RtcpRttStats()322   virtual ~RtcpRttStats() {};
323 };
324 
325 // Null object version of RtpFeedback.
326 class NullRtpFeedback : public RtpFeedback {
327  public:
~NullRtpFeedback()328   virtual ~NullRtpFeedback() {}
329 
OnInitializeDecoder(const int32_t id,const int8_t payloadType,const char payloadName[RTP_PAYLOAD_NAME_SIZE],const int frequency,const uint8_t channels,const uint32_t rate)330   virtual int32_t OnInitializeDecoder(
331       const int32_t id,
332       const int8_t payloadType,
333       const char payloadName[RTP_PAYLOAD_NAME_SIZE],
334       const int frequency,
335       const uint8_t channels,
336       const uint32_t rate) OVERRIDE {
337     return 0;
338   }
339 
OnIncomingSSRCChanged(const int32_t id,const uint32_t ssrc)340   virtual void OnIncomingSSRCChanged(const int32_t id,
341                                      const uint32_t ssrc) OVERRIDE {}
342 
OnIncomingCSRCChanged(const int32_t id,const uint32_t CSRC,const bool added)343   virtual void OnIncomingCSRCChanged(const int32_t id,
344                                      const uint32_t CSRC,
345                                      const bool added) OVERRIDE {}
346 
ResetStatistics(uint32_t ssrc)347   virtual void ResetStatistics(uint32_t ssrc) OVERRIDE {}
348 };
349 
350 // Null object version of RtpData.
351 class NullRtpData : public RtpData {
352  public:
~NullRtpData()353   virtual ~NullRtpData() {}
354 
OnReceivedPayloadData(const uint8_t * payloadData,const uint16_t payloadSize,const WebRtcRTPHeader * rtpHeader)355   virtual int32_t OnReceivedPayloadData(
356       const uint8_t* payloadData,
357       const uint16_t payloadSize,
358       const WebRtcRTPHeader* rtpHeader) OVERRIDE {
359     return 0;
360   }
361 
OnRecoveredPacket(const uint8_t * packet,int packet_length)362   virtual bool OnRecoveredPacket(const uint8_t* packet,
363                                  int packet_length) OVERRIDE {
364     return true;
365   }
366 };
367 
368 // Null object version of RtpAudioFeedback.
369 class NullRtpAudioFeedback : public RtpAudioFeedback {
370  public:
~NullRtpAudioFeedback()371   virtual ~NullRtpAudioFeedback() {}
372 
OnPlayTelephoneEvent(const int32_t id,const uint8_t event,const uint16_t lengthMs,const uint8_t volume)373   virtual void OnPlayTelephoneEvent(const int32_t id,
374                                     const uint8_t event,
375                                     const uint16_t lengthMs,
376                                     const uint8_t volume) OVERRIDE {}
377 };
378 
379 }  // namespace webrtc
380 #endif // WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_DEFINES_H_
381