mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
rtc: refine set extension map for rtp_header
This commit is contained in:
parent
f83276c457
commit
e2fcd89644
3 changed files with 26 additions and 17 deletions
|
@ -1420,11 +1420,12 @@ srs_error_t SrsRtcPublisher::on_rtp(char* data, int nb_data)
|
||||||
|
|
||||||
if (true) {
|
if (true) {
|
||||||
pkt->set_decode_handler(this);
|
pkt->set_decode_handler(this);
|
||||||
|
pkt->set_rtp_header_extensions(&extension_map_);
|
||||||
pkt->shared_msg = new SrsSharedPtrMessage();
|
pkt->shared_msg = new SrsSharedPtrMessage();
|
||||||
pkt->shared_msg->wrap(buf, nb_buf);
|
pkt->shared_msg->wrap(buf, nb_buf);
|
||||||
|
|
||||||
SrsBuffer b(buf, nb_buf);
|
SrsBuffer b(buf, nb_buf);
|
||||||
if ((err = pkt->decode(&b, &extension_map_)) != srs_success) {
|
if ((err = pkt->decode(&b)) != srs_success) {
|
||||||
return srs_error_wrap(err, "decode rtp packet");
|
return srs_error_wrap(err, "decode rtp packet");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -119,17 +119,11 @@ SrsRtpHeader::~SrsRtpHeader()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtpHeader::parse_extension(SrsBuffer* buf, const SrsRtpHeaderExtensionMap *extension_map)
|
srs_error_t SrsRtpHeader::parse_extension(SrsBuffer* buf) {
|
||||||
{
|
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
uint16_t profile_id = buf->read_2bytes();
|
uint16_t profile_id = buf->read_2bytes();
|
||||||
extension_length = buf->read_2bytes();
|
extension_length = buf->read_2bytes();
|
||||||
|
|
||||||
if (!extension_map) {
|
|
||||||
buf->skip(extension_length * 4);
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
// @see: https://tools.ietf.org/html/rfc5285#section-4.2
|
// @see: https://tools.ietf.org/html/rfc5285#section-4.2
|
||||||
if (profile_id == 0xBEDE) {
|
if (profile_id == 0xBEDE) {
|
||||||
uint32_t xlen = extension_length * 4;
|
uint32_t xlen = extension_length * 4;
|
||||||
|
@ -151,7 +145,7 @@ srs_error_t SrsRtpHeader::parse_extension(SrsBuffer* buf, const SrsRtpHeaderExte
|
||||||
uint8_t id = (id_len & 0xF0) >> 4;
|
uint8_t id = (id_len & 0xF0) >> 4;
|
||||||
uint8_t len = (id_len & 0x0F);
|
uint8_t len = (id_len & 0x0F);
|
||||||
|
|
||||||
SrsRtpExtensionType xtype = extension_map->get_type(id);
|
SrsRtpExtensionType xtype = extension_map_.get_type(id);
|
||||||
if (xtype == kRtpExtensionTransportSequenceNumber) {
|
if (xtype == kRtpExtensionTransportSequenceNumber) {
|
||||||
// 0 1 2
|
// 0 1 2
|
||||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
|
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
|
||||||
|
@ -176,7 +170,7 @@ srs_error_t SrsRtpHeader::parse_extension(SrsBuffer* buf, const SrsRtpHeaderExte
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtpHeader::decode(SrsBuffer* buf, const SrsRtpHeaderExtensionMap* extmap)
|
srs_error_t SrsRtpHeader::decode(SrsBuffer* buf)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
|
@ -231,7 +225,7 @@ srs_error_t SrsRtpHeader::decode(SrsBuffer* buf, const SrsRtpHeaderExtensionMap*
|
||||||
| header extension |
|
| header extension |
|
||||||
| .... |
|
| .... |
|
||||||
*/
|
*/
|
||||||
if ((err = parse_extension(buf, extmap)) != srs_success) {
|
if ((err = parse_extension(buf)) != srs_success) {
|
||||||
return srs_error_wrap(err, "fail to parse extension");
|
return srs_error_wrap(err, "fail to parse extension");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -298,6 +292,12 @@ srs_error_t SrsRtpHeader::encode(SrsBuffer* buf)
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
void SrsRtpHeader::set_extensions(const SrsRtpHeaderExtensionMap* extmap)
|
||||||
|
{
|
||||||
|
if (extmap) {
|
||||||
|
extension_map_ = *extmap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtpHeader::get_twcc_sequence_number(uint16_t& twcc_sn)
|
srs_error_t SrsRtpHeader::get_twcc_sequence_number(uint16_t& twcc_sn)
|
||||||
{
|
{
|
||||||
|
@ -449,6 +449,11 @@ SrsRtpPacket2* SrsRtpPacket2::copy()
|
||||||
return cp;
|
return cp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SrsRtpPacket2::set_rtp_header_extensions(const SrsRtpHeaderExtensionMap* extmap)
|
||||||
|
{
|
||||||
|
return header.set_extensions(extmap);
|
||||||
|
}
|
||||||
|
|
||||||
int SrsRtpPacket2::nb_bytes()
|
int SrsRtpPacket2::nb_bytes()
|
||||||
{
|
{
|
||||||
if (!cached_payload_size) {
|
if (!cached_payload_size) {
|
||||||
|
@ -482,11 +487,11 @@ srs_error_t SrsRtpPacket2::encode(SrsBuffer* buf)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
srs_error_t SrsRtpPacket2::decode(SrsBuffer* buf, const SrsRtpHeaderExtensionMap* extmap)
|
srs_error_t SrsRtpPacket2::decode(SrsBuffer* buf)
|
||||||
{
|
{
|
||||||
srs_error_t err = srs_success;
|
srs_error_t err = srs_success;
|
||||||
|
|
||||||
if ((err = header.decode(buf, extmap)) != srs_success) {
|
if ((err = header.decode(buf)) != srs_success) {
|
||||||
return srs_error_wrap(err, "rtp header");
|
return srs_error_wrap(err, "rtp header");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -140,14 +140,15 @@ private:
|
||||||
uint32_t ssrc;
|
uint32_t ssrc;
|
||||||
uint32_t csrc[15];
|
uint32_t csrc[15];
|
||||||
uint16_t extension_length;
|
uint16_t extension_length;
|
||||||
|
SrsRtpHeaderExtensionMap extension_map_;
|
||||||
SrsRtpHeaderExtension header_extension;
|
SrsRtpHeaderExtension header_extension;
|
||||||
public:
|
public:
|
||||||
SrsRtpHeader();
|
SrsRtpHeader();
|
||||||
virtual ~SrsRtpHeader();
|
virtual ~SrsRtpHeader();
|
||||||
private:
|
private:
|
||||||
srs_error_t parse_extension(SrsBuffer* buf, const SrsRtpHeaderExtensionMap* extension_map);
|
srs_error_t parse_extension(SrsBuffer* buf);
|
||||||
public:
|
public:
|
||||||
virtual srs_error_t decode(SrsBuffer* buf, const SrsRtpHeaderExtensionMap* extmap = NULL);
|
virtual srs_error_t decode(SrsBuffer* buf);
|
||||||
virtual srs_error_t encode(SrsBuffer* buf);
|
virtual srs_error_t encode(SrsBuffer* buf);
|
||||||
virtual int nb_bytes();
|
virtual int nb_bytes();
|
||||||
public:
|
public:
|
||||||
|
@ -163,6 +164,7 @@ public:
|
||||||
uint32_t get_ssrc() const;
|
uint32_t get_ssrc() const;
|
||||||
void set_padding(uint8_t v);
|
void set_padding(uint8_t v);
|
||||||
uint8_t get_padding() const;
|
uint8_t get_padding() const;
|
||||||
|
void set_extensions(const SrsRtpHeaderExtensionMap* extmap);
|
||||||
srs_error_t get_twcc_sequence_number(uint16_t& twcc_sn);
|
srs_error_t get_twcc_sequence_number(uint16_t& twcc_sn);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -219,12 +221,13 @@ public:
|
||||||
bool is_audio();
|
bool is_audio();
|
||||||
// Copy the RTP packet.
|
// Copy the RTP packet.
|
||||||
SrsRtpPacket2* copy();
|
SrsRtpPacket2* copy();
|
||||||
|
// Set RTP header extensions for encoding or decoding header extension
|
||||||
|
void set_rtp_header_extensions(const SrsRtpHeaderExtensionMap* extmap);
|
||||||
// interface ISrsEncoder
|
// interface ISrsEncoder
|
||||||
public:
|
public:
|
||||||
virtual int nb_bytes();
|
virtual int nb_bytes();
|
||||||
virtual srs_error_t encode(SrsBuffer* buf);
|
virtual srs_error_t encode(SrsBuffer* buf);
|
||||||
// TODO: FIXME: Should follow interface ISrsEncoder.
|
virtual srs_error_t decode(SrsBuffer* buf);
|
||||||
virtual srs_error_t decode(SrsBuffer* buf, const SrsRtpHeaderExtensionMap* extmap = NULL);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Single payload data.
|
// Single payload data.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue