mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-20 15:22:22 +08:00
确保rtp推流线程安全性
This commit is contained in:
@@ -25,25 +25,6 @@ void RtpSelector::clear(){
|
||||
_map_rtp_process.clear();
|
||||
}
|
||||
|
||||
bool RtpSelector::inputRtp(const Socket::Ptr &sock, const char *data, size_t data_len, const struct sockaddr *addr,
|
||||
uint64_t *dts_out) {
|
||||
uint32_t ssrc = 0;
|
||||
if (!getSSRC(data, data_len, ssrc)) {
|
||||
WarnL << "get ssrc from rtp failed:" << data_len;
|
||||
return false;
|
||||
}
|
||||
auto process = getProcess(printSSRC(ssrc), true);
|
||||
if (process) {
|
||||
try {
|
||||
return process->inputRtp(true, sock, data, data_len, addr, dts_out);
|
||||
} catch (...) {
|
||||
delProcess(printSSRC(ssrc), process.get());
|
||||
throw;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool RtpSelector::getSSRC(const char *data, size_t data_len, uint32_t &ssrc){
|
||||
if (data_len < 12) {
|
||||
return false;
|
||||
@@ -59,6 +40,10 @@ RtpProcess::Ptr RtpSelector::getProcess(const string &stream_id,bool makeNew) {
|
||||
if (it == _map_rtp_process.end() && !makeNew) {
|
||||
return nullptr;
|
||||
}
|
||||
if (it != _map_rtp_process.end() && makeNew) {
|
||||
//已经被其他线程持有了,不得再被持有,否则会存在线程安全的问题
|
||||
throw std::runtime_error(StrPrinter << "RtpProcess(" << stream_id << ") already existed");
|
||||
}
|
||||
RtpProcessHelper::Ptr &ref = _map_rtp_process[stream_id];
|
||||
if (!ref) {
|
||||
ref = std::make_shared<RtpProcessHelper>(stream_id, shared_from_this());
|
||||
|
||||
Reference in New Issue
Block a user