From f831e9240ed0fc83810b8838d6817ff88b0bc319 Mon Sep 17 00:00:00 2001 From: winlin Date: Sat, 27 Feb 2021 23:29:52 +0800 Subject: [PATCH] RTC: Fast copy shared message for RTP --- trunk/src/kernel/srs_kernel_flv.cpp | 23 +++++++++++++++-------- trunk/src/kernel/srs_kernel_flv.hpp | 2 ++ trunk/src/kernel/srs_kernel_rtc_rtp.cpp | 4 +++- trunk/src/kernel/srs_kernel_rtc_rtp.hpp | 4 +++- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index a06e387df..0706cd487 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -361,14 +361,7 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy() { srs_assert(ptr); - SrsSharedPtrMessage* copy = _srs_rtp_msg_cache_objs->allocate(); - - // We got an object from cache, the ptr might exists, so unwrap it. - copy->unwrap(); - - // Reference to this message instead. - copy->ptr = ptr; - ptr->shared_count++; + SrsSharedPtrMessage* copy = copy2(); copy->timestamp = timestamp; copy->stream_id = stream_id; @@ -378,6 +371,20 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy() return copy; } +SrsSharedPtrMessage* SrsSharedPtrMessage::copy2() +{ + SrsSharedPtrMessage* copy = _srs_rtp_msg_cache_objs->allocate(); + + // We got an object from cache, the ptr might exists, so unwrap it. + //srs_assert(!copy->ptr); + + // Reference to this message instead. + copy->ptr = ptr; + ptr->shared_count++; + + return copy; +} + SrsFlvTransmuxer::SrsFlvTransmuxer() { writer = NULL; diff --git a/trunk/src/kernel/srs_kernel_flv.hpp b/trunk/src/kernel/srs_kernel_flv.hpp index c5e96394d..0cc6102ac 100644 --- a/trunk/src/kernel/srs_kernel_flv.hpp +++ b/trunk/src/kernel/srs_kernel_flv.hpp @@ -351,6 +351,8 @@ public: // copy current shared ptr message, use ref-count. // @remark, assert object is created. virtual SrsSharedPtrMessage* copy(); + // Only copy the buffer, without header fields. + virtual SrsSharedPtrMessage* copy2(); }; // Transmux RTMP packets to FLV stream. diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index eb770735c..36822a43f 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -910,6 +910,8 @@ void SrsRtpPacket2::recycle_shared_msg() } if (!shared_msg->payload || shared_msg->size != kRtpPacketSize || shared_msg->count() > 0) { + // Note that we must unwrap the shared message, because this object pool only cache the + // shared message itself without payload. shared_msg->unwrap(); _srs_rtp_msg_cache_objs->recycle(shared_msg); goto cleanup; @@ -1007,7 +1009,7 @@ SrsRtpPacket2* SrsRtpPacket2::copy() cp->payload_type_ = payload_type_; cp->nalu_type = nalu_type; - cp->shared_msg = shared_msg->copy(); + cp->shared_msg = shared_msg->copy2(); cp->frame_type = frame_type; // For performance issue, do not copy the unused field. diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index 1c119e0bc..b7947fa8c 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -591,8 +591,10 @@ extern SrsRtpObjectCacheManager* _srs_rtp_cache; extern SrsRtpObjectCacheManager* _srs_rtp_raw_cache; extern SrsRtpObjectCacheManager* _srs_rtp_fua_cache; -// For RTP packet shared messages cache. +// For shared message cache, with payload. extern SrsRtpObjectCacheManager* _srs_rtp_msg_cache_buffers; +// For shared message cache, without payload. +// Note that user must unwrap the shared message, before recycle it. extern SrsRtpObjectCacheManager* _srs_rtp_msg_cache_objs; #endif