规范SdpAttr成员变量命名
This commit is contained in:
parent
c556122881
commit
bdc1f0cd15
|
|
@ -110,13 +110,13 @@ void SdpAttr::load(const string &sdp) {
|
||||||
for (auto &pr : _track_map) {
|
for (auto &pr : _track_map) {
|
||||||
auto &track = *pr.second;
|
auto &track = *pr.second;
|
||||||
if (pr.first == "") {
|
if (pr.first == "") {
|
||||||
track.type = TrackTitle;
|
track._type = TrackTitle;
|
||||||
} else if (pr.first == "video") {
|
} else if (pr.first == "video") {
|
||||||
track.type = TrackVideo;
|
track._type = TrackVideo;
|
||||||
} else if (pr.first == "audio") {
|
} else if (pr.first == "audio") {
|
||||||
track.type = TrackAudio;
|
track._type = TrackAudio;
|
||||||
} else {
|
} else {
|
||||||
track.type = TrackInvalid;
|
track._type = TrackInvalid;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto it = track._attr.find("range");
|
auto it = track._attr.find("range");
|
||||||
|
|
@ -165,7 +165,7 @@ bool SdpAttr::available() const {
|
||||||
|
|
||||||
SdpTrack::Ptr SdpAttr::getTrack(TrackType type) const {
|
SdpTrack::Ptr SdpAttr::getTrack(TrackType type) const {
|
||||||
for (auto &pr : _track_map){
|
for (auto &pr : _track_map){
|
||||||
if(pr.second->type == type){
|
if(pr.second->_type == type){
|
||||||
return pr.second;
|
return pr.second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,13 +63,13 @@ public:
|
||||||
string _fmtp;
|
string _fmtp;
|
||||||
string _control;
|
string _control;
|
||||||
string _control_surffix;
|
string _control_surffix;
|
||||||
TrackType type;
|
TrackType _type;
|
||||||
public:
|
public:
|
||||||
uint8_t interleaved = 0;
|
uint8_t _interleaved = 0;
|
||||||
bool inited = false;
|
bool _inited = false;
|
||||||
uint32_t ssrc = 0;
|
uint32_t _ssrc = 0;
|
||||||
uint16_t seq = 0;
|
uint16_t _seq = 0;
|
||||||
uint32_t timeStamp = 0;
|
uint32_t _time_stamp = 0;
|
||||||
};
|
};
|
||||||
class SdpAttr {
|
class SdpAttr {
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -71,31 +71,45 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual uint32_t getSsrc(TrackType trackType) {
|
virtual uint32_t getSsrc(TrackType trackType) {
|
||||||
return _mapTracks[trackType].ssrc;
|
auto track = _sdpAttr.getTrack(trackType);
|
||||||
|
if(!track){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return track->_ssrc;
|
||||||
}
|
}
|
||||||
virtual uint16_t getSeqence(TrackType trackType) {
|
virtual uint16_t getSeqence(TrackType trackType) {
|
||||||
return _mapTracks[trackType].seq;
|
auto track = _sdpAttr.getTrack(trackType);
|
||||||
|
if(!track){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return track->_seq;
|
||||||
}
|
}
|
||||||
virtual uint32_t getTimestamp(TrackType trackType) {
|
virtual uint32_t getTimestamp(TrackType trackType) {
|
||||||
return _mapTracks[trackType].timeStamp;
|
auto track = _sdpAttr.getTrack(trackType);
|
||||||
|
if(!track){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return track->_time_stamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void onGetSDP(const string& sdp) {
|
virtual void onGetSDP(const string& sdp) {
|
||||||
//派生类设置该媒体源媒体描述信息
|
//派生类设置该媒体源媒体描述信息
|
||||||
_strSdp = sdp;
|
_strSdp = sdp;
|
||||||
|
_sdpAttr.load(sdp);
|
||||||
regist();
|
regist();
|
||||||
}
|
}
|
||||||
|
|
||||||
void onWrite(const RtpPacket::Ptr &rtppt, bool keyPos) override {
|
void onWrite(const RtpPacket::Ptr &rtppt, bool keyPos) override {
|
||||||
auto &trackRef = _mapTracks[rtppt->type];
|
auto track = _sdpAttr.getTrack(rtppt->type);
|
||||||
trackRef.seq = rtppt->sequence;
|
if(track){
|
||||||
trackRef.timeStamp = rtppt->timeStamp;
|
track->_seq = rtppt->sequence;
|
||||||
trackRef.ssrc = rtppt->ssrc;
|
track->_time_stamp = rtppt->timeStamp;
|
||||||
trackRef.type = rtppt->type;
|
track->_ssrc = rtppt->ssrc;
|
||||||
|
}
|
||||||
_pRing->write(rtppt,keyPos);
|
_pRing->write(rtppt,keyPos);
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
unordered_map<int, SdpTrack> _mapTracks;
|
SdpAttr _sdpAttr;
|
||||||
string _strSdp; //媒体描述信息
|
string _strSdp; //媒体描述信息
|
||||||
RingType::Ptr _pRing; //rtp环形缓冲
|
RingType::Ptr _pRing; //rtp环形缓冲
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -287,10 +287,6 @@ void RtspPlayer::handleResDESCRIBE(const Parser& parser) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CLEAR_ARR(_aui32SsrcErrorCnt)
|
CLEAR_ARR(_aui32SsrcErrorCnt)
|
||||||
for (auto &track : _aTrackInfo) {
|
|
||||||
track->ssrc=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
sendSetup(0);
|
sendSetup(0);
|
||||||
}
|
}
|
||||||
//发送SETUP命令
|
//发送SETUP命令
|
||||||
|
|
@ -302,7 +298,7 @@ bool RtspPlayer::sendSetup(unsigned int trackIndex) {
|
||||||
switch (_eType) {
|
switch (_eType) {
|
||||||
case RTP_TCP: {
|
case RTP_TCP: {
|
||||||
StrCaseMap header;
|
StrCaseMap header;
|
||||||
header["Transport"] = StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track->type * 2 << "-" << track->type * 2 + 1;
|
header["Transport"] = StrPrinter << "RTP/AVP/TCP;unicast;interleaved=" << track->_type * 2 << "-" << track->_type * 2 + 1;
|
||||||
return sendRtspRequest("SETUP",baseUrl,header);
|
return sendRtspRequest("SETUP",baseUrl,header);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
@ -352,7 +348,7 @@ void RtspPlayer::handleResSETUP(const Parser &parser, unsigned int uiTrackIndex)
|
||||||
|
|
||||||
if(_eType == RTP_TCP) {
|
if(_eType == RTP_TCP) {
|
||||||
string interleaved = FindField( FindField((strTransport + ";").c_str(), "interleaved=", ";").c_str(), NULL, "-");
|
string interleaved = FindField( FindField((strTransport + ";").c_str(), "interleaved=", ";").c_str(), NULL, "-");
|
||||||
_aTrackInfo[uiTrackIndex]->interleaved = atoi(interleaved.c_str());
|
_aTrackInfo[uiTrackIndex]->_interleaved = atoi(interleaved.c_str());
|
||||||
}else{
|
}else{
|
||||||
const char *strPos = (_eType == RTP_MULTICAST ? "port=" : "server_port=") ;
|
const char *strPos = (_eType == RTP_MULTICAST ? "port=" : "server_port=") ;
|
||||||
auto port_str = FindField((strTransport + ";").c_str(), strPos, ";");
|
auto port_str = FindField((strTransport + ";").c_str(), strPos, ";");
|
||||||
|
|
@ -589,7 +585,7 @@ bool RtspPlayer::handleOneRtp(int iTrackidx, unsigned char *pucData, unsigned in
|
||||||
auto &track = _aTrackInfo[iTrackidx];
|
auto &track = _aTrackInfo[iTrackidx];
|
||||||
auto pt_ptr=_pktPool.obtain();
|
auto pt_ptr=_pktPool.obtain();
|
||||||
auto &rtppt=*pt_ptr;
|
auto &rtppt=*pt_ptr;
|
||||||
rtppt.interleaved = track->interleaved;
|
rtppt.interleaved = track->_interleaved;
|
||||||
rtppt.length = uiLen + 4;
|
rtppt.length = uiLen + 4;
|
||||||
|
|
||||||
rtppt.mark = pucData[1] >> 7;
|
rtppt.mark = pucData[1] >> 7;
|
||||||
|
|
@ -603,15 +599,15 @@ bool RtspPlayer::handleOneRtp(int iTrackidx, unsigned char *pucData, unsigned in
|
||||||
//ssrc
|
//ssrc
|
||||||
memcpy(&rtppt.ssrc,pucData+8,4);//内存对齐
|
memcpy(&rtppt.ssrc,pucData+8,4);//内存对齐
|
||||||
rtppt.ssrc = ntohl(rtppt.ssrc);
|
rtppt.ssrc = ntohl(rtppt.ssrc);
|
||||||
rtppt.type = track->type;
|
rtppt.type = track->_type;
|
||||||
if (track->ssrc == 0) {
|
if (track->_ssrc == 0) {
|
||||||
track->ssrc = rtppt.ssrc;
|
track->_ssrc = rtppt.ssrc;
|
||||||
//保存SSRC
|
//保存SSRC
|
||||||
} else if (track->ssrc != rtppt.ssrc) {
|
} else if (track->_ssrc != rtppt.ssrc) {
|
||||||
//ssrc错误
|
//ssrc错误
|
||||||
WarnL << "ssrc错误";
|
WarnL << "ssrc错误";
|
||||||
if (_aui32SsrcErrorCnt[iTrackidx]++ > 10) {
|
if (_aui32SsrcErrorCnt[iTrackidx]++ > 10) {
|
||||||
track->ssrc = rtppt.ssrc;
|
track->_ssrc = rtppt.ssrc;
|
||||||
WarnL << "ssrc更换!";
|
WarnL << "ssrc更换!";
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -815,7 +811,7 @@ int RtspPlayer::getTrackIndexByControlSuffix(const string &controlSuffix) const{
|
||||||
}
|
}
|
||||||
int RtspPlayer::getTrackIndexByInterleaved(int interleaved) const{
|
int RtspPlayer::getTrackIndexByInterleaved(int interleaved) const{
|
||||||
for (unsigned int i = 0; i < _aTrackInfo.size(); i++) {
|
for (unsigned int i = 0; i < _aTrackInfo.size(); i++) {
|
||||||
if (_aTrackInfo[i]->interleaved == interleaved) {
|
if (_aTrackInfo[i]->_interleaved == interleaved) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -824,7 +820,7 @@ int RtspPlayer::getTrackIndexByInterleaved(int interleaved) const{
|
||||||
|
|
||||||
int RtspPlayer::getTrackIndexByTrackType(TrackType trackType) const {
|
int RtspPlayer::getTrackIndexByTrackType(TrackType trackType) const {
|
||||||
for (unsigned int i = 0; i < _aTrackInfo.size(); i++) {
|
for (unsigned int i = 0; i < _aTrackInfo.size(); i++) {
|
||||||
if (_aTrackInfo[i]->type == trackType) {
|
if (_aTrackInfo[i]->_type == trackType) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,7 +67,7 @@ private:
|
||||||
if(_pRtspMediaSrc){
|
if(_pRtspMediaSrc){
|
||||||
_pRtspMediaSrc->onGetSDP(sdp);
|
_pRtspMediaSrc->onGetSDP(sdp);
|
||||||
}
|
}
|
||||||
_parser.reset(new RtspDemuxer(sdp));
|
_parser.reset(new RtspDemuxer(sdpAttr));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void onRecvRTP(const RtpPacket::Ptr &rtppt, const SdpTrack::Ptr &track) override {
|
void onRecvRTP(const RtpPacket::Ptr &rtppt, const SdpTrack::Ptr &track) override {
|
||||||
|
|
|
||||||
|
|
@ -512,11 +512,11 @@ bool RtspSession::handleReq_Setup() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
SdpTrack::Ptr &trackRef = _aTrackInfo[trackIdx];
|
SdpTrack::Ptr &trackRef = _aTrackInfo[trackIdx];
|
||||||
if (trackRef->inited) {
|
if (trackRef->_inited) {
|
||||||
//已经初始化过该Track
|
//已经初始化过该Track
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
trackRef->inited = true; //现在初始化
|
trackRef->_inited = true; //现在初始化
|
||||||
|
|
||||||
auto strongRing = _pWeakRing.lock();
|
auto strongRing = _pWeakRing.lock();
|
||||||
if (!strongRing) {
|
if (!strongRing) {
|
||||||
|
|
@ -562,9 +562,9 @@ bool RtspSession::handleReq_Setup() {
|
||||||
"x-Dynamic-Rate: 1\r\n\r\n",
|
"x-Dynamic-Rate: 1\r\n\r\n",
|
||||||
_iCseq, SERVER_NAME,
|
_iCseq, SERVER_NAME,
|
||||||
RTSP_VERSION, RTSP_BUILDTIME,
|
RTSP_VERSION, RTSP_BUILDTIME,
|
||||||
dateHeader().data(), trackRef->type * 2,
|
dateHeader().data(), trackRef->_type * 2,
|
||||||
trackRef->type * 2 + 1,
|
trackRef->_type * 2 + 1,
|
||||||
printSSRC(trackRef->ssrc).data(),
|
printSSRC(trackRef->_ssrc).data(),
|
||||||
_strSession.data());
|
_strSession.data());
|
||||||
SocketHelper::send(_pcBuf, iLen);
|
SocketHelper::send(_pcBuf, iLen);
|
||||||
}
|
}
|
||||||
|
|
@ -609,7 +609,7 @@ bool RtspSession::handleReq_Setup() {
|
||||||
RTSP_VERSION, RTSP_BUILDTIME,
|
RTSP_VERSION, RTSP_BUILDTIME,
|
||||||
dateHeader().data(), strClientPort.data(),
|
dateHeader().data(), strClientPort.data(),
|
||||||
pSockRtp->get_local_port(), pSockRtcp->get_local_port(),
|
pSockRtp->get_local_port(), pSockRtcp->get_local_port(),
|
||||||
printSSRC(trackRef->ssrc).data(),
|
printSSRC(trackRef->_ssrc).data(),
|
||||||
_strSession.data());
|
_strSession.data());
|
||||||
SocketHelper::send(_pcBuf, n);
|
SocketHelper::send(_pcBuf, n);
|
||||||
}
|
}
|
||||||
|
|
@ -630,7 +630,7 @@ bool RtspSession::handleReq_Setup() {
|
||||||
strongSelf->safeShutdown();
|
strongSelf->safeShutdown();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
int iSrvPort = _pBrdcaster->getPort(trackRef->type);
|
int iSrvPort = _pBrdcaster->getPort(trackRef->_type);
|
||||||
//我们用trackIdx区分rtp和rtcp包
|
//我们用trackIdx区分rtp和rtcp包
|
||||||
auto pSockRtcp = UDPServer::Instance().getSock(get_local_ip().data(),2*trackIdx + 1,iSrvPort + 1);
|
auto pSockRtcp = UDPServer::Instance().getSock(get_local_ip().data(),2*trackIdx + 1,iSrvPort + 1);
|
||||||
if (!pSockRtcp) {
|
if (!pSockRtcp) {
|
||||||
|
|
@ -652,7 +652,7 @@ bool RtspSession::handleReq_Setup() {
|
||||||
RTSP_VERSION, RTSP_BUILDTIME,
|
RTSP_VERSION, RTSP_BUILDTIME,
|
||||||
dateHeader().data(), _pBrdcaster->getIP().data(),
|
dateHeader().data(), _pBrdcaster->getIP().data(),
|
||||||
get_local_ip().data(), iSrvPort, pSockRtcp->get_local_port(),
|
get_local_ip().data(), iSrvPort, pSockRtcp->get_local_port(),
|
||||||
udpTTL,printSSRC(trackRef->ssrc).data(),
|
udpTTL,printSSRC(trackRef->_ssrc).data(),
|
||||||
_strSession.data());
|
_strSession.data());
|
||||||
SocketHelper::send(_pcBuf, n);
|
SocketHelper::send(_pcBuf, n);
|
||||||
}
|
}
|
||||||
|
|
@ -733,9 +733,9 @@ bool RtspSession::handleReq_Play() {
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto &track : _aTrackInfo){
|
for(auto &track : _aTrackInfo){
|
||||||
track->ssrc = pMediaSrc->getSsrc(track->type);
|
track->_ssrc = pMediaSrc->getSsrc(track->_type);
|
||||||
track->seq = pMediaSrc->getSeqence(track->type);
|
track->_seq = pMediaSrc->getSeqence(track->_type);
|
||||||
track->timeStamp = pMediaSrc->getTimestamp(track->type);
|
track->_time_stamp = pMediaSrc->getTimestamp(track->_type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_bFirstPlay = false;
|
_bFirstPlay = false;
|
||||||
|
|
@ -749,12 +749,12 @@ bool RtspSession::handleReq_Play() {
|
||||||
dateHeader().data(), _strSession.data(),iStamp/1000.0);
|
dateHeader().data(), _strSession.data(),iStamp/1000.0);
|
||||||
|
|
||||||
for(auto &track : _aTrackInfo){
|
for(auto &track : _aTrackInfo){
|
||||||
if (track->inited == false) {
|
if (track->_inited == false) {
|
||||||
//还有track没有setup
|
//还有track没有setup
|
||||||
shutdown();
|
shutdown();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
iLen += sprintf(_pcBuf + iLen, "url=%s/%s;seq=%d;rtptime=%u,", _strUrl.data(), track->_control_surffix.data(), track->seq,track->timeStamp);
|
iLen += sprintf(_pcBuf + iLen, "url=%s/%s;seq=%d;rtptime=%u,", _strUrl.data(), track->_control_surffix.data(), track->_seq,track->_time_stamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
iLen -= 1;
|
iLen -= 1;
|
||||||
|
|
@ -904,9 +904,9 @@ inline bool RtspSession::findStream() {
|
||||||
_pMediaSrc = pMediaSrc;
|
_pMediaSrc = pMediaSrc;
|
||||||
|
|
||||||
for(auto &track : _aTrackInfo){
|
for(auto &track : _aTrackInfo){
|
||||||
track->ssrc = pMediaSrc->getSsrc(track->type);
|
track->_ssrc = pMediaSrc->getSsrc(track->_type);
|
||||||
track->seq = pMediaSrc->getSeqence(track->type);
|
track->_seq = pMediaSrc->getSeqence(track->_type);
|
||||||
track->timeStamp = pMediaSrc->getTimestamp(track->type);
|
track->_time_stamp = pMediaSrc->getTimestamp(track->_type);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -118,7 +118,7 @@ private:
|
||||||
}
|
}
|
||||||
inline int getTrackIndexByTrackType(TrackType type) {
|
inline int getTrackIndexByTrackType(TrackType type) {
|
||||||
for (unsigned int i = 0; i < _aTrackInfo.size(); i++) {
|
for (unsigned int i = 0; i < _aTrackInfo.size(); i++) {
|
||||||
if (type == _aTrackInfo[i]->type) {
|
if (type == _aTrackInfo[i]->_type) {
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -49,8 +49,9 @@ public:
|
||||||
virtual ~RtspToRtmpMediaSource();
|
virtual ~RtspToRtmpMediaSource();
|
||||||
|
|
||||||
virtual void onGetSDP(const string& strSdp) override{
|
virtual void onGetSDP(const string& strSdp) override{
|
||||||
|
RtspMediaSource::onGetSDP(strSdp);
|
||||||
try {
|
try {
|
||||||
_pParser.reset(new RtspDemuxer(strSdp));
|
_pParser.reset(new RtspDemuxer(_sdpAttr));
|
||||||
_pRecorder.reset(new MediaRecorder(getVhost(),getApp(),getId(),_pParser,_bEnableHls,_bEnableMp4));
|
_pRecorder.reset(new MediaRecorder(getVhost(),getApp(),getId(),_pParser,_bEnableHls,_bEnableMp4));
|
||||||
//todo(xzl) 修复此处
|
//todo(xzl) 修复此处
|
||||||
// _pParser->setOnAudioCB( std::bind(&RtspToRtmpMediaSource::onGetAAC, this, placeholders::_1));
|
// _pParser->setOnAudioCB( std::bind(&RtspToRtmpMediaSource::onGetAAC, this, placeholders::_1));
|
||||||
|
|
@ -59,7 +60,6 @@ public:
|
||||||
} catch (exception &ex) {
|
} catch (exception &ex) {
|
||||||
WarnL << ex.what();
|
WarnL << ex.what();
|
||||||
}
|
}
|
||||||
RtspMediaSource::onGetSDP(strSdp);
|
|
||||||
}
|
}
|
||||||
virtual void onWrite(const RtpPacket::Ptr &pRtppkt, bool bKeyPos) override{
|
virtual void onWrite(const RtpPacket::Ptr &pRtppkt, bool bKeyPos) override{
|
||||||
if (_pParser) {
|
if (_pParser) {
|
||||||
|
|
@ -73,20 +73,9 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateTimeStamp(uint32_t uiStamp) {
|
void updateTimeStamp(uint32_t uiStamp) {
|
||||||
for (auto &pr : _mapTracks) {
|
auto tracks = _sdpAttr.getAvailableTrack();
|
||||||
switch (pr.second.type) {
|
for (auto &track : tracks) {
|
||||||
case TrackAudio: {
|
track->_time_stamp = uiStamp * (track->_samplerate / 1000.0);
|
||||||
//todo(xzl) 修复此处
|
|
||||||
// pr.second.timeStamp = uiStamp * (_pParser->getAudioSampleRate() / 1000.0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case TrackVideo: {
|
|
||||||
pr.second.timeStamp = uiStamp * 90;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ RtspDemuxer::RtspDemuxer(const SdpAttr &attr) {
|
||||||
void RtspDemuxer::loadSdp(const SdpAttr &attr) {
|
void RtspDemuxer::loadSdp(const SdpAttr &attr) {
|
||||||
auto tracks = attr.getAvailableTrack();
|
auto tracks = attr.getAvailableTrack();
|
||||||
for (auto &track : tracks){
|
for (auto &track : tracks){
|
||||||
switch (track->type) {
|
switch (track->_type) {
|
||||||
case TrackVideo: {
|
case TrackVideo: {
|
||||||
makeVideoTrack(track);
|
makeVideoTrack(track);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue