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_TMMBR_HELP_H_ 12 #define WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_ 13 14 #include <vector> 15 16 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" 17 #include "webrtc/typedefs.h" 18 19 namespace webrtc { 20 class TMMBRSet 21 { 22 public: 23 TMMBRSet(); 24 ~TMMBRSet(); 25 26 void VerifyAndAllocateSet(uint32_t minimumSize); 27 void VerifyAndAllocateSetKeepingData(uint32_t minimumSize); 28 // Number of valid data items in set. 29 uint32_t lengthOfSet() const { return _lengthOfSet; } 30 // Presently allocated max size of set. 31 uint32_t sizeOfSet() const { return _sizeOfSet; } 32 void clearSet() { 33 _lengthOfSet = 0; 34 } 35 uint32_t Tmmbr(int i) const { 36 return _data.at(i).tmmbr; 37 } 38 uint32_t PacketOH(int i) const { 39 return _data.at(i).packet_oh; 40 } 41 uint32_t Ssrc(int i) const { 42 return _data.at(i).ssrc; 43 } 44 void SetEntry(unsigned int i, 45 uint32_t tmmbrSet, 46 uint32_t packetOHSet, 47 uint32_t ssrcSet); 48 49 void AddEntry(uint32_t tmmbrSet, 50 uint32_t packetOHSet, 51 uint32_t ssrcSet); 52 53 // Remove one entry from table, and move all others down. 54 void RemoveEntry(uint32_t sourceIdx); 55 56 void SwapEntries(uint32_t firstIdx, 57 uint32_t secondIdx); 58 59 // Set entry data to zero, but keep it in table. 60 void ClearEntry(uint32_t idx); 61 62 private: 63 class SetElement { 64 public: 65 SetElement() : tmmbr(0), packet_oh(0), ssrc(0) {} 66 uint32_t tmmbr; 67 uint32_t packet_oh; 68 uint32_t ssrc; 69 }; 70 71 std::vector<SetElement> _data; 72 // Number of places allocated. 73 uint32_t _sizeOfSet; 74 // NUmber of places currently in use. 75 uint32_t _lengthOfSet; 76 }; 77 78 class TMMBRHelp 79 { 80 public: 81 TMMBRHelp(); 82 virtual ~TMMBRHelp(); 83 84 TMMBRSet* BoundingSet(); // used for debuging 85 TMMBRSet* CandidateSet(); 86 TMMBRSet* BoundingSetToSend(); 87 88 TMMBRSet* VerifyAndAllocateCandidateSet(const uint32_t minimumSize); 89 int32_t FindTMMBRBoundingSet(TMMBRSet*& boundingSet); 90 int32_t SetTMMBRBoundingSetToSend( 91 const TMMBRSet* boundingSetToSend, 92 const uint32_t maxBitrateKbit); 93 94 bool IsOwner(const uint32_t ssrc, const uint32_t length) const; 95 96 bool CalcMinBitRate(uint32_t* minBitrateKbit) const; 97 98 protected: 99 TMMBRSet* VerifyAndAllocateBoundingSet(uint32_t minimumSize); 100 int32_t VerifyAndAllocateBoundingSetToSend(uint32_t minimumSize); 101 102 int32_t FindTMMBRBoundingSet(int32_t numCandidates, TMMBRSet& candidateSet); 103 104 private: 105 CriticalSectionWrapper* _criticalSection; 106 TMMBRSet _candidateSet; 107 TMMBRSet _boundingSet; 108 TMMBRSet _boundingSetToSend; 109 110 float* _ptrIntersectionBoundingSet; 111 float* _ptrMaxPRBoundingSet; 112 }; 113 } // namespace webrtc 114 115 #endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_ 116