mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2026-06-25 11:12:21 +08:00
完善线程安全设计
This commit is contained in:
@@ -285,7 +285,7 @@ std::shared_ptr<SockInfo> RtpProcess::getOriginSock(MediaSource &sender) const {
|
||||
}
|
||||
|
||||
toolkit::EventPoller::Ptr RtpProcess::getOwnerPoller(MediaSource &sender) {
|
||||
return _sock ? _sock->getPoller() : nullptr;
|
||||
return _sock ? _sock->getPoller() : EventPollerPool::Instance().getPoller();
|
||||
}
|
||||
|
||||
void RtpProcess::setHelper(std::weak_ptr<RtcpContext> help) {
|
||||
|
||||
@@ -120,12 +120,6 @@ void RtpSelector::onManager() {
|
||||
});
|
||||
}
|
||||
|
||||
RtpSelector::RtpSelector() {
|
||||
}
|
||||
|
||||
RtpSelector::~RtpSelector() {
|
||||
}
|
||||
|
||||
RtpProcessHelper::RtpProcessHelper(const string &stream_id, const weak_ptr<RtpSelector> &parent) {
|
||||
_stream_id = stream_id;
|
||||
_parent = parent;
|
||||
@@ -136,6 +130,7 @@ RtpProcessHelper::~RtpProcessHelper() {
|
||||
}
|
||||
|
||||
void RtpProcessHelper::attachEvent() {
|
||||
//主要目的是close回调触发时能把对象从RtpSelector中删除
|
||||
_process->setListener(shared_from_this());
|
||||
}
|
||||
|
||||
@@ -157,6 +152,10 @@ int RtpProcessHelper::totalReaderCount(MediaSource &sender) {
|
||||
return _process ? _process->getTotalReaderCount() : sender.totalReaderCount();
|
||||
}
|
||||
|
||||
toolkit::EventPoller::Ptr RtpProcessHelper::getOwnerPoller(MediaSource &sender) {
|
||||
return toolkit::EventPollerPool::Instance().getPoller();
|
||||
}
|
||||
|
||||
RtpProcess::Ptr &RtpProcessHelper::getProcess() {
|
||||
return _process;
|
||||
}
|
||||
|
||||
@@ -34,6 +34,8 @@ protected:
|
||||
bool close(MediaSource &sender,bool force) override;
|
||||
// 观看总人数
|
||||
int totalReaderCount(MediaSource &sender) override;
|
||||
// 获取所属线程
|
||||
toolkit::EventPoller::Ptr getOwnerPoller(MediaSource &sender) override;
|
||||
|
||||
private:
|
||||
std::weak_ptr<RtpSelector > _parent;
|
||||
@@ -43,8 +45,8 @@ private:
|
||||
|
||||
class RtpSelector : public std::enable_shared_from_this<RtpSelector>{
|
||||
public:
|
||||
RtpSelector();
|
||||
~RtpSelector();
|
||||
RtpSelector() = default;
|
||||
~RtpSelector() = default;
|
||||
|
||||
static bool getSSRC(const char *data,size_t data_len, uint32_t &ssrc);
|
||||
static RtpSelector &Instance();
|
||||
|
||||
@@ -20,8 +20,8 @@ using namespace toolkit;
|
||||
|
||||
namespace mediakit{
|
||||
|
||||
RtpSender::RtpSender() {
|
||||
_poller = EventPollerPool::Instance().getPoller();
|
||||
RtpSender::RtpSender(EventPoller::Ptr poller) {
|
||||
_poller = poller ? std::move(poller) : EventPollerPool::Instance().getPoller();
|
||||
_socket_rtp = Socket::createSocket(_poller, false);
|
||||
}
|
||||
|
||||
@@ -253,9 +253,8 @@ void RtpSender::onSendRtpUdp(const toolkit::Buffer::Ptr &buf, bool check) {
|
||||
}
|
||||
|
||||
void RtpSender::onClose() {
|
||||
auto cb = _on_close;
|
||||
if (cb) {
|
||||
_poller->async([cb]() { cb(); }, false);
|
||||
if (_on_close) {
|
||||
_on_close();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -266,24 +265,17 @@ void RtpSender::onFlushRtpList(shared_ptr<List<Buffer::Ptr> > rtp_list) {
|
||||
return;
|
||||
}
|
||||
|
||||
weak_ptr<RtpSender> weak_self = shared_from_this();
|
||||
_poller->async([rtp_list, weak_self]() {
|
||||
auto strong_self = weak_self.lock();
|
||||
if (!strong_self) {
|
||||
return;
|
||||
size_t i = 0;
|
||||
auto size = rtp_list->size();
|
||||
rtp_list->for_each([&](Buffer::Ptr &packet) {
|
||||
if (_args.is_udp) {
|
||||
onSendRtpUdp(packet, i == 0);
|
||||
// udp模式,rtp over tcp前4个字节可以忽略
|
||||
_socket_rtp->send(std::make_shared<BufferRtp>(std::move(packet), RtpPacket::kRtpTcpHeaderSize), nullptr, 0, ++i == size);
|
||||
} else {
|
||||
// tcp模式, rtp over tcp前2个字节可以忽略,只保留后续rtp长度的2个字节
|
||||
_socket_rtp->send(std::make_shared<BufferRtp>(std::move(packet), 2), nullptr, 0, ++i == size);
|
||||
}
|
||||
size_t i = 0;
|
||||
auto size = rtp_list->size();
|
||||
rtp_list->for_each([&](Buffer::Ptr &packet) {
|
||||
if (strong_self->_args.is_udp) {
|
||||
strong_self->onSendRtpUdp(packet, i == 0);
|
||||
//udp模式,rtp over tcp前4个字节可以忽略
|
||||
strong_self->_socket_rtp->send(std::make_shared<BufferRtp>(std::move(packet), RtpPacket::kRtpTcpHeaderSize), nullptr, 0, ++i == size);
|
||||
} else {
|
||||
//tcp模式, rtp over tcp前2个字节可以忽略,只保留后续rtp长度的2个字节
|
||||
strong_self->_socket_rtp->send(std::make_shared<BufferRtp>(std::move(packet), 2), nullptr, 0, ++i == size);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ class RtpSender : public MediaSinkInterface, public std::enable_shared_from_this
|
||||
public:
|
||||
typedef std::shared_ptr<RtpSender> Ptr;
|
||||
|
||||
RtpSender();
|
||||
RtpSender(toolkit::EventPoller::Ptr poller = nullptr);
|
||||
~RtpSender() override = default;
|
||||
|
||||
/**
|
||||
|
||||
@@ -139,6 +139,10 @@ int RtpSession::totalReaderCount(MediaSource &sender) {
|
||||
return _process ? _process->getTotalReaderCount() : sender.totalReaderCount();
|
||||
}
|
||||
|
||||
toolkit::EventPoller::Ptr RtpSession::getOwnerPoller(MediaSource &sender) {
|
||||
return getPoller();
|
||||
}
|
||||
|
||||
static const char *findSSRC(const char *data, ssize_t len, uint32_t ssrc) {
|
||||
//rtp前面必须预留两个字节的长度字段
|
||||
for (ssize_t i = 2; i <= len - 4; ++i) {
|
||||
|
||||
@@ -38,6 +38,8 @@ protected:
|
||||
bool close(MediaSource &sender,bool force) override;
|
||||
// 观看总人数
|
||||
int totalReaderCount(MediaSource &sender) override;
|
||||
// 获取所属线程
|
||||
toolkit::EventPoller::Ptr getOwnerPoller(MediaSource &sender) override;
|
||||
// 收到rtp回调
|
||||
void onRtpPacket(const char *data, size_t len) override;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user