Bug: b/363185297 Change-Id: I70d33f40c3dab09e49076a503069b8ce0eab8eb2 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/374307 Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> Commit-Queue: Åsa Persson <asapersson@webrtc.org> Cr-Commit-Position: refs/heads/main@{#43755}
19 KiB
Video stats
Overview of collected statistics for VideoSendStream and VideoReceiveStream.
VideoSendStream
VideoSendStream::Stats for a sending stream can be gathered via VideoSendStream::GetStats().
Some statistics are collected per RTP stream (see StreamStats) and can be of StreamType: kMedia, kRtx, kFlexfec.
Multiple StreamStats objects are for example present if simulcast is used (multiple kMedia objects) or if RTX or FlexFEC is negotiated.
SendStatisticsProxy
VideoSendStream owns a SendStatisticsProxy which implements
VideoStreamEncoderObserver,
RtcpStatisticsCallback,
ReportBlockDataObserver,
RtcpPacketTypeCounterObserver,
StreamDataCountersCallback,
BitrateStatisticsObserver,
FrameCountObserver,
SendSideDelayObserver
and holds a VideoSendStream::Stats object.
SendStatisticsProxy is called via these interfaces by different components (e.g. RtpRtcp module) to update stats.
StreamStats
type- kMedia, kRtx or kFlexfec.referenced_media_ssrc- only present for type kRtx/kFlexfec. The SSRC for the kMedia stream that retransmissions or FEC is performed for.
Updated when a frame has been encoded, VideoStreamEncoder::OnEncodedImage.
frames_encoded- total number of encoded frames [rtcoutboundrtpstreamstats-framesencoded].encode_frame_rate- number of encoded frames during the last second.width- width of last encoded frame [rtcoutboundrtpstreamstats-framewidth].height- height of last encoded frame [rtcoutboundrtpstreamstats-frameheight].total_encode_time_ms- total encode time for encoded frames [rtcoutboundrtpstreamstats-totalencodetime].qp_sum- sum of quantizer values of encoded frames [rtcoutboundrtpstreamstats-qpsum].frame_counts- total number of encoded key/delta frames [rtcoutboundrtpstreamstats-keyframesencoded].huge_frames_sent- total number of huge frames sent [rtcoutboundrtpstreamstats-hugeframessent].scalability_mode- configured scalability mode for the stream [rtcoutboundrtpstreamstats-scalabilitymode].
Updated when a RTP packet is transmitted to the network, RtpSenderEgress::SendPacket.
rtp_stats- total number of sent bytes/packets.total_bitrate_bps- total bitrate sent in bits per second (over a one second window).retransmit_bitrate_bps- total retransmit bitrate sent in bits per second (over a one second window).avg_delay_ms- average capture-to-send delay for sent packets (over a one second window).max_delay_ms- maximum capture-to-send delay for sent packets (over a one second window).total_packet_send_delay_ms- total capture-to-send delay for sent packets [rtcoutboundrtpstreamstats-totalpacketsenddelay].
Updated when an incoming RTCP packet is parsed, RTCPReceiver::ParseCompoundPacket.
rtcp_packet_type_counts- total number of received NACK/FIR/PLI packets [rtcoutboundrtpstreamstats-nackcount, fircount, plicount].
Updated when a RTCP report block packet is received, RTCPReceiver::TriggerCallbacksFromRtcpPacket.
rtcp_stats- RTCP report block data.report_block_data- RTCP report block data.
Stats
std::map<uint32_t, StreamStats> substreams- StreamStats mapped per SSRC.
Updated when a frame is received from the source, VideoStreamEncoder::OnFrame.
frames- total number of frames fed to VideoStreamEncoder.input_frame_rate- number of frames fed to VideoStreamEncoder during the last second.frames_dropped_by_bad_timestamp- total number of dropped frames due to bad timestamp.frames_dropped_by_congestion_window- total number of dropped frames due to congestion window pushback.frames_dropped_by_encoder_queue- total number of dropped frames due to that the encoder is blocked.
Updated if a frame from the source is dropped, VideoStreamEncoder::OnDiscardedFrame.
frames_dropped_by_capturer- total number dropped frames by the source.
Updated if a frame is dropped by FrameDropper, VideoStreamEncoder::MaybeEncodeVideoFrame.
frames_dropped_by_rate_limiter- total number of dropped frames to avoid bitrate overuse.
Updated (if changed) before a frame is passed to the encoder, VideoStreamEncoder::EncodeVideoFrame.
encoder_implementation_name- name of encoder implementation [rtcoutboundrtpstreamstats-encoderimplementation].power_efficient_encoder- whether the encoder is considered power efficient [rtcoutboundrtpstreamstats-powerefficientencoder].
Updated after a frame has been encoded, VideoStreamEncoder::OnEncodedImage.
frames_encoded- total number of frames encoded [rtcoutboundrtpstreamstats-framesencoded].encode_frame_rate- number of encoded frames during the last second [rtcoutboundrtpstreamstats-framespersecond].total_encoded_bytes_target- total target frame size in bytes [rtcoutboundrtpstreamstats-totalencodedbytestarget].frames_sent- total number of frames sent [rtcoutboundrtpstreamstats-framessent].huge_frames_sent- total number of huge frames sent [rtcoutboundrtpstreamstats-hugeframessent].media_bitrate_bps- the actual bitrate the encoder is producing.avg_encode_time_ms- average encode time for encoded frames.total_encode_time_ms- total encode time for encoded frames [rtcoutboundrtpstreamstats-totalencodetime].frames_dropped_by_encoder- total number of dropped frames by the encoder.
Adaptation stats.
bw_limited_resolution- shows if resolution is limited due to restricted bandwidth.cpu_limited_resolution- shows if resolution is limited due to cpu.bw_limited_framerate- shows if framerate is limited due to restricted bandwidth.cpu_limited_framerate- shows if framerate is limited due to cpu.quality_limitation_reason- current reason for limiting resolution and/or framerate [rtcoutboundrtpstreamstats-qualitylimitationreason].quality_limitation_durations_ms- total time spent in quality limitation state [rtcoutboundrtpstreamstats-qualitylimitationdurations].quality_limitation_resolution_changes- total number of times that resolution has changed due to quality limitation [rtcoutboundrtpstreamstats-qualitylimitationresolutionchanges].number_of_cpu_adapt_changes- total number of times resolution/framerate has changed due to cpu limitation.number_of_quality_adapt_changes- total number of times resolution/framerate has changed due to quality limitation.
Updated when the encoder is configured, VideoStreamEncoder::ReconfigureEncoder.
content_type- configured content type (UNSPECIFIED/SCREENSHARE).
Updated when the available bitrate changes, VideoSendStreamImpl::OnBitrateUpdated.
target_media_bitrate_bps- the bitrate the encoder is configured to use.suspended- shows if video is suspended due to zero target bitrate.
VideoReceiveStream
VideoReceiveStream::Stats for a receiving stream can be gathered via VideoReceiveStream::GetStats().
ReceiveStatisticsProxy
VideoReceiveStream owns a ReceiveStatisticsProxy which implements
VideoStreamBufferControllerStatsObserver,
RtcpCnameCallback,
RtcpPacketTypeCounterObserver,
CallStatsObserver
and holds a VideoReceiveStream::Stats object.
ReceiveStatisticsProxy is called via these interfaces by different components (e.g. RtpRtcp module) to update stats.
Stats
current_payload_type- current payload type.ssrc- configured SSRC for the received stream.
Updated when a complete frame is received, FrameBuffer::InsertFrame.
frame_counts- total number of key/delta frames received [rtcinboundrtpstreamstats-keyframesdecoded].network_frame_rate- number of frames received during the last second.
Updated when a frame is ready for decoding, FrameBuffer::GetNextFrame. From VCMTiming:
jitter_buffer_ms- jitter delay in ms: this is the delay added to handle network jittermax_decode_ms- the 95th percentile observed decode time within a time window (10 sec).render_delay_ms- render delay in ms.min_playout_delay_ms- minimum playout delay in ms.target_delay_ms- target playout delay in ms. Max(min_playout_delay_ms,jitter_delay_ms+max_decode_ms+render_delay_ms).current_delay_ms- actual playout delay in ms.jitter_buffer_delay- sum of time for each frame from earliest packet is entered to corresponding frame is emitted from the jitter buffer [rtcinboundrtpstreamstats-jitterbufferdelay].jitter_buffer_emitted_count- total number of frames that have come out from the jitter buffer [rtcinboundrtpstreamstats-jitterbufferemittedcount].jitter_buffer_target_delay- increased by the target jitter buffer delay every time a frame is emitted from the jitter buffer [rtcinboundrtpstreamstats-jitterbuffertargetdelay].jitter_buffer_minimum_delay- minimum obtainable jitter buffer delay without external influence [rtcinboundrtpstreamstats-jitterbufferminimumdelay].
Updated (if changed) after a frame is passed to the decoder, VCMGenericDecoder::Decode.
decoder_implementation_name- name of decoder implementation [rtcinboundrtpstreamstats-decoderimplementation].power_efficient_decoder- whether the decoder is considered power efficient [rtcinboundrtpstreamstats-powerefficientdecoder].
Updated when a frame is ready for decoding, FrameBuffer::GetNextFrame.
timing_frame_info- timestamps for a full lifetime of a frame.first_frame_received_to_decoded_ms- initial decoding latency between the first arrived frame and the first decoded frame.frames_dropped- total number of dropped frames prior to decoding or if the system is too slow [rtcinboundrtpstreamstats-framesdropped].
Updated after a frame has been decoded, VCMDecodedFrameCallback::Decoded.
frames_decoded- total number of decoded frames [rtcinboundrtpstreamstats-framesdecoded].decode_frame_rate- number of decoded frames during the last second [rtcinboundrtpstreamstats-framespersecond].decode_ms- time to decode last frame in ms.total_decode_time- total decode time for decoded frames [rtcinboundrtpstreamstats-totaldecodetime].total_processing_delay- sum of time for each frame from first RTP packet is received to corresponding frame is decoded [rtcinboundrtpstreamstats-totalprocessingdelay].total_assembly_time- sum of time for each frame from first RTP packet is received to the last RTP packet of a frame is received (for frames consisting of more than one RTP packet) [rtcinboundrtpstreamstats-totalassemblytime].frames_assembled_from_multiple_packets- total number of correctly decoded frames that consist of more than one RTP packet [rtcinboundrtpstreamstats-framesassembledfrommultiplepackets].qp_sum- sum of quantizer values of decoded frames [rtcinboundrtpstreamstats-qpsum].content_type- content type (UNSPECIFIED/SCREENSHARE).interframe_delay_max_ms- max inter-frame delay within a time window between decoded frames.
Updated before a frame is sent to the renderer, VideoReceiveStream2::OnFrame.
frames_rendered- total number of rendered frames.render_frame_rate- number of rendered frames during the last second.width- width of last frame fed to renderer [rtcinboundrtpstreamstats-framewidth].height- height of last frame fed to renderer [rtcinboundrtpstreamstats-frameheight].estimated_playout_ntp_timestamp_ms- estimated playout NTP timestamp [rtcinboundrtpstreamstats-estimatedplayouttimestamp].sync_offset_ms- NTP timestamp difference between the last played out audio and video frame.freeze_count- total number of detected freezes.pause_count- total number of detected pauses.total_freezes_duration_ms- total duration of freezes in ms.total_pauses_duration_ms- total duration of pauses in ms.total_inter_frame_delay- sum of inter-frame delay in seconds between rendered frames [rtcinboundrtpstreamstats-totalinterframedelay].total_squared_inter_frame_delay- sum of squared inter-frame delays in seconds between rendered frames [rtcinboundrtpstreamstats-totalsquaredinterframedelay].
ReceiveStatisticsImpl::OnRtpPacket is updated for received RTP packets. From ReceiveStatistics:
total_bitrate_bps- incoming bitrate in bps.rtp_stats- RTP statistics for the received stream.
Updated when a RTCP packet is sent, RTCPSender::ComputeCompoundRTCPPacket.