<!--
Copyright 2020 The Chromium Authors
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->

<!--
This file is used to generate a comprehensive list of WebRTC histograms
along with a detailed description for each histogram.

For best practices on writing histogram descriptions, see
https://chromium.googlesource.com/chromium/src.git/+/HEAD/tools/metrics/histograms/README.md

Please follow the instructions in the OWNERS file in this directory to find a
reviewer. If no OWNERS file exists, please consider signing up at
go/reviewing-metrics (Googlers only), as all subdirectories are expected to
have an OWNERS file. As a last resort you can send the CL to
chromium-metrics-reviews@google.com.
-->

<histogram-configuration>

<histograms>

<variants name="CapturerType">
  <variant name="Screen" summary="Screen capture type"/>
  <variant name="Window" summary="Window capture type"/>
</variants>

<variants name="IPProtocolType">
  <variant name="_TCP" summary=""/>
  <variant name="_UDP" summary=""/>
</variants>

<variants name="NatType">
  <variant name=".NoNAT" summary=""/>
  <variant name=".NonSymNAT" summary=""/>
  <variant name=".SymNAT" summary=""/>
  <variant name=".UnknownNAT" summary=""/>
</variants>

<variants name="ScreenshareLayerStats">
  <variant name=".FrameRate"
      summary="Frames per second sent, in fps. The value is reported when a
               stream is removed and is calculated as the total number of
               frames in this layer, divided by the duration of the call."/>
  <variant name=".Qp"
      summary="Average quantizer (qp) of frames sent. The value is reported
               when a stream is removed and is calculated, for this layer, as
               the sum of all qp values divided the number of frames."/>
  <variant name=".TargetBitrate"
      summary="Average target bitrate in kbps. The value is reported when a
               stream is removed and is calculated as the sum of all target
               bitrates for this layer (sampled after frame has been encoded)
               divided by the total number of frames for this layer."/>
</variants>

<variants name="WebRTCEchoCancellerEstimate">
  <variant name=".Max" summary="The maximum over the time interval"/>
  <variant name=".Min" summary="The minimum over the time interval"/>
  <variant name=".Value"
      summary="The last estimated value of the time interval"/>
</variants>

<variants name="WebRTCMediaType">
  <variant name=".Audio" summary="Audio"/>
  <variant name=".Data" summary="Data"/>
  <variant name=".Video" summary="Video"/>
</variants>

<variants name="WebRTCVideoExperimentGroupId">
  <variant name=".ExperimentGroup0" summary="">
    <owner>ilnik@chromium.org</owner>
    <owner>webrtc-video@google.com</owner>
  </variant>
  <variant name=".ExperimentGroup1" summary="">
    <owner>ilnik@chromium.org</owner>
    <owner>webrtc-video@google.com</owner>
  </variant>
  <variant name=".ExperimentGroup2" summary="">
    <owner>ilnik@chromium.org</owner>
    <owner>webrtc-video@google.com</owner>
  </variant>
  <variant name=".ExperimentGroup3" summary="">
    <owner>ilnik@chromium.org</owner>
    <owner>webrtc-video@google.com</owner>
  </variant>
  <variant name=".ExperimentGroup4" summary="">
    <owner>ilnik@chromium.org</owner>
    <owner>webrtc-video@google.com</owner>
  </variant>
  <variant name=".S0" summary="">
    <owner>ilnik@chromium.org</owner>
    <owner>webrtc-video@google.com</owner>
  </variant>
  <variant name=".S1" summary="">
    <owner>ilnik@chromium.org</owner>
    <owner>webrtc-video@google.com</owner>
  </variant>
  <variant name=".S2" summary="">
    <owner>ilnik@chromium.org</owner>
    <owner>webrtc-video@google.com</owner>
  </variant>
</variants>

<histogram name="WebRTC.Audio.Agc.InputClippingRate" units="%"
    expires_after="2024-03-03">
  <owner>silen@chromium.org</owner>
  <owner>alessiob@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logs the input clipping rate in AGC1 and in AGC2. A log call is made every
    30 seconds during an active WebRTC call using the input volume controller.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.Agc2.DigitalGainApplied" units="dB"
    expires_after="2024-03-03">
  <owner>alessiob@chromium.org</owner>
  <owner>silen@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logs adaptive digital compression gain that is applied by
    AdaptiveDigitalGainApplier in GainController2. A log call is made once per
    second. The compression gain is applied to the microphone signal at the end
    of the processing chain.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.Agc2.EstimatedNoiseLevel" units="dBFS (negated)"
    expires_after="2023-12-31">
  <owner>alessiob@chromium.org</owner>
  <owner>silen@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram reports the noise level estimation done in GainController2. A
    value is reported every second. The unit is inverted dBFS. The scale goes
    from 0 (very loud noise) to 100 (very faint noise). Warning: this histogram
    was expired from 2021-12-31 to 2022-11-16; data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.Agc2.FixedDigitalGainCurveRegion.{Region}"
    units="seconds" expires_after="2024-03-03">
  <owner>alessiob@chromium.org</owner>
  <owner>silen@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    How long the AGC2 limiter remained in the {Region} region. Logged during an
    active WebRTC call whenever the limiter switches region and at the end of
    the call.
  </summary>
  <token key="Region">
    <variant name="Identity" summary="identity"/>
    <variant name="Knee" summary="knee"/>
    <variant name="Limiter" summary="limiter"/>
    <variant name="Saturation" summary="saturation"/>
  </token>
</histogram>

<histogram name="WebRTC.Audio.AgcClippingAdjustmentAllowed" enum="Boolean"
    expires_after="2024-02-25">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The automatic gain control (AGC) in WebRTC tries to adjust the microphone
    gain to maintain a strong audio level, but without clipping (saturation).
    The histogram will log a value every time input clipping is detected. The
    value is a boolean, with &quot;true&quot; meaning that the gain was in fact
    adjusted in response to the detected clipping, and &quot;false&quot; meaning
    that adjustment was not allowed due to limiting boundaries in the algorithm.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.Apm.RecommendedInputVolume.OnChangeToMatchTarget"
    units="volume" expires_after="2024-03-03">
  <owner>silen@chromium.org</owner>
  <owner>alessiob@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The recommended input volume when adjusted to match the target level - i.e.,
    not adjusted to handle clipping input. A log call is made every time that
    such a volume changes during an active WebRTC call.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.Apm.{InputVolumeType}.OnChange" units="volume"
    expires_after="2024-03-03">
  <owner>silen@chromium.org</owner>
  <owner>alessiob@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The {InputVolumeType} input volume. A log call is made every time that the
    volume changes during an active WebRTC call.
  </summary>
  <token key="InputVolumeType">
    <variant name="AppliedInputVolume" summary="applied"/>
    <variant name="RecommendedInputVolume" summary="recommended"/>
  </token>
</histogram>

<histogram name="WebRTC.Audio.Apm.{InputVolumeType}.{Metric}Average"
    units="volume" expires_after="2024-03-03">
  <owner>silen@chromium.org</owner>
  <owner>alessiob@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The {InputVolumeType} input volume average {Metric} measured over 60 seconds
    in AudioProcessingImpl. A log call is made every 60 seconds during an active
    WebRTC call.
  </summary>
  <token key="InputVolumeType">
    <variant name="AppliedInputVolume" summary="applied"/>
    <variant name="RecommendedInputVolume" summary="recommended"/>
  </token>
  <token key="Metric">
    <variant name="Decrease" summary="decrease"/>
    <variant name="Increase" summary="increase"/>
    <variant name="Update" summary="update"/>
  </token>
</histogram>

<histogram name="WebRTC.Audio.Apm.{InputVolumeType}.{Metric}Rate"
    units="changes/minute" expires_after="2024-03-03">
  <owner>silen@chromium.org</owner>
  <owner>alessiob@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The {InputVolumeType} input volume {Metric} rate measured over 60 seconds in
    AudioProcessingImpl. A log call is made every 60 seconds during an active
    WebRTC call.
  </summary>
  <token key="InputVolumeType">
    <variant name="AppliedInputVolume" summary="applied"/>
    <variant name="RecommendedInputVolume" summary="recommended"/>
  </token>
  <token key="Metric">
    <variant name="Decrease" summary="decrease"/>
    <variant name="Increase" summary="increase"/>
    <variant name="Update" summary="update"/>
  </token>
</histogram>

<histogram name="WebRTC.Audio.ApmCaptureInputLevelAverageRms"
    units="dBFS (negated)" expires_after="2024-03-17">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram reports the average RMS of the signal coming in to WebRTC's
    Audio Processing Module, prior to any WebRTC processing. A new value is
    reported every 10 seconds, and the average is over the latest interval. The
    metric is negated dBFS, meaning that 0 is a full-scale signal, while 127
    corresponds to -127 dBFS (very faint).
  </summary>
</histogram>

<histogram name="WebRTC.Audio.ApmCaptureInputLevelPeakRms"
    units="dBFS (negated)" expires_after="2024-03-17">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram reports the peak RMS of the signal coming in to WebRTC's
    Audio Processing Module, prior to any WebRTC processing. A new value is
    reported every 10 seconds, and the peak is the RMS of the strongest 10 ms
    block over the latest interval. The metric is negated dBFS, meaning that 0
    is a full-scale signal, while 127 corresponds to -127 dBFS (very faint).
  </summary>
</histogram>

<histogram name="WebRTC.Audio.ApmCaptureOutputLevelAverageRms"
    units="dBFS (negated)" expires_after="2024-02-04">
  <owner>peah@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram reports the average RMS of the signal in the output of
    WebRTC's Audio Processing Module, after all audio WebRTC processing. A new
    value is reported every 10 seconds, and the average is over the latest
    interval. The metric is negated dBFS, meaning that 0 is a full-scale signal,
    while 127 corresponds to -127 dBFS (very faint).
  </summary>
</histogram>

<histogram name="WebRTC.Audio.ApmCaptureOutputLevelPeakRms"
    units="dBFS (negated)" expires_after="2024-02-04">
  <owner>peah@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram reports the peak RMS of the signal in the output of WebRTC's
    Audio Processing Module, after all WebRTC audio processing. A new value is
    reported every 10 seconds, and the peak is the RMS of the strongest 10 ms
    block over the latest interval. The metric is negated dBFS, meaning that 0
    is a full-scale signal, while 127 corresponds to -127 dBFS (very faint).
  </summary>
</histogram>

<histogram name="WebRTC.Audio.AudioInterruptionMs" units="ms"
    expires_after="2024-02-25">
  <owner>hlundin@chromium.org</owner>
  <owner>ivoc@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Measures the duration of each audio interruption event. An audio
    interruption is defined as a loss concealment (a.k.a. expand) event that
    lasts more than 150 milliseconds. The metric registers each of these events.
    This gives an indication of the length and prevalence of severe network
    events, which are likely to be detrimental to the audio quality.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.AudioMixer.NewHighestSourceCount" units="sources"
    expires_after="2024-04-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logs the AudioMixer source count whenever the mixer gets a new highest
    source count. This allows us to differentiate the histogram to get the
    number of mixers that have had a specific number of maximum sources. For
    example, the number of AudioMixers that have had a maximum of 5 sources is
    NewHighestSourceCount[5] - NewHighestSourceCount[6].

    Note that this is not the same as logging the source count whenever a source
    is added; logging only happens when the source count exceeds the previously
    highest source count.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.AverageExcessBufferDelayMs" units="ms"
    expires_after="2024-02-04">
  <owner>hlundin@chromium.org</owner>
  <owner>gustaf@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Measures the average waiting time in the buffer for each packet. The waiting
    time is the time elapsed from the packet arrives until it is decoded. The
    metric is calculated as the average over one minute, and is logged at the
    end of each such interval. A well tuned target buffer level should lead to a
    low value.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.DelayedPacketOutageEventMs" units="ms"
    expires_after="2024-10-08">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Measures the duration of each packet loss concealment (a.k.a. expand) event
    that is not followed by a merge operation. The outage is measured in
    milliseconds, with a range between 0 and 2000 ms. This gives an indication
    of how well the jitter buffer's level adaptation is working. If the chosen
    target level is too low, this value will increase.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.DelayedPacketOutageEventsPerMinute"
    units="events/minute" expires_after="2024-02-04">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Counts the number of delayed packet outage events per minute. The range is
    between 0 and 100 (corresponds to more 1.6 events per second). See
    WebRTC.Audio.DelayedPacketOutageEventMs for the definition of a delayed
    packet outage event, and the interpretation of such events.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.BufferDelay" units="Blocks/2"
    expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs half the applied render buffer delay used in the WebRTC
    echo canceller. The value 0 means that no delay could be estimated,
    otherwise the logged delay corresponds to the actual delay + 1. A new value
    is logged every 10 seconds and the logged value constitutes the current
    buffer delay at the time when the value is logged.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.CaptureSaturation" enum="Boolean"
    expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs a value every time the WebRTC echo canceller has
    detected saturation in the capture signal. A new value is logged every 10
    seconds and the logged value indicates whether the capture signal has been
    saturated during the last 10 seconds.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.Clockdrift" enum="ClockdriftLevel"
    expires_after="2024-10-08">
  <owner>gustaf@chromium.org</owner>
  <owner>peah@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs whether clockdrift is detected in the WebRTC echo
    canceller. A new value is logged every 10 seconds.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.DelayChanges"
    enum="WebRTCEventFrequency" expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the frequency of echo path delay changes that are
    detected by the delay estimator in the WebRTC echo canceller. A new value is
    logged every 10 seconds and the logged value indicates how frequent delay
    changes have been during the last 10 seconds.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.EchoPathDelay" units="Blocks/2"
    expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs half the estimated echo path delay in 64 sample blocks
    as seen by the delay estimator in the WebRTC echo canceller. The value 0
    means that no delay could be estimated, otherwise the logged delay
    corresponds to the actual delay + 1. A new value is logged every 10 seconds
    and the logged value is the estimate of the delay of the echo path at the
    time when the value is logged.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.Erle{WebRTCEchoCancellerEstimate}"
    units="dB" expires_after="2024-08-07">
  <owner>gustaf@chromium.org</owner>
  <owner>peah@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the echo return loss enhancement achieved by the WebRTC
    echo canceller as described in ITU G.168. When the echo canceller is being
    used, one value is logged every 10 seconds per ongoing WebRTC call.
    {WebRTCEchoCancellerEstimate}
  </summary>
  <token key="WebRTCEchoCancellerEstimate"
      variants="WebRTCEchoCancellerEstimate">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.Erl{WebRTCEchoCancellerEstimate}"
    units="dB (shifted)" expires_after="2024-08-07">
  <owner>gustaf@chromium.org</owner>
  <owner>peah@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the echo return loss achieved by the WebRTC echo
    canceller as described in ITU G.168. When the echo canceller is being used,
    one value is logged every 10 seconds per ongoing WebRTC call.
    {WebRTCEchoCancellerEstimate}
  </summary>
  <token key="WebRTCEchoCancellerEstimate"
      variants="WebRTCEchoCancellerEstimate">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.FilterDelay" units="Blocks"
    expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the estimated echo path delay in 64 sample blocks as
    seen by the linear filter delay in the WebRTC echo canceller. The value 0
    means that no delay could be estimated from the linear filter, otherwise the
    logged delay corresponds to the actual delay + 1. A new value is logged
    every 10 seconds and the logged value is the estimate of the filter delay at
    the time when the value is logged.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.MaxCaptureJitter"
    units="frames (10 ms)" expires_after="2024-10-08">
  <owner>peah@chromium.org</owner>
  <owner>gustaf@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the observed maximum number of capture API calls in a
    row in the unit of frames (10 ms). A new value is logged every 10 seconds.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.MaxRenderJitter"
    units="frames (10 ms)" expires_after="2024-10-08">
  <owner>peah@chromium.org</owner>
  <owner>gustaf@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the observed maximum number of render API calls in a row
    in the unit of frames (10 ms). A new value is logged every 10 seconds.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.MinCaptureJitter"
    units="frames (10 ms)" expires_after="2024-10-08">
  <owner>peah@chromium.org</owner>
  <owner>gustaf@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the observed minimum number of capture API calls in a
    row in the unit of frames (10 ms). A new value is logged every 10 seconds.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.MinRenderJitter"
    units="frames (10 ms)" expires_after="2024-10-08">
  <owner>peah@chromium.org</owner>
  <owner>gustaf@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the observed minimum number of render API calls in a row
    in the unit of frames (10 ms). A new value is logged every 10 seconds.
  </summary>
</histogram>

<histogram
    name="WebRTC.Audio.EchoCanceller.PersistentMultichannelContentEverDetected"
    enum="Boolean" expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs whether the WebRTC echo canceller has encountered
    persistent multichannel playout reference content during its lifetime. The
    value is logged at the end of the AEC lifetime if the AEC has processed at
    least 5 seconds of audio.
  </summary>
</histogram>

<histogram
    name="WebRTC.Audio.EchoCanceller.ProcessingPersistentMultichannelContent"
    enum="Boolean" expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the frequency of persistent multichannel playout
    reference content detected by the WebRTC echo canceller. `true` if a
    majority of the last 10 seconds of audio was classified as persistent
    multichannel. A new value is logged every 10 seconds.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.ReliableDelayEstimates"
    enum="WebRTCAecDelayEstimateReliability" expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the assessed reliability of the delay estimates produced
    by the delay estimator in the WebRTC echo canceller. A new value is logged
    every 10 seconds and the logged value is a meausure based on how often
    during that period the delay estimate was reliable.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.RenderOverruns"
    enum="WebRTCEventFrequency" expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the frequency of overruns in the render buffer of the
    WebRTC echo canceller. A new value is logged every 10 seconds and the logged
    value is a meausure that indicates how often overruns occurred.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.RenderUnderruns"
    enum="WebRTCEventFrequency" expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs the frequency of underruns in the render buffer of the
    WebRTC echo canceller. A new value is logged every 10 seconds and the logged
    value is a meausure that indicates how often underruns occurred.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.EchoCanceller.UsableLinearEstimate"
    enum="Boolean" expires_after="2024-07-25">
  <owner>peah@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram logs a value every time the WebRTC echo canceller deems that
    the linear filter in the echo canceller is sufficiently well adapted to be
    usable. A new value is logged every 10 seconds and the logged value is the
    assessment of whether the filter is usable at the time when the value is
    logged.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.Encoder.CodecType" enum="WebRtcAudioCodecs"
    expires_after="2024-10-01">
  <owner>hlundin@chromium.org</owner>
  <owner>jakobi@google.com</owner>
  <owner>tomasl@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Histogram of audio codec usage. Every sample corresponds to 5 seconds of
    encoding with that codec.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.ExpandRatePercent" units="%"
    expires_after="2024-08-20">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Measures the expand rate for an incoming WebRTC audio stream. The expand
    rate is the fraction of samples that are generated through loss-concealemnt
    algorithms instead of being decoded from incoming media packets. The metric
    is calculated as the percent over a 10 second internval, and is logged at
    the end of each such interval.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.ReceiverDelayEstimateMs" units="ms"
    expires_after="2024-10-08">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The sum of the jitter buffer delay and the sound card's buffering delay for
    the receiving side. That is, the sum of the metrics
    WebRTC.Audio.ReceiverDeviceDelayMs and
    WebRTC.Audio.ReceiverJitterBufferDelayMs. Sampled once every 10 ms when
    WebRTC audio is playing. Warning: this histogram was expired from 2020-07-06
    to 2022-08-25; data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.ReceiverDeviceDelayMs" units="ms"
    expires_after="2024-02-04">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The sound card's buffering delay for the receiving side. Sampled once every
    10 ms when WebRTC audio is playing.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.ReceiverJitterBufferDelayMs" units="ms"
    expires_after="2024-02-04">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The jitter buffer delay for the receiving side. Sampled once every 10 ms
    when WebRTC audio is playing.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.SpeechExpandRatePercent" units="%"
    expires_after="2024-08-20">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Measures the audible expand rate for an incoming WebRTC audio stream. The
    metric is very similar to WebRTC.Audio.ExpandRate, with the difference that
    this metric only reports loss-concealement that generates audible samples.
    The metric is calculated as the percent over a 10 second internval, and is
    logged at the end of each such interval.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.TargetBitrateInKbps" units="kbps"
    expires_after="2024-10-01">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The target bitrate in kbps that the audio codec should try to produce on
    average. Sampled every time the rate is updated.
  </summary>
</histogram>

<histogram name="WebRTC.Audio.TargetJitterBufferDelayMs" units="ms"
    expires_after="2024-03-17">
  <owner>hlundin@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The target jitter buffer delay for the receiving side. Sampled once every 10
    ms per WebRTC receive stream when WebRTC audio is playing.
  </summary>
</histogram>

<histogram name="WebRTC.AudioInputChannelLayout" enum="ChannelLayout"
    expires_after="2024-07-25">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Audio input channel layout in WebRTC. Logged when a processed audio input
    source is started, roughly once per successful getUserMedia call with some
    effect enabled. Warning: this histogram was expired from 2020-11-01 to
    2022-04-11; data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.AudioInputSampleRate" enum="AudioSampleRate"
    expires_after="2024-07-25">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Audio input sample rate for WebRTC (in Hz). Logged when a processed audio
    input source is started, roughly once per successful getUserMedia call with
    some effect enabled. Warning: this histogram was expired from 2020-11-29 to
    2022-04-11; data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.AudioInputSampleRateUnexpected" units="Hz"
    expires_after="2024-07-25">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Audio input sample rate for WebRTC (atypical values, in Hz). Logged when a
    processed audio input source is started, roughly once per successful
    getUserMedia call with some effect enabled. Warning: this histogram was
    expired from 2021-04-30 to 2022-04-11; data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.AudioOutputSampleRate" enum="AudioSampleRate"
    expires_after="2024-07-25">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Audio output sample rate for WebRTC (in Hz). Logged when a WebRTC
    MediaStream is connected to an audio output device.
  </summary>
</histogram>

<histogram name="WebRTC.AudioOutputSampleRateUnexpected" units="Hz"
    expires_after="2024-07-25">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Audio output sample rate for WebRTC (atypical values, in Hz). Logged when a
    WebRTC MediaStream is connected to an audio output device. Warning: this
    histogram was expired from 2021-04-30 to 2022-12-07; data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.BWE.InitialBandwidthEstimate" units="kbps"
    expires_after="2024-02-04">
  <owner>holmer@chromium.org</owner>
  <summary>The bandwidth estimate 2 seconds into a WebRTC call.</summary>
</histogram>

<histogram name="WebRTC.BWE.InitiallyLostPackets" units="packets"
    expires_after="2024-03-17">
  <owner>holmer@chromium.org</owner>
  <summary>
    The number of video packets lost durig the first 2 seconds in a WebRTC call.
  </summary>
</histogram>

<histogram name="WebRTC.BWE.InitialRtt" units="ms" expires_after="2024-03-17">
  <owner>holmer@chromium.org</owner>
  <summary>
    The round-trip time as measured 2 seconds into a WebRTC call.
  </summary>
</histogram>

<histogram name="WebRTC.BWE.InitialVsConvergedDiff" units="kbps"
    expires_after="2024-03-17">
  <owner>holmer@chromium.org</owner>
  <summary>
    The difference between the bandwidth estimate at 2 seconds and 20 seconds
    into a WebRTC call, with a min at 0, which is supposed to capture the how
    much the initial bandwidth estimate overshot the actual bandwidth available.
  </summary>
</histogram>

<histogram name="WebRTC.BWE.RampUpTimeTo1000kbpsInMs" units="ms"
    expires_after="2023-02-26">
  <owner>holmer@chromium.org</owner>
  <summary>
    The time it takes the estimated bandwidth to reach 1000 kbps from the first
    RTCP packet received. Used to measure the bandwidth ramp-up time.
  </summary>
</histogram>

<histogram name="WebRTC.BWE.RampUpTimeTo2000kbpsInMs" units="ms"
    expires_after="2024-02-04">
  <owner>holmer@chromium.org</owner>
  <summary>
    The time it takes the estimated bandwidth to reach 2000 kbps from the first
    RTCP packet received. Used to measure the bandwidth ramp-up time.
  </summary>
</histogram>

<histogram name="WebRTC.BWE.RampUpTimeTo500kbpsInMs" units="ms"
    expires_after="2023-02-26">
  <owner>holmer@chromium.org</owner>
  <summary>
    The time it takes the estimated bandwidth to reach 500 kbps from the first
    RTCP packet received. Used to measure the bandwidth ramp-up time.
  </summary>
</histogram>

<histogram name="WebRTC.BWE.Types" enum="WebRtcBweType"
    expires_after="2024-02-11">
  <owner>holmer@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The bandwidth estimation used in WebRTC calls. Records whether the BWE is
    running on the sender or the receiver and what BWE related RTP header
    extensions are in use.

    Warning: This histogram was expired from 2022-10-11 to 2022-12-15. Data may
    be missing.
  </summary>
</histogram>

<histogram name="WebRTC.Call.AudioBitrateReceivedInKbps" units="kbps"
    expires_after="2024-03-17">
  <owner>holmer@chromium.org</owner>
  <summary>
    Average audio bitrate received during a call, counted from first packet
    received until Call instance is destroyed. Only mesured for calls that are
    at least 10 seconds long.
  </summary>
</histogram>

<histogram name="WebRTC.Call.BitrateReceivedInKbps" units="kbps"
    expires_after="2024-02-05">
  <owner>holmer@chromium.org</owner>
  <summary>
    Average total bitrate received during a call (audio + video + RTCP), counted
    from first packet received until Call instance is destroyed. Only mesured
    for calls that are at least 10 seconds long.
  </summary>
</histogram>

<histogram name="WebRTC.Call.EstimatedSendBitrateInKbps" units="kbps"
    expires_after="2024-03-10">
  <owner>holmer@chromium.org</owner>
  <summary>
    Average estimated send bitrate during a call, counted from first packet sent
    until Call instance is destroyed. Only mesured for calls that are at least
    10 seconds long.
  </summary>
</histogram>

<histogram name="WebRTC.Call.LifetimeInSeconds" units="seconds"
    expires_after="2024-03-17">
  <owner>asapersson@chromium.org</owner>
  <summary>
    The lifetime of a call. Recorded when a Call instance is destroyed.
  </summary>
</histogram>

<histogram name="WebRTC.Call.PacerBitrateInKbps" units="kbps"
    expires_after="2024-02-04">
  <owner>holmer@chromium.org</owner>
  <summary>
    Average pacer bitrate during a call, counted from first packet sent until
    Call instance is destroyed. Only mesured for calls that are at least 10
    seconds long.
  </summary>
</histogram>

<histogram name="WebRTC.Call.RtcpBitrateReceivedInBps" units="bits/s"
    expires_after="2024-03-17">
  <owner>holmer@chromium.org</owner>
  <summary>
    Average RTCP bitrate received during a call, counted from first packet
    received until Call instance is destroyed. Only mesured for calls that are
    at least 10 seconds long.
  </summary>
</histogram>

<histogram name="WebRTC.Call.TimeReceivingAudioRtpPacketsInSeconds" units="s"
    expires_after="2024-07-25">
  <owner>saza@chromium.org</owner>
  <owner>hlundin@chromium.org</owner>
  <summary>
    The amount of time between the arrival of the first and last audio RTP
    packets to pass through a Call object. This is logged when the Call object
    is destroyed. This is only logged if audio RTP packets are at some point in
    time received, and is a way to omit temporary objects that do not send any
    actual media.
  </summary>
</histogram>

<histogram name="WebRTC.Call.TimeReceivingVideoRtpPacketsInSeconds" units="s"
    expires_after="2024-07-25">
  <owner>saza@chromium.org</owner>
  <owner>hlundin@chromium.org</owner>
  <summary>
    The amount of time between the arrival of the first and last video RTP
    packets to pass through a Call object. This is logged when the Call object
    is destroyed. This is only logged if video RTP packets are at some point in
    time received, and is a way to omit temporary objects that do not send any
    actual media.
  </summary>
</histogram>

<histogram name="WebRTC.Call.VideoBitrateReceivedInKbps" units="kbps"
    expires_after="2024-02-05">
  <owner>holmer@chromium.org</owner>
  <summary>
    Average video bitrate received during a call, counted from first packet
    received until Call instance is destroyed. Only mesured for calls that are
    at least 10 seconds long.
  </summary>
</histogram>

<histogram name="WebRTC.DataChannelAggregateType"
    enum="DataChannelAggregateType" expires_after="2022-09-11">
  <owner>orphis@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Recorded when a data channel is created. Counts the combination of reliable
    and ordered modes in a data channel.
  </summary>
</histogram>

<histogram name="WebRTC.DataChannelCounters" enum="DataChannelCounters"
    expires_after="2022-11-13">
  <owner>orphis@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Recorded when a data channel is created. Counts a few main attributes of
    data channels. Expired in April 2020. Revived in M93.
  </summary>
</histogram>

<histogram name="WebRTC.DataChannelMaxPacketLifeTime" units="ms"
    expires_after="2022-06-30">
  <owner>orphis@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Recorded when a data channel is created. The length of the time window
    during which transmissions and retransmissions may occur in unreliable mode.
    It is set to the value used in the configuration when a RTCDataChannel is
    created.
  </summary>
</histogram>

<histogram name="WebRTC.DataChannelMaxRetransmits" units="units"
    expires_after="2022-06-30">
  <owner>orphis@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Recorded when a data channel is created. The maximum number of
    retransmissions that are attempted in unreliable mode. It is set to the
    value used in the configuration when a RTCDataChannel is created. Expired in
    M86. Revived in M93.
  </summary>
</histogram>

<histogram name="WebRTC.DataChannelSctpErrorCode"
    enum="DataChannelSctpErrorCode" expires_after="2022-11-13">
  <owner>orphis@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Recorded when a data channel is closed unexpectedly and the error event is
    dispatched. Contains the SCTP error code signaled by the transport.
  </summary>
</histogram>

<histogram name="WebRTC.DesktopCapture.FrameIsRefresh.{CapturerType}"
    units="boolean" expires_after="2024-04-04">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    A boolean is recorded to this histogram for each provided video frame where
    the desktop media source is given by {CapturerType}. Sampled as true if the
    provided frame is a results of a client/sink asking for a refresh frame
    using the RequestRefreshFrame() API, and sampled as false when the captured
    frame is newly captured frame not explicitly requested by the client/sink.
    Very few frames are expected to be marked as refresh frames.
  </summary>
  <token key="CapturerType" variants="CapturerType"/>
</histogram>

<histogram name="WebRTC.DesktopCapture.FrameRate.{CapturerType}" units="fps"
    expires_after="2024-05-30">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    An integer value is recorded to this histogram for each captured video frame
    where the desktop media source is of type {CapturerType}. The value is an
    estimation of the current frame capture rate and the unit is in frames per
    second.
  </summary>
  <token key="CapturerType" variants="CapturerType"/>
</histogram>

<histogram name="WebRTC.DesktopCapture.IsZeroHzActive.{CapturerType}"
    enum="BooleanActive" expires_after="2024-02-03">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    A boolean is recorded to this histogram for each captured video frame where
    the desktop media source is given by {CapturerType}. Only recorded for
    capturers that support detection of whether 0Hz is active or not which
    requires that each captured frame must contain a representation of what
    regions have been updated since the last frame. Windows WGC is an example of
    a capturer which does not support this.
  </summary>
  <token key="CapturerType" variants="CapturerType"/>
</histogram>

<histogram name="WebRTC.DesktopCapture.RefreshRate.{CapturerType}" units="fps"
    expires_after="2024-05-30">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    An integer value is recorded to this histogram each time a client requests a
    refresh frame using the RequestRefrestFrame() API where the desktop media
    source is of type {CapturerType}. The value is an estimation of the current
    refresh-frame rate and the unit is in frames per second.
  </summary>
  <token key="CapturerType" variants="CapturerType"/>
</histogram>

<histogram name="WebRTC.DesktopCapture.Win.DesktopCapturerImpl"
    enum="WebRtcDesktopCapturerImpl" expires_after="2024-02-25">
  <owner>alcooper@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>edgecapabilitiesdev@microsoft.com</owner>
  <summary>
    This measures the frequency of use for each desktop capturer implementation,
    allowing us to measure the adoption of the WGC capturer.
  </summary>
</histogram>

<histogram name="WebRTC.DesktopCapture.Win.DirectXCapturerResult"
    enum="WebRtcDirectXCapturerResult" expires_after="2024-02-02">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    This records high level errors, or success, encountered across the entire
    capture flow in the DirectX (DXGI) based capturer. Is recorded every time a
    new video frame is captured using DXGI. Only recorded on Windows.
  </summary>
</histogram>

<histogram name="WebRTC.DesktopCapture.Win.DirectXCursorEmbedded"
    enum="BooleanActive" expires_after="2024-03-21">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    A boolean is recorded to this histogram for each captured video frame where
    the desktop media source is the full screen and a change has been detected
    in the mouse cursor position. The value is true when the cursor pointer is
    embedded in the captured desktop image and false if not. It is expected that
    most display adapters will report false. Only recorded when DirectX (DXGI)
    is used on Windows.
  </summary>
</histogram>

<histogram name="WebRTC.DesktopCapture.Win.WgcCapturerResult"
    enum="WebRtcWgcCapturerResult" expires_after="2024-01-14">
  <owner>alcooper@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>edgecapabilitiesdev@microsoft.com</owner>
  <summary>
    This records high level errors, or success, encountered across the entire
    capture flow in the WGC based capturer.
  </summary>
</histogram>

<histogram name="WebRTC.DesktopCapture.Win.WgcCaptureSessionGetFrameResult"
    enum="WebRtcWgcCaptureSessionGetFrameResult" expires_after="2024-01-21">
  <owner>alcooper@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>edgecapabilitiesdev@microsoft.com</owner>
  <summary>
    This records the result from retrieving a frame from the WGC based capturer.
  </summary>
</histogram>

<histogram name="WebRTC.DesktopCapture.Win.WgcCaptureSessionStartResult"
    enum="WebRtcWgcCaptureSessionStartResult" expires_after="2024-01-14">
  <owner>alcooper@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>edgecapabilitiesdev@microsoft.com</owner>
  <summary>
    This records the result from starting up the WGC based capturer.
  </summary>
</histogram>

