From cf52390cf277eff93f41f317735d2b3b3ebda31c Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 17 Apr 2020 18:04:52 +0800 Subject: [PATCH] Support fast padding --- trunk/src/app/srs_app_rtc.cpp | 4 ++++ trunk/src/app/srs_app_rtc_conn.cpp | 18 +++++++++++++++--- trunk/src/app/srs_app_rtc_conn.hpp | 3 +-- trunk/src/kernel/srs_kernel_flv.cpp | 1 + trunk/src/kernel/srs_kernel_flv.hpp | 7 +++++++ trunk/src/kernel/srs_kernel_rtp.cpp | 6 ++++++ trunk/src/kernel/srs_kernel_rtp.hpp | 4 +++- 7 files changed, 37 insertions(+), 6 deletions(-) diff --git a/trunk/src/app/srs_app_rtc.cpp b/trunk/src/app/srs_app_rtc.cpp index 7d2d44e82..95cfea597 100644 --- a/trunk/src/app/srs_app_rtc.cpp +++ b/trunk/src/app/srs_app_rtc.cpp @@ -195,15 +195,19 @@ srs_error_t SrsRtpOpusMuxer::transcode(SrsSharedPtrMessage* shared_audio, char* return err; } + int nn_max_extra_payload = 0; SrsSample samples[nn_opus_packets]; for (int i = 0; i < nn_opus_packets; i++) { SrsSample* p = samples + i; p->size = opus_sizes[i]; p->bytes = new char[p->size]; memcpy(p->bytes, opus_payloads[i], p->size); + + nn_max_extra_payload = srs_max(nn_max_extra_payload, p->size); } shared_audio->set_extra_payloads(samples, nn_opus_packets); + shared_audio->set_max_extra_payload(nn_max_extra_payload); return err; } diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 0b5ce34ae..24c19663c 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -830,7 +830,7 @@ srs_error_t SrsRtcSenderThread::messages_to_packets( for (int i = 0; i < nn_extra_payloads; i++) { SrsSample* sample = msg->extra_payloads() + i; - if ((err = packet_opus(sample, packets)) != srs_success) { + if ((err = packet_opus(sample, packets, msg->nn_max_extra_payloads())) != srs_success) { return srs_error_wrap(err, "opus package"); } } @@ -1003,7 +1003,7 @@ srs_error_t SrsRtcSenderThread::send_packets_gso(SrsRtcPackets& packets) srs_trace("#%d, Padding %d bytes %d=>%d, packets %d, max_padding %d", packets.debug_id, padding, nn_packet, nn_packet + padding, nn_packets, max_padding); #endif - packet->set_padding(padding); + packet->add_padding(padding); nn_packet += padding; packets.nn_paddings++; packets.nn_padding_bytes += padding; @@ -1232,7 +1232,7 @@ srs_error_t SrsRtcSenderThread::packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPac return err; } -srs_error_t SrsRtcSenderThread::packet_opus(SrsSample* sample, SrsRtcPackets& packets) +srs_error_t SrsRtcSenderThread::packet_opus(SrsSample* sample, SrsRtcPackets& packets, int nn_max_payload) { srs_error_t err = srs_success; @@ -1247,6 +1247,18 @@ srs_error_t SrsRtcSenderThread::packet_opus(SrsSample* sample, SrsRtcPackets& pa raw->payload = sample->bytes; raw->nn_payload = sample->size; + if (max_padding > 0) { + if (sample->size < nn_max_payload && nn_max_payload - sample->size < max_padding) { + int padding = nn_max_payload - sample->size; + packet->set_padding(padding); + +#if defined(SRS_DEBUG) + srs_trace("#%d, Fast Padding %d bytes %d=>%d, SN=%d, max_payload %d, max_padding %d", packets.debug_id, + padding, sample->size, sample->size + padding, packet->rtp_header.get_sequence(), nn_max_payload, max_padding); +#endif + } + } + // TODO: FIXME: Why 960? Need Refactoring? audio_timestamp += 960; diff --git a/trunk/src/app/srs_app_rtc_conn.hpp b/trunk/src/app/srs_app_rtc_conn.hpp index 40c341fdf..a563a4e2a 100644 --- a/trunk/src/app/srs_app_rtc_conn.hpp +++ b/trunk/src/app/srs_app_rtc_conn.hpp @@ -193,7 +193,6 @@ private: bool merge_nalus; bool gso; int max_padding; - public: SrsRtcSenderThread(SrsRtcSession* s, SrsUdpMuxSocket* u, int parent_cid); virtual ~SrsRtcSenderThread(); @@ -218,7 +217,7 @@ private: srs_error_t send_packets(SrsRtcPackets& packets); srs_error_t send_packets_gso(SrsRtcPackets& packets); private: - srs_error_t packet_opus(SrsSample* sample, SrsRtcPackets& packets); + srs_error_t packet_opus(SrsSample* sample, SrsRtcPackets& packets, int nn_max_payload); private: srs_error_t packet_fu_a(SrsSharedPtrMessage* msg, SrsSample* sample, int fu_payload_size, SrsRtcPackets& packets); srs_error_t packet_nalus(SrsSharedPtrMessage* msg, SrsRtcPackets& packets); diff --git a/trunk/src/kernel/srs_kernel_flv.cpp b/trunk/src/kernel/srs_kernel_flv.cpp index b05b3adbf..eead02374 100644 --- a/trunk/src/kernel/srs_kernel_flv.cpp +++ b/trunk/src/kernel/srs_kernel_flv.cpp @@ -218,6 +218,7 @@ SrsSharedPtrMessage::SrsSharedPtrPayload::SrsSharedPtrPayload() extra_payloads = NULL; nn_extra_payloads = 0; + nn_max_extra_payloads = 0; #endif } diff --git a/trunk/src/kernel/srs_kernel_flv.hpp b/trunk/src/kernel/srs_kernel_flv.hpp index 84d7d34d9..8cfda3557 100644 --- a/trunk/src/kernel/srs_kernel_flv.hpp +++ b/trunk/src/kernel/srs_kernel_flv.hpp @@ -310,10 +310,14 @@ private: int nn_samples; // For RTC video, whether NALUs has IDR. bool has_idr; + public: // For RTC audio, we may need to transcode AAC to opus, // so there must be an extra payloads, which is transformed from payload. SrsSample* extra_payloads; int nn_extra_payloads; + // The max size payload in extras. + // @remark For GSO to fast guess the best padding. + int nn_max_extra_payloads; #endif public: SrsSharedPtrPayload(); @@ -363,6 +367,9 @@ public: void set_extra_payloads(SrsSample* payloads, int nn_payloads); int nn_extra_payloads() { return ptr->nn_extra_payloads; } SrsSample* extra_payloads() { return ptr->extra_payloads; } + // The max extra payload size. + void set_max_extra_payload(int v) { ptr->nn_max_extra_payloads = v; } + int nn_max_extra_payloads() { return ptr->nn_max_extra_payloads; } // Whether samples has idr. bool has_idr() { return ptr->has_idr; } void set_has_idr(bool v) { ptr->has_idr = v; } diff --git a/trunk/src/kernel/srs_kernel_rtp.cpp b/trunk/src/kernel/srs_kernel_rtp.cpp index 3798fe987..b9659174e 100644 --- a/trunk/src/kernel/srs_kernel_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtp.cpp @@ -199,6 +199,12 @@ void SrsRtpPacket2::set_padding(int size) padding = size; } +void SrsRtpPacket2::add_padding(int size) +{ + rtp_header.set_padding(padding + size > 0); + padding += size; +} + void SrsRtpPacket2::reset() { rtp_header.reset(); diff --git a/trunk/src/kernel/srs_kernel_rtp.hpp b/trunk/src/kernel/srs_kernel_rtp.hpp index 615194a3d..973de2205 100644 --- a/trunk/src/kernel/srs_kernel_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtp.hpp @@ -91,8 +91,10 @@ public: SrsRtpPacket2(); virtual ~SrsRtpPacket2(); public: - // Append size of bytes as padding. + // Set the padding of RTP packet. void set_padding(int size); + // Increase the padding of RTP packet. + void add_padding(int size); // Reset RTP packet. void reset(); // Reuse the cached raw message as payload.