From eb9a2634338c482b3f4fd18e8b523f53690a960d Mon Sep 17 00:00:00 2001 From: winlin Date: Sun, 28 Feb 2021 08:23:35 +0800 Subject: [PATCH] Cache RTP packet size, revert 9ee0ed919a --- trunk/src/kernel/srs_kernel_rtc_rtp.cpp | 18 ++++++++++++++++-- trunk/src/kernel/srs_kernel_rtc_rtp.hpp | 3 +++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 36822a43f..b633653f0 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -854,6 +854,7 @@ SrsRtpPacket2::SrsRtpPacket2() nalu_type = SrsAvcNaluTypeReserved; frame_type = SrsFrameTypeReserved; + cached_payload_size = 0; decode_handler = NULL; ++_srs_pps_objs_rtps->sugar; @@ -869,6 +870,7 @@ void SrsRtpPacket2::reset() { nalu_type = SrsAvcNaluTypeReserved; frame_type = SrsFrameTypeReserved; + cached_payload_size = 0; decode_handler = NULL; // It's important to reset the header. @@ -931,6 +933,8 @@ cleanup: bool SrsRtpPacket2::recycle() { + // Clear the cache size, it may change when reuse it. + cached_payload_size = 0; // Reset the handler, for decode only. decode_handler = NULL; @@ -1012,6 +1016,7 @@ SrsRtpPacket2* SrsRtpPacket2::copy() cp->shared_msg = shared_msg->copy2(); cp->frame_type = frame_type; + cp->cached_payload_size = cached_payload_size; // For performance issue, do not copy the unused field. //cp->decode_handler = decode_handler; @@ -1021,11 +1026,17 @@ SrsRtpPacket2* SrsRtpPacket2::copy() void SrsRtpPacket2::set_padding(int size) { header.set_padding(size); + if (cached_payload_size) { + cached_payload_size += size - header.get_padding(); + } } void SrsRtpPacket2::add_padding(int size) { header.set_padding(header.get_padding() + size); + if (cached_payload_size) { + cached_payload_size += size; + } } void SrsRtpPacket2::set_decode_handler(ISrsRtpPacketDecodeHandler* h) @@ -1045,8 +1056,11 @@ void SrsRtpPacket2::set_extension_types(SrsRtpExtensionTypes* v) uint64_t SrsRtpPacket2::nb_bytes() { - int nn_payload = (payload_? payload_->nb_bytes():0); - return header.nb_bytes() + nn_payload + header.get_padding(); + if (!cached_payload_size) { + int nn_payload = (payload_? payload_->nb_bytes():0); + cached_payload_size = header.nb_bytes() + nn_payload + header.get_padding(); + } + return cached_payload_size; } srs_error_t SrsRtpPacket2::encode(SrsBuffer* buf) diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index b7947fa8c..7227fb004 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -315,7 +315,10 @@ public: SrsAvcNaluType nalu_type; // The frame type, for RTMP bridger or SFU source. SrsFrameType frame_type; +// Fast cache for performance. private: + // The cached payload size for packet. + int cached_payload_size; // The helper handler for decoder, use RAW payload if NULL. ISrsRtpPacketDecodeHandler* decode_handler; public: