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 <map>
15 
16 #include "webrtc/base/deprecation.h"
17 #include "webrtc/modules/rtp_rtcp/include/receive_statistics.h"
18 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
19 #include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h"
20 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h"
21 #include "webrtc/typedefs.h"
22 
23 namespace webrtc {
24 
25 const uint8_t kRtpMarkerBitMask = 0x80;
26 
27 RtpData* NullObjectRtpData();
28 RtpFeedback* NullObjectRtpFeedback();
29 RtpAudioFeedback* NullObjectRtpAudioFeedback();
30 ReceiveStatistics* NullObjectReceiveStatistics();
31 
32 namespace RtpUtility {
33 
34 struct Payload {
35   char name[RTP_PAYLOAD_NAME_SIZE];
36   bool audio;
37   PayloadUnion typeSpecific;
38 };
39 
40 typedef std::map<int8_t, Payload*> PayloadTypeMap;
41 
42 bool StringCompare(const char* str1, const char* str2, const uint32_t length);
43 
44 // Round up to the nearest size that is a multiple of 4.
45 size_t Word32Align(size_t size);
46 
47 class RtpHeaderParser {
48  public:
49   RtpHeaderParser(const uint8_t* rtpData, size_t rtpDataLength);
50   ~RtpHeaderParser();
51 
52   bool RTCP() const;
53   bool ParseRtcp(RTPHeader* header) const;
54   bool Parse(RTPHeader* parsedPacket,
55              RtpHeaderExtensionMap* ptrExtensionMap = nullptr) const;
56   RTC_DEPRECATED bool Parse(
57       RTPHeader& parsedPacket,  // NOLINT(runtime/references)
58       RtpHeaderExtensionMap* ptrExtensionMap = nullptr) const {
59     return Parse(&parsedPacket, ptrExtensionMap);
60   }
61 
62  private:
63   void ParseOneByteExtensionHeader(RTPHeader* parsedPacket,
64                                    const RtpHeaderExtensionMap* ptrExtensionMap,
65                                    const uint8_t* ptrRTPDataExtensionEnd,
66                                    const uint8_t* ptr) const;
67 
68   uint8_t ParsePaddingBytes(const uint8_t* ptrRTPDataExtensionEnd,
69                             const uint8_t* ptr) const;
70 
71   const uint8_t* const _ptrRTPDataBegin;
72   const uint8_t* const _ptrRTPDataEnd;
73 };
74 }  // namespace RtpUtility
75 }  // namespace webrtc
76 
77 #endif  // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_UTILITY_H_
78