diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 8a4d4cc8d..3c80902ce 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1244,10 +1244,9 @@ srs_error_t SrsRtcSenderThread::packet_opus(SrsSample* sample, SrsRtcPackets& pa packet->rtp_header.set_ssrc(audio_ssrc); packet->rtp_header.set_payload_type(audio_payload_type); - SrsRtpRawPayload* raw = new SrsRtpRawPayload(); + SrsRtpRawPayload* raw = packet->reuse_raw(); raw->payload = sample->bytes; raw->nn_payload = sample->size; - packet->payload = raw; // TODO: FIXME: Why 960? Need Refactoring? audio_timestamp += 960; diff --git a/trunk/src/kernel/srs_kernel_rtp.cpp b/trunk/src/kernel/srs_kernel_rtp.cpp index 6f2918abb..c298b9a68 100644 --- a/trunk/src/kernel/srs_kernel_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtp.cpp @@ -146,11 +146,19 @@ SrsRtpPacket2::SrsRtpPacket2() { payload = NULL; padding = 0; + + cache_raw = new SrsRtpRawPayload(); } SrsRtpPacket2::~SrsRtpPacket2() { + // We may use the cache as payload. + if (payload == cache_raw) { + payload = NULL; + } + srs_freep(payload); + srs_freep(cache_raw); } void SrsRtpPacket2::set_padding(int size) @@ -163,9 +171,21 @@ void SrsRtpPacket2::reset() { rtp_header.reset(); padding = 0; + + // We may use the cache as payload. + if (payload == cache_raw) { + payload = NULL; + } + srs_freep(payload); } +SrsRtpRawPayload* SrsRtpPacket2::reuse_raw() +{ + payload = cache_raw; + return cache_raw; +} + int SrsRtpPacket2::nb_bytes() { return rtp_header.header_size() + (payload? payload->nb_bytes():0) + padding; diff --git a/trunk/src/kernel/srs_kernel_rtp.hpp b/trunk/src/kernel/srs_kernel_rtp.hpp index 57fdbd706..2212853eb 100644 --- a/trunk/src/kernel/srs_kernel_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtp.hpp @@ -38,6 +38,7 @@ const uint8_t kRtpMarker = 0x80; const uint8_t kNalTypeMask = 0x1F; class SrsBuffer; +class SrsRtpRawPayload; class SrsRtpHeader { @@ -82,6 +83,8 @@ public: SrsRtpHeader rtp_header; ISrsEncoder* payload; int padding; +private: + SrsRtpRawPayload* cache_raw; public: SrsRtpPacket2(); virtual ~SrsRtpPacket2(); @@ -90,6 +93,8 @@ public: void set_padding(int size); // Reset RTP packet. void reset(); + // Reuse the cached raw message as payload. + SrsRtpRawPayload* reuse_raw(); // interface ISrsEncoder public: virtual int nb_bytes();