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(); }