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_HEADER_EXTENSION_H_ 12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSION_H_ 13 14 #include <map> 15 16 #include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" 17 #include "webrtc/typedefs.h" 18 19 namespace webrtc { 20 21 const uint16_t kRtpOneByteHeaderExtensionId = 0xBEDE; 22 23 const size_t kRtpOneByteHeaderLength = 4; 24 const size_t kTransmissionTimeOffsetLength = 4; 25 const size_t kAudioLevelLength = 2; 26 const size_t kAbsoluteSendTimeLength = 4; 27 const size_t kVideoRotationLength = 2; 28 const size_t kTransportSequenceNumberLength = 3; 29 30 struct HeaderExtension { 31 explicit HeaderExtension(RTPExtensionType extension_type) 32 : type(extension_type), length(0), active(true) { 33 Init(); 34 } 35 36 HeaderExtension(RTPExtensionType extension_type, bool active) 37 : type(extension_type), length(0), active(active) { 38 Init(); 39 } 40 41 void Init() { 42 // TODO(solenberg): Create handler classes for header extensions so we can 43 // get rid of switches like these as well as handling code spread out all 44 // over. 45 switch (type) { 46 case kRtpExtensionTransmissionTimeOffset: 47 length = kTransmissionTimeOffsetLength; 48 break; 49 case kRtpExtensionAudioLevel: 50 length = kAudioLevelLength; 51 break; 52 case kRtpExtensionAbsoluteSendTime: 53 length = kAbsoluteSendTimeLength; 54 break; 55 case kRtpExtensionVideoRotation: 56 length = kVideoRotationLength; 57 break; 58 case kRtpExtensionTransportSequenceNumber: 59 length = kTransportSequenceNumberLength; 60 break; 61 default: 62 assert(false); 63 } 64 } 65 66 const RTPExtensionType type; 67 uint8_t length; 68 bool active; 69 }; 70 71 class RtpHeaderExtensionMap { 72 public: 73 RtpHeaderExtensionMap(); 74 ~RtpHeaderExtensionMap(); 75 76 void Erase(); 77 78 int32_t Register(const RTPExtensionType type, const uint8_t id); 79 80 // Active is a concept for a registered rtp header extension which doesn't 81 // take effect yet until being activated. Inactive RTP header extensions do 82 // not take effect and should not be included in size calculations until they 83 // are activated. 84 int32_t RegisterInactive(const RTPExtensionType type, const uint8_t id); 85 bool SetActive(const RTPExtensionType type, bool active); 86 87 int32_t Deregister(const RTPExtensionType type); 88 89 bool IsRegistered(RTPExtensionType type) const; 90 91 int32_t GetType(const uint8_t id, RTPExtensionType* type) const; 92 93 int32_t GetId(const RTPExtensionType type, uint8_t* id) const; 94 95 // 96 // Methods below ignore any inactive rtp header extensions. 97 // 98 99 size_t GetTotalLengthInBytes() const; 100 101 int32_t GetLengthUntilBlockStartInBytes(const RTPExtensionType type) const; 102 103 void GetCopy(RtpHeaderExtensionMap* map) const; 104 105 int32_t Size() const; 106 107 RTPExtensionType First() const; 108 109 RTPExtensionType Next(RTPExtensionType type) const; 110 111 private: 112 int32_t Register(const RTPExtensionType type, const uint8_t id, bool active); 113 std::map<uint8_t, HeaderExtension*> extensionMap_; 114 }; 115 } // namespace webrtc 116 117 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_HEADER_EXTENSION_H_ 118 119