From 3bd56bb3a3bca297be51438b3a424acbb8948d81 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 16 Apr 2020 14:51:36 +0800 Subject: [PATCH] For #307, reuse fua cache payload for RTP --- trunk/src/app/srs_app_rtc_conn.cpp | 27 +++++++++++---------------- trunk/src/kernel/srs_kernel_rtp.cpp | 22 ++++++++++++++++++++-- trunk/src/kernel/srs_kernel_rtp.hpp | 6 ++++++ 3 files changed, 37 insertions(+), 18 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 3c80902ce..87f664590 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1182,10 +1182,12 @@ srs_error_t SrsRtcSenderThread::packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPac if (nn_bytes < kRtpMaxPayloadSize) { // Package NALUs in a single RTP packet. SrsRtpPacket2* packet = packets.fetch(); + packet->rtp_header.set_timestamp(msg->timestamp * 90); packet->rtp_header.set_sequence(video_sequence++); packet->rtp_header.set_ssrc(video_ssrc); packet->rtp_header.set_payload_type(video_payload_type); + packet->payload = raw; } else { SrsAutoFree(SrsRtpRawNALUs, raw); @@ -1202,12 +1204,6 @@ srs_error_t SrsRtcSenderThread::packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPac for (int i = 0; i < num_of_packet; ++i) { int packet_size = srs_min(nb_left, fu_payload_size); - SrsRtpFUAPayload* fua = new SrsRtpFUAPayload(); - if ((err = raw->read_samples(fua->nalus, packet_size)) != srs_success) { - srs_freep(fua); - return srs_error_wrap(err, "read samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes); - } - SrsRtpPacket2* packet = packets.fetch(); packet->rtp_header.set_timestamp(msg->timestamp * 90); @@ -1215,13 +1211,17 @@ srs_error_t SrsRtcSenderThread::packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPac packet->rtp_header.set_ssrc(video_ssrc); packet->rtp_header.set_payload_type(video_payload_type); - packet->payload = fua; + SrsRtpFUAPayload* fua = packet->reuse_fua(); fua->nri = (SrsAvcNaluType)header; fua->nalu_type = (SrsAvcNaluType)nal_type; fua->start = bool(i == 0); fua->end = bool(i == num_of_packet - 1); + if ((err = raw->read_samples(fua->nalus, packet_size)) != srs_success) { + return srs_error_wrap(err, "read samples %d bytes, left %d, total %d", packet_size, nb_left, nn_bytes); + } + nb_left -= packet_size; } } @@ -1274,8 +1274,7 @@ srs_error_t SrsRtcSenderThread::packet_fu_a(SrsSharedPtrMessage* msg, SrsSample* packet->rtp_header.set_ssrc(video_ssrc); packet->rtp_header.set_payload_type(video_payload_type); - SrsRtpFUAPayload* fua = new SrsRtpFUAPayload(); - packet->payload = fua; + SrsRtpFUAPayload* fua = packet->reuse_fua(); fua->nri = (SrsAvcNaluType)header; fua->nalu_type = (SrsAvcNaluType)nal_type; @@ -1305,13 +1304,9 @@ srs_error_t SrsRtcSenderThread::packet_single_nalu(SrsSharedPtrMessage* msg, Srs packet->rtp_header.set_ssrc(video_ssrc); packet->rtp_header.set_payload_type(video_payload_type); - SrsRtpRawNALUs* raw = new SrsRtpRawNALUs(); - packet->payload = raw; - - SrsSample* p = new SrsSample(); - p->bytes = sample->bytes; - p->size = sample->size; - raw->push_back(p); + SrsRtpRawPayload* raw = packet->reuse_raw(); + raw->payload = sample->bytes; + raw->nn_payload = sample->size; return err; } diff --git a/trunk/src/kernel/srs_kernel_rtp.cpp b/trunk/src/kernel/srs_kernel_rtp.cpp index c298b9a68..c6b071de8 100644 --- a/trunk/src/kernel/srs_kernel_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtp.cpp @@ -148,12 +148,13 @@ SrsRtpPacket2::SrsRtpPacket2() padding = 0; cache_raw = new SrsRtpRawPayload(); + cache_fua = new SrsRtpFUAPayload(); } SrsRtpPacket2::~SrsRtpPacket2() { // We may use the cache as payload. - if (payload == cache_raw) { + if (payload == cache_raw || payload == cache_fua) { payload = NULL; } @@ -173,7 +174,7 @@ void SrsRtpPacket2::reset() padding = 0; // We may use the cache as payload. - if (payload == cache_raw) { + if (payload == cache_raw || payload == cache_fua) { payload = NULL; } @@ -186,6 +187,13 @@ SrsRtpRawPayload* SrsRtpPacket2::reuse_raw() return cache_raw; } +SrsRtpFUAPayload* SrsRtpPacket2::reuse_fua() +{ + payload = cache_fua; + cache_fua->reset(); + return cache_fua; +} + int SrsRtpPacket2::nb_bytes() { return rtp_header.header_size() + (payload? payload->nb_bytes():0) + padding; @@ -421,6 +429,16 @@ SrsRtpFUAPayload::~SrsRtpFUAPayload() nalus.clear(); } +void SrsRtpFUAPayload::reset() +{ + vector::iterator it; + for (it = nalus.begin(); it != nalus.end(); ++it) { + SrsSample* p = *it; + srs_freep(p); + } + nalus.clear(); +} + int SrsRtpFUAPayload::nb_bytes() { int size = 2; diff --git a/trunk/src/kernel/srs_kernel_rtp.hpp b/trunk/src/kernel/srs_kernel_rtp.hpp index 2212853eb..f093f72bf 100644 --- a/trunk/src/kernel/srs_kernel_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtp.hpp @@ -39,6 +39,7 @@ const uint8_t kNalTypeMask = 0x1F; class SrsBuffer; class SrsRtpRawPayload; +class SrsRtpFUAPayload; class SrsRtpHeader { @@ -85,6 +86,7 @@ public: int padding; private: SrsRtpRawPayload* cache_raw; + SrsRtpFUAPayload* cache_fua; public: SrsRtpPacket2(); virtual ~SrsRtpPacket2(); @@ -95,6 +97,8 @@ public: void reset(); // Reuse the cached raw message as payload. SrsRtpRawPayload* reuse_raw(); + // Reuse the cached fua message as payload. + SrsRtpFUAPayload* reuse_fua(); // interface ISrsEncoder public: virtual int nb_bytes(); @@ -172,6 +176,8 @@ public: public: SrsRtpFUAPayload(); virtual ~SrsRtpFUAPayload(); +public: + void reset(); // interface ISrsEncoder public: virtual int nb_bytes();