Logging of demuxer conflicts and sink bindings.
Bug: webrtc:10139
Change-Id: I7e49069c636a2aa4abc76dd0ee7cacaaa06007fe
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/175114
Reviewed-by: Tommi <tommi@webrtc.org>
Commit-Queue: Tommi <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31286}
diff --git a/call/rtp_demuxer.cc b/call/rtp_demuxer.cc
index 14725cf..3ab75c7 100644
--- a/call/rtp_demuxer.cc
+++ b/call/rtp_demuxer.cc
@@ -24,6 +24,25 @@
RtpDemuxerCriteria::RtpDemuxerCriteria() = default;
RtpDemuxerCriteria::~RtpDemuxerCriteria() = default;
+std::string RtpDemuxerCriteria::ToString() const {
+ rtc::StringBuilder sb;
+ sb << "{mid: " << (mid.empty() ? "<empty>" : mid)
+ << ", rsid: " << (rsid.empty() ? "<empty>" : rsid) << ", ssrcs: [";
+
+ for (auto ssrc : ssrcs) {
+ sb << ssrc << ", ";
+ }
+
+ sb << "], payload_types = [";
+
+ for (auto pt : payload_types) {
+ sb << pt << ", ";
+ }
+
+ sb << "]}";
+ return sb.Release();
+}
+
// static
std::string RtpDemuxer::DescribePacket(const RtpPacketReceived& packet) {
rtc::StringBuilder sb;
@@ -66,6 +85,8 @@
// 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();
return false;
}
@@ -92,6 +113,9 @@
RefreshKnownMids();
+ RTC_LOG(LS_INFO) << "Added sink = " << sink << " for criteria "
+ << criteria.ToString();
+
return true;
}
@@ -105,25 +129,40 @@
// 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()) {
+ RTC_LOG(LS_INFO) << criteria.ToString()
+ << " would conflict with known mid";
return true;
}
} else {
// If the exact rule already exists, then reject this duplicate.
- if (sink_by_mid_and_rsid_.find(std::make_pair(
- criteria.mid, criteria.rsid)) != sink_by_mid_and_rsid_.end()) {
+ const auto sink_by_mid_and_rsid = sink_by_mid_and_rsid_.find(
+ 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 = "
+ << sink_by_mid_and_rsid->second
+ << " by mid+rsid binding";
return true;
}
// 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.
- if (sink_by_mid_.find(criteria.mid) != sink_by_mid_.end()) {
+ 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 = "
+ << sink_by_mid->second << " by mid binding";
return true;
}
}
}
for (uint32_t ssrc : criteria.ssrcs) {
- if (sink_by_ssrc_.find(ssrc) != sink_by_ssrc_.end()) {
+ const auto sink_by_ssrc = sink_by_ssrc_.find(ssrc);
+ if (sink_by_ssrc != sink_by_ssrc_.end()) {
+ RTC_LOG(LS_INFO) << criteria.ToString()
+ << " would conflict with existing sink = "
+ << sink_by_ssrc->second << " binding by SSRC=" << ssrc;
return true;
}
}
@@ -168,7 +207,11 @@
RemoveFromMapByValue(&sink_by_mid_and_rsid_, sink) +
RemoveFromMapByValue(&sink_by_rsid_, sink);
RefreshKnownMids();
- return num_removed > 0;
+ bool removed = num_removed > 0;
+ if (removed) {
+ RTC_LOG(LS_INFO) << "Removed sink = " << sink << " bindings";
+ }
+ return removed;
}
bool RtpDemuxer::OnRtpPacket(const RtpPacketReceived& packet) {
@@ -370,9 +413,13 @@
auto it = result.first;
bool inserted = result.second;
if (inserted) {
+ RTC_LOG(LS_INFO) << "Added sink = " << sink
+ << " binding with SSRC=" << ssrc;
return true;
}
if (it->second != sink) {
+ RTC_LOG(LS_INFO) << "Updated sink = " << sink
+ << " binding with SSRC=" << ssrc;
it->second = sink;
return true;
}
diff --git a/call/rtp_demuxer.h b/call/rtp_demuxer.h
index c815c47..dae7a53 100644
--- a/call/rtp_demuxer.h
+++ b/call/rtp_demuxer.h
@@ -44,6 +44,9 @@
// Will match packets with any of these payload types.
std::set<uint8_t> payload_types;
+
+ // Return string representation of demux criteria to facilitate logging
+ std::string ToString() const;
};
// This class represents the RTP demuxing, for a single RTP session (i.e., one