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.
lengthOfSet()29     uint32_t lengthOfSet() const { return _lengthOfSet; }
30     // Presently allocated max size of set.
sizeOfSet()31     uint32_t sizeOfSet() const { return _sizeOfSet; }
clearSet()32     void clearSet() {
33       _lengthOfSet = 0;
34     }
Tmmbr(int i)35     uint32_t Tmmbr(int i) const {
36       return _data.at(i).tmmbr;
37     }
PacketOH(int i)38     uint32_t PacketOH(int i) const {
39       return _data.at(i).packet_oh;
40     }
Ssrc(int i)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:
SetElement()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