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> bytes_sent;
RTCStatsMember<uint64_t> header_bytes_sent; RTCStatsMember<uint64_t> header_bytes_sent;
RTCStatsMember<uint64_t> retransmitted_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<double> target_bitrate;
RTCStatsMember<uint32_t> frames_encoded; RTCStatsMember<uint32_t> frames_encoded;
RTCStatsMember<uint32_t> key_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 // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-nackcount
uint32_t nacks_rcvd = 0; uint32_t nacks_rcvd = 0;
// https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-targetbitrate // https://w3c.github.io/webrtc-stats/#dom-rtcoutboundrtpstreamstats-targetbitrate
double target_bitrate = 0.0; absl::optional<double> target_bitrate;
int packets_lost = 0; int packets_lost = 0;
float fraction_lost = 0.0f; float fraction_lost = 0.0f;
int64_t rtt_ms = 0; int64_t rtt_ms = 0;

View file

@ -2656,6 +2656,7 @@ WebRtcVideoChannel::WebRtcVideoSendStream::GetPerLayerVideoSenderInfos(
common_info.quality_limitation_resolution_changes = common_info.quality_limitation_resolution_changes =
stats.quality_limitation_resolution_changes; stats.quality_limitation_resolution_changes;
common_info.encoder_implementation_name = stats.encoder_implementation_name; 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.ssrc_groups = ssrc_groups_;
common_info.frames = stats.frames; common_info.frames = stats.frames;
common_info.framerate_input = stats.input_frame_rate; common_info.framerate_input = stats.input_frame_rate;

View file

@ -646,8 +646,9 @@ void SetOutboundRTPStreamStatsFromVoiceSenderInfo(
outbound_audio->mid = mid; outbound_audio->mid = mid;
outbound_audio->media_type = "audio"; outbound_audio->media_type = "audio";
outbound_audio->kind = "audio"; outbound_audio->kind = "audio";
if (voice_sender_info.target_bitrate > 0) { if (voice_sender_info.target_bitrate &&
outbound_audio->target_bitrate = 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()) { if (voice_sender_info.codec_payload_type.has_value()) {
auto codec_param_it = voice_media_info.send_codecs.find( 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); static_cast<uint32_t>(video_sender_info.plis_rcvd);
if (video_sender_info.qp_sum) if (video_sender_info.qp_sum)
outbound_video->qp_sum = *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->frames_encoded = video_sender_info.frames_encoded;
outbound_video->key_frames_encoded = video_sender_info.key_frames_encoded; outbound_video->key_frames_encoded = video_sender_info.key_frames_encoded;
outbound_video->total_encode_time = outbound_video->total_encode_time =

View file

@ -956,6 +956,7 @@ class RTCStatsReportVerifier {
outbound_stream.header_bytes_sent); outbound_stream.header_bytes_sent);
verifier.TestMemberIsNonNegative<uint64_t>( verifier.TestMemberIsNonNegative<uint64_t>(
outbound_stream.retransmitted_bytes_sent); outbound_stream.retransmitted_bytes_sent);
verifier.TestMemberIsNonNegative<double>(outbound_stream.target_bitrate);
if (outbound_stream.kind.is_defined() && *outbound_stream.kind == "video") { if (outbound_stream.kind.is_defined() && *outbound_stream.kind == "video") {
verifier.TestMemberIsDefined(outbound_stream.frames_encoded); verifier.TestMemberIsDefined(outbound_stream.frames_encoded);
verifier.TestMemberIsDefined(outbound_stream.key_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.frames_sent);
verifier.TestMemberIsNonNegative<uint32_t>( verifier.TestMemberIsNonNegative<uint32_t>(
outbound_stream.huge_frames_sent); outbound_stream.huge_frames_sent);
verifier.TestMemberIsUndefined(outbound_stream.target_bitrate);
verifier.MarkMemberTested(outbound_stream.rid, true); verifier.MarkMemberTested(outbound_stream.rid, true);
} else { } else {
verifier.TestMemberIsUndefined(outbound_stream.frames_encoded); verifier.TestMemberIsUndefined(outbound_stream.frames_encoded);
@ -1014,7 +1014,6 @@ class RTCStatsReportVerifier {
verifier.TestMemberIsUndefined(outbound_stream.frame_width); verifier.TestMemberIsUndefined(outbound_stream.frame_width);
verifier.TestMemberIsUndefined(outbound_stream.frames_sent); verifier.TestMemberIsUndefined(outbound_stream.frames_sent);
verifier.TestMemberIsUndefined(outbound_stream.huge_frames_sent); verifier.TestMemberIsUndefined(outbound_stream.huge_frames_sent);
verifier.TestMemberIsNonNegative<double>(outbound_stream.target_bitrate);
} }
return verifier.ExpectAllMembersSuccessfullyTested(); return verifier.ExpectAllMembersSuccessfullyTested();
} }