Expose relative packet arrival delay metric in stats API.

The metric is non-standard and documented in: https://github.com/henbos/webrtc-provisional-stats/pull/14

Bug: webrtc:10333
Change-Id: Ie5b4bbad5b1e2c9104742931529bab8f48f51f8c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/125861
Reviewed-by: Minyue Li <minyue@webrtc.org>
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Commit-Queue: Jakob Ivarsson‎ <jakobi@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#26999}
This commit is contained in:
Jakob Ivarsson 2019-03-06 09:18:40 +01:00 committed by Commit Bot
parent 67f862ea96
commit 232b3fda92
11 changed files with 24 additions and 0 deletions

View file

@ -314,6 +314,7 @@ class RTC_EXPORT RTCMediaStreamTrackStats final : public RTCStats {
// TODO(kuddai): Add description to standard. crbug.com/webrtc/10042
RTCNonStandardStatsMember<uint64_t> jitter_buffer_flushes;
RTCNonStandardStatsMember<uint64_t> delayed_packet_outage_samples;
RTCNonStandardStatsMember<double> relative_packet_arrival_delay;
// Non-standard video-only members.
// https://henbos.github.io/webrtc-provisional-stats/#RTCVideoReceiverStats-dict*
RTCNonStandardStatsMember<uint32_t> freeze_count;

View file

@ -221,6 +221,9 @@ webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats() const {
stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
stats.jitter_buffer_flushes = ns.packetBufferFlushes;
stats.delayed_packet_outage_samples = ns.delayedPacketOutageSamples;
stats.relative_packet_arrival_delay_seconds =
static_cast<double>(ns.relativePacketArrivalDelayMs) /
static_cast<double>(rtc::kNumMillisecsPerSec);
auto ds = channel_receive_->GetDecodingCallStatistics();
stats.decoding_calls_to_silence_generator = ds.calls_to_silence_generator;

View file

@ -74,6 +74,7 @@ class AudioReceiveStream {
int32_t decoding_muted_output = 0;
int64_t capture_start_ntp_time_ms = 0;
uint64_t jitter_buffer_flushes = 0;
double relative_packet_arrival_delay_seconds = 0.0;
};
struct Config {

View file

@ -487,6 +487,8 @@ struct VoiceReceiverInfo : public MediaReceiverInfo {
uint64_t jitter_buffer_flushes = 0;
// Number of samples expanded due to delayed packets.
uint64_t delayed_packet_outage_samples = 0;
// Arrival delay of received audio packets.
double relative_packet_arrival_delay_seconds = 0.0;
};
struct VideoSenderInfo : public MediaSenderInfo {

View file

@ -2278,6 +2278,8 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
rinfo.decoding_muted_output = stats.decoding_muted_output;
rinfo.capture_start_ntp_time_ms = stats.capture_start_ntp_time_ms;
rinfo.jitter_buffer_flushes = stats.jitter_buffer_flushes;
rinfo.relative_packet_arrival_delay_seconds =
stats.relative_packet_arrival_delay_seconds;
info->receivers.push_back(rinfo);
}

View file

@ -257,6 +257,8 @@ void AcmReceiver::GetNetworkStatistics(NetworkStatistics* acm_stat) {
neteq_lifetime_stat.jitter_buffer_emitted_count;
acm_stat->delayedPacketOutageSamples =
neteq_lifetime_stat.delayed_packet_outage_samples;
acm_stat->relativePacketArrivalDelayMs =
neteq_lifetime_stat.relative_packet_arrival_delay_ms;
NetEqOperationsAndState neteq_operations_and_state =
neteq_->GetOperationsAndState();

View file

@ -122,6 +122,8 @@ struct NetworkStatistics {
uint64_t packetBufferFlushes;
// number of samples expanded due to delayed packets
uint64_t delayedPacketOutageSamples;
// arrival delay of incoming packets
uint64_t relativePacketArrivalDelayMs;
};
} // namespace webrtc

View file

@ -460,6 +460,8 @@ ProduceMediaStreamTrackStatsFromVoiceReceiverInfo(
voice_receiver_info.jitter_buffer_flushes;
audio_track_stats->delayed_packet_outage_samples =
voice_receiver_info.delayed_packet_outage_samples;
audio_track_stats->relative_packet_arrival_delay =
voice_receiver_info.relative_packet_arrival_delay_seconds;
return audio_track_stats;
}

View file

@ -1428,6 +1428,7 @@ TEST_F(RTCStatsCollectorTest,
voice_receiver_info.jitter_buffer_emitted_count = 13;
voice_receiver_info.jitter_buffer_flushes = 7;
voice_receiver_info.delayed_packet_outage_samples = 15;
voice_receiver_info.relative_packet_arrival_delay_seconds = 16;
stats_->CreateMockRtpSendersReceiversAndChannels(
{}, {std::make_pair(remote_audio_track.get(), voice_receiver_info)}, {},
@ -1464,6 +1465,7 @@ TEST_F(RTCStatsCollectorTest,
expected_remote_audio_track.jitter_buffer_emitted_count = 13;
expected_remote_audio_track.jitter_buffer_flushes = 7;
expected_remote_audio_track.delayed_packet_outage_samples = 15;
expected_remote_audio_track.relative_packet_arrival_delay = 16;
ASSERT_TRUE(report->Get(expected_remote_audio_track.id()));
EXPECT_EQ(expected_remote_audio_track,
report->Get(expected_remote_audio_track.id())

View file

@ -652,6 +652,8 @@ class RTCStatsReportVerifier {
media_stream_track.jitter_buffer_flushes);
verifier.TestMemberIsNonNegative<uint64_t>(
media_stream_track.delayed_packet_outage_samples);
verifier.TestMemberIsNonNegative<double>(
media_stream_track.relative_packet_arrival_delay);
} else {
verifier.TestMemberIsUndefined(media_stream_track.jitter_buffer_delay);
verifier.TestMemberIsUndefined(
@ -662,6 +664,8 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsUndefined(media_stream_track.jitter_buffer_flushes);
verifier.TestMemberIsUndefined(
media_stream_track.delayed_packet_outage_samples);
verifier.TestMemberIsUndefined(
media_stream_track.relative_packet_arrival_delay);
}
return verifier.ExpectAllMembersSuccessfullyTested();
}

View file

@ -382,6 +382,7 @@ WEBRTC_RTCSTATS_IMPL(RTCMediaStreamTrackStats, RTCStats, "track",
&concealment_events,
&jitter_buffer_flushes,
&delayed_packet_outage_samples,
&relative_packet_arrival_delay,
&freeze_count,
&pause_count,
&total_freezes_duration,
@ -427,6 +428,7 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(std::string&& id,
concealment_events("concealmentEvents"),
jitter_buffer_flushes("jitterBufferFlushes"),
delayed_packet_outage_samples("delayedPacketOutageSamples"),
relative_packet_arrival_delay("relativePacketArrivalDelay"),
freeze_count("freezeCount"),
pause_count("pauseCount"),
total_freezes_duration("totalFreezesDuration"),
@ -468,6 +470,7 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(
concealment_events(other.concealment_events),
jitter_buffer_flushes(other.jitter_buffer_flushes),
delayed_packet_outage_samples(other.delayed_packet_outage_samples),
relative_packet_arrival_delay(other.relative_packet_arrival_delay),
freeze_count(other.freeze_count),
pause_count(other.pause_count),
total_freezes_duration(other.total_freezes_duration),