mirror of
https://github.com/kunkundi/crossdesk.git
synced 2025-10-27 04:35:34 +08:00
[feat] SSRC supported for RTP packets
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
#include "rtp_codec.h"
|
#include "rtp_codec.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <random>
|
||||||
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "obu_parser.h"
|
#include "obu_parser.h"
|
||||||
@@ -14,16 +15,35 @@ constexpr int kObuTypeSequenceHeader = 1;
|
|||||||
|
|
||||||
using namespace obu;
|
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)
|
RtpCodec ::RtpCodec(RtpPacket::PAYLOAD_TYPE payload_type)
|
||||||
: version_(RTP_VERSION),
|
: version_(RTP_VERSION),
|
||||||
has_padding_(false),
|
has_padding_(false),
|
||||||
has_extension_(false),
|
has_extension_(false),
|
||||||
payload_type_(payload_type),
|
payload_type_(payload_type),
|
||||||
sequence_number_(1) {
|
sequence_number_(1) {
|
||||||
|
ssrc_ = GenerateUniqueSsrc();
|
||||||
fec_encoder_.Init();
|
fec_encoder_.Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
RtpCodec ::~RtpCodec() {
|
RtpCodec ::~RtpCodec() {
|
||||||
|
SSRCManager::Instance().DeleteSsrc(ssrc_);
|
||||||
|
|
||||||
if (extension_data_) {
|
if (extension_data_) {
|
||||||
delete extension_data_;
|
delete extension_data_;
|
||||||
extension_data_ = nullptr;
|
extension_data_ = nullptr;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <unordered_set>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "fec_encoder.h"
|
#include "fec_encoder.h"
|
||||||
@@ -57,4 +58,36 @@ class RtpCodec {
|
|||||||
FecEncoder fec_encoder_;
|
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
|
#endif
|
||||||
Reference in New Issue
Block a user