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,19 +361,26 @@ SrsSharedPtrMessage* SrsSharedPtrMessage::copy() { srs_assert(ptr); + SrsSharedPtrMessage* copy = copy2(); + + copy->timestamp = timestamp; + copy->stream_id = stream_id; + copy->payload = ptr->payload; + copy->size = ptr->size; + + 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. - copy->unwrap(); + //srs_assert(!copy->ptr); // Reference to this message instead. copy->ptr = ptr; ptr->shared_count++; - - copy->timestamp = timestamp; - copy->stream_id = stream_id; - copy->payload = ptr->payload; - copy->size = ptr->size; return copy; } 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