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)
|
||||
{
|
||||
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…
Add table
Add a link
Reference in a new issue