mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
RTC: Fix RTCP app bug. Add is_rtcp_app API.
This commit is contained in:
parent
e2bf5eaf47
commit
2f1e77aeaf
2 changed files with 32 additions and 4 deletions
|
@ -84,12 +84,32 @@ srs_error_t SrsRtcpCommon::encode(SrsBuffer *buffer)
|
||||||
|
|
||||||
SrsRtcpApp::SrsRtcpApp():ssrc_(0)
|
SrsRtcpApp::SrsRtcpApp():ssrc_(0)
|
||||||
{
|
{
|
||||||
|
header_.padding = 0;
|
||||||
|
header_.type = SrsRtcpType_app;
|
||||||
|
header_.rc = 0;
|
||||||
|
header_.version = kRtcpVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
SrsRtcpApp::~SrsRtcpApp()
|
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
|
uint8_t SrsRtcpApp::type() const
|
||||||
{
|
{
|
||||||
return SrsRtcpType_app;
|
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);
|
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);
|
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;
|
return srs_success;
|
||||||
}
|
}
|
||||||
|
@ -166,6 +190,10 @@ srs_error_t SrsRtcpApp::decode(SrsBuffer *buffer)
|
||||||
return srs_error_wrap(err, "decode header");
|
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();
|
ssrc_ = buffer->read_4bytes();
|
||||||
buffer->read_bytes((char *)name_, sizeof(name_));
|
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
|
// 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
|
struct SrsRtcpHeader
|
||||||
{
|
{
|
||||||
uint16_t rc:5;
|
uint16_t rc:5;
|
||||||
|
@ -84,15 +85,14 @@ public:
|
||||||
class SrsRtcpApp : public SrsRtcpCommon
|
class SrsRtcpApp : public SrsRtcpCommon
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
SrsRtcpHeader header_;
|
|
||||||
uint32_t ssrc_;
|
uint32_t ssrc_;
|
||||||
uint8_t name_[4];
|
uint8_t name_[4];
|
||||||
uint8_t payload_[kRtcpPacketSize];
|
|
||||||
int payload_len_;
|
|
||||||
public:
|
public:
|
||||||
SrsRtcpApp();
|
SrsRtcpApp();
|
||||||
virtual ~SrsRtcpApp();
|
virtual ~SrsRtcpApp();
|
||||||
|
|
||||||
|
static bool is_rtcp_app(uint8_t *data, int nb_data);
|
||||||
|
|
||||||
virtual uint8_t type() const;
|
virtual uint8_t type() const;
|
||||||
|
|
||||||
uint32_t get_ssrc() const;
|
uint32_t get_ssrc() const;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue