diff --git a/webrtc/modules/rtp_rtcp/source/rtp_header_extension.cc b/webrtc/modules/rtp_rtcp/source/rtp_header_extension.cc index 58b01bf410..64455ff3db 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_header_extension.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_header_extension.cc @@ -39,7 +39,14 @@ int32_t RtpHeaderExtensionMap::Register(const RTPExtensionType type, std::map::iterator it = extensionMap_.find(id); if (it != extensionMap_.end()) { - return -1; + if (it->second->type != type) { + // An extension is already registered with the same id + // but a different type, so return failure. + return -1; + } + // This extension type is already registered with this id, + // so return success. + return 0; } extensionMap_[id] = new HeaderExtension(type); return 0; @@ -52,9 +59,7 @@ int32_t RtpHeaderExtensionMap::Deregister(const RTPExtensionType type) { } std::map::iterator it = extensionMap_.find(id); - if (it == extensionMap_.end()) { - return -1; - } + assert(it != extensionMap_.end()); delete it->second; extensionMap_.erase(it); return 0; diff --git a/webrtc/modules/rtp_rtcp/source/rtp_header_extension_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_header_extension_unittest.cc index e4160c7c51..e47902e5c5 100644 --- a/webrtc/modules/rtp_rtcp/source/rtp_header_extension_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtp_header_extension_unittest.cc @@ -44,9 +44,16 @@ TEST_F(RtpHeaderExtensionTest, RegisterIllegalArg) { EXPECT_EQ(-1, map_.Register(kRtpExtensionTransmissionTimeOffset, 15)); } +TEST_F(RtpHeaderExtensionTest, Idempotent) { + EXPECT_EQ(0, map_.Register(kRtpExtensionTransmissionTimeOffset, kId)); + EXPECT_EQ(0, map_.Register(kRtpExtensionTransmissionTimeOffset, kId)); + EXPECT_EQ(0, map_.Deregister(kRtpExtensionTransmissionTimeOffset)); + EXPECT_EQ(0, map_.Deregister(kRtpExtensionTransmissionTimeOffset)); +} + TEST_F(RtpHeaderExtensionTest, NonUniqueId) { EXPECT_EQ(0, map_.Register(kRtpExtensionTransmissionTimeOffset, kId)); - EXPECT_EQ(-1, map_.Register(kRtpExtensionTransmissionTimeOffset, kId)); + EXPECT_EQ(-1, map_.Register(kRtpExtensionAudioLevel, kId)); } TEST_F(RtpHeaderExtensionTest, GetTotalLength) {