diff --git a/src/rtp/rtp_packet/rtp_codec.cpp b/src/rtp/rtp_packet/rtp_codec.cpp index 6ceeaaa..013a35c 100644 --- a/src/rtp/rtp_packet/rtp_codec.cpp +++ b/src/rtp/rtp_packet/rtp_codec.cpp @@ -1,6 +1,7 @@ #include "rtp_codec.h" #include +#include #include "log.h" #include "obu_parser.h" @@ -14,16 +15,35 @@ constexpr int kObuTypeSequenceHeader = 1; using namespace obu; +uint32_t GenerateRandomSSRC() { + std::random_device rd; + std::mt19937 gen(rd()); + std::uniform_int_distribution dis(1, 0xFFFFFFFF); + return dis(gen); +} + +uint32_t GenerateUniqueSsrc() { + uint32_t new_ssrc; + do { + new_ssrc = GenerateRandomSSRC(); + } while (SSRCManager::Instance().Contains(new_ssrc)); + SSRCManager::Instance().AddSsrc(new_ssrc); + return new_ssrc; +} + RtpCodec ::RtpCodec(RtpPacket::PAYLOAD_TYPE payload_type) : version_(RTP_VERSION), has_padding_(false), has_extension_(false), payload_type_(payload_type), sequence_number_(1) { + ssrc_ = GenerateUniqueSsrc(); fec_encoder_.Init(); } RtpCodec ::~RtpCodec() { + SSRCManager::Instance().DeleteSsrc(ssrc_); + if (extension_data_) { delete extension_data_; extension_data_ = nullptr; diff --git a/src/rtp/rtp_packet/rtp_codec.h b/src/rtp/rtp_packet/rtp_codec.h index 303e6e4..5ad3f79 100644 --- a/src/rtp/rtp_packet/rtp_codec.h +++ b/src/rtp/rtp_packet/rtp_codec.h @@ -3,6 +3,7 @@ #include #include +#include #include #include "fec_encoder.h" @@ -57,4 +58,36 @@ class RtpCodec { FecEncoder fec_encoder_; }; +class SSRCManager { + public: + static SSRCManager& Instance() { + static SSRCManager instance; + return instance; + } + + void AddSsrc(uint32_t ssrc) { + std::lock_guard lock(mutex_); + ssrcs_.insert(ssrc); + } + + void DeleteSsrc(uint32_t ssrc) { + std::lock_guard lock(mutex_); + ssrcs_.erase(ssrc); + } + + bool Contains(uint32_t ssrc) { + std::lock_guard lock(mutex_); + return ssrcs_.count(ssrc) > 0; + } + + private: + SSRCManager() = default; + ~SSRCManager() = default; + SSRCManager(const SSRCManager&) = delete; + SSRCManager& operator=(const SSRCManager&) = delete; + + std::unordered_set ssrcs_; + std::mutex mutex_; +}; + #endif \ No newline at end of file