diff --git a/trunk/src/app/srs_app_rtc_conn.cpp b/trunk/src/app/srs_app_rtc_conn.cpp index 13578b788..4a047f672 100644 --- a/trunk/src/app/srs_app_rtc_conn.cpp +++ b/trunk/src/app/srs_app_rtc_conn.cpp @@ -1420,11 +1420,12 @@ srs_error_t SrsRtcPublisher::on_rtp(char* data, int nb_data) if (true) { pkt->set_decode_handler(this); + pkt->set_rtp_header_extensions(&extension_map_); pkt->shared_msg = new SrsSharedPtrMessage(); pkt->shared_msg->wrap(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"); } diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 0cd676bf0..9d2698ff7 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -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; uint16_t profile_id = 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 if (profile_id == 0xBEDE) { 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 len = (id_len & 0x0F); - SrsRtpExtensionType xtype = extension_map->get_type(id); + SrsRtpExtensionType xtype = extension_map_.get_type(id); if (xtype == kRtpExtensionTransportSequenceNumber) { // 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 @@ -176,7 +170,7 @@ srs_error_t SrsRtpHeader::parse_extension(SrsBuffer* buf, const SrsRtpHeaderExte 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; @@ -231,7 +225,7 @@ srs_error_t SrsRtpHeader::decode(SrsBuffer* buf, const SrsRtpHeaderExtensionMap* | 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"); } } @@ -298,6 +292,12 @@ srs_error_t SrsRtpHeader::encode(SrsBuffer* buf) 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) { @@ -449,6 +449,11 @@ SrsRtpPacket2* SrsRtpPacket2::copy() return cp; } +void SrsRtpPacket2::set_rtp_header_extensions(const SrsRtpHeaderExtensionMap* extmap) +{ + return header.set_extensions(extmap); +} + int SrsRtpPacket2::nb_bytes() { if (!cached_payload_size) { @@ -482,11 +487,11 @@ srs_error_t SrsRtpPacket2::encode(SrsBuffer* buf) 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; - if ((err = header.decode(buf, extmap)) != srs_success) { + if ((err = header.decode(buf)) != srs_success) { return srs_error_wrap(err, "rtp header"); } diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index ac04dc007..d57d445b1 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -140,14 +140,15 @@ private: uint32_t ssrc; uint32_t csrc[15]; uint16_t extension_length; + SrsRtpHeaderExtensionMap extension_map_; SrsRtpHeaderExtension header_extension; public: SrsRtpHeader(); virtual ~SrsRtpHeader(); private: - srs_error_t parse_extension(SrsBuffer* buf, const SrsRtpHeaderExtensionMap* extension_map); + srs_error_t parse_extension(SrsBuffer* buf); 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 int nb_bytes(); public: @@ -163,6 +164,7 @@ public: uint32_t get_ssrc() const; void set_padding(uint8_t v); uint8_t get_padding() const; + void set_extensions(const SrsRtpHeaderExtensionMap* extmap); srs_error_t get_twcc_sequence_number(uint16_t& twcc_sn); }; @@ -219,12 +221,13 @@ public: bool is_audio(); // Copy the RTP packet. SrsRtpPacket2* copy(); + // Set RTP header extensions for encoding or decoding header extension + void set_rtp_header_extensions(const SrsRtpHeaderExtensionMap* extmap); // interface ISrsEncoder public: virtual int nb_bytes(); virtual srs_error_t encode(SrsBuffer* buf); - // TODO: FIXME: Should follow interface ISrsEncoder. - virtual srs_error_t decode(SrsBuffer* buf, const SrsRtpHeaderExtensionMap* extmap = NULL); + virtual srs_error_t decode(SrsBuffer* buf); }; // Single payload data.