diff --git a/src/Rtp/GB28181Process.cpp b/src/Rtp/GB28181Process.cpp index 94bf42e1..93e81a0a 100644 --- a/src/Rtp/GB28181Process.cpp +++ b/src/Rtp/GB28181Process.cpp @@ -34,7 +34,7 @@ bool GB28181Process::inputRtp(bool, const char *data, size_t data_len) { return handleOneRtp(0, TrackVideo, 90000, (unsigned char *) data, data_len); } -void GB28181Process::onRtpSorted(const RtpPacket::Ptr &rtp, int) { +void GB28181Process::onRtpSorted(RtpPacket::Ptr rtp, int) { auto pt = rtp->getHeader()->pt; if (!_rtp_decoder) { switch (pt) { diff --git a/src/Rtp/GB28181Process.h b/src/Rtp/GB28181Process.h index 9238fed6..c4149bc2 100644 --- a/src/Rtp/GB28181Process.h +++ b/src/Rtp/GB28181Process.h @@ -36,7 +36,7 @@ public: bool inputRtp(bool, const char *data, size_t data_len) override; protected: - void onRtpSorted(const RtpPacket::Ptr &rtp, int track_index) override ; + void onRtpSorted(RtpPacket::Ptr rtp, int track_index) override ; const char *onSearchPacketTail(const char *data,size_t len) override; ssize_t onRecvHeader(const char *data,size_t len) override { return 0; }; diff --git a/src/Rtsp/RtpCodec.cpp b/src/Rtsp/RtpCodec.cpp index 577a8f48..72f10432 100644 --- a/src/Rtsp/RtpCodec.cpp +++ b/src/Rtsp/RtpCodec.cpp @@ -14,7 +14,7 @@ namespace mediakit{ RtpPacket::Ptr RtpInfo::makeRtp(TrackType type, const void* data, size_t len, bool mark, uint32_t stamp) { uint16_t payload_len = (uint16_t) (len + RtpPacket::kRtpHeaderSize); - auto rtp = ResourcePoolHelper::obtainObj(); + auto rtp = RtpPacket::create(); rtp->setCapacity(payload_len + RtpPacket::kRtpTcpHeaderSize); rtp->setSize(payload_len + RtpPacket::kRtpTcpHeaderSize); rtp->sample_rate = _sample_rate; diff --git a/src/Rtsp/RtpCodec.h b/src/Rtsp/RtpCodec.h index 778fc96f..52022cbb 100644 --- a/src/Rtsp/RtpCodec.h +++ b/src/Rtsp/RtpCodec.h @@ -58,9 +58,9 @@ protected: RingType::Ptr _rtpRing; }; -class RtpInfo : public ResourcePoolHelper{ +class RtpInfo{ public: - typedef std::shared_ptr Ptr; + using Ptr = std::shared_ptr; RtpInfo(uint32_t ssrc, size_t mtu_size, uint32_t sample_rate, uint8_t pt, uint8_t interleaved) { if (ssrc == 0) { @@ -73,7 +73,7 @@ public: _interleaved = interleaved; } - ~RtpInfo() override {} + virtual ~RtpInfo() {} //返回rtp负载最大长度 size_t getMaxSize() const { diff --git a/src/Rtsp/RtpReceiver.cpp b/src/Rtsp/RtpReceiver.cpp index 24c412e0..711ce9e8 100644 --- a/src/Rtsp/RtpReceiver.cpp +++ b/src/Rtsp/RtpReceiver.cpp @@ -19,7 +19,7 @@ RtpReceiver::RtpReceiver() { int index = 0; for (auto &sortor : _rtp_sortor) { sortor.setOnSort([this, index](uint16_t seq, RtpPacket::Ptr &packet) { - onRtpSorted(packet, index); + onRtpSorted(std::move(packet), index); }); ++index; } @@ -61,7 +61,7 @@ bool RtpReceiver::handleOneRtp(int index, TrackType type, int sample_rate, uint8 return false; } - auto rtp = _rtp_pool.obtain(); + auto rtp = RtpPacket::create(); //需要添加4个字节的rtp over tcp头 rtp->setCapacity(RtpPacket::kRtpTcpHeaderSize + len); rtp->setSize(RtpPacket::kRtpTcpHeaderSize + len); @@ -90,10 +90,6 @@ void RtpReceiver::clear() { } } -void RtpReceiver::setPoolSize(size_t size) { - _rtp_pool.setSize(size); -} - size_t RtpReceiver::getJitterSize(int index) const{ return _rtp_sortor[index].getJitterSize(); } diff --git a/src/Rtsp/RtpReceiver.h b/src/Rtsp/RtpReceiver.h index 0ee16c27..99cba9d3 100644 --- a/src/Rtsp/RtpReceiver.h +++ b/src/Rtsp/RtpReceiver.h @@ -182,7 +182,7 @@ protected: * @param rtp rtp数据包 * @param track_index track索引 */ - virtual void onRtpSorted(const RtpPacket::Ptr &rtp, int track_index) {} + virtual void onRtpSorted(RtpPacket::Ptr rtp, int track_index) {} /** * 解析出rtp但还未排序 @@ -192,7 +192,6 @@ protected: virtual void onBeforeRtpSorted(const RtpPacket::Ptr &rtp, int track_index) {} void clear(); - void setPoolSize(size_t size); size_t getJitterSize(int track_index) const; size_t getCycleCount(int track_index) const; uint32_t getSSRC(int track_index) const; @@ -201,8 +200,6 @@ private: uint32_t _ssrc[2] = {0, 0}; //rtp排序缓存,根据seq排序 PacketSortor _rtp_sortor[2]; - //rtp循环池 - RtspMediaSource::PoolType _rtp_pool; }; }//namespace mediakit diff --git a/src/Rtsp/Rtsp.cpp b/src/Rtsp/Rtsp.cpp index 6ff2208c..70242a20 100644 --- a/src/Rtsp/Rtsp.cpp +++ b/src/Rtsp/Rtsp.cpp @@ -531,4 +531,18 @@ size_t RtpPacket::getPayloadSize(){ return getHeader()->getPayloadSize(size() - kRtpTcpHeaderSize); } +RtpPacket::Ptr RtpPacket::create(){ +#if 0 + static ResourcePool packet_pool; + static onceToken token([]() { + packet_pool.setSize(1024); + }); + auto ret = packet_pool.obtain(); + ret->setSize(0); + return ret; +#else + return Ptr(new RtpPacket); +#endif +} + }//namespace mediakit \ No newline at end of file diff --git a/src/Rtsp/Rtsp.h b/src/Rtsp/Rtsp.h index 75dc7141..8b4f2508 100644 --- a/src/Rtsp/Rtsp.h +++ b/src/Rtsp/Rtsp.h @@ -166,6 +166,12 @@ public: TrackType type; //音频为采样率,视频一般为90000 uint32_t sample_rate; + + static Ptr create(); + +private: + friend class ResourcePool_l; + RtpPacket() = default; }; class RtpPayload { diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 9ee8adb0..56752ac4 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -494,10 +494,10 @@ void RtspPlayer::onRtcpPacket(int track_idx, SdpTrack::Ptr &track, uint8_t *data } } -void RtspPlayer::onRtpSorted(const RtpPacket::Ptr &rtppt, int trackidx){ +void RtspPlayer::onRtpSorted(RtpPacket::Ptr rtppt, int trackidx){ _stamp[trackidx] = rtppt->getStampMS(); _rtp_recv_ticker.resetTime(); - onRecvRTP(rtppt, _sdp_track[trackidx]); + onRecvRTP(std::move(rtppt), _sdp_track[trackidx]); } float RtspPlayer::getPacketLossRate(TrackType type) const{ diff --git a/src/Rtsp/RtspPlayer.h b/src/Rtsp/RtspPlayer.h index 22d9fafa..8265ab0c 100644 --- a/src/Rtsp/RtspPlayer.h +++ b/src/Rtsp/RtspPlayer.h @@ -33,7 +33,7 @@ using namespace toolkit; namespace mediakit { //实现了rtsp播放器协议部分的功能,及数据接收功能 -class RtspPlayer: public PlayerBase,public TcpClient, public RtspSplitter, public RtpReceiver { +class RtspPlayer: public PlayerBase, public TcpClient, public RtspSplitter, public RtpReceiver { public: typedef std::shared_ptr Ptr; @@ -48,7 +48,7 @@ public: protected: //派生类回调函数 virtual bool onCheckSDP(const string &sdp) = 0; - virtual void onRecvRTP(const RtpPacket::Ptr &rtp, const SdpTrack::Ptr &track) = 0; + virtual void onRecvRTP(RtpPacket::Ptr rtp, const SdpTrack::Ptr &track) = 0; uint32_t getProgressMilliSecond() const; void seekToMilliSecond(uint32_t ms); @@ -70,7 +70,7 @@ protected: * @param rtp rtp数据包 * @param track_idx track索引 */ - void onRtpSorted(const RtpPacket::Ptr &rtp, int track_idx) override; + void onRtpSorted(RtpPacket::Ptr rtp, int track_idx) override; /** * 解析出rtp但还未排序 diff --git a/src/Rtsp/RtspPlayerImp.h b/src/Rtsp/RtspPlayerImp.h index af9c031b..304a6790 100644 --- a/src/Rtsp/RtspPlayerImp.h +++ b/src/Rtsp/RtspPlayerImp.h @@ -59,18 +59,18 @@ private: return true; } - void onRecvRTP(const RtpPacket::Ptr &rtp, const SdpTrack::Ptr &track) override { - if (_rtsp_media_src) { - // rtsp直接代理是无法判断该rtp是否是I帧,所以GOP缓存基本是无效的 - // 为了减少内存使用,那么我们设置为一直关键帧以便清空GOP缓存 - _rtsp_media_src->onWrite(rtp, true); - } + void onRecvRTP(RtpPacket::Ptr rtp, const SdpTrack::Ptr &track) override { _delegate->inputRtp(rtp); - if (_max_analysis_ms && _delegate->isInited(_max_analysis_ms)) { PlayerImp::onPlayResult(SockException(Err_success, "play rtsp success")); _max_analysis_ms = 0; } + + if (_rtsp_media_src) { + // rtsp直接代理是无法判断该rtp是否是I帧,所以GOP缓存基本是无效的 + // 为了减少内存使用,那么我们设置为一直关键帧以便清空GOP缓存 + _rtsp_media_src->onWrite(std::move(rtp), true); + } } //在RtspPlayer中触发onPlayResult事件只是代表收到play回复了, diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index a2037596..d9657880 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -913,8 +913,8 @@ void RtspSession::send_NotAcceptable() { sendRtspResponse("406 Not Acceptable",{"Connection","Close"}); } -void RtspSession::onRtpSorted(const RtpPacket::Ptr &rtp, int track_idx) { - _push_src->onWrite(rtp, false); +void RtspSession::onRtpSorted(RtpPacket::Ptr rtp, int track_idx) { + _push_src->onWrite(std::move(rtp), false); } void RtspSession::onRcvPeerUdpData(int interleaved, const Buffer::Ptr &buf, const struct sockaddr &addr) { diff --git a/src/Rtsp/RtspSession.h b/src/Rtsp/RtspSession.h index 451f7e3b..8fe0409f 100644 --- a/src/Rtsp/RtspSession.h +++ b/src/Rtsp/RtspSession.h @@ -79,7 +79,7 @@ protected: ssize_t getContentLength(Parser &parser) override; ////RtpReceiver override//// - void onRtpSorted(const RtpPacket::Ptr &rtp, int track_idx) override; + void onRtpSorted(RtpPacket::Ptr rtp, int track_idx) override; void onBeforeRtpSorted(const RtpPacket::Ptr &rtp, int track_index) override; ///////MediaSourceEvent override///////