OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
11 #include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h" | 11 #include "webrtc/modules/rtp_rtcp/source/tmmbr_help.h" |
12 | 12 |
13 #include <algorithm> | 13 #include <algorithm> |
14 #include <limits> | 14 #include <limits> |
| 15 #include <utility> |
15 | 16 |
16 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
17 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h" | 18 #include "webrtc/modules/rtp_rtcp/source/rtp_rtcp_config.h" |
18 | 19 |
19 namespace webrtc { | 20 namespace webrtc { |
20 void TMMBRSet::VerifyAndAllocateSet(uint32_t minimumSize) { | 21 void TMMBRSet::VerifyAndAllocateSet(uint32_t minimumSize) { |
21 clear(); | 22 clear(); |
22 reserve(minimumSize); | 23 reserve(minimumSize); |
23 } | 24 } |
24 | 25 |
(...skipping 28 matching lines...) Expand all Loading... |
53 | 54 |
54 TMMBRSet* TMMBRHelp::VerifyAndAllocateCandidateSet(uint32_t minimumSize) { | 55 TMMBRSet* TMMBRHelp::VerifyAndAllocateCandidateSet(uint32_t minimumSize) { |
55 _candidateSet.VerifyAndAllocateSet(minimumSize); | 56 _candidateSet.VerifyAndAllocateSet(minimumSize); |
56 return &_candidateSet; | 57 return &_candidateSet; |
57 } | 58 } |
58 | 59 |
59 TMMBRSet* TMMBRHelp::CandidateSet() { | 60 TMMBRSet* TMMBRHelp::CandidateSet() { |
60 return &_candidateSet; | 61 return &_candidateSet; |
61 } | 62 } |
62 | 63 |
63 int32_t TMMBRHelp::FindTMMBRBoundingSet(TMMBRSet*& boundingSet) { | 64 std::vector<rtcp::TmmbItem> TMMBRHelp::FindTMMBRBoundingSet() { |
64 // Work on local variable, will be modified | 65 // Work on local variable, will be modified |
65 TMMBRSet candidateSet; | 66 TMMBRSet candidateSet; |
66 candidateSet.VerifyAndAllocateSet(_candidateSet.capacity()); | 67 candidateSet.VerifyAndAllocateSet(_candidateSet.capacity()); |
67 | 68 |
68 for (size_t i = 0; i < _candidateSet.size(); i++) { | 69 for (size_t i = 0; i < _candidateSet.size(); i++) { |
69 if (_candidateSet.Tmmbr(i)) { | 70 if (_candidateSet.Tmmbr(i)) { |
70 candidateSet.AddEntry(_candidateSet.Tmmbr(i), _candidateSet.PacketOH(i), | 71 candidateSet.AddEntry(_candidateSet.Tmmbr(i), _candidateSet.PacketOH(i), |
71 _candidateSet.Ssrc(i)); | 72 _candidateSet.Ssrc(i)); |
72 } else { | 73 } else { |
73 // make sure this is zero if tmmbr = 0 | 74 // make sure this is zero if tmmbr = 0 |
74 RTC_DCHECK_EQ(_candidateSet.PacketOH(i), 0u); | 75 RTC_DCHECK_EQ(_candidateSet.PacketOH(i), 0u); |
75 // Old code: | 76 // Old code: |
76 // _candidateSet.ptrPacketOHSet[i] = 0; | 77 // _candidateSet.ptrPacketOHSet[i] = 0; |
77 } | 78 } |
78 } | 79 } |
79 | 80 |
80 // Number of set candidates | 81 // Number of set candidates |
81 int32_t numSetCandidates = candidateSet.lengthOfSet(); | 82 int32_t numSetCandidates = candidateSet.lengthOfSet(); |
82 // Find bounding set | 83 // Find bounding set |
83 uint32_t numBoundingSet = 0; | 84 std::vector<rtcp::TmmbItem> bounding; |
84 if (numSetCandidates > 0) { | 85 if (numSetCandidates > 0) { |
85 FindBoundingSet(std::move(candidateSet), &_boundingSet); | 86 FindBoundingSet(std::move(candidateSet), &bounding); |
86 numBoundingSet = _boundingSet.size(); | 87 size_t numBoundingSet = bounding.size(); |
87 if (numBoundingSet < 1 || (numBoundingSet > _candidateSet.size())) { | 88 RTC_DCHECK_GE(numBoundingSet, 1u); |
88 return -1; | 89 RTC_DCHECK_LE(numBoundingSet, _candidateSet.size()); |
89 } | |
90 boundingSet = &_boundingSet; | |
91 } | 90 } |
92 return numBoundingSet; | 91 return bounding; |
93 } | 92 } |
94 | 93 |
95 void TMMBRHelp::FindBoundingSet(std::vector<rtcp::TmmbItem> candidates, | 94 void TMMBRHelp::FindBoundingSet(std::vector<rtcp::TmmbItem> candidates, |
96 std::vector<rtcp::TmmbItem>* bounding_set) { | 95 std::vector<rtcp::TmmbItem>* bounding_set) { |
97 RTC_DCHECK(bounding_set); | 96 RTC_DCHECK(bounding_set); |
98 RTC_DCHECK(!candidates.empty()); | 97 RTC_DCHECK(!candidates.empty()); |
99 size_t num_candidates = candidates.size(); | 98 size_t num_candidates = candidates.size(); |
100 | 99 |
101 if (num_candidates == 1) { | 100 if (num_candidates == 1) { |
102 RTC_DCHECK(candidates[0].bitrate_bps()); | 101 RTC_DCHECK(candidates[0].bitrate_bps()); |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 static_cast<float>(packet_overhead); | 223 static_cast<float>(packet_overhead); |
225 } | 224 } |
226 --num_candidates; | 225 --num_candidates; |
227 get_new_candidate = true; | 226 get_new_candidate = true; |
228 } | 227 } |
229 | 228 |
230 // 9. Go back to step 5 if any tuple remains in candidate list. | 229 // 9. Go back to step 5 if any tuple remains in candidate list. |
231 } | 230 } |
232 } | 231 } |
233 | 232 |
234 bool TMMBRHelp::IsOwner(const uint32_t ssrc, const uint32_t length) const { | 233 bool TMMBRHelp::IsOwner(const std::vector<rtcp::TmmbItem>& bounding, |
235 if (length == 0) { | 234 uint32_t ssrc) { |
236 // Empty bounding set. | 235 for (const rtcp::TmmbItem& item : bounding) { |
237 return false; | 236 if (item.ssrc() == ssrc) { |
238 } | |
239 for (size_t i = 0; (i < length) && (i < _boundingSet.size()); ++i) { | |
240 if (_boundingSet.Ssrc(i) == ssrc) { | |
241 return true; | 237 return true; |
242 } | 238 } |
243 } | 239 } |
244 return false; | 240 return false; |
245 } | 241 } |
246 | 242 |
247 bool TMMBRHelp::CalcMinBitRate(uint32_t* minBitrateKbit) const { | 243 bool TMMBRHelp::CalcMinBitRate(uint32_t* minBitrateKbit) const { |
248 if (_candidateSet.size() == 0) { | 244 if (_candidateSet.size() == 0) { |
249 // Empty bounding set. | 245 // Empty bounding set. |
250 return false; | 246 return false; |
251 } | 247 } |
252 *minBitrateKbit = std::numeric_limits<uint32_t>::max(); | 248 *minBitrateKbit = std::numeric_limits<uint32_t>::max(); |
253 | 249 |
254 for (size_t i = 0; i < _candidateSet.lengthOfSet(); ++i) { | 250 for (size_t i = 0; i < _candidateSet.lengthOfSet(); ++i) { |
255 uint32_t curNetBitRateKbit = _candidateSet.Tmmbr(i); | 251 uint32_t curNetBitRateKbit = _candidateSet.Tmmbr(i); |
256 if (curNetBitRateKbit < MIN_VIDEO_BW_MANAGEMENT_BITRATE) { | 252 if (curNetBitRateKbit < MIN_VIDEO_BW_MANAGEMENT_BITRATE) { |
257 curNetBitRateKbit = MIN_VIDEO_BW_MANAGEMENT_BITRATE; | 253 curNetBitRateKbit = MIN_VIDEO_BW_MANAGEMENT_BITRATE; |
258 } | 254 } |
259 *minBitrateKbit = curNetBitRateKbit < *minBitrateKbit ? curNetBitRateKbit | 255 *minBitrateKbit = curNetBitRateKbit < *minBitrateKbit ? curNetBitRateKbit |
260 : *minBitrateKbit; | 256 : *minBitrateKbit; |
261 } | 257 } |
262 return true; | 258 return true; |
263 } | 259 } |
264 } // namespace webrtc | 260 } // namespace webrtc |
OLD | NEW |