From 6ff048ed35ce45e14636893ee690198332695206 Mon Sep 17 00:00:00 2001 From: "jinxue.cgh" Date: Sat, 27 Jun 2020 14:37:35 +0800 Subject: [PATCH] RTC: process twcc before srtp unprotected --- trunk/src/app/srs_app_rtc_conn.cpp | 31 +++++++++++++++---------- trunk/src/kernel/srs_kernel_rtc_rtp.cpp | 8 ++++++- trunk/src/kernel/srs_kernel_rtc_rtp.hpp | 2 ++ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 00013499a..8f4a94bb4 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1196,6 +1196,25 @@ srs_error_t SrsRtcPublisher::on_rtp(char* data, int nb_data) return err; } + if (0 != twcc_ext_id_) { + SrsBuffer b0(data, nb_data); SrsRtpHeader h0; + h0.set_decode_only_header(true); + h0.set_extensions(&extension_types_); + if ((err = h0.decode(&b0)) != srs_success) { + return srs_error_wrap(err, "process twcc to decode rtp header"); + } + + uint16_t twcc_sn = 0; + if ((err = h0.get_twcc_sequence_number(twcc_sn)) == srs_success) { + if((err = on_twcc(twcc_sn)) != srs_success) { + return srs_error_wrap(err, "fail to process twcc packet"); + } + } else { + // TODO: FIXME: process no twcc seq number for audio ssrc + srs_error_reset(err); + } + } + // Decrypt the cipher to plaintext RTP data. int nb_unprotected_buf = nb_data; char* unprotected_buf = new char[kRtpPacketSize]; @@ -1232,18 +1251,6 @@ srs_error_t SrsRtcPublisher::on_rtp(char* data, int nb_data) if ((err = pkt->decode(&b)) != srs_success) { return srs_error_wrap(err, "decode rtp packet"); } - - if (0 != twcc_ext_id_) { - uint16_t twcc_sn = 0; - if ((err = pkt->header.get_twcc_sequence_number(twcc_sn)) == srs_success) { - if((err = on_twcc(twcc_sn))) { - return srs_error_wrap(err, "fail to process twcc packet"); - } - } else { - // TODO: FIXME: process no twcc seq number for audio ssrc - srs_error_reset(err); - } - } } // For source to consume packet. diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 840db3185..cdcd62e10 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -319,6 +319,7 @@ SrsRtpHeader::SrsRtpHeader() sequence = 0; timestamp = 0; ssrc = 0; + decode_only_header_ = false; } SrsRtpHeader::~SrsRtpHeader() @@ -376,7 +377,7 @@ srs_error_t SrsRtpHeader::decode(SrsBuffer* buf) } } - if (padding && !buf->empty()) { + if (padding && !buf->empty() && !decode_only_header_) { padding_length = *(reinterpret_cast(buf->data() + buf->size() - 1)); if (!buf->require(padding_length)) { return srs_error_new(ERROR_RTC_RTP_MUXER, "padding requires %d bytes", padding_length); @@ -448,6 +449,11 @@ void SrsRtpHeader::set_extensions(const SrsRtpExtensionTypes* extmap) } } +void SrsRtpHeader::set_decode_only_header(bool only_header) +{ + decode_only_header_ = only_header; +} + srs_error_t SrsRtpHeader::get_twcc_sequence_number(uint16_t& twcc_sn) { if (extensions_.exists()) { diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index 5d93e7193..163d6f7a8 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -175,6 +175,7 @@ private: uint32_t ssrc; uint32_t csrc[15]; SrsRtpExtensions extensions_; + bool decode_only_header_; public: SrsRtpHeader(); virtual ~SrsRtpHeader(); @@ -199,6 +200,7 @@ public: void set_padding(uint8_t v); uint8_t get_padding() const; void set_extensions(const SrsRtpExtensionTypes* extmap); + void set_decode_only_header(bool only_header); srs_error_t get_twcc_sequence_number(uint16_t& twcc_sn); srs_error_t set_twcc_sequence_number(uint8_t id, uint16_t sn); };