1
0
Fork 0
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:
jinxue.cgh 2020-06-01 15:50:43 +08:00 committed by winlin
parent f83276c457
commit e2fcd89644
3 changed files with 26 additions and 17 deletions

View file

@ -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");
} }

View file

@ -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");
} }

View file

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