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}
This commit is contained in:
Byoungchan Lee 2022-09-22 19:50:00 +09:00 committed by WebRTC LUCI CQ
parent 6a49fb2d5f
commit 636dc3d208
5 changed files with 10 additions and 6 deletions

View file

@ -516,7 +516,6 @@ class RTC_EXPORT RTCOutboundRTPStreamStats final : public RTCRTPStreamStats {
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;

View file

@ -391,7 +391,7 @@ struct MediaSenderInfo {
// 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;

View file

@ -2656,6 +2656,7 @@ WebRtcVideoChannel::WebRtcVideoSendStream::GetPerLayerVideoSenderInfos(
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;

View file

@ -646,8 +646,9 @@ void SetOutboundRTPStreamStatsFromVoiceSenderInfo(
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 @@ void SetOutboundRTPStreamStatsFromVideoSenderInfo(
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 =

View file

@ -956,6 +956,7 @@ class RTCStatsReportVerifier {
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 @@ class RTCStatsReportVerifier {
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 @@ class RTCStatsReportVerifier {
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();
}