diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index a8b205b84..cdd528b0a 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1130,6 +1130,9 @@ srs_error_t SrsRtcPublishStream::on_rtp_plaintext(char* plaintext, int nb_plaint // Allocate packet form cache. SrsRtpPacket2* pkt = _srs_rtp_cache->allocate(); + // It's better to reset it before decode it. + pkt->reset(); + // Copy the packet body. char* p = pkt->wrap(plaintext, nb_plaintext); diff --git a/trunk/src/app/srs_app_rtc_source.cpp b/trunk/src/app/srs_app_rtc_source.cpp index 7d2c149b7..c2f96f918 100644 --- a/trunk/src/app/srs_app_rtc_source.cpp +++ b/trunk/src/app/srs_app_rtc_source.cpp @@ -589,6 +589,9 @@ std::vector SrsRtcStream::get_track_desc(std::string ty SrsRtpPacketCacheHelper::SrsRtpPacketCacheHelper() { pkt = _srs_rtp_cache->allocate(); + + // We MUST reset the packet, when got from cache. + pkt->reset(); } SrsRtpPacketCacheHelper::~SrsRtpPacketCacheHelper() diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 488fccea7..1b387fde0 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -866,6 +866,21 @@ SrsRtpPacket2::~SrsRtpPacket2() recycle_shared_msg(); } +void SrsRtpPacket2::reset() +{ + nalu_type = SrsAvcNaluTypeReserved; + frame_type = SrsFrameTypeReserved; + cached_payload_size = 0; + decode_handler = NULL; + + // It's important to reset the header. + header.reset(); + + // Recyle the payload again, to ensure the packet is new one. + recycle_payload(); + recycle_shared_msg(); +} + void SrsRtpPacket2::recycle_payload() { if (!payload_) { @@ -916,16 +931,10 @@ cleanup: bool SrsRtpPacket2::recycle() { - nalu_type = SrsAvcNaluTypeReserved; - frame_type = SrsFrameTypeReserved; - cached_payload_size = 0; - decode_handler = NULL; - - header.reset(); - + // We only recycle the payload and shared messages, + // for header and fields, user will reset or copy it. recycle_payload(); recycle_shared_msg(); - return true; } diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index 4503a73e6..ec4b44a99 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -324,6 +324,10 @@ private: public: SrsRtpPacket2(); virtual ~SrsRtpPacket2(); +public: + // User MUST reset the packet if got from cache, + // except copy(we will assign the header and copy payload). + void reset(); private: void recycle_payload(); void recycle_shared_msg();