<histogram name="WebRTC.DesktopCapture.Win.{Capturer}CapturerFrameTime"
    units="ms" expires_after="2024-03-10">
  <owner>alcooper@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>edgecapabilitiesdev@microsoft.com</owner>
  <summary>This measures the performance of the {Capturer} capturer.</summary>
  <token key="Capturer">
    <variant name="DirectX" summary="DirectX based"/>
    <variant name="Magnifier" summary="Magnifier based"/>
    <variant name="ScreenGdi" summary="GDI based screen"/>
    <variant name="Wgc" summary="WGC based"/>
    <variant name="WindowGdi" summary="GDI based window"/>
  </token>
</histogram>

<histogram name="WebRTC.DesktopCaptureCounters" enum="DesktopCaptureCounters"
    expires_after="2024-02-11">
  <owner>toprice@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Counters on creation of DesktopCaptureDevice and the first capture call.
  </summary>
</histogram>

<histogram name="WebRTC.ICE.TcpSocketWriteErrorCode" enum="SocketErrorCode"
    expires_after="M77">
  <owner>zhihuang@chromium.org</owner>
  <summary>
    Counters on different types of TCP socket error code. Collected when we hit
    the error code when writing.
  </summary>
</histogram>

<histogram name="WebRTC.MediaStreamDevices.HasPanTiltZoomCamera"
    enum="BooleanAvailable" expires_after="2022-04-24">
  <obsolete>
    Removed 03/2022.
  </obsolete>
  <owner>reillyg@chromium.org</owner>
  <owner>device-dev@chromium.org</owner>
  <summary>
    Records whether a user would potentially see a permission prompt for moving
    the camera. It is recorded when showing a camera permission prompt
    regardless of whether or not the site requested camera movement.
  </summary>
</histogram>

<histogram name="WebRTC.P2P.UDP.BatchingNumberOfReceivedPackets"
    units="packets/batching" expires_after="2024-03-31">
  <owner>handellm@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    This histogram logs how many received UDP packets are batched in a single
    P2PSocketClient IPC. This is recorded every time the batched received
    packets transmit over IPC.
  </summary>
</histogram>

<histogram name="WebRTC.P2P.UDP.BatchingNumberOfSentPackets"
    units="packets/batching" expires_after="2024-03-31">
  <owner>handellm@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    This histogram logs how many sent UDP packets are batched in a single
    P2PSocket IPC. This is recorded every time a batch is transmitted over IPC.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.AddIceCandidate"
    enum="AddIceCandidateResult" expires_after="2024-03-03">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Outcomes of adding ICE candidates to a PeerConnection. Used to check the
    theory that failures in candidate addition are ignored by applications.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.BundlePolicy"
    enum="PeerConnectionBundlePolicy" expires_after="2024-03-03">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Determines whether BUNDLE is configured. Recorded during the first DTLS
    connection establishment. Values are specified in
    https://w3c.github.io/webrtc-pc/#dom-rtcbundlepolicy

    Warning: This histogram was expired from 2022-08-28 to 2022-10-10. Data may
    be missing.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.BundleUsage"
    enum="PeerConnectionBundleUsage" expires_after="2024-03-03">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Determines whether BUNDLE is used in remote offers or answers. Recorded
    during setRemoteDescription calls. Distinguishes between simple, complex,
    datachannel-only and legacy plan-b usage.

    Warning: This histogram was expired from 2022-08-28 to 2022-10-10. Data may
    be missing.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.CandidatePairType{IPProtocolType}"
    enum="IceCandidatePairTypes" expires_after="2024-06-15">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <owner>phancke@microsoft.com</owner>
  <summary>
    Counters of various ICE Endpoint types. These values are logged for the
    first selected candidate pair of a PeerConnection. {IPProtocolType} Warning:
    this histogram was expired from 2020-04-05 to 2023-06-16; data may be
    missing.
  </summary>
  <token key="IPProtocolType" variants="IPProtocolType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.PeerConnection.CandidatePoolUsage.{BundlePolicy}"
    units="components" expires_after="2022-07-01">
  <obsolete>
    This measurement showed that numbers higher than 1 are in frequent use for
    all policies. Experiment is no longer needed.
  </obsolete>
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Measures the configured ice candidate poolsize for the {BundlePolicy}
    bundlePolicy:
    https://w3c.github.io/webrtc-pc/#dom-rtcconfiguration-icecandidatepoolsize
    Recorded during the first DTLS connection establishment. See also
    WebRTC.PeerConnection.BundlePolicy.
  </summary>
  <token key="BundlePolicy">
    <variant name="Balanced"/>
    <variant name="MaxBundle"/>
    <variant name="MaxCompat"/>
  </token>
</histogram>

<histogram name="WebRTC.PeerConnection.ConnectionState"
    enum="IceConnectionStates" expires_after="2024-03-03">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Counters of ICE Connection states. These values are logged when the
    PeerConnection gets into that state for the first time or after the ICE
    restart.

    Warning: This histogram was expired from 2022-08-21 to 2022-10-29. Data may
    be missing.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.DtlsHandshakeError"
    enum="DtlsHandshakeError" expires_after="M81">
  <owner>zhihuang@chromium.org</owner>
  <summary>
    Records the error whenever the Dtls handshake fails. There are only two
    types of errors, incompatitable cipher suite and unknown error, for now.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.Duration.Network" units="microseconds"
    expires_after="2024-03-10">
  <owner>handellm@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Duration between the moment the WebRTC network thread's JingleThreadWrapper
    begins running a task and the moment it ends executing it. It only measures
    durations of tasks posted to rtc::Thread. Samples are acquired periodically
    every several seconds by JingleThreadWrapper.

    Warning: This metric does not include reports from clients with
    low-resolution clocks (i.e. on Windows, ref.
    |TimeTicks::IsHighResolution()|).
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.Duration.Signaling" units="microseconds"
    expires_after="2024-03-17">
  <owner>handellm@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Duration between the moment the WebRTC signaling thread's
    JingleThreadWrapper begins running a task and the moment it ends executing
    it. It only measures durations of tasks posted to rtc::Thread. Samples are
    acquired periodically every several seconds by JingleThreadWrapper.

    Warning: This metric does not include reports from clients with
    low-resolution clocks (i.e. on Windows, ref.
    |TimeTicks::IsHighResolution()|). solution.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.Duration.Worker" units="microseconds"
    expires_after="2024-03-10">
  <owner>handellm@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Duration between the moment the WebRTC worker thread's JingleThreadWrapper
    begins running a task and the moment it ends executing it. It only measures
    durations of tasks posted to rtc::Thread. Samples are acquired periodically
    every several seconds by JingleThreadWrapper.

    Warning: This metric does not include reports from clients with
    low-resolution clocks (i.e. on Windows, ref.
    |TimeTicks::IsHighResolution()|).
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.IceRegatheringReason"
    enum="IceRegatheringReason" expires_after="M77">
  <owner>honghaiz@chromium.org</owner>
  <summary>Records the reasons for ICE re-gathering.</summary>
</histogram>

<histogram name="WebRTC.PeerConnection.IceRestartState" enum="IceRestartState"
    expires_after="M77">
  <owner>honghaiz@chromium.org</owner>
  <summary>
    Records the transport channel states when ICE restart happens.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.IceServers.{MeasuredAt}" units="servers"
    expires_after="2023-04-15">
  <obsolete>
    Removed 10/2022.
  </obsolete>
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Records the number of configured ICE servers when the peerconnection is
    created or gets connected, depending on {MeasuredAt}.
  </summary>
  <token key="MeasuredAt">
    <variant name="Configured"/>
    <variant name="Connected"/>
  </token>
</histogram>

