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 <hta@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#35616}
This commit is contained in:
Tomas Gunnarsson 2022-01-03 14:16:46 +00:00 committed by WebRTC LUCI CQ
parent e8fa1e1e7f
commit 8a5ac16fbf
8 changed files with 142 additions and 122 deletions

View File

@ -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() ? "<empty>" : mid)
<< ", rsid: " << (rsid.empty() ? "<empty>" : rsid) << ", ssrcs: [";
sb << "{mid: " << (mid_.empty() ? "<empty>" : mid_)
<< ", rsid: " << (rsid_.empty() ? "<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;
}
}

View File

@ -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<uint32_t> ssrcs;
// The criteria will match packets with any of these SSRCs.
const flat_set<uint32_t>& ssrcs() const { return ssrcs_; }
// Will match packets with any of these payload types.
flat_set<uint8_t> payload_types;
// Writable accessor for directly modifying the list of ssrcs.
flat_set<uint32_t>& 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<uint8_t>& payload_types() const { return payload_types_; }
// Writable accessor for directly modifying the list of payload types.
flat_set<uint8_t>& 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<uint32_t> ssrcs_;
flat_set<uint8_t> payload_types_;
};
// This class represents the RTP demuxing, for a single RTP session (i.e., one

View File

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

View File

@ -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<uint8_t>(payload_type));
demuxer_criteria_.payload_types().insert(
static_cast<uint8_t>(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();
}

View File

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

View File

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

View File

@ -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_);

View File

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