mirror of
				https://github.com/kunkundi/crossdesk.git
				synced 2025-10-26 20:25:34 +08:00 
			
		
		
		
	[feat] SSRC supported for RTP packets
This commit is contained in:
		| @@ -1,6 +1,7 @@ | ||||
| #include "rtp_codec.h" | ||||
|  | ||||
| #include <chrono> | ||||
| #include <random> | ||||
|  | ||||
| #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<uint32_t> 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; | ||||
|   | ||||
| @@ -3,6 +3,7 @@ | ||||
|  | ||||
| #include <cstddef> | ||||
| #include <cstdint> | ||||
| #include <unordered_set> | ||||
| #include <vector> | ||||
|  | ||||
| #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<std::mutex> lock(mutex_); | ||||
|     ssrcs_.insert(ssrc); | ||||
|   } | ||||
|  | ||||
|   void DeleteSsrc(uint32_t ssrc) { | ||||
|     std::lock_guard<std::mutex> lock(mutex_); | ||||
|     ssrcs_.erase(ssrc); | ||||
|   } | ||||
|  | ||||
|   bool Contains(uint32_t ssrc) { | ||||
|     std::lock_guard<std::mutex> lock(mutex_); | ||||
|     return ssrcs_.count(ssrc) > 0; | ||||
|   } | ||||
|  | ||||
|  private: | ||||
|   SSRCManager() = default; | ||||
|   ~SSRCManager() = default; | ||||
|   SSRCManager(const SSRCManager&) = delete; | ||||
|   SSRCManager& operator=(const SSRCManager&) = delete; | ||||
|  | ||||
|   std::unordered_set<uint32_t> ssrcs_; | ||||
|   std::mutex mutex_; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user