From 8a5ac16fbf47afd7f9652914d07bc3c5c57c8d96 Mon Sep 17 00:00:00 2001 From: Tomas Gunnarsson Date: Mon, 3 Jan 2022 14:16:46 +0000 Subject: [PATCH] Add ctor to RtpDemuxerCriteria to allow supplying 'mid' and 'rsid'. Add TODO for accessing `previous_demuxer_criteria_`, currently accessed from two threads (unsafe). Changed RtpDemuxerCriteria to be a class, all members private with accessor methods instead of direct variable access. Moving forward this can allow for things like checking for thread/sequence and state consistency. Bug: webrtc:12517, webrtc:11993 Change-Id: I21c1b3067e988494ce6f4c6c85c62165801883bf Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/244083 Reviewed-by: Harald Alvestrand Commit-Queue: Tomas Gunnarsson Cr-Commit-Position: refs/heads/main@{#35616} --- call/rtp_demuxer.cc | 93 ++++++++++++----------- call/rtp_demuxer.h | 36 ++++++--- call/rtp_demuxer_unittest.cc | 88 ++++++++++----------- pc/channel.cc | 32 ++++---- pc/dtls_srtp_transport_unittest.cc | 2 +- pc/rtp_transport_unittest.cc | 4 +- pc/srtp_transport_unittest.cc | 2 +- test/peer_scenario/scenario_connection.cc | 7 +- 8 files changed, 142 insertions(+), 122 deletions(-) diff --git a/call/rtp_demuxer.cc b/call/rtp_demuxer.cc index c839e9f5d8..3924f84df4 100644 --- a/call/rtp_demuxer.cc +++ b/call/rtp_demuxer.cc @@ -39,20 +39,32 @@ size_t RemoveFromMapByValue(Map* map, const Value& value) { return EraseIf(*map, [&](const auto& elem) { return elem.second == value; }); } +// Temp fix: MID in SDP is allowed to be slightly longer than what's allowed +// in the RTP demuxer. Truncate if needed; this won't match, but it only +// makes sense in places that wouldn't use this for matching anyway. +// TODO(bugs.webrtc.org/12517): remove when length 16 is policed by parser. +std::string CheckMidLength(absl::string_view mid) { + std::string new_mid(mid); + if (new_mid.length() > BaseRtpStringExtension::kMaxValueSizeBytes) { + RTC_LOG(LS_WARNING) << "`mid` attribute too long. Truncating."; + new_mid.resize(BaseRtpStringExtension::kMaxValueSizeBytes); + } + return new_mid; +} + } // namespace RtpDemuxerCriteria::RtpDemuxerCriteria( absl::string_view mid, absl::string_view rsid /*= absl::string_view()*/) - : mid(mid), rsid(rsid) {} + : mid_(CheckMidLength(mid)), rsid_(rsid) {} RtpDemuxerCriteria::RtpDemuxerCriteria() = default; RtpDemuxerCriteria::~RtpDemuxerCriteria() = default; bool RtpDemuxerCriteria::operator==(const RtpDemuxerCriteria& other) const { - return this->mid == other.mid && this->rsid == other.rsid && - this->ssrcs == other.ssrcs && - this->payload_types == other.payload_types; + return mid_ == other.mid_ && rsid_ == other.rsid_ && ssrcs_ == other.ssrcs_ && + payload_types_ == other.payload_types_; } bool RtpDemuxerCriteria::operator!=(const RtpDemuxerCriteria& other) const { @@ -61,16 +73,16 @@ bool RtpDemuxerCriteria::operator!=(const RtpDemuxerCriteria& other) const { std::string RtpDemuxerCriteria::ToString() const { rtc::StringBuilder sb; - sb << "{mid: " << (mid.empty() ? "" : mid) - << ", rsid: " << (rsid.empty() ? "" : rsid) << ", ssrcs: ["; + sb << "{mid: " << (mid_.empty() ? "" : mid_) + << ", rsid: " << (rsid_.empty() ? "" : rsid_) << ", ssrcs: ["; - for (auto ssrc : ssrcs) { + for (auto ssrc : ssrcs_) { sb << ssrc << ", "; } sb << "], payload_types = ["; - for (auto pt : payload_types) { + for (auto pt : payload_types_) { sb << pt << ", "; } @@ -109,60 +121,60 @@ RtpDemuxer::~RtpDemuxer() { bool RtpDemuxer::AddSink(const RtpDemuxerCriteria& criteria, RtpPacketSinkInterface* sink) { - RTC_DCHECK(!criteria.payload_types.empty() || !criteria.ssrcs.empty() || - !criteria.mid.empty() || !criteria.rsid.empty()); - RTC_DCHECK(criteria.mid.empty() || IsLegalMidName(criteria.mid)); - RTC_DCHECK(criteria.rsid.empty() || IsLegalRsidName(criteria.rsid)); + RTC_DCHECK(!criteria.payload_types().empty() || !criteria.ssrcs().empty() || + !criteria.mid().empty() || !criteria.rsid().empty()); + RTC_DCHECK(criteria.mid().empty() || IsLegalMidName(criteria.mid())); + RTC_DCHECK(criteria.rsid().empty() || IsLegalRsidName(criteria.rsid())); RTC_DCHECK(sink); // We return false instead of DCHECKing for logical conflicts with the new // criteria because new sinks are created according to user-specified SDP and // we do not want to crash due to a data validation error. if (CriteriaWouldConflict(criteria)) { - RTC_LOG(LS_ERROR) << "Unable to add sink = " << sink - << " due conflicting criteria " << criteria.ToString(); + RTC_LOG(LS_ERROR) << "Unable to add sink=" << sink + << " due to conflicting criteria " << criteria.ToString(); return false; } - if (!criteria.mid.empty()) { - if (criteria.rsid.empty()) { - sink_by_mid_.emplace(criteria.mid, sink); + if (!criteria.mid().empty()) { + if (criteria.rsid().empty()) { + sink_by_mid_.emplace(criteria.mid(), sink); } else { - sink_by_mid_and_rsid_.emplace(std::make_pair(criteria.mid, criteria.rsid), - sink); + sink_by_mid_and_rsid_.emplace( + std::make_pair(criteria.mid(), criteria.rsid()), sink); } } else { - if (!criteria.rsid.empty()) { - sink_by_rsid_.emplace(criteria.rsid, sink); + if (!criteria.rsid().empty()) { + sink_by_rsid_.emplace(criteria.rsid(), sink); } } - for (uint32_t ssrc : criteria.ssrcs) { + for (uint32_t ssrc : criteria.ssrcs()) { sink_by_ssrc_.emplace(ssrc, sink); } - for (uint8_t payload_type : criteria.payload_types) { + for (uint8_t payload_type : criteria.payload_types()) { sinks_by_pt_.emplace(payload_type, sink); } RefreshKnownMids(); - RTC_LOG(LS_INFO) << "Added sink = " << sink << " for criteria " - << criteria.ToString(); + RTC_DLOG(LS_INFO) << "Added sink = " << sink << " for criteria " + << criteria.ToString(); return true; } bool RtpDemuxer::CriteriaWouldConflict( const RtpDemuxerCriteria& criteria) const { - if (!criteria.mid.empty()) { - if (criteria.rsid.empty()) { + if (!criteria.mid().empty()) { + if (criteria.rsid().empty()) { // If the MID is in the known_mids_ set, then there is already a sink // added for this MID directly, or there is a sink already added with a // MID, RSID pair for our MID and some RSID. // Adding this criteria would cause one of these rules to be shadowed, so // reject this new criteria. - if (known_mids_.find(criteria.mid) != known_mids_.end()) { + if (known_mids_.find(criteria.mid()) != known_mids_.end()) { RTC_LOG(LS_INFO) << criteria.ToString() << " would conflict with known mid"; return true; @@ -170,7 +182,7 @@ bool RtpDemuxer::CriteriaWouldConflict( } else { // If the exact rule already exists, then reject this duplicate. const auto sink_by_mid_and_rsid = sink_by_mid_and_rsid_.find( - std::make_pair(criteria.mid, criteria.rsid)); + std::make_pair(criteria.mid(), criteria.rsid())); if (sink_by_mid_and_rsid != sink_by_mid_and_rsid_.end()) { RTC_LOG(LS_INFO) << criteria.ToString() << " would conflict with existing sink = " @@ -181,7 +193,7 @@ bool RtpDemuxer::CriteriaWouldConflict( // If there is already a sink registered for the bare MID, then this // criteria will never receive any packets because they will just be // directed to that MID sink, so reject this new criteria. - const auto sink_by_mid = sink_by_mid_.find(criteria.mid); + const auto sink_by_mid = sink_by_mid_.find(criteria.mid()); if (sink_by_mid != sink_by_mid_.end()) { RTC_LOG(LS_INFO) << criteria.ToString() << " would conflict with existing sink = " @@ -191,7 +203,7 @@ bool RtpDemuxer::CriteriaWouldConflict( } } - for (uint32_t ssrc : criteria.ssrcs) { + for (uint32_t ssrc : criteria.ssrcs()) { const auto sink_by_ssrc = sink_by_ssrc_.find(ssrc); if (sink_by_ssrc != sink_by_ssrc_.end()) { RTC_LOG(LS_INFO) << criteria.ToString() @@ -222,14 +234,13 @@ void RtpDemuxer::RefreshKnownMids() { bool RtpDemuxer::AddSink(uint32_t ssrc, RtpPacketSinkInterface* sink) { RtpDemuxerCriteria criteria; - criteria.ssrcs.insert(ssrc); + criteria.ssrcs().insert(ssrc); return AddSink(criteria, sink); } void RtpDemuxer::AddSink(const std::string& rsid, RtpPacketSinkInterface* sink) { - RtpDemuxerCriteria criteria; - criteria.rsid = rsid; + RtpDemuxerCriteria criteria(absl::string_view() /* mid */, rsid); AddSink(criteria, sink); } @@ -241,11 +252,7 @@ bool RtpDemuxer::RemoveSink(const RtpPacketSinkInterface* sink) { RemoveFromMapByValue(&sink_by_mid_and_rsid_, sink) + RemoveFromMapByValue(&sink_by_rsid_, sink); RefreshKnownMids(); - bool removed = num_removed > 0; - if (removed) { - RTC_LOG(LS_INFO) << "Removed sink = " << sink << " bindings"; - } - return removed; + return num_removed > 0; } bool RtpDemuxer::OnRtpPacket(const RtpPacketReceived& packet) { @@ -420,11 +427,11 @@ void RtpDemuxer::AddSsrcSinkBinding(uint32_t ssrc, auto it = result.first; bool inserted = result.second; if (inserted) { - RTC_LOG(LS_INFO) << "Added sink = " << sink - << " binding with SSRC=" << ssrc; + RTC_DLOG(LS_INFO) << "Added sink = " << sink + << " binding with SSRC=" << ssrc; } else if (it->second != sink) { - RTC_LOG(LS_INFO) << "Updated sink = " << sink - << " binding with SSRC=" << ssrc; + RTC_DLOG(LS_INFO) << "Updated sink = " << sink + << " binding with SSRC=" << ssrc; it->second = sink; } } diff --git a/call/rtp_demuxer.h b/call/rtp_demuxer.h index 931dac21ab..fa90888d9c 100644 --- a/call/rtp_demuxer.h +++ b/call/rtp_demuxer.h @@ -27,7 +27,8 @@ class RtpPacketSinkInterface; // This struct describes the criteria that will be used to match packets to a // specific sink. -struct RtpDemuxerCriteria { +class RtpDemuxerCriteria { + public: explicit RtpDemuxerCriteria(absl::string_view mid, absl::string_view rsid = absl::string_view()); RtpDemuxerCriteria(); @@ -37,23 +38,40 @@ struct RtpDemuxerCriteria { bool operator!=(const RtpDemuxerCriteria& other) const; // If not the empty string, will match packets with this MID. - std::string mid; + const std::string& mid() const { return mid_; } + + // Return string representation of demux criteria to facilitate logging + std::string ToString() const; // If not the empty string, will match packets with this as their RTP stream // ID or repaired RTP stream ID. // Note that if both MID and RSID are specified, this will only match packets // that have both specified (either through RTP header extensions, SSRC // latching or RTCP). - std::string rsid; + const std::string& rsid() const { return rsid_; } - // Will match packets with any of these SSRCs. - flat_set ssrcs; + // The criteria will match packets with any of these SSRCs. + const flat_set& ssrcs() const { return ssrcs_; } - // Will match packets with any of these payload types. - flat_set payload_types; + // Writable accessor for directly modifying the list of ssrcs. + flat_set& ssrcs() { return ssrcs_; } - // Return string representation of demux criteria to facilitate logging - std::string ToString() const; + // The criteria will match packets with any of these payload types. + const flat_set& payload_types() const { return payload_types_; } + + // Writable accessor for directly modifying the list of payload types. + flat_set& payload_types() { return payload_types_; } + + private: + // Intentionally private member variables to encourage specifying them via the + // constructor and consider them to be const as much as possible. + // Post construction, reading the values needs to be done via accessors and if + // changing the value is required, that can still be done via the implicit + // assignment operator (which also reassigns all other member variables). + std::string mid_; + std::string rsid_; + flat_set ssrcs_; + flat_set payload_types_; }; // This class represents the RTP demuxing, for a single RTP session (i.e., one diff --git a/call/rtp_demuxer_unittest.cc b/call/rtp_demuxer_unittest.cc index ddb151fbc1..4dbee91785 100644 --- a/call/rtp_demuxer_unittest.cc +++ b/call/rtp_demuxer_unittest.cc @@ -56,7 +56,7 @@ class RtpDemuxerTest : public ::testing::Test { bool AddSinkOnlySsrc(uint32_t ssrc, RtpPacketSinkInterface* sink) { RtpDemuxerCriteria criteria; - criteria.ssrcs = {ssrc}; + criteria.ssrcs().insert(ssrc); return AddSink(criteria, sink); } @@ -195,15 +195,13 @@ TEST_F(RtpDemuxerTest, AllowAddSinkWithOverlappingPayloadTypesIfDifferentMid) { constexpr uint8_t pt2 = 31; constexpr uint8_t pt3 = 32; - RtpDemuxerCriteria pt1_pt2; - pt1_pt2.mid = mid1; - pt1_pt2.payload_types = {pt1, pt2}; + RtpDemuxerCriteria pt1_pt2(mid1); + pt1_pt2.payload_types() = {pt1, pt2}; MockRtpPacketSink sink1; AddSink(pt1_pt2, &sink1); - RtpDemuxerCriteria pt1_pt3; - pt1_pt2.mid = mid2; - pt1_pt3.payload_types = {pt1, pt3}; + RtpDemuxerCriteria pt1_pt3(mid2); + pt1_pt3.payload_types() = {pt1, pt3}; MockRtpPacketSink sink2; EXPECT_TRUE(AddSink(pt1_pt3, &sink2)); } @@ -276,12 +274,12 @@ TEST_F(RtpDemuxerTest, DISABLED_RejectAddSinkForSamePayloadTypes) { constexpr uint8_t pt2 = 31; RtpDemuxerCriteria pt1_pt2; - pt1_pt2.payload_types = {pt1, pt2}; + pt1_pt2.payload_types() = {pt1, pt2}; MockRtpPacketSink sink1; AddSink(pt1_pt2, &sink1); RtpDemuxerCriteria pt2_pt1; - pt2_pt1.payload_types = {pt2, pt1}; + pt2_pt1.payload_types() = {pt2, pt1}; MockRtpPacketSink sink2; EXPECT_FALSE(AddSink(pt2_pt1, &sink2)); } @@ -363,7 +361,7 @@ TEST_F(RtpDemuxerTest, OnRtpPacketCalledOnCorrectSinkByPayloadType) { MockRtpPacketSink sink; RtpDemuxerCriteria criteria; - criteria.payload_types = {payload_type}; + criteria.payload_types() = {payload_type}; AddSink(criteria, &sink); auto packet = CreatePacketWithSsrc(ssrc); @@ -960,15 +958,13 @@ TEST_F(RtpDemuxerTest, DropByPayloadTypeIfAddedInMultipleSinks) { constexpr uint8_t payload_type = 30; constexpr uint32_t ssrc = 10; - RtpDemuxerCriteria mid1_pt; - mid1_pt.mid = mid1; - mid1_pt.payload_types = {payload_type}; + RtpDemuxerCriteria mid1_pt(mid1); + mid1_pt.payload_types() = {payload_type}; MockRtpPacketSink sink1; AddSink(mid1_pt, &sink1); - RtpDemuxerCriteria mid2_pt; - mid2_pt.mid = mid2; - mid2_pt.payload_types = {payload_type}; + RtpDemuxerCriteria mid2_pt(mid2); + mid2_pt.payload_types() = {payload_type}; MockRtpPacketSink sink2; AddSink(mid2_pt, &sink2); @@ -988,15 +984,13 @@ TEST_F(RtpDemuxerTest, RoutedByPayloadTypeIfAmbiguousSinkRemoved) { constexpr uint8_t payload_type = 30; constexpr uint32_t ssrc = 10; - RtpDemuxerCriteria mid1_pt; - mid1_pt.mid = mid1; - mid1_pt.payload_types = {payload_type}; + RtpDemuxerCriteria mid1_pt(mid1); + mid1_pt.payload_types().insert(payload_type); MockRtpPacketSink sink1; AddSink(mid1_pt, &sink1); - RtpDemuxerCriteria mid2_pt; - mid2_pt.mid = mid2; - mid2_pt.payload_types = {payload_type}; + RtpDemuxerCriteria mid2_pt(mid2); + mid2_pt.payload_types().insert(payload_type); MockRtpPacketSink sink2; AddSink(mid2_pt, &sink2); @@ -1016,7 +1010,7 @@ TEST_F(RtpDemuxerTest, RoutedByPayloadTypeLatchesSsrc) { constexpr uint32_t ssrc = 10; RtpDemuxerCriteria pt; - pt.payload_types = {payload_type}; + pt.payload_types().insert(payload_type); NiceMock sink; AddSink(pt, &sink); @@ -1103,7 +1097,7 @@ TEST_F(RtpDemuxerTest, RouteByPayloadTypeMultipleMatch) { MockRtpPacketSink sink; RtpDemuxerCriteria criteria; - criteria.payload_types = {pt1, pt2}; + criteria.payload_types() = {pt1, pt2}; AddSink(criteria, &sink); auto packet_with_pt1 = CreatePacketWithSsrc(ssrc); @@ -1136,10 +1130,8 @@ TEST_F(RtpDemuxerTest, DemuxBySsrcEvenWithMidAndRsid) { const std::string rsid = "1"; constexpr uint32_t ssrc = 10; - RtpDemuxerCriteria criteria; - criteria.rsid = rsid; - criteria.mid = mid; - criteria.ssrcs = {ssrc}; + RtpDemuxerCriteria criteria(mid, rsid); + criteria.ssrcs().insert(ssrc); MockRtpPacketSink sink; AddSink(criteria, &sink); @@ -1157,8 +1149,8 @@ TEST_F(RtpDemuxerTest, DoNotCheckPayloadTypeIfMatchedByOtherCriteria) { constexpr uint8_t different_payload_type = payload_type + 1; RtpDemuxerCriteria criteria; - criteria.ssrcs = {ssrc}; - criteria.payload_types = {payload_type}; + criteria.ssrcs().insert(ssrc); + criteria.payload_types().insert(payload_type); MockRtpPacketSink sink; AddSink(criteria, &sink); @@ -1216,10 +1208,8 @@ TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedBySsrc) { const std::string rsid = "1"; const std::string wrong_rsid = "2"; - RtpDemuxerCriteria criteria; - criteria.mid = mid; - criteria.rsid = rsid; - criteria.ssrcs = {ssrc}; + RtpDemuxerCriteria criteria(mid, rsid); + criteria.ssrcs().insert(ssrc); MockRtpPacketSink sink; AddSink(criteria, &sink); @@ -1237,10 +1227,8 @@ TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType) { const std::string wrong_rsid = "2"; constexpr uint8_t payload_type = 30; - RtpDemuxerCriteria criteria; - criteria.mid = mid; - criteria.rsid = rsid; - criteria.payload_types = {payload_type}; + RtpDemuxerCriteria criteria(mid, rsid); + criteria.payload_types().insert(payload_type); MockRtpPacketSink sink; AddSink(criteria, &sink); @@ -1250,6 +1238,24 @@ TEST_F(RtpDemuxerTest, PacketWithMidAndUnknownRsidIsNotRoutedByPayloadType) { EXPECT_FALSE(demuxer_.OnRtpPacket(*packet)); } +TEST_F(RtpDemuxerTest, MidMustNotExceedMaximumLength) { + MockRtpPacketSink sink1; + std::string mid1(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a'); + // Adding the sink should pass even though the supplied mid is too long. + // The mid will be truncated though. + EXPECT_TRUE(AddSinkOnlyMid(mid1, &sink1)); + + // Adding a second sink with a mid that matches the truncated mid that was + // just added, should fail. + MockRtpPacketSink sink2; + std::string mid2(mid1.substr(0, BaseRtpStringExtension::kMaxValueSizeBytes)); + EXPECT_FALSE(AddSinkOnlyMid(mid2, &sink2)); + EXPECT_FALSE(RemoveSink(&sink2)); + + // Remove the original sink. + EXPECT_TRUE(RemoveSink(&sink1)); +} + #if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) TEST_F(RtpDemuxerDeathTest, CriteriaMustBeNonEmpty) { @@ -1274,12 +1280,6 @@ TEST_F(RtpDemuxerDeathTest, RsidMustNotExceedMaximumLength) { EXPECT_DEATH(AddSinkOnlyRsid(rsid, &sink), ""); } -TEST_F(RtpDemuxerDeathTest, MidMustNotExceedMaximumLength) { - MockRtpPacketSink sink; - std::string mid(BaseRtpStringExtension::kMaxValueSizeBytes + 1, 'a'); - EXPECT_DEATH(AddSinkOnlyMid(mid, &sink), ""); -} - #endif } // namespace diff --git a/pc/channel.cc b/pc/channel.cc index 7c386c8188..ce61414fa9 100644 --- a/pc/channel.cc +++ b/pc/channel.cc @@ -130,19 +130,10 @@ BaseChannel::BaseChannel(rtc::Thread* worker_thread, srtp_required_(srtp_required), crypto_options_(crypto_options), media_channel_(std::move(media_channel)), + demuxer_criteria_(content_name), ssrc_generator_(ssrc_generator) { RTC_DCHECK_RUN_ON(worker_thread_); RTC_DCHECK(ssrc_generator_); - // Temp fix: MID in SDP is allowed to be slightly longer than what's allowed - // in the RTP demuxer. Truncate if needed; this won't match, but it only - // makes sense in places that wouldn't use this for matching anyway. - // TODO(bugs.webrtc.org/12517): remove when length 16 is policed by parser. - if (content_name.size() > 16) { - RTC_LOG(LS_ERROR) << "Overlong mid attribute, truncating for matching"; - demuxer_criteria_.mid = content_name.substr(0, 16); - } else { - demuxer_criteria_.mid = content_name; - } RTC_LOG(LS_INFO) << "Created channel: " << ToString(); } @@ -499,6 +490,8 @@ void BaseChannel::UpdateRtpHeaderExtensionMap( } bool BaseChannel::RegisterRtpDemuxerSink_w() { + // TODO(bugs.webrtc.org/11993): `previous_demuxer_criteria_` should only be + // accessed on the network thread. if (demuxer_criteria_ == previous_demuxer_criteria_) { return true; } @@ -605,15 +598,17 @@ bool BaseChannel::SetPayloadTypeDemuxingEnabled_w(bool enabled) { // streams that were matched based on payload type alone, but currently // there is no straightforward way to identify those streams. media_channel()->ResetUnsignaledRecvStream(); - demuxer_criteria_.payload_types.clear(); + demuxer_criteria_.payload_types().clear(); if (!RegisterRtpDemuxerSink_w()) { RTC_LOG(LS_ERROR) << "Failed to disable payload type demuxing for " << ToString(); return false; } } else if (!payload_types_.empty()) { - demuxer_criteria_.payload_types.insert(payload_types_.begin(), - payload_types_.end()); + // TODO(tommi): Instead of 'insert', should this simply overwrite the value + // of the criteria? + demuxer_criteria_.payload_types().insert(payload_types_.begin(), + payload_types_.end()); if (!RegisterRtpDemuxerSink_w()) { RTC_LOG(LS_ERROR) << "Failed to enable payload type demuxing for " << ToString(); @@ -732,7 +727,7 @@ bool BaseChannel::UpdateRemoteStreams_w( } } } - demuxer_criteria_.ssrcs.clear(); + demuxer_criteria_.ssrcs().clear(); // Check for new streams. for (const StreamParams& new_stream : streams) { // We allow a StreamParams with an empty list of SSRCs, in which case the @@ -758,8 +753,8 @@ bool BaseChannel::UpdateRemoteStreams_w( } } // Update the receiving SSRCs. - demuxer_criteria_.ssrcs.insert(new_stream.ssrcs.begin(), - new_stream.ssrcs.end()); + demuxer_criteria_.ssrcs().insert(new_stream.ssrcs.begin(), + new_stream.ssrcs.end()); } // Re-register the sink to update the receiving ssrcs. if (!RegisterRtpDemuxerSink_w()) { @@ -780,7 +775,8 @@ RtpHeaderExtensions BaseChannel::GetDeduplicatedRtpHeaderExtensions( void BaseChannel::MaybeAddHandledPayloadType(int payload_type) { if (payload_type_demuxing_enabled_) { - demuxer_criteria_.payload_types.insert(static_cast(payload_type)); + demuxer_criteria_.payload_types().insert( + static_cast(payload_type)); } // Even if payload type demuxing is currently disabled, we need to remember // the payload types in case it's re-enabled later. @@ -788,7 +784,7 @@ void BaseChannel::MaybeAddHandledPayloadType(int payload_type) { } void BaseChannel::ClearHandledPayloadTypes() { - demuxer_criteria_.payload_types.clear(); + demuxer_criteria_.payload_types().clear(); payload_types_.clear(); } diff --git a/pc/dtls_srtp_transport_unittest.cc b/pc/dtls_srtp_transport_unittest.cc index b2ae14f76b..72df81a923 100644 --- a/pc/dtls_srtp_transport_unittest.cc +++ b/pc/dtls_srtp_transport_unittest.cc @@ -88,7 +88,7 @@ class DtlsSrtpTransportTest : public ::testing::Test, &transport_observer2_, &webrtc::TransportObserver::OnReadyToSend); webrtc::RtpDemuxerCriteria demuxer_criteria; // 0x00 is the payload type used in kPcmuFrame. - demuxer_criteria.payload_types = {0x00}; + demuxer_criteria.payload_types() = {0x00}; dtls_srtp_transport1_->RegisterRtpDemuxerSink(demuxer_criteria, &transport_observer1_); dtls_srtp_transport2_->RegisterRtpDemuxerSink(demuxer_criteria, diff --git a/pc/rtp_transport_unittest.cc b/pc/rtp_transport_unittest.cc index b3bd1db2e5..aae6d2c462 100644 --- a/pc/rtp_transport_unittest.cc +++ b/pc/rtp_transport_unittest.cc @@ -285,7 +285,7 @@ TEST(RtpTransportTest, SignalHandledRtpPayloadType) { TransportObserver observer(&transport); RtpDemuxerCriteria demuxer_criteria; // Add a handled payload type. - demuxer_criteria.payload_types = {0x11}; + demuxer_criteria.payload_types().insert(0x11); transport.RegisterRtpDemuxerSink(demuxer_criteria, &observer); // An rtp packet. @@ -309,7 +309,7 @@ TEST(RtpTransportTest, DontSignalUnhandledRtpPayloadType) { TransportObserver observer(&transport); RtpDemuxerCriteria demuxer_criteria; // Add an unhandled payload type. - demuxer_criteria.payload_types = {0x12}; + demuxer_criteria.payload_types().insert(0x12); transport.RegisterRtpDemuxerSink(demuxer_criteria, &observer); const rtc::PacketOptions options; diff --git a/pc/srtp_transport_unittest.cc b/pc/srtp_transport_unittest.cc index 9ae3d5eb1a..59bc8e8090 100644 --- a/pc/srtp_transport_unittest.cc +++ b/pc/srtp_transport_unittest.cc @@ -71,7 +71,7 @@ class SrtpTransportTest : public ::testing::Test, public sigslot::has_slots<> { RtpDemuxerCriteria demuxer_criteria; // 0x00 is the payload type used in kPcmuFrame. - demuxer_criteria.payload_types = {0x00}; + demuxer_criteria.payload_types().insert(0x00); srtp_transport1_->RegisterRtpDemuxerSink(demuxer_criteria, &rtp_sink1_); srtp_transport2_->RegisterRtpDemuxerSink(demuxer_criteria, &rtp_sink2_); diff --git a/test/peer_scenario/scenario_connection.cc b/test/peer_scenario/scenario_connection.cc index fefaa00c72..32a85b1ecf 100644 --- a/test/peer_scenario/scenario_connection.cc +++ b/test/peer_scenario/scenario_connection.cc @@ -178,13 +178,13 @@ void ScenarioIceConnectionImpl::SetRemoteSdp(SdpType type, if (content.media_description()->as_audio()) { for (const auto& codec : content.media_description()->as_audio()->codecs()) { - criteria.payload_types.insert(codec.id); + criteria.payload_types().insert(codec.id); } } if (content.media_description()->as_video()) { for (const auto& codec : content.media_description()->as_video()->codecs()) { - criteria.payload_types.insert(codec.id); + criteria.payload_types().insert(codec.id); } } } @@ -219,8 +219,7 @@ bool ScenarioIceConnectionImpl::OnTransportChanged( if (rtp_transport_ != rtp_transport) { rtp_transport_ = rtp_transport; } - RtpDemuxerCriteria criteria; - criteria.mid = mid; + RtpDemuxerCriteria criteria(mid); rtp_transport_->RegisterRtpDemuxerSink(criteria, this); } return true;