Commit ba3b4708 by xiongziliang

解决gcc4.8编译失败的问题

解决部分rtsp服务器seek异常的问题
parent 1faeda2f
Subproject commit 3a9c916454897ad02c6ee4cba89f5e370718cd91 Subproject commit 109c994dc84f1c9ce9caf7199dd905086f54881d
...@@ -541,13 +541,6 @@ bool RtspSession::handleReq_Setup() { ...@@ -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() { ...@@ -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() { ...@@ -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() { ...@@ -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() { ...@@ -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() { ...@@ -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() { ...@@ -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: ...@@ -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: ...@@ -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 */
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论