1 /* 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> 15 #include <stdint.h> 16 17 #include <string> 18 19 #include "absl/types/optional.h" 20 #include "api/array_view.h" 21 #include "api/units/timestamp.h" 22 #include "api/video/color_space.h" 23 #include "api/video/video_content_type.h" 24 #include "api/video/video_rotation.h" 25 #include "api/video/video_timing.h" 26 27 namespace webrtc { 28 29 struct FeedbackRequest { 30 // Determines whether the recv delta as specified in 31 // https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01 32 // should be included. 33 bool include_timestamps; 34 // Include feedback of received packets in the range [sequence_number - 35 // sequence_count + 1, sequence_number]. That is, no feedback will be sent if 36 // sequence_count is zero. 37 int sequence_count; 38 }; 39 40 // The Absolute Capture Time extension is used to stamp RTP packets with a NTP 41 // timestamp showing when the first audio or video frame in a packet was 42 // originally captured. The intent of this extension is to provide a way to 43 // accomplish audio-to-video synchronization when RTCP-terminating intermediate 44 // systems (e.g. mixers) are involved. See: 45 // http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time 46 struct AbsoluteCaptureTime { 47 // Absolute capture timestamp is the NTP timestamp of when the first frame in 48 // a packet was originally captured. This timestamp MUST be based on the same 49 // clock as the clock used to generate NTP timestamps for RTCP sender reports 50 // on the capture system. 51 // 52 // It’s not always possible to do an NTP clock readout at the exact moment of 53 // when a media frame is captured. A capture system MAY postpone the readout 54 // until a more convenient time. A capture system SHOULD have known delays 55 // (e.g. from hardware buffers) subtracted from the readout to make the final 56 // timestamp as close to the actual capture time as possible. 57 // 58 // This field is encoded as a 64-bit unsigned fixed-point number with the high 59 // 32 bits for the timestamp in seconds and low 32 bits for the fractional 60 // part. This is also known as the UQ32.32 format and is what the RTP 61 // specification defines as the canonical format to represent NTP timestamps. 62 uint64_t absolute_capture_timestamp; 63 64 // Estimated capture clock offset is the sender’s estimate of the offset 65 // between its own NTP clock and the capture system’s NTP clock. The sender is 66 // here defined as the system that owns the NTP clock used to generate the NTP 67 // timestamps for the RTCP sender reports on this stream. The sender system is 68 // typically either the capture system or a mixer. 69 // 70 // This field is encoded as a 64-bit two’s complement signed fixed-point 71 // number with the high 32 bits for the seconds and low 32 bits for the 72 // fractional part. It’s intended to make it easy for a receiver, that knows 73 // how to estimate the sender system’s NTP clock, to also estimate the capture 74 // system’s NTP clock: 75 // 76 // Capture NTP Clock = Sender NTP Clock + Capture Clock Offset 77 absl::optional<int64_t> estimated_capture_clock_offset; 78 }; 79 80 inline bool operator==(const AbsoluteCaptureTime& lhs, 81 const AbsoluteCaptureTime& rhs) { 82 return (lhs.absolute_capture_timestamp == rhs.absolute_capture_timestamp) && 83 (lhs.estimated_capture_clock_offset == 84 rhs.estimated_capture_clock_offset); 85 } 86 87 inline bool operator!=(const AbsoluteCaptureTime& lhs, 88 const AbsoluteCaptureTime& rhs) { 89 return !(lhs == rhs); 90 } 91 92 struct RTPHeaderExtension { 93 RTPHeaderExtension(); 94 RTPHeaderExtension(const RTPHeaderExtension& other); 95 RTPHeaderExtension& operator=(const RTPHeaderExtension& other); 96 97 static constexpr int kAbsSendTimeFraction = 18; 98 GetAbsoluteSendTimestampRTPHeaderExtension99 Timestamp GetAbsoluteSendTimestamp() const { 100 RTC_DCHECK(hasAbsoluteSendTime); 101 RTC_DCHECK(absoluteSendTime < (1ul << 24)); 102 return Timestamp::Micros((absoluteSendTime * 1000000ll) / 103 (1 << kAbsSendTimeFraction)); 104 } 105 106 bool hasTransmissionTimeOffset; 107 int32_t transmissionTimeOffset; 108 bool hasAbsoluteSendTime; 109 uint32_t absoluteSendTime; 110 absl::optional<AbsoluteCaptureTime> absolute_capture_time; 111 bool hasTransportSequenceNumber; 112 uint16_t transportSequenceNumber; 113 absl::optional<FeedbackRequest> feedback_request; 114 115 // Audio Level includes both level in dBov and voiced/unvoiced bit. See: 116 // https://tools.ietf.org/html/rfc6464#section-3 117 bool hasAudioLevel; 118 bool voiceActivity; 119 uint8_t audioLevel; 120 121 // For Coordination of Video Orientation. See 122 // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ 123 // ts_126114v120700p.pdf 124 bool hasVideoRotation; 125 VideoRotation videoRotation; 126 127 // TODO(ilnik): Refactor this and one above to be absl::optional() and remove 128 // a corresponding bool flag. 129 bool hasVideoContentType; 130 VideoContentType videoContentType; 131 132 bool has_video_timing; 133 VideoSendTiming video_timing; 134 135 VideoPlayoutDelay playout_delay; 136 137 // For identification of a stream when ssrc is not signaled. See 138 // https://tools.ietf.org/html/rfc8852 139 std::string stream_id; 140 std::string repaired_stream_id; 141 142 // For identifying the media section used to interpret this RTP packet. See 143 // https://tools.ietf.org/html/rfc8843 144 std::string mid; 145 146 absl::optional<ColorSpace> color_space; 147 }; 148 149 enum { kRtpCsrcSize = 15 }; // RFC 3550 page 13 150 151 struct RTPHeader { 152 RTPHeader(); 153 RTPHeader(const RTPHeader& other); 154 RTPHeader& operator=(const RTPHeader& other); 155 156 bool markerBit; 157 uint8_t payloadType; 158 uint16_t sequenceNumber; 159 uint32_t timestamp; 160 uint32_t ssrc; 161 uint8_t numCSRCs; 162 uint32_t arrOfCSRCs[kRtpCsrcSize]; 163 size_t paddingLength; 164 size_t headerLength; 165 int payload_type_frequency; 166 RTPHeaderExtension extension; 167 }; 168 169 // RTCP mode to use. Compound mode is described by RFC 4585 and reduced-size 170 // RTCP mode is described by RFC 5506. 171 enum class RtcpMode { kOff, kCompound, kReducedSize }; 172 173 enum NetworkState { 174 kNetworkUp, 175 kNetworkDown, 176 }; 177 178 } // namespace webrtc 179 180 #endif // API_RTP_HEADERS_H_ 181