blob: 81c1a981b6aed0cc20fd50d45855ebf88e8425f0 [file] [log] [blame]
Henrik Kjellanderff761fb2015-11-04 08:31:52 +01001/*
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 Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_
12#define MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010013
14#include <stddef.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020015
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010016#include <list>
Stefan Holmer60e43462016-09-07 09:58:20 +020017#include <vector>
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010018
Niels Möllera7de6982019-03-21 15:48:49 +010019#include "absl/strings/string_view.h"
Erik Språng490d76c2019-05-07 09:29:15 -070020#include "absl/types/optional.h"
Danil Chapovalovfb8e7ef2018-06-26 10:44:13 +020021#include "absl/types/variant.h"
Erik Språng490d76c2019-05-07 09:29:15 -070022#include "api/array_view.h"
Karl Wibergc62f6c72017-10-04 12:38:53 +020023#include "api/audio_codecs/audio_format.h"
Patrik Höglund3e113432017-12-15 14:40:10 +010024#include "api/rtp_headers.h"
Danil Chapovalovdb128562018-09-17 13:11:50 +020025#include "api/transport/network_types.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "modules/include/module_common_types.h"
Sebastian Janssone1795f42019-07-24 11:38:03 +020027#include "modules/rtp_rtcp/source/rtcp_packet/remote_estimate.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020028#include "system_wrappers/include/clock.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010029
Yves Gerey665174f2018-06-19 15:03:05 +020030#define RTCP_CNAME_SIZE 256 // RFC 3550 page 44, including null termination
31#define IP_PACKET_SIZE 1500 // we assume ethernet
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010032
33namespace webrtc {
Niels Möllerdbb988b2018-11-15 08:05:16 +010034class RtpPacket;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010035namespace rtcp {
36class TransportFeedback;
37}
38
39const int kVideoPayloadTypeFrequency = 90000;
Ilya Nikolaevskiy5e58bcb2018-10-24 13:34:32 +020040
41// TODO(bugs.webrtc.org/6458): Remove this when all the depending projects are
42// updated to correctly set rtp rate for RtcpSender.
solenbergb19d2882016-10-03 06:22:25 -070043const int kBogusRtpRateForAudioRtcp = 8000;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010044
45// Minimum RTP header size in bytes.
46const uint8_t kRtpHeaderSize = 12;
47
Yves Gerey665174f2018-06-19 15:03:05 +020048enum StorageType { kDontRetransmit, kAllowRetransmission };
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010049
Niels Möllera7de6982019-03-21 15:48:49 +010050bool IsLegalMidName(absl::string_view name);
51bool IsLegalRsidName(absl::string_view name);
52
Johannes Kronc5744b82018-09-24 14:50:48 +020053// This enum must not have any gaps, i.e., all integers between
54// kRtpExtensionNone and kRtpExtensionNumberOfExtensions must be valid enum
55// entries.
56enum RTPExtensionType : int {
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010057 kRtpExtensionNone,
58 kRtpExtensionTransmissionTimeOffset,
59 kRtpExtensionAudioLevel,
60 kRtpExtensionAbsoluteSendTime,
Chen Xingcd8a6e22019-07-01 10:56:51 +020061 kRtpExtensionAbsoluteCaptureTime,
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010062 kRtpExtensionVideoRotation,
63 kRtpExtensionTransportSequenceNumber,
Johannes Kron54047be2019-02-21 14:09:20 +000064 kRtpExtensionTransportSequenceNumber02,
isheriff6b4b5f32016-06-08 00:24:21 -070065 kRtpExtensionPlayoutDelay,
ilnik00d802b2017-04-11 10:34:31 -070066 kRtpExtensionVideoContentType,
ilnik04f4d122017-06-19 07:18:55 -070067 kRtpExtensionVideoTiming,
Johnny Leee0c8b232018-09-11 16:50:49 -040068 kRtpExtensionFrameMarking,
danilchapef8d7732017-04-19 02:59:48 -070069 kRtpExtensionRtpStreamId,
70 kRtpExtensionRepairedRtpStreamId,
Steve Antona3251dd2017-07-21 09:58:31 -070071 kRtpExtensionMid,
Elad Alonccb9b752019-02-19 13:01:31 +010072 kRtpExtensionGenericFrameDescriptor00,
73 kRtpExtensionGenericFrameDescriptor = kRtpExtensionGenericFrameDescriptor00,
74 kRtpExtensionGenericFrameDescriptor01,
Danil Chapovalov52e52422019-06-27 16:45:40 +020075 kRtpExtensionGenericFrameDescriptor02,
Johannes Kron09d65882018-11-27 14:36:41 +010076 kRtpExtensionColorSpace,
ilnik00d802b2017-04-11 10:34:31 -070077 kRtpExtensionNumberOfExtensions // Must be the last entity in the enum.
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010078};
79
danilchap5c1def82015-12-10 09:51:54 -080080enum RTCPAppSubTypes { kAppSubtypeBwe = 0x00 };
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010081
82// TODO(sprang): Make this an enum class once rtcp_receiver has been cleaned up.
83enum 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 Kjellanderff761fb2015-11-04 08:31:52 +010095 kRtcpApp = 0x1000,
Elad Alonf8e7ccb2019-01-24 12:38:36 +010096 kRtcpLossNotification = 0x2000,
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010097 kRtcpRemb = 0x10000,
98 kRtcpTransmissionTimeOffset = 0x20000,
99 kRtcpXrReceiverReferenceTime = 0x40000,
100 kRtcpXrDlrrReportBlock = 0x80000,
101 kRtcpTransportFeedback = 0x100000,
sprang5e38c962016-12-01 05:18:09 -0800102 kRtcpXrTargetBitrate = 0x200000
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100103};
104
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100105enum RtxMode {
Yves Gerey665174f2018-06-19 15:03:05 +0200106 kRtxOff = 0x0,
107 kRtxRetransmitted = 0x1, // Only send retransmissions over RTX.
108 kRtxRedundantPayloads = 0x2 // Preventively send redundant payloads
109 // instead of padding.
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100110};
111
112const size_t kRtxHeaderSize = 2;
113
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100114struct RTCPReportBlock {
115 RTCPReportBlock()
srte3e69e5c2017-08-09 06:13:45 -0700116 : 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 Kjellanderff761fb2015-11-04 08:31:52 +0100124
srte3e69e5c2017-08-09 06:13:45 -0700125 RTCPReportBlock(uint32_t sender_ssrc,
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100126 uint32_t source_ssrc,
127 uint8_t fraction_lost,
Harald Alvestrand70206d62017-12-08 08:59:07 +0100128 int32_t packets_lost,
srte3e69e5c2017-08-09 06:13:45 -0700129 uint32_t extended_highest_sequence_number,
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100130 uint32_t jitter,
srte3e69e5c2017-08-09 06:13:45 -0700131 uint32_t last_sender_report_timestamp,
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100132 uint32_t delay_since_last_sender_report)
srte3e69e5c2017-08-09 06:13:45 -0700133 : 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 Kjellanderff761fb2015-11-04 08:31:52 +0100138 jitter(jitter),
srte3e69e5c2017-08-09 06:13:45 -0700139 last_sender_report_timestamp(last_sender_report_timestamp),
140 delay_since_last_sender_report(delay_since_last_sender_report) {}
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100141
142 // Fields as described by RFC 3550 6.4.2.
Danil Chapovalov84c1a152017-11-15 16:28:20 +0100143 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 Jansson9701e0c2018-08-09 11:21:11 +0200146 int32_t packets_lost; // 24 bits valid.
Danil Chapovalov84c1a152017-11-15 16:28:20 +0100147 uint32_t extended_highest_sequence_number;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100148 uint32_t jitter;
Danil Chapovalov84c1a152017-11-15 16:28:20 +0100149 uint32_t last_sender_report_timestamp;
150 uint32_t delay_since_last_sender_report;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100151};
152
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100153typedef std::list<RTCPReportBlock> ReportBlockList;
154
155struct 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
nisse30e89312017-05-29 08:16:37 -0700171// 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.
174class RecoveredPacketReceiver {
175 public:
176 virtual void OnRecoveredPacket(const uint8_t* packet, size_t length) = 0;
177
178 protected:
179 virtual ~RecoveredPacketReceiver() = default;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100180};
181
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100182class RtcpIntraFrameObserver {
183 public:
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100184 virtual ~RtcpIntraFrameObserver() {}
Danil Chapovalov92f83ce2018-05-28 12:53:50 +0200185
186 virtual void OnReceivedIntraFrameRequest(uint32_t ssrc) = 0;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100187};
188
Elad Alon0a8562e2019-04-09 11:55:13 +0200189// Observer for incoming LossNotification RTCP messages.
190// See the documentation of LossNotification for details.
191class 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 Kjellanderff761fb2015-11-04 08:31:52 +0100201class 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.alonf9490002017-03-06 05:32:21 -0800214struct PacketFeedback {
Sebastian Jansson789f4592018-10-09 18:30:28 +0200215 PacketFeedback(int64_t arrival_time_ms, uint16_t sequence_number);
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100216
elad.alonf9490002017-03-06 05:32:21 -0800217 PacketFeedback(int64_t arrival_time_ms,
218 int64_t send_time_ms,
219 uint16_t sequence_number,
220 size_t payload_size,
Sebastian Jansson789f4592018-10-09 18:30:28 +0200221 const PacedPacketInfo& pacing_info);
Stefan Holmer9ea46b52017-03-15 12:40:25 +0100222
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 Jansson789f4592018-10-09 18:30:28 +0200228 const PacedPacketInfo& pacing_info);
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100229
elad.alonf9490002017-03-06 05:32:21 -0800230 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 Holmer9ea46b52017-03-15 12:40:25 +0100235 uint16_t local_net_id,
236 uint16_t remote_net_id,
Sebastian Jansson789f4592018-10-09 18:30:28 +0200237 const PacedPacketInfo& pacing_info);
238 PacketFeedback(const PacketFeedback&);
239 PacketFeedback& operator=(const PacketFeedback&);
240 ~PacketFeedback();
philipel8aadd502017-02-23 02:56:13 -0800241
242 static constexpr int kNotAProbe = -1;
elad.alonec304f92017-03-08 05:03:53 -0800243 static constexpr int64_t kNotReceived = -1;
srtee0572e52017-11-30 09:59:33 +0100244 static constexpr int64_t kNoSendTime = -1;
philipel8aadd502017-02-23 02:56:13 -0800245
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.alonf9490002017-03-06 05:32:21 -0800249 // TODO(philipel): Remove |creation_time_ms| from PacketFeedback when cleaning
250 // up SendTimeHistory.
Sebastian Jansson789f4592018-10-09 18:30:28 +0200251 bool operator==(const PacketFeedback& rhs) const;
philipela1ed0b32016-06-01 06:31:17 -0700252
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100253 // 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.alonec304f92017-03-08 05:03:53 -0800256 // receiver's clock. For unreceived packet, the sentinel value kNotReceived
257 // is used.
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100258 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 Jansson02c65862018-05-22 11:03:04 +0200265 // Session unique packet identifier, incremented with 1 for every packet
266 // generated by the sender.
267 int64_t long_sequence_number;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100268 // Size of the packet excluding RTP headers.
269 size_t payload_size;
Sebastian Jansson789f4592018-10-09 18:30:28 +0200270 // Size of preceeding packets that are not part of feedback.
271 size_t unacknowledged_data;
Stefan Holmer9ea46b52017-03-15 12:40:25 +0100272 // The network route ids that this packet is associated with.
273 uint16_t local_net_id;
274 uint16_t remote_net_id;
philipel8aadd502017-02-23 02:56:13 -0800275 // Pacing information about this packet.
276 PacedPacketInfo pacing_info;
Erik Språng30a276b2019-04-23 12:00:11 +0200277
278 // The SSRC and RTP sequence number of the packet this feedback refers to.
Erik Språng490d76c2019-05-07 09:29:15 -0700279 absl::optional<uint32_t> ssrc;
Erik Språng30a276b2019-04-23 12:00:11 +0200280 uint16_t rtp_sequence_number;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100281};
282
Erik Språng30a276b2019-04-23 12:00:11 +0200283struct 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 Janssone1795f42019-07-24 11:38:03 +0200295class NetworkStateEstimateObserver {
296 public:
297 virtual void OnRemoteNetworkEstimate(NetworkStateEstimate estimate) = 0;
298 virtual ~NetworkStateEstimateObserver() = default;
299};
Erik Språng30a276b2019-04-23 12:00:11 +0200300
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100301class TransportFeedbackObserver {
302 public:
303 TransportFeedbackObserver() {}
304 virtual ~TransportFeedbackObserver() {}
305
Erik Språng2a27be92019-04-24 08:09:20 +0200306 virtual void OnAddPacket(const RtpPacketSendInfo& packet_info) = 0;
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100307 virtual void OnTransportFeedback(const rtcp::TransportFeedback& feedback) = 0;
308};
309
Danil Chapovaloveb0edd82017-12-14 16:02:31 +0100310// 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.
314class RtcpFeedbackSenderInterface {
315 public:
316 virtual ~RtcpFeedbackSenderInterface() = default;
317 virtual uint32_t SSRC() const = 0;
318 virtual bool SendFeedbackPacket(const rtcp::TransportFeedback& feedback) = 0;
Sebastian Janssone1795f42019-07-24 11:38:03 +0200319 virtual bool SendNetworkStateEstimatePacket(
320 const rtcp::RemoteEstimate& packet) = 0;
Danil Chapovaloveb0edd82017-12-14 16:02:31 +0100321 virtual void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs) = 0;
322 virtual void UnsetRemb() = 0;
323};
324
elad.alond12a8e12017-03-23 11:04:48 -0700325class 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 Kjellanderff761fb2015-11-04 08:31:52 +0100334class RtcpRttStats {
335 public:
336 virtual void OnRttUpdate(int64_t rtt) = 0;
337
338 virtual int64_t LastProcessedRtt() const = 0;
339
danilchap5c1def82015-12-10 09:51:54 -0800340 virtual ~RtcpRttStats() {}
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100341};
342
Henrik Kjellanderff761fb2015-11-04 08:31:52 +0100343class TransportSequenceNumberAllocator {
344 public:
345 TransportSequenceNumberAllocator() {}
346 virtual ~TransportSequenceNumberAllocator() {}
347
348 virtual uint16_t AllocateSequenceNumber() = 0;
349};
350
Patrik Höglund3e113432017-12-15 14:40:10 +0100351struct 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öllerdbb988b2018-11-15 08:05:16 +0100373 // Not inlined, since use of RtpPacket would result in circular includes.
374 void AddPacket(const RtpPacket& packet);
Patrik Höglund3e113432017-12-15 14:40:10 +0100375
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.
387struct 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 Olssona4d87372019-07-05 19:08:33 +0200426 int64_t first_packet_time_ms; // Time when first packet is sent/received.
Henrik Boströmcb755b02019-04-02 15:11:48 +0200427 // 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öglund3e113432017-12-15 14:40:10 +0100431 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.
437class StreamDataCountersCallback {
438 public:
439 virtual ~StreamDataCountersCallback() {}
440
441 virtual void DataCountersUpdated(const StreamDataCounters& counters,
442 uint32_t ssrc) = 0;
443};
444
Niels Möller5fe95102019-03-04 16:49:25 +0100445class 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öller449901d2019-05-07 14:39:05 +0200458// Callback, used to notify an observer whenever new rates have been estimated.
459class 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.
469class SendSideDelayObserver {
470 public:
471 virtual ~SendSideDelayObserver() {}
472 virtual void SendSideDelayUpdated(int avg_delay_ms,
473 int max_delay_ms,
Henrik Boström9fe18342019-05-16 18:38:20 +0200474 uint64_t total_delay_ms,
Niels Möller449901d2019-05-07 14:39:05 +0200475 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.
482class 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ångd2879622019-05-10 08:29:01 -0700490// Status returned from TimeToSendPacket() family of callbacks.
491enum 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 Kjellanderff761fb2015-11-04 08:31:52 +0100497} // namespace webrtc
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200498#endif // MODULES_RTP_RTCP_INCLUDE_RTP_RTCP_DEFINES_H_