parent
1faeda2f33
commit
ba3b47086d
|
|
@ -1 +1 @@
|
||||||
Subproject commit 3a9c916454897ad02c6ee4cba89f5e370718cd91
|
Subproject commit 109c994dc84f1c9ce9caf7199dd905086f54881d
|
||||||
|
|
@ -541,13 +541,6 @@ bool RtspSession::handleReq_Setup() {
|
||||||
}
|
}
|
||||||
trackRef->_inited = true; //现在初始化
|
trackRef->_inited = true; //现在初始化
|
||||||
|
|
||||||
auto strongRing = _pWeakRing.lock();
|
|
||||||
if (!strongRing) {
|
|
||||||
//the media source is released!
|
|
||||||
send_NotAcceptable();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!_bSetUped){
|
if(!_bSetUped){
|
||||||
_bSetUped = true;
|
_bSetUped = true;
|
||||||
auto strTransport = _parser["Transport"];
|
auto strTransport = _parser["Transport"];
|
||||||
|
|
@ -560,18 +553,6 @@ bool RtspSession::handleReq_Setup() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_pRtpReader && _rtpType != PlayerBase::RTP_MULTICAST) {
|
|
||||||
_pRtpReader = strongRing->attach();
|
|
||||||
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
|
|
||||||
_pRtpReader->setDetachCB([weakSelf]() {
|
|
||||||
auto strongSelf = weakSelf.lock();
|
|
||||||
if(!strongSelf) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
strongSelf->safeShutdown();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (_rtpType) {
|
switch (_rtpType) {
|
||||||
case PlayerBase::RTP_TCP: {
|
case PlayerBase::RTP_TCP: {
|
||||||
int iLen = sprintf(_pcBuf,
|
int iLen = sprintf(_pcBuf,
|
||||||
|
|
@ -723,6 +704,9 @@ bool RtspSession::handleReq_Play() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool useBuf = true;
|
||||||
|
_enableSendRtp = false;
|
||||||
|
|
||||||
if (strRange.size() && !_bFirstPlay) {
|
if (strRange.size() && !_bFirstPlay) {
|
||||||
//这个是seek操作
|
//这个是seek操作
|
||||||
auto strStart = FindField(strRange.data(), "npt=", "-");
|
auto strStart = FindField(strRange.data(), "npt=", "-");
|
||||||
|
|
@ -731,8 +715,8 @@ bool RtspSession::handleReq_Play() {
|
||||||
}
|
}
|
||||||
auto iStartTime = 1000 * atof(strStart.data());
|
auto iStartTime = 1000 * atof(strStart.data());
|
||||||
InfoL << "rtsp seekTo(ms):" << iStartTime;
|
InfoL << "rtsp seekTo(ms):" << iStartTime;
|
||||||
pMediaSrc->seekTo(iStartTime);
|
useBuf = !pMediaSrc->seekTo(iStartTime);
|
||||||
}else if(pMediaSrc->getRing()->readerCount() == 1){
|
}else if(pMediaSrc->getRing()->readerCount() == 0){
|
||||||
//第一个消费者
|
//第一个消费者
|
||||||
pMediaSrc->seekTo(0);
|
pMediaSrc->seekTo(0);
|
||||||
}
|
}
|
||||||
|
|
@ -769,28 +753,41 @@ bool RtspSession::handleReq_Play() {
|
||||||
iLen += sprintf(_pcBuf + iLen, "\r\n\r\n");
|
iLen += sprintf(_pcBuf + iLen, "\r\n\r\n");
|
||||||
SocketHelper::send(_pcBuf, iLen);
|
SocketHelper::send(_pcBuf, iLen);
|
||||||
|
|
||||||
|
_enableSendRtp = true;
|
||||||
|
|
||||||
//提高发送性能
|
//提高发送性能
|
||||||
(*this) << SocketFlags(kSockFlags);
|
(*this) << SocketFlags(kSockFlags);
|
||||||
SockUtil::setNoDelay(_pSender->rawFD(),false);
|
SockUtil::setNoDelay(_pSender->rawFD(),false);
|
||||||
|
|
||||||
if(_pRtpReader){
|
if (!_pRtpReader && _rtpType != PlayerBase::RTP_MULTICAST) {
|
||||||
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
|
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
|
||||||
SockUtil::setNoDelay(_pSender->rawFD(), false);
|
_pRtpReader = pMediaSrc->getRing()->attach(useBuf);
|
||||||
_pRtpReader->setReadCB([weakSelf](const RtpPacket::Ptr &pack) {
|
_pRtpReader->setDetachCB([weakSelf]() {
|
||||||
auto strongSelf = weakSelf.lock();
|
auto strongSelf = weakSelf.lock();
|
||||||
if(!strongSelf) {
|
if(!strongSelf) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
strongSelf->async([weakSelf,pack](){
|
strongSelf->safeShutdown();
|
||||||
auto strongSelf = weakSelf.lock();
|
});
|
||||||
if(!strongSelf) {
|
_pRtpReader->setReadCB([weakSelf](const RtpPacket::Ptr &pack) {
|
||||||
return;
|
auto strongSelf = weakSelf.lock();
|
||||||
}
|
if(!strongSelf) {
|
||||||
strongSelf->sendRtpPacket(pack);
|
return;
|
||||||
});
|
}
|
||||||
|
if(!strongSelf->_enableSendRtp) {
|
||||||
});
|
return;
|
||||||
}
|
}
|
||||||
|
strongSelf->async([weakSelf,pack](){
|
||||||
|
auto strongSelf = weakSelf.lock();
|
||||||
|
if(!strongSelf) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(strongSelf->_enableSendRtp) {
|
||||||
|
strongSelf->sendRtpPacket(pack);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
|
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
|
||||||
|
|
@ -834,11 +831,8 @@ bool RtspSession::handleReq_Pause() {
|
||||||
"Session: %s\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME,
|
"Session: %s\r\n\r\n", _iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME,
|
||||||
dateHeader().data(), _strSession.data());
|
dateHeader().data(), _strSession.data());
|
||||||
SocketHelper::send(_pcBuf, n);
|
SocketHelper::send(_pcBuf, n);
|
||||||
if (_pRtpReader) {
|
_enableSendRtp = false;
|
||||||
_pRtpReader->setReadCB(nullptr);
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RtspSession::handleReq_Teardown() {
|
bool RtspSession::handleReq_Teardown() {
|
||||||
|
|
@ -992,8 +986,6 @@ inline bool RtspSession::findStream() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
_strSdp = pMediaSrc->getSdp();
|
_strSdp = pMediaSrc->getSdp();
|
||||||
_pWeakRing = pMediaSrc->getRing();
|
|
||||||
|
|
||||||
_sdpAttr.load(_strSdp);
|
_sdpAttr.load(_strSdp);
|
||||||
_aTrackInfo = _sdpAttr.getAvailableTrack();
|
_aTrackInfo = _sdpAttr.getAvailableTrack();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -156,9 +156,6 @@ private:
|
||||||
bool _bFirstPlay = true;
|
bool _bFirstPlay = true;
|
||||||
MediaInfo _mediaInfo;
|
MediaInfo _mediaInfo;
|
||||||
std::weak_ptr<RtspMediaSource> _pMediaSrc;
|
std::weak_ptr<RtspMediaSource> _pMediaSrc;
|
||||||
|
|
||||||
//RTP缓冲
|
|
||||||
weak_ptr<RingBuffer<RtpPacket::Ptr> > _pWeakRing;
|
|
||||||
RingBuffer<RtpPacket::Ptr>::RingReader::Ptr _pRtpReader;
|
RingBuffer<RtpPacket::Ptr>::RingReader::Ptr _pRtpReader;
|
||||||
|
|
||||||
PlayerBase::eRtpType _rtpType = PlayerBase::RTP_UDP;
|
PlayerBase::eRtpType _rtpType = PlayerBase::RTP_UDP;
|
||||||
|
|
@ -204,6 +201,7 @@ private:
|
||||||
|
|
||||||
std::function<void()> _delayTask;
|
std::function<void()> _delayTask;
|
||||||
uint32_t _iTaskTimeLine = 0;
|
uint32_t _iTaskTimeLine = 0;
|
||||||
|
atomic<bool> _enableSendRtp;
|
||||||
};
|
};
|
||||||
|
|
||||||
} /* namespace mediakit */
|
} /* namespace mediakit */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue