diff --git a/AUTHORS b/AUTHORS index c20602bf01..ce35bb3c0c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -36,6 +36,7 @@ David Porter Dax Booysen Dennis Angelo Dharmesh Chauhan +Di Wu Dirk-Jan C. Binnema Dmitry Lizin Eike Rathke diff --git a/api/stats/rtcstats_objects.h b/api/stats/rtcstats_objects.h index ee3d70727f..7e0970d889 100644 --- a/api/stats/rtcstats_objects.h +++ b/api/stats/rtcstats_objects.h @@ -417,8 +417,6 @@ class RTC_EXPORT RTCInboundRTPStreamStats final : public RTCRTPStreamStats { RTCStatsMember header_bytes_received; RTCStatsMember packets_lost; // Signed per RFC 3550 RTCStatsMember last_packet_received_timestamp; - // TODO(hbos): Collect and populate this value for both "audio" and "video", - // currently not collected for "video". https://bugs.webrtc.org/7065 RTCStatsMember jitter; RTCStatsMember jitter_buffer_delay; RTCStatsMember jitter_buffer_emitted_count; diff --git a/media/base/media_channel.h b/media/base/media_channel.h index 79b3c2bcc1..fbe2df99a4 100644 --- a/media/base/media_channel.h +++ b/media/base/media_channel.h @@ -616,6 +616,7 @@ struct VideoReceiverInfo : public MediaReceiverInfo { uint32_t total_pauses_duration_ms = 0; uint32_t total_frames_duration_ms = 0; double sum_squared_frame_durations = 0.0; + uint32_t jitter_ms = 0; webrtc::VideoContentType content_type = webrtc::VideoContentType::UNSPECIFIED; diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc index 6c8b72bc44..d5b0f40235 100644 --- a/media/engine/webrtc_video_engine.cc +++ b/media/engine/webrtc_video_engine.cc @@ -3057,6 +3057,7 @@ WebRtcVideoChannel::WebRtcVideoReceiveStream::GetVideoReceiverInfo( stats.rtp_stats.packet_counter.padding_bytes; info.packets_rcvd = stats.rtp_stats.packet_counter.packets; info.packets_lost = stats.rtp_stats.packets_lost; + info.jitter_ms = stats.rtp_stats.jitter; info.framerate_rcvd = stats.network_frame_rate; info.framerate_decoded = stats.decode_frame_rate; diff --git a/pc/rtc_stats_collector.cc b/pc/rtc_stats_collector.cc index 139b33ffe3..5a741a16cd 100644 --- a/pc/rtc_stats_collector.cc +++ b/pc/rtc_stats_collector.cc @@ -374,6 +374,8 @@ void SetInboundRTPStreamStatsFromVideoReceiverInfo( inbound_video->codec_id = RTCCodecStatsIDFromMidDirectionAndPayload( mid, true, *video_receiver_info.codec_payload_type); } + inbound_video->jitter = static_cast(video_receiver_info.jitter_ms) / + rtc::kNumMillisecsPerSec; inbound_video->fir_count = static_cast(video_receiver_info.firs_sent); inbound_video->pli_count = diff --git a/pc/rtc_stats_collector_unittest.cc b/pc/rtc_stats_collector_unittest.cc index 73579ff259..cb300e0b1a 100644 --- a/pc/rtc_stats_collector_unittest.cc +++ b/pc/rtc_stats_collector_unittest.cc @@ -1895,6 +1895,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Video) { video_media_info.receivers[0].total_decode_time_ms = 9000; video_media_info.receivers[0].total_inter_frame_delay = 0.123; video_media_info.receivers[0].total_squared_inter_frame_delay = 0.00456; + video_media_info.receivers[0].jitter_ms = 1199; video_media_info.receivers[0].last_packet_received_timestamp_ms = absl::nullopt; @@ -1942,6 +1943,7 @@ TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Video) { expected_video.total_decode_time = 9.0; expected_video.total_inter_frame_delay = 0.123; expected_video.total_squared_inter_frame_delay = 0.00456; + expected_video.jitter = 1.199; // |expected_video.last_packet_received_timestamp| should be undefined. // |expected_video.content_type| should be undefined. // |expected_video.decoder_implementation| should be undefined. diff --git a/pc/rtc_stats_integrationtest.cc b/pc/rtc_stats_integrationtest.cc index e2d7c35654..6288f60b87 100644 --- a/pc/rtc_stats_integrationtest.cc +++ b/pc/rtc_stats_integrationtest.cc @@ -836,7 +836,7 @@ class RTCStatsReportVerifier { verifier.TestMemberIsUndefined(inbound_stream.frame_bit_depth); if (inbound_stream.media_type.is_defined() && *inbound_stream.media_type == "video") { - verifier.TestMemberIsUndefined(inbound_stream.jitter); + verifier.TestMemberIsNonNegative(inbound_stream.jitter); verifier.TestMemberIsUndefined(inbound_stream.jitter_buffer_delay); verifier.TestMemberIsUndefined( inbound_stream.jitter_buffer_emitted_count);