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 StorageType { 67 kDontStore, 68 kDontRetransmit, 69 kAllowRetransmission 70 }; 71 72 enum RTPExtensionType 73 { 74 kRtpExtensionNone, 75 kRtpExtensionTransmissionTimeOffset, 76 kRtpExtensionAudioLevel, 77 kRtpExtensionAbsoluteSendTime 78 }; 79 80 enum RTCPAppSubTypes 81 { 82 kAppSubtypeBwe = 0x00 83 }; 84 85 enum RTCPPacketType 86 { 87 kRtcpReport = 0x0001, 88 kRtcpSr = 0x0002, 89 kRtcpRr = 0x0004, 90 kRtcpBye = 0x0008, 91 kRtcpPli = 0x0010, 92 kRtcpNack = 0x0020, 93 kRtcpFir = 0x0040, 94 kRtcpTmmbr = 0x0080, 95 kRtcpTmmbn = 0x0100, 96 kRtcpSrReq = 0x0200, 97 kRtcpXrVoipMetric = 0x0400, 98 kRtcpApp = 0x0800, 99 kRtcpSli = 0x4000, 100 kRtcpRpsi = 0x8000, 101 kRtcpRemb = 0x10000, 102 kRtcpTransmissionTimeOffset = 0x20000, 103 kRtcpXrReceiverReferenceTime = 0x40000, 104 kRtcpXrDlrrReportBlock = 0x80000 105 }; 106 107 enum KeyFrameRequestMethod 108 { 109 kKeyFrameReqFirRtp = 1, 110 kKeyFrameReqPliRtcp = 2, 111 kKeyFrameReqFirRtcp = 3 112 }; 113 114 enum RtpRtcpPacketType 115 { 116 kPacketRtp = 0, 117 kPacketKeepAlive = 1 118 }; 119 120 enum NACKMethod 121 { 122 kNackOff = 0, 123 kNackRtcp = 2 124 }; 125 126 enum RetransmissionMode { 127 kRetransmitOff = 0x0, 128 kRetransmitFECPackets = 0x1, 129 kRetransmitBaseLayer = 0x2, 130 kRetransmitHigherLayers = 0x4, 131 kRetransmitAllPackets = 0xFF 132 }; 133 134 enum RtxMode { 135 kRtxOff = 0x0, 136 kRtxRetransmitted = 0x1, // Only send retransmissions over RTX. 137 kRtxRedundantPayloads = 0x2 // Preventively send redundant payloads 138 // instead of padding. 139 }; 140 141 const int kRtxHeaderSize = 2; 142 143 struct RTCPSenderInfo 144 { 145 uint32_t NTPseconds; 146 uint32_t NTPfraction; 147 uint32_t RTPtimeStamp; 148 uint32_t sendPacketCount; 149 uint32_t sendOctetCount; 150 }; 151 152 struct RTCPReportBlock { 153 RTCPReportBlock() 154 : remoteSSRC(0), sourceSSRC(0), fractionLost(0), cumulativeLost(0), 155 extendedHighSeqNum(0), jitter(0), lastSR(0), 156 delaySinceLastSR(0) {} 157 158 RTCPReportBlock(uint32_t remote_ssrc, 159 uint32_t source_ssrc, 160 uint8_t fraction_lost, 161 uint32_t cumulative_lost, 162 uint32_t extended_high_sequence_number, 163 uint32_t jitter, 164 uint32_t last_sender_report, 165 uint32_t delay_since_last_sender_report) 166 : remoteSSRC(remote_ssrc), 167 sourceSSRC(source_ssrc), 168 fractionLost(fraction_lost), 169 cumulativeLost(cumulative_lost), 170 extendedHighSeqNum(extended_high_sequence_number), 171 jitter(jitter), 172 lastSR(last_sender_report), 173 delaySinceLastSR(delay_since_last_sender_report) {} 174 175 // Fields as described by RFC 3550 6.4.2. 176 uint32_t remoteSSRC; // SSRC of sender of this report. 177 uint32_t sourceSSRC; // SSRC of the RTP packet sender. 178 uint8_t fractionLost; 179 uint32_t cumulativeLost; // 24 bits valid. 180 uint32_t extendedHighSeqNum; 181 uint32_t jitter; 182 uint32_t lastSR; 183 uint32_t delaySinceLastSR; 184 }; 185 186 struct RtcpReceiveTimeInfo { 187 // Fields as described by RFC 3611 4.5. 188 uint32_t sourceSSRC; 189 uint32_t lastRR; 190 uint32_t delaySinceLastRR; 191 }; 192 193 typedef std::list<RTCPReportBlock> ReportBlockList; 194 195 class RtpData 196 { 197 public: 198 virtual ~RtpData() {} 199 200 virtual int32_t OnReceivedPayloadData( 201 const uint8_t* payloadData, 202 const uint16_t payloadSize, 203 const WebRtcRTPHeader* rtpHeader) = 0; 204 205 virtual bool OnRecoveredPacket(const uint8_t* packet, 206 int packet_length) = 0; 207 }; 208 209 class RtcpFeedback 210 { 211 public: 212 virtual void OnApplicationDataReceived(const int32_t /*id*/, 213 const uint8_t /*subType*/, 214 const uint32_t /*name*/, 215 const uint16_t /*length*/, 216 const uint8_t* /*data*/) {}; 217 218 virtual void OnXRVoIPMetricReceived( 219 const int32_t /*id*/, 220 const RTCPVoIPMetric* /*metric*/) {}; 221 222 virtual void OnReceiveReportReceived(const int32_t id, 223 const uint32_t senderSSRC) {}; 224 225 protected: 226 virtual ~RtcpFeedback() {} 227 }; 228 229 class RtpFeedback 230 { 231 public: 232 virtual ~RtpFeedback() {} 233 234 // Receiving payload change or SSRC change. (return success!) 235 /* 236 * channels - number of channels in codec (1 = mono, 2 = stereo) 237 */ 238 virtual int32_t OnInitializeDecoder( 239 const int32_t id, 240 const int8_t payloadType, 241 const char payloadName[RTP_PAYLOAD_NAME_SIZE], 242 const int frequency, 243 const uint8_t channels, 244 const uint32_t rate) = 0; 245 246 virtual void OnIncomingSSRCChanged( const int32_t id, 247 const uint32_t ssrc) = 0; 248 249 virtual void OnIncomingCSRCChanged( const int32_t id, 250 const uint32_t CSRC, 251 const bool added) = 0; 252 253 virtual void ResetStatistics(uint32_t ssrc) = 0; 254 }; 255 256 class RtpAudioFeedback { 257 public: 258 259 virtual void OnPlayTelephoneEvent(const int32_t id, 260 const uint8_t event, 261 const uint16_t lengthMs, 262 const uint8_t volume) = 0; 263 protected: 264 virtual ~RtpAudioFeedback() {} 265 }; 266 267 class RtcpIntraFrameObserver { 268 public: 269 virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) = 0; 270 271 virtual void OnReceivedSLI(uint32_t ssrc, 272 uint8_t picture_id) = 0; 273 274 virtual void OnReceivedRPSI(uint32_t ssrc, 275 uint64_t picture_id) = 0; 276 277 virtual void OnLocalSsrcChanged(uint32_t old_ssrc, uint32_t new_ssrc) = 0; 278 279 virtual ~RtcpIntraFrameObserver() {} 280 }; 281 282 class RtcpBandwidthObserver { 283 public: 284 // REMB or TMMBR 285 virtual void OnReceivedEstimatedBitrate(const uint32_t bitrate) = 0; 286 287 virtual void OnReceivedRtcpReceiverReport( 288 const ReportBlockList& report_blocks, 289 uint16_t rtt, 290 int64_t now_ms) = 0; 291 292 virtual ~RtcpBandwidthObserver() {} 293 }; 294 295 class RtcpRttStats { 296 public: 297 virtual void OnRttUpdate(uint32_t rtt) = 0; 298 299 virtual uint32_t LastProcessedRtt() const = 0; 300 301 virtual ~RtcpRttStats() {}; 302 }; 303 304 // Null object version of RtpFeedback. 305 class NullRtpFeedback : public RtpFeedback { 306 public: 307 virtual ~NullRtpFeedback() {} 308 309 virtual int32_t OnInitializeDecoder( 310 const int32_t id, 311 const int8_t payloadType, 312 const char payloadName[RTP_PAYLOAD_NAME_SIZE], 313 const int frequency, 314 const uint8_t channels, 315 const uint32_t rate) OVERRIDE { 316 return 0; 317 } 318 319 virtual void OnIncomingSSRCChanged(const int32_t id, 320 const uint32_t ssrc) OVERRIDE {} 321 322 virtual void OnIncomingCSRCChanged(const int32_t id, 323 const uint32_t CSRC, 324 const bool added) OVERRIDE {} 325 326 virtual void ResetStatistics(uint32_t ssrc) OVERRIDE {} 327 }; 328 329 // Null object version of RtpData. 330 class NullRtpData : public RtpData { 331 public: 332 virtual ~NullRtpData() {} 333 334 virtual int32_t OnReceivedPayloadData( 335 const uint8_t* payloadData, 336 const uint16_t payloadSize, 337 const WebRtcRTPHeader* rtpHeader) OVERRIDE { 338 return 0; 339 } 340 341 virtual bool OnRecoveredPacket(const uint8_t* packet, 342 int packet_length) { 343 return true; 344 } 345 }; 346 347 // Null object version of RtpAudioFeedback. 348 class NullRtpAudioFeedback : public RtpAudioFeedback { 349 public: 350 virtual ~NullRtpAudioFeedback() {} 351 352 virtual void OnPlayTelephoneEvent(const int32_t id, 353 const uint8_t event, 354 const uint16_t lengthMs, 355 const uint8_t volume) OVERRIDE {} 356 }; 357 358 } // namespace webrtc 359 #endif // WEBRTC_MODULES_RTP_RTCP_INTERFACE_RTP_RTCP_DEFINES_H_ 360