<histogram name="WebRTC.PeerConnection.IPMetrics" enum="PeerConnectionCounters"
    expires_after="2024-06-15">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <owner>phancke@microsoft.com</owner>
  <summary>
    Counters on IPv4 and IPv6 usage in PeerConnection. These values are logged
    once per PeerConnection. Warning: this histogram was expired from M81 to
    2023-06-16; data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.IPv4Interfaces" units="units"
    expires_after="2024-05-01">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Number of IPv4 network interfaces discovered in a PeerConnection Session.

    Warning: This histogram was expired from M81 to M110 Canary (2022-10-29).
    Data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.IPv6Interfaces" units="units"
    expires_after="2024-05-01">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Number of IPv6 network interfaces discovered in a PeerConnection Session.

    Warning: This histogram was expired from M81 to M110 Canary (2022-10-29).
    Data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.KeyProtocol"
    enum="PeerConnectionKeyProtocol" expires_after="2022-10-30">
  <obsolete>
    The SDES protocol is no longer available in Chrome as of M98. DTLS is the
    only possible value.
  </obsolete>
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    What key exchange protocol (DTLS or SDES) is used to establish the crypto
    keys for a PeerConnection's RTP transport. Note: This histogram was expired
    after M82, and resurrected in M89.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.Latency.Network" units="microseconds"
    expires_after="2024-03-10">
  <owner>handellm@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Latency defined as the duration between the moment a task is scheduled from
    the WebRTC network thread's JingleThreadWrapper's task runner, and the
    moment it begins running. Samples are acquired periodically every several
    seconds by JingleThreadWrapper.

    Warning: This metric does not include reports from clients with
    low-resolution clocks (i.e. on Windows, ref.
    |TimeTicks::IsHighResolution()|).
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.Latency.Signaling" units="microseconds"
    expires_after="2024-03-10">
  <owner>handellm@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Latency defined as the duration between the moment a task is scheduled from
    the WebRTC signaling thread's JingleThreadWrapper's task runner, and the
    moment it begins running. Samples are acquired periodically every several
    seconds by JingleThreadWrapper.

    Warning: This metric does not include reports from clients with
    low-resolution clocks (i.e. on Windows, ref.
    |TimeTicks::IsHighResolution()|).
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.Latency.Worker" units="microseconds"
    expires_after="2024-03-17">
  <owner>handellm@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Latency defined as the duration between the moment a task is scheduled from
    the WebRTC worker thread's JingleThreadWrapper's task runner, and the moment
    it begins running. Samples are acquired periodically every several seconds
    by JingleThreadWrapper.

    Warning: This metric does not include reports from clients with
    low-resolution clocks (i.e. on Windows, ref.
    |TimeTicks::IsHighResolution()|).
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.Mid.Size" units="characters"
    expires_after="2022-11-29">
  <obsolete>
    Removed 12/2022.
  </obsolete>
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Records the length of the SDP mid attribute in order to limit its length to
    16 characters.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.ProvisionalAnswer"
    enum="PeerConnectionProvisionalAnswer" expires_after="2024-02-08">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Whether provisional answers are used. Recorded during the first DTLS
    connection establishment.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.RtcpMux" enum="PeerConnectionRtcpMux"
    expires_after="2024-02-20">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Whether RTCP-mux is used for the PeerConnection (both the local and remote
    description enable RTCP-mux). Recorded after SetLocalDescription and
    SetRemoteDescription are called, once per PeerConnection.

    Warning: This histogram was expired from 2020-02-23 to 2022-10-10. Data may
    be missing.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.RtcpMuxPolicy"
    enum="PeerConnectionRtcpMux" expires_after="2023-12-11">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <owner>phancke@microsoft.com</owner>
  <summary>
    Which RTCPMuxPolicy was requested for the PeerConnection. Recorded during
    the first DTLS connection establishment.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpComplexUsage.CreateAnswer"
    enum="PeerConnectionSdpUsageCategory" expires_after="2022-05-07">
  <obsolete>
    Removed 04/2022.
  </obsolete>
  <owner>hbos@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The SDP usage category (&quot;safe&quot;, &quot;unsafe&quot; or
    &quot;unknown&quot;) of createAnswer(). Using complex SDP without explicitly
    specifying the sdpSemantics is considered unsafe in this context because
    such usage is sensitive to the rollout of a different default SDP semantic.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpComplexUsage.CreateOffer"
    enum="PeerConnectionSdpUsageCategory" expires_after="2022-05-07">
  <obsolete>
    Removed 04/2022.
  </obsolete>
  <owner>hbos@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The SDP usage category (&quot;safe&quot;, &quot;unsafe&quot; or
    &quot;unknown&quot;) of createOffer(). Using complex SDP without explicitly
    specifying the sdpSemantics is considered unsafe in this context because
    such usage is sensitive to the rollout of a different default SDP semantic.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpComplexUsage.SetLocalAnswer"
    enum="PeerConnectionSdpUsageCategory" expires_after="2022-05-07">
  <obsolete>
    Removed 04/2022.
  </obsolete>
  <owner>hbos@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The SDP usage category (&quot;safe&quot;, &quot;unsafe&quot; or
    &quot;unknown&quot;) of setLocalDescription(answer). Using complex SDP
    without explicitly specifying the sdpSemantics is considered unsafe in this
    context because such usage is sensitive to the rollout of a different
    default SDP semantic.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpComplexUsage.SetLocalOffer"
    enum="PeerConnectionSdpUsageCategory" expires_after="2022-05-07">
  <obsolete>
    Removed 04/2022.
  </obsolete>
  <owner>hbos@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The SDP usage category (&quot;safe&quot;, &quot;unsafe&quot; or
    &quot;unknown&quot;) of setLocalDescription(offer). Using complex SDP
    without explicitly specifying the sdpSemantics is considered unsafe in this
    context because such usage is sensitive to the rollout of a different
    default SDP semantic.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpComplexUsage.SetRemoteAnswer"
    enum="PeerConnectionSdpUsageCategory" expires_after="2022-05-07">
  <obsolete>
    Removed 04/2022.
  </obsolete>
  <owner>hbos@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The SDP usage category (&quot;safe&quot;, &quot;unsafe&quot; or
    &quot;unknown&quot;) of setRemoteDescription(answer). Using complex SDP
    without explicitly specifying the sdpSemantics is considered unsafe in this
    context because such usage is sensitive to the rollout of a different
    default SDP semantic.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpComplexUsage.SetRemoteOffer"
    enum="PeerConnectionSdpUsageCategory" expires_after="2022-05-07">
  <obsolete>
    Removed 04/2022.
  </obsolete>
  <owner>hbos@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The SDP usage category (&quot;safe&quot;, &quot;unsafe&quot; or
    &quot;unknown&quot;) of setRemoteDescription(offer). Using complex SDP
    without explicitly specifying the sdpSemantics is considered unsafe in this
    context because such usage is sensitive to the rollout of a different
    default SDP semantic.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpFormatReceived"
    enum="PeerConnectionSdpFormatReceived" expires_after="2022-10-30">
  <obsolete>
    Removed 09/2022.
  </obsolete>
  <owner>steveanton@chromium.org</owner>
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    What SDP format is received in the remote offer. The value &quot;no
    tracks&quot; means that no audio or video tracks were received. The value
    &quot;simple&quot; means that at most one audio and at most one video track
    was received. The value &quot;complex&quot; means that more than one audio
    or more than one video track was received, and how this was signaled is
    indicated (&quot;Plan B&quot; meaning with a=ssrc lines within the same m=
    section and &quot;Unified Plan&quot; meaning with a separate m= section).
    This is recorded when calling setRemoteDescription with an SDP Offer.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpFormatReceivedAnswer"
    enum="PeerConnectionSdpFormatReceived" expires_after="2022-11-13">
  <obsolete>
    Removed 09/2022.
  </obsolete>
  <owner>steveanton@chromium.org</owner>
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    What SDP format is received in the remote answer. See
    WebRTC.PeerConnection.SdpFormatReceived for the description of the values.
    This is recorded when calling setRemoteDescription with an SDP Answer.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SdpSemanticNegotiated"
    enum="PeerConnectionSdpSemanticNegotiated" expires_after="2023-01-15">
  <obsolete>
    Removed 09/2022.
  </obsolete>
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    What SDP semantic (Unified Plan or Plan B) was detected when completing
    negotiation of a PeerConnection. This is recorded when accepting an SDP
    Answer. The value &quot;mixed&quot; means that the accepted answer included
    both types of marker in the SDP. The value &quot;none&quot; will happen when
    the answerer sends no media.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.Simulcast.NumberOfSendEncodings"
    units="units" expires_after="2020-08-30">
  <owner>amithi@chromium.org</owner>
  <summary>
    Counts the number of send encodings given to PeerConnection::AddTransceiver.
    This histogram will be used to understand if and how the API is used.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SpeedLimit" units="%"
    expires_after="2024-02-25">
  <owner>handellm@google.com</owner>
  <owner>hbos@chromium.org</owner>
  <summary>
    Measures computer speed limit state, sampled every 60s when a PeerConnection
    is open. The value indicates the current operating point in percent of the
    nominal capacity of the CPUs. The computer decreases the capacity during
    thermal overload events.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SrtcpUnprotectError"
    enum="SrtpErrorCode" expires_after="never">
<!-- expires-never: Needed for long-term tracking of the ecosystem. -->

  <owner>steveanton@chromium.org</owner>
  <summary>
    What error code is reported by libsrtp when failing to unprotect an incoming
    SRTCP (secured media control) packet.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SrtpUnprotectError" enum="SrtpErrorCode"
    expires_after="never">
<!-- expires-never: Needed for long-term tracking of the ecosystem. -->

  <owner>steveanton@chromium.org</owner>
  <summary>
    What error code is reported by libsrtp when failing to unprotect an incoming
    SRTP (secured media) packet.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.SslCipherSuite{WebRTCMediaType}"
    enum="SSLCipherSuite" expires_after="never">
<!-- expires-never: This is useful for deprecating old cipher suites; the
       need for this can occur at long intervals. -->

  <owner>hta@google.com</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Counters on the type of SSL cipher suites used by WebRTC. This is collected
    whenever the transport signals the OnCompleted event. {WebRTCMediaType}
  </summary>
  <token key="WebRTCMediaType" variants="WebRTCMediaType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.PeerConnection.ThermalState" enum="ThermalState"
    expires_after="2024-03-17">
  <owner>eshr@google.com</owner>
  <owner>hbos@chromium.org</owner>
  <summary>
    Measures computer thermal state, sampled every 60s when a PeerConnection is
    open with a video sender. Most quick toggles between thermal states are thus
    not sampled, but thermal states are generally stable so these toggles should
    be rare.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.ThermalThrottling" units="boolean"
    expires_after="2024-02-25">
  <owner>handellm@google.com</owner>
  <owner>hbos@chromium.org</owner>
  <summary>
    Sampled every 60s when the peer connection is open. True when the computer's
    speed limit is between 0 and 99 inclusively, false otherwise.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.ThermalThrottlingEpisodes" units="count"
    expires_after="2024-02-25">
  <owner>handellm@google.com</owner>
  <owner>hbos@chromium.org</owner>
  <summary>
    The number of thermal throttling episodes the peer connection encountered.
    Reported when the peer connection is torn down if the peer connection had at
    least one track.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.UsagePattern"
    enum="WebRtcPeerConnectionUsagePattern" expires_after="2023-11-12">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Capsule history of a WebRTC PeerConnection, encoded as a sequence of bits
    encapsulated in an integer. Only a few values will be deemed interesting,
    but the interesting values may change over time.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.ValidBundledPayloadTypes"
    units="boolean" expires_after="2024-02-11">
  <owner>hbos@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <owner>phancke@microsoft.com</owner>
  <summary>
    Measures whether the remote description contains a payload type collision
    that is not allowed by the IETFs BUNDLE specification. Enforcing this would
    allow simplifying the statistics collector. Recorded for every remote
    description.
  </summary>
</histogram>

<histogram name="WebRTC.PeerConnection.ValidIceChars" units="boolean"
    expires_after="2024-02-04">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <owner>phancke@microsoft.com</owner>
  <summary>
    Measures whether the ice-ufrag/ice-pwd consists of characters allowed by the
    specification. Currently some characters outside the range are allowed for
    backward compability with deployed software. Recorded during the first DTLS
    connection establishment.
  </summary>
</histogram>

<histogram name="WebRTC.ReceivedAudioTrackDuration" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>handellm@chromium.org</owner>
  <owner>hta@chromium.org</owner>
  <summary>
    Durations of audio tracks received over a PeerConnection. The stopwatch
    starts when the track first becomes connected, and ends when it is
    disconnected or very soon thereafter. Warning: this histogram was expired
    between 2023-04-02 to 2023-04-19; data may be missing.
  </summary>
</histogram>

<histogram name="WebRTC.ReceivedVideoTrackDuration" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>handellm@chromium.org</owner>
  <owner>hta@chromium.org</owner>
  <summary>
    Durations of video tracks received over a PeerConnection. The stopwatch
    starts when the track first becomes connected, and ends when it is
    disconnected or very soon thereafter. Warning: this histogram was expired
    from 2022-11-27 to 2022-12-10 and from 2023-04-02 to 2023-04-19; data may be
    missing.
  </summary>
</histogram>

<histogram name="WebRTC.ReliableDataChannelMessageSize" units="bytes"
    expires_after="2022-10-23">
  <owner>perkj@chromium.org</owner>
  <summary>
    Sizes of messages sent over reliable data channels. The size of an
    individual message is added to the histogram as a sample immediately when a
    message is sent.
  </summary>
</histogram>

<histogram name="WebRTC.ScreenCaptureTime" units="ms"
    expires_after="2020-10-18">
  <owner>jiayl@chromium.org</owner>
  <summary>Time for capturing one frame in screen capturing.</summary>
</histogram>

<histogram name="WebRTC.Screenshare.DesktopCapturerFullscreenDetector"
    units="boolean" expires_after="2024-02-01">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Tracks the usage of the WebRTC Fullscreen Detector. The Fullscreen Detector
    is used when capturing presentation applications such as PowerPoint. If the
    editor window is captured and a slideshow is started in fullscreen mode, the
    Fullscreen Detector will automatically change so that the fullscreen window
    is captured. Once the slideshow stops, the editor will be captured again.
    This is recorded the first time this feature is activated, but only once per
    screensharing session.
  </summary>
</histogram>

<histogram name="WebRTC.Screenshare.ZeroHz.TimeUntilFirstFrameMs" units="ms"
    expires_after="2024-02-04">
  <owner>handellm@google.com</owner>
  <owner>ilnik@chromium.org</owner>
  <summary>
    The number of milliseconds from the point a zero-Hz frame cadence adapter is
    created until the first frame arrives from a connected source.
  </summary>
</histogram>

<histogram name="WebRTC.SentAudioTrackDuration" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>handellm@chromium.org</owner>
  <owner>hta@chromium.org</owner>
  <summary>
    Durations of audio tracks sent over a PeerConnection. The stopwatch starts
    when the track first becomes connected, and ends when it is disconnected or
    very soon thereafter.
  </summary>
</histogram>

<histogram name="WebRTC.SentVideoTrackDuration" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>handellm@chromium.org</owner>
  <owner>hta@chromium.org</owner>
  <summary>
    Durations of video tracks sent over a PeerConnection. The stopwatch starts
    when the track first becomes connected, and ends when it is disconnected or
    very soon thereafter.
  </summary>
</histogram>

