RTC: Fix RTCP app bug. Add is_rtcp_app API.

pull/1895/head^2
winlin 5 years ago
parent e2bf5eaf47
commit 2f1e77aeaf

@ -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_));

@ -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;

Loading…
Cancel
Save