Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 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 | |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 11 | #ifndef MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_ |
| 12 | #define MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_ |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 13 | |
| 14 | #include <stddef.h> |
Jonas Olsson | a4d8737 | 2019-07-05 19:08:33 +0200 | [diff] [blame] | 15 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 16 | #include <list> |
Stefan Holmer | 60e4346 | 2016-09-07 09:58:20 +0200 | [diff] [blame] | 17 | #include <vector> |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 18 | |
Niels Möller | a7de698 | 2019-03-21 15:48:49 +0100 | [diff] [blame] | 19 | #include "absl/strings/string_view.h" |
Erik Språng | 490d76c | 2019-05-07 09:29:15 -0700 | [diff] [blame] | 20 | #include "absl/types/optional.h" |
Danil Chapovalov | fb8e7ef | 2018-06-26 10:44:13 +0200 | [diff] [blame] | 21 | #include "absl/types/variant.h" |
Erik Språng | 490d76c | 2019-05-07 09:29:15 -0700 | [diff] [blame] | 22 | #include "api/array_view.h" |
Karl Wiberg | c62f6c7 | 2017-10-04 12:38:53 +0200 | [diff] [blame] | 23 | #include "api/audio_codecs/audio_format.h" |
Patrik Höglund | 3e11343 | 2017-12-15 14:40:10 +0100 | [diff] [blame] | 24 | #include "api/rtp_headers.h" |
Danil Chapovalov | db12856 | 2018-09-17 13:11:50 +0200 | [diff] [blame] | 25 | #include "api/transport/network_types.h" |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 26 | #include "modules/include/module_common_types.h" |
Sebastian Jansson | e1795f4 | 2019-07-24 11:38:03 +0200 | [diff] [blame] | 27 | #include "modules/rtp_rtcp/source/rtcp_packet/remote_estimate.h" |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 28 | #include "system_wrappers/include/clock.h" |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 29 | |
Yves Gerey | 665174f | 2018-06-19 15:03:05 +0200 | [diff] [blame] | 30 | #define RTCP_CNAME_SIZE 256 // RFC 3550 page 44, including null termination |
| 31 | #define IP_PACKET_SIZE 1500 // we assume ethernet |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 32 | |
| 33 | namespace webrtc { |
Niels Möller | dbb988b | 2018-11-15 08:05:16 +0100 | [diff] [blame] | 34 | class RtpPacket; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 35 | namespace rtcp { |
| 36 | class TransportFeedback; |
| 37 | } |
| 38 | |
| 39 | const int kVideoPayloadTypeFrequency = 90000; |
Ilya Nikolaevskiy | 5e58bcb | 2018-10-24 13:34:32 +0200 | [diff] [blame] | 40 | |
| 41 | // TODO(bugs.webrtc.org/6458): Remove this when all the depending projects are |
| 42 | // updated to correctly set rtp rate for RtcpSender. |
solenberg | b19d288 | 2016-10-03 06:22:25 -0700 | [diff] [blame] | 43 | const int kBogusRtpRateForAudioRtcp = 8000; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 44 | |
| 45 | // Minimum RTP header size in bytes. |
| 46 | const uint8_t kRtpHeaderSize = 12; |
| 47 | |
Yves Gerey | 665174f | 2018-06-19 15:03:05 +0200 | [diff] [blame] | 48 | enum StorageType { kDontRetransmit, kAllowRetransmission }; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 49 | |
Niels Möller | a7de698 | 2019-03-21 15:48:49 +0100 | [diff] [blame] | 50 | bool IsLegalMidName(absl::string_view name); |
| 51 | bool IsLegalRsidName(absl::string_view name); |
| 52 | |
Johannes Kron | c5744b8 | 2018-09-24 14:50:48 +0200 | [diff] [blame] | 53 | // This enum must not have any gaps, i.e., all integers between |
| 54 | // kRtpExtensionNone and kRtpExtensionNumberOfExtensions must be valid enum |
| 55 | // entries. |
| 56 | enum RTPExtensionType : int { |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 57 | kRtpExtensionNone, |
| 58 | kRtpExtensionTransmissionTimeOffset, |
| 59 | kRtpExtensionAudioLevel, |
| 60 | kRtpExtensionAbsoluteSendTime, |
Chen Xing | cd8a6e2 | 2019-07-01 10:56:51 +0200 | [diff] [blame] | 61 | kRtpExtensionAbsoluteCaptureTime, |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 62 | kRtpExtensionVideoRotation, |
| 63 | kRtpExtensionTransportSequenceNumber, |
Johannes Kron | 54047be | 2019-02-21 14:09:20 +0000 | [diff] [blame] | 64 | kRtpExtensionTransportSequenceNumber02, |
isheriff | 6b4b5f3 | 2016-06-08 00:24:21 -0700 | [diff] [blame] | 65 | kRtpExtensionPlayoutDelay, |
ilnik | 00d802b | 2017-04-11 10:34:31 -0700 | [diff] [blame] | 66 | kRtpExtensionVideoContentType, |
ilnik | 04f4d12 | 2017-06-19 07:18:55 -0700 | [diff] [blame] | 67 | kRtpExtensionVideoTiming, |
Johnny Lee | e0c8b23 | 2018-09-11 16:50:49 -0400 | [diff] [blame] | 68 | kRtpExtensionFrameMarking, |
danilchap | ef8d773 | 2017-04-19 02:59:48 -0700 | [diff] [blame] | 69 | kRtpExtensionRtpStreamId, |
| 70 | kRtpExtensionRepairedRtpStreamId, |
Steve Anton | a3251dd | 2017-07-21 09:58:31 -0700 | [diff] [blame] | 71 | kRtpExtensionMid, |
Elad Alon | ccb9b75 | 2019-02-19 13:01:31 +0100 | [diff] [blame] | 72 | kRtpExtensionGenericFrameDescriptor00, |
| 73 | kRtpExtensionGenericFrameDescriptor = kRtpExtensionGenericFrameDescriptor00, |
| 74 | kRtpExtensionGenericFrameDescriptor01, |
Danil Chapovalov | 52e5242 | 2019-06-27 16:45:40 +0200 | [diff] [blame] | 75 | kRtpExtensionGenericFrameDescriptor02, |
Johannes Kron | 09d6588 | 2018-11-27 14:36:41 +0100 | [diff] [blame] | 76 | kRtpExtensionColorSpace, |
ilnik | 00d802b | 2017-04-11 10:34:31 -0700 | [diff] [blame] | 77 | kRtpExtensionNumberOfExtensions // Must be the last entity in the enum. |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 78 | }; |
| 79 | |
danilchap | 5c1def8 | 2015-12-10 09:51:54 -0800 | [diff] [blame] | 80 | enum RTCPAppSubTypes { kAppSubtypeBwe = 0x00 }; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 81 | |
| 82 | // TODO(sprang): Make this an enum class once rtcp_receiver has been cleaned up. |
| 83 | enum RTCPPacketType : uint32_t { |
| 84 | kRtcpReport = 0x0001, |
| 85 | kRtcpSr = 0x0002, |
| 86 | kRtcpRr = 0x0004, |
| 87 | kRtcpSdes = 0x0008, |
| 88 | kRtcpBye = 0x0010, |
| 89 | kRtcpPli = 0x0020, |
| 90 | kRtcpNack = 0x0040, |
| 91 | kRtcpFir = 0x0080, |
| 92 | kRtcpTmmbr = 0x0100, |
| 93 | kRtcpTmmbn = 0x0200, |
| 94 | kRtcpSrReq = 0x0400, |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 95 | kRtcpApp = 0x1000, |
Elad Alon | f8e7ccb | 2019-01-24 12:38:36 +0100 | [diff] [blame] | 96 | kRtcpLossNotification = 0x2000, |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 97 | kRtcpRemb = 0x10000, |
| 98 | kRtcpTransmissionTimeOffset = 0x20000, |
| 99 | kRtcpXrReceiverReferenceTime = 0x40000, |
| 100 | kRtcpXrDlrrReportBlock = 0x80000, |
| 101 | kRtcpTransportFeedback = 0x100000, |
sprang | 5e38c96 | 2016-12-01 05:18:09 -0800 | [diff] [blame] | 102 | kRtcpXrTargetBitrate = 0x200000 |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 103 | }; |
| 104 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 105 | enum RtxMode { |
Yves Gerey | 665174f | 2018-06-19 15:03:05 +0200 | [diff] [blame] | 106 | kRtxOff = 0x0, |
| 107 | kRtxRetransmitted = 0x1, // Only send retransmissions over RTX. |
| 108 | kRtxRedundantPayloads = 0x2 // Preventively send redundant payloads |
| 109 | // instead of padding. |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 110 | }; |
| 111 | |
| 112 | const size_t kRtxHeaderSize = 2; |
| 113 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 114 | struct RTCPReportBlock { |
| 115 | RTCPReportBlock() |
srte | 3e69e5c | 2017-08-09 06:13:45 -0700 | [diff] [blame] | 116 | : sender_ssrc(0), |
| 117 | source_ssrc(0), |
| 118 | fraction_lost(0), |
| 119 | packets_lost(0), |
| 120 | extended_highest_sequence_number(0), |
| 121 | jitter(0), |
| 122 | last_sender_report_timestamp(0), |
| 123 | delay_since_last_sender_report(0) {} |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 124 | |
srte | 3e69e5c | 2017-08-09 06:13:45 -0700 | [diff] [blame] | 125 | RTCPReportBlock(uint32_t sender_ssrc, |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 126 | uint32_t source_ssrc, |
| 127 | uint8_t fraction_lost, |
Harald Alvestrand | 70206d6 | 2017-12-08 08:59:07 +0100 | [diff] [blame] | 128 | int32_t packets_lost, |
srte | 3e69e5c | 2017-08-09 06:13:45 -0700 | [diff] [blame] | 129 | uint32_t extended_highest_sequence_number, |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 130 | uint32_t jitter, |
srte | 3e69e5c | 2017-08-09 06:13:45 -0700 | [diff] [blame] | 131 | uint32_t last_sender_report_timestamp, |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 132 | uint32_t delay_since_last_sender_report) |
srte | 3e69e5c | 2017-08-09 06:13:45 -0700 | [diff] [blame] | 133 | : sender_ssrc(sender_ssrc), |
| 134 | source_ssrc(source_ssrc), |
| 135 | fraction_lost(fraction_lost), |
| 136 | packets_lost(packets_lost), |
| 137 | extended_highest_sequence_number(extended_highest_sequence_number), |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 138 | jitter(jitter), |
srte | 3e69e5c | 2017-08-09 06:13:45 -0700 | [diff] [blame] | 139 | last_sender_report_timestamp(last_sender_report_timestamp), |
| 140 | delay_since_last_sender_report(delay_since_last_sender_report) {} |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 141 | |
| 142 | // Fields as described by RFC 3550 6.4.2. |
Danil Chapovalov | 84c1a15 | 2017-11-15 16:28:20 +0100 | [diff] [blame] | 143 | uint32_t sender_ssrc; // SSRC of sender of this report. |
| 144 | uint32_t source_ssrc; // SSRC of the RTP packet sender. |
| 145 | uint8_t fraction_lost; |
Sebastian Jansson | 9701e0c | 2018-08-09 11:21:11 +0200 | [diff] [blame] | 146 | int32_t packets_lost; // 24 bits valid. |
Danil Chapovalov | 84c1a15 | 2017-11-15 16:28:20 +0100 | [diff] [blame] | 147 | uint32_t extended_highest_sequence_number; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 148 | uint32_t jitter; |
Danil Chapovalov | 84c1a15 | 2017-11-15 16:28:20 +0100 | [diff] [blame] | 149 | uint32_t last_sender_report_timestamp; |
| 150 | uint32_t delay_since_last_sender_report; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 151 | }; |
| 152 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 153 | typedef std::list<RTCPReportBlock> ReportBlockList; |
| 154 | |
| 155 | struct RtpState { |
| 156 | RtpState() |
| 157 | : sequence_number(0), |
| 158 | start_timestamp(0), |
| 159 | timestamp(0), |
| 160 | capture_time_ms(-1), |
| 161 | last_timestamp_time_ms(-1), |
| 162 | media_has_been_sent(false) {} |
| 163 | uint16_t sequence_number; |
| 164 | uint32_t start_timestamp; |
| 165 | uint32_t timestamp; |
| 166 | int64_t capture_time_ms; |
| 167 | int64_t last_timestamp_time_ms; |
| 168 | bool media_has_been_sent; |
| 169 | }; |
| 170 | |
nisse | 30e8931 | 2017-05-29 08:16:37 -0700 | [diff] [blame] | 171 | // Callback interface for packets recovered by FlexFEC or ULPFEC. In |
| 172 | // the FlexFEC case, the implementation should be able to demultiplex |
| 173 | // the recovered RTP packets based on SSRC. |
| 174 | class RecoveredPacketReceiver { |
| 175 | public: |
| 176 | virtual void OnRecoveredPacket(const uint8_t* packet, size_t length) = 0; |
| 177 | |
| 178 | protected: |
| 179 | virtual ~RecoveredPacketReceiver() = default; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 180 | }; |
| 181 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 182 | class RtcpIntraFrameObserver { |
| 183 | public: |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 184 | virtual ~RtcpIntraFrameObserver() {} |
Danil Chapovalov | 92f83ce | 2018-05-28 12:53:50 +0200 | [diff] [blame] | 185 | |
| 186 | virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) = 0; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 187 | }; |
| 188 | |
Elad Alon | 0a8562e | 2019-04-09 11:55:13 +0200 | [diff] [blame] | 189 | // Observer for incoming LossNotification RTCP messages. |
| 190 | // See the documentation of LossNotification for details. |
| 191 | class RtcpLossNotificationObserver { |
| 192 | public: |
| 193 | virtual ~RtcpLossNotificationObserver() = default; |
| 194 | |
| 195 | virtual void OnReceivedLossNotification(uint32_t ssrc, |
| 196 | uint16_t seq_num_of_last_decodable, |
| 197 | uint16_t seq_num_of_last_received, |
| 198 | bool decodability_flag) = 0; |
| 199 | }; |
| 200 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 201 | class RtcpBandwidthObserver { |
| 202 | public: |
| 203 | // REMB or TMMBR |
| 204 | virtual void OnReceivedEstimatedBitrate(uint32_t bitrate) = 0; |
| 205 | |
| 206 | virtual void OnReceivedRtcpReceiverReport( |
| 207 | const ReportBlockList& report_blocks, |
| 208 | int64_t rtt, |
| 209 | int64_t now_ms) = 0; |
| 210 | |
| 211 | virtual ~RtcpBandwidthObserver() {} |
| 212 | }; |
| 213 | |
elad.alon | f949000 | 2017-03-06 05:32:21 -0800 | [diff] [blame] | 214 | struct PacketFeedback { |
Sebastian Jansson | 789f459 | 2018-10-09 18:30:28 +0200 | [diff] [blame] | 215 | PacketFeedback(int64_t arrival_time_ms, uint16_t sequence_number); |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 216 | |
elad.alon | f949000 | 2017-03-06 05:32:21 -0800 | [diff] [blame] | 217 | PacketFeedback(int64_t arrival_time_ms, |
| 218 | int64_t send_time_ms, |
| 219 | uint16_t sequence_number, |
| 220 | size_t payload_size, |
Sebastian Jansson | 789f459 | 2018-10-09 18:30:28 +0200 | [diff] [blame] | 221 | const PacedPacketInfo& pacing_info); |
Stefan Holmer | 9ea46b5 | 2017-03-15 12:40:25 +0100 | [diff] [blame] | 222 | |
| 223 | PacketFeedback(int64_t creation_time_ms, |
| 224 | uint16_t sequence_number, |
| 225 | size_t payload_size, |
| 226 | uint16_t local_net_id, |
| 227 | uint16_t remote_net_id, |
Sebastian Jansson | 789f459 | 2018-10-09 18:30:28 +0200 | [diff] [blame] | 228 | const PacedPacketInfo& pacing_info); |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 229 | |
elad.alon | f949000 | 2017-03-06 05:32:21 -0800 | [diff] [blame] | 230 | PacketFeedback(int64_t creation_time_ms, |
| 231 | int64_t arrival_time_ms, |
| 232 | int64_t send_time_ms, |
| 233 | uint16_t sequence_number, |
| 234 | size_t payload_size, |
Stefan Holmer | 9ea46b5 | 2017-03-15 12:40:25 +0100 | [diff] [blame] | 235 | uint16_t local_net_id, |
| 236 | uint16_t remote_net_id, |
Sebastian Jansson | 789f459 | 2018-10-09 18:30:28 +0200 | [diff] [blame] | 237 | const PacedPacketInfo& pacing_info); |
| 238 | PacketFeedback(const PacketFeedback&); |
| 239 | PacketFeedback& operator=(const PacketFeedback&); |
| 240 | ~PacketFeedback(); |
philipel | 8aadd50 | 2017-02-23 02:56:13 -0800 | [diff] [blame] | 241 | |
| 242 | static constexpr int kNotAProbe = -1; |
elad.alon | ec304f9 | 2017-03-08 05:03:53 -0800 | [diff] [blame] | 243 | static constexpr int64_t kNotReceived = -1; |
srte | e0572e5 | 2017-11-30 09:59:33 +0100 | [diff] [blame] | 244 | static constexpr int64_t kNoSendTime = -1; |
philipel | 8aadd50 | 2017-02-23 02:56:13 -0800 | [diff] [blame] | 245 | |
| 246 | // NOTE! The variable |creation_time_ms| is not used when testing equality. |
| 247 | // This is due to |creation_time_ms| only being used by SendTimeHistory |
| 248 | // for book-keeping, and is of no interest outside that class. |
elad.alon | f949000 | 2017-03-06 05:32:21 -0800 | [diff] [blame] | 249 | // TODO(philipel): Remove |creation_time_ms| from PacketFeedback when cleaning |
| 250 | // up SendTimeHistory. |
Sebastian Jansson | 789f459 | 2018-10-09 18:30:28 +0200 | [diff] [blame] | 251 | bool operator==(const PacketFeedback& rhs) const; |
philipel | a1ed0b3 | 2016-06-01 06:31:17 -0700 | [diff] [blame] | 252 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 253 | // Time corresponding to when this object was created. |
| 254 | int64_t creation_time_ms; |
| 255 | // Time corresponding to when the packet was received. Timestamped with the |
elad.alon | ec304f9 | 2017-03-08 05:03:53 -0800 | [diff] [blame] | 256 | // receiver's clock. For unreceived packet, the sentinel value kNotReceived |
| 257 | // is used. |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 258 | int64_t arrival_time_ms; |
| 259 | // Time corresponding to when the packet was sent, timestamped with the |
| 260 | // sender's clock. |
| 261 | int64_t send_time_ms; |
| 262 | // Packet identifier, incremented with 1 for every packet generated by the |
| 263 | // sender. |
| 264 | uint16_t sequence_number; |
Sebastian Jansson | 02c6586 | 2018-05-22 11:03:04 +0200 | [diff] [blame] | 265 | // Session unique packet identifier, incremented with 1 for every packet |
| 266 | // generated by the sender. |
| 267 | int64_t long_sequence_number; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 268 | // Size of the packet excluding RTP headers. |
| 269 | size_t payload_size; |
Sebastian Jansson | 789f459 | 2018-10-09 18:30:28 +0200 | [diff] [blame] | 270 | // Size of preceeding packets that are not part of feedback. |
| 271 | size_t unacknowledged_data; |
Stefan Holmer | 9ea46b5 | 2017-03-15 12:40:25 +0100 | [diff] [blame] | 272 | // The network route ids that this packet is associated with. |
| 273 | uint16_t local_net_id; |
| 274 | uint16_t remote_net_id; |
philipel | 8aadd50 | 2017-02-23 02:56:13 -0800 | [diff] [blame] | 275 | // Pacing information about this packet. |
| 276 | PacedPacketInfo pacing_info; |
Erik Språng | 30a276b | 2019-04-23 12:00:11 +0200 | [diff] [blame] | 277 | |
| 278 | // The SSRC and RTP sequence number of the packet this feedback refers to. |
Erik Språng | 490d76c | 2019-05-07 09:29:15 -0700 | [diff] [blame] | 279 | absl::optional<uint32_t> ssrc; |
Erik Språng | 30a276b | 2019-04-23 12:00:11 +0200 | [diff] [blame] | 280 | uint16_t rtp_sequence_number; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 281 | }; |
| 282 | |
Erik Språng | 30a276b | 2019-04-23 12:00:11 +0200 | [diff] [blame] | 283 | struct RtpPacketSendInfo { |
| 284 | public: |
| 285 | RtpPacketSendInfo() = default; |
| 286 | |
| 287 | uint16_t transport_sequence_number = 0; |
| 288 | uint32_t ssrc = 0; |
| 289 | uint16_t rtp_sequence_number = 0; |
| 290 | // Get rid of this flag when all code paths populate |rtp_sequence_number|. |
| 291 | bool has_rtp_sequence_number = false; |
| 292 | size_t length = 0; |
| 293 | PacedPacketInfo pacing_info; |
| 294 | }; |
Sebastian Jansson | e1795f4 | 2019-07-24 11:38:03 +0200 | [diff] [blame] | 295 | class NetworkStateEstimateObserver { |
| 296 | public: |
| 297 | virtual void OnRemoteNetworkEstimate(NetworkStateEstimate estimate) = 0; |
| 298 | virtual ~NetworkStateEstimateObserver() = default; |
| 299 | }; |
Erik Språng | 30a276b | 2019-04-23 12:00:11 +0200 | [diff] [blame] | 300 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 301 | class TransportFeedbackObserver { |
| 302 | public: |
| 303 | TransportFeedbackObserver() {} |
| 304 | virtual ~TransportFeedbackObserver() {} |
| 305 | |
Erik Språng | 2a27be9 | 2019-04-24 08:09:20 +0200 | [diff] [blame] | 306 | virtual void OnAddPacket(const RtpPacketSendInfo& packet_info) = 0; |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 307 | virtual void OnTransportFeedback(const rtcp::TransportFeedback& feedback) = 0; |
| 308 | }; |
| 309 | |
Danil Chapovalov | eb0edd8 | 2017-12-14 16:02:31 +0100 | [diff] [blame] | 310 | // Interface for PacketRouter to send rtcp feedback on behalf of |
| 311 | // congestion controller. |
| 312 | // TODO(bugs.webrtc.org/8239): Remove and use RtcpTransceiver directly |
| 313 | // when RtcpTransceiver always present in rtp transport. |
| 314 | class RtcpFeedbackSenderInterface { |
| 315 | public: |
| 316 | virtual ~RtcpFeedbackSenderInterface() = default; |
| 317 | virtual uint32_t SSRC() const = 0; |
| 318 | virtual bool SendFeedbackPacket(const rtcp::TransportFeedback& feedback) = 0; |
Sebastian Jansson | e1795f4 | 2019-07-24 11:38:03 +0200 | [diff] [blame] | 319 | virtual bool SendNetworkStateEstimatePacket( |
| 320 | const rtcp::RemoteEstimate& packet) = 0; |
Danil Chapovalov | eb0edd8 | 2017-12-14 16:02:31 +0100 | [diff] [blame] | 321 | virtual void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs) = 0; |
| 322 | virtual void UnsetRemb() = 0; |
| 323 | }; |
| 324 | |
elad.alon | d12a8e1 | 2017-03-23 11:04:48 -0700 | [diff] [blame] | 325 | class PacketFeedbackObserver { |
| 326 | public: |
| 327 | virtual ~PacketFeedbackObserver() = default; |
| 328 | |
| 329 | virtual void OnPacketAdded(uint32_t ssrc, uint16_t seq_num) = 0; |
| 330 | virtual void OnPacketFeedbackVector( |
| 331 | const std::vector<PacketFeedback>& packet_feedback_vector) = 0; |
| 332 | }; |
| 333 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 334 | class RtcpRttStats { |
| 335 | public: |
| 336 | virtual void OnRttUpdate(int64_t rtt) = 0; |
| 337 | |
| 338 | virtual int64_t LastProcessedRtt() const = 0; |
| 339 | |
danilchap | 5c1def8 | 2015-12-10 09:51:54 -0800 | [diff] [blame] | 340 | virtual ~RtcpRttStats() {} |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 341 | }; |
| 342 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 343 | class TransportSequenceNumberAllocator { |
| 344 | public: |
| 345 | TransportSequenceNumberAllocator() {} |
| 346 | virtual ~TransportSequenceNumberAllocator() {} |
| 347 | |
| 348 | virtual uint16_t AllocateSequenceNumber() = 0; |
| 349 | }; |
| 350 | |
Patrik Höglund | 3e11343 | 2017-12-15 14:40:10 +0100 | [diff] [blame] | 351 | struct RtpPacketCounter { |
| 352 | RtpPacketCounter() |
| 353 | : header_bytes(0), payload_bytes(0), padding_bytes(0), packets(0) {} |
| 354 | |
| 355 | void Add(const RtpPacketCounter& other) { |
| 356 | header_bytes += other.header_bytes; |
| 357 | payload_bytes += other.payload_bytes; |
| 358 | padding_bytes += other.padding_bytes; |
| 359 | packets += other.packets; |
| 360 | } |
| 361 | |
| 362 | void Subtract(const RtpPacketCounter& other) { |
| 363 | RTC_DCHECK_GE(header_bytes, other.header_bytes); |
| 364 | header_bytes -= other.header_bytes; |
| 365 | RTC_DCHECK_GE(payload_bytes, other.payload_bytes); |
| 366 | payload_bytes -= other.payload_bytes; |
| 367 | RTC_DCHECK_GE(padding_bytes, other.padding_bytes); |
| 368 | padding_bytes -= other.padding_bytes; |
| 369 | RTC_DCHECK_GE(packets, other.packets); |
| 370 | packets -= other.packets; |
| 371 | } |
| 372 | |
Niels Möller | dbb988b | 2018-11-15 08:05:16 +0100 | [diff] [blame] | 373 | // Not inlined, since use of RtpPacket would result in circular includes. |
| 374 | void AddPacket(const RtpPacket& packet); |
Patrik Höglund | 3e11343 | 2017-12-15 14:40:10 +0100 | [diff] [blame] | 375 | |
| 376 | size_t TotalBytes() const { |
| 377 | return header_bytes + payload_bytes + padding_bytes; |
| 378 | } |
| 379 | |
| 380 | size_t header_bytes; // Number of bytes used by RTP headers. |
| 381 | size_t payload_bytes; // Payload bytes, excluding RTP headers and padding. |
| 382 | size_t padding_bytes; // Number of padding bytes. |
| 383 | uint32_t packets; // Number of packets. |
| 384 | }; |
| 385 | |
| 386 | // Data usage statistics for a (rtp) stream. |
| 387 | struct StreamDataCounters { |
| 388 | StreamDataCounters(); |
| 389 | |
| 390 | void Add(const StreamDataCounters& other) { |
| 391 | transmitted.Add(other.transmitted); |
| 392 | retransmitted.Add(other.retransmitted); |
| 393 | fec.Add(other.fec); |
| 394 | if (other.first_packet_time_ms != -1 && |
| 395 | (other.first_packet_time_ms < first_packet_time_ms || |
| 396 | first_packet_time_ms == -1)) { |
| 397 | // Use oldest time. |
| 398 | first_packet_time_ms = other.first_packet_time_ms; |
| 399 | } |
| 400 | } |
| 401 | |
| 402 | void Subtract(const StreamDataCounters& other) { |
| 403 | transmitted.Subtract(other.transmitted); |
| 404 | retransmitted.Subtract(other.retransmitted); |
| 405 | fec.Subtract(other.fec); |
| 406 | if (other.first_packet_time_ms != -1 && |
| 407 | (other.first_packet_time_ms > first_packet_time_ms || |
| 408 | first_packet_time_ms == -1)) { |
| 409 | // Use youngest time. |
| 410 | first_packet_time_ms = other.first_packet_time_ms; |
| 411 | } |
| 412 | } |
| 413 | |
| 414 | int64_t TimeSinceFirstPacketInMs(int64_t now_ms) const { |
| 415 | return (first_packet_time_ms == -1) ? -1 : (now_ms - first_packet_time_ms); |
| 416 | } |
| 417 | |
| 418 | // Returns the number of bytes corresponding to the actual media payload (i.e. |
| 419 | // RTP headers, padding, retransmissions and fec packets are excluded). |
| 420 | // Note this function does not have meaning for an RTX stream. |
| 421 | size_t MediaPayloadBytes() const { |
| 422 | return transmitted.payload_bytes - retransmitted.payload_bytes - |
| 423 | fec.payload_bytes; |
| 424 | } |
| 425 | |
Jonas Olsson | a4d8737 | 2019-07-05 19:08:33 +0200 | [diff] [blame] | 426 | int64_t first_packet_time_ms; // Time when first packet is sent/received. |
Henrik Boström | cb755b0 | 2019-04-02 15:11:48 +0200 | [diff] [blame] | 427 | // The timestamp at which the last packet was received, i.e. the time of the |
| 428 | // local clock when it was received - not the RTP timestamp of that packet. |
| 429 | // https://w3c.github.io/webrtc-stats/#dom-rtcinboundrtpstreamstats-lastpacketreceivedtimestamp |
| 430 | absl::optional<int64_t> last_packet_received_timestamp_ms; |
Patrik Höglund | 3e11343 | 2017-12-15 14:40:10 +0100 | [diff] [blame] | 431 | RtpPacketCounter transmitted; // Number of transmitted packets/bytes. |
| 432 | RtpPacketCounter retransmitted; // Number of retransmitted packets/bytes. |
| 433 | RtpPacketCounter fec; // Number of redundancy packets/bytes. |
| 434 | }; |
| 435 | |
| 436 | // Callback, called whenever byte/packet counts have been updated. |
| 437 | class StreamDataCountersCallback { |
| 438 | public: |
| 439 | virtual ~StreamDataCountersCallback() {} |
| 440 | |
| 441 | virtual void DataCountersUpdated(const StreamDataCounters& counters, |
| 442 | uint32_t ssrc) = 0; |
| 443 | }; |
| 444 | |
Niels Möller | 5fe9510 | 2019-03-04 16:49:25 +0100 | [diff] [blame] | 445 | class RtcpAckObserver { |
| 446 | public: |
| 447 | // This method is called on received report blocks matching the sender ssrc. |
| 448 | // TODO(nisse): Use of "extended" sequence number is a bit brittle, since the |
| 449 | // observer for this callback typically has its own sequence number unwrapper, |
| 450 | // and there's no guarantee that they are in sync. Change to pass raw sequence |
| 451 | // number, possibly augmented with timestamp (if available) to aid |
| 452 | // disambiguation. |
| 453 | virtual void OnReceivedAck(int64_t extended_highest_sequence_number) = 0; |
| 454 | |
| 455 | virtual ~RtcpAckObserver() = default; |
| 456 | }; |
| 457 | |
Niels Möller | 449901d | 2019-05-07 14:39:05 +0200 | [diff] [blame] | 458 | // Callback, used to notify an observer whenever new rates have been estimated. |
| 459 | class BitrateStatisticsObserver { |
| 460 | public: |
| 461 | virtual ~BitrateStatisticsObserver() {} |
| 462 | |
| 463 | virtual void Notify(uint32_t total_bitrate_bps, |
| 464 | uint32_t retransmit_bitrate_bps, |
| 465 | uint32_t ssrc) = 0; |
| 466 | }; |
| 467 | |
| 468 | // Callback, used to notify an observer whenever the send-side delay is updated. |
| 469 | class SendSideDelayObserver { |
| 470 | public: |
| 471 | virtual ~SendSideDelayObserver() {} |
| 472 | virtual void SendSideDelayUpdated(int avg_delay_ms, |
| 473 | int max_delay_ms, |
Henrik Boström | 9fe1834 | 2019-05-16 18:38:20 +0200 | [diff] [blame] | 474 | uint64_t total_delay_ms, |
Niels Möller | 449901d | 2019-05-07 14:39:05 +0200 | [diff] [blame] | 475 | uint32_t ssrc) = 0; |
| 476 | }; |
| 477 | |
| 478 | // Callback, used to notify an observer whenever a packet is sent to the |
| 479 | // transport. |
| 480 | // TODO(asapersson): This class will remove the need for SendSideDelayObserver. |
| 481 | // Remove SendSideDelayObserver once possible. |
| 482 | class SendPacketObserver { |
| 483 | public: |
| 484 | virtual ~SendPacketObserver() {} |
| 485 | virtual void OnSendPacket(uint16_t packet_id, |
| 486 | int64_t capture_time_ms, |
| 487 | uint32_t ssrc) = 0; |
| 488 | }; |
| 489 | |
Erik Språng | d287962 | 2019-05-10 08:29:01 -0700 | [diff] [blame] | 490 | // Status returned from TimeToSendPacket() family of callbacks. |
| 491 | enum class RtpPacketSendResult { |
| 492 | kSuccess, // Packet sent OK. |
| 493 | kTransportUnavailable, // Network unavailable, try again later. |
| 494 | kPacketNotFound // SSRC/sequence number does not map to an available packet. |
| 495 | }; |
| 496 | |
Henrik Kjellander | ff761fb | 2015-11-04 08:31:52 +0100 | [diff] [blame] | 497 | } // namespace webrtc |
Mirko Bonadei | 92ea95e | 2017-09-15 06:47:31 +0200 | [diff] [blame] | 498 | #endif // MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_ |