<histogram name="WebRTC.Stun.BatchSuccessPercent{NatType}" units="%"
    expires_after="M85">
  <owner>qingsi@google.com</owner>
  <owner>jeroendb@google.com</owner>
  <summary>
    For clients using a shared source port per STUN binding request toward the
    specified servers, success rate for requests which received a response with
    various intervals between requests. Only the first instance of renderers
    will conduct the trial and log this result. The STUN binding requests are
    grouped into multiple batches and the success rate is calculated for an
    individual batch. {NatType}
  </summary>
  <token key="NatType" variants="NatType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Stun.Integrity.{StunPacketType}"
    enum="WebRtcStunIntegrityOutcome" expires_after="2024-04-07">
  <owner>hta@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Records outcome of integrity checks for STUN requests. This is used in
    investigation of crbug.com/1177125, in order to figure out if it is safe to
    turn on checking of these attributes.
  </summary>
  <token key="StunPacketType">
    <variant name="ErrorResponse.BadRequest"/>
    <variant name="ErrorResponse.ErrorOther"/>
    <variant name="ErrorResponse.GlobalFailure"/>
    <variant name="ErrorResponse.NoErrorAttribute"/>
    <variant name="ErrorResponse.ServerError"/>
    <variant name="ErrorResponse.StaleNonce"/>
    <variant name="ErrorResponse.TryAlternate"/>
    <variant name="ErrorResponse.Unauthorized"/>
    <variant name="ErrorResponse.UnknownAttribute"/>
    <variant name="Indication"/>
    <variant name="Request"/>
    <variant name="Response"/>
  </token>
</histogram>

<histogram name="WebRTC.Stun.ResponseLatency{NatType}" units="ms"
    expires_after="M85">
  <owner>qingsi@google.com</owner>
  <owner>jeroendb@google.com</owner>
  <summary>
    For clients using a shared source port per STUN binding request, average RTT
    for requests which received a response with various intervals between
    requests. Only the first instance of renderers will conduct the trial and
    log this result. {NatType}
  </summary>
  <token key="NatType" variants="NatType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Stun.SuccessPercent{NatType}" units="%"
    expires_after="M85">
  <owner>qingsi@google.com</owner>
  <owner>jeroendb@google.com</owner>
  <summary>
    For clients using a shared source port per STUN binding request, success
    rate for requests which received a response with various intervals between
    requests. Only the first instance of renderers will conduct the trial and
    log this result. {NatType}
  </summary>
  <token key="NatType" variants="NatType">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.UnreliableDataChannelMessageSize" units="bytes"
    expires_after="2022-10-23">
  <owner>perkj@chromium.org</owner>
  <summary>
    Sizes of messages sent over unreliable data channels. The size of an
    individual message is added to the histogram as a sample immediately when a
    message is sent.
  </summary>
</histogram>

<histogram name="WebRTC.UserMediaRequest.NoResultState"
    enum="MediaStreamRequestState" expires_after="2023-12-24">
  <owner>andresp@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <owner>benjaminwagner@google.com</owner>
  <summary>
    The state of a UserMediaRequest when it gets destroyed before having a
    result. Warning: this histogram was expired from M77 to M108(excluded); data
    may be missing.

    Note: &quot;Explicitly Cancelled&quot; means
    MediaStreamImpl::cancelUserMediaRequest was called and not necessarily that
    the user cancelled. Those are likely tracked as UserMediaRequest with a
    result of permission denied.
  </summary>
</histogram>

<histogram name="WebRTC.UserMediaRequest.Result2"
    enum="MediaStreamRequestResult2" expires_after="2024-03-03">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <summary>
    Counters for UserMediaRequests results such as failure reasons. The standard
    specification error names are in parenthesis.
  </summary>
</histogram>

<histogram name="WebRTC.Video.AdaptChangesPerMinute{VideoAdaptationReason}"
    units="changes/minute" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average number of adaptation changes per minute for a sent video stream.
    Recorded when a stream is removed. {VideoAdaptationReason}
  </summary>
  <token key="VideoAdaptationReason">
    <variant name=""/>
    <variant name=".Cpu" summary="Adapt reason: CPU."/>
    <variant name=".Quality" summary="Adapt reason: quality."/>
  </token>
</histogram>

<histogram name="WebRTC.Video.AverageRoundTripTimeInMilliseconds" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>holmer@chromium.org</owner>
  <summary>
    The average round-trip time of a WebRTC call in milliseconds. Recorded when
    a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.AVSyncOffsetInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The absolute value of the sync offset between a rendered video frame and the
    latest played audio frame is measured per video frame. The average offset
    per received video stream is recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.BandwidthLimitedResolutionInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of sent frames that are limited in resolution due to bandwidth
    for a sent video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.BandwidthLimitedResolutionsDisabled"
    units="disabled resolutions" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    For frames that are limited in resolution due to bandwidth, the average
    number of disabled resolutions is recorded for a sent video stream. Recorded
    when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.BitrateReceivedInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of received bits per second for a received video stream. Recorded
    when a stream is removed. The total number of bytes is divided by the time
    the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.BitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent bits per second for a sent video stream. Recorded when a
    stream is removed. The total number of bytes is divided by the time the
    video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.CpuLimitedResolutionInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of frames that are limited in resolution due to CPU for a sent
    video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.CurrentDelayInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Average current delay for a received video stream. This is the actual delay
    imposed on frames (where the goal is to reach the target delay (see
    WebRTC.Video.TargetDelayInMs)). Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Decoded.Vp8.Qp{WebRTCVideoExperimentGroupId}"
    units="qp value" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average QP (quantizer value) per frame for a received VP8 video stream.
    Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.DecodedFramesPerSecond" units="fps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of decoded frames per second for a received video stream.
    Recorded when a stream is removed. The total number of frames is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.DecodeTimeInMs" units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average decode time per frame for a received video stream. Recorded when
    a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.DelayedFramesToRenderer" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of delayed frames to renderer for a received video stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.DelayedFramesToRenderer_AvgDelayInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average delay of delayed frames to renderer for a received video stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.DroppedFrames.Capturer" units="frames"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped by a capturer for a sent video stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.DroppedFrames.Encoder" units="frames"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped by an encoder's internal rate limiter for a
    sent video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.DroppedFrames.EncoderQueue" units="frames"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped because encoder queue is full for a sent
    video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.DroppedFrames.Ratelimiter" units="frames"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped by a WebRTC rate limiter (in MediaOpt) for a
    sent video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.DroppedFrames.Receiver" units="frames"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped by a WebRTC on the receive side because they
    are incomplete or undecodable.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Encoded.Qp{VideoEncodedQpStats}" units="qp value"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average QP (quantizer value) per frame for a sent video stream. Recorded
    when a stream is removed. {VideoEncodedQpStats}
  </summary>
  <token key="VideoEncodedQpStats">
    <variant name=""/>
    <variant name=".H264"
        summary="Video codec: H264. QP range: 0-51. No spatial layers."/>
    <variant name=".Vp8"
        summary="Video codec: VP8. QP range: 0-127. Single stream sent."/>
    <variant name=".Vp8.S0"
        summary="Video codec: VP8. QP range: 0-127. Spatial index 0."/>
    <variant name=".Vp8.S1"
        summary="Video codec: VP8. QP range: 0-127. Spatial index 1."/>
    <variant name=".Vp8.S2"
        summary="Video codec: VP8. QP range: 0-127. Spatial index 2."/>
    <variant name=".Vp9"
        summary="Video codec: VP9. QP range: 0-255. No spatial layers."/>
    <variant name=".Vp9.S0"
        summary="Video codec: VP9. QP range: 0-255. Spatial layer 0."/>
    <variant name=".Vp9.S1"
        summary="Video codec: VP9. QP range: 0-255. Spatial layer 1."/>
    <variant name=".Vp9.S2"
        summary="Video codec: VP9. QP range: 0-255. Spatial layer 2."/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Encoder.CodecType" enum="WebRtcVideoCodecs"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Configured video codec for a sent video stream. Recorded when a
    VideoSendStream is destroyed (for streams whose lifetime is longer than 10
    seconds).
  </summary>
</histogram>

<histogram name="WebRTC.Video.EncodeTimeInMs" units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average encode time per frame for a sent video stream. Recorded when a
    stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.EncodingBitrateOvershoot.{WebRtcCodecs}"
    units="%" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The average bitrate overshoot percent for a sent stream. Recorded when a
    stream is removed.
  </summary>
  <token key="WebRtcCodecs">
    <variant name="Av1" summary=""/>
    <variant name="Generic" summary=""/>
    <variant name="H264" summary=""/>
    <variant name="Multiplex" summary=""/>
    <variant name="Vp8" summary=""/>
    <variant name="Vp9" summary=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.EndToEndDelayInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average end-to-end delay per frame for a received video stream. Recorded
    when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="WebRTC.Video.EndToEndDelayMaxInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The maximum end-to-end delay per frame for a received video stream. Recorded
    when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.FecBitrateReceivedInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of received FEC bits per second for a received video stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.FecBitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent FEC bits per second for a sent video stream. Recorded
    when a stream is removed. The total number of bytes is divided by the time
    the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.FirPacketsReceivedPerMinute"
    units="packets/minute" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of received RTCP FIR packets per minute for a sent video stream.
    Recorded when a stream is removed. The total number of packets is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.FirPacketsSentPerMinute" units="packets/minute"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent RTCP FIR packets per minute for a received video stream.
    Recorded when a stream is removed. The total number of packets is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.GenericDecoder.CaptureToEncodeDelay" units="ms"
    expires_after="2023-08-22">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The time it took between a video frame was captured until it started being
    encoded. Recorded on the receiving side when a video frame has been decoded
    using timestamps generated on the sending side if the VideoSendTiming flag
    is set.
  </summary>
</histogram>

<histogram name="WebRTC.Video.GenericDecoder.DecodeDelay" units="ms"
    expires_after="2023-08-22">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The time it took to decode a video frame. Recorded on the receiving side
    when a video frame has been decoded using locally generated timestamps.
  </summary>
</histogram>

<histogram name="WebRTC.Video.GenericDecoder.EncodeDelay" units="ms"
    expires_after="2023-08-22">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The time it took to encode a video frame. Recorded on the receiving side
    when a video frame has been decoded using timestamps generated on the
    sending side if the VideoSendTiming flag is set.
  </summary>
</histogram>

<histogram name="WebRTC.Video.GenericDecoder.JitterBufferDelay" units="ms"
    expires_after="2023-08-22">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total time it took to compensate for network jitter of a video frame.
    Recorded on the receiving side when a video frame has been decoded using
    locally generated timestamps.
  </summary>
</histogram>

<histogram name="WebRTC.Video.GenericDecoder.PacerAndPacketizationDelay"
    units="ms" expires_after="2023-08-22">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The time a video frame spent in the pacer and packetizer before being
    transmitted. Recorded on the receiving side when a video frame has been
    decoded using timestamps generated on the sending side if the
    VideoSendTiming flag is set.
  </summary>
</histogram>

<histogram name="WebRTC.Video.GenericDecoder.PacketReceiveDelay" units="ms"
    expires_after="2023-08-22">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The time it took to receive a full video frame. Recorded on the receiving
    side when a video frame has been decoded using locally generated timestamps.
  </summary>
</histogram>

<histogram name="WebRTC.Video.H264DecoderImpl.Event"
    enum="WebRtcH264DecoderImplEvent" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>hbos@chromium.org</owner>
  <summary>
    The number of |H264DecoderImpl| events, such as an initialization or
    decoding error, that have occurred. At most one Init and one Error is
    reported per |H264DecoderImpl| instance. This is to avoid the same event
    from being reported multiple times (e.g. if there is an error you might
    re-initialize or get a decode error every frame which would otherwise
    pollute the data).
  </summary>
</histogram>

