diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp index 072d9bfd4..17f2bf7b3 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.cpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.cpp @@ -165,18 +165,13 @@ int32_t srs_seq_distance(uint16_t value, uint16_t pre_value) SrsRtpExtensionTypes::SrsRtpExtensionTypes() { - reset(); + memset(ids_, kRtpExtensionNone, sizeof(ids_)); } SrsRtpExtensionTypes::~SrsRtpExtensionTypes() { } -void SrsRtpExtensionTypes::reset() -{ - memset(ids_, kRtpExtensionNone, sizeof(ids_)); -} - bool SrsRtpExtensionTypes::register_by_uri(int id, std::string uri) { for (int i = 0; i < (int)(sizeof(kExtensions)/sizeof(kExtensions[0])); ++i) { @@ -377,13 +372,10 @@ SrsRtpExtensions::~SrsRtpExtensions() void SrsRtpExtensions::reset() { - if (has_ext_) { - types_.reset(); - twcc_.reset(); - audio_level_.reset(); - } - has_ext_ = false; + types_ = NULL; + twcc_.reset(); + audio_level_.reset(); } srs_error_t SrsRtpExtensions::decode(SrsBuffer* buf) @@ -445,7 +437,7 @@ srs_error_t SrsRtpExtensions::decode_0xbede(SrsBuffer* buf) uint8_t id = (v & 0xF0) >> 4; uint8_t len = (v & 0x0F); - SrsRtpExtensionType xtype = types_.get_type(id); + SrsRtpExtensionType xtype = types_? types_->get_type(id) : kRtpExtensionNone; if (xtype == kRtpExtensionTransportSequenceNumber) { if ((err = twcc_.decode(buf)) != srs_success) { return srs_error_wrap(err, "decode twcc extension"); @@ -522,11 +514,9 @@ bool SrsRtpExtensions::exists() return has_ext_; } -void SrsRtpExtensions::set_types_(const SrsRtpExtensionTypes* types) +void SrsRtpExtensions::set_types_(SrsRtpExtensionTypes* types) { - if(types) { - types_ = *types; - } + types_ = types; } srs_error_t SrsRtpExtensions::get_twcc_sequence_number(uint16_t& twcc_sn) @@ -703,7 +693,7 @@ srs_error_t SrsRtpHeader::encode(SrsBuffer* buf) return err; } -void SrsRtpHeader::set_extensions(const SrsRtpExtensionTypes* extmap) +void SrsRtpHeader::set_extensions(SrsRtpExtensionTypes* extmap) { if (extmap) { extensions_.set_types_(extmap); @@ -992,7 +982,7 @@ bool SrsRtpPacket2::is_audio() return frame_type == SrsFrameTypeAudio; } -void SrsRtpPacket2::set_extension_types(const SrsRtpExtensionTypes* v) +void SrsRtpPacket2::set_extension_types(SrsRtpExtensionTypes* v) { return header.set_extensions(v); } diff --git a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp index e3fb55eb6..34baa77e2 100644 --- a/trunk/src/kernel/srs_kernel_rtc_rtp.hpp +++ b/trunk/src/kernel/srs_kernel_rtc_rtp.hpp @@ -122,9 +122,6 @@ public: public: SrsRtpExtensionTypes(); virtual ~SrsRtpExtensionTypes(); -public: - // Reset the object to reuse it. - void reset(); private: bool register_id(int id, SrsRtpExtensionType type, std::string uri); private: @@ -187,7 +184,11 @@ class SrsRtpExtensions// : public ISrsCodec { private: bool has_ext_; - SrsRtpExtensionTypes types_; +private: + // The extension types is used to decode the packet, which is reference to + // the types in publish stream. + SrsRtpExtensionTypes* types_; +private: SrsRtpExtensionTwcc twcc_; SrsRtpExtensionOneByte audio_level_; public: @@ -198,7 +199,7 @@ public: void reset(); public: bool exists(); - void set_types_(const SrsRtpExtensionTypes* types); + void set_types_(SrsRtpExtensionTypes* types); srs_error_t get_twcc_sequence_number(uint16_t& twcc_sn); srs_error_t set_twcc_sequence_number(uint8_t id, uint16_t sn); srs_error_t get_audio_level(uint8_t& level); @@ -256,7 +257,7 @@ public: } void set_padding(uint8_t v); uint8_t get_padding() const; - void set_extensions(const SrsRtpExtensionTypes* extmap); + void set_extensions(SrsRtpExtensionTypes* extmap); void ignore_padding(bool v); srs_error_t get_twcc_sequence_number(uint16_t& twcc_sn); srs_error_t set_twcc_sequence_number(uint8_t id, uint16_t sn); @@ -346,7 +347,7 @@ public: // Whether the packet is Audio packet. bool is_audio(); // Set RTP header extensions for encoding or decoding header extension - void set_extension_types(const SrsRtpExtensionTypes* v); + void set_extension_types(SrsRtpExtensionTypes* v); // interface ISrsEncoder public: virtual uint64_t nb_bytes();