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