blob: 055c9ed36c9aedca3c2cf989437935cdefe46458 [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
pwestin@webrtc.orgcac78782012-04-05 08:30:10 +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_TMMBR_HELP_H_
12#define WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_
13
hta@webrtc.org54536bb2012-05-03 14:07:23 +000014#include <vector>
niklase@google.com470e71d2011-07-07 08:21:25 +000015#include "typedefs.h"
16
17#include "critical_section_wrapper.h"
18
19#ifndef NULL
20 #define NULL 0
21#endif
22
23namespace webrtc {
24class TMMBRSet
25{
26public:
27 TMMBRSet();
28 ~TMMBRSet();
29
pbos@webrtc.org2f446732013-04-08 11:08:41 +000030 void VerifyAndAllocateSet(uint32_t minimumSize);
31 void VerifyAndAllocateSetKeepingData(uint32_t minimumSize);
hta@webrtc.org54536bb2012-05-03 14:07:23 +000032 // Number of valid data items in set.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000033 uint32_t lengthOfSet() const { return _lengthOfSet; }
hta@webrtc.org54536bb2012-05-03 14:07:23 +000034 // Presently allocated max size of set.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000035 uint32_t sizeOfSet() const { return _sizeOfSet; }
hta@webrtc.org54536bb2012-05-03 14:07:23 +000036 void clearSet() {
37 _lengthOfSet = 0;
38 }
pbos@webrtc.org2f446732013-04-08 11:08:41 +000039 uint32_t Tmmbr(int i) const {
hta@webrtc.org54536bb2012-05-03 14:07:23 +000040 return _data.at(i).tmmbr;
41 }
pbos@webrtc.org2f446732013-04-08 11:08:41 +000042 uint32_t PacketOH(int i) const {
hta@webrtc.org54536bb2012-05-03 14:07:23 +000043 return _data.at(i).packet_oh;
44 }
pbos@webrtc.org2f446732013-04-08 11:08:41 +000045 uint32_t Ssrc(int i) const {
hta@webrtc.org54536bb2012-05-03 14:07:23 +000046 return _data.at(i).ssrc;
47 }
48 void SetEntry(unsigned int i,
pbos@webrtc.org2f446732013-04-08 11:08:41 +000049 uint32_t tmmbrSet,
50 uint32_t packetOHSet,
51 uint32_t ssrcSet);
niklase@google.com470e71d2011-07-07 08:21:25 +000052
pbos@webrtc.org2f446732013-04-08 11:08:41 +000053 void AddEntry(uint32_t tmmbrSet,
54 uint32_t packetOHSet,
55 uint32_t ssrcSet);
hta@webrtc.org54536bb2012-05-03 14:07:23 +000056
57 // Remove one entry from table, and move all others down.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000058 void RemoveEntry(uint32_t sourceIdx);
hta@webrtc.org54536bb2012-05-03 14:07:23 +000059
pbos@webrtc.org2f446732013-04-08 11:08:41 +000060 void SwapEntries(uint32_t firstIdx,
61 uint32_t secondIdx);
hta@webrtc.org54536bb2012-05-03 14:07:23 +000062
63 // Set entry data to zero, but keep it in table.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000064 void ClearEntry(uint32_t idx);
hta@webrtc.org54536bb2012-05-03 14:07:23 +000065
66 private:
67 class SetElement {
68 public:
69 SetElement() : tmmbr(0), packet_oh(0), ssrc(0) {}
pbos@webrtc.org2f446732013-04-08 11:08:41 +000070 uint32_t tmmbr;
71 uint32_t packet_oh;
72 uint32_t ssrc;
hta@webrtc.org54536bb2012-05-03 14:07:23 +000073 };
74
75 std::vector<SetElement> _data;
76 // Number of places allocated.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000077 uint32_t _sizeOfSet;
hta@webrtc.org54536bb2012-05-03 14:07:23 +000078 // NUmber of places currently in use.
pbos@webrtc.org2f446732013-04-08 11:08:41 +000079 uint32_t _lengthOfSet;
niklase@google.com470e71d2011-07-07 08:21:25 +000080};
81
82class TMMBRHelp
83{
84public:
pwestin@webrtc.orgcac78782012-04-05 08:30:10 +000085 TMMBRHelp();
niklase@google.com470e71d2011-07-07 08:21:25 +000086 virtual ~TMMBRHelp();
87
88 TMMBRSet* BoundingSet(); // used for debuging
89 TMMBRSet* CandidateSet();
90 TMMBRSet* BoundingSetToSend();
91
pbos@webrtc.org2f446732013-04-08 11:08:41 +000092 TMMBRSet* VerifyAndAllocateCandidateSet(const uint32_t minimumSize);
93 int32_t FindTMMBRBoundingSet(TMMBRSet*& boundingSet);
94 int32_t SetTMMBRBoundingSetToSend(
pwestin@webrtc.orgcac78782012-04-05 08:30:10 +000095 const TMMBRSet* boundingSetToSend,
pbos@webrtc.org2f446732013-04-08 11:08:41 +000096 const uint32_t maxBitrateKbit);
niklase@google.com470e71d2011-07-07 08:21:25 +000097
pbos@webrtc.org2f446732013-04-08 11:08:41 +000098 bool IsOwner(const uint32_t ssrc, const uint32_t length) const;
niklase@google.com470e71d2011-07-07 08:21:25 +000099
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000100 bool CalcMinBitRate(uint32_t* minBitrateKbit) const;
niklase@google.com470e71d2011-07-07 08:21:25 +0000101
102protected:
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000103 TMMBRSet* VerifyAndAllocateBoundingSet(uint32_t minimumSize);
104 int32_t VerifyAndAllocateBoundingSetToSend(uint32_t minimumSize);
niklase@google.com470e71d2011-07-07 08:21:25 +0000105
pbos@webrtc.org2f446732013-04-08 11:08:41 +0000106 int32_t FindTMMBRBoundingSet(int32_t numCandidates, TMMBRSet& candidateSet);
niklase@google.com470e71d2011-07-07 08:21:25 +0000107
108private:
henrike@webrtc.org65573f22011-12-13 19:17:27 +0000109 CriticalSectionWrapper* _criticalSection;
niklase@google.com470e71d2011-07-07 08:21:25 +0000110 TMMBRSet _candidateSet;
111 TMMBRSet _boundingSet;
112 TMMBRSet _boundingSetToSend;
113
114 float* _ptrIntersectionBoundingSet;
115 float* _ptrMaxPRBoundingSet;
116};
117} // namespace webrtc
118
119#endif // WEBRTC_MODULES_RTP_RTCP_SOURCE_TMMBR_HELP_H_