Implement RTCOutboundRtpStreamStats.targetBitrate for video
Spec: https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-targetbitrate
Bug: webrtc:13394
Change-Id: I4749b38088a24d1a775137d5fe2c65f96effd185
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/276380
Auto-Submit: Daniel.L (Byoungchan) Lee <daniel.l@hpcnt.com>
Commit-Queue: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Henrik Boström <hbos@webrtc.org>
Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38170}
diff --git a/api/stats/rtcstats_objects.h b/api/stats/rtcstats_objects.h
index 2554ea0..b73648a 100644
--- a/api/stats/rtcstats_objects.h
+++ b/api/stats/rtcstats_objects.h
@@ -516,7 +516,6 @@
RTCStatsMember<uint64_t> bytes_sent;
RTCStatsMember<uint64_t> header_bytes_sent;
RTCStatsMember<uint64_t> retransmitted_bytes_sent;
- // TODO(https://crbug.com/webrtc/13394): Also collect this metric for video.
RTCStatsMember<double> target_bitrate;
RTCStatsMember<uint32_t> frames_encoded;
RTCStatsMember<uint32_t> key_frames_encoded;
diff --git a/media/base/media_channel.h b/media/base/media_channel.h
index 57b4884..986cb26 100644
--- a/media/base/media_channel.h
+++ b/media/base/media_channel.h
@@ -391,7 +391,7 @@
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-nackcount
uint32_t nacks_rcvd = 0;
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-targetbitrate
- double target_bitrate = 0.0;
+ absl::optional<double> target_bitrate;
int packets_lost = 0;
float fraction_lost = 0.0f;
int64_t rtt_ms = 0;
diff --git a/media/engine/webrtc_video_engine.cc b/media/engine/webrtc_video_engine.cc
index dc404dc..5651f59 100644
--- a/media/engine/webrtc_video_engine.cc
+++ b/media/engine/webrtc_video_engine.cc
@@ -2656,6 +2656,7 @@
common_info.quality_limitation_resolution_changes =
stats.quality_limitation_resolution_changes;
common_info.encoder_implementation_name = stats.encoder_implementation_name;
+ common_info.target_bitrate = stats.target_media_bitrate_bps;
common_info.ssrc_groups = ssrc_groups_;
common_info.frames = stats.frames;
common_info.framerate_input = stats.input_frame_rate;
diff --git a/pc/rtc_stats_collector.cc b/pc/rtc_stats_collector.cc
index c27533a..8bcc72d 100644
--- a/pc/rtc_stats_collector.cc
+++ b/pc/rtc_stats_collector.cc
@@ -646,8 +646,9 @@
outbound_audio->mid = mid;
outbound_audio->media_type = "audio";
outbound_audio->kind = "audio";
- if (voice_sender_info.target_bitrate > 0) {
- outbound_audio->target_bitrate = voice_sender_info.target_bitrate;
+ if (voice_sender_info.target_bitrate &&
+ *voice_sender_info.target_bitrate > 0) {
+ outbound_audio->target_bitrate = *voice_sender_info.target_bitrate;
}
if (voice_sender_info.codec_payload_type.has_value()) {
auto codec_param_it = voice_media_info.send_codecs.find(
@@ -689,6 +690,10 @@
static_cast<uint32_t>(video_sender_info.plis_rcvd);
if (video_sender_info.qp_sum)
outbound_video->qp_sum = *video_sender_info.qp_sum;
+ if (video_sender_info.target_bitrate &&
+ video_sender_info.target_bitrate > 0) {
+ outbound_video->target_bitrate = *video_sender_info.target_bitrate;
+ }
outbound_video->frames_encoded = video_sender_info.frames_encoded;
outbound_video->key_frames_encoded = video_sender_info.key_frames_encoded;
outbound_video->total_encode_time =
diff --git a/pc/rtc_stats_integrationtest.cc b/pc/rtc_stats_integrationtest.cc
index 057bf0f..e49f173 100644
--- a/pc/rtc_stats_integrationtest.cc
+++ b/pc/rtc_stats_integrationtest.cc
@@ -956,6 +956,7 @@
outbound_stream.header_bytes_sent);
verifier.TestMemberIsNonNegative<uint64_t>(
outbound_stream.retransmitted_bytes_sent);
+ verifier.TestMemberIsNonNegative<double>(outbound_stream.target_bitrate);
if (outbound_stream.kind.is_defined() && *outbound_stream.kind == "video") {
verifier.TestMemberIsDefined(outbound_stream.frames_encoded);
verifier.TestMemberIsDefined(outbound_stream.key_frames_encoded);
@@ -990,7 +991,6 @@
verifier.TestMemberIsNonNegative<uint32_t>(outbound_stream.frames_sent);
verifier.TestMemberIsNonNegative<uint32_t>(
outbound_stream.huge_frames_sent);
- verifier.TestMemberIsUndefined(outbound_stream.target_bitrate);
verifier.MarkMemberTested(outbound_stream.rid, true);
} else {
verifier.TestMemberIsUndefined(outbound_stream.frames_encoded);
@@ -1014,7 +1014,6 @@
verifier.TestMemberIsUndefined(outbound_stream.frame_width);
verifier.TestMemberIsUndefined(outbound_stream.frames_sent);
verifier.TestMemberIsUndefined(outbound_stream.huge_frames_sent);
- verifier.TestMemberIsNonNegative<double>(outbound_stream.target_bitrate);
}
return verifier.ExpectAllMembersSuccessfullyTested();
}