From 2f1e77aeafec89a8a1cab6ef452bd37fcd462cd2 Mon Sep 17 00:00:00 2001 From: winlin Date: Thu, 6 Aug 2020 17:18:45 +0800 Subject: [PATCH] RTC: Fix RTCP app bug. Add is_rtcp_app API. --- trunk/src/kernel/srs_kernel_rtc_rtcp.cpp | 30 +++++++++++++++++++++++- trunk/src/kernel/srs_kernel_rtc_rtcp.hpp | 6 ++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp index ef51e4ff3..4984a4c3a 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtcp.cpp @@ -84,12 +84,32 @@ srs_error_t SrsRtcpCommon::encode(SrsBuffer *buffer) SrsRtcpApp::SrsRtcpApp():ssrc_(0) { + header_.padding = 0; + header_.type = SrsRtcpType_app; + header_.rc = 0; + header_.version = kRtcpVersion; } SrsRtcpApp::~SrsRtcpApp() { } +bool SrsRtcpApp::is_rtcp_app(uint8_t *data, int nb_data) +{ + if (!data || nb_data <12) { + return false; + } + + SrsRtcpHeader *header = (SrsRtcpHeader*)data; + if (header->version == kRtcpVersion + && header->type == SrsRtcpType_app + && ntohs(header->length) >= 2) { + return true; + } + + return false; +} + uint8_t SrsRtcpApp::type() const { return SrsRtcpType_app; @@ -147,8 +167,12 @@ srs_error_t SrsRtcpApp::set_payload(uint8_t* payload, int len) return srs_error_new(ERROR_RTC_RTCP, "invalid payload length %d", len); } - payload_len_ = len; + payload_len_ = (len + 3)/ 4 * 4;; memcpy(payload_, payload, len); + if (payload_len_ > len) { + memset(&payload_[len], 0, payload_len_ - len); //padding + } + header_.length = payload_len_/4 + 3 - 1; return srs_success; } @@ -166,6 +190,10 @@ srs_error_t SrsRtcpApp::decode(SrsBuffer *buffer) return srs_error_wrap(err, "decode header"); } + if (header_.type != SrsRtcpType_app || !buffer->require(8)) { + return srs_error_new(ERROR_RTC_RTCP, "not rtcp app"); + } + ssrc_ = buffer->read_4bytes(); buffer->read_bytes((char *)name_, sizeof(name_)); diff --git a/trunk/src/kernel/srs_kernel_rtc_rtcp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtcp.hpp index de311305b..fb00832d4 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtcp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtcp.hpp @@ -51,6 +51,7 @@ enum SrsRtcpType }; // RTCP Header, @see http://tools.ietf.org/html/rfc3550#section-6.1 +// @remark The header must be 4 bytes, which align with the max field size 2B. struct SrsRtcpHeader { uint16_t rc:5; @@ -84,15 +85,14 @@ public: class SrsRtcpApp : public SrsRtcpCommon { private: - SrsRtcpHeader header_; uint32_t ssrc_; uint8_t name_[4]; - uint8_t payload_[kRtcpPacketSize]; - int payload_len_; public: SrsRtcpApp(); virtual ~SrsRtcpApp(); + static bool is_rtcp_app(uint8_t *data, int nb_data); + virtual uint8_t type() const; uint32_t get_ssrc() const;