|  | /* | 
|  | *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. | 
|  | * | 
|  | *  Use of this source code is governed by a BSD-style license | 
|  | *  that can be found in the LICENSE file in the root of the source | 
|  | *  tree. An additional intellectual property rights grant can be found | 
|  | *  in the file PATENTS.  All contributing project authors may | 
|  | *  be found in the AUTHORS file in the root of the source tree. | 
|  | */ | 
|  |  | 
|  | #ifndef API_RTP_HEADERS_H_ | 
|  | #define API_RTP_HEADERS_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <optional> | 
|  | #include <string> | 
|  |  | 
|  | #include "api/units/timestamp.h" | 
|  | #include "api/video/color_space.h" | 
|  | #include "api/video/video_content_type.h" | 
|  | #include "api/video/video_rotation.h" | 
|  | #include "api/video/video_timing.h" | 
|  | #include "rtc_base/checks.h" | 
|  | #include "rtc_base/system/rtc_export.h" | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | struct FeedbackRequest { | 
|  | // Determines whether the recv delta as specified in | 
|  | // https://tools.ietf.org/html/draft-holmer-rmcat-transport-wide-cc-extensions-01 | 
|  | // should be included. | 
|  | bool include_timestamps; | 
|  | // Include feedback of received packets in the range [sequence_number - | 
|  | // sequence_count + 1, sequence_number]. That is, no feedback will be sent if | 
|  | // sequence_count is zero. | 
|  | int sequence_count; | 
|  | }; | 
|  |  | 
|  | // The Absolute Capture Time extension is used to stamp RTP packets with a NTP | 
|  | // timestamp showing when the first audio or video frame in a packet was | 
|  | // originally captured. The intent of this extension is to provide a way to | 
|  | // accomplish audio-to-video synchronization when RTCP-terminating intermediate | 
|  | // systems (e.g. mixers) are involved. See: | 
|  | // http://www.webrtc.org/experiments/rtp-hdrext/abs-capture-time | 
|  | struct AbsoluteCaptureTime { | 
|  | // Absolute capture timestamp is the NTP timestamp of when the first frame in | 
|  | // a packet was originally captured. This timestamp MUST be based on the same | 
|  | // clock as the clock used to generate NTP timestamps for RTCP sender reports | 
|  | // on the capture system. | 
|  | // | 
|  | // It’s not always possible to do an NTP clock readout at the exact moment of | 
|  | // when a media frame is captured. A capture system MAY postpone the readout | 
|  | // until a more convenient time. A capture system SHOULD have known delays | 
|  | // (e.g. from hardware buffers) subtracted from the readout to make the final | 
|  | // timestamp as close to the actual capture time as possible. | 
|  | // | 
|  | // This field is encoded as a 64-bit unsigned fixed-point number with the high | 
|  | // 32 bits for the timestamp in seconds and low 32 bits for the fractional | 
|  | // part. This is also known as the UQ32.32 format and is what the RTP | 
|  | // specification defines as the canonical format to represent NTP timestamps. | 
|  | uint64_t absolute_capture_timestamp; | 
|  |  | 
|  | // Estimated capture clock offset is the sender’s estimate of the offset | 
|  | // between its own NTP clock and the capture system’s NTP clock. The sender is | 
|  | // here defined as the system that owns the NTP clock used to generate the NTP | 
|  | // timestamps for the RTCP sender reports on this stream. The sender system is | 
|  | // typically either the capture system or a mixer. | 
|  | // | 
|  | // This field is encoded as a 64-bit two’s complement signed fixed-point | 
|  | // number with the high 32 bits for the seconds and low 32 bits for the | 
|  | // fractional part. It’s intended to make it easy for a receiver, that knows | 
|  | // how to estimate the sender system’s NTP clock, to also estimate the capture | 
|  | // system’s NTP clock: | 
|  | // | 
|  | //   Capture NTP Clock = Sender NTP Clock + Capture Clock Offset | 
|  | std::optional<int64_t> estimated_capture_clock_offset; | 
|  | }; | 
|  |  | 
|  | // The audio level extension is used to indicate the voice activity and the | 
|  | // audio level of the payload in the RTP stream. See: | 
|  | // https://tools.ietf.org/html/rfc6464#section-3. | 
|  | class AudioLevel { | 
|  | public: | 
|  | AudioLevel(); | 
|  | AudioLevel(bool voice_activity, int audio_level); | 
|  | AudioLevel(const AudioLevel& other) = default; | 
|  | AudioLevel& operator=(const AudioLevel& other) = default; | 
|  |  | 
|  | // Flag indicating whether the encoder believes the audio packet contains | 
|  | // voice activity. | 
|  | bool voice_activity() const { return voice_activity_; } | 
|  |  | 
|  | // Audio level in -dBov. Values range from 0 to 127, representing 0 to -127 | 
|  | // dBov. 127 represents digital silence. | 
|  | int level() const { return audio_level_; } | 
|  |  | 
|  | private: | 
|  | bool voice_activity_; | 
|  | int audio_level_; | 
|  | }; | 
|  |  | 
|  | inline bool operator==(const AbsoluteCaptureTime& lhs, | 
|  | const AbsoluteCaptureTime& rhs) { | 
|  | return (lhs.absolute_capture_timestamp == rhs.absolute_capture_timestamp) && | 
|  | (lhs.estimated_capture_clock_offset == | 
|  | rhs.estimated_capture_clock_offset); | 
|  | } | 
|  |  | 
|  | inline bool operator!=(const AbsoluteCaptureTime& lhs, | 
|  | const AbsoluteCaptureTime& rhs) { | 
|  | return !(lhs == rhs); | 
|  | } | 
|  |  | 
|  | struct RTPHeaderExtension { | 
|  | RTPHeaderExtension(); | 
|  | RTPHeaderExtension(const RTPHeaderExtension& other); | 
|  | RTPHeaderExtension& operator=(const RTPHeaderExtension& other); | 
|  |  | 
|  | static constexpr int kAbsSendTimeFraction = 18; | 
|  |  | 
|  | Timestamp GetAbsoluteSendTimestamp() const { | 
|  | RTC_DCHECK(hasAbsoluteSendTime); | 
|  | RTC_DCHECK(absoluteSendTime < (1ul << 24)); | 
|  | return Timestamp::Micros((absoluteSendTime * 1000000ll) / | 
|  | (1 << kAbsSendTimeFraction)); | 
|  | } | 
|  |  | 
|  | bool hasTransmissionTimeOffset; | 
|  | int32_t transmissionTimeOffset; | 
|  | bool hasAbsoluteSendTime; | 
|  | uint32_t absoluteSendTime; | 
|  | std::optional<AbsoluteCaptureTime> absolute_capture_time; | 
|  | bool hasTransportSequenceNumber; | 
|  | uint16_t transportSequenceNumber; | 
|  | std::optional<FeedbackRequest> feedback_request; | 
|  |  | 
|  | // Audio Level includes both level in dBov and voiced/unvoiced bit. See: | 
|  | // https://tools.ietf.org/html/rfc6464#section-3 | 
|  | std::optional<AudioLevel> audio_level() const { return audio_level_; } | 
|  |  | 
|  | void set_audio_level(std::optional<AudioLevel> audio_level) { | 
|  | audio_level_ = audio_level; | 
|  | } | 
|  |  | 
|  | // For Coordination of Video Orientation. See | 
|  | // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ | 
|  | // ts_126114v120700p.pdf | 
|  | bool hasVideoRotation; | 
|  | VideoRotation videoRotation; | 
|  |  | 
|  | // TODO(ilnik): Refactor this and one above to be std::optional() and remove | 
|  | // a corresponding bool flag. | 
|  | bool hasVideoContentType; | 
|  | VideoContentType videoContentType; | 
|  |  | 
|  | bool has_video_timing; | 
|  | VideoSendTiming video_timing; | 
|  |  | 
|  | VideoPlayoutDelay playout_delay; | 
|  |  | 
|  | // For identification of a stream when ssrc is not signaled. See | 
|  | // https://tools.ietf.org/html/rfc8852 | 
|  | std::string stream_id; | 
|  | std::string repaired_stream_id; | 
|  |  | 
|  | // For identifying the media section used to interpret this RTP packet. See | 
|  | // https://tools.ietf.org/html/rfc8843 | 
|  | std::string mid; | 
|  |  | 
|  | std::optional<ColorSpace> color_space; | 
|  |  | 
|  | private: | 
|  | std::optional<AudioLevel> audio_level_; | 
|  | }; | 
|  |  | 
|  | enum { kRtpCsrcSize = 15 };  // RFC 3550 page 13 | 
|  |  | 
|  | struct RTC_EXPORT RTPHeader { | 
|  | RTPHeader(); | 
|  | RTPHeader(const RTPHeader& other); | 
|  | RTPHeader& operator=(const RTPHeader& other); | 
|  |  | 
|  | bool markerBit; | 
|  | uint8_t payloadType; | 
|  | uint16_t sequenceNumber; | 
|  | uint32_t timestamp; | 
|  | uint32_t ssrc; | 
|  | uint8_t numCSRCs; | 
|  | uint32_t arrOfCSRCs[kRtpCsrcSize]; | 
|  | size_t paddingLength; | 
|  | size_t headerLength; | 
|  | RTPHeaderExtension extension; | 
|  | }; | 
|  |  | 
|  | // RTCP mode to use. Compound mode is described by RFC 4585 and reduced-size | 
|  | // RTCP mode is described by RFC 5506. | 
|  | enum class RtcpMode { kOff, kCompound, kReducedSize }; | 
|  |  | 
|  | enum NetworkState { | 
|  | kNetworkUp, | 
|  | kNetworkDown, | 
|  | }; | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // API_RTP_HEADERS_H_ |