blob: 7614ca66b7560dcd833572c2033e076141d273e3 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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 <cstddef> // size_t, ptrdiff_t
15
16#include "typedefs.h"
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +000017#include "rtp_header_extension.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000018#include "rtp_rtcp_config.h"
19#include "rtp_rtcp_defines.h"
20
21namespace webrtc {
22enum RtpVideoCodecTypes
23{
pbos@webrtc.org8911ce42013-03-18 16:39:03 +000024 kRtpGenericVideo = 0,
niklase@google.com470e71d2011-07-07 08:21:25 +000025 kRtpFecVideo = 10,
26 kRtpVp8Video = 11
27};
28
pbos@webrtc.org2f446732013-04-08 11:08:41 +000029const uint8_t kRtpMarkerBitMask = 0x80;
niklase@google.com470e71d2011-07-07 08:21:25 +000030
31namespace ModuleRTPUtility
32{
pwestin@webrtc.org0644b1d2011-12-01 15:42:31 +000033 // 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
niklase@google.com470e71d2011-07-07 08:21:25 +000039 struct AudioPayload
40 {
pbos@webrtc.org2f446732013-04-08 11:08:41 +000041 uint32_t frequency;
42 uint8_t channels;
43 uint32_t rate;
niklase@google.com470e71d2011-07-07 08:21:25 +000044 };
45 struct VideoPayload
46 {
47 RtpVideoCodecTypes videoCodecType;
pbos@webrtc.org2f446732013-04-08 11:08:41 +000048 uint32_t maxRate;
niklase@google.com470e71d2011-07-07 08:21:25 +000049 };
50 union PayloadUnion
51 {
52 AudioPayload Audio;
53 VideoPayload Video;
54 };
55 struct Payload
56 {
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +000057 char name[RTP_PAYLOAD_NAME_SIZE];
58 bool audio;
niklase@google.com470e71d2011-07-07 08:21:25 +000059 PayloadUnion typeSpecific;
60 };
61
pbos@webrtc.org2f446732013-04-08 11:08:41 +000062 typedef std::map<int8_t, Payload*> PayloadTypeMap;
phoglund@webrtc.org07bf43c2012-12-18 15:40:53 +000063
pwestin@webrtc.org0644b1d2011-12-01 15:42:31 +000064 // Return the current RTP timestamp from the NTP timestamp
65 // returned by the specified clock.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000066 uint32_t GetCurrentRTP(Clock* clock, uint32_t freq);
pwestin@webrtc.org0644b1d2011-12-01 15:42:31 +000067
68 // Return the current RTP absolute timestamp.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000069 uint32_t ConvertNTPTimeToRTP(uint32_t NTPsec,
70 uint32_t NTPfrac,
71 uint32_t freq);
pwestin@webrtc.org0644b1d2011-12-01 15:42:31 +000072
73 // Return the time in milliseconds corresponding to the specified
74 // NTP timestamp.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000075 uint32_t ConvertNTPTimeToMS(uint32_t NTPsec,
76 uint32_t NTPfrac);
niklase@google.com470e71d2011-07-07 08:21:25 +000077
pbos@webrtc.org2f446732013-04-08 11:08:41 +000078 uint32_t pow2(uint8_t exp);
niklase@google.com470e71d2011-07-07 08:21:25 +000079
phoglund@webrtc.org07bf43c2012-12-18 15:40:53 +000080 // Returns a pointer to the payload data given a packet.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000081 const uint8_t* GetPayloadData(const WebRtcRTPHeader* rtp_header,
82 const uint8_t* packet);
phoglund@webrtc.org07bf43c2012-12-18 15:40:53 +000083
84 // Returns payload length given a packet.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000085 uint16_t GetPayloadDataLength(const WebRtcRTPHeader* rtp_header,
86 const uint16_t packet_length);
phoglund@webrtc.org07bf43c2012-12-18 15:40:53 +000087
marpan@webrtc.org57353a32011-12-16 17:21:09 +000088 // Returns true if |newTimestamp| is older than |existingTimestamp|.
89 // |wrapped| will be set to true if there has been a wraparound between the
90 // two timestamps.
91 bool OldTimestamp(uint32_t newTimestamp,
92 uint32_t existingTimestamp,
93 bool* wrapped);
94
pwestin@webrtc.orgf6bb77a2012-01-24 17:16:59 +000095 bool StringCompare(const char* str1,
96 const char* str2,
pbos@webrtc.org2f446732013-04-08 11:08:41 +000097 const uint32_t length);
niklase@google.com470e71d2011-07-07 08:21:25 +000098
pbos@webrtc.org2f446732013-04-08 11:08:41 +000099 void AssignUWord32ToBuffer(uint8_t* dataBuffer, uint32_t value);
100 void AssignUWord24ToBuffer(uint8_t* dataBuffer, uint32_t value);
101 void AssignUWord16ToBuffer(uint8_t* dataBuffer, uint16_t value);
niklase@google.com470e71d2011-07-07 08:21:25 +0000102
103 /**
104 * Converts a network-ordered two-byte input buffer to a host-ordered value.
105 * \param[in] dataBuffer Network-ordered two-byte buffer to convert.
106 * \return Host-ordered value.
107 */
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000108 uint16_t BufferToUWord16(const uint8_t* dataBuffer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000109
110 /**
111 * Converts a network-ordered three-byte input buffer to a host-ordered value.
112 * \param[in] dataBuffer Network-ordered three-byte buffer to convert.
113 * \return Host-ordered value.
114 */
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000115 uint32_t BufferToUWord24(const uint8_t* dataBuffer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000116
117 /**
118 * Converts a network-ordered four-byte input buffer to a host-ordered value.
119 * \param[in] dataBuffer Network-ordered four-byte buffer to convert.
120 * \return Host-ordered value.
121 */
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000122 uint32_t BufferToUWord32(const uint8_t* dataBuffer);
niklase@google.com470e71d2011-07-07 08:21:25 +0000123
124 class RTPHeaderParser
125 {
126 public:
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000127 RTPHeaderParser(const uint8_t* rtpData,
128 const uint32_t rtpDataLength);
niklase@google.com470e71d2011-07-07 08:21:25 +0000129 ~RTPHeaderParser();
130
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000131 bool RTCP() const;
132 bool Parse(WebRtcRTPHeader& parsedPacket,
133 RtpHeaderExtensionMap* ptrExtensionMap = NULL) const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000134
135 private:
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000136 void ParseOneByteExtensionHeader(
137 WebRtcRTPHeader& parsedPacket,
138 const RtpHeaderExtensionMap* ptrExtensionMap,
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000139 const uint8_t* ptrRTPDataExtensionEnd,
140 const uint8_t* ptr) const;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000141
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000142 uint8_t ParsePaddingBytes(
143 const uint8_t* ptrRTPDataExtensionEnd,
144 const uint8_t* ptr) const;
asapersson@webrtc.org5249cc82011-12-16 14:31:37 +0000145
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000146 const uint8_t* const _ptrRTPDataBegin;
147 const uint8_t* const _ptrRTPDataEnd;
niklase@google.com470e71d2011-07-07 08:21:25 +0000148 };
149
150 enum FrameTypes
151 {
152 kIFrame, // key frame
153 kPFrame // Delta frame
154 };
155
niklase@google.com470e71d2011-07-07 08:21:25 +0000156 struct RTPPayloadVP8
157 {
niklase@google.com470e71d2011-07-07 08:21:25 +0000158 bool nonReferenceFrame;
henrik.lundin@webrtc.org8571af72011-08-29 15:37:12 +0000159 bool beginningOfPartition;
160 int partitionID;
niklase@google.com470e71d2011-07-07 08:21:25 +0000161 bool hasPictureID;
henrik.lundin@webrtc.org8571af72011-08-29 15:37:12 +0000162 bool hasTl0PicIdx;
163 bool hasTID;
henrik.lundin@webrtc.org6f2c0162011-11-24 12:52:40 +0000164 bool hasKeyIdx;
henrik.lundin@webrtc.org8571af72011-08-29 15:37:12 +0000165 int pictureID;
166 int tl0PicIdx;
167 int tID;
henrik.lundin@webrtc.orgeda86dc2011-12-13 14:11:06 +0000168 bool layerSync;
henrik.lundin@webrtc.org6f2c0162011-11-24 12:52:40 +0000169 int keyIdx;
pwestin@webrtc.org075e91f2011-11-02 23:14:58 +0000170 int frameWidth;
171 int frameHeight;
niklase@google.com470e71d2011-07-07 08:21:25 +0000172
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000173 const uint8_t* data;
174 uint16_t dataLength;
niklase@google.com470e71d2011-07-07 08:21:25 +0000175 };
176
177 union RTPPayloadUnion
178 {
niklase@google.com470e71d2011-07-07 08:21:25 +0000179 RTPPayloadVP8 VP8;
180 };
181
182 struct RTPPayload
183 {
184 void SetType(RtpVideoCodecTypes videoType);
185
186 RtpVideoCodecTypes type;
187 FrameTypes frameType;
188 RTPPayloadUnion info;
189 };
190
191 // RTP payload parser
192 class RTPPayloadParser
193 {
194 public:
195 RTPPayloadParser(const RtpVideoCodecTypes payloadType,
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000196 const uint8_t* payloadData,
197 const uint16_t payloadDataLength, // Length w/o padding.
198 const int32_t id);
niklase@google.com470e71d2011-07-07 08:21:25 +0000199
200 ~RTPPayloadParser();
201
202 bool Parse(RTPPayload& parsedPacket) const;
203
204 private:
205 bool ParseGeneric(RTPPayload& parsedPacket) const;
206
niklase@google.com470e71d2011-07-07 08:21:25 +0000207 bool ParseVP8(RTPPayload& parsedPacket) const;
208
henrik.lundin@webrtc.org8571af72011-08-29 15:37:12 +0000209 int ParseVP8Extension(RTPPayloadVP8 *vp8,
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000210 const uint8_t *dataPtr,
henrik.lundin@webrtc.org8571af72011-08-29 15:37:12 +0000211 int dataLength) const;
212
213 int ParseVP8PictureID(RTPPayloadVP8 *vp8,
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000214 const uint8_t **dataPtr,
henrik.lundin@webrtc.org8571af72011-08-29 15:37:12 +0000215 int *dataLength,
216 int *parsedBytes) const;
217
218 int ParseVP8Tl0PicIdx(RTPPayloadVP8 *vp8,
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000219 const uint8_t **dataPtr,
henrik.lundin@webrtc.org8571af72011-08-29 15:37:12 +0000220 int *dataLength,
221 int *parsedBytes) const;
222
henrik.lundin@webrtc.org6f2c0162011-11-24 12:52:40 +0000223 int ParseVP8TIDAndKeyIdx(RTPPayloadVP8 *vp8,
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000224 const uint8_t **dataPtr,
henrik.lundin@webrtc.org6f2c0162011-11-24 12:52:40 +0000225 int *dataLength,
226 int *parsedBytes) const;
henrik.lundin@webrtc.org8571af72011-08-29 15:37:12 +0000227
pwestin@webrtc.org075e91f2011-11-02 23:14:58 +0000228 int ParseVP8FrameSize(RTPPayload& parsedPacket,
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000229 const uint8_t *dataPtr,
pwestin@webrtc.org075e91f2011-11-02 23:14:58 +0000230 int dataLength) const;
231
niklase@google.com470e71d2011-07-07 08:21:25 +0000232 private:
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000233 int32_t _id;
234 const uint8_t* _dataPtr;
235 const uint16_t _dataLength;
niklase@google.com470e71d2011-07-07 08:21:25 +0000236 const RtpVideoCodecTypes _videoType;
237 };
henrike@webrtc.orgd5657c22012-02-08 23:41:49 +0000238
239} // namespace ModuleRTPUtility
240
241} // namespace webrtc
niklase@google.com470e71d2011-07-07 08:21:25 +0000242
243#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_