Replacing NetEq discard rate with secondary discarded rate.

NetEq network statistics contains discard rate but has not been used and even not been implemented until recently.

According to w3c.github.io/webrtc-stats/#dom-rtcreceivedrtpstreamstats-packetsdiscarded,
this statistics needs to be replaced with an accumulative stats. Such work will be carried out separately.

Meanwhile, we need to add a rate to reflect rate of discarded redundant packets. See webrtc:8025.

In this CL, we replace the existing discard rate with secondary discarded rate, so as to
1. fulfill the requests on webrtc:8025
2. get ready to implement an accumulative statistics for discarded packets.

BUG: webrtc:7903,webrtc:8025
Change-Id: Idbf143a105db76ca15f0af54848e1448f2a810ec
Reviewed-on: https://chromium-review.googlesource.com/582863
Reviewed-by: Henrik Lundin <henrik.lundin@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Minyue Li <minyue@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#19495}
This commit is contained in:
minyue-webrtc
2017-08-23 15:59:38 +02:00
committed by Commit Bot
parent d950d9eda1
commit 0c3ca753c5
14 changed files with 88 additions and 64 deletions

View File

@ -48,6 +48,16 @@ bool EqualSampleRates(uint8_t pt1,
auto* di2 = decoder_database.GetDecoderInfo(pt2);
return di1 && di2 && di1->SampleRateHz() == di2->SampleRateHz();
}
void LogPacketDiscarded(int codec_level, StatisticsCalculator* stats) {
RTC_CHECK(stats);
if (codec_level > 0) {
stats->SecondaryPacketsDiscarded(1);
} else {
stats->PacketsDiscarded(1);
}
}
} // namespace
PacketBuffer::PacketBuffer(size_t max_number_of_packets,
@ -99,8 +109,7 @@ int PacketBuffer::InsertPacket(Packet&& packet, StatisticsCalculator* stats) {
// timestamp as |rit|, which has a higher priority, do not insert the new
// packet to list.
if (rit != buffer_.rend() && packet.timestamp == rit->timestamp) {
RTC_CHECK(stats);
stats->PacketsDiscarded(1);
LogPacketDiscarded(packet.priority.codec_level, stats);
return return_val;
}
@ -109,9 +118,8 @@ int PacketBuffer::InsertPacket(Packet&& packet, StatisticsCalculator* stats) {
// packet.
PacketList::iterator it = rit.base();
if (it != buffer_.end() && packet.timestamp == it->timestamp) {
LogPacketDiscarded(packet.priority.codec_level, stats);
it = buffer_.erase(it);
RTC_CHECK(stats);
stats->PacketsDiscarded(1);
}
buffer_.insert(it, std::move(packet)); // Insert the packet at that position.
@ -218,25 +226,24 @@ int PacketBuffer::DiscardNextPacket(StatisticsCalculator* stats) {
return kBufferEmpty;
}
// Assert that the packet sanity checks in InsertPacket method works.
RTC_DCHECK(!buffer_.front().empty());
const Packet& packet = buffer_.front();
RTC_DCHECK(!packet.empty());
LogPacketDiscarded(packet.priority.codec_level, stats);
buffer_.pop_front();
RTC_CHECK(stats);
stats->PacketsDiscarded(1);
return kOK;
}
void PacketBuffer::DiscardOldPackets(uint32_t timestamp_limit,
uint32_t horizon_samples,
StatisticsCalculator* stats) {
const size_t old_size = buffer_.size();
buffer_.remove_if([timestamp_limit, horizon_samples](const Packet& p) {
return timestamp_limit != p.timestamp &&
IsObsoleteTimestamp(p.timestamp, timestamp_limit, horizon_samples);
buffer_.remove_if([timestamp_limit, horizon_samples, stats](const Packet& p) {
if (timestamp_limit == p.timestamp ||
!IsObsoleteTimestamp(p.timestamp, timestamp_limit, horizon_samples)) {
return false;
}
LogPacketDiscarded(p.priority.codec_level, stats);
return true;
});
if (old_size > buffer_.size()) {
RTC_CHECK(stats);
stats->PacketsDiscarded(old_size - buffer_.size());
}
}
void PacketBuffer::DiscardAllOldPackets(uint32_t timestamp_limit,
@ -246,20 +253,13 @@ void PacketBuffer::DiscardAllOldPackets(uint32_t timestamp_limit,
void PacketBuffer::DiscardPacketsWithPayloadType(uint8_t payload_type,
StatisticsCalculator* stats) {
int packets_discarded = 0;
for (auto it = buffer_.begin(); it != buffer_.end(); /* */) {
const Packet& packet = *it;
if (packet.payload_type == payload_type) {
it = buffer_.erase(it);
++packets_discarded;
} else {
++it;
buffer_.remove_if([payload_type, stats](const Packet& p) {
if (p.payload_type != payload_type) {
return false;
}
}
if (packets_discarded > 0) {
RTC_CHECK(stats);
stats->PacketsDiscarded(packets_discarded);
}
LogPacketDiscarded(p.priority.codec_level, stats);
return true;
});
}
size_t PacketBuffer::NumPacketsInBuffer() const {