<histogram name="WebRTC.Video.H264EncoderImpl.Event"
    enum="WebRtcH264EncoderImplEvent" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>hbos@chromium.org</owner>
  <summary>
    The number of |H264EncoderImpl| events, such as an initialization or
    encoding error, that have occurred. At most one Init and one Error is
    reported per |H264EncoderImpl| instance. This is to avoid the same event
    from being reported multiple times (e.g. if there is an error you might
    re-initialize or get an encode error every frame which would otherwise
    pollute the data).
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.HardwareDecodedFramesBetweenSoftwareFallbacks{WebRtcCodecs}"
    units="frames" expires_after="2024-02-01">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The number of hardware decoded frames between fallbacks to software decoder
    for a received video stream. {WebRtcCodecs}
  </summary>
  <token key="WebRtcCodecs">
    <variant name=".Av1" summary=""/>
    <variant name=".Generic" summary=""/>
    <variant name=".H264" summary=""/>
    <variant name=".Multiplex" summary=""/>
    <variant name=".Vp8" summary=""/>
    <variant name=".Vp9" summary=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.InputFramesPerSecond" units="fps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of incoming frames per second for a sent video stream. Recorded
    when a stream is removed. The total number of frames is divided by the time
    the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.InputHeightInPixels" units="pixels"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average input height per frame (for incoming frames to video engine) for
    a sent video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.InputWidthInPixels" units="pixels"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average input width per frame (for incoming frames to video engine) for
    a sent video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.InterframeDelay95PercentileInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The 95th percentile of interframe delay for a received video stream.
    Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="WebRTC.Video.InterframeDelayInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average interframe delay for a received video stream. Recorded when a
    stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="WebRTC.Video.InterframeDelayMaxInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The maximum interframe delay for a received video stream. Recorded when a
    stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.JitterBufferDelayInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Average jitter buffer delay for a received video stream. Recorded when a
    stream is removed.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.KeyFramesReceivedInPermille{WebRTCVideoExperimentGroupId}"
    units="permille" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Permille of frames that are key frames for a received video stream. Recorded
    when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.KeyFramesSentInPermille" units="permille"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Permille of frames that are key frames for a sent video stream. Recorded
    when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.MeanFreezeDurationMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average duration of a freeze in video playback. Recorded when a received
    stream is removed or content type changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.MeanTimeBetweenFreezesMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average duration of a smooth video playback. Recorded when a received
    stream is removed or content type changes.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.MediaBitrateReceivedInKbps{WebRTCVideoExperimentGroupId}"
    units="kbps" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of received media payload bits per second for a received video
    stream. Recorded when a stream is removed. The total number of bytes is
    divided by the time the video stream exists. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.MediaBitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent media payload bits per second for a sent video stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.NackPacketsReceivedPerMinute"
    units="packets/minute" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of received RTCP NACK packets per minute for a sent video stream.
    Recorded when a stream is removed. The total number of packets is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.NackPacketsSentPerMinute" units="packets/minute"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent RTCP NACK packets per minute for a received video stream.
    Recorded when a stream is removed. The total number of packets is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.NumberFreezesPerMinute" units="freezes/minute"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ssilkin@chromium.org</owner>
  <summary>
    The number of video freezes per minute for a received video stream. Recorded
    when a stream is removed or content type changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.NumberOfPauseEvents" units="pause events"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of times a video stream has been paused/resumed during a call.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.NumberResolutionDownswitchesPerMinute"
    units="switches/minute" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average number of resolution down-switches per minute for a received
    video stream. Recorded when a stream is removed or content type changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.OnewayDelayInMs" units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Average delay (network delay (rtt/2) + jitter delay + decode time + render
    delay) for a received video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.PaddingBitrateReceivedInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of received padding bits per second for a received video stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.PaddingBitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent padding bits per second for a sent video stream. Recorded
    when a stream is removed. The total number of bytes is divided by the time
    the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.PausedTimeInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of time that the video has been paused for a sent video stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.PliPacketsReceivedPerMinute"
    units="packets/minute" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of received RTCP PLI packets per minute for a sent video stream.
    Recorded when a stream is removed. The total number of packets is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.PliPacketsSentPerMinute" units="packets/minute"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent RTCP PLI packets per minute for a received video stream.
    Recorded when a stream is removed. The total number of packets is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.QualityLimitedResolutionDownscales"
    units="downscales" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    For frames that are downscaled in resolution due to quality, the average
    number of downscales is recorded for a sent video stream. Recorded when a
    stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.QualityLimitedResolutionInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of sent frames that are downscaled in resolution due to quality
    for a sent video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.ReceivedFecPacketsInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of received FEC packets for a received video stream. Recorded
    when a stream is removed.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.ReceivedHeightInPixels{WebRTCVideoExperimentGroupId}"
    units="pixels" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average received height per frame for a received video stream. Recorded
    when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.ReceivedPacketsLostInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of received packets lost for a received video stream. Recorded
    when a stream is removed.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.ReceivedWidthInPixels{WebRTCVideoExperimentGroupId}"
    units="pixels" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average received width per frame for a received video stream. Recorded
    when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.ReceiveStreamLifetimeInSeconds" units="seconds"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The lifetime of a video receive stream. Recorded when a VideoReceiveStream
    instance is destroyed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.RecoveredMediaPacketsInPercentOfFec" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of recovered media packets from FEC packets for a received video
    stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.RenderFramesPerSecond" units="fps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent frames to the renderer per second for a received video
    stream. Recorded when a stream is removed. The total number of frames is
    divided by the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.RenderSqrtPixelsPerSecond" units="pps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of pixels (sqrt(width*height)) of sent frames to the renderer per
    second for a received video stream. Recorded when a stream is removed. The
    total number of pixels is divided by the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.RetransmittedBitrateReceivedInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of retransmitted bits per second for a received video stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.RetransmittedBitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of retransmitted bits per second for a sent video stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.RMSEOfEncodingBitrateInKbps.{WebRtcCodecs}"
    units="kbps" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The RMSE(Root Mean Square Error) between sent bits per second for a sent
    stream and target bitrate set by WebRTC. Recorded when a stream is removed.
  </summary>
  <token key="WebRtcCodecs">
    <variant name="Av1" summary=""/>
    <variant name="Generic" summary=""/>
    <variant name="H264" summary=""/>
    <variant name="Multiplex" summary=""/>
    <variant name="Vp8" summary=""/>
    <variant name="Vp9" summary=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.RtpToNtpFreqOffsetInKhz" units="kHz"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The absolute value of the difference between the estimated frequency during
    RTP timestamp to NTP time conversion and the actual value (i.e. 90 kHz) is
    measured per received video frame. The max offset during 40 second intervals
    is stored. The average of these stored offsets per received video stream is
    recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.RtxBitrateReceivedInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of received bits over RTX per second for a received video stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.RtxBitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent bits over RTX per second for a sent video stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.ScalabilityMode" enum="WebRtcScalabilityMode"
    expires_after="M120">
  <owner>orphis@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Counts usage of each scalability mode used to configure the video senders in
    RTCRtpEncodingParameters from addTransceiver and setParameters APIs. This is
    part of the WebRTC-SVC specification.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.BandwidthLimitedResolutionInPercent"
    units="%" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Percentage of sent frames that are limited in resolution due to bandwidth
    for a sent (screen content) video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.BandwidthLimitedResolutionsDisabled"
    units="disabled resolutions" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    For frames that are limited in resolution due to bandwidth, the average
    number of disabled resolutions is recorded for a sent (screen content) video
    stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.BitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of sent bits per second for a sent screenshare stream. Recorded
    when a stream is removed. The total number of bytes is divided by the time
    the video stream exists.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.Decoded.Vp8.Qp{WebRTCVideoExperimentGroupId}"
    units="qp value" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average QP (quantizer value) per frame for a received VP8 screenshare
    stream. Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.DroppedFrames.Capturer"
    units="frames" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped by a capturer for a sent screenshare stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.DroppedFrames.Encoder" units="frames"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped by an encoder's internal rate limiter for a
    sent screenshare stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.DroppedFrames.EncoderQueue"
    units="frames" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped because encoder queue is full for a sent
    screenshare stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.DroppedFrames.Ratelimiter"
    units="frames" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames dropped by a WebRTC rate limiter (in MediaOpt) for a
    sent screenshare stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.EncodeTimeInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The average encode time per frame for a sent (screen content) video stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.EncodingBitrateOvershoot.{WebRtcCodecs}"
    units="%" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The average bitrate overshoot percent for a sent screenshare stream.
    Recorded when a stream is removed.
  </summary>
  <token key="WebRtcCodecs">
    <variant name="Av1" summary=""/>
    <variant name="Generic" summary=""/>
    <variant name="H264" summary=""/>
    <variant name="Multiplex" summary=""/>
    <variant name="Vp8" summary=""/>
    <variant name="Vp9" summary=""/>
  </token>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.EndToEndDelayInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average end-to-end delay per frame for a received screenshare stream.
    Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.EndToEndDelayMaxInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The maximum end-to-end delay per frame for a received screenshare stream.
    Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.FecBitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of sent FEC bits per second for a sent screenshare stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.FirPacketsReceivedPerMinute"
    units="packets/minute" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of received RTCP FIR packets per minute for a sent screenshare
    stream. Recorded when a stream is removed. The total number of packets is
    divided by the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.FramesPerDrop"
    units="sent/dropped ratio" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Ratio of sent frames to dropped frames at the encoder. The value is reported
    when a stream is removed and is calculated as the total number frames sent
    divided by the number of dropped frames.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.FramesPerOvershoot"
    units="sent/overshoot ratio" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Ratio of sent frames to number of re-encoded frames (due to target bitrate
    overshoot). The value is reported when a stream is removed and is calculated
    as the total number frames sent divided by the number of re-encoded frames.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.InputFramesPerSecond" units="fps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of incoming frames per second for a sent (screen content) video
    stream. Recorded when a stream is removed. The total number of frames is
    divided by the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.InputHeightInPixels" units="pixels"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The average input height per frame (for incoming frames to video engine) for
    a sent (screen content) video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.InputWidthInPixels" units="pixels"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The average input width per frame (for incoming frames to video engine) for
    a sent (screen content) video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.InterframeDelay95PercentileInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The 95th percentile of interframe delay for a received screenshare stream.
    Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.InterframeDelayInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average interframe delay for a received screenshare stream. Recorded
    when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.InterframeDelayMaxInMs{WebRTCVideoExperimentGroupId}"
    units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The maximum interframe delay for a received screenshare stream. Recorded
    when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.KeyFramesReceivedInPermille{WebRTCVideoExperimentGroupId}"
    units="permille" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Permille of frames that are key frames for a received screenshare stream.
    Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.KeyFramesSentInPermille"
    units="permille" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Permille of frames that are key frames for a sent (screen content) video
    stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.Layer0{ScreenshareLayerStats}"
    units="units" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Stats for the lower layer (TL0) of a screenshare stream in conference mode.
    {ScreenshareLayerStats}
  </summary>
  <token key="ScreenshareLayerStats" variants="ScreenshareLayerStats">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.Layer1{ScreenshareLayerStats}"
    units="units" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Stats for the higher layer (TL1) of a screenshare stream in conference mode.
    {ScreenshareLayerStats}
  </summary>
  <token key="ScreenshareLayerStats" variants="ScreenshareLayerStats">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.MeanFreezeDurationMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average duration of a freeze in screenshare playback. Recorded then a
    received stream is removed or content type changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.MeanTimeBetweenFreezesMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average duration of a smooth video playback for screenshare stream.
    Recorded when a received stream is removed or content type changes.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.MediaBitrateReceivedInKbps{WebRTCVideoExperimentGroupId}"
    units="kbps" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The number of received media payload bits per second for a received
    screenshare stream. Recorded when a stream is removed. The total number of
    bytes is divided by the time the video stream exists.
    {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.MediaBitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of sent media payload bits per second for a sent screenshare
    stream. Recorded when a stream is removed. The total number of bytes is
    divided by the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.NackPacketsReceivedPerMinute"
    units="packets/minute" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of received RTCP NACK packets per minute for a sent screenshare
    stream. Recorded when a stream is removed. The total number of packets is
    divided by the time the video stream exists.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.NumberResolutionDownswitchesPerMinute"
    units="switches/minute" expires_after="M88">
  <obsolete>
    Removed 12/2022.
  </obsolete>
  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average number of resolution down-switches per minute for a receive
    screenshare stream. Recorded when a stream is removed or content type
    changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.PaddingBitrateSentInKbps"
    units="kbps" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of sent padding bits per second for a sent screenshare stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.PliPacketsReceivedPerMinute"
    units="packets/minute" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of received RTCP PLI packets per minute for a sent screenshare
    stream. Recorded when a stream is removed. The total number of packets is
    divided by the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.QualityLimitedResolutionDownscales"
    units="downscales" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    For frames that are downscaled in resolution due to quality, the average
    number of downscales is recorded for a sent (screen content) video stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.QualityLimitedResolutionInPercent"
    units="%" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Percentage of sent frames that are downscaled in resolution due to quality
    for a sent (screen content) video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.ReceivedHeightInPixels{WebRTCVideoExperimentGroupId}"
    units="pixels" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average received height per frame for a received screenshare stream.
    Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.ReceivedPacketsLostInPercent"
    units="%" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Percentage of received packets lost for a received screenshare stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.ReceivedWidthInPixels{WebRTCVideoExperimentGroupId}"
    units="pixels" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The average received width per frame for a received screenshare stream.
    Recorded when a stream is removed. {WebRTCVideoExperimentGroupId}
  </summary>
  <token key="WebRTCVideoExperimentGroupId"
      variants="WebRTCVideoExperimentGroupId">
    <variant name=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.ReceiveStreamLifetimeInSeconds"
    units="seconds" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The lifetime of a screenshare receive stream. Recorded when a
    VideoReceiveStream instance is destroyed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.RetransmittedBitrateSentInKbps"
    units="kbps" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of retransmitted bits per second for a sent screenshare stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram
    name="WebRTC.Video.Screenshare.RMSEOfEncodingBitrateInKbps.{WebRtcCodecs}"
    units="kbps" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    The RMSE(Root Mean Square Error) between sent bits per second for a sent
    screenshare stream and target bitrate set by WebRTC. Recorded when a stream
    is removed.
  </summary>
  <token key="WebRtcCodecs">
    <variant name="Av1" summary=""/>
    <variant name="Generic" summary=""/>
    <variant name="H264" summary=""/>
    <variant name="Multiplex" summary=""/>
    <variant name="Vp8" summary=""/>
    <variant name="Vp9" summary=""/>
  </token>
</histogram>

<histogram name="WebRTC.Video.Screenshare.RtxBitrateSentInKbps" units="kbps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The number of sent bits over RTX per second for a sent screenshare stream.
    Recorded when a stream is removed. The total number of bytes is divided by
    the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.SendSideDelayInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The average delay (of average delays) of sent packets for a sent (screen
    content) video stream. Recorded when a stream is removed. The delay is
    measured from a frame is input to video engine until a packet is sent to the
    network. For each sent packet, the average delay of all sent packets over
    the last second is reported. The average of these reported delays is
    recorded.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.SendSideDelayMaxInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The average delay (of max delays) of sent packets for a sent (screen
    content) video stream. Recorded when a stream is removed. The delay is
    measured from a frame is input to video engine until a packet is sent to the
    network. For each sent packet, the maximum delay of all sent packets over
    the last second is reported. The average of these reported delays is
    recorded.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.SentFramesPerSecond" units="fps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The number of sent frames per second for a sent (screen content) video
    stream. Recorded when a stream is removed. The total number of frames is
    divided by the time the video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.SentHeightInPixels" units="pixels"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The average sent height per frame for a sent (screen content) video stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.SentPacketsLostInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Percentage of sent packets lost for a sent screenshare stream. Recorded when
    a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.SentToInputFpsRatioPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Ratio between Screenshare.SentFramesPerSecond and
    Screenshare.InputFramesPerSecond in percents. Recorded when a stream is
    removed. The total number of sent frames is divided by the total number of
    input frames and multiplied by 100.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.SentWidthInPixels" units="pixels"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    The average sent width per frame for a sent (screen content) video stream.
    Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.TimeInBlockyVideoPercentage"
    units="%" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Percentage of time the received screenshare stream playbacks low quality
    blocky video. Recorded when a stream is removed or content type changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.TimeInHdPercentage" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Percentage of time the received screenshare stream playbacks HD resolution.
    Recorded when a stream is removed or content type changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.Screenshare.UniqueNackRequestsReceivedInPercent"
    units="%" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>sprang@chromium.org</owner>
  <summary>
    Percentage of unique RTCP NACK requests that are received in response to a
    sent screenshare stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SendDelayInMs" units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average send delay of sent packets for a sent video stream. Recorded
    when a stream is removed. The delay is measured from a packet is sent to the
    transport until leaving the socket.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SendSideDelayInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average delay (of average delays) of sent packets for a sent video
    stream. Recorded when a stream is removed. The delay is measured from a
    frame is input to video engine until a packet is sent to the network. For
    each sent packet, the average delay of all sent packets over the last second
    is reported. The average of these reported delays is recorded.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SendSideDelayMaxInMs" units="ms"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average delay (of max delays) of sent packets for a sent video stream.
    Recorded when a stream is removed. The delay is measured from a frame is
    input to video engine until a packet is sent to the network. For each sent
    packet, the maximum delay of all sent packets over the last second is
    reported. The average of these reported delays is recorded.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SendStreamLifetimeInSeconds" units="seconds"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The lifetime of a video send stream. Recorded when a VideoSendStream
    instance is destroyed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SentFramesPerSecond" units="fps"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The number of sent frames per second for a sent video stream. Recorded when
    a stream is removed. The total number of frames is divided by the time the
    video stream exists.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SentHeightInPixels" units="pixels"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average sent height per frame for a sent video stream. Recorded when a
    stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SentPacketsLostInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of sent packets lost for a sent video stream. Recorded when a
    stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SentToInputFpsRatioPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Ratio between SentFramesPerSecond and InputFramesPerSecond in percents.
    Recorded when a stream is removed. The total number of sent frames is
    divided by the total number of input frames and multiplied by 100.
  </summary>
</histogram>

<histogram name="WebRTC.Video.SentWidthInPixels" units="pixels"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    The average sent width per frame for a sent video stream. Recorded when a
    stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.TargetDelayInMs" units="ms" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Average target delay (jitter delay + decode time + render delay) for a
    received video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.TimeInBlockyVideoPercentage" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Percentage of time the receive video stream playbacks low quality blocky
    video. Recorded when a stream is removed or content type changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.TimeInHdPercentage" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>ilnik@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Percentage of time the receive video stream playbacks HD resolution.
    Recorded when a stream is removed or content type changes.
  </summary>
</histogram>

<histogram name="WebRTC.Video.UniqueNackRequestsReceivedInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of unique RTCP NACK requests that are received in response to a
    sent video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.UniqueNackRequestsSentInPercent" units="%"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>asapersson@chromium.org</owner>
  <summary>
    Percentage of unique RTCP NACK requests that are sent in response to a
    received video stream. Recorded when a stream is removed.
  </summary>
</histogram>

<histogram name="WebRTC.Video.VP8DecoderImpl.TooManyPendingFrames"
    units="counts" expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>perkj@chromium.org</owner>
  <summary>
    Counts occurences of if the VP8 software decoder runs out of buffers due to
    that they are not returned to the buffer pool. See http://crbug/652923 and
    http://crbug/542522.
  </summary>
</histogram>

<histogram name="WebRTC.webkitApiCount" enum="RTCAPIName"
    expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>hbos@chromium.org</owner>
  <owner>mcasas@chromium.org</owner>
  <owner>emircan@chromium.org</owner>
  <owner>armax@chromium.org</owner>
  <summary>Counts number of calls to WebRTC APIs from JavaScript.</summary>
</histogram>

<histogram name="WebRTC.webkitApiCountPerSession" enum="RTCAPIName"
    expires_after="2023-03-07">
  <owner>toprice@chromium.org</owner>
  <owner>hbos@chromium.org</owner>
  <summary>
    Counts the number of calls to WebRTC APIs from JavaScript once per session.
    A session is a crude estimate since its implemented as the lifetime of the
    render process that called the WebRTC API.
  </summary>
</histogram>

<histogram name="WebRtcEventLogging.Api" enum="WebRtcEventLoggingApiEnum"
    expires_after="2023-11-07">
  <owner>eladalon@chromium.org</owner>
  <owner>manj@google.com</owner>
  <owner>dmitriyg@google.com</owner>
  <summary>
    The result of calls to the API for the collection and uploading of WebRTC
    event logs.
  </summary>
</histogram>

<histogram name="WebRtcEventLogging.NetError" units="units"
    expires_after="2023-11-07">
  <owner>eladalon@chromium.org</owner>
  <owner>manj@google.com</owner>
  <owner>dmitriyg@google.com</owner>
  <summary>
    NetError returned by the SimpleURLLoader object in charge of uploading a
    WebRTC event log file.
  </summary>
</histogram>

<histogram name="WebRtcEventLogging.Upload" enum="WebRtcEventLoggingUploadEnum"
    expires_after="2024-01-07">
  <owner>eladalon@chromium.org</owner>
  <owner>manj@google.com</owner>
  <owner>dmitriyg@google.com</owner>
  <summary>
    Tracks the uploading or discarding of WebRTC event logs that were previously
    collected.
  </summary>
</histogram>

<histogram name="WebRtcTextLogging.UploadFailureNetErrorCode"
    enum="NetErrorCodes" expires_after="2024-05-01">
  <owner>toprice@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Network error codes for WebRTC text log upload failures. Recorded when an
    upload attempt fails. Note: The histogram was disabled between May 2022 and
    M110, so has no data for that period.
  </summary>
</histogram>

<histogram name="WebRtcTextLogging.UploadFailureReason"
    enum="WebRtcLoggingUploadFailureReason" expires_after="2024-05-01">
  <owner>toprice@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Counts upload failures for WebRTC text log. Error codes for network errors
    are logged in WebRtcTextLogging.UploadFailureNetErrorCode. Recorded when an
    upload attempt fails.
  </summary>
</histogram>

<histogram name="WebRtcTextLogging{WebRtcLoggingEvent}"
    enum="WebRtcLoggingWebAppIdHash" expires_after="2024-05-07">
  <owner>toprice@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Counts the number of WebRTC text log events per web application. Suffixed by
    event. {WebRtcLoggingEvent}
  </summary>
  <token key="WebRtcLoggingEvent">
    <variant name=".Discard" summary="Discard"/>
    <variant name=".Start" summary="Start"/>
    <variant name=".UploadFailed" summary="Upload failed"/>
    <variant name=".UploadStarted" summary="Upload started"/>
    <variant name=".UploadStoredStarted"
        summary="Upload of a stored log started"/>
    <variant name=".UploadSuccessful" summary="Upload successful"/>
  </token>
</histogram>

</histograms>

</histogram-configuration>
