blob: 454149ca6e7ae57f0ea0981710323e6579ceda1b [file] [log] [blame]
Patrik Höglund3e113432017-12-15 14:40:10 +01001/*
2 * Copyright (c) 2017 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 API_RTP_HEADERS_H_
12#define API_RTP_HEADERS_H_
13
14#include <stddef.h>
Yves Gerey988cc082018-10-23 12:03:01 +020015#include <stdint.h>
Jonas Olssona4d87372019-07-05 19:08:33 +020016
Niels Möllerd57efc12019-03-22 14:02:11 +010017#include <string>
Patrik Höglund3e113432017-12-15 14:40:10 +010018
Johannes Kronad1d9f02018-11-09 11:12:36 +010019#include "absl/types/optional.h"
Patrik Höglund3e113432017-12-15 14:40:10 +010020#include "api/array_view.h"
Sebastian Jansson3d61ab12019-06-14 13:35:51 +020021#include "api/units/timestamp.h"
Johannes Kron09d65882018-11-27 14:36:41 +010022#include "api/video/color_space.h"
Patrik Höglund3e113432017-12-15 14:40:10 +010023#include "api/video/video_content_type.h"
24#include "api/video/video_rotation.h"
25#include "api/video/video_timing.h"
philipel94659782020-06-15 12:26:39 +020026#include "common_types.h" // NOLINT (build/include)
Patrik Höglund3e113432017-12-15 14:40:10 +010027
28namespace webrtc {
29
Johannes Kron075f6872019-02-14 14:41:05 +010030struct FeedbackRequest {
31 // Determines whether the recv delta as specified in
32 // https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01
33 // should be included.
34 bool include_timestamps;
35 // Include feedback of received packets in the range [sequence_number -
Johannes Kron0da25a12019-03-06 09:34:13 +010036 // sequence_count + 1, sequence_number]. That is, no feedback will be sent if
37 // sequence_count is zero.
Johannes Kron075f6872019-02-14 14:41:05 +010038 int sequence_count;
39};
40
Chen Xingcd8a6e22019-07-01 10:56:51 +020041// The Absolute Capture Time extension is used to stamp RTP packets with a NTP
42// timestamp showing when the first audio or video frame in a packet was
43// originally captured. The intent of this extension is to provide a way to
44// accomplish audio-to-video synchronization when RTCP-terminating intermediate
45// systems (e.g. mixers) are involved. See:
46// http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time
47struct AbsoluteCaptureTime {
48 // Absolute capture timestamp is the NTP timestamp of when the first frame in
49 // a packet was originally captured. This timestamp MUST be based on the same
50 // clock as the clock used to generate NTP timestamps for RTCP sender reports
51 // on the capture system.
52 //
53 // It’s not always possible to do an NTP clock readout at the exact moment of
54 // when a media frame is captured. A capture system MAY postpone the readout
55 // until a more convenient time. A capture system SHOULD have known delays
56 // (e.g. from hardware buffers) subtracted from the readout to make the final
57 // timestamp as close to the actual capture time as possible.
58 //
59 // This field is encoded as a 64-bit unsigned fixed-point number with the high
60 // 32 bits for the timestamp in seconds and low 32 bits for the fractional
61 // part. This is also known as the UQ32.32 format and is what the RTP
62 // specification defines as the canonical format to represent NTP timestamps.
63 uint64_t absolute_capture_timestamp;
64
65 // Estimated capture clock offset is the sender’s estimate of the offset
66 // between its own NTP clock and the capture system’s NTP clock. The sender is
67 // here defined as the system that owns the NTP clock used to generate the NTP
68 // timestamps for the RTCP sender reports on this stream. The sender system is
69 // typically either the capture system or a mixer.
70 //
71 // This field is encoded as a 64-bit two’s complement signed fixed-point
72 // number with the high 32 bits for the seconds and low 32 bits for the
73 // fractional part. It’s intended to make it easy for a receiver, that knows
74 // how to estimate the sender system’s NTP clock, to also estimate the capture
75 // system’s NTP clock:
76 //
77 // Capture NTP Clock = Sender NTP Clock + Capture Clock Offset
78 absl::optional<int64_t> estimated_capture_clock_offset;
79};
80
Chen Xinge08648d2019-08-05 16:29:13 +020081inline bool operator==(const AbsoluteCaptureTime& lhs,
82 const AbsoluteCaptureTime& rhs) {
83 return (lhs.absolute_capture_timestamp == rhs.absolute_capture_timestamp) &&
84 (lhs.estimated_capture_clock_offset ==
85 rhs.estimated_capture_clock_offset);
86}
87
88inline bool operator!=(const AbsoluteCaptureTime& lhs,
89 const AbsoluteCaptureTime& rhs) {
90 return !(lhs == rhs);
91}
92
Patrik Höglund3e113432017-12-15 14:40:10 +010093struct RTPHeaderExtension {
94 RTPHeaderExtension();
95 RTPHeaderExtension(const RTPHeaderExtension& other);
96 RTPHeaderExtension& operator=(const RTPHeaderExtension& other);
97
Sebastian Jansson3d61ab12019-06-14 13:35:51 +020098 static constexpr int kAbsSendTimeFraction = 18;
99
100 Timestamp GetAbsoluteSendTimestamp() const {
101 RTC_DCHECK(hasAbsoluteSendTime);
102 RTC_DCHECK(absoluteSendTime < (1ul << 24));
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100103 return Timestamp::Micros((absoluteSendTime * 1000000ll) /
104 (1 << kAbsSendTimeFraction));
Sebastian Jansson3d61ab12019-06-14 13:35:51 +0200105 }
106
Per Kjellander52f7ae72019-09-10 19:28:06 +0200107 TimeDelta GetAbsoluteSendTimeDelta(uint32_t previous_sendtime) const {
108 RTC_DCHECK(hasAbsoluteSendTime);
109 RTC_DCHECK(absoluteSendTime < (1ul << 24));
110 RTC_DCHECK(previous_sendtime < (1ul << 24));
111 int32_t delta =
112 static_cast<int32_t>((absoluteSendTime - previous_sendtime) << 8) >> 8;
Danil Chapovalov0c626af2020-02-10 11:16:00 +0100113 return TimeDelta::Micros((delta * 1000000ll) / (1 << kAbsSendTimeFraction));
Per Kjellander52f7ae72019-09-10 19:28:06 +0200114 }
115
Patrik Höglund3e113432017-12-15 14:40:10 +0100116 bool hasTransmissionTimeOffset;
117 int32_t transmissionTimeOffset;
118 bool hasAbsoluteSendTime;
119 uint32_t absoluteSendTime;
Chen Xingcd8a6e22019-07-01 10:56:51 +0200120 absl::optional<AbsoluteCaptureTime> absolute_capture_time;
Patrik Höglund3e113432017-12-15 14:40:10 +0100121 bool hasTransportSequenceNumber;
122 uint16_t transportSequenceNumber;
Johannes Kron075f6872019-02-14 14:41:05 +0100123 absl::optional<FeedbackRequest> feedback_request;
Patrik Höglund3e113432017-12-15 14:40:10 +0100124
125 // Audio Level includes both level in dBov and voiced/unvoiced bit. See:
Chen Xingd2a66862019-06-03 14:53:42 +0200126 // https://tools.ietf.org/html/rfc6464#section-3
Patrik Höglund3e113432017-12-15 14:40:10 +0100127 bool hasAudioLevel;
128 bool voiceActivity;
129 uint8_t audioLevel;
130
131 // For Coordination of Video Orientation. See
132 // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/
133 // ts_126114v120700p.pdf
134 bool hasVideoRotation;
135 VideoRotation videoRotation;
136
Danil Chapovalov0bc58cf2018-06-21 13:32:56 +0200137 // TODO(ilnik): Refactor this and one above to be absl::optional() and remove
Patrik Höglund3e113432017-12-15 14:40:10 +0100138 // a corresponding bool flag.
139 bool hasVideoContentType;
140 VideoContentType videoContentType;
141
142 bool has_video_timing;
143 VideoSendTiming video_timing;
144
145 PlayoutDelay playout_delay = {-1, -1};
146
147 // For identification of a stream when ssrc is not signaled. See
148 // https://tools.ietf.org/html/draft-ietf-avtext-rid-09
149 // TODO(danilchap): Update url from draft to release version.
Niels Möllerd57efc12019-03-22 14:02:11 +0100150 std::string stream_id;
151 std::string repaired_stream_id;
Patrik Höglund3e113432017-12-15 14:40:10 +0100152
153 // For identifying the media section used to interpret this RTP packet. See
154 // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-bundle-negotiation-38
Niels Möllerd57efc12019-03-22 14:02:11 +0100155 std::string mid;
Johannes Kronad1d9f02018-11-09 11:12:36 +0100156
Johannes Kron09d65882018-11-27 14:36:41 +0100157 absl::optional<ColorSpace> color_space;
Patrik Höglund3e113432017-12-15 14:40:10 +0100158};
159
Niels Möller418f5802019-05-08 14:24:15 +0200160enum { kRtpCsrcSize = 15 }; // RFC 3550 page 13
161
Patrik Höglund3e113432017-12-15 14:40:10 +0100162struct RTPHeader {
163 RTPHeader();
164 RTPHeader(const RTPHeader& other);
165 RTPHeader& operator=(const RTPHeader& other);
166
167 bool markerBit;
168 uint8_t payloadType;
169 uint16_t sequenceNumber;
170 uint32_t timestamp;
171 uint32_t ssrc;
172 uint8_t numCSRCs;
173 uint32_t arrOfCSRCs[kRtpCsrcSize];
174 size_t paddingLength;
175 size_t headerLength;
176 int payload_type_frequency;
177 RTPHeaderExtension extension;
178};
179
180// RTCP mode to use. Compound mode is described by RFC 4585 and reduced-size
181// RTCP mode is described by RFC 5506.
182enum class RtcpMode { kOff, kCompound, kReducedSize };
183
184enum NetworkState {
185 kNetworkUp,
186 kNetworkDown,
187};
188
Patrik Höglund3e113432017-12-15 14:40:10 +0100189} // namespace webrtc
190
191#endif // API_RTP_HEADERS_H_