Expose jitter buffer flushes metric in new getStats api.

Origin trial experiment proposal (new statistic part):
https://docs.google.com/document/d/1stYIZhEmDZ7NJF9gjjsM66eLFJUdc-14a3QutrFbIwI/edit?ts=5bf5535c#

Bug: chromium:907113
Change-Id: I1d005291f9b47665f70c26148dbdcbb55564bef8
Reviewed-on: https://webrtc-review.googlesource.com/c/111505
Reviewed-by: Karl Wiberg <kwiberg@webrtc.org>
Reviewed-by: Jonas Olsson <jonasolsson@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Commit-Queue: Ruslan Burakov <kuddai@google.com>
Cr-Commit-Position: refs/heads/master@{#25768}
This commit is contained in:
Ruslan Burakov
2018-11-22 17:21:10 +01:00
committed by Commit Bot
parent b357e54dd5
commit 8af8896596
12 changed files with 34 additions and 12 deletions

View File

@ -295,15 +295,6 @@ class RTC_EXPORT RTCStatsMember : public RTCStatsMemberInterface {
is_defined_ = true;
return value_;
}
T& operator=(const RTCStatsMember<T>& other) {
RTC_DCHECK(other.is_defined_);
// Shouldn't be attempting to assign an RTCNonStandardStatsMember to an
// RTCStatsMember or vice versa.
RTC_DCHECK(is_standardized() == other.is_standardized());
value_ = other.value_;
is_defined_ = true;
return value_;
}
// Value getters.
T& operator*() {
@ -348,6 +339,11 @@ class RTCNonStandardStatsMember : public RTCStatsMember<T> {
: RTCStatsMember<T>(std::move(other)) {}
bool is_standardized() const override { return false; }
T& operator=(const T& value) { return RTCStatsMember<T>::operator=(value); }
T& operator=(const T&& value) {
return RTCStatsMember<T>::operator=(std::move(value));
}
};
} // namespace webrtc

View File

@ -308,6 +308,9 @@ class RTC_EXPORT RTCMediaStreamTrackStats final : public RTCStats {
RTCStatsMember<double> total_samples_duration;
RTCStatsMember<uint64_t> concealed_samples;
RTCStatsMember<uint64_t> concealment_events;
// Non-standard audio-only member
// TODO(kuddai): Add descriptoin to standard. crbug.com/webrtc/10042
RTCNonStandardStatsMember<uint64_t> jitter_buffer_flushes;
};
// https://w3c.github.io/webrtc-stats/#pcstats-dict*

View File

@ -213,6 +213,7 @@ webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats() const {
stats.secondary_discarded_rate = Q14ToFloat(ns.currentSecondaryDiscardedRate);
stats.accelerate_rate = Q14ToFloat(ns.currentAccelerateRate);
stats.preemptive_expand_rate = Q14ToFloat(ns.currentPreemptiveRate);
stats.jitter_buffer_flushes = ns.packetBufferFlushes;
auto ds = channel_receive_->GetDecodingCallStatistics();
stats.decoding_calls_to_silence_generator = ds.calls_to_silence_generator;

View File

@ -71,6 +71,7 @@ class AudioReceiveStream {
int32_t decoding_plc_cng = 0;
int32_t decoding_muted_output = 0;
int64_t capture_start_ntp_time_ms = 0;
uint64_t jitter_buffer_flushes = 0;
};
struct Config {

View File

@ -476,6 +476,8 @@ struct VoiceReceiverInfo : public MediaReceiverInfo {
int decoding_muted_output = 0;
// Estimated capture start time in NTP time in ms.
int64_t capture_start_ntp_time_ms = -1;
// Count of the number of buffer flushes.
uint64_t jitter_buffer_flushes = 0;
};
struct VideoSenderInfo : public MediaSenderInfo {

View File

@ -2242,6 +2242,8 @@ bool WebRtcVoiceMediaChannel::GetStats(VoiceMediaInfo* info) {
rinfo.decoding_plc_cng = stats.decoding_plc_cng;
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;
info->receivers.push_back(rinfo);
}

View File

@ -345,6 +345,11 @@ void AcmReceiver::GetNetworkStatistics(NetworkStatistics* acm_stat) {
acm_stat->concealedSamples = neteq_lifetime_stat.concealed_samples;
acm_stat->concealmentEvents = neteq_lifetime_stat.concealment_events;
acm_stat->jitterBufferDelayMs = neteq_lifetime_stat.jitter_buffer_delay_ms;
NetEqOperationsAndState neteq_operations_and_state =
neteq_->GetOperationsAndState();
acm_stat->packetBufferFlushes =
neteq_operations_and_state.packet_buffer_flushes;
}
int AcmReceiver::DecoderByPayloadType(uint8_t payload_type,

View File

@ -117,6 +117,8 @@ struct NetworkStatistics {
int maxWaitingTimeMs;
// added samples in off mode due to packet loss
size_t addedSamples;
// count of the number of buffer flushes
uint64_t packetBufferFlushes;
};
} // namespace webrtc

View File

@ -604,11 +604,14 @@ class RTCStatsReportVerifier {
media_stream_track.concealed_samples);
verifier.TestMemberIsNonNegative<uint64_t>(
media_stream_track.concealment_events);
verifier.TestMemberIsNonNegative<uint64_t>(
media_stream_track.jitter_buffer_flushes);
} else {
verifier.TestMemberIsUndefined(media_stream_track.jitter_buffer_delay);
verifier.TestMemberIsUndefined(media_stream_track.total_samples_received);
verifier.TestMemberIsUndefined(media_stream_track.concealed_samples);
verifier.TestMemberIsUndefined(media_stream_track.concealment_events);
verifier.TestMemberIsUndefined(media_stream_track.jitter_buffer_flushes);
}
return verifier.ExpectAllMembersSuccessfullyTested();
}

View File

@ -454,6 +454,8 @@ ProduceMediaStreamTrackStatsFromVoiceReceiverInfo(
audio_track_stats->concealed_samples = voice_receiver_info.concealed_samples;
audio_track_stats->concealment_events =
voice_receiver_info.concealment_events;
audio_track_stats->jitter_buffer_flushes =
voice_receiver_info.jitter_buffer_flushes;
return audio_track_stats;
}

View File

@ -1426,6 +1426,7 @@ TEST_F(RTCStatsCollectorTest,
voice_receiver_info.concealed_samples = 123;
voice_receiver_info.concealment_events = 12;
voice_receiver_info.jitter_buffer_delay_seconds = 3456;
voice_receiver_info.jitter_buffer_flushes = 7;
stats_->CreateMockRtpSendersReceiversAndChannels(
{}, {std::make_pair(remote_audio_track.get(), voice_receiver_info)}, {},
@ -1459,6 +1460,7 @@ TEST_F(RTCStatsCollectorTest,
expected_remote_audio_track.concealed_samples = 123;
expected_remote_audio_track.concealment_events = 12;
expected_remote_audio_track.jitter_buffer_delay = 3456;
expected_remote_audio_track.jitter_buffer_flushes = 7;
ASSERT_TRUE(report->Get(expected_remote_audio_track.id()));
EXPECT_EQ(expected_remote_audio_track,
report->Get(expected_remote_audio_track.id())

View File

@ -374,7 +374,8 @@ WEBRTC_RTCSTATS_IMPL(RTCMediaStreamTrackStats, RTCStats, "track",
&total_samples_received,
&total_samples_duration,
&concealed_samples,
&concealment_events);
&concealment_events,
&jitter_buffer_flushes);
// clang-format on
RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(const std::string& id,
@ -410,7 +411,8 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(std::string&& id,
total_samples_received("totalSamplesReceived"),
total_samples_duration("totalSamplesDuration"),
concealed_samples("concealedSamples"),
concealment_events("concealmentEvents") {
concealment_events("concealmentEvents"),
jitter_buffer_flushes("jitterBufferFlushes") {
RTC_DCHECK(kind == RTCMediaStreamTrackKind::kAudio ||
kind == RTCMediaStreamTrackKind::kVideo);
}
@ -442,7 +444,8 @@ RTCMediaStreamTrackStats::RTCMediaStreamTrackStats(
total_samples_received(other.total_samples_received),
total_samples_duration(other.total_samples_duration),
concealed_samples(other.concealed_samples),
concealment_events(other.concealment_events) {}
concealment_events(other.concealment_events),
jitter_buffer_flushes(other.jitter_buffer_flushes) {}
RTCMediaStreamTrackStats::~RTCMediaStreamTrackStats() {}