2021-04-09 20:42:36 +08:00
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
|
|
|
|
|
*
|
|
|
|
|
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
|
|
|
|
|
*
|
|
|
|
|
* Use of this source code is governed by MIT license that can be found in the
|
|
|
|
|
* LICENSE file in the root of the source tree. All contributing project authors
|
|
|
|
|
* may be found in the AUTHORS file in the root of the source tree.
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#pragma once
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
|
#include <string>
|
2021-03-27 09:13:10 +08:00
|
|
|
|
#include "DtlsTransport.hpp"
|
|
|
|
|
#include "IceServer.hpp"
|
|
|
|
|
#include "SrtpSession.hpp"
|
|
|
|
|
#include "StunPacket.hpp"
|
2021-03-31 17:15:26 +08:00
|
|
|
|
#include "Sdp.h"
|
2021-04-02 17:08:11 +08:00
|
|
|
|
#include "Poller/EventPoller.h"
|
|
|
|
|
#include "Network/Socket.h"
|
2021-04-02 23:01:58 +08:00
|
|
|
|
#include "Rtsp/RtspMediaSourceImp.h"
|
2021-04-03 00:04:52 +08:00
|
|
|
|
#include "Rtcp/RtcpContext.h"
|
2021-05-11 00:54:33 +08:00
|
|
|
|
#include "Rtcp/RtcpFCI.h"
|
2021-06-25 15:43:47 +08:00
|
|
|
|
#include "Nack.h"
|
2021-09-08 18:00:55 +08:00
|
|
|
|
#include "Network/Session.h"
|
2021-10-06 22:17:38 +08:00
|
|
|
|
#include "TwccContext.h"
|
2021-06-25 15:43:47 +08:00
|
|
|
|
|
2021-04-02 17:08:11 +08:00
|
|
|
|
using namespace toolkit;
|
|
|
|
|
using namespace mediakit;
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
2021-09-08 18:00:55 +08:00
|
|
|
|
//RTC配置项目
|
|
|
|
|
namespace RTC {
|
|
|
|
|
extern const string kPort;
|
2021-09-10 22:31:44 +08:00
|
|
|
|
extern const string kTimeOutSec;
|
2021-09-08 18:00:55 +08:00
|
|
|
|
}//namespace RTC
|
|
|
|
|
|
2021-10-19 15:23:12 +08:00
|
|
|
|
class WebRtcInterface {
|
|
|
|
|
public:
|
|
|
|
|
WebRtcInterface() = default;
|
|
|
|
|
virtual ~WebRtcInterface() = default;
|
|
|
|
|
virtual string getAnswerSdp(const string &offer) = 0;
|
|
|
|
|
virtual const string &getIdentifier() const = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class WebRtcException : public WebRtcInterface {
|
|
|
|
|
public:
|
|
|
|
|
WebRtcException(const SockException &ex) : _ex(ex) {};
|
|
|
|
|
~WebRtcException() override = default;
|
|
|
|
|
string getAnswerSdp(const string &offer) override {
|
|
|
|
|
throw _ex;
|
|
|
|
|
}
|
|
|
|
|
const string &getIdentifier() const override {
|
|
|
|
|
static string s_null;
|
|
|
|
|
return s_null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
SockException _ex;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class WebRtcTransport : public WebRtcInterface, public RTC::DtlsTransport::Listener, public RTC::IceServer::Listener, public std::enable_shared_from_this<WebRtcTransport> {
|
2021-03-24 16:52:41 +08:00
|
|
|
|
public:
|
|
|
|
|
using Ptr = std::shared_ptr<WebRtcTransport>;
|
2021-03-27 10:16:49 +08:00
|
|
|
|
WebRtcTransport(const EventPoller::Ptr &poller);
|
|
|
|
|
~WebRtcTransport() override = default;
|
|
|
|
|
|
2021-04-02 17:08:11 +08:00
|
|
|
|
/**
|
2021-04-07 17:21:59 +08:00
|
|
|
|
* 创建对象
|
|
|
|
|
*/
|
|
|
|
|
virtual void onCreate();
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 销毁对象
|
2021-04-02 17:08:11 +08:00
|
|
|
|
*/
|
2021-03-27 10:16:49 +08:00
|
|
|
|
virtual void onDestory();
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
2021-04-02 17:08:11 +08:00
|
|
|
|
/**
|
|
|
|
|
* 创建webrtc answer sdp
|
|
|
|
|
* @param offer offer sdp
|
|
|
|
|
* @return answer sdp
|
|
|
|
|
*/
|
2021-10-19 15:23:12 +08:00
|
|
|
|
string getAnswerSdp(const string &offer) override;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取对象唯一id
|
|
|
|
|
*/
|
|
|
|
|
const string& getIdentifier() const override;
|
2021-03-31 17:15:26 +08:00
|
|
|
|
|
2021-04-02 17:08:11 +08:00
|
|
|
|
/**
|
|
|
|
|
* socket收到udp数据
|
|
|
|
|
* @param buf 数据指针
|
|
|
|
|
* @param len 数据长度
|
|
|
|
|
* @param tuple 数据来源
|
|
|
|
|
*/
|
2021-08-13 16:07:27 +08:00
|
|
|
|
void inputSockData(char *buf, int len, RTC::TransportTuple *tuple);
|
2021-04-02 17:08:11 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 发送rtp
|
|
|
|
|
* @param buf rtcp内容
|
|
|
|
|
* @param len rtcp长度
|
2021-04-04 23:20:10 +08:00
|
|
|
|
* @param flush 是否flush socket
|
2021-05-11 00:54:33 +08:00
|
|
|
|
* @param ctx 用户指针
|
2021-04-02 17:08:11 +08:00
|
|
|
|
*/
|
2021-08-13 16:07:27 +08:00
|
|
|
|
void sendRtpPacket(const char *buf, int len, bool flush, void *ctx = nullptr);
|
|
|
|
|
void sendRtcpPacket(const char *buf, int len, bool flush, void *ctx = nullptr);
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
2021-04-04 23:20:10 +08:00
|
|
|
|
const EventPoller::Ptr& getPoller() const;
|
|
|
|
|
|
2021-03-26 11:07:03 +08:00
|
|
|
|
protected:
|
2021-04-02 17:08:11 +08:00
|
|
|
|
//// dtls相关的回调 ////
|
2021-04-07 17:51:06 +08:00
|
|
|
|
void OnDtlsTransportConnecting(const RTC::DtlsTransport *dtlsTransport) override;
|
2021-04-02 17:08:11 +08:00
|
|
|
|
void OnDtlsTransportConnected(const RTC::DtlsTransport *dtlsTransport,
|
|
|
|
|
RTC::SrtpSession::CryptoSuite srtpCryptoSuite,
|
|
|
|
|
uint8_t *srtpLocalKey,
|
|
|
|
|
size_t srtpLocalKeyLen,
|
|
|
|
|
uint8_t *srtpRemoteKey,
|
|
|
|
|
size_t srtpRemoteKeyLen,
|
|
|
|
|
std::string &remoteCert) override;
|
2021-03-26 11:07:03 +08:00
|
|
|
|
|
2021-04-07 17:51:06 +08:00
|
|
|
|
void OnDtlsTransportFailed(const RTC::DtlsTransport *dtlsTransport) override;
|
|
|
|
|
void OnDtlsTransportClosed(const RTC::DtlsTransport *dtlsTransport) override;
|
2021-03-26 11:07:03 +08:00
|
|
|
|
void OnDtlsTransportSendData(const RTC::DtlsTransport *dtlsTransport, const uint8_t *data, size_t len) override;
|
2021-04-07 17:51:06 +08:00
|
|
|
|
void OnDtlsTransportApplicationDataReceived(const RTC::DtlsTransport *dtlsTransport, const uint8_t *data, size_t len) override;
|
2021-03-26 11:07:03 +08:00
|
|
|
|
|
|
|
|
|
protected:
|
2021-04-02 17:08:11 +08:00
|
|
|
|
//// ice相关的回调 ///
|
2021-03-26 11:07:03 +08:00
|
|
|
|
void OnIceServerSendStunPacket(const RTC::IceServer *iceServer, const RTC::StunPacket *packet, RTC::TransportTuple *tuple) override;
|
|
|
|
|
void OnIceServerSelectedTuple(const RTC::IceServer *iceServer, RTC::TransportTuple *tuple) override;
|
|
|
|
|
void OnIceServerConnected(const RTC::IceServer *iceServer) override;
|
|
|
|
|
void OnIceServerCompleted(const RTC::IceServer *iceServer) override;
|
|
|
|
|
void OnIceServerDisconnected(const RTC::IceServer *iceServer) override;
|
|
|
|
|
|
2021-03-24 16:52:41 +08:00
|
|
|
|
protected:
|
2021-04-02 17:08:11 +08:00
|
|
|
|
virtual void onStartWebRTC() = 0;
|
2021-04-28 15:41:36 +08:00
|
|
|
|
virtual void onRtcConfigure(RtcConfigure &configure) const;
|
2021-10-12 17:04:21 +08:00
|
|
|
|
virtual void onCheckSdp(SdpType type, RtcSession &sdp) = 0;
|
2021-11-27 21:30:46 +08:00
|
|
|
|
virtual void onSendSockData(Buffer::Ptr buf, bool flush = true, RTC::TransportTuple *tuple = nullptr) = 0;
|
2021-04-02 17:56:24 +08:00
|
|
|
|
|
2021-10-07 15:49:33 +08:00
|
|
|
|
virtual void onRtp(const char *buf, size_t len, uint64_t stamp_ms) = 0;
|
2021-04-02 17:56:24 +08:00
|
|
|
|
virtual void onRtcp(const char *buf, size_t len) = 0;
|
2021-04-07 17:21:59 +08:00
|
|
|
|
virtual void onShutdown(const SockException &ex) = 0;
|
2021-08-13 16:07:27 +08:00
|
|
|
|
virtual void onBeforeEncryptRtp(const char *buf, int &len, void *ctx) = 0;
|
|
|
|
|
virtual void onBeforeEncryptRtcp(const char *buf, int &len, void *ctx) = 0;
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
2021-04-02 20:35:43 +08:00
|
|
|
|
protected:
|
2021-04-07 20:33:53 +08:00
|
|
|
|
RTC::TransportTuple* getSelectedTuple() const;
|
2021-04-28 15:41:36 +08:00
|
|
|
|
void sendRtcpRemb(uint32_t ssrc, size_t bit_rate);
|
|
|
|
|
void sendRtcpPli(uint32_t ssrc);
|
2021-04-02 20:35:43 +08:00
|
|
|
|
|
2021-03-24 16:52:41 +08:00
|
|
|
|
private:
|
2021-11-27 21:30:46 +08:00
|
|
|
|
void sendSockData(const char *buf, size_t len, RTC::TransportTuple *tuple);
|
2021-04-02 17:08:11 +08:00
|
|
|
|
void setRemoteDtlsFingerprint(const RtcSession &remote);
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
2021-10-15 16:27:17 +08:00
|
|
|
|
protected:
|
|
|
|
|
RtcSession::Ptr _offer_sdp;
|
|
|
|
|
RtcSession::Ptr _answer_sdp;
|
|
|
|
|
|
2021-03-24 16:52:41 +08:00
|
|
|
|
private:
|
2021-10-15 17:12:39 +08:00
|
|
|
|
string _identifier;
|
2021-04-04 23:20:10 +08:00
|
|
|
|
EventPoller::Ptr _poller;
|
2021-04-02 17:08:11 +08:00
|
|
|
|
std::shared_ptr<RTC::IceServer> _ice_server;
|
|
|
|
|
std::shared_ptr<RTC::DtlsTransport> _dtls_transport;
|
|
|
|
|
std::shared_ptr<RTC::SrtpSession> _srtp_session_send;
|
2021-07-28 11:18:09 +08:00
|
|
|
|
std::shared_ptr<RTC::SrtpSession> _srtp_session_recv;
|
2021-10-07 15:49:33 +08:00
|
|
|
|
Ticker _ticker;
|
2021-11-27 21:30:46 +08:00
|
|
|
|
//循环池
|
|
|
|
|
ResourcePool<BufferRaw> _packet_pool;
|
2021-03-24 16:52:41 +08:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-25 14:37:11 +08:00
|
|
|
|
class RtpChannel;
|
2021-06-25 15:31:13 +08:00
|
|
|
|
class MediaTrack {
|
|
|
|
|
public:
|
|
|
|
|
using Ptr = std::shared_ptr<MediaTrack>;
|
|
|
|
|
const RtcCodecPlan *plan_rtp;
|
|
|
|
|
const RtcCodecPlan *plan_rtx;
|
|
|
|
|
uint32_t offer_ssrc_rtp = 0;
|
|
|
|
|
uint32_t offer_ssrc_rtx = 0;
|
|
|
|
|
uint32_t answer_ssrc_rtp = 0;
|
|
|
|
|
uint32_t answer_ssrc_rtx = 0;
|
|
|
|
|
const RtcMedia *media;
|
|
|
|
|
RtpExtContext::Ptr rtp_ext_ctx;
|
|
|
|
|
|
|
|
|
|
//for send rtp
|
|
|
|
|
NackList nack_list;
|
|
|
|
|
RtcpContext::Ptr rtcp_context_send;
|
|
|
|
|
|
|
|
|
|
//for recv rtp
|
|
|
|
|
unordered_map<string/*rid*/, std::shared_ptr<RtpChannel> > rtp_channel;
|
|
|
|
|
std::shared_ptr<RtpChannel> getRtpChannel(uint32_t ssrc) const;
|
|
|
|
|
};
|
|
|
|
|
|
2021-11-18 18:41:23 +08:00
|
|
|
|
struct WrappedMediaTrack {
|
|
|
|
|
MediaTrack::Ptr track;
|
|
|
|
|
explicit WrappedMediaTrack(MediaTrack::Ptr ptr): track(ptr) {}
|
|
|
|
|
virtual ~WrappedMediaTrack() {}
|
|
|
|
|
virtual void inputRtp(const char *buf, size_t len, uint64_t stamp_ms, RtpHeader *rtp) = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct WrappedRtxTrack: public WrappedMediaTrack {
|
|
|
|
|
explicit WrappedRtxTrack(MediaTrack::Ptr ptr)
|
|
|
|
|
: WrappedMediaTrack(std::move(ptr)) {}
|
|
|
|
|
void inputRtp(const char *buf, size_t len, uint64_t stamp_ms, RtpHeader *rtp) override;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class WebRtcTransportImp;
|
|
|
|
|
|
|
|
|
|
struct WrappedRtpTrack : public WrappedMediaTrack {
|
|
|
|
|
explicit WrappedRtpTrack(MediaTrack::Ptr ptr, TwccContext& twcc, WebRtcTransportImp& t)
|
|
|
|
|
: WrappedMediaTrack(std::move(ptr))
|
|
|
|
|
, _twcc_ctx(twcc)
|
|
|
|
|
, _transport(t) {}
|
|
|
|
|
TwccContext& _twcc_ctx;
|
|
|
|
|
WebRtcTransportImp& _transport;
|
|
|
|
|
void inputRtp(const char *buf, size_t len, uint64_t stamp_ms, RtpHeader *rtp) override;
|
|
|
|
|
};
|
|
|
|
|
|
2021-10-15 16:27:17 +08:00
|
|
|
|
class WebRtcTransportImp : public WebRtcTransport {
|
2021-03-24 16:52:41 +08:00
|
|
|
|
public:
|
|
|
|
|
using Ptr = std::shared_ptr<WebRtcTransportImp>;
|
2021-04-07 17:51:06 +08:00
|
|
|
|
~WebRtcTransportImp() override;
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
2021-09-15 20:08:18 +08:00
|
|
|
|
void setSession(Session::Ptr session);
|
2021-10-15 16:27:17 +08:00
|
|
|
|
const Session::Ptr& getSession() const;
|
|
|
|
|
uint64_t getBytesUsage() const;
|
|
|
|
|
uint64_t getDuration() const;
|
|
|
|
|
bool canSendRtp() const;
|
|
|
|
|
bool canRecvRtp() const;
|
|
|
|
|
void onSendRtp(const RtpPacket::Ptr &rtp, bool flush, bool rtx = false);
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
2021-11-18 18:41:23 +08:00
|
|
|
|
void createRtpChannel(const string &rid, uint32_t ssrc, MediaTrack &track);
|
|
|
|
|
|
2021-03-24 16:52:41 +08:00
|
|
|
|
protected:
|
2021-10-15 16:27:17 +08:00
|
|
|
|
WebRtcTransportImp(const EventPoller::Ptr &poller);
|
2021-04-02 17:08:11 +08:00
|
|
|
|
void onStartWebRTC() override;
|
2021-11-27 21:30:46 +08:00
|
|
|
|
void onSendSockData(Buffer::Ptr buf, bool flush = true, RTC::TransportTuple *tuple = nullptr) override;
|
2021-10-12 17:04:21 +08:00
|
|
|
|
void onCheckSdp(SdpType type, RtcSession &sdp) override;
|
2021-04-02 18:28:01 +08:00
|
|
|
|
void onRtcConfigure(RtcConfigure &configure) const override;
|
2021-04-02 17:56:24 +08:00
|
|
|
|
|
2021-10-07 15:49:33 +08:00
|
|
|
|
void onRtp(const char *buf, size_t len, uint64_t stamp_ms) override;
|
2021-04-02 17:56:24 +08:00
|
|
|
|
void onRtcp(const char *buf, size_t len) override;
|
2021-08-13 16:07:27 +08:00
|
|
|
|
void onBeforeEncryptRtp(const char *buf, int &len, void *ctx) override;
|
|
|
|
|
void onBeforeEncryptRtcp(const char *buf, int &len, void *ctx) override {};
|
2021-10-15 16:27:17 +08:00
|
|
|
|
void onCreate() override;
|
|
|
|
|
void onDestory() override;
|
2021-04-07 17:21:59 +08:00
|
|
|
|
void onShutdown(const SockException &ex) override;
|
2021-10-15 16:27:17 +08:00
|
|
|
|
virtual void onRecvRtp(MediaTrack &track, const string &rid, RtpPacket::Ptr rtp) = 0;
|
2021-10-16 10:52:28 +08:00
|
|
|
|
void updateTicker();
|
2021-04-07 18:18:27 +08:00
|
|
|
|
|
2021-04-02 17:08:11 +08:00
|
|
|
|
private:
|
2021-04-02 18:28:01 +08:00
|
|
|
|
SdpAttrCandidate::Ptr getIceCandidate() const;
|
2021-06-25 14:37:11 +08:00
|
|
|
|
void onSortedRtp(MediaTrack &track, const string &rid, RtpPacket::Ptr rtp);
|
|
|
|
|
void onSendNack(MediaTrack &track, const FCI_NACK &nack, uint32_t ssrc);
|
2021-10-07 14:22:12 +08:00
|
|
|
|
void onSendTwcc(uint32_t ssrc, const string &twcc_fci);
|
2021-11-18 18:41:23 +08:00
|
|
|
|
|
2021-09-10 22:31:44 +08:00
|
|
|
|
void registerSelf();
|
|
|
|
|
void unregisterSelf();
|
|
|
|
|
void unrefSelf();
|
2021-10-12 17:04:21 +08:00
|
|
|
|
void onCheckAnswer(RtcSession &sdp);
|
2021-03-24 16:52:41 +08:00
|
|
|
|
|
|
|
|
|
private:
|
2021-05-16 18:06:34 +08:00
|
|
|
|
uint16_t _rtx_seq[2] = {0, 0};
|
2021-04-07 18:35:38 +08:00
|
|
|
|
//用掉的总流量
|
|
|
|
|
uint64_t _bytes_usage = 0;
|
2021-09-10 22:31:44 +08:00
|
|
|
|
//保持自我强引用
|
|
|
|
|
Ptr _self;
|
2021-04-07 17:51:06 +08:00
|
|
|
|
//检测超时的定时器
|
|
|
|
|
Timer::Ptr _timer;
|
|
|
|
|
//刷新计时器
|
|
|
|
|
Ticker _alive_ticker;
|
2021-04-05 00:12:46 +08:00
|
|
|
|
//pli rtcp计时器
|
2021-04-04 23:20:10 +08:00
|
|
|
|
Ticker _pli_ticker;
|
2021-12-15 15:55:43 +08:00
|
|
|
|
//当前选中的udp链接
|
|
|
|
|
Session::Ptr _selected_session;
|
|
|
|
|
//链接迁移前后使用过的udp链接
|
|
|
|
|
unordered_map<Session *, weak_ptr<Session> > _history_sessions;
|
2021-10-15 16:27:17 +08:00
|
|
|
|
//twcc rtcp发送上下文对象
|
|
|
|
|
TwccContext _twcc_ctx;
|
2021-05-16 16:12:10 +08:00
|
|
|
|
//根据发送rtp的track类型获取相关信息
|
2021-06-25 14:59:27 +08:00
|
|
|
|
MediaTrack::Ptr _type_to_track[2];
|
2021-06-25 17:24:32 +08:00
|
|
|
|
//根据rtcp的ssrc获取相关信息,收发rtp和rtx的ssrc都会记录
|
2021-06-25 14:59:27 +08:00
|
|
|
|
unordered_map<uint32_t/*ssrc*/, MediaTrack::Ptr> _ssrc_to_track;
|
2021-10-15 16:27:17 +08:00
|
|
|
|
//根据接收rtp的pt获取相关信息
|
2021-11-18 18:41:23 +08:00
|
|
|
|
unordered_map<uint8_t/*pt*/, std::unique_ptr<WrappedMediaTrack>> _pt_to_track;
|
2021-10-15 18:56:49 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class WebRtcTransportManager {
|
|
|
|
|
public:
|
2021-10-19 15:23:12 +08:00
|
|
|
|
friend class WebRtcTransportImp;
|
2021-10-16 10:25:23 +08:00
|
|
|
|
static WebRtcTransportManager &Instance();
|
|
|
|
|
WebRtcTransportImp::Ptr getItem(const string &key);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
WebRtcTransportManager() = default;
|
2021-10-19 15:23:12 +08:00
|
|
|
|
void addItem(const string &key, const WebRtcTransportImp::Ptr &ptr);
|
|
|
|
|
void removeItem(const string &key);
|
|
|
|
|
|
|
|
|
|
private:
|
2021-10-16 10:25:23 +08:00
|
|
|
|
mutable mutex _mtx;
|
|
|
|
|
unordered_map<string, weak_ptr<WebRtcTransportImp> > _map;
|
2021-10-19 15:23:12 +08:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class WebRtcArgs {
|
|
|
|
|
public:
|
|
|
|
|
WebRtcArgs() = default;
|
|
|
|
|
virtual ~WebRtcArgs() = default;
|
|
|
|
|
|
|
|
|
|
virtual variant operator[](const string &key) const = 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class WebRtcPluginManager {
|
|
|
|
|
public:
|
|
|
|
|
using onCreateRtc = function<void(const WebRtcInterface &rtc)>;
|
|
|
|
|
using Plugin = function<void(Session &sender, const string &offer, const WebRtcArgs &args, const onCreateRtc &cb)>;
|
|
|
|
|
|
|
|
|
|
static WebRtcPluginManager &Instance();
|
|
|
|
|
|
|
|
|
|
void registerPlugin(const string &type, Plugin cb);
|
|
|
|
|
void getAnswerSdp(Session &sender, const string &type, const string &offer, const WebRtcArgs &args, const onCreateRtc &cb);
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
WebRtcPluginManager() = default;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
mutable mutex _mtx_creator;
|
|
|
|
|
unordered_map<string, Plugin> _map_creator;
|
2021-05-16 16:12:10 +08:00
|
|
|
|
};
|