Index: webrtc/modules/rtp_rtcp/source/ssrc_database.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/ssrc_database.cc b/webrtc/modules/rtp_rtcp/source/ssrc_database.cc |
index c9572cd1b7c26ae6617031043a521a55f2b7a7c7..fb02b7ef12cd12f785fd18ed331e1407d3fd38c4 100644 |
--- a/webrtc/modules/rtp_rtcp/source/ssrc_database.cc |
+++ b/webrtc/modules/rtp_rtcp/source/ssrc_database.cc |
@@ -10,92 +10,51 @@ |
#include "webrtc/modules/rtp_rtcp/source/ssrc_database.h" |
-#include <assert.h> |
-#include <stdlib.h> |
- |
+#include "webrtc/base/checks.h" |
+#include "webrtc/system_wrappers/include/clock.h" |
#include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
-#ifdef _WIN32 |
-#include <windows.h> |
-#include <MMSystem.h> // timeGetTime |
- |
-// TODO(hellner): investigate if it is necessary to disable these warnings. |
-#pragma warning(disable : 4311) |
-#pragma warning(disable : 4312) |
-#else |
-#include <stdio.h> |
-#include <string.h> |
-#include <time.h> |
-#include <sys/time.h> |
-#endif |
- |
namespace webrtc { |
-SSRCDatabase* SSRCDatabase::StaticInstance(CountOperation count_operation) { |
- SSRCDatabase* impl = GetStaticInstance<SSRCDatabase>(count_operation); |
- return impl; |
+namespace { |
+uint64_t Seed() { |
+ return Clock::GetRealTimeClock()->TimeInMicroseconds(); |
} |
+} // namespace |
SSRCDatabase* SSRCDatabase::GetSSRCDatabase() { |
- return StaticInstance(kAddRef); |
+ return GetStaticInstance<SSRCDatabase>(kAddRef); |
} |
void SSRCDatabase::ReturnSSRCDatabase() { |
- StaticInstance(kRelease); |
+ GetStaticInstance<SSRCDatabase>(kRelease); |
} |
uint32_t SSRCDatabase::CreateSSRC() { |
- CriticalSectionScoped lock(_critSect); |
- |
- uint32_t ssrc = GenerateRandom(); |
- |
- while (_ssrcMap.find(ssrc) != _ssrcMap.end()) { |
- ssrc = GenerateRandom(); |
+ CriticalSectionScoped lock(crit_.get()); |
+ |
+ while (true) { // Try until get a new ssrc. |
+ // 0 and 0xffffffff are invalid values for SSRC. |
+ uint32_t ssrc = random_.Rand(1u, 0xfffffffe); |
+ if (ssrcs_.insert(ssrc).second) { |
+ return ssrc; |
+ } |
} |
- _ssrcMap[ssrc] = 0; |
- |
- return ssrc; |
} |
-int32_t SSRCDatabase::RegisterSSRC(const uint32_t ssrc) { |
- CriticalSectionScoped lock(_critSect); |
- _ssrcMap[ssrc] = 0; |
- return 0; |
+void SSRCDatabase::RegisterSSRC(uint32_t ssrc) { |
+ CriticalSectionScoped lock(crit_.get()); |
+ ssrcs_.insert(ssrc); |
} |
-int32_t SSRCDatabase::ReturnSSRC(const uint32_t ssrc) { |
- CriticalSectionScoped lock(_critSect); |
- _ssrcMap.erase(ssrc); |
- return 0; |
+void SSRCDatabase::ReturnSSRC(uint32_t ssrc) { |
+ CriticalSectionScoped lock(crit_.get()); |
+ ssrcs_.erase(ssrc); |
} |
-SSRCDatabase::SSRCDatabase() { |
-// we need to seed the random generator, otherwise we get 26500 each time, |
-// hardly a random value :) |
-#ifdef _WIN32 |
- srand(timeGetTime()); |
-#else |
- struct timeval tv; |
- struct timezone tz; |
- gettimeofday(&tv, &tz); |
- srand(tv.tv_usec); |
-#endif |
- |
- _critSect = CriticalSectionWrapper::CreateCriticalSection(); |
-} |
+SSRCDatabase::SSRCDatabase() |
+ : crit_(CriticalSectionWrapper::CreateCriticalSection()), random_(Seed()) {} |
SSRCDatabase::~SSRCDatabase() { |
- _ssrcMap.clear(); |
- delete _critSect; |
} |
-uint32_t SSRCDatabase::GenerateRandom() { |
- uint32_t ssrc = 0; |
- do { |
- ssrc = rand(); |
- ssrc = ssrc << 16; |
- ssrc += rand(); |
- } while (ssrc == 0 || ssrc == 0xffffffff); |
- |
- return ssrc; |
-} |
} // namespace webrtc |