1 /* 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 11 #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_ 12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_ 13 14 #include <stddef.h> // size_t, ptrdiff_t 15 16 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 17 #include "webrtc/modules/rtp_rtcp/interface/receive_statistics.h" 18 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" 19 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h" 20 #include "webrtc/typedefs.h" 21 22 namespace webrtc { 23 24 const uint8_t kRtpMarkerBitMask = 0x80; 25 26 RtpData* NullObjectRtpData(); 27 RtpFeedback* NullObjectRtpFeedback(); 28 RtpAudioFeedback* NullObjectRtpAudioFeedback(); 29 ReceiveStatistics* NullObjectReceiveStatistics(); 30 31 namespace ModuleRTPUtility 32 { 33 // January 1970, in NTP seconds. 34 const uint32_t NTP_JAN_1970 = 2208988800UL; 35 36 // Magic NTP fractional unit. 37 const double NTP_FRAC = 4.294967296E+9; 38 39 struct Payload 40 { 41 char name[RTP_PAYLOAD_NAME_SIZE]; 42 bool audio; 43 PayloadUnion typeSpecific; 44 }; 45 46 typedef std::map<int8_t, Payload*> PayloadTypeMap; 47 48 // Return the current RTP timestamp from the NTP timestamp 49 // returned by the specified clock. 50 uint32_t GetCurrentRTP(Clock* clock, uint32_t freq); 51 52 // Return the current RTP absolute timestamp. 53 uint32_t ConvertNTPTimeToRTP(uint32_t NTPsec, 54 uint32_t NTPfrac, 55 uint32_t freq); 56 57 uint32_t pow2(uint8_t exp); 58 59 // Returns true if |newTimestamp| is older than |existingTimestamp|. 60 // |wrapped| will be set to true if there has been a wraparound between the 61 // two timestamps. 62 bool OldTimestamp(uint32_t newTimestamp, 63 uint32_t existingTimestamp, 64 bool* wrapped); 65 66 bool StringCompare(const char* str1, 67 const char* str2, 68 const uint32_t length); 69 70 void AssignUWord32ToBuffer(uint8_t* dataBuffer, uint32_t value); 71 void AssignUWord24ToBuffer(uint8_t* dataBuffer, uint32_t value); 72 void AssignUWord16ToBuffer(uint8_t* dataBuffer, uint16_t value); 73 74 /** 75 * Converts a network-ordered two-byte input buffer to a host-ordered value. 76 * \param[in] dataBuffer Network-ordered two-byte buffer to convert. 77 * \return Host-ordered value. 78 */ 79 uint16_t BufferToUWord16(const uint8_t* dataBuffer); 80 81 /** 82 * Converts a network-ordered three-byte input buffer to a host-ordered value. 83 * \param[in] dataBuffer Network-ordered three-byte buffer to convert. 84 * \return Host-ordered value. 85 */ 86 uint32_t BufferToUWord24(const uint8_t* dataBuffer); 87 88 /** 89 * Converts a network-ordered four-byte input buffer to a host-ordered value. 90 * \param[in] dataBuffer Network-ordered four-byte buffer to convert. 91 * \return Host-ordered value. 92 */ 93 uint32_t BufferToUWord32(const uint8_t* dataBuffer); 94 95 class RTPHeaderParser 96 { 97 public: 98 RTPHeaderParser(const uint8_t* rtpData, 99 const uint32_t rtpDataLength); 100 ~RTPHeaderParser(); 101 102 bool RTCP() const; 103 bool ParseRtcp(RTPHeader* header) const; 104 bool Parse(RTPHeader& parsedPacket, 105 RtpHeaderExtensionMap* ptrExtensionMap = NULL) const; 106 107 private: 108 void ParseOneByteExtensionHeader( 109 RTPHeader& parsedPacket, 110 const RtpHeaderExtensionMap* ptrExtensionMap, 111 const uint8_t* ptrRTPDataExtensionEnd, 112 const uint8_t* ptr) const; 113 114 uint8_t ParsePaddingBytes( 115 const uint8_t* ptrRTPDataExtensionEnd, 116 const uint8_t* ptr) const; 117 118 const uint8_t* const _ptrRTPDataBegin; 119 const uint8_t* const _ptrRTPDataEnd; 120 }; 121 122 enum FrameTypes 123 { 124 kIFrame, // key frame 125 kPFrame // Delta frame 126 }; 127 128 struct RTPPayloadVP8 129 { 130 bool nonReferenceFrame; 131 bool beginningOfPartition; 132 int partitionID; 133 bool hasPictureID; 134 bool hasTl0PicIdx; 135 bool hasTID; 136 bool hasKeyIdx; 137 int pictureID; 138 int tl0PicIdx; 139 int tID; 140 bool layerSync; 141 int keyIdx; 142 int frameWidth; 143 int frameHeight; 144 145 const uint8_t* data; 146 uint16_t dataLength; 147 }; 148 149 union RTPPayloadUnion 150 { 151 RTPPayloadVP8 VP8; 152 }; 153 154 struct RTPPayload 155 { 156 void SetType(RtpVideoCodecTypes videoType); 157 158 RtpVideoCodecTypes type; 159 FrameTypes frameType; 160 RTPPayloadUnion info; 161 }; 162 163 // RTP payload parser 164 class RTPPayloadParser 165 { 166 public: 167 RTPPayloadParser(const RtpVideoCodecTypes payloadType, 168 const uint8_t* payloadData, 169 // Length w/o padding. 170 const uint16_t payloadDataLength); 171 172 ~RTPPayloadParser(); 173 174 bool Parse(RTPPayload& parsedPacket) const; 175 176 private: 177 bool ParseGeneric(RTPPayload& parsedPacket) const; 178 179 bool ParseVP8(RTPPayload& parsedPacket) const; 180 181 int ParseVP8Extension(RTPPayloadVP8 *vp8, 182 const uint8_t *dataPtr, 183 int dataLength) const; 184 185 int ParseVP8PictureID(RTPPayloadVP8 *vp8, 186 const uint8_t **dataPtr, 187 int *dataLength, 188 int *parsedBytes) const; 189 190 int ParseVP8Tl0PicIdx(RTPPayloadVP8 *vp8, 191 const uint8_t **dataPtr, 192 int *dataLength, 193 int *parsedBytes) const; 194 195 int ParseVP8TIDAndKeyIdx(RTPPayloadVP8 *vp8, 196 const uint8_t **dataPtr, 197 int *dataLength, 198 int *parsedBytes) const; 199 200 int ParseVP8FrameSize(RTPPayload& parsedPacket, 201 const uint8_t *dataPtr, 202 int dataLength) const; 203 204 private: 205 const uint8_t* _dataPtr; 206 const uint16_t _dataLength; 207 const RtpVideoCodecTypes _videoType; 208 }; 209 210 } // namespace ModuleRTPUtility 211 212 } // namespace webrtc 213 214 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_ 215