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:
parent
e8fa1e1e7f
commit
8a5ac16fbf
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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_);
|
||||
|
||||
@ -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;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user