<!--
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 Media 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="AudioAggregationDuration">
  <variant name=".Intervals" summary="Whole intervals of 1000 callbacks"/>
  <variant name=".Short" summary="Streams shorter than 1000 callbacks"/>
</variants>

<variants name="AudioLatencyTag">
  <variant name="" summary="All latencies combined"/>
  <variant name=".LatencyExactMs"/>
  <variant name=".LatencyInteractive"/>
  <variant name=".LatencyPlayback"/>
  <variant name=".LatencyRtc"/>
  <variant name=".LatencyUnknown"/>
</variants>

<variants name="CastStreamingSender">
  <variant name="Audio"/>
  <variant name="Remoting.Audio"/>
  <variant name="Remoting.Video"/>
  <variant name="Video"/>
</variants>

<variants name="CastStreamingSenderAudioVideo">
  <variant name="Audio"/>
  <variant name="Video"/>
</variants>

<variants name="DbOperation">
  <variant name="Clear" summary="Remove all keys from the DB"/>
  <variant name="Initialize" summary="Initialize the DB."/>
  <variant name="Read" summary="Read an entry from the DB"/>
  <variant name="Validate" summary="Check for DB entry corruption"/>
  <variant name="Write" summary="Write an entry to the DB"/>
</variants>

<variants name="EmeApi">
  <variant name="CloseSession"/>
  <variant name="GenerateRequest"/>
  <variant name="GetStatusForPolicy"/>
  <variant name="LoadSession"/>
  <variant name="RemoveSession"/>
  <variant name="SetServerCertificate"/>
  <variant name="UpdateSession"/>
</variants>

<variants name="FileOperation">
  <variant name="DeleteFile"/>
  <variant name="ReadFile"/>
  <variant name="WriteFile"/>
</variants>

<variants name="IncognitoOrNormal">
  <variant name="" summary="Normal or Incognito"/>
  <variant name=".Incognito" summary="Incognito"/>
  <variant name=".Normal" summary="Normal"/>
</variants>

<variants name="KeySystem">
  <variant name="ClearKey" summary="Clear Key key system"/>
  <variant name="Widevine" summary="Widevine key system"/>
</variants>

<variants name="KeySystemWithRobustness">
  <variant name="ClearKey" summary="Clear Key key system"/>
  <variant name="Widevine.HardwareSecure"
      summary="Hardware secure Widevine key system"/>
  <variant name="Widevine.SoftwareSecure"
      summary="Software secure Widevine key system"/>
</variants>

<variants name="RendererType">
  <variant name="MediaFoundationRenderer"/>
  <variant name="RendererImpl"/>
</variants>

<variants name="ResolveOrReject">
  <variant name="" summary="resolve"/>
  <variant name=".Reject" summary="reject"/>
</variants>

<!-- The names should match media::GetCodecNameForUMA(). -->

<variants name="VideoCodec">
  <variant name="AV1"/>
  <variant name="DolbyVision"/>
  <variant name="H264"/>
  <variant name="HEVC"/>
  <variant name="MPEG2"/>
  <variant name="MPEG4"/>
  <variant name="Theora"/>
  <variant name="VC1"/>
  <variant name="VP8"/>
  <variant name="VP9"/>
</variants>

<variants name="VideoEncoderUsage">
  <variant name="CastMirroring"/>
  <variant name="MediaRecorder"/>
  <variant name="WebCodecs"/>
  <variant name="WebRTC"/>
</variants>

<histogram name="CastStreaming.Sender.Audio.NegotiatedCodec" enum="AudioCodec"
    expires_after="2024-04-07">
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Records which audio codec was negotiated during a mirroring session.
  </summary>
</histogram>

<histogram name="CastStreaming.Sender.Video.Bitrate" units="kbps"
    expires_after="2024-02-06">
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Records the currently set video bit rate during a Cast Streaming mirroring
    session. This metric is subsampled every 500 frames.
  </summary>
</histogram>

<histogram name="CastStreaming.Sender.Video.NegotiatedCodec" enum="VideoCodec"
    expires_after="2024-04-07">
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Records which video codec was negotiated during a mirroring session.
  </summary>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageCaptureLatency"
    units="ms" expires_after="2024-09-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Records the average {CastStreamingSenderAudioVideo} latency in milliseconds
    for capturing frames. Histogram is recorded at the end of the mirroring
    session.
  </summary>
  <token key="CastStreamingSenderAudioVideo"
      variants="CastStreamingSenderAudioVideo"/>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageEncodeTime"
    units="ms" expires_after="2024-09-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Records the average time required to encode {CastStreamingSenderAudioVideo}
    frames, in milliseconds. Histogram is recorded at the end of the mirroring
    session.
  </summary>
  <token key="CastStreamingSenderAudioVideo"
      variants="CastStreamingSenderAudioVideo"/>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageEndToEndLatency"
    units="ms" expires_after="2024-09-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Records the average {CastStreamingSenderAudioVideo} latency in milliseconds
    end to end, from the beginning of capturing a frame to when the frame is
    played out on the receiver. Histogram is recorded at the end of the
    mirroring session.
  </summary>
  <token key="CastStreamingSenderAudioVideo"
      variants="CastStreamingSenderAudioVideo"/>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageNetworkLatency"
    units="ms" expires_after="2024-09-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Records the average {CastStreamingSenderAudioVideo} latency in milliseconds
    from sender to receiver. Histogram is recorded at the end of the mirroring
    session.
  </summary>
  <token key="CastStreamingSenderAudioVideo"
      variants="CastStreamingSenderAudioVideo"/>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.ExceededPlayoutDelayPacketsPercentage"
    units="%" expires_after="2024-09-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Records number of {CastStreamingSenderAudioVideo} packets that exceeded the
    playout delay as a percentage of all packets. Histogram is recorded at the
    end of the mirroring session.
  </summary>
  <token key="CastStreamingSenderAudioVideo"
      variants="CastStreamingSenderAudioVideo"/>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.LateFramesPercentage"
    units="%" expires_after="2024-09-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Records the percentage of {CastStreamingSenderAudioVideo} frames that are
    reported as late, and therefore dropped by the sender, during a cast
    mirroring session. Recorded at the end of a cast mirroring session. Logged
    on all desktop platforms.
  </summary>
  <token key="CastStreamingSenderAudioVideo"
      variants="CastStreamingSenderAudioVideo"/>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.RetransmittedPacketsPercentage"
    units="%" expires_after="2024-09-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Records number of {CastStreamingSenderAudioVideo} packets that had to be
    retransmitted as a percentage of number of packets sent. Histogram is
    recorded at the end of the mirroring session.
  </summary>
  <token key="CastStreamingSenderAudioVideo"
      variants="CastStreamingSenderAudioVideo"/>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.TransmissionRate"
    units="kbps" expires_after="2024-09-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Records the {CastStreamingSenderAudioVideo} packet transmission bitrate in
    kbps during a Cast Streaming session. Histogram is recorded at the end of
    the mirroring session.
  </summary>
  <token key="CastStreamingSenderAudioVideo"
      variants="CastStreamingSenderAudioVideo"/>
</histogram>

<histogram name="CastStreaming.Sender.{CastStreamingSender}.FrameDropped"
    enum="CastStreamingFrameDropReason" expires_after="2024-02-06">
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Records the reason when an frame is dropped during a Cast Streaming session.
  </summary>
  <token key="CastStreamingSender" variants="CastStreamingSender"/>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSender}.PercentDroppedFrames"
    units="%" expires_after="2024-02-06">
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Records the total percentage of frames dropped for a given Cast Streaming
    session.
  </summary>
  <token key="CastStreamingSender" variants="CastStreamingSender"/>
</histogram>

<histogram name="Media.AImageReaderGLOwner.AcquireImageResult"
    enum="MediaStatus" expires_after="2024-03-17">
  <owner>vikassoni@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Error codes to handle AImage and AImageReader api calls. This is recorded
    when AImageReader acquireNextImage or acquireLatestImage is called and the
    returned code is other than AMEDIA_OK. This histogram was enabled in the
    past and became absolete on 2018-11-25.
  </summary>
</histogram>

<histogram name="Media.AImageReaderGLOwner.HasFence" enum="Boolean"
    expires_after="2024-02-25">
  <owner>vasilyt@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs whether AImageReader provided an acquire fence in acquireNextImage or
    acquireLatestImage. Logged once for each successfuly acquired frame.
  </summary>
</histogram>

<histogram name="Media.Android.BecomingNoisy" enum="Boolean"
    expires_after="2023-01-15">
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Android-specific metric. Occasionally, we cannot start a foreground service
    when headphones are unplugged. This tracks how often that occurs, which is
    one recorded boolean per &quot;user unplugs headphones while media is
    playing&quot;. See https://crbug.com/1245017 for more details.
  </summary>
</histogram>

<histogram name="Media.Android.GetColorSpaceError" enum="BooleanError"
    expires_after="2024-02-25">
  <owner>vasilyt@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Android: Whether we successfuly got ColorSpace from MediaCodec or not.
    Recorded each time output format changes from MediaCodec.
  </summary>
</histogram>

<histogram name="Media.Android.MediaPlayerSuccess" enum="MediaPlayerExitStatus"
    expires_after="2024-03-17">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Android: Whether MediaPlayer exited without errors.</summary>
</histogram>

<histogram name="Media.Android.MediaPlayerWatchTime"
    enum="MediaPlayerWatchTimeType" expires_after="2024-04-25">
  <owner>sandersd@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Wall time of MediaPlayer playbacks. Each count represents one second of
    media playback. Multiple MediaPlayer instances can together accumulate watch
    time faster than real time.
  </summary>
</histogram>

<histogram name="Media.Audible.CloseNewestToExitConcurrentPlayback"
    enum="ExitConcurrentPlaybackContents" expires_after="2023-09-15">
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records when an audible tab is closed and we now only have one audible tab
    open. Warning: this histogram was expired from 2019-05-30 to 4-18-22; data
    may be missing.
  </summary>
</histogram>

<histogram name="Media.Audible.ConcurrentTabsTime" units="ms"
    expires_after="2024-03-03">
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records how long more than one tab is audible at the same time. The
    concurrent tabs might change during this period. The time recorded starts
    when the browser goes from one to two audbile tabs and stops when it is back
    below two. Warning: this histogram was expired from 2020-09-05 to 4-18-22;
    data may be missing.
  </summary>
</histogram>

<histogram name="Media.Audible.ConcurrentTabsWhenStarting" units="units"
    expires_after="2024-08-08">
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records how many tabs were audible when a new tab started to be audible.
    Warning: this histogram was expired from 2020-09-05 to 4-18-22; data may be
    missing.
  </summary>
</histogram>

<histogram name="Media.Audible.MaxConcurrentTabsInSession" units="units"
    expires_after="2024-08-08">
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records how many tabs are audible at the same time during the session. It is
    recording the maximum audible tab count everytime it increases. In other
    words, a session with N concurrent audible tabs will record entries from 1
    through N exactly once. Warning: this histogram was expired from 2020-09-05
    to 4-18-22; data may be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.Autoplay" enum="AutoplaySource"
    expires_after="2024-08-08">
  <owner>dalecurtis@chromium.org</owner>
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Records the autoplay source of audios.</summary>
</histogram>

<histogram name="Media.Audio.Capture.DetectedMissingCallbacks"
    enum="BooleanMissingCallbacks" expires_after="2024-03-17">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether missing callbacks where detected during audio capture. Logged when
    AudioInputDevice is stopped.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.FramesProvided" units="frames"
    expires_after="2024-02-11">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of captured audio frames that is provided by the operating system
    in each callback. Typically, Chrome will want to use a 10 ms buffer (e.g.
    480 frames for a sample rate of 48 kHz), but the OS may decide to capture
    e.g. 256 frames of audio at a time. If the desired frame size is used, the
    emitted value is special-cased to be 0. This histogram then shows how
    frequent it is that the desired number of frames is used and if not, the
    number of frames used in practice. The number of frames per callback is
    normally constant or very rarely changed throughout the lifetime of the
    audio stream. The first value that differs from the desired value is stored
    and logged when an audio input stream is closed. Any further differences
    during the lifetime will be ignored.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.InputStreamDuration" units="ms"
    expires_after="2024-05-03">
  <owner>olka@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram measures the duration of every input stream, as seen from the
    renderer. It counts from when it has been successfully started, until it is
    stopped. Streams that fail to start are not logged.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.LowLatencyCallbackError"
    enum="BooleanError" expires_after="2024-03-10">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    A boolean that reflects whether or not an error was reported during audio
    capture for a low latency stream.
  </summary>
</histogram>

<histogram
    name="Media.Audio.Capture.Mac.MicSystemPermission.FixedTime.SinceFirstFailure"
    units="ms" expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The time from the first microphone access failure due to blocked system
    permission before the last browser restart to startup after browser restart.
    Logged once at browser startup if the system permission then is allowed.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Media.Audio.Capture.Mac.MicSystemPermission.FixedTime.SinceLastFailure"
    units="ms" expires_after="2024-01-14">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The time from the last microphone access failure due to blocked system
    permission before the last browser restart to startup after browser restart.
    Logged once at browser startup if the system permission then is allowed.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Mac.MicSystemPermission.Startup"
    enum="SystemMediaCapturePermission" expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The Mac system permission state for microphone. Logged once at browser
    startup. For more information on the values, see
    https://developer.apple.com/documentation/avfoundation/avauthorizationstatus.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Media.Audio.Capture.Mac.MicSystemPermission.StartupAfterFailure"
    enum="SystemMediaCapturePermission" expires_after="2024-01-14">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The Mac system permission state for microphone. Logged once at browser
    startup if there was a failure accessing the microphone due to blocked
    system permission before the last browser restart. For more information on
    the values, see
    https://developer.apple.com/documentation/avfoundation/avauthorizationstatus.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Mac.MicSystemPermission.UserMedia"
    enum="SystemMediaCapturePermission" expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The Mac system permission state for microphone at the time of a user media
    request. Logged when the system permission is checked. If the permission is
    &quot;not determined&quot; this is logged, permission is requested, and the
    resulting permission (from the user response) is also logged. For more
    information on the values, see
    https://developer.apple.com/documentation/avfoundation/avauthorizationstatus.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.ProcessingAudioFifo.MaxUsage"
    units="buffers" expires_after="2024-07-01">
  <owner>tguilbert@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Maximum size (in buffers) of the unprocessed data queue, reached over a
    sampling interval (1000 callbacks). Not logged for streams received less
    than 1000 callbacks.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.ProcessingAudioFifo.Overruns"
    units="count" expires_after="2024-07-01">
  <owner>tguilbert@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Number of times over a sampling interval (1000 callbacks) a
    ProcessingAudioFifo has overflowed and dropped buffers. Capped at 100 (1/10
    of all callbacks). Not logged for streams received less than 1000 callbacks.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.SCK.ContentEnumerationTimedOut"
    enum="Boolean" expires_after="2024-08-09">
  <owner>mfoltz@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Indicates if SCShareableContent enumeration has timed out during a call to
    SCKAudioInputStream::Open(). The timeout exists to prevent a deadlock if the
    API is misbehaving. We do not expect any timeouts under normal conditions.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.SCK.ContentEnumerationTimeMs" units="ms"
    expires_after="2024-08-09">
  <owner>mfoltz@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Measures the time required for SCShareableContent enumeration (displays and
    open applications/windows) when calling SCKAudioInputStream::Open(). The
    duration can vary based on the amount of applications and windows open on
    the system. This enumeration is a blocking operation, and as such should
    complete as fast as possible. If metrics show long times, the operation
    might have to be made asynchronous.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.SCK.StreamError" units="errorcode"
    expires_after="2024-08-09">
  <owner>mfoltz@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Error codes reported by ScreenCaptureKit in
    SCKAudioInputStream::OnStreamError() during stream setup or while streaming
    samples.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.StreamCallbackError2"
    enum="AudioCaptureDeviceError" expires_after="never">
<!-- expires-never: Audio pipeline health metric. -->

  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    When AudioInputDevice is stopped, this stat is recorded with whether an
    error callback was ever received over IPC, and in that case whether the
    error occurred during or after stream creation.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.AbsTimestampDiffMs" units="ms"
    expires_after="2024-05-25">
  <owner>henrika@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The absolute time difference in milliseconds between a default QPC-based
    timstamp and a timestamp from TimeTicks::Now(). By default, the difference
    will be small and correspond to the size of the audio capture buffer which
    is about 10 milliseconds. It can however be very large on some devices, e.g.
    when using RDP. If the diffeence is larger than 500 milliseconds, so-called
    fake audio capture timestamps (based on TimeTicks::Now()) will be utilized.
    This value is logged once per audio input stream session at the first audio
    callback.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.FakeTimestamps" enum="Boolean"
    expires_after="2024-05-25">
  <owner>henrika@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logs whether audio capture timestamps on Windows are fake or not. By default
    QPC-based timestamps provided by native audio APIs are utilized. In some
    cases the QPC-based timestamps differ a lot compared with TimeTicks::Now()
    timestamps and this can lead to issues (see http://crbug.com/1439283). If an
    absolute difference larger than 500 msec between these two types of
    timestamps is detected, we fall back to using TimeTicks::Now() and these
    timestams are called fake timestamps. We expect that usage of fake
    timestamps will be low. This value is logged once per audio input stream
    session at the first audio callback.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.Glitches2" units="glitches"
    expires_after="2024-03-10">
  <owner>olka@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of glitches that were detected at the OS level while an audio
    input stream was active. A glitch in this case corresponds to a certain
    error code from the IAudioCaptureClient::GetBuffer() API:
    AUDCLNT_BUFFERFLAGS_DATA_DISCONTINUITY. This value is logged every 1000 OS
    callbacks on Windows.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.InitError" enum="Hresult"
    expires_after="2024-03-17">
  <owner>olka@chromium.org</owner>
  <owner>tommi@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Error codes from IAudioClient::Initialize() in
    WASAPIAudioInputStream::InitializeAudioEngine on Windows.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.InitError.FormatRelated"
    enum="AudioStreamFormatRelatedInitError" expires_after="2024-09-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Errors from IAudioClient::Initialize() in
    WASAPIAudioInputStream::InitializeAudioEngine on Windows that are related to
    the audio format. Each error is split by whether format conversion was used
    or not. Warning: this histogram was expired from 2022-10-17 to 2022-10-18;
    data may be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.Open" enum="AudioStreamOpenResult"
    expires_after="2024-01-07">
  <owner>gudiou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Success/error cases for opening an audio input stream on Windows.
  </summary>
</histogram>

<histogram name="Media.Audio.ConvertingAudioFifo.MaxOutputQueueSize"
    units="Outputs" expires_after="2024-03-31">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@google.com</owner>
  <summary>
    The maximum number of pending outputs in the ConvertingAudioFifo. Recorded
    once per ConvertingAudioFifo, on destruction.
  </summary>
</histogram>

<histogram name="Media.Audio.CoreAudioDispatchOverrideInitResult"
    enum="CoreAudioDispatchOverrideInitResult" expires_after="2024-09-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Tracks support and initialization success/failure of the CoreAudio dispatch
    override hotfix. Logged during initialization of AudioManagerMac. The fix is
    not supported on macOS earlier than version 10.10. Warning: this histogram
    was expired from 2022-10-01 to 2022-12-08; data may be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.CoreAudioDispatchOverrideLookupEvent"
    enum="CoreAudioDispatchOverrideLookupEvent" expires_after="2024-09-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logged whenever the CoreAudio dispatch override hotfix needs to look up the
    calling function using dladdr(). Once ResumeIO and PauseIO have been
    identified, no more lookups should be performed during the session. Warning:
    this histogram was expired from 2022-10-09 to 2022-10-18; data may be
    missing.
  </summary>
</histogram>

<histogram name="Media.Audio.CrasInputStreamNotifyStreamError"
    units="errorcode" expires_after="2024-02-11">
  <owner>peah@chromium.org</owner>
  <owner>hychao@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Error codes reported by the NotifyStreamError function in CrasInputStream.
  </summary>
</histogram>

<histogram name="Media.Audio.CrasInputStreamOpenSuccess"
    enum="CrasInputStreamOpenSuccess" expires_after="2024-02-11">
  <owner>peah@chromium.org</owner>
  <owner>hychao@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logged at each call to CrasInputStream::Open to indicate any errors.
  </summary>
</histogram>

<histogram name="Media.Audio.CrasInputStreamStartSuccess"
    enum="CrasInputStreamStartSuccess" expires_after="2024-02-11">
  <owner>peah@chromium.org</owner>
  <owner>hychao@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logged at each call to CrasInputStream::Start to indicate any errors.
  </summary>
</histogram>

<histogram name="Media.Audio.CrasUnifiedStreamNotifyStreamError"
    units="errorcode" expires_after="2024-02-04">
  <owner>peah@chromium.org</owner>
  <owner>hychao@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Error codes reported by the NotifyStreamError function in CrasUnifiedStream.
  </summary>
</histogram>

<histogram name="Media.Audio.CrasUnifiedStreamOpenSuccess"
    enum="CrasUnifiedStreamOpenSuccess" expires_after="2024-02-04">
  <owner>peah@chromium.org</owner>
  <owner>hychao@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logged at each call to CrasUnifiedStream::Open to indicate any errors.
  </summary>
</histogram>

<histogram name="Media.Audio.CrasUnifiedStreamStartSuccess"
    enum="CrasUnifiedStreamStartSuccess" expires_after="2024-02-04">
  <owner>peah@chromium.org</owner>
  <owner>hychao@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logged at each call to CrasUnifiedStream::Start to indicate any errors.
  </summary>
</histogram>

<histogram name="Media.Audio.InputStartupSuccessMac" enum="BooleanSuccess"
    expires_after="2024-02-05">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Indicates if audio capturing did start after stream startup was requested.
    Sampled once, a few seconds after a stream has been asked to start.
  </summary>
</histogram>

<histogram name="Media.Audio.InputVolumeStartsAtZeroWin"
    enum="BooleanVolumeZero" expires_after="2024-02-20">
  <owner>henrika@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Indicates if the volume level of the audio session is set to zero when the
    input audio session starts. Sampled once when the stream starts but only on
    Windows platforms. See http://crbug.com/1014443. Warning: this histogram was
    expired from 2022-10-09 to 2022-12-07; data may be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.Mac.AggregateDeviceCompositionPropertyIsNull"
    enum="Boolean" expires_after="2024-03-31">
  <owner>agpalak@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the number of occurences of null output dictionary when
    AudioObjectGetPropertyData for kAudioAggregateDevicePropertyComposition is
    called. This is equivalent to the number of crashes that were reported in
    crbug.com/1428619.
  </summary>
</histogram>

<histogram name="Media.Audio.MakeAudioInputStreamStatus"
    enum="MakeAudioInputStreamStatus" expires_after="2024-06-01">
  <owner>yuhsuan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logged at each call to AudioManagerBase::MakeAudioInputStream to indicate
    any errors.
  </summary>
</histogram>

<histogram name="Media.Audio.Output.Win.{AudioOutputMethod}Error"
    enum="Hresult" expires_after="M122">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Errors from various methods on WASAPIAudioOutputStream. Recorded upon a
    failure being returned from a call into WASAPI.
  </summary>
  <token key="AudioOutputMethod">
    <variant name="Open"/>
    <variant name="Render"/>
    <variant name="Run"/>
    <variant name="Start"/>
    <variant name="Stop"/>
  </token>
</histogram>

<histogram name="Media.Audio.OutputDeviceAuthorizationTime" units="ms"
    expires_after="2024-03-17">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Time delta between the moment output device authorization request is
    received by the browser and the moment its processessing is finished (and
    reply is to be sent back to the renderer if IPC is not closed yet).
  </summary>
</histogram>

<histogram name="Media.Audio.OutputDeviceListener.Duration{Device}" units="ms"
    expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Duration of the interval when a listener listens to a specific output
    device. Recorded when a listener chooses to listen to another output device,
    or stops listening altogether.
  </summary>
  <token key="Device">
    <variant name=".Default" summary="Default device"/>
    <variant name=".NonDefault" summary="Non-default device"/>
  </token>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixer.MaxListenerCount{Device}"
    units="listeners" expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Maximum number of listeners receiving the reference output signal during
    mixed playback. Recoreded when mixing stops (i.e. when all reference signal
    listeners are gone.)
  </summary>
  <token key="Device">
    <variant name="" summary="All"/>
    <variant name=".Default" summary="Default device mixer"/>
    <variant name=".NonDefault" summary="Non-default device mixer"/>
  </token>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixer.MaxMixedStreamCount{Device}"
    units="streams" expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Maximum number of output streams mixed simlutaniously by OutputDeviceMixer.
    Recoreded when mixing stops (when all reference signal listeners are gone).
  </summary>
  <token key="Device">
    <variant name="" summary="All"/>
    <variant name=".Default" summary="Default device mixer"/>
    <variant name=".NonDefault" summary="Non-default device mixer"/>
  </token>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixer.MixedPlaybackStatus"
    enum="AudioOutputDeviceMixerMixedPlaybackStatus" expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Health status of the mixed playback. Recorded when mixed playback stopped or
    failed to start.
  </summary>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixer.MixingDuration{Device}"
    units="ms" expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Duration of the interval between the moment OutputDeviceMixer started mixed
    playback (referece playback signal is requested by at least one listener and
    there is at least one stream managed by the mixer playing) and the moment
    OutputDeviceMixer stopped mixed playback (there are no more listeners). It
    may include intervals recorded by
    Media.Audio.OutputDeviceMixer.NoopMixingDuration histogram.
  </summary>
  <token key="Device">
    <variant name="" summary="All"/>
    <variant name=".Default" summary="Default device mixer"/>
    <variant name=".NonDefault" summary="Non-default device mixer"/>
  </token>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixer.NoopMixingDuration" units="ms"
    expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Duration of the interval when there are no output streams to mix but there
    are reference signal listeners present, so OutputDeviceMixer renders silence
    and feeds it to the listeners as well. Recorded when an output stream starts
    playing (and thus playback is not empty any more) or when all listeners are
    gone (and thus mixing stops). There may be multiple such intervals during an
    interval recorded by Media.Audio.OutputDeviceMixer.MixingDuration.
  </summary>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixer.OvertimeCount" units="count"
    expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Number of times over a sampling interval (1000 callbacks) when the mixing
    callback took longer than the playback buffer duration to finish. Capped at
    100 (1/10 of all callbacks). Not logged if the mixer was called less than
    1000 times.
  </summary>
</histogram>

<histogram
    name="Media.Audio.OutputDeviceMixer.StreamDuration.{MixingStatus}.{LatencyTag}"
    units="ms" expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Duration of the interval when an output stream managed by OutputDeviceMixer
    is playing independently (Unmixed) or as a part of the mix (Mixed). Measured
    between the moment the stream starts playing or its playback mode
    (Mixed/Unmixed) changes, and the moment the stream stops playing or its
    playback mode changes.
  </summary>
  <token key="MixingStatus">
    <variant name="Mixed" summary="Stream is played as a part of the mix"/>
    <variant name="Unmixed" summary="Stream is played independently"/>
  </token>
  <token key="LatencyTag">
    <variant name="LatencyExactMs"/>
    <variant name="LatencyInteractive"/>
    <variant name="LatencyPlayback"/>
    <variant name="LatencyRtc"/>
    <variant name="LatencyUnknown"/>
  </token>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixer.StreamStatus"
    enum="AudioOutputDeviceMixerStreamStatus" expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Health status of each output stream managed by mixer. Recorded when the
    stream is closed.
  </summary>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixerManager.StreamCreation"
    enum="AudioOutputDeviceMixerManagerStreamCreation"
    expires_after="2024-09-01">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    A path OutputDeviceMixerManager uses to create an output stream.
  </summary>
</histogram>

<histogram name="Media.Audio.Processing.CaptureDelayMs" units="ms"
    expires_after="2024-05-03">
  <owner>saza@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The time, in milliseconds, between when a block of audio is read from the
    soundcard and when it's presented to the audio processor. Used in
    calculating the total system delay for the audio processor.
  </summary>
</histogram>

<histogram name="Media.Audio.Processing.CaptureDelayVarianceMs"
    units="ms squared" expires_after="2024-05-03">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The variance of the capture delay in milliseconds (see
    Media.Audio.Processing.CaptureDelayMs). Logged once every second and
    calculated over the past second of data.
  </summary>
</histogram>

<histogram name="Media.Audio.Processing.RenderDelayMs" units="ms"
    expires_after="2024-05-03">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The time, in milliseconds, between when a block of audio is presented to the
    audio processor and the time it's played out on the soundcard. Used in
    calculating the total system delay for the audio processor.
  </summary>
</histogram>

<histogram name="Media.Audio.Processing.RenderDelayVarianceMs"
    units="ms squared" expires_after="2024-05-03">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The variance of the render delay in milliseconds (see
    Media.Audio.Processing.RenderDelayMs). Logged once every second and
    calculated over the past second of data.
  </summary>
</histogram>

<histogram name="Media.Audio.Processing.TotalDelayMs" units="ms"
    expires_after="2024-05-03">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The estimated total audio system delay presented to the audio processor. The
    sum of the individual capture and render delays at similar points in time.
  </summary>
</histogram>

<histogram name="Media.Audio.Processing.TotalDelayVarianceMs"
    units="ms squared" expires_after="2024-05-03">
  <owner>saza@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The variance of the total delay in milliseconds (see
    Media.Audio.Processing.TotalDelayMs). Logged once every second and
    calculated over the past second of data.
  </summary>
</histogram>

<histogram name="Media.Audio.RawProcessingSupportedWin" enum="BooleanSupported"
    expires_after="2024-02-12">
  <owner>henrika@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether the capture device supports raw audio capture or not. Emitted when
    the audio input stream is closed but only on Windows platforms. Only
    uploaded for the case when analog AGC is enabled, i.e., for WebRTC-based
    audio input streams.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.FramesRequested" units="frames"
    expires_after="2024-10-01">
  <owner>olka@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of frames audio is actually rendered at if the number is
    different from the desired number of frames. If the desired frame size is
    used, this value will be 0. Typically, Chrome will want to use a 10ms buffer
    (e.g. 480 frames for a sample rate of 48kHz), but we might have to render
    audio 256 frames at a time. This histogram gives us an indication as to how
    frequent that is and what buffer sizes are used in practice. This value is
    logged when an audio output stream is stopped.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.GetSourceDataTime.WebRTC"
    units="microseconds" expires_after="2023-12-04">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The time spent to get audio data from the source. For WebRTC, it's the time
    spent in WebRtcAudioRenderer::SourceCallback. Logged every function call,
    which is every 10 ms.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.GetSourceDataTimeMax.WebRTC"
    units="microseconds" expires_after="2023-11-12">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The maximum time spent to get audio data from the source during a session.
    For WebRTC, it's the time spent in WebRtcAudioRenderer::SourceCallback. A
    session is between Start() and Stop() of WebRtcAudioRenderer.

    Warning: This metric may include reports from clients with low-resolution
    clocks (i.e. on Windows, ref. |TimeTicks::IsHighResolution()|). Such reports
    will cause this metric to have an abnormal distribution. When considering
    revising this histogram, see UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES for the
    solution.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.OutputDeviceAuthorizationTime" units="ms"
    expires_after="2024-08-08">
  <owner>olka@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Similar to Media.Audio.OutputDeviceAuthorizationTime, this histogram
    measures the time required for device authorization, but it is measured on
    the renderer side when AudioOutputDevice calls RequestDeviceAuthorization on
    the IO thread until it receives OnDeviceAuthorized, also on the IO thread.
    Note that an authorization timeout will cause OnDeviceAuthorized to be
    called, so for platforms that use a timeout, very few times will be above
    the timeout value. Warning: this histogram was expired from 2020-04-05 to
    2021-06-04; data may be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.OutputDeviceAuthorizationTimedOut"
    enum="BooleanTimedOut" expires_after="2024-02-25">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether audio output device timed out waiting for authorization reply from
    the browser side.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.OutputDeviceStartTime2" units="ms"
    expires_after="2024-02-25">
  <owner>dalecurtis@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The time delta from an AudioOutputDevice sending its first PlayStream
    message to it getting its first data callback.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.OutputDeviceStatus"
    enum="OutputDeviceStatus" expires_after="2024-03-10">
  <owner>dalecurtis@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Device status received in response to device authorization request.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.OutputStreamDuration2" units="ms"
    expires_after="2024-02-11">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram measures the duration of every output stream, as seen from
    the renderer. It counts from when it has been successfully started, until it
    is stopped. Streams that fail to start are not logged.
  </summary>
</histogram>

<histogram
    name="Media.Audio.Render.SinkCache.GetOutputDeviceInfoCacheUtilization"
    enum="GetOutputDeviceInfoCacheHit" expires_after="2024-02-04">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <summary>
    Whether a cached sink was used to get audio output device information, or a
    new sink was created for that.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.StreamCallbackError2"
    enum="AudioRenderDeviceError" expires_after="never">
<!-- expires-never: Audio pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    When AudioOutputDevice is stopped, this stat is recorded with whether an
    error callback was ever received over IPC, and in that case whether the
    error occurred during or after stream creation. Expired in Apr 2020 and
    re-enabled in May 2021.
  </summary>
</histogram>

<histogram name="Media.Audio.Render.SystemDelay" units="ms"
    expires_after="2024-06-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The delay between audio being delivered to the OS-specific implementation of
    AudioOutputStream and the audio being played out by the speakers. Reported
    every time the AudioOutputStream calls AudioSourceCallback::OnMoreData.
  </summary>
</histogram>

<histogram name="Media.Audio.TabAudioMuted" enum="Boolean"
    expires_after="2024-03-17">
  <owner>evliu@google.com</owner>
  <owner>chrome-media-ux@google.com</owner>
  <summary>
    Logged when a user clicks on the audio indicator button in the tab strip.
    Logs true if the click mutes the tab and false if the click unmutes the tab.
  </summary>
</histogram>

<histogram name="Media.Audio.TrackAudioRenderer.DeviceStatus"
    enum="OutputDeviceStatus" expires_after="never">
<!-- expires-never: used for audio output devices monitoring. -->

<!-- https://crbug.com/986492 -->

  <owner>olka@chromium.org</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Device status received during TrackAudioRenderer initialization. This is a
    specific case of Media.Audio.Render.OutputDeviceStatus histogram.
  </summary>
</histogram>

<histogram name="Media.Audio.TrackAudioRenderer.SwitchDeviceStatus"
    enum="OutputDeviceStatus" expires_after="never">
<!-- expires-never: used for audio output devices monitoring. -->

<!-- https://crbug.com/986492 -->

  <owner>olka@chromium.org</owner>
  <owner>fhernqvist@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Device status received by TrackAudioRenderer when switching the output
    device. This is a specific case of Media.Audio.Render.OutputDeviceStatus
    histogram.
  </summary>
</histogram>

<histogram name="Media.Audio.WebRTCAudioRenderer.DeviceStatus"
    enum="OutputDeviceStatus" expires_after="never">
<!-- expires-never: used for WebRTC audio output devices monitoring. -->

<!-- https://crbug.com/986501 -->

  <owner>olka@chromium.org</owner>
  <owner>fhrenqvist@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Device status received during WebRTCAudioRenderer initialization. This is a
    specific case of Media.Audio.Render.OutputDeviceStatus histogram.
  </summary>
</histogram>

<histogram name="Media.Audio.WebRTCAudioRenderer.SwitchDeviceStatus"
    enum="OutputDeviceStatus" expires_after="never">
<!-- expires-never: used for WebRTC audio output devices monitoring. -->

<!-- https://crbug.com/986501 -->

  <owner>olka@chromium.org</owner>
  <owner>fhernqvist@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Device status received by WebRTCAudioRenderer when switching the output
    device. This is a specific case of Media.Audio.Render.OutputDeviceStatus
    histogram.
  </summary>
</histogram>

<histogram name="Media.Audio.{Type}.EarlyGlitchDetected" enum="BooleanDetected"
    expires_after="2024-05-03">
  <owner>olka@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether a glitch in the capture/render audio at the OS level was detected
    during the first 1000 OS callbacks of an active input/output stream. A
    glitch is detected if the OS skips providing/requesting any frames of audio,
    and is recorded when the stream ends, as long as the stream saw at least one
    OS callback. Reported on Windows and Mac.
  </summary>
  <token key="Type">
    <variant name="Capture"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.Glitches2" units="glitches"
    expires_after="2024-05-03">
  <owner>olka@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of glitches that were detected at the OS level while an audio
    input (Capture) or output (Render) stream was active. A glitch is detected
    if the OS skips providing/requesting any frames of audio. This value is
    aggregated over a period of 1000 OS callbacks (every 10 seconds for buffer
    size 10 ms) and is logged at the end of each collection interval. Not
    recorded for streams shorter than 1000 callbacks. Reported on Windows, Mac
    and ChromeOS.
  </summary>
  <token key="Type">
    <variant name="Capture"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.LargestGlitchMs2" units="ms"
    expires_after="2024-05-03">
  <owner>olka@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The length in milliseconds of the largest glitch that was detected at the OS
    level by an audio input (Capture) or output (Render) stream. This value is
    aggregated over a period of 1000 OS callbacks (every 10 seconds for buffer
    size 10 ms) and is logged at the end of each collection interval if any
    glitches were detected. Not recorded for streams shorter than 1000
    callbacks. Reported on Windows and Mac.
  </summary>
  <token key="Type">
    <variant name="Capture"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.LostFramesInMs2" units="ms"
    expires_after="2024-05-03">
  <owner>olka@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The combined length in milliseconds of input (Capture) or output (Render)
    audio glitches detected at the OS level. This is useful to know in
    particular for audio processing such as echo cancellation. This value is
    aggregated over a period of 1000 OS callbacks (every 10 seconds for buffer
    size 10 ms) and is logged at the end of each collection interval if any
    glitches were detected. Not recorded for streams shorter than 1000
    callbacks. Reported on Windows and Mac.
  </summary>
  <token key="Type">
    <variant name="Capture"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.SystemGlitchDuration" units="ms"
    expires_after="2024-06-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The duration of audio glitches occurring in the OS-specific implementation
    of an audio stream (AudioInputStream for Capture and AudioOutputStream for
    Render). Reported every time a glitch occurs.
  </summary>
  <token key="Type">
    <variant name="Capture"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.AudioBitsPerChannel" units="units" expires_after="M85">
  <owner>dalecurtis@chromium.org</owner>
  <summary>Bits per channel of HTML5 audio sample data.</summary>
</histogram>

<histogram name="Media.AudioCapturerAudioGlitches" enum="AudioGlitchResult"
    expires_after="2024-02-20">
  <owner>olka@chromium.org</owner>
  <owner>gustaf@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether there is input audio glitches due to dropped input audio data or
    not. Sampled when a low-latency input audio stream is destructed.
  </summary>
</histogram>

<histogram name="Media.AudioCapturerDroppedData10sIntervals" units="drops"
    expires_after="2024-02-04">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of input audio data blocks that were dropped at the
    browser/renderer boundary due to for example buffer overflow in the writer
    side buffer or in the socket. This value is aggregated over a period of 1000
    input data pushes (every 10 seconds for buffer size 10 ms) and is logged at
    the end of each collection interval. Not recorded for streams with less than
    1000 input data pushes.
  </summary>
</histogram>

<histogram name="Media.AudioCapturerDroppedData2.{Duration}" units="permille"
    expires_after="2023-10-05">
  <obsolete>
    Deprecated in favor of Media.AudioCapturerDroppedData10sIntervals and
    Media.AudioCapturerDroppedDataBelow10s. Data is no longer collected.
  </obsolete>
  <owner>olka@chromium.org</owner>
  <owner>gustaf@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The proportion of input audio data that was dropped at the browser/renderer
    boundary due to for example buffer overflow in the writer side buffer or in
    the socket. Reported at the destruction of low-latency audio input stream.
    Rounded up, cropped to 1/10 of all callbacks.
  </summary>
  <token key="Duration">
    <variant name="Long" summary="Streams equal or longer than 3000 callbacks"/>
    <variant name="Short" summary="Streams shorter than 3000 callbacks"/>
  </token>
</histogram>

<histogram name="Media.AudioCapturerDroppedDataBelow10s" units="drops"
    expires_after="2024-02-04">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of input audio data blocks that were dropped at the
    browser/renderer boundary due to for example buffer overflow in the writer
    side buffer or in the socket. This value is only logged for streams with
    less than 1000 input data pushes (10 seconds for buffer size 10 ms).
  </summary>
</histogram>

<histogram name="Media.AudioCapturerMissedReadDeadline10sIntervals"
    units="misses" expires_after="2024-02-04">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of times input audio data blocks that had to be buffered because
    there was not room in the shared memory ring buffer on the browser/renderer
    boundary. This happens if the reading side hasn't read data in time. This
    value is aggregated over a period of 1000 input data pushes (every 10
    seconds for buffer size 10 ms) and is logged at the end of each collection
    interval. Not recorded for streams with less than 1000 input data pushes.
  </summary>
</histogram>

<histogram name="Media.AudioCapturerMissedReadDeadline2.{Duration}"
    units="permille" expires_after="2023-10-05">
  <obsolete>
    Deprecated in favor of Media.AudioCapturerMissedReadDeadline10sIntervals and
    Media.AudioCapturerMissedReadDeadlineBelow10s. Data is no longer collected.
  </obsolete>
  <owner>olka@chromium.org</owner>
  <owner>gustaf@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The proportion of input audio data blocks that had to be buffered because
    there was not room in the shared memory ring buffer on the browser/renderer
    boundary. This happens if the reading side hasn't read data in time.
    Reported at the destruction of low-latency audio input stream. Rounded up,
    cropped to 1/10 of all callbacks.
  </summary>
  <token key="Duration">
    <variant name="Long" summary="Streams equal or longer than 3000 callbacks"/>
    <variant name="Short" summary="Streams shorter than 3000 callbacks"/>
  </token>
</histogram>

<histogram name="Media.AudioCapturerMissedReadDeadlineBelow10s" units="misses"
    expires_after="2024-02-04">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of times input audio data blocks that had to be buffered because
    there was not room in the shared memory ring buffer on the browser/renderer
    boundary. This happens if the reading side hasn't read data in time. This
    value is only logged for streams with less than 1000 input data pushes (10
    seconds for buffer size 10 ms).
  </summary>
</histogram>

<histogram name="Media.AudioCodec" enum="AudioCodec" expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <summary>Audio codec used in HTML5 media.</summary>
</histogram>

<histogram name="Media.AudioCodecProfile.AAC" enum="AudioCodecProfile"
    expires_after="2024-02-04">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Audio codec profile used in HTML5 media for AAC playback.</summary>
</histogram>

<histogram name="Media.AudioInputController" units="ms" expires_after="never">
<!-- expires-never: Audio pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>Measures the time taken for AudioInputController::</summary>
</histogram>

<histogram name="Media.AudioInputDevice.AudioServiceDelay" units="ms"
    expires_after="2024-02-11">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The audio capture delay in the Audio Service, including the IPC and the OS.
    Logged at every CaptureCallback::Capture() call at AudioInputDevice level.
  </summary>
</histogram>

<histogram name="Media.AudioInputDevice.AudioServiceGlitchCount{Duration}"
    units="glitches" expires_after="2024-02-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of events causing audio capture glitches in the Audio Service,
    including the IPC and the OS. A glitch is when capture data is dropped due
    to a buffer overflow. Logged at the end of each 1000-callback interval for
    Intervals. Logged at the end of the stream for Short.
  </summary>
  <token key="Duration" variants="AudioAggregationDuration"/>
</histogram>

<histogram name="Media.AudioInputDevice.AudioServiceGlitchDuration{Duration}"
    units="permille" expires_after="2024-02-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The proportion of the audio capture interval that was dropped due to buffer
    overflows in the Audio Service, including the IPC and the OS. Logged at the
    end of each 1000-callback interval for Intervals. Logged at the end of the
    stream for Short.
  </summary>
  <token key="Duration" variants="AudioAggregationDuration"/>
</histogram>

<histogram name="Media.AudioOutputController.CallbackError" enum="BooleanError"
    expires_after="2024-02-25">
  <owner>olka@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    A boolean that reflects whether or not an error was reported during audio
    rendering, reported after a stream has stopped, if it was started.
  </summary>
</histogram>

<histogram name="Media.AudioOutputController.LifeTime" units="ms"
    expires_after="never">
<!-- expires-never: used for audio output controller monitoring. -->

<!-- https://crbug.com/1036864 -->

  <owner>olka@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Time interval from the output stream controller construction to its
    destruction.
  </summary>
</histogram>

<histogram name="Media.AudioOutputController.ProxyStreamCreationResult"
    enum="AudioOutputStreamCreationResult" expires_after="2024-02-25">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether an AudioOutputController succeeded in creating and opening an output
    stream proxy after receiving a default device change event. Note: in
    September 2021 this histogram unintentionally swapped its meaning with
    Media.AudioOutputController.ProxyStreamCreationResultForDeviceChange.
  </summary>
</histogram>

<histogram
    name="Media.AudioOutputController.ProxyStreamCreationResultForDeviceChange"
    enum="AudioOutputStreamCreationResult" expires_after="2024-02-25">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether an AudioOutputController succeeded in creating and opening an output
    stream proxy. Only logged for the initial creation, subsequent re-creations
    due to device change events are logged in the
    Media.AudioOutputController.ProxyStreamCreationResult histogram. Note: in
    September 2021 this histogram unintentionally swapped its meaning with
    Media.AudioOutputController.ProxyStreamCreationResult.
  </summary>
</histogram>

<histogram name="Media.AudioOutputControllerDataNotReady" units="ms"
    expires_after="never">
<!-- expires-never: Audio pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Time spent waiting in AudioOutputController::WaitTillDataReady() if the data
    was not initially available.
  </summary>
</histogram>

<histogram name="Media.AudioOutputControllerPlaybackStartupSuccess"
    enum="BooleanSuccess" expires_after="never">
<!-- expires-never: Audio pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether playback started successfully after stream startup was requested.
  </summary>
</histogram>

<histogram name="Media.AudioOutputDevice.AudioServiceDelay{LatencyTag}"
    units="ms" expires_after="2024-02-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The audio playout delay in the Audio Service, including the IPC and the OS.
    Logged at every RenderCallback::Render() call at AudioPlayoutDevice level.
  </summary>
  <token key="LatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram
    name="Media.AudioOutputDevice.AudioServiceGlitchCount{Duration}{LatencyTag}"
    units="glitches" expires_after="2024-02-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of events causing audio playout glitches in the Audio Service,
    including the IPC and the OS. A glitch is an inserted silence due to an
    underrun. Logged at the end of each 1000-callback interval for Intervals.
    Logged at the end of the stream for Short.
  </summary>
  <token key="Duration" variants="AudioAggregationDuration"/>
  <token key="LatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram
    name="Media.AudioOutputDevice.AudioServiceGlitchDuration{Duration}{LatencyTag}"
    units="permille" expires_after="2024-02-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The proportion of the audio playout interval that was silent due to
    underruns in the Audio Service, including the IPC and the OS. Logged at the
    end of each 1000-callback interval for Intervals. Logged at the end of the
    stream for Short.
  </summary>
  <token key="Duration" variants="AudioAggregationDuration"/>
  <token key="LatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram name="Media.AudioOutputResampler.OpenLowLatencyStream"
    enum="AudioOutputResamplerLowLatencyOpenStreamResult"
    expires_after="2024-02-25">
  <owner>olka@chromium.org</owner>
  <owner>armax@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether a low latency stream to be rendered through the resampler was opened
    successfully or which type of fallback stream was used instead. In case a
    fake fallback stream is used it means audio rendered through the resampler
    will be muted. In case fallback fails entirely, renderer callback error will
    be signalled.
  </summary>
</histogram>

<histogram name="Media.AudioOutputStreamProxy.StreamFormat"
    enum="AudioOutputProxyStreamFormat" expires_after="2023-12-04">
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Records format used by AudioManager to create audio output stream proxy. If
    a fake stream is created it results in muted audio playback. Warning: this
    histogram was expired from 2021-01-01 to 2022-01-21; data may be missing.
  </summary>
</histogram>

<histogram name="Media.AudioRendererAudioGlitches" enum="AudioGlitchResult"
    expires_after="2023-04-16">
  <obsolete>
    Deprecated in favor of Media.AudioRendererAudioGlitches2. Data is no longer
    collected.
  </obsolete>
  <owner>henrika@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Captures if render-side audio glitches are detected or not. Sampled when a
    low-latency output audio stream is destructed.
  </summary>
</histogram>

<histogram name="Media.AudioRendererAudioGlitches2.{LatencyTag}"
    enum="AudioGlitchResult" expires_after="2024-02-05">
  <owner>dalecurtis@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Captures if render-side audio glitches are detected or not. Sampled when a
    low-latency output audio stream is destructed.
  </summary>
  <token key="LatencyTag">
    <variant name="" summary="All latencies combined"/>
    <variant name="LatencyExactMs"/>
    <variant name="LatencyInteractive"/>
    <variant name="LatencyPlayback"/>
    <variant name="LatencyRtc"/>
    <variant name="LatencyUnknown"/>
  </token>
</histogram>

<histogram name="Media.AudioRendererImpl.SinkStatus" enum="OutputDeviceStatus"
    expires_after="2024-03-10">
  <owner>olka@chromium.org</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Status of audio sink used by AudioRendererImpl. If not OK, a NullAudioSink
    will be used for audio output instead. This is logged for every call to
    AudioRendererImpl::Initialize, which generally occurs once per active audio
    session (i.e., between a play and pause). If audio track changes are ever
    enabled, it may additionally be called for every audio track change.
  </summary>
</histogram>

<histogram
    name="Media.AudioRendererMissedDeadline2{Mixing}{Duration}{LatencyTag}"
    units="permille" expires_after="2023-02-05">
  <obsolete>
    Deprecated in favor of Media.AudioRendererMissedDeadline3. Data is no longer
    collected.
  </obsolete>
  <owner>dalecurtis@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Proportion of SyncReader::Read() calls where the renderer missed its
    realtime deadline. Rounded up, clipped to 1/10 of the stream callbacks.
    Sampled when a low-latency output audio stream is destructed.
  </summary>
  <token key="Mixing">
    <variant name="" summary="Whole stream lifetime"/>
    <variant name=".Mixing" summary="During mixing"/>
  </token>
  <token key="Duration">
    <variant name=".Long"
        summary="Streams equal or longer than 3000 callbacks"/>
    <variant name=".Short" summary="Streams shorter than 3000 callbacks"/>
  </token>
  <token key="LatencyTag">
    <variant name="" summary="All latencies combined"/>
    <variant name=".LatencyExactMs"/>
    <variant name=".LatencyInteractive"/>
    <variant name=".LatencyPlayback"/>
    <variant name=".LatencyRtc"/>
    <variant name=".LatencyUnknown"/>
  </token>
</histogram>

<histogram
    name="Media.AudioRendererMissedDeadline3{Mixing}{Duration}{LatencyTag}"
    units="misses" expires_after="2024-02-20">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The number of SyncReader::Read() calls where the renderer missed its
    realtime deadline. Logged at the end of each 1000-read interval for
    Intervals. Logged at the end of the stream for Short.
  </summary>
  <token key="Mixing">
    <variant name="" summary="Whole stream lifetime"/>
    <variant name=".Mixing" summary="During mixing"/>
  </token>
  <token key="Duration">
    <variant name=".Intervals" summary="Whole intervals of 1000 reads"/>
    <variant name=".Short" summary="Streams shorter than 1000 reads"/>
  </token>
  <token key="LatencyTag">
    <variant name="" summary="All latencies combined"/>
    <variant name=".LatencyExactMs"/>
    <variant name=".LatencyInteractive"/>
    <variant name=".LatencyPlayback"/>
    <variant name=".LatencyRtc"/>
    <variant name=".LatencyUnknown"/>
  </token>
</histogram>

<histogram name="Media.AudioService.AudioManagerStartupTime" units="ms"
    expires_after="2024-09-01">
  <owner>fhernqvist@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    How long it take for the audio manager instance to be created by the audio
    service, in case the audio service owns the audio manager.
  </summary>
</histogram>

<histogram name="Media.AudioSystem.GetDeviceDescription.Result"
    enum="BooleanSuccess" expires_after="2024-03-24">
  <owner>toprice@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <summary>
    Records whether AudioSystemToServiceAdapter::GetDeviceDescriptions calls to
    the audio service returned successfully, or failed and retured an default
    empty list due to an audio service crash.
  </summary>
</histogram>

<histogram name="Media.AudioThreadStatus" enum="AudioThreadStatus"
    expires_after="never">
<!-- expires-never: Audio pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    State of the audio thread. A value of &quot;started&quot; is emitted once
    the hang monitor has been initialized. If the thread is detected as hung
    later, a value of &quot;hung&quot; is emitted. If the hung thread later
    recovers a value of &quot;recovered&quot; is emitted.
  </summary>
</histogram>

<histogram name="Media.AVDA.FrameInformation" enum="AVDAFrameInformation"
    expires_after="2020-09-05">
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record a count for each frame sent to the client by AVDA, separated by what
    type of frame it is: Non Overlay, secure overlay, etc.
  </summary>
</histogram>

<histogram name="Media.AVDA.FrameSentAsOverlay" enum="BooleanFrameAsOverlay"
    expires_after="M86">
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record a count for each frame sent to the client by AVDA. True counts
    indicate that the frame was an overlay (SurfaceView). False counts are for
    Non Overlay frames. This will be deprecated in favor of
    Media.AVDA.FrameInformation in M63.
  </summary>
</histogram>

<histogram name="Media.BreakoutBox.Usage" enum="BreakoutBoxUsage"
    expires_after="2024-02-25">
  <owner>guidou@chromium.org</owner>
  <owner>hta@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <summary>
    Usage of various BreakoutBox features. Recorded when a stream is created or
    transferred in MediaStreamTrackProcessor or MediaStreamTrackGenerator.
  </summary>
</histogram>

<histogram name="Media.Capabilities.DecodingInfo.Time.Video" units="ms"
    expires_after="never">
<!-- expires-never: performance monitoring. -->

  <owner>chcunningham@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time spent between receiving a decodingInfo() call and resolving it. It only
    record successful calls and ignores audio-only.
  </summary>
</histogram>

<histogram name="Media.Capabilities.DecodingInfo.Time.Video.Clear" units="ms"
    expires_after="never">
<!-- expires-never: performance monitoring. -->

  <owner>chcunningham@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time spent between receiving a decodingInfo() call and resolving it. It only
    record successful calls and ignores audio-only. This is a subset of
    Media.Capabilities.DecodingInfo.RequestTime.Video that only takes into
    account clear content.
  </summary>
</histogram>

<histogram name="Media.Capabilities.DecodingInfo.Time.Video.Encrypted"
    units="ms" expires_after="never">
<!-- expires-never: performance monitoring. -->

  <owner>chcunningham@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time spent between receiving a decodingInfo() call and resolving it. It only
    record successful calls and ignores audio-only. This is a subset of
    Media.Capabilities.DecodingInfo.RequestTime.Video that only takes into
    account encrypted content.
  </summary>
</histogram>

<histogram name="Media.ConditionalFocus.Decision"
    enum="ConditionalFocusDecision" expires_after="2023-09-17">
  <owner>eladalon@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Records (1) explicit conditional-focus API invocations, (2) microtask-borne
    decisions and (3) timer-triggered decisions.
  </summary>
</histogram>

<histogram name="Media.ConditionalFocus.ExplicitLateCall" units="ms"
    expires_after="2023-07-18">
  <owner>eladalon@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Records the delay experienced by late explicit invocations of the focus()
    API. By &quot;late&quot; we mean those calls which had no effect, on account
    of arriving after the browser-side timer forced an implicit decision. (Note
    that post-microtask explicit invocations are not recorded. They're simply an
    application error.)
  </summary>
</histogram>

<histogram name="Media.ConditionalFocus.ExplicitOnTimeCall" units="ms"
    expires_after="2023-07-18">
  <owner>eladalon@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Records the delay experienced by on-time explicit invocations of the focus()
    API. By &quot;on-time&quot; we mean those calls which had an effect, on
    account of arriving before either the microtask or the browser-side timer
    forced an implicit decision.
  </summary>
</histogram>

<histogram name="Media.ConditionalFocus.MicrotaskDelay" units="ms"
    expires_after="2023-07-18">
  <owner>eladalon@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Track the delay distribution of invocations of the microtask. Measure this
    independently of whether an explicit API call was made, and independently of
    whether the browser-side timer expired.
  </summary>
</histogram>

<histogram base="true" name="Media.ConfigChangeDecoderSelectionTime" units="ms"
    expires_after="2023-01-01">
  <obsolete>
    Removed 02/2023 due to lack of further need for this data.
  </obsolete>
  <owner>cassew@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Duration of decoder selection during config changes, measured from first
    call to 'DecoderSelector::SelectDecoder' to
    'DecoderSelector::FinalizeSelection'. The HW/SW suffix indicates the type of
    the decoder that was ultimately selected.
  </summary>
</histogram>

<histogram name="Media.Controls.CTR" enum="MediaControlsCTREvent"
    expires_after="2024-02-11">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records events related to click through rate (CTR) calculation.

    The CTR can be calculated by computing &quot;Interacted&quot; /
    &quot;Displayed&quot;. &quot;Interacted&quot;, for buttons, means that they
    were clicked. For sliders, it will reflect any change in the internal state
    and includes other events in addition to clicks. &quot;Displayed&quot; means
    that the control element was meant to be displayed in the controls. It does
    not mean that the user have seen the element so is not to be confused with
    visibility. Furthermore, because the controls UI changes while loading,
    &quot;Displayed&quot; is only computed when metadata are available unless
    preloading was disabled on the element or the browser.

    Data is missing from 2020-04-05 to 2021-05-18.
  </summary>
</histogram>

<histogram name="Media.Controls.OverlayCastButtonIsCovered" enum="Boolean"
    expires_after="2024-03-10">
  <owner>takumif@chromium.org</owner>
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records how often the overlay cast button is hidden because it is covered by
    another html element. Emitted when the overlay cast button is tried to be
    shown.
  </summary>
</histogram>

<histogram name="Media.Controls.PlaybackSpeed"
    enum="MediaControlsPlaybackSpeed" expires_after="2023-11-12">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record the playback speed selected by the user in the list of playback
    speeds on the media controls.
  </summary>
</histogram>

<histogram name="Media.Controls.Show.Audio" enum="MediaControlsShowReason"
    expires_after="2023-12-24">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record whether the default media controls of an audio element were shown and
    why every time they could be shown. Note that audio elements that were not
    insterted to the DOM and do not have a controls attribute are not taken into
    account.
  </summary>
</histogram>

<histogram name="Media.Controls.Show.Video" enum="MediaControlsShowReason"
    expires_after="2022-10-30">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record whether the default media controls of a video element were shown and
    why every time they could be shown.
  </summary>
</histogram>

<histogram name="Media.CrosBeamformingDeviceState"
    enum="CrosBeamformingDeviceState" expires_after="M85">
  <owner>dalecurtis@chromium.org</owner>
  <summary>
    The state of the user selected virtual beamforming audio device on CrOS.
    It's logged whenever the format of the audio input stream is queried, which
    at least happens on stream startup, but could happen at other times as well.
  </summary>
</histogram>

<histogram name="Media.CrosGlobalMediaControls.PinAction" enum="BooleanPinned"
    expires_after="2022-04-24">
  <owner>jazzhsue@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record each time user pins/unpins CrOS global media controls.
  </summary>
</histogram>

<histogram name="Media.CrosGlobalMediaControls.QuickSettingUserAction"
    enum="MediaSessionAction" expires_after="2022-04-24">
  <owner>jazzhsue@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The action user clicked on the media controls in quick settings.
  </summary>
</histogram>

<histogram name="Media.CrosGlobalMediaControls.RepeatUsageInQuickSetting"
    enum="BooleanIsRepeat" expires_after="2022-05-01">
  <owner>jazzhsue@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record each time media controls' sub-menu in quick settings is opened. True
    if it is a repeat usage.
  </summary>
</histogram>

<histogram name="Media.CrosGlobalMediaControls.RepeatUsageOnShelf"
    enum="BooleanIsRepeat" expires_after="2022-04-24">
  <owner>jazzhsue@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record each time global media controls on the shelf is opened. True if it is
    a repeat usage.
  </summary>
</histogram>

<histogram name="Media.D3D11.UnusedPictureBufferCount.MultiTexture"
    units="instances" expires_after="2022-11-01">
  <owner>liberato@chromium.org</owner>
  <owner>tmathmeyer@chromium.org</owner>
  <summary>
    This histogram lets us count how many PictureBuffers we've overallocated
    when we're allocating each texture separately. This case is relatively
    simple to optimize compared to SingleTexture.
  </summary>
</histogram>

<histogram name="Media.D3D11.UnusedPictureBufferCount.SingleTexture"
    units="instances" expires_after="2022-11-01">
  <owner>liberato@chromium.org</owner>
  <owner>tmathmeyer@chromium.org</owner>
  <summary>
    This histogram lets us count how many PictureBuffers we've overallocated
    when we're allocating in contiguous blocks. This case is harder to optimize
    than the MultiTexture variant, but it is good to know the proportion of the
    two of them to determine usage.
  </summary>
</histogram>

<histogram name="Media.DetectedAudioCodecHash" enum="FFmpegCodecHashes"
    expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Audio codec used in HTML5 media. Reporting corrected in M51 to include all
    detected audio codecs, not just those up to and including the first one
    supported.
  </summary>
</histogram>

<histogram name="Media.DetectedAudioCodecHash.Local" enum="FFmpegCodecHashes"
    expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Audio codec used in HTML5 media for a local file playback.</summary>
</histogram>

<histogram name="Media.DetectedContainer" enum="MediaContainers"
    expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Container used for HTML5 media. Views that include pre-M34 data will
    categorize dash (38) and smooth streaming (39) in the &quot;Other&quot;
    bucket.
  </summary>
</histogram>

<histogram name="Media.DetectedContainer.Local" enum="MediaContainers"
    expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Container used for HTML5 media for a local file playback.</summary>
</histogram>

<histogram name="Media.DetectedVideoCodecHash" enum="FFmpegCodecHashes"
    expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video codec used in HTML5 media. Reporting corrected in M51 to include all
    detected video codecs, not just those up to and including the first one
    supported.
  </summary>
</histogram>

<histogram name="Media.DetectedVideoCodecHash.Local" enum="FFmpegCodecHashes"
    expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Video codec used in HTML5 media for a local file playback.</summary>
</histogram>

<histogram name="Media.DocumentPictureInPicture.CloseReason"
    enum="DocumentPictureInPictureCloseReason" expires_after="2024-02-01">
  <owner>steimel@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the reason why a document picture-in-picture window is closed (e.g.
    the user clicking on the Back to Tab button). Recorded on destruction of the
    picture-in-picture window.
  </summary>
</histogram>

<histogram name="Media.DroppedFrameCount" units="units" expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Count of dropped frames between pipeline start and stop. Media pipeline
    starts/stops when an HTML5 video is loaded/unloaded respectively in the
    browser.
  </summary>
</histogram>

<histogram name="Media.DroppedFrameCount2.{RendererType}.{ClearOrEncrypted}"
    units="units" expires_after="2024-02-20">
  <owner>dalecurtis@chromium.org</owner>
  <owner>frankli@microsoft.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Monitors the DroppedFrameCount that is originated from a {RendererType} and
    the video playback is {ClearOrEncrypted}. It is the count of dropped video
    frames when an HTML5 video is unloaded.
  </summary>
  <token key="RendererType" variants="RendererType"/>
  <token key="ClearOrEncrypted">
    <variant name="Clear"/>
    <variant name="Encrypted"/>
  </token>
</histogram>

<histogram name="Media.DXVAVDA.DecoderLifetimeProgression"
    enum="DXVALifetimeProgression" expires_after="2022-04-24">
  <obsolete>
    Removed 05/2022 due to lack of further need for this data.
  </obsolete>
  <owner>liberato@chromium.org</owner>
  <owner>tmathmeyer@chromium.org</owner>
  <summary>
    This enum allows us to count DXVAVideoDecoderWin specific crashes and
    initialization failures. This is recorded whenever the decoder is
    initialized or destroyed, or encounters an error.
  </summary>
</histogram>

<histogram name="Media.EME.CdmFileIO.FileSizeKBOnError" units="KB"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Size in KB of the last file successfully read by the CDM through CDM FileIO
    before a specific error happens. This is reported only when the error
    happens, which should be rare.
  </summary>
</histogram>

<histogram name="Media.EME.CdmFileIO.FileSizeKBOnFirstRead" units="KB"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Size in KB of the first file successfully read by the CDM through CDM
    FileIO. This is recorded once per CDM instance.
  </summary>
</histogram>

<histogram name="Media.EME.CdmFileIO.TimeTo.{FileOperation}{IncognitoOrNormal}"
    units="ms" expires_after="2024-04-11">
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The actual time spent by the CDM FileIO {FileOperation} operation under
    {IncognitoOrNormal} mode. Only recorded for successful operations.
  </summary>
  <token key="FileOperation" variants="FileOperation"/>
  <token key="IncognitoOrNormal" variants="IncognitoOrNormal"/>
</histogram>

<histogram name="Media.EME.CdmFileIO.{FileOperation}{IncognitoOrNormal}"
    enum="BooleanSuccess" expires_after="2024-04-11">
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether a CDM FileIO {FileOperation} operation succeded or not under
    {IncognitoOrNormal} mode.
  </summary>
  <token key="FileOperation" variants="FileOperation"/>
  <token key="IncognitoOrNormal" variants="IncognitoOrNormal"/>
</histogram>

<histogram name="Media.EME.CdmFileIO::OpenFile" enum="CdmStorageStatus"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The status of file open received by MojoCdmFileIO. This is reported every
    time the CDM tries to open a file for read or write.
  </summary>
</histogram>

<histogram name="Media.EME.CdmHostVerificationStatus"
    enum="CdmHostVerificationStatus" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The status of CDM host verification. This is reported per CDM load.
  </summary>
</histogram>

<histogram name="Media.EME.CdmInterfaceVersion" enum="GenericEnum"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Chromium could support multiple versions of CDM interface. This metric
    records the CDM interface version that the CDM created by Chromium uses.
    This is recorded once per CDM instance.
  </summary>
</histogram>

<histogram name="Media.EME.CdmLoadErrorCode" enum="WinGetLastError"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The error code of a library CDM load failure. Only reported on Windows.
  </summary>
</histogram>

<histogram name="Media.EME.CdmLoadResult" enum="CdmLoadResult"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>The result from an attempt to load a library CDM.</summary>
</histogram>

<histogram name="Media.EME.CdmLoadTime" units="ms" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>The time spent to load a library CDM.</summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabaseSQLiteError"
    enum="SqliteLoggedResultCode" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    SQLite specific errors reported while using the Cdm Storage Database.
    Recorded on any error from a database operation.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabaseSQLiteError.ClearDatabase"
    enum="SqliteLoggedResultCode" expires_after="2023-12-19">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records SQLite specific errors that occur when clearing the Cdm
    Storage Database. This UMA is recorded on every error for this operation.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabaseSQLiteError.DeleteFile"
    enum="SqliteLoggedResultCode" expires_after="2023-12-19">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records SQLite specific errors that occur when deleting a singular
    file in the Cdm Storage Database. This UMA is recorded on every error for
    this operation.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabaseSQLiteError.DeleteForStorageKey"
    enum="SqliteLoggedResultCode" expires_after="2023-12-19">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records SQLite specific errors that occur when deleting multiple
    files for a single storage key in the Cdm Storage Database. This UMA is
    recorded on every error for this operation.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabaseSQLiteError.OpenDatabase"
    enum="SqliteLoggedResultCode" expires_after="2023-12-19">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records SQLite specific errors that occur when opening the Cdm
    Storage Database. This UMA is recorded on every error for this operation.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabaseSQLiteError.ReadFile"
    enum="SqliteLoggedResultCode" expires_after="2023-12-19">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records SQLite specific errors that occur when reading a file from
    the Cdm Storage Database. This UMA is recorded on every error for this
    operation.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabaseSQLiteError.WriteFile"
    enum="SqliteLoggedResultCode" expires_after="2023-12-19">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records SQLite specific errors that occur when writing a file to
    the Cdm Storage Database. This UMA is recorded on every error for this
    operation.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DatabaseOpenError"
    enum="CdmStorageOpenError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from opening the CdmStorageDatabase.
    Recorded on every open.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DatabaseOpenError.Incognito"
    enum="CdmStorageOpenError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from opening the CdmStorageDatabase.
    Recorded on every open from an Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DatabaseOpenError.NotIncognito"
    enum="CdmStorageOpenError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from opening the CdmStorageDatabase.
    Recorded on every open from a non-Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DeleteDatabaseError.Incognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the DeleteDatabase function. Recorded
    after every call of DeleteDatabase on Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DeleteDatabaseError.NotIncognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the DeleteDatabase function. Recorded
    after every call of DeleteDatabase on non-Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DeleteFileError.Incognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the DeleteFile function. Recorded
    after every call of DeleteFile on Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DeleteFileError.NotIncognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the DeleteFile function. Recorded
    after every call of DeleteFile on non-Incognito profile.
  </summary>
</histogram>

<histogram
    name="Media.EME.CdmStorageManager.DeleteForStorageKeyError.Incognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the DeleteForStorageKey function.
    Recorded after every call of DeleteForStorageKey on Incognito profile.
  </summary>
</histogram>

<histogram
    name="Media.EME.CdmStorageManager.DeleteForStorageKeyError.NotIncognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the DeleteForStorageKey function.
    Recorded after every call of DeleteForStorageKey on non-Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.ReadFileError.Incognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the ReadFile function. Recorded after
    every call of ReadFile on Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.ReadFileError.NotIncognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the ReadFile function. Recorded after
    every call of ReadFile on non-Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.WriteFileError.Incognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the WriteFile function. Recorded
    after every call of WriteFile on Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageManager.WriteFileError.NotIncognito"
    enum="BooleanError" expires_after="2024-08-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the WriteFile function. Recorded
    after every call of WriteFile on non-Incognito profile.
  </summary>
</histogram>

<histogram name="Media.EME.CrosCdmType" enum="CrosCdmType"
    expires_after="2024-03-17">
  <owner>jkardatzke@chromium.org</owner>
  <owner>cros-gfx-video@google.com</owner>
  <summary>
    Whether we used the platform CDM on Chrome OS that includes HW secure
    Widevine support, or fell back to the Chrome SW CDM.
  </summary>
</histogram>

<histogram name="Media.EME.CrosPlatformCdm.SystemCode" enum="CdmSystemCode"
    expires_after="2024-01-15">
  <owner>jkardatzke@chromium.org</owner>
  <owner>cros-gfx-video@google.com</owner>
  <summary>System code in promise rejection for ChromeOS platform CDM.</summary>
</histogram>

<histogram name="Media.EME.EncryptedEvent" enum="BooleanEncryptedEvent"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether EME encrypted event has been fired. Every time a WebMediaPlayerImpl
    object is created a &quot;false&quot; value is reported to provide a
    baseline. Every time an encrypted event is fired, a &quot;true&quot; value
    will be reported. Note that it is possible to have multiple encrypted events
    during the lifetime of a WebMediaPlayerImpl object.
  </summary>
</histogram>

<histogram name="Media.EME.EncryptedMediaEnabled" enum="BooleanEnabled"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether encrypted media is enabled when requestMediaKeySystemAccess() is
    called. User can enable and disable encrypted media in content settings.
    Recorded when requestMediaKeySystemAccess() is called but will be reported
    at most once per renderer process.
  </summary>
</histogram>

<histogram name="Media.EME.EncryptionScheme.Initial.Audio"
    enum="MediaEncryptionScheme" expires_after="2024-04-11">
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The encryption scheme used by the audio stream in an HTML5 video. Reported
    when metadata is available if the initial config is encrypted.
  </summary>
</histogram>

<histogram name="Media.EME.EncryptionScheme.Initial.Video"
    enum="MediaEncryptionScheme" expires_after="2024-04-11">
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The encryption scheme used by the video stream in an HTML5 video. Reported
    when metadata is available if the initial config is encrypted.
  </summary>
</histogram>

<histogram name="Media.EME.IsIncognito" enum="BooleanIncognito"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether a given WebMediaPlayer instance, with a CDM attached, is played in
    an incognito window or in Chrome OS guest mode. Players that never started
    playback are excluded. Recorded once at time of player destruction.
  </summary>
</histogram>

<histogram name="Media.EME.MediaCryptoAvailable" enum="BooleanAvailable"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether MediaCrypto is available on a MediaDrm-based CDM. Reported once per
    MediaDrmBridge creation. In normal cases it should always be available.
  </summary>
</histogram>

<histogram name="Media.EME.MediaDrm.GetOriginIdResult" enum="GetOriginIdResult"
    expires_after="2024-04-11">
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The status of every attempt to obtain a pre-provisioned origin ID to be used
    by MediaDrm. This will only be reported for applications that use
    MediaDrmOriginIdManager.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaDrm.PreprovisionedOriginId.NonPerAppProvisioningDevice"
    units="units" expires_after="2024-04-11">
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of pre-provisioned origin IDs available shortly after startup on
    devices that do not support per-application provisioning.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaDrm.PreprovisionedOriginId.PerAppProvisioningDevice"
    units="units" expires_after="2024-04-11">
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of pre-provisioned origin IDs available shortly after startup on
    devices that support per-application provisioning.
  </summary>
</histogram>

<histogram name="Media.EME.MediaDrmBridge.KeySystemSupport"
    enum="BooleanSupported" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether MediaDrmBridge supports the key system. Reported once per
    MediaDrmBridge creation. In normal cases it should always be supported.
  </summary>
</histogram>

<histogram name="Media.EME.MediaFoundationCdm.ActivateCdmFactory"
    enum="Hresult" expires_after="2024-04-11">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULT of MediaFoundationCdmModule::ActivateCdmFactory(). This is only
    reported when ActivateCdmFactory() fails.
  </summary>
</histogram>

<histogram name="Media.EME.MediaFoundationCdm.LoadErrorCode"
    enum="WinGetLastError" expires_after="2024-04-11">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The error code of a library CDM load failure. Only reported on Windows.
  </summary>
</histogram>

<histogram name="Media.EME.MediaFoundationCdm.LoadResult" enum="CdmLoadResult"
    expires_after="2024-04-11">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The result from an attempt to load a library MediaFoundation CDM.
  </summary>
</histogram>

<histogram name="Media.EME.MediaFoundationCdm.LoadTime" units="ms"
    expires_after="2024-04-11">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>The time spent to load a library MediaFoundation CDM.</summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationCdm.Widevine.HardwareSecure.FirstInitialize"
    enum="Hresult" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULT of the first (and only the first) MediaFoundationCdm initialization
    in a MeidaFoundationService process when using Widevine in hardware secure
    mode. Reported on both successes and failures.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationCdm.Widevine.HardwareSecure.Initialize"
    enum="Hresult" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULT of MediaFoundationCdm initialization when using Widevine in hardware
    secure mode. Only reported on failures.
  </summary>
</histogram>

<histogram name="Media.EME.MediaFoundationCdm.Widevine.HardwareSecure.{EmeApi}"
    enum="Hresult" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULT of MediaFoundationCdm and MediaFoundationCdmSession operations when
    using Widevine in hardware secure mode.
  </summary>
  <token key="EmeApi" variants="EmeApi"/>
</histogram>

<histogram name="Media.EME.MediaFoundationService.Crash2"
    enum="BooleanAfterPowerOrDisplayChange" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether a MediaFoundationService process crash is within 5 seconds after
    power or display change. Reported when the MediaFoundationService process
    crashes.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.ErrorAfterPowerOrDisplayChange2"
    enum="Hresult" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULTs associated with errors happened in the MediaFoundationService
    process within 5 seconds after power or display change.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.ErrorNotAfterPowerOrDisplayChange2"
    enum="Hresult" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULTs associated with errors happened in the MediaFoundationService
    process NOT within 2 seconds after power or display change.
  </summary>
</histogram>

<histogram name="Media.EME.MediaFoundationService.HardwareContextReset"
    enum="BooleanAfterPowerOrDisplayChange" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether a HardwareContextReset event happened in the MediaFoundationService
    process within 5 seconds after power or display change. Reported whenever
    such an event happens.
  </summary>
</histogram>

<histogram name="Media.EME.MediaFoundationService.IsKeySystemSupported"
    units="ms" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time for MediaFoundationService.IsKeySystemSupported() to finish. Reported
    once per browser session lifetime.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.Widevine.HardwareSecure.IsTypeSupported"
    units="ms" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time for IMFContentDecryptionModuleFactory::IsTypeSupported() to finish in
    MediaFoundationService when using Widevine in hardware secure mode, which
    are called by MediaFoundationService.IsKeySystemSupported() (called once per
    browser session lifetime). IsKeySystemSupported() calls IsTypeSupported()
    multiple times, for different audio/video codecs and encryption schemes.
  </summary>
</histogram>

<histogram name="Media.EME.MediaLicenseDatabaseCreateDirectoryError"
    enum="PlatformFileError" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Platform File specific errors reported while attempting to open the Media
    License Database.
  </summary>
</histogram>

<histogram name="Media.EME.MediaLicenseDatabaseOpenQuotaError"
    enum="QuotaError" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Quota errors reported while attempting to unsuccessfully open the Media
    License Database.
  </summary>
</histogram>

<histogram name="Media.EME.MediaLicenseDatabaseOpenSQLiteError"
    enum="SqliteLoggedResultCode" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    SQLite specific errors reported while attempting to unsuccessfully open the
    Media License Database.
  </summary>
</histogram>

<histogram name="Media.EME.MediaLicenseDatabaseSQLiteError"
    enum="SqliteLoggedResultCode" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    SQLite specific errors reported while opening and using the Media License
    Database.
  </summary>
</histogram>

<histogram name="Media.EME.MediaLicenseStorageHostOpenError"
    enum="MediaLicenseStorageHostOpenError" expires_after="2024-04-11">
  <obsolete>
    Deprecated in favor for Media.EME.MediaLicenseStorageHostOpenError.Incognito
    and Media.EME.MediaLicenseStorageHostOpenError.NotIncognito in 2/2023.
  </obsolete>
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    General errors reported while attempting to open the MediaLicenseDatabase.
  </summary>
</histogram>

<histogram name="Media.EME.MediaLicenseStorageHostOpenError.Incognito"
    enum="MediaLicenseStorageHostOpenError" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    General errors reported while attempting to open the MediaLicenseDatabase.
    This UMA further breaks down the UMA above by only reporting errors if the
    media license storage host error occurs during an incognito process.
  </summary>
</histogram>

<histogram name="Media.EME.MediaLicenseStorageHostOpenError.NotIncognito"
    enum="MediaLicenseStorageHostOpenError" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    General errors reported while attempting to open the MediaLicenseDatabase.
    This UMA further breaks down the UMA above by only reporting errors if the
    media license storage host error occurs during a non incognito process.
  </summary>
</histogram>

<histogram name="Media.EME.MojoCdm.ConnectionError"
    enum="BooleanConnectionError" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether connection error has happened for MojoCdm. Every time a MojoCdm
    object is created a &quot;false&quot; value is reported to provide a
    baseline. Every time a mojo connection error happened, a &quot;true&quot;
    value will be reported, which typically means a remote CDM process crash.
  </summary>
</histogram>

<histogram name="Media.EME.OutputProtection" enum="MediaOutputProtectionStatus"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Output protection query status and result. One query and one positive (no
    unprotected external links) result (if any) are reported per CDM instance.
  </summary>
</histogram>

<histogram name="Media.EME.OutputProtection.PlatformCdm"
    enum="MediaOutputProtectionStatus" expires_after="2022-01-15">
  <owner>jkardatzke@chromium.org</owner>
  <owner>cros-gfx-video@google.com</owner>
  <summary>
    Output protection query status and result. One query and one positive (no
    unprotected external links) result (if any) are reported per CDM instance.
  </summary>
</histogram>

<histogram name="Media.EME.RequestMediaKeySystemAccess.{KeySystem}"
    enum="RequestMediaKeySystemAccessStatus" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    {KeySystem} support query status and result, as reported by
    RequestMediaKeySystemAccess. Each value will be reported at most once per
    frame.
  </summary>
  <token key="KeySystem" variants="KeySystem"/>
</histogram>

<histogram
    name="Media.EME.RequestMediaKeySystemAccess.{KeySystem}.TimeTo.Reject"
    units="ms" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The time spent to reject RequestMediaKeySystemAccess() for {KeySystem}. Each
    time will be reported at most once per process. Only one of TimeTo.Resolve
    or TimeTo.Reject will be reported at most once per process for a
    {KeySystem}.
  </summary>
  <token key="KeySystem" variants="KeySystem"/>
</histogram>

<histogram
    name="Media.EME.RequestMediaKeySystemAccess.{KeySystem}.TimeTo.Resolve"
    units="ms" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The time spent to resolve RequestMediaKeySystemAccess() for {KeySystem}.
    Each time will be reported at most once per process. Only one of
    TimeTo.Resolve or TimeTo.Reject will be reported at most once per process
    for a {KeySystem}.
  </summary>
  <token key="KeySystem" variants="KeySystem"/>
</histogram>

<histogram name="Media.EME.UrlProvisionFetcher.ResponseCode"
    enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-04-11">
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The net error or HTTP response code of provisioning requests made by
    UrlProvisionFetcher on Android and Cast devices.
  </summary>
</histogram>

<histogram name="Media.EME.Widevine.HardwareSecure.CdmInfoStatus"
    enum="CdmInfoStatus" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The CdmInfo::Status of Widevine hardware secure CDM capability. Reported at
    most once per browser session when EME query is triggered by a website.
  </summary>
</histogram>

<histogram
    name="Media.EME.Widevine.HardwareSecure.ClearLeadSupport.{VideoCodec}"
    enum="BooleanSupported" expires_after="2024-04-11">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record for whether clear lead content is supported by the platform for
    hardware security. This is reported only on Windows devices, only when codec
    is supported for hardware security, per codec, and once per browser session
    lifetime.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.EME.Widevine.HardwareSecure.Pref" enum="BooleanEnabled"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether Media Foundation Widevine CDM is enabled or disabled based on
    previous disabled timestamps in &quot;Local State&quot; pref. This is
    reported once per browsing session around browser startup time if Media
    Foundation Widevine CDM is enabled and available.
  </summary>
</histogram>

<histogram name="Media.EME.Widevine.HardwareSecure.Support"
    enum="BooleanSupported" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When hardware secure decryption is enabled, whether Widevine hardware secure
    decryption is actually supported by the platform (device). Reported at most
    once per browser session when EME query is triggered by a website, and when
    Widevine hardware secure CDM was registered.
  </summary>
</histogram>

<histogram name="Media.EME.Widevine.HardwareSecure.Support.{VideoCodec}"
    enum="BooleanSupported" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When hardware secure decryption is enabled and supported by Widevine,
    whether {VideoCodec} video codec is supported by the platform (device).
    Reported at most once per browser session when EME query is triggered by a
    website, and when Widevine hardware secure CDM was registered.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.EME.Widevine.SoftwareSecure.SystemCode"
    enum="CdmSystemCode" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    System code in promise rejection when using Widevine key system in software
    secure mode.
  </summary>
</histogram>

<histogram name="Media.EME.Widevine.VideoCapability.HasEmptyRobustness"
    enum="BooleanEmpty" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether the robustness level of any video capability in the supported
    configuration passed into requestMediaKeySystemAccess() is empty. This is
    specific to the Widevine key system.
  </summary>
</histogram>

<histogram name="Media.EME.{KeySystem}.CreateCdm" enum="BooleanSuccess"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether the CDM instance is created successfully for {KeySystem}. Reported
    each time a CDM instance creation is attempted, usually as a result of
    Javascript call of createMediaKeys().
  </summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.CreateCdmTime" units="ms"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Time took to create the CDM instance for {KeySystem}.</summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.CreateSession.SessionType"
    enum="EmeSessionType" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>EME session type passed into CreateSession.</summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.GenerateRequest.MojoCdmTimeout"
    enum="CallbackTimeoutStatus" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The timeout status of MojoCdm::CreateSessionAndGenerateRequest() call.
  </summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.InitialKeyStatusMix"
    enum="CdmKeyStatusMix" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Reports a summary of key statuses associated with an EME CDM session.
    Reported once per EME CDM session on the first key statuses update.
  </summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.KeyStatusSystemCode"
    enum="CdmSystemCode" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>System code associated with key status for {KeySystem}.</summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.LibraryCdmAvailable"
    enum="BooleanAvailable" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether the CDM is available for {KeySystem} or not. In normal cases, this
    is reported once per render process if the EME API is used. In rare cases it
    could be reported more than once if the CDM is not available and then is
    component updated.
  </summary>
  <token key="KeySystem" variants="KeySystem"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.TimeTo{ResolveOrReject}.{EmeApi}"
    units="ms" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>The time it takes to {ResolveOrReject} a EME promise.</summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
  <token key="ResolveOrReject" variants="ResolveOrReject"/>
  <token key="EmeApi" variants="EmeApi"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.{EmeApi}" enum="CdmPromiseResult"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Result of EME promises that were handled by Chromium code.</summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
  <token key="EmeApi" variants="EmeApi"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.{EmeApi}.SystemCode"
    enum="CdmSystemCode" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>System code in promise rejection.</summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
  <token key="EmeApi" variants="EmeApi"/>
</histogram>

<histogram name="Media.Engagement.ScoreAtPlayback" units="%"
    expires_after="M82">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The media engagement score recorded at the time of playback. It is converted
    to a percentage so should be divided by 100 to get the actual score. It is
    only recorded for playback that is either lacking an audio track or not
    muted.
  </summary>
</histogram>

<histogram
    name="Media.Engagement.SignificantPlayers.PlayerNotAdded.AfterFirstTime"
    enum="InsignificantPlaybackReason" expires_after="M82">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the Media Engagement service doesn't determine a player to be
    significant. If a player is not significant the reasons why will be
    individually recorded to this histogram each time except for the first time
    which is recorded to a different histogram.

    The significant state of a player is reevaluated any time the state of the
    player changes (e.g. muted, playing/paused). If the player was not
    considered signficiant and still is not then we will record the reasons why
    in this histogram.
  </summary>
</histogram>

<histogram name="Media.Engagement.SignificantPlayers.PlayerNotAdded.FirstTime"
    enum="InsignificantPlaybackReason" expires_after="M82">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the Media Engagement service doesn't determine a player to be
    significant. If a player is not significant the reasons why will be
    individually recorded to this histogram the first time only.

    The significant state of a player is reevaluated any time the state of the
    player changes (e.g. muted, playing/paused). If the player was not
    considered signficiant and still is not then we will record the reasons why
    in this histogram.
  </summary>
</histogram>

<histogram name="Media.Engagement.SignificantPlayers.PlayerRemoved"
    enum="InsignificantPlaybackReason" expires_after="M77">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the Media Engagement service no longer determines a player to
    be significant. If a player is no longer significant, the reasons why will
    be individually recorded to this histogram.

    The significant state of a player is re-evaluted any time the state of the
    player changes (e.g. muted, playing/paused). If the player was previously
    considered significant and is no longer considered that we will record the
    reasons why in this histogram.
  </summary>
</histogram>

<histogram name="Media.FallbackToHighLatencyAudioPath"
    enum="BooleanDidFallBack" expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether Chrome had to fallback to the high latency audio path or not.
  </summary>
</histogram>

<histogram name="Media.FrameInfo.GuessedCodedSizeChangeSuccess"
    enum="BooleanSuccess" expires_after="2024-02-04">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Indicates if the guessed coded size matched the real coded size. Recorded on
    each resolution change where we had to guess a coded size.
  </summary>
</histogram>

<histogram name="Media.FrameInfo.GuessedInitialCodedSizeSuccess"
    enum="BooleanSuccess" expires_after="2024-02-04">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Indicates if the guessed coded size would have matched the real coded size.
    Recorded on acquisition of real coded size for the first frame of playback.
  </summary>
</histogram>

<histogram name="Media.FrameReadBackCount.{RendererType}" units="frames"
    expires_after="2024-03-08">
  <owner>dalecurtis@chromium.org</owner>
  <owner>frankli@microsoft.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Monitors the number of video frames being read back from a {RendererType}.
    It is the count of video frames being read back from an HTML5 video when it
    is unloaded.
  </summary>
  <token key="RendererType" variants="RendererType"/>
</histogram>

<histogram name="Media.GetDisplayMedia.Constraints.DisplaySurface"
    enum="GetDisplayMediaConstraintsDisplaySurface" expires_after="2024-03-17">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <summary>
    Records whether getDisplayMedia was called with the displaySurface
    constraint.
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.Constraints.MonitorTypeSurfaces"
    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2024-09-01">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <summary>
    Records whether getDisplayMedia was called with the monitorTypeSurfaces
    constraint.
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.Constraints.SelfBrowserSurface"
    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2023-05-07">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <summary>
    Records whether getDisplayMedia was called with the selfBrowserSurface
    constraint.
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.Constraints.SuppressLocalAudioPlayback"
    enum="GetDisplayMediaBooleanConstraint" expires_after="2023-05-07">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Records whether getDisplayMedia was called with the
    suppressLocalAudioPlayback constraint.
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.Constraints.SurfaceSwitching"
    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2023-05-07">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <summary>
    Records whether getDisplayMedia was called with the surfaceSwitching
    constraint.
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.Constraints.SystemAudio"
    enum="GetDisplayMediaIncludeExcludeConstraint" expires_after="2023-12-17">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Records whether getDisplayMedia was called with the systemAudio constraint.
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.RequiresUserActivationResult"
    enum="GetDisplayMediaTransientActivation" expires_after="2024-03-14">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <owner>hendrich@chromium.org</owner>
  <summary>
    Records whether getDisplayMedia was called with a user gesture (transient
    activation) or whether it wasn't required. The requirement is only enforced
    once `blink::features::kGetDisplayMediaRequiresUserActivation` is enabled
    and can be bypassed with the `ScreenCaptureWithoutGestureAllowedForOrigins`
    policy.
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.DeviceSelectorAvailable"
    enum="Boolean" expires_after="2023-02-12">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records if the Global Media Controls device selector was available. Recorded
    once per notification either when the device selector was shown or when the
    notification disappears.
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.DeviceSelectorOpened" enum="Boolean"
    expires_after="2024-02-25">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records if the Global Media Controls device selector was opened. Recorded
    once per notification either when the device selector was opened or when the
    notification disappears. This histogram is only recorded if the device
    selector was available.
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.DismissReason"
    enum="GlobalMediaControlsDismissReason" expires_after="2023-01-01">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded each time a media session is dismissed or removed from the Global
    Media Controls. Records the reason why it happened (e.g. user clicked the
    dismiss button or playback stopped).
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.EntryPoint"
    enum="GlobalMediaControlsEntryPoint" expires_after="2024-02-25">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the entry point whenever the user opens the Global Media Controls
    UI.
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.HasDefaultPresentationRequest"
    enum="Boolean" expires_after="2022-11-27">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records whether a media session is from a WebContents with a default
    PresentationReuqest. Recorded whenever a session is instantiated in the
    global media controls, even if the user doesn't open the UI to view it.
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.InteractionDelayAfterPause"
    units="ms" expires_after="2022-07-03">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded each time a paused media session is interacted with (e.g. playing
    the media or clicking on the notification to go back to the tab). Records
    the time passed since it was last interacted with (or since when it was
    paused if this is the first post-pause interaction).
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.MediaCastMode.{Action}"
    enum="GlobalMediaControlsCastMode" expires_after="2024-08-01">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the type of Media Route that users {Action} from the Global Media
    Controls dialog. Recorded when users click on a button and this histogram
    doesn't represent the actual number of sessions {Action}ed from the GMC
    dialog.
  </summary>
  <token key="Action">
    <variant name="Start" summary="start"/>
    <variant name="Stop" summary="stop"/>
  </token>
</histogram>

<histogram name="Media.GlobalMediaControls.NumberOfAvailableAudioDevices"
    units="devices" expires_after="2022-12-04">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded each time the Global Media Controls Device picker dialog is opened
    and is populated with devices. Records the number of device options
    displayed, possibly including the default fallback device.
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.RepeatUsage" enum="BooleanIsRepeat"
    expires_after="2024-02-04">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded each time the Global Media Controls dialog is opened. True if this
    was repeat usage of the dialog (e.g. if it's not the first time the dialog
    has been opened this session).
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.UserActionFocus"
    enum="BooleanFocused" expires_after="2024-02-04">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The focused state of the WebContents associated with the MediaSession that
    the user is interacting with via the Global Media Controls. Recorded when
    the user presses an action on the Global Media Controls dialog (e.g. play).
  </summary>
</histogram>

<histogram name="Media.GPU.HasEverLostContext" enum="ContextProviderPhase"
    expires_after="M77">
  <owner>dcastagna@chromium.org</owner>
  <summary>
    Records when a context provider is acquired in media, and when it's released
    because a context loss has been detected.
  </summary>
</histogram>

<histogram name="Media.GPU.OutputFormat" enum="OutputFormat"
    expires_after="2024-02-04">
  <owner>hitawala@chromium.org</owner>
  <owner>vasilyt@chromium.org</owner>
  <owner>shared-image-team@google.com</owner>
  <summary>
    Records the format used for creating video frames with GpuMemoryBuffers.
    Result is an enum that represents OutputFormat in
    GpuVideoAcceleratorFactoriesImpl. Recorded once per VideoFrame creation.
  </summary>
</histogram>

<histogram name="Media.GPU.OutputFormatHardwareGmb" enum="OutputFormat"
    expires_after="2024-02-04">
  <owner>hitawala@chromium.org</owner>
  <owner>vasilyt@chromium.org</owner>
  <owner>shared-image-team@google.com</owner>
  <summary>
    Records the format used for creating video frames with hardware backed
    GpuMemoryBuffers. Result is an enum that represents OutputFormat in
    GpuMemoryBufferVideoFramePool. Recorded once per VideoFrame creation.
  </summary>
</histogram>

<histogram name="Media.GPU.OutputFormatSoftwareGmb" enum="OutputFormat"
    expires_after="2024-02-04">
  <owner>hitawala@chromium.org</owner>
  <owner>vasilyt@chromium.org</owner>
  <owner>shared-image-team@google.com</owner>
  <summary>
    Records the format used for creating video frames with software backed
    GpuMemoryBuffers. Result is an enum that represents OutputFormat in
    GpuMemoryBufferVideoFramePool. Recorded once per VideoFrame creation.
  </summary>
</histogram>

<histogram name="Media.GPU.VideoDecoderType" enum="VideoDecoderType"
    expires_after="2024-02-04">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the VideoDecoderType used for GPU based video decoding. Recorded
    once per GPU mojo media client creation (~once per GPU process).
  </summary>
</histogram>

<histogram name="Media.GpuArcVideoDecodeAccelerator.InitializeFailed"
    enum="VideoCodecProfile" expires_after="2024-06-29">
  <owner>andrescj@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Counts the unsuccessful calls to GpuArcVideoDecodeAccelerator::Initialize()
    per VideoCodecProfile.
  </summary>
</histogram>

<histogram name="Media.GpuArcVideoDecodeAccelerator.InitializeSucceeded"
    enum="VideoCodecProfile" expires_after="2024-06-29">
  <owner>andrescj@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Counts the successful calls to GpuArcVideoDecodeAccelerator::Initialize()
    per VideoCodecProfile.
  </summary>
</histogram>

<histogram name="Media.GpuArcVideoDecodeAccelerator.InstanceCount.All"
    units="instances" expires_after="2024-06-22">
  <owner>andrescj@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Counts how many GpuArcVideoDecodeAccelerator instances are alive at the time
    a new GpuArcVideoDecodeAccelerator is created. Warning: this histogram was
    expired from 2023-01-22 to 2023-06-21; data may be missing.
  </summary>
</histogram>

<histogram name="Media.GpuArcVideoDecodeAccelerator.InstanceCount.Initialized"
    units="instances" expires_after="2024-06-22">
  <owner>andrescj@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Counts how many GpuArcVideoDecodeAccelerator instances that have gone
    through initialization (i.e., have an underlying
    media::VideoDecodeAccelerator) are alive at the time a
    GpuArcVideoDecodeAccelerator goes through initialization and successfully
    creates its underlying media::VideoDecodeAccelerator. Warning: this
    histogram was expired from 2023-01-22 to 2023-06-21; data may be missing.
  </summary>
</histogram>

<histogram name="Media.GpuMemoryBufferVideoFramePool.UnsupportedFormat"
    enum="VideoPixelFormatUnion" expires_after="2024-02-11">
  <owner>magchen@chromium.org</owner>
  <owner>mcasas@chromium.org</owner>
  <summary>
    GpuMemoryBufferVideoFramePool is called with an unsupported VideoFrame pixel
    format. Emitted on VideoFrame arrival.
  </summary>
</histogram>

<histogram name="Media.GpuVideoFrameFactory.SharedContextStateResult"
    enum="ContextResult" expires_after="2019-06-01">
  <owner>vikassoni@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <summary>
    The error code returned when GetSharedContextState() fails or MakeCurrent()
    on the SharedContextState fails.
  </summary>
</histogram>

<histogram name="Media.HardwareAudioChannelCount" units="units"
    expires_after="never">
<!-- expires-never: Media platform support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>Channel count of the hardware audio device.</summary>
</histogram>

<histogram name="Media.HardwareAudioChannelLayout" enum="ChannelLayout"
    expires_after="never">
<!-- expires-never: Media platform support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>Channel layout of the hardware audio device.</summary>
</histogram>

<histogram name="Media.HardwareAudioSamplesPerSecond" enum="AudioSampleRate"
    expires_after="never">
<!-- expires-never: Media platform support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>Samples per second of the hardware audio device.</summary>
</histogram>

<histogram name="Media.HardwareKeyPressed" enum="MediaHardwareKeyAction"
    expires_after="2021-08-29">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records media key presses that are handled by the
    HardwareKeyMediaController.
  </summary>
</histogram>

<histogram name="Media.HasAcceleratedVideoDecode.{CodecType}"
    enum="BooleanSupported" expires_after="2024-02-20">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Tracks accelerated video decoding support for a given codec. Recorded once
    per GPU process after an attempt to use accelerated video decoding.
  </summary>
  <token key="CodecType">
    <variant name="AV1"/>
    <variant name="H264"/>
    <variant name="H265"/>
    <variant name="VP9"/>
  </token>
</histogram>

<histogram name="Media.HasEverPlayed" enum="BooleanHasPlayed"
    expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether a given WebMediaPlayer instance, after preload, started playback;
    recorded once at time of player destruction.
  </summary>
</histogram>

<histogram base="true" name="Media.InitialDecoderSelectionTime" units="ms"
    expires_after="2023-03-25">
  <obsolete>
    Removed 02/2023 due to lack of further need for this data.
  </obsolete>
  <owner>cassew@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Duration of initial decoder selection. Measured from first call to
    'DecoderSelector::SelectDecoder' to 'DecoderSelector::FinalizeSelection'.
    The HW/SW suffix indicates the type of the decoder that was ultimately
    selected.
  </summary>
</histogram>

<histogram name="Media.InitializeRendererTimeout" enum="CallbackTimeoutStatus"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>The timeout status of Renderer initialization.</summary>
</histogram>

<histogram name="Media.InputErrorMac" enum="OSStatus_Audio"
    expires_after="never">
<!-- expires-never: essential indicator for audio input stability in Chrome -->

  <owner>olka@chromium.org</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>henrika@hromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Error codes that we encounter while setting up an AUAudioInputStream on Mac.
  </summary>
</histogram>

<histogram name="Media.InputStreamDuration" units="ms" expires_after="never">
<!-- expires-never: essential indicator for audio input stability in Chrome -->

  <owner>henrika@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Duration in milliseconds of low-latency audio input streams. Sampled when
    the stream is closed by the AudioInputController.
  </summary>
</histogram>

<histogram name="Media.InputStreamDurationWithoutCallback" units="ms"
    expires_after="2024-02-25">
  <owner>olka@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Duration in milliseconds of low-latency audio input streams which never got
    any callbacks. Warning: this histogram was expired from 2020-10-11 to
    2021-06-04; data may be missing.
  </summary>
</histogram>

<histogram name="Media.LoadType" enum="MediaLoadType"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Load type of HTML5 media, such as URL, MediaSource and MediaStream.
  </summary>
</histogram>

<histogram name="Media.LocalRendererSinkStates" enum="LocalRendererSinkStates"
    expires_after="2018-08-30">
  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
  <summary>
    State of the WebRtc local renderer, sampled once during the lifetime of a
    local renderer.
  </summary>
</histogram>

<histogram name="Media.LowLatencyAudioCaptureStartupSuccess"
    enum="AudioCaptureStartupResult" expires_after="2024-03-10">
  <owner>armax@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <summary>
    Whether capture started successfully after a low-latency input stream
    startup was requested.
  </summary>
</histogram>

<histogram name="Media.MCVD.ForwardVideoFrameTiming" units="ms"
    expires_after="2020-10-11">
  <owner>liberato@chromium.org</owner>
  <owner>sandersd@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <summary>
    The time between MediaCodec::dequeueOutputBuffer() and the dispatch of the
    corresponding VideoFrame from MediaCodecVideoDecoder.
  </summary>
</histogram>

<histogram name="Media.MeanTimeBetweenRebuffers" units="ms"
    expires_after="2024-02-04">
  <owner>dalecurtis@chromium.org</owner>
  <summary>
    The total watch time (see Media.WatchTime) of a given playback divided by
    the number of rebuffering events that occured during that playback. Only
    reported when rebuffering happened. Therefore, alway refer to other UMAs
    like `Media.RebuffersCount` when checking this UMA.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.EnumerateDevices.Latency" units="ms"
    expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <summary>
    The latency of calls to the navigator.mediaDevices.enumerateDevices() API
    which resolve, including both successes and failures. Note very long calls
    which record a EnumerateDevices.Result of kTimedOut but do eventually
    resolve will have their latency recorded.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.EnumerateDevices.Result"
    enum="EnumerateDevicesResult" expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <summary>
    The results of all calls to the navigator.mediaDevices.enumerateDevices()
    API, including successful promise resolutions, error codes, or kTimedOut, if
    the promise was still pending after 4 seconds.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetDisplayMedia.Latency" units="ms"
    expires_after="2024-03-24">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The latency of calls to the navigator.mediaDevices.GetDisplayMedia() API
    which resolve, including both successes and failures. Note very long calls
    which record a GetDisplayMedia.Result of kTimedOut but do eventually resolve
    will have their latency recorded.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetDisplayMedia.Result"
    enum="UserMediaRequestResult" expires_after="2024-01-21">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The results of all calls to the navigator.mediaDevices.GetDisplayMedia()
    API, including successful promise resolutions, error codes, or kTimedOut, if
    the promise was still pending after 6 seconds.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetDisplayMediaSet.Latency" units="ms"
    expires_after="2023-05-01">
  <owner>simonha@google.com</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The latency of calls to the navigator.mediaDevices.GetDisplayMediaSet() API
    which resolve, including both successes and failures. Note very long calls
    which record a GetDisplayMediaSet.Result of kTimedOut but do eventually
    resolve will have their latency recorded.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetDisplayMediaSet.Result"
    enum="UserMediaRequestResult" expires_after="2023-05-01">
  <owner>simonha@google.com</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The results of all calls to the navigator.mediaDevices.GetDisplayMediaSet()
    API, including successful promise resolutions, error codes, or kTimedOut, if
    the promise was still pending after 6 seconds.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetUserMedia.Latency" units="ms"
    expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The latency of calls to the navigator.mediaDevices.GetUserMedia() API which
    resolve, including both successes and failures. Note very long calls which
    record a GetUserMedia.Result of kTimedOut but do eventually resolve will
    have their latency recorded.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetUserMedia.Result"
    enum="UserMediaRequestResult" expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The results of all calls to the navigator.mediaDevices.GetUserMedia() API,
    including successful promise resolutions, error codes, or kTimedOut, if the
    promise was still pending after 8 seconds.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.SaltDatabaseErrors"
    enum="SqliteLoggedResultCode" expires_after="2024-07-12">
  <owner>guidou@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    Errors reported by SQLite while initializing or using the media-device salt
    database.
  </summary>
</histogram>

<histogram name="Media.MediaDevicesManager.VideoDeviceEnumeration.Result"
    enum="DeviceEnumerationResult" expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <summary>
    The success or failure code of MediaDevicesManager requests to enumerate
    video devices (ie cameras) with the camera capture service.
  </summary>
</histogram>

<histogram name="Media.MediaDevicesManager.VideoDeviceEnumeration.Start"
    enum="Boolean" expires_after="2024-05-01">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    Count of MediaDevicesManager starting enumerating video devices (ie cameras)
    with the camera capture service, including enumerations which never
    finished.
  </summary>
</histogram>

<histogram name="Media.MediaElement.ContentTypeParseable"
    enum="ContentTypeParseableResult" expires_after="2022-07-03">
  <obsolete>
    Removed 07/2022 due to lack of further need for this data.
  </obsolete>
  <owner>jrummell@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether the content type provided to HTMLMediaElement would parse with
    ParsedContentType or not.
  </summary>
</histogram>

<histogram name="Media.MediaFoundation.VideoColorSpace.PrimaryID"
    enum="VideoColorSpace.PrimaryID" expires_after="2023-08-27">
  <owner>dalecurtis@chromium.org</owner>
  <owner>macrabil@microsoft.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the VideoColorSpace VideoPrimaries value is passed to
    MediaFoundation for HDR content.
  </summary>
</histogram>

<histogram name="Media.MediaFoundation.VideoColorSpace.TransferID"
    enum="VideoColorSpace.TransferID" expires_after="2023-08-02">
  <owner>dalecurtis@chromium.org</owner>
  <owner>wicarr@microsoft.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the VideoColorSpace TransferFunction value is passed to
    MediaFoundation for HDR content.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.CreateMediaEngineError"
    enum="Hresult" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaFoundationRenderer::CreateMediaEngine() fails.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.ErrorReason"
    enum="MediaFoundationRendererErrorReason" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaFoundationRenderer or MediaFoundationRendererClient
    hits an error.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.FailedToSetDCompMode"
    enum="Hresult" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaFoundationRenderer hits an error when trying to set
    direct composition mode.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.InvalidHwdrmState.HasReportedPlaying"
    enum="Boolean" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not playback has started when DRM_E_TEE_INVALID_HWDRM_STATE
    happens in MediaFoundationRenderer.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.InvalidHwdrmState.VideoFrameDecoded"
    units="frames" expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of video frames decoded when DRM_E_TEE_INVALID_HWDRM_STATE
    happens in MediaFoundationRenderer.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.PlaybackError" enum="Hresult"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaFoundationRenderer hits a playback error. Some errors
    are part of the normal user flow (e.g. sleep/resume) and are not a bug.
  </summary>
</histogram>

<histogram name="Media.MediaKeysListener.RegisterHotKeyResult"
    enum="BooleanSuccess" expires_after="M82">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not the MediaKeysListener was able to successfully register a hot
    key. Failure typically indicates that the hotkey was already registered by a
    different application.
  </summary>
</histogram>

<histogram name="Media.MediaRecorder.Codec" enum="MediaRecorderCodec"
    expires_after="2024-02-11">
  <owner>clarissagarvey@chromium.org</owner>
  <owner>mcasas@chromium.org</owner>
  <summary>
    The codec and hardware/software variant used by MediaRecorder, recorded once
    when the VideoTrackRecorder initializes the encoder.
  </summary>
</histogram>

<histogram name="Media.MediaRecorder.HasCorrectAV1CodecString"
    enum="BooleanCorrect" expires_after="2023-12-31">
  <owner>hiroh@chromium.org</owner>
  <owner>handellm@google.com</owner>
  <summary>
    Record the correctness of the AV1 codecs string configured in MediaRecorder
    and queried in MediaCapabilities. It is recorded when Initialize() in
    MediaRecorder API is called and the capability is queried in
    MediaCapabilities API.
  </summary>
</histogram>

<histogram name="Media.MediaRecorder.VEAUsed" enum="MediaRecorderVEAUsed"
    expires_after="M95">
  <owner>mcasas@chromium.org</owner>
  <owner>wtlee@chromium.org</owner>
  <summary>Whether HW video encode is used in MediaRecorder.</summary>
</histogram>

<histogram name="Media.MediaStreamManager.DesktopVideoDeviceUpdate"
    enum="MediaStreamRequestResult2" expires_after="2023-07-16">
  <owner>eladalon@chromium.org</owner>
  <owner>tovep@chromium.org</owner>
  <summary>
    Records media stream request responses for desktop-video capture
    media-device-update requests.
  </summary>
</histogram>

<histogram name="Media.MediaStreamManager.DisplayVideoDeviceUpdate"
    enum="MediaStreamRequestResult2" expires_after="2023-09-17">
  <owner>eladalon@chromium.org</owner>
  <owner>tovep@chromium.org</owner>
  <summary>
    Records media stream request responses for display-video capture
    media-device-update requests.
  </summary>
</histogram>

<histogram name="Media.MicrophoneMuted" enum="MicrophoneMuteResult"
    expires_after="2024-02-20">
  <owner>henrika@chromium.org</owner>
  <owner>webrtc-audio@google.com</owner>
  <summary>
    Heuristically detects if the user has muted the microphone or not. Measured
    approximately four times per minute while an audio input stream is active.
  </summary>
</histogram>

<histogram name="Media.Midi.SendReceiveUsage" enum="MidiSendReceiveUsage"
    expires_after="2023-12-01">
  <owner>hongchan@chromium.org</owner>
  <owner>mjwilson@chromium.org</owner>
  <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
  <summary>
    Reports whether any data was sent or received by a MidiManager. Recorded
    once per MidiManager instantiation, upon destruction. MidiManager is
    instantiated when the first Web MIDI client starts a session, and destroyed
    when the last client ends the session.

    Warning: this histogram was expired from M86 to M91; data may be missing.
  </summary>
</histogram>

<histogram name="Media.Midi.SysExMessageSizeUpTo1MB" units="bytes"
    expires_after="2023-12-01">
  <owner>hongchan@chromium.org</owner>
  <owner>mjwilson@chromium.org</owner>
  <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
  <summary>
    Reports sysex message size.

    Warning: this histogram was expired from M86 to M91; data may be missing.
  </summary>
</histogram>

<histogram name="Media.Midi.Usage" enum="MidiUsage" expires_after="2023-12-01">
  <owner>hongchan@chromium.org</owner>
  <owner>mjwilson@chromium.org</owner>
  <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
  <summary>
    The MidiManager instance use count, but this is not intended to understand
    the real API usage because this can be counted by feature scanning scripts
    that are often used for footprinting. You may want to track SendReceiveUsage
    to monitor only instances that actually send or receive MIDI messages.

    Warning: this histogram was expired from M86 to M91; data may be missing.
  </summary>
</histogram>

<histogram name="Media.MojoVideoDecoder.ActiveInstances" units="units"
    expires_after="2024-03-17">
  <owner>sandersd@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the number of active MojoVideoDecoderService instances that are
    alive each time an instance becomes active. An instance is active if
    Decode() has been called at least once. This provides an estimate of the
    concurrent hardware resource requirements.
  </summary>
</histogram>

<histogram name="Media.MojoVideoDecoder.Decode" units="ms"
    expires_after="never">
<!-- expires-never: used by ChromeOS test infrastructure -->

  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Delay between a DecodeBuffer (and encoded chunk) input and a decoded
    VideoFrame being produced by the remote MojoVideoDecoder. Output once per
    successful decode.
  </summary>
</histogram>

<histogram name="Media.MojoVideoDecoder.InitialPlaybackErrorCodecCounter"
    units="instances" expires_after="2021-10-25">
  <owner>eugene@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <summary>
    Total number of instances of MojoVideoDecoder used by a page (i.e. render
    frame) when an instance of MojoVideoDecoder encountered a decoding error or
    a crash during the first 150 frames of a video stream.
  </summary>
</histogram>

<histogram name="Media.MojoVideoDecoder.InitialPlaybackSuccessCodecCounter"
    units="instances" expires_after="2021-10-25">
  <owner>eugene@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <summary>
    Total number of instances of MojoVideoDecoder used by a page (i.e. render
    frame) when an instance of MojoVideoDecoder successfuly decode the first 150
    frames of a video stream.
  </summary>
</histogram>

<histogram name="Media.MojoVideoEncodeAccelerator.InputStorageType"
    enum="VideoFrameStorageType" expires_after="2024-03-24">
  <owner>hiroh@chromium.org</owner>
  <owner>mcasas@chromium.org</owner>
  <summary>
    The storage type of media::VideoFrame passed to MojoVideoEncodeAccelerator
    for encoding. The histogram is recorded every frame encode request.
  </summary>
</histogram>

<histogram name="Media.MSE.AudioCodec" enum="MSECodec" expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>wolenetz@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Audio codec used in Media Source Extensions playback. Set when MediaSource
    addSourceBuffer() is successfully called during playback. Also set twice
    during a successful SourceBuffer changeType() operation. See issue 535738
    for reworking MSE codec histograms to record on each successfully parsed
    initialization segment (possibly filtered to record only when actual new
    codec configurations are parsed).
  </summary>
</histogram>

<histogram base="true" name="Media.MSE.CodecChangeTime" units="ms"
    expires_after="2023-07-02">
  <obsolete>
    Removed 02/2023 due to lack of further need for this data.
  </obsolete>
  <owner>wolenetz@chromium.org</owner>
  <owner>sandersd@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Duration of config changes that include codec changes, measured from before
    decoder flush until after the first output frame is returned. The HW/SW
    suffix indicates the type of the decoder that was ultimately selected.
  </summary>
</histogram>

<histogram name="Media.MSE.DemuxerDestructionTime" units="ms"
    expires_after="2020-10-11">
  <owner>wolenetz@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Amount of time taken to destroy one ChunkDemuxer object, not including
    initial background task scheduling delay.
  </summary>
</histogram>

<histogram name="Media.MSE.DetectedShakaPackagerInMp4" enum="BooleanDetected"
    expires_after="2022-06-19">
  <obsolete>
    Removed 02/2022 due to lack of further need for this data.
  </obsolete>
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Tracks if ShakaPackager metadata was detected in the MP4 'moov' atom during
    MSE based media playback. Recorded for every 'moov' atom, which is expected
    once per asset. Multiple assets may be played within the same MSE session.
  </summary>
</histogram>

<histogram name="Media.MSE.ExecutionContext" enum="MediaSourceExecutionContext"
    expires_after="2020-10-11">
  <owner>wolenetz@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    For each MediaSource instance, records the type of thread that created the
    instance.
  </summary>
</histogram>

<histogram name="Media.MSE.Mp4ConsecutiveEmptySamples" units="samples"
    expires_after="2023-07-02">
  <obsolete>
    Removed Jan 2023, no further data needed.
  </obsolete>
  <owner>wolenetz@chromium.org</owner>
  <owner>sandersd@chromium.org</owner>
  <summary>
    Reports the number of consecutive empty samples in a sequence within a track
    run. There can be zero or more such sequences in a track run, and each
    sequence is reported separately. This metric is expected to inform a
    heuristic to realistically bound the parsing complexity of track runs that
    may contain empty samples. See https://crbug.com/907268.
  </summary>
</histogram>

<histogram name="Media.MSE.Mp4EmptySamplesInTRun" units="samples"
    expires_after="2022-04-17">
  <obsolete>
    Removed Jan 2023, no further data needed.
  </obsolete>
  <owner>wolenetz@chromium.org</owner>
  <owner>sandersd@chromium.org</owner>
  <summary>
    Reports the number of empty samples within a track run. This metric is
    expected to inform a heuristic to realistically bound the parsing complexity
    of track runs that may contain empty samples. See https://crbug.com/907268.
  </summary>
</histogram>

<histogram name="Media.MSE.Mp4SampleSize" units="bytes"
    expires_after="2023-07-02">
  <obsolete>
    Removed Jan 2023, no further data needed.
  </obsolete>
  <owner>wolenetz@chromium.org</owner>
  <owner>sandersd@chromium.org</owner>
  <summary>
    Reports the size of each sample parsed. This metric is expected to inform a
    heuristic to realistically bound the parsing complexity of track runs that
    may contain empty or huge samples. See https://crbug.com/907268.
  </summary>
</histogram>

<histogram name="Media.MSE.Mp4TrunSampleCount" units="samples"
    expires_after="2023-07-02">
  <obsolete>
    Removed Jan 2023, no further data needed.
  </obsolete>
  <owner>wolenetz@chromium.org</owner>
  <owner>sandersd@chromium.org</owner>
  <summary>
    Reports the number of samples in each track run. This metric is expected to
    inform a heuristic to realistically bound the parsing complexity of track
    runs that may contain huge numbers of samples. See https://crbug.com/907268.
  </summary>
</histogram>

<histogram name="Media.MSE.VideoCodec" enum="MSECodec" expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>wolenetz@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video codec used in Media Source Extensions playback. Set when MediaSource
    addSourceBuffer() is successfully called during playback. Also set twice
    during a successful SourceBuffer changeType() operation. See issue 535738
    for reworking MSE codec histograms to record on each successfully parsed
    initialization segment (possibly filtered to record only when actual new
    codec configurations are parsed).
  </summary>
</histogram>

<histogram name="Media.MSE.VideoCodec.MP4" enum="MSECodec"
    expires_after="never">
<!-- expires-never: Codec and container support planning metric. -->

  <owner>wolenetz@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video codec used in Media Source Extensions playback if the media container
    is MP4. Set when MediaSource addSourceBuffer() is successfully called during
    playback. Also set twice during a successful SourceBuffer changeType()
    operation. See issue 535738 for reworking MSE codec histograms to record on
    each successfully parsed initialization segment (possibly filtered to record
    only when actual new codec configurations are parsed).
  </summary>
</histogram>

<histogram name="Media.MSE.VideoCodec.WebM" enum="MSECodec"
    expires_after="never">
<!-- expires-never: Codec and container support planning metric. -->

  <owner>wolenetz@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video codec used in Media Source Extensions playback if the media container
    is WebM. Set when MediaSource addSourceBuffer() is successfully called
    during playback. Also set twice during a successful SourceBuffer
    changeType() operation. See issue 535738 for reworking MSE codec histograms
    to record on each successfully parsed initialization segment (possibly
    filtered to record only when actual new codec configurations are parsed).
  </summary>
</histogram>

<histogram name="Media.Notification.ArtworkPresent" enum="Boolean"
    expires_after="2021-10-25">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether the media notification (including ones for Cast sessions) is
    displaying artwork. This is recorded when the artwork is updated by the
    underlying media session.
  </summary>
</histogram>

<histogram name="Media.Notification.Cast.Count" units="count"
    expires_after="2024-03-17">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of Cast media notifications that are currently being displayed.
    This is recorded when a media notification starts being displayed.
  </summary>
</histogram>

<histogram name="Media.Notification.Cast.UserAction" enum="MediaSessionAction"
    expires_after="2024-03-17">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the type of the action (e.g. pause) whenever the user makes an
    action on a Cast media notification. Starting and stopping casting is
    recorded in Media.GlobalMediaControls.MediaCastMode.Start and
    Media.GlobalMediaControls.MediaCastMode.Stop.
  </summary>
</histogram>

<histogram name="Media.Notification.Click" enum="MediaNotificationClickSource"
    expires_after="2020-06-07">
  <owner>mlamouri@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The type of media notification the user clicked to go back to Chrome.
  </summary>
</histogram>

<histogram name="Media.Notification.Count" units="count"
    expires_after="2024-03-17">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of media notifications that are currently being displayed
    (including ones for Cast sessions). This is recorded when a media
    notification starts being displayed.
  </summary>
</histogram>

<histogram name="Media.Notification.MetadataPresent"
    enum="MediaNotificationMetadata" expires_after="2021-10-25">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether the media notification (including ones for Cast sessions) is
    displaying certain types of metadata. This is recorded when the metadata is
    updated by the underlying media session.
  </summary>
</histogram>

<histogram name="Media.Notification.Source" enum="MediaNotificationSource"
    expires_after="2024-02-04">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The source of the underlying media session (e.g. ARC, web, Cast) that
    displayed the media notification. This is recorded when a notification is
    available to be shown.
  </summary>
</histogram>

<histogram name="Media.Notification.UserAction" enum="MediaSessionAction"
    expires_after="2024-03-17">
  <owner>beccahughes@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The action (e.g. pause) that a user clicked on a media notification
    (including ones for Cast sessions).
  </summary>
</histogram>

<histogram name="Media.OutputStreamDuration" units="ms"
    expires_after="2024-03-17">
  <owner>guidou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Duration of an audio output stream. Measured in AudioOutputController from
    when a stream is started until it is stopped. A stream is stopped when it is
    paused, closed (i.e. destructed), or when a device change event causes it to
    be restarted.
  </summary>
</histogram>

<histogram name="Media.PeakWebMediaPlayerCount" units="players"
    expires_after="M100">
  <obsolete>
    Removed 04/2022 due to lack of further need for this data.
  </obsolete>
  <owner>dalecurtis@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the peak number of WebMediaPlayer objects per RenderFrame upon
    RenderFrame destruction (both cleanly and via render process termination).
  </summary>
</histogram>

<histogram name="Media.PepperVideoDecoder.HardwareAccelerationBehavior"
    enum="PepperVideoDecoderHardwareAccelerationBehavior" expires_after="never">
<!-- expires-never: used by ChromeOS test infrastructure -->

  <owner>pmolinalopez@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    The hardware/software decoding behavior used for a PPB_VideoDecoder API
    instance. This UMA is recorded when the PepperVideoDecoderHost is destroyed.
  </summary>
</histogram>

<histogram base="true" name="Media.PepperVideoDecoderOutputPictureCount"
    enum="MediaVideoHeight" expires_after="2020-12-31">
  <owner>sandersd@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <summary>
    Counts every output picture emitted to a PPAPI client, categorized by size
    and decoder type. Flash will only use platform decoders, but NaCl clients
    can use either decoder type.
  </summary>
</histogram>

<histogram name="Media.PipelineStatus.AudioVideo.{VideoCodec}.{Pipeline}"
    enum="PipelineStatus" expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Status of the media pipeline at the end of its lifecycle for audio-video
    streams with {VideoCodec} video codec using {Pipeline}.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
  <token key="Pipeline">
    <variant name="DDS.HW"
        summary="RendererImpl with hardware decoder and
                 DecryptingDemuxerStream"/>
    <variant name="DDS.SW"
        summary="RendererImpl with software decoder and
                 DecryptingDemuxerStream"/>
    <variant name="DVD" summary="RendererImpl with DecryptingVideoDecoder"/>
    <variant name="HW" summary="RendererImpl with hardware decoder"/>
    <variant name="MediaFoundationRenderer"/>
    <variant name="SW" summary="RendererImpl with software decoder"/>
    <variant name="UnknownRenderer" summary="an unknown Renderer"/>
  </token>
</histogram>

<histogram name="Media.PipelineStatus.Start" enum="PipelineStatus"
    expires_after="2024-02-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Status of the media pipeline starting process (including demuxer and
    renderer initialization). If the media pipeline is destroyed during the
    starting process nothing will be reported, but this should relatively rare.
  </summary>
</histogram>

<histogram name="Media.PipelineStatus.{StreamType}" enum="PipelineStatus"
    expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Status of the media pipeline at the end of its lifecycle for {StreamType}
    streams.
  </summary>
  <token key="StreamType">
    <variant name="AudioOnly" summary="audio-only"/>
    <variant name="Unsupported" summary="unsupported"/>
    <variant name="VideoOnly" summary="video-only"/>
  </token>
</histogram>

<histogram name="Media.PlatformVideoDecoding.Decode" units="ms"
    expires_after="never">
<!-- expires-never: used by ChromeOS test infrastructure -->

  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Time for the platform-specific (set of) video decode acceleration command(s)
    to be executed. Output once per decode request submit.
  </summary>
</histogram>

<histogram name="Media.PlaybackPower.BatteryDelta"
    enum="MediaPlaybackPowerTypes" expires_after="2020-07-31">
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total battery (0-100 percent) consumed by playback. When divided by
    Media.PlaybackPower.ElapsedTime, this provides the average rate of battery
    drain for that category of playback. Units are (total) percent. This is
    recorded when an entire percent (or more) is consumed during playback. Since
    devices have different battery sizes, methods of measuring battery, and
    different power consumption rates, it's a good idea to filter by a specific
    device type and OS version before trying to interpret these results. The
    magnitude of these numbers, alone, is also likely hard to use, for this
    reason. Instead, consider comparing A/B experiments to see if they get
    larger or smaller. Playbacks under one msec are ignored.
  </summary>
</histogram>

<histogram name="Media.PlaybackPower.ElapsedTime"
    enum="MediaPlaybackPowerTypes" expires_after="2020-07-31">
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time, in msec, elapsed while consuming the battery described by
    Media.PlaybackPower.BatteryDelta. See that histogram for details. Recorded
    when one or more percent of battery is consumed during playback.
  </summary>
</histogram>

<histogram name="Media.ProgressEventTimerState"
    enum="HTMLMediaElement_ProgressEventTimerState" expires_after="2021-08-01">
  <owner>fdoray@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the state of an HTMLMediaElement when its &quot;progress event&quot;
    timer fires. Used to determine how often the timer causes unnecessary wake
    ups, to prioritize crbug.com/1143317 and measure the impact of eventual
    fixes.
  </summary>
</histogram>

<histogram name="Media.RebuffersCount" units="rebuffers" expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Indicates the number of rebuffers a given watch time session had.
  </summary>
</histogram>

<histogram name="Media.RegionCapture.CropTo.Latency" units="ms"
    expires_after="2024-01-15">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Duration in milliseconds of the time it takes for a
    BrowserCaptureMediaStreamTrack.cropTo() call to resolve(either successfully
    or with an error). Note a call which never resolves won't be counted in this
    metric.
  </summary>
</histogram>

<histogram name="Media.RegionCapture.CropTo.Result" enum="CropToResult"
    expires_after="2024-03-17">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Tracks the result of calls to BrowserCaptureMediaStreamTrack.cropTo().
  </summary>
</histogram>

<histogram name="Media.RegionCapture.ProduceCropTarget.Function.Result"
    enum="ProduceCropTargetFunctionResult" expires_after="2024-01-15">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Tracks the result of calls to MediaDevices.produceCropTarget().
    Specifically, this histogram tracks whether a new Promise was produced, and
    if not, why not. Another histogram tracks the result of new Promises, i.e.
    whether they were resolved or rejected.
  </summary>
</histogram>

<histogram name="Media.RegionCapture.ProduceCropTarget.Promise.Result"
    enum="ProduceCropTargetPromiseResult" expires_after="2024-01-15">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    When ProduceCropTarget() is called for the first time on a given
    HTMLElement, a new Promise is produced. This histogram tracks the result of
    this Promise - whether it was resolved or rejected.
  </summary>
</histogram>

<histogram name="Media.Remoting.AudioBitrate" units="kbps"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Measured audio content transfer bitrate while remoting content.
  </summary>
</histogram>

<histogram name="Media.Remoting.AudioChannelLayout" enum="ChannelLayout"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Audio channel layout used while remoting content.</summary>
</histogram>

<histogram name="Media.Remoting.AudioCodec" enum="AudioCodec"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Audio codec used while remoting content.</summary>
</histogram>

<histogram name="Media.Remoting.AudioSamplesPerSecond" enum="AudioSampleRate"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Audio sampling rate while remoting audio content.</summary>
</histogram>

<histogram name="Media.Remoting.AudioSamplesPerSecondUnexpected" units="Hz"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Audio sampling rate while remoting audio content (atypical values, in Hz).
  </summary>
</histogram>

<histogram name="Media.Remoting.Compatibility" enum="RemotingCompatibility"
    expires_after="2024-09-12">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Whether the given media is compatible with media remoting. Recorded whenever
    the conditions are met to start remoting (e.g. the media element is the
    dominant page content and is not paused).
  </summary>
</histogram>

<histogram name="Media.Remoting.RemotePlaybackEnabledByPage"
    enum="BooleanEnabled" expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Tracks whether a web page allows content to be remoted. Recorded when the
    media player finishes loading and when the site changes this attribute
    afterwards.
  </summary>
</histogram>

<histogram name="Media.Remoting.SessionDuration" units="ms"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Measures the duration of each remoting session.</summary>
</histogram>

<histogram name="Media.Remoting.SessionStartFailedReason"
    enum="RemotingStartFailReason" expires_after="2024-09-12">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Tracks the reason that a session failed to start.</summary>
</histogram>

<histogram name="Media.Remoting.SessionStartTrigger"
    enum="RemotingStartTrigger" expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Tracks the trigger for starting a remoting session.</summary>
</histogram>

<histogram name="Media.Remoting.SessionStopTrigger" enum="RemotingStopTrigger"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Tracks the trigger for stopping a remoting session.</summary>
</histogram>

<histogram name="Media.Remoting.ShortSessionDuration" units="ms"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Measures the duration of each remoting session shorter than 15 seconds.
  </summary>
</histogram>

<histogram name="Media.Remoting.TimeUntilFirstPlayout" units="ms"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Measures how long, from the start of a remoting session, until content began
    playing out on the remote device.
  </summary>
</histogram>

<histogram name="Media.Remoting.TimeUntilRemoteInitialized" units="ms"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Measures how long, from the start of a remoting session, until a message was
    received from the remote device indicating initialization succeeded.
  </summary>
</histogram>

<histogram name="Media.Remoting.TrackConfiguration"
    enum="RemotingTrackConfiguration" expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Tracks whether audio or video or both are remoted.</summary>
</histogram>

<histogram name="Media.Remoting.VideoAspectRatio" units="%"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Aspect ratio of video while remoting content.</summary>
</histogram>

<histogram name="Media.Remoting.VideoBitrate" units="kbps"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Measured video content transfer bitrate while remoting content.
  </summary>
</histogram>

<histogram name="Media.Remoting.VideoCodec" enum="VideoCodec"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Video codec used while remoting content.</summary>
</histogram>

<histogram name="Media.Remoting.VideoCodecProfile" enum="VideoCodecProfile"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Video codec profile used while remoting content.</summary>
</histogram>

<histogram name="Media.Remoting.VideoNaturalWidth" units="pixels"
    expires_after="2024-09-12">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Video width while remoting content.</summary>
</histogram>

<histogram name="Media.Remoting.VideoPixelRateSupport"
    enum="RemotingVideoPixelRateSupport" expires_after="2024-09-12">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Pixels-per-second in a video and whether the receiver supports its playback.
    Recorded whenever we are about to start media remoting a video.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.AverageQueueLengthX10"
    units="frames" expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    10 times the average queue length when Render() is called in the RTC
    low-latency video renderer. Repeatedly measured with a period of 100 s for
    as long as the stream is active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.DrainedFramesPermille"
    units="permille" expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Per mille of frames drained in the RTC low-latency video renderer.
    Repeatedly measured with a period of 100 s for as long as the stream is
    active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.DroppedFramesPermille"
    units="permille" expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Per mille of frames dropped in the RTC low-latency video renderer.
    Repeatedly measured with a period of 100 s for as long as the stream is
    active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.EnterDrainModeCount"
    units="count" expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Number of times drain mode is entered. Repeatedly measured with a period of
    100 s for as long as the stream is active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.MaxQueueLength"
    units="frames" expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The maximum queue length that is observed when Render() is called in the RTC
    low-latency video renderer. Repeatedly measured with a period of 100 s for
    as long as the stream is active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.MaxSizeDropQueueCount"
    units="count" expires_after="2023-10-22">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Number of times the maximum queue size is exceeded and the entire queue is
    dropped. Repeatedly measured with a period of 100 s for as long as the
    stream is active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.NoNewFrameToRenderPermille"
    units="permille" expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Per mille of render times where the queue is empty and there is no new frame
    to render. Repeatedly measured with a period of 100 s for as long as the
    stream is active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.ReduceSteadyStateCount"
    units="count" expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Number of times the reduce steady state queue feature is activated.
    Repeatedly measured with a period of 100 s for as long as the stream is
    active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.TotalFrames" units="frames"
    expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Total number of frames enqueued to the RTC low-latency video renderer.
    Repeatedly measured with a period of 100 s for as long as the stream is
    active.
  </summary>
</histogram>

<histogram name="Media.RtcLowLatencyVideoRenderer.TryToRenderFrameCount"
    units="count" expires_after="2024-02-25">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Number of times we try to render a new frame. Repeatedly measured with a
    period of 100 s for as long as the stream is active.
  </summary>
</histogram>

<histogram name="Media.RTCVideoDecoderError" enum="MediaStatusCode"
    expires_after="2024-04-20">
  <owner>posciak@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Counts of video decode errors reported to RTCVideoDecoder, recorded when an
    error is reportd to RTCVideoDecoder. Also used for DecoderStream. Expired in
    M83 and re-added in M92. Warning: this histogram was expired between
    2023-04-16 to 2023-04-20; data may be missing.
  </summary>
</histogram>

<histogram name="Media.RTCVideoDecoderFallbackReason.{Codecs}"
    enum="RTCVideoDecoderFallbackReason" expires_after="2024-02-20">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The reason for fallback to software decoding for the codec {Codecs}.
    Reported when a fallback to software decoding occurs.
  </summary>
  <token key="Codecs">
    <variant name="H264" summary=""/>
    <variant name="Other" summary=""/>
    <variant name="Vp8" summary=""/>
    <variant name="Vp9" summary=""/>
  </token>
</histogram>

<histogram name="Media.RTCVideoDecoderFirstFrameLatencyMs" units="ms"
    expires_after="2022-06-05">
  <owner>liberato@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Time from decoder creation until the first frame is decoded.
  </summary>
</histogram>

<histogram name="Media.RTCVideoDecoderInitDecodeSuccess" enum="BooleanSuccess"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>mcasas@chromium.org</owner>
  <owner>sprang@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Indicates whether we were successful in initializing hardware video decoder
    for use in the RTC pipeline.
  </summary>
</histogram>

<histogram name="Media.RTCVideoDecoderInitializationLatencyMs" units="ms"
    expires_after="2024-02-11">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Initialization latency of the hardware video decoder that is used in the RTC
    pipeline.
  </summary>
</histogram>

<histogram name="Media.RTCVideoDecoderMaxInFlightDecodes" units="frames"
    expires_after="2024-04-20">
  <owner>liberato@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Max number of frames sent for video decode via the DecoderStream adapter,
    that have not also returned a decoded video frame. The metric is emitted
    once per RTCVideoDecoderStreamAdapter instance, as the max observed value
    over that instance's lifetime. Warning: this histogram was expired between
    2022-08-14 to 2023-04-20; data may be missing.
  </summary>
</histogram>

<histogram name="Media.RTCVideoDecoderProfile" enum="VideoCodecProfile"
    expires_after="never">
<!-- expires-never: Codec and container support planning metric. -->

  <owner>mcasas@chromium.org</owner>
  <owner>sprang@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>Video codec profile used in RTC video decoder.</summary>
</histogram>

<histogram name="Media.RTCVideoDecoderReinitializationLatencyMs" units="ms"
    expires_after="2023-10-10">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Reinitialization latency of the hardware video decoder that is used in the
    RTC pipeline.
  </summary>
</histogram>

<histogram name="Media.RTCVideoDecoderStream.Error.OnFrameReady"
    enum="MediaStatusCode" expires_after="2021-08-15">
  <owner>liberato@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    This records the media::StatusCode from the RTCVideoDecoderStreamAdapter. It
    is emitted when the adapter encounters an error during decoding.
  </summary>
</histogram>

<histogram name="Media.RTCVideoEncoder.Initialize" units="ms"
    expires_after="2024-01-31">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    The duration of initializing a hardware encoder in WebRTC API. It is
    recorded whenever RTCVideoEncoder::InitEncode() is called.
  </summary>
</histogram>

<histogram name="Media.RTCVideoEncoderInitEncodeSuccess" enum="BooleanSuccess"
    expires_after="never">
<!-- expires-never: WebRTC health metric. -->

  <owner>mcasas@chromium.org</owner>
  <owner>sprang@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Indicates whether we were successful in initializing hardware video encoder
    for use in the RTC pipeline.
  </summary>
</histogram>

<histogram name="Media.RTCVideoEncoderProfile" enum="VideoCodecProfile"
    expires_after="never">
<!-- expires-never: Codec and container support planning metric. -->

  <owner>mcasas@chromium.org</owner>
  <owner>sprang@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>Video codec profile used in RTC video encoder.</summary>
</histogram>

<histogram name="Media.RTCVideoEncoderStatus.{Codecs}" enum="EncoderStatus"
    expires_after="never">
<!-- expires-never: Codec and container support planning metric. -->

  <owner>hiroh@chromium.org</owner>
  <owner>mcasas@chromium.org</owner>
  <owner>sprang@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Records if the {Codecs} encoder was torn down because the stream ended, or
    if it was due to an encoder error. Recorded once when shutting down an
    accelerated (or out of process) video encoder.
  </summary>
  <token key="Codecs">
    <variant name="AV1" summary=""/>
    <variant name="H264" summary=""/>
    <variant name="Other" summary=""/>
    <variant name="VP8" summary=""/>
    <variant name="VP9" summary=""/>
  </token>
</histogram>

<histogram name="Media.RTCVideoEncoderTimestampMatchSuccess"
    enum="BooleanSuccess" expires_after="M77">
  <owner>emircan@chromium.org</owner>
  <summary>
    Indicates whether we were successful in preserving timestamps in hardware
    video encoder session. It is tracked during the session and logged after it
    ends.
  </summary>
</histogram>

<histogram name="Media.ScreenCaptureKit.FullscreenModuleMode"
    enum="ScreenCaptureKitFullscreenModuleMode" expires_after="2024-03-10">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Records the mode that is used in the ScreenCaptureKit Fullscreen module if
    the selected window to capture belongs to a supported application. The mode
    is reported once per captured window when the fullscreen module is created.
  </summary>
</histogram>

<histogram name="Media.Session.ActiveTime" units="ms"
    expires_after="2023-01-22">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time during which a media session has been active, in other words, the time
    between an activation and deactivation, without counting time while it was
    suspended. If a session is activated after being deactivated, there will be
    two entries. For example, if a user plays a song but is interrupted by a
    phone call, it will only account for the song playing time.
  </summary>
</histogram>

<histogram name="Media.Session.Play" enum="MediaSessionActionSource"
    expires_after="2024-03-03">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of times the user started playback of a media session using other
    means than the play button on the page.
  </summary>
</histogram>

<histogram name="Media.Session.Suspended" enum="MediaSessionSuspendedSource"
    expires_after="2022-02-06">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of times a media session is suspended and why it has been
    suspended.
  </summary>
</histogram>

<histogram name="Media.SRC.VideoCodec.MP4" enum="VideoCodec"
    expires_after="never">
<!-- expires-never: Codec and container support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video codec used in plain src= (not MSE) HTML5 media if the media container
    is MP4.
  </summary>
</histogram>

<histogram name="Media.SRC.VideoCodec.WebM" enum="VideoCodec"
    expires_after="never">
<!-- expires-never: Codec and container support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video codec used in plain src= (not MSE) HTML5 media if the media container
    is WebM.
  </summary>
</histogram>

<histogram base="true" name="Media.TimeToFirstFrame" units="ms"
    expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time in milliseconds from when WebMediaPlayerImpl starts loading until the
    first video frame has been shown.
  </summary>
</histogram>

<histogram base="true" name="Media.TimeToMetadata" units="ms"
    expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time in milliseconds from when WebMediaPlayerImpl starts loading until
    metadata is known.
  </summary>
</histogram>

<histogram base="true" name="Media.TimeToPlayReady" units="ms"
    expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time in milliseconds from when WebMediaPlayer starts loading until it has
    buffered enough to start playback.
  </summary>
</histogram>

<histogram name="Media.TotalMBytes" units="MB" expires_after="M85">
  <owner>hajimehoshi@chromium.org</owner>
  <owner>kouhei@chromium.org</owner>
  <owner>scherkus@chromium.org</owner>
  <summary>Size of HTML5 media (when known), in MB.</summary>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.BasicFlow.SourceCount.{Type}"
    units="count" expires_after="2024-09-01">
  <owner>eladalon@chromium.org</owner>
  <owner>tovep@chromium.org</owner>
  <summary>
    Record how many sources of type {Type} were available for the user to choose
    from. Recorded when the dialog is closed (user selected a source, cancelled,
    or closed the tab that owns the dialog).
  </summary>
  <token key="Type">
    <variant name="Screens" summary=""/>
    <variant name="Tabs" summary=""/>
    <variant name="Windows" summary=""/>
  </token>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.BasicFlow.UserInteraction"
    enum="MediaUiGetDisplayMediaBasicFlowUserInteraction"
    expires_after="2024-03-17">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <summary>
    Records the result of the user's interaction with the media picker dialog
    which is displayed following a call to getDisplayMedia that results in the
    basic flow (preferCurrentTab either unspecified or is false).
  </summary>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.DisplayCapturePolicyResult"
    enum="DisplayCapturePolicyResult" expires_after="2024-03-17">
  <owner>eladalon@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <summary>
    Records whether the display-capture permission policy allows/disallows this
    call to getDisplayMedia.
  </summary>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.PreferCurrentTabFlow.UserInteraction"
    enum="MediaUiGetDisplayMediaPreferCurrentTabFlowUserInteraction"
    expires_after="2024-03-17">
  <owner>eladalon@chromium.org</owner>
  <owner>fbeaufort@chromium.org</owner>
  <summary>
    Records the result of the user's interaction with the media picker dialog
    which is displayed following a call to getDisplayMedia where
    preferCurrentTab was specified.
  </summary>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.{Flow}.DialogDuration" units="ms"
    expires_after="2024-05-29">
  <owner>tovep@chromium.org</owner>
  <owner>eladalon@chromium.org</owner>
  <summary>
    The time-duration the DesktopMediaPickerDialog is opened when
    getDisplayMedia is called with the preferCurrentTab constraint either set to
    true (PreferCurrentTabFlow) or unspecified/false (BasicFlow). The duration
    is recorded each time the dialog is closed.
  </summary>
  <token key="Flow">
    <variant name="BasicFlow"/>
    <variant name="PreferCurrentTabFlow"/>
  </token>
</histogram>

<histogram base="true" name="Media.UnderflowDuration2" units="ms"
    expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

<!-- Name completed by histogram_suffixes name="WebMediaPlayerImplTypes" -->

  <owner>dalecurtis@chromium.org</owner>
  <summary>
    The amount of time taken to leave the underflow state (i.e. resume playback)
    for playbacks. This doesn't report initial zero samples, which was
    previously used to compensate for playbacks that don't rebuffer.
  </summary>
</histogram>

<histogram name="Media.URLScheme2" enum="URLSchemeForHistogram"
    expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    URL scheme used with HTML5 media; only recorded for src=URL playbacks and
    not for Media Source Extensions playbacks. Each URL provides one sample.
  </summary>
</histogram>

<histogram name="Media.V4l2VideoDecoder.Error" enum="V4l2VideoDecoderFunctions"
    expires_after="2023-12-07">
  <owner>stevecho@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Records errors during normal V4L2VideoDecoder operations. These can happen
    during initialization, decode or other internal state changes. Multiple
    errors can be recorded during the object lifetime.
  </summary>
</histogram>

<histogram name="Media.V4l2VideoDecoder.MediaIoctlError"
    enum="MediaIoctlRequests" expires_after="2023-12-07">
  <owner>stevecho@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Records when errors happen with media controller API ioctl requests during
    video decoding session using V4L2 API. Depending on a ioctl request, video
    decoding session can proceed or stop immediately when an error happens. So
    multiple errors can be recorded during the object lifetime.
  </summary>
</histogram>

<histogram name="Media.VaapiLinux.SupportedVideoDecoder"
    enum="VideoDecoderType" expires_after="2022-02-28">
  <owner>tmathmeyer@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the usage of VaapiVideoDecoder VaapiVideoDecodeAccelerator based on
    vulkan support and Vaapi driver version on linux. This is recorded on GPU
    process startup when hardware accelerated video decoding support is checked.
  </summary>
</histogram>

<histogram name="Media.VaapiVideoDecoder.DecodeError" enum="BooleanError"
    expires_after="2024-02-25">
  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    The codec-specific delegate in VaapiVideoDecoder has returned an error from
    Decode(). This could be a parse error, or a VA error itself.
  </summary>
</histogram>

<histogram name="Media.VaapiVideoDecoder.VaapiWrapperCreationSuccess"
    enum="BooleanSuccess" expires_after="2024-02-11">
  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Whether the creation of VaapiWrapper succeeded or not inside
    VaapiVideoDecoder.
  </summary>
</histogram>

<histogram name="Media.VaapiWrapper.VADisplayStateInitializeSuccess"
    enum="BooleanSuccess" expires_after="2024-04-20">
  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Whether the call to VaapiWrapper's VADisplayState::Initialize() succeeded or
    not. Warning: this histogram was expired between 2023-02-12 to 2023-04-20;
    data may be missing.
  </summary>
</histogram>

<histogram name="Media.VAJDA.ResponseToClient"
    enum="MjpegDecodeAcceleratorErrorCode" expires_after="2022-01-07">
  <owner>andrescj@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    The response given to the client by VaapiJpegDecodeAccelerator for a decode
    request. This is recorded when the decode succeeds or fails. The recorded
    value corresponds to a MjpegDecodeAccelerator::Error.
  </summary>
</histogram>

<histogram name="Media.VAJEA.EncoderResult" enum="VAJEAEncoderResult"
    expires_after="M95">
  <owner>wtlee@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Result codes reported by jpeg encode using VA-API hardware jpeg encoder.
  </summary>
</histogram>

<histogram name="Media.VAVDA.VaapiWrapperCreationSuccess" enum="BooleanSuccess"
    expires_after="2023-02-12">
  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Whether the creation of VaapiWrapper succeeded or not inside VaVDA.
  </summary>
</histogram>

<histogram name="Media.Video.Autoplay" enum="AutoplaySource"
    expires_after="2024-03-17">
  <owner>dalecurtis@chromium.org</owner>
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the autoplay source of videos. This includes
    Media.Video.Autoplay.Muted.
  </summary>
</histogram>

<histogram name="Media.Video.Autoplay.Muted.PlayMethod.BecomesVisible"
    enum="Boolean" expires_after="2024-01-30">
  <owner>dalecurtis@chromium.org</owner>
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records muted video started playing with play() become visible at some
    point. The UMA for false is not complete since it is recorded in a
    destructor which is garbage-collected. Please subtract
    Media.Video.Autoplay.Muted &quot;play() method&quot; count with the true
    count of this histogram to obtain the real false count.
  </summary>
</histogram>

<histogram name="Media.Video.Autoplay.Muted.PlayMethod.OffscreenDuration"
    units="ms" expires_after="2024-01-30">
  <owner>dalecurtis@chromium.org</owner>
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the offscreen playing duration of a muted video autoplaying from
    play() method.
  </summary>
</histogram>

<histogram name="Media.Video.Autoplay.Muted.UnmuteAction" enum="BooleanSuccess"
    expires_after="2024-08-07">
  <owner>dalecurtis@chromium.org</owner>
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Status of the unmute action on a video that autoplayed because it was muted.
  </summary>
</histogram>

<histogram
    name="Media.Video.Capture.Mac.CameraSystemPermission.FixedTime.SinceFirstFailure"
    units="ms" expires_after="2023-07-01">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The time from the first camera access failure due to blocked system
    permission before the last browser restart to startup after browser restart.
    Logged once at browser startup if the system permission then is allowed.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Media.Video.Capture.Mac.CameraSystemPermission.FixedTime.SinceLastFailure"
    units="ms" expires_after="2023-07-01">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The time from the last camera access failure due to blocked system
    permission before the last browser restart to startup after browser restart.
    Logged once at browser startup if the system permission then is allowed.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.Video.Capture.Mac.CameraSystemPermission.Startup"
    enum="SystemMediaCapturePermission" expires_after="2024-02-04">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The Mac system permission state for camera. Logged once at browser startup.
    For more information on the values, see
    https://developer.apple.com/documentation/avfoundation/avauthorizationstatus.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram
    name="Media.Video.Capture.Mac.CameraSystemPermission.StartupAfterFailure"
    enum="SystemMediaCapturePermission" expires_after="2023-07-01">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The Mac system permission state for camera. Logged once at browser startup
    if there was a failure accessing the camera due to blocked system permission
    before the last browser restart. For more information on the values, see
    https://developer.apple.com/documentation/avfoundation/avauthorizationstatus.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.Video.Capture.Mac.CameraSystemPermission.UserMedia"
    enum="SystemMediaCapturePermission" expires_after="2024-03-17">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The Mac system permission state for camera at the time of a user media
    request. Logged when the system permission is checked. If the permission is
    &quot;not determined&quot; this is logged, permission is requested, and the
    resulting permission (from the user response) is also logged. For more
    information on the values, see
    https://developer.apple.com/documentation/avfoundation/avauthorizationstatus.
    Warning: this histogram was expired from 2020-03-01 to 2022-03-09; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.Video.Capture.Mac.ScreenCaptureSystemPermission"
    enum="BooleanAllowed" expires_after="2024-02-11">
  <owner>bur@chromium.org</owner>
  <owner>mark@chromium.org</owner>
  <summary>
    The Mac system permission state for screen capture. Logged once at browser
    startup and when attempting to screen capture. Requires macOS 10.15+.
    Samples will not be collected on earlier macOS versions.
  </summary>
</histogram>

<histogram name="Media.Video.Roughness" units="ms" expires_after="2024-03-17">
  <owner>eugene@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video playback roughness for a 100s interval. Suffixed by the framerate.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.AspectRatio" units="%"
    expires_after="2024-03-03">
  <owner>mcasas@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <summary>
    Video Capture Device captured aspect ratio, as a rounded integer multiplied
    by 100. The collection is made in the VideoCaptureController upon reception
    of the first frame.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.BlacklistedDevice"
    enum="BlacklistedVideoCaptureDeviceNames" expires_after="M82">
  <owner>mcasas@chromium.org</owner>
  <summary>
    Counts appearances of Blacklisted Video Capture devices during enumeration.
    This collection happens during first enumeration in the appropriate
    platforms' VideoCaptureDeviceFactory.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.CreateDeviceSuccessLatency" units="ms"
    expires_after="2024-03-11">
  <owner>herre@google.com</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    Time during VideoSourceImpl startup taken to create a video_capture::Device
    object. Only recorded if the creation was successful. Is a subset of
    Media.VideoCapture.StartSourceSuccessLatency corresponding to Device
    creation, rather than capture startup in the device.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.DelayUntilFirstFrame" units="ms"
    expires_after="2024-03-10">
  <owner>armax@chromium.org</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    Time it takes from the moment that a VideoCaptureController is requested to
    start to the moment the first video frame arrives at
    VideoCaptureController::OnFrameReadyInBuffer().
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Device.Opened.ByModelId" units="usb_id"
    expires_after="2024-05-23">
  <owner>atadres@chromium.org</owner>
  <summary>
    This metric records an unsigned interger value that corresponds to the USB
    ID (vendor + device ID) of the webcam that is currently in use by the user.
    The USB ID is originally a 32-bit hexadecimal number (formatted as
    XXXX:XXXX) that then is converted to an unsigned integer for metrics
    purposes. In case of a unknown/invalid USB ID, 0 is logged. This is done
    when the CreateDevice method is called on the corresponding
    VideoCaptureDeviceFactory class based on the operating system. For example,
    on MacOS, this happens when VideoCaptureDeviceFactoryApple::CreateDevice is
    called.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Device.Opened.PixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2024-06-28">
  <owner>atadres@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    This metric records the pixel format of the active camera video feed at
    start, and everytime the pixel format changes.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Device.Opened.Resolution"
    units="resolution" expires_after="2024-06-28">
  <owner>atadres@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    This metric records the resolution of the active camera video feed at start,
    and everytime the resolution changes. The metric combines the width and
    height into a single uint32_t value, with the width stored in the first 16
    bits and the height stored in the last 16 bits.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Device.SupportedPixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2024-06-08">
  <owner>eshr@google.com</owner>
  <owner>handellm@google.com</owner>
  <owner>atadres@chromium.org</owner>
  <summary>
    Counts each pixel format an enumerated video capture device supports. This
    is recorded during the first device enumeration per Capture process launch.
    (This is usually once per launch of Chrome unless the Capture process
    crashes.) NOTE: This metric originally expired on 2023-03-19.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Device.SupportedResolution"
    enum="VideoResolutionDesignation" expires_after="2024-06-08">
  <owner>eshr@google.com</owner>
  <owner>handellm@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>atadres@chromium.org</owner>
  <summary>
    Counts each resolution supported by an enumerated video capture device.
    These are categorized by designation (eg. QVGA, HD, 4KUHD, etc) instead of
    pixel count. This is recorded during the first device enumeration per
    Capture process launch. (This is usually once per launch of Chrome unless
    the Capture process crashes.)
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Device.TotalAvailable" units="count"
    expires_after="2024-05-23">
  <owner>atadres@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    This metric counts the number of webcams that are accessible to the user at
    the start of a video session.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Error" enum="VideoCaptureError"
    expires_after="2024-03-10">
  <owner>mcasas@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>armax@chromium.org</owner>
  <summary>
    Breaks down the events counted in Media.VideoCaptureManager.Event bucket
    &quot;Stopping video capture due to error&quot; by the origin of the error.
    This allows narrowing down what is causing errors. An event for this
    histogram is emitted once for each time a client disconnects from a video
    capture session because the session has reported an error.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.FrameDrop"
    enum="VideoCaptureFrameDropReason" expires_after="2024-03-03">
  <owner>mcasas@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>armax@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <summary>
    An event for this histogram is emitted once for each time a video frame is
    dropped on the way from a capture source, e.g. a webcam, to a corresponding
    media::VideoCaptureController instance running in the Browser process. If
    more than
    |VideoCaptureController::max_consecutive_frame_drop_for_same_reason_count()|
    frames are dropped consecutively for the same reason, no more events for the
    same reason will be counted for that session until either a frame is
    delivered successfully or the reason for the frame dropping changes.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.FrameRate" units="fps"
    expires_after="2024-03-03">
  <owner>mcasas@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>armax@chromium.org</owner>
  <owner>handellm@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <summary>
    Video Capture Device frame rate requested by VideoCaptureManager on
    AllocateAndStart(). The collection is made in the VideoCaptureController
    upon reception of the first frame.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.GetDeviceInfosResult"
    enum="GetDeviceInfosResult" expires_after="M118">
  <owner>orphis@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <summary>
    Used to track the resolution of
    ServiceVideoCaptureProvider::GetDeviceInfosAsync() and if a retry has been
    used to get to the current result. See http://crbug.com/1379392.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Height" units="pixels"
    expires_after="2023-12-31">
  <owner>mcasas@chromium.org</owner>
  <owner>handellm@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <summary>
    Video Capture Device captured frame height in pixels. The collection is made
    in the VideoCaptureController upon reception of the first frame.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Mac.Device.CapturedIOSurface"
    enum="Boolean" expires_after="2023-03-19">
  <owner>eshr@google.com</owner>
  <owner>handellm@google.com</owner>
  <summary>
    A count of how often the capture device delivers an IOSurface to the capture
    pipeline. This is recorded once per opening of the camera, when the first
    video frame is captured.
  </summary>
</histogram>

<histogram
    name="Media.VideoCapture.Mac.Device.CapturedWithRequestedPixelFormat"
    enum="Boolean" expires_after="2023-03-19">
  <owner>eshr@google.com</owner>
  <owner>handellm@google.com</owner>
  <summary>
    A boolean count of how often the requested pixel format is the one that was
    actually captured. This is recorded once per opening of the camera, when the
    first video frame is captured.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Mac.Device.CapturedWithRequestedResolution"
    enum="ResolutionComparison" expires_after="2023-04-23">
  <owner>eshr@google.com</owner>
  <owner>handellm@google.com</owner>
  <summary>
    An enumeration count of whether or not the requested resolution equals the
    captured resolution, detailing which dimensions differ in the enum. This is
    recorded once per opening of the camera, when the first video frame is
    captured.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Mac.Device.RequestedPixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2023-03-05">
  <owner>eshr@google.com</owner>
  <owner>handellm@google.com</owner>
  <summary>
    Counts the pixel formats requested by the VideoCaptureDevice on Mac. This is
    recorded when the first video frame is captured.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.MacBook.AttemptCountWhenNoCamera"
    units="attempts" expires_after="2020-03-15">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Indicates how many times Chrome has asked AVFoundation to enumerate devices
    since the process start when zero devices are returned. This event is only
    emitted for the first time that zero devices are returned since the process
    start. This is used in the context of investigating http://crbug.com/582931.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.MacBook.HardwareVersionWhenNoCamera"
    enum="MacBookVersions" expires_after="M82">
  <owner>perkj@chromium.org</owner>
  <summary>
    MacBook hardware version used when Chrome cannot enumerate a video device.
    This is used for tracking http://crbug.com/582931.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.MacBook.NumberOfDevices" units="devices"
    expires_after="M82">
  <owner>perkj@chromium.org</owner>
  <summary>
    Number of video capture devices detected by Chrome during device
    enumeration. Zero devices indicate a problem since all MacBooks should have
    a built-in camera. This is used for tracking http://crbug.com/582931.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.MaxFrameDropExceeded"
    enum="VideoCaptureFrameDropReason" expires_after="M77">
  <owner>chfremer@chromium.org</owner>
  <summary>
    An event for this histogram is emitted when a video capture session drops
    more than
    |VideoCaptureController::max_consecutive_frame_drop_for_same_reason_count()|
    consecutive video frames for the same reason. After this event is emitted
    once, no additional events are emitted for consecutively dropped frames for
    the same reason until the count is reset by either a frame being delivered
    successfully or a frame being dropped for a different reason. See also
    Media.VideoCapture.FrameDrop.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.NumberOfClients" units="units"
    expires_after="2021-12-12">
  <owner>fbeaufort@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <summary>
    Number of times a video capture device is accessed simultaneously. Recorded
    when video capturing starts.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.ScaleOverride" units="units"
    expires_after="2024-03-03">
  <owner>jophba@chromium.org</owner>
  <owner>klausw@chromium.org</owner>
  <summary>
    The scalar multiplier used for adjusting the content size during tab capture
    to align with the requested capture size, multiplied by 100. Recorded when
    capture of a web contents is started, the content size of the capture
    changes, and when capture stops.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.ScaleOverrideChangeCount" units="units"
    expires_after="2024-03-03">
  <owner>jophba@chromium.org</owner>
  <owner>klausw@chromium.org</owner>
  <summary>
    The number of times the scale override changed in a single capture session.
    Recorded when capture of a web contents is stopped.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Start" enum="Boolean"
    expires_after="2024-03-10">
  <owner>toprice@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <summary>
    Counts the start attempts for video capture, to be compared with the
    StartOutcome enum histogram.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.StartErrorCode" enum="VideoCaptureError"
    expires_after="2024-03-24">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    Counts detailed outcomes of first starting video capture, as a breakdown of
    Media.VideoCapture.StartOutcome based on the error codes which caused
    failures, or kNone if we started successfully. Can also be viewed as the
    subset of reports to Media.VideoCapture.Error which occur before
    VideoCaptureImpl first transitions to STARTED.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.StartOutcome"
    enum="VideoCaptureStartOutcome" expires_after="2024-03-10">
  <owner>toprice@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <summary>
    Counts the times Starting video capture results in success or failure (due
    to eg timeouts etc).
  </summary>
</histogram>

<histogram name="Media.VideoCapture.StartSourceSuccessLatency" units="ms"
    expires_after="2024-03-11">
  <owner>herre@google.com</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    Total time for a VideoSourceImpl to start a device to serve the first push
    subscription mojo connection. Only recorded if starting is successful.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Width" units="pixels"
    expires_after="2024-03-03">
  <owner>mcasas@chromium.org</owner>
  <owner>handellm@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <summary>
    Video Capture Device captured frame width in pixels. The collection is made
    in the VideoCaptureController upon reception of the first frame.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.ActivityReportProcessed" enum="Boolean"
    expires_after="2024-08-08">
  <owner>ilnik@chromium.org</owner>
  <owner>video-cmi-mpp@chromium.org</owner>
  <summary>
    True if the Sensor Activity Report was successfully processed. False, if
    there were no reports before the deadline and default decision was made.
    Reported only if IMFSensorActivityMonitor was triggered.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.D3DDeviceRemovedReason" enum="Hresult"
    expires_after="2024-05-10">
  <owner>ilnik@chromium.org</owner>
  <owner>video-cmi-mpp@chromium.org</owner>
  <summary>
    Error codes received by VideoCaptureDeviceMFWin when checking for D3D11
    device removal reason.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.Device.CapturePixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2024-03-19">
  <owner>ilnik@google.com</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    Counts the pixel formats produced by the VideoCaptureDevice on Windows. This
    is recorded when the camera is opened.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.Device.InternalPixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2024-06-04">
  <owner>ilnik@google.com</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    Counts the pixel formats used internaly by Windows VideoCaptureEngine. This
    is recorded when the camera is opened.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.Device.IsSharedTexture" enum="Boolean"
    expires_after="2024-02-04">
  <owner>ilnik@google.com</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    Determine what proportion of frames might actually benefit from zero-copy on
    Windows. This is recorded when the camera is opened and we get the texture
    from IMFCaptureEngine.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.Device.RequestedPixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2024-03-19">
  <owner>ilnik@google.com</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    Counts the pixel formats requested by the consumer on Windows. This is
    recorded when the camera is opened.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.DeviceFactory.CaptureApi"
    enum="VideoCaptureApi" expires_after="2024-02-11">
  <owner>ilnik@google.com</owner>
  <owner>handellm@google.com</owner>
  <owner>video-performance-team@google.com</owner>
  <summary>
    The Capture API that is used on Windows. This is recorded when the camera is
    opened.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.ErrorEvent" enum="Hresult"
    expires_after="2024-03-10">
  <owner>toprice@chromium.org</owner>
  <owner>hta@chromium.org</owner>
  <summary>
    Error codes received by VideoCaptureDeviceMFWin on Windows which caused a
    kWinMediaFoundationGetMediaEventStatusFailed error, ending video capture.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Windows.BackendUsed"
    enum="VideoCaptureWinBackendUsed" expires_after="M77">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Indicates which video capture backend is used on Windows. A count is
    recorded each time a new VideoCaptureDeviceFactoryWin instance is created.
  </summary>
</histogram>

<histogram base="true" name="Media.VideoCapture.Windows.ImageCaptureOutcome"
    enum="ImageCaptureOutcome" expires_after="M85">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Counts number of times taking a still image on Windows fails/succeeds.
  </summary>
</histogram>

<histogram
    name="Media.VideoCapture.Windows.NumberOfRetriesNeededForMFGetAvailableDeviceMediaType"
    units="retries" expires_after="M85">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Counts how many retries are needed for calls to MediaFoundation function
    GetAvailableDeviceMediaType before getting a result different from
    MF_E_INVALIDREQUEST or giving up.
  </summary>
</histogram>

<histogram
    name="Media.VideoCapture.Windows.NumberOfRetriesNeededForMFGetDeviceStreamCategory"
    units="retries" expires_after="2023-03-26">
  <owner>guidou@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Counts how many retries are needed for calls to MediaFoundation function
    GetDeviceStreamCategory before getting a result different from
    MF_E_INVALIDREQUEST or giving up.
  </summary>
</histogram>

<histogram
    name="Media.VideoCapture.Windows.NumberOfRetriesNeededForMFGetDeviceStreamCount"
    units="retries" expires_after="2022-02-01">
  <owner>guidou@chromium.org</owner>
  <owner>webrtc-dev@chromium.org</owner>
  <summary>
    Counts how many retries are needed for calls to MediaFoundation function
    GetDeviceStreamCount before getting a result different from
    MF_E_INVALIDREQUEST or giving up.
  </summary>
</histogram>

<histogram name="Media.VideoCaptureGpuJpegDecoder.InitDecodeSuccess"
    enum="BooleanSuccess" expires_after="M77">
  <owner>henryhsu@chromium.org</owner>
  <summary>
    Indicates whether we were successful in initializing hardware jpeg decoder
    for attempts to VideoCaptureGpuJpegDecoder::Initialize().
  </summary>
</histogram>

<histogram name="Media.VideoCaptureManager" units="ms" expires_after="M85">
  <owner>mcasas@chromium.org</owner>
  <summary>Measures the time taken for VideoCaptureManager::</summary>
</histogram>

<histogram name="Media.VideoCaptureManager.DesktopCaptureImplementationAndType"
    enum="DesktopCaptureImplementationAndType" expires_after="2024-01-23">
  <owner>handellm@chromium.org</owner>
  <owner>ccameron@chromium.org</owner>
  <summary>
    Indicates which desktop capture implementation and DesktopID::Type was used
    for a desktop capture session. Recorded on instantiation of the desktop
    capturer.
  </summary>
</histogram>

<histogram name="Media.VideoCaptureManager.DeviceSessionLockDuration"
    units="ms" expires_after="2023-04-23">
  <obsolete>
    Removed 04/2023. No longer needed.
  </obsolete>
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the length of time the screen was locked while a device capture
    session is active. An entry is recorded upon screen unlock or upon closure
    of all active device capture sessions.
  </summary>
</histogram>

<histogram name="Media.VideoCaptureManager.DeviceSessionWasLocked"
    enum="Boolean" expires_after="2023-04-23">
  <obsolete>
    Removed 04/2023. No longer needed.
  </obsolete>
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Indicates if a device capture session encountered a screen lock during its
    lifetime. An entry is recorded once upon session closure.
  </summary>
</histogram>

<histogram
    name="Media.VideoCaptureService.DurationFromLastConnectToClosingConnectionAfterCapture"
    units="ms" expires_after="M78">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Measures the duration from the time the Browser connected to the video
    capture service to the time it closed the connection. Entries are only
    logged if the service was used for creating an actual capture session as
    opposed to enumerating devices only.
  </summary>
</histogram>

<histogram
    name="Media.VideoCaptureService.DurationFromLastConnectToClosingConnectionAfterEnumerationOnly"
    units="ms" expires_after="M78">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Measures the duration from the time the Browser connected to the video
    capture service to the time it closed the connection. Entries are only
    logged if the service was used for enumerating devices only, but not for
    creating an actual capture session.
  </summary>
</histogram>

<histogram
    name="Media.VideoCaptureService.DurationFromLastConnectToConnectionLost"
    units="ms" expires_after="M78">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Measures the duration from the time the Browser connected to the video
    capture service to the time the connection was lost.
  </summary>
</histogram>

<histogram name="Media.VideoCaptureService.DurationUntilReconnectAfterCapture"
    units="ms" expires_after="M77">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Measures the duration from the time the Browser last closed or lost
    connection to the video capture service to the time it reconnects. This
    duration only gets logged for reconnects after usage of the service for
    capture (as opposed to enumeration-only usage).
  </summary>
</histogram>

<histogram
    name="Media.VideoCaptureService.DurationUntilReconnectAfterEnumerationOnly"
    units="ms" expires_after="M78">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Measures the duration from the time the Browser last closed or lost
    connection to the video capture service to the time it reconnects. This
    duration only gets logged for reconnects after enumeration-only usage of the
    service.
  </summary>
</histogram>

<histogram name="Media.VideoCaptureService.Event"
    enum="VideoCaptureServiceEvent" expires_after="M82">
  <owner>chfremer@chromium.org</owner>
  <summary>
    Counts video capture service events, such as startup, shutdown, and
    connection lost.
  </summary>
</histogram>

<histogram name="Media.VideoCodec" enum="VideoCodec" expires_after="never">
<!-- expires-never: Codec support planning metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <summary>Video codec used in HTML5 media.</summary>
</histogram>

<histogram name="Media.VideoDecoderFallback.{VideoCodec}"
    enum="BooleanDidFallBack" expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether Chrome had to fall back to a secondary video decoder with
    {VideoCodec} video codec after the primary decoder failed reinitialization.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.VideoDecodeStatsDB.OpSuccess.{DbOperation}"
    enum="BooleanSuccess" expires_after="never">
<!-- expires-never: MediaCapabilities DB health metric. -->

  <owner>chcunningham@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Indicates whether we were successful performing the operation to
    {DbOperation}. Recorded once the operation completes.
  </summary>
  <token key="DbOperation" variants="DbOperation"/>
</histogram>

<histogram name="Media.VideoDecodeStatsDB.OpTiming.{DbOperation}"
    units="microseconds" expires_after="never">
<!-- expires-never: MediaCapabilities DB health metric. -->

  <owner>chcunningham@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Indicates duration of time performing the operation to {DbOperation}.
    Recorded once the operation completes or times out. Reported for all users
    regardless of clock resolution.
  </summary>
  <token key="DbOperation" variants="DbOperation"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.Area" units="pixels"
    expires_after="2024-03-31">
  <owner>hiroh@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The hundredth of a resolution area (i.e. width x height /100) configured in
    a video encoder. Recorded when a video encoder is destroyed or reconfigured.
  </summary>
  <token key="Usage" variants="VideoEncoderUsage"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.Frames" units="frames"
    expires_after="2024-03-31">
  <owner>hiroh@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of successfully encoded frames. Recorded when a video encoder is
    destroyed or reconfigured.
  </summary>
  <token key="Usage" variants="VideoEncoderUsage"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.Height" units="pixels"
    expires_after="2024-03-31">
  <owner>hiroh@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The height configured in a video encoder. Recorded when a video encoder is
    destroyed or reconfigured.
  </summary>
  <token key="Usage" variants="VideoEncoderUsage"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.HW" enum="Boolean"
    expires_after="2024-03-31">
  <owner>hiroh@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    An used Video encoder is a hardware encoder or not. Recorded when a video
    encoder is destroyed or reconfigured.
  </summary>
  <token key="Usage" variants="VideoEncoderUsage"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.Profile" enum="VideoCodecProfile"
    expires_after="2024-03-31">
  <owner>hiroh@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video codec profile used in a video encoder. Recorded when a video encoder
    is destroyed or reconfigured.
  </summary>
  <token key="Usage" variants="VideoEncoderUsage"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.Status" enum="EncoderStatus"
    expires_after="2024-03-31">
  <owner>hiroh@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The last encoder status in a video encoder. If an error occurs, then non kOk
    value is recorded. Recorded when a video encoder is destroyed or
    reconfigured.
  </summary>
  <token key="Usage" variants="VideoEncoderUsage"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.SVC" enum="SVCScalabilityMode"
    expires_after="2024-03-31">
  <owner>hiroh@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    SVC Scalability mode configured in a video encoder. Recorded when a video
    encoder is destroyed or reconfigured.
  </summary>
  <token key="Usage" variants="VideoEncoderUsage"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.Width" units="pixels"
    expires_after="2024-03-31">
  <owner>hiroh@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The width configured in a video encoder. Recorded when a video encoder is
    destroyed or reconfigured.
  </summary>
  <token key="Usage" variants="VideoEncoderUsage"/>
</histogram>

<histogram name="Media.VideoFrameSubmitter" units="ms" expires_after="never">
<!-- expires-never: used by ChromeOS test infrastructure -->

  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Delay between a VideoFrame being decoded and it being consumed by the OS
    presentation API (on ChromeOS, this includes the display controller too).
  </summary>
</histogram>

<histogram name="Media.VideoFrameSubmitter.PreSubmitBuffering" units="ms"
    expires_after="never">
<!-- expires-never: used by ChromeOS test infrastructure -->

  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    Delay between a VideoFrame being decoded and it being handed over to the
    CompositorFrameSink, essentially capturing the buffering in the Renderer.
    This value is strictly included in Media.VideoFrameSubmitter
  </summary>
</histogram>

<histogram name="Media.VideoHeight.Initial.{PlaybackType}" units="pixels"
    expires_after="2024-04-11">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The height of the first video frame in an HTML5 video for {PlaybackType}
    playbacks. Reported when the first video frame is available.
  </summary>
  <token key="PlaybackType">
    <variant name="All" summary="all"/>
    <variant name="EME"/>
    <variant name="MSE"/>
    <variant name="SRC"/>
  </token>
</histogram>

<histogram name="Media.VideoPersistence.AttemptResult"
    enum="VideoPersistenceAttemptResult" expires_after="2021-09-19">
  <owner>peconn@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Every time a video persistence session could be triggered, it records the
    result of the attempt.
  </summary>
</histogram>

<histogram name="Media.VideoPersistence.ControlsType"
    enum="VideoPersistenceControlsType" expires_after="2021-09-19">
  <owner>peconn@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record the type of controls a persisted video is using. This is recorded
    every time a video enters persistence mode
  </summary>
</histogram>

<histogram name="Media.VideoPersistence.Duration" units="ms"
    expires_after="M93">
  <owner>peconn@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the length during which a video was in a persistent state. It is
    recorded once per video persistence session.
  </summary>
</histogram>

<histogram name="Media.VideoPersistence.EndReason"
    enum="VideoPersistenceEndReason" expires_after="2021-09-19">
  <owner>peconn@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the reason why a video persistence session has ended.
  </summary>
</histogram>

<histogram name="Media.VideoRenderer.CadenceChanges" units="changes"
    expires_after="never">
<!-- expires-never: Media pipeline health metric. -->

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Indicates how many cadence changes have occurred during playback, a zero
    value is emitted at the beginning of playback. Subsequent values are emitted
    during video rendering for each cadence change (up to a maximum of 10).
  </summary>
</histogram>

<histogram name="Media.VideoRenderer.LowDelay" enum="Boolean"
    expires_after="2022-09-11">
  <obsolete>
    Removed 09/2022. No longer needed.
  </obsolete>
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Indicates whether video is rendering in low delay mode. It's recorded when a
    video starts playing.
  </summary>
</histogram>

<histogram name="Media.VTVDA.HardwareAccelerated"
    enum="BooleanHardwareAccelerated" expires_after="2024-09-25">
  <owner>sandersd@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether a VTDecompressionSession is internally using hardware accelerated
    decoding.
  </summary>
</histogram>

<histogram name="Media.VTVDA.SessionFailureReason"
    enum="VTVDASessionFailureType" expires_after="2024-03-03">
  <owner>sandersd@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Count of VTVDA session failure reasons. Successful initializations are
    counted as a special failure type. Since only successfully initialized
    session can fail, failures rates are computed as a simple ratio.
  </summary>
</histogram>

<histogram name="Media.WatchTime" units="ms" expires_after="2024-02-11">
  <owner>dalecurtis@chromium.org</owner>
  <summary>
    Watch time is defined as the amount of elapsed media time for audio+video
    media aggregated per player instance. A minimum of 7 seconds of unmuted,
    foreground media must be watched to start watch time monitoring. Watch time
    is checked on a regular basis and reported to UMA upon one of the stop
    events mentioned below or at player destruction if none occur prior.

    Any one of paused, hidden, or muted is sufficient to stop watch time metric
    reports. Each of these has a hysteresis where if the state change is undone
    within some time, the watch time will be counted as uninterrupted.

    Power events (on/off battery power) have a similar hysteresis, but unlike
    the aforementioned properties, will not stop metric collection.

    Each seek event will result in a new watch time metric being started and the
    old metric finalized as accurately as possible.
  </summary>
</histogram>

<histogram name="Media.WebMediaPlayerImpl.HLS.HasAccessControl" enum="Boolean"
    expires_after="2024-02-20">
  <owner>tmathmeyer@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When an HLS manifest is found during loading (on Android only), and the
    response is CORS cross-origin, this histogram records whether the response
    included an Access-Control-Allow-Origin header. Such requests are likely to
    be supported by fetch() if the mode is correctly configured.
  </summary>
</histogram>

<histogram name="Media.WebMediaPlayerImpl.HLS.IsCorsCrossOrigin" enum="Boolean"
    expires_after="2024-02-20">
  <owner>tmathmeyer@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When an HLS manifest is found during loading (on Android only), records
    whether the request was CORS cross-origin. These are cases that could not be
    implemented using fetch(). Note: subresources referenced by the manifest are
    not considered; they may have different origins or CORS configurations.
  </summary>
</histogram>

<histogram name="Media.WebMediaPlayerImpl.HLS.IsMixedContent" enum="Boolean"
    expires_after="2024-02-20">
  <owner>cassew@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When an HLS manifest is found during loading (on Android only), records
    whether the request would be mixed content. These are cases that could not
    be implemented using fetch(). Note: subresources referenced by the manifest
    are not considered; they may have different origins.
  </summary>
</histogram>

<histogram name="Media.WebMediaPlayerImpl.HLS{Variant}.MimeType"
    enum="MimeTypeOfHlsManifest" expires_after="2024-02-20">
  <owner>tmathmeyer@chromium.org</owner>
  <owner>lukasza@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When an HLS manifest is found during loading (on Android only), {Variant}
    then this histogram records the MIME type of the response.

    This metric should help assess the web compatibility risk of strict MIME
    type enforcement, as discussed in
    https://github.com/annevk/orb/issues/29#issuecomment-967432934
  </summary>
  <token key="Variant">
    <variant name="" summary=""/>
    <variant name=".CorsCrossOrigin"
        summary="and the response is cross-origin/opaque,"/>
  </token>
</histogram>

<histogram name="Media.WebMediaPlayerImpl.WatchTime"
    enum="WebMediaPlayerWatchTimeType" expires_after="2021-08-01">
  <obsolete>
    Removed 09/2022.
  </obsolete>
  <owner>sandersd@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Wall time of WebMediaPlayer playbacks. Each count represents one second of
    media playback. Multiple WebMediaPlayer instances can together accumulate
    watch time faster than real time.
  </summary>
</histogram>

<histogram
    name="Media.WebmMuxer.DidAdjustTimestamp.{StreamTypesRecorded}.{Domain}"
    enum="Boolean" expires_after="2024-02-20">
  <owner>handellm@google.com</owner>
  <owner>video-performance-team@google.com</owner>
  <summary>
    Boolean indicating if {Domain} stream timestamps had to be corrected during
    a muxing session with {StreamTypesRecorded} present. Reported on muxer
    destructor.
  </summary>
  <token key="StreamTypesRecorded">
    <variant name="AudioOnly"/>
    <variant name="AudioVideo"/>
    <variant name="VideoOnly"/>
  </token>
  <token key="Domain">
    <variant name="Audio"/>
    <variant name="Muxer"/>
    <variant name="Video"/>
  </token>
</histogram>

<histogram name="Media.WebrtcVideoPerfHistory.GetPerfInfoCodecProfile"
    enum="VideoCodecProfile" expires_after="2024-02-01">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The video codec profile that was used when calling GetPerfInfo. Recorded for
    each call to GetPerfInfo if certain sanity checks pass.
  </summary>
</histogram>

<histogram name="Media.WebrtcVideoPerfHistory.SavePerfRecordCodecProfile"
    enum="VideoCodecProfile" expires_after="2024-02-01">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The video codec profile that was provided to SavePerfRecord. Recorded for
    each call to SavePerfRecord if certain sanity checks pass.
  </summary>
</histogram>

<histogram name="Media.WebrtcVideoPerfHistory.SmoothPrediction.{Operation}"
    units="custom" expires_after="2024-02-01">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Tracks how the smoothness prediction value was determined (smooth by
    default, smooth from data, not smooth from data, implicitly smooth, smooth
    override, or implicitly not smooth) multiplexed with the configuration
    (codec, pixels, hardware_accelerated). See the code for details. This gives
    a sparse histogram that is best interpreted using a script for
    demultiplexing. The value is reported each time either encodingInfo() or
    decodingInfo() are called and requests a smoothness prediction from
    WebrtcVideoPerfHistory.
  </summary>
  <token key="Operation">
    <variant name="Decode"/>
    <variant name="Encode"/>
  </token>
</histogram>

<histogram
    name="Media.WebrtcVideoPerfHistory.SmoothVolatility.{Operation}.{Framerate}"
    enum="SmoothVolatility" expires_after="2024-02-01">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Tracks the volatilty of the smoothness predictions after updates to the
    database, that is, if the smoothness prediction changes or stays at the same
    value. Recorded after each update to the WebRTC MediaCapabilities database
    if there was an existing record for the corresponding configuration.
  </summary>
  <token key="Operation">
    <variant name="Decode"/>
    <variant name="Encode"/>
  </token>
  <token key="Framerate">
    <variant name="30fps"/>
    <variant name="60fps"/>
  </token>
</histogram>

<histogram name="Media.WebrtcVideoStatsDB.OpSuccess.{DbOperation}"
    enum="BooleanSuccess" expires_after="never">
<!-- expires-never: WebRTC MediaCapabilities DB health metric. -->

  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Indicates whether we were successful performing the operation to
    {DbOperation}. Recorded once the operation completes.
  </summary>
  <token key="DbOperation" variants="DbOperation"/>
</histogram>

<histogram name="Media.WebrtcVideoStatsDB.OpTiming.{DbOperation}"
    units="microseconds" expires_after="never">
<!-- expires-never: WebRTC MediaCapabilities DB health metric. -->

  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Indicates duration of time performing the operation to {DbOperation}.
    Recorded once the operation completes or times out. Reported for all users
    regardless of clock resolution.
  </summary>
  <token key="DbOperation" variants="DbOperation"/>
</histogram>

<histogram name="Media.YouTube.TimeToBufferAv" units="ms" expires_after="M85">
  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
  <summary>
    Time needed to pre-buffer A/V data before the actual playback for the
    YouTube application.
  </summary>
</histogram>

<histogram name="Media.YouTube.TimeToBufferAvAfterUnderrun" units="ms"
    expires_after="M85">
  <owner>Please list the metric's owners. Add more owner tags as needed.</owner>
  <summary>
    Time needed to buffer A/V data after an underrun for the YouTube
    application.
  </summary>
</histogram>

<histogram name="Media.{VaapiClientName}.VAAPIError" enum="VaapiFunctions"
    expires_after="2024-05-16">
  <owner>mcasas@chromium.org</owner>
  <owner>chromeos-gfx-video@chromium.org</owner>
  <summary>
    Error codes reported by libva (via VaapiWrapper) while being used from the
    specified client name. {VaapiClientName}
  </summary>
  <token key="VaapiClientName">
    <variant name="VaapiImageDecodeAcceleratorWorker" summary=""/>
    <variant name="VaapiImageProcessorBackend" summary=""/>
    <variant name="VaapiJpegEncodeAccelerator" summary=""/>
    <variant name="VaapiJpegEncodeAccelerator.Vpp" summary=""/>
    <variant name="VaapiMjpegDecodeAccelerator" summary=""/>
    <variant name="VaapiMjpegDecodeAccelerator.Vpp" summary=""/>
    <variant name="VaapiVideoDecodeAccelerator" summary=""/>
    <variant name="VaapiVideoDecodeAccelerator.Vpp" summary=""/>
    <variant name="VaapiVideoDecoder" summary=""/>
    <variant name="VaapiVideoEncodeAccelerator" summary=""/>
    <variant name="VaapiVideoEncodeAccelerator.Vpp" summary=""/>
  </token>
</histogram>

<histogram name="MediaGalleries.ScanCancelTime" units="ms" expires_after="M85">
  <owner>vandebo@chromium.org</owner>
  <summary>If a media scan was cancelled, the duration (in ms) it ran.</summary>
</histogram>

<histogram name="MediaGalleries.ScanDirectoriesFound" units="units"
    expires_after="M85">
  <owner>vandebo@chromium.org</owner>
  <summary>
    The number of directories with media files found during a scan.
  </summary>
</histogram>

<histogram name="MediaGalleries.ScanFinishedTime" units="ms"
    expires_after="M85">
  <owner>vandebo@chromium.org</owner>
  <summary>
    Duration in milliseconds taken to do a media scan that ran to completion.
  </summary>
</histogram>

<histogram name="MediaGalleries.ScanGalleriesGranted" units="%"
    expires_after="M85">
  <owner>vandebo@chromium.org</owner>
  <summary>
    The percentage of galleries accepted (not deselected) from the scan result
    dialog.
  </summary>
</histogram>

<histogram name="MediaGalleries.ScanGalleriesPopulated" units="units"
    expires_after="M85">
  <owner>vandebo@chromium.org</owner>
  <summary>
    The number of galleries added or updated in preferences after a scan.
  </summary>
</histogram>

<histogram name="MediaGalleries.Usage" enum="MediaGalleriesUsageType"
    expires_after="M77">
  <owner>vandebo@chromium.org</owner>
  <summary>Various usage counts for media galleries.</summary>
</histogram>

<histogram name="MediaLauncherActivity.LaunchResult" enum="BooleanSuccess"
    expires_after="2021-06-19">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    True if the MediaLauncherActivity was successfully able to open the file.
    Recorded when the MediaLauncherActivity starts the CustomTabActivity.
  </summary>
</histogram>

<histogram name="MediaLauncherActivity.MediaType"
    enum="MediaLauncherActivityMediaType" expires_after="2021-03-28">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The type of media that a user is opening via the MediaLauncherActivity.
  </summary>
</histogram>

<histogram base="true" name="MediaRouter.Cast.App.Availability" units="ms"
    expires_after="2024-05-01">
<!-- Name completed by histogram_suffixes name="MediaRouterSuccess" -->

  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Round trip time for a Cast app availability request. Can be suffixed with
    Success or Failure.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.Channel.ConnectResult" enum="BooleanSuccess"
    expires_after="2024-03-17">
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Whether opening Cast channel succeeds or not. Recorded when all opening
    channel attempts (including retry attempts) finish.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.Channel.Error"
    enum="MediaRouterCastChannelError" expires_after="2024-03-17">
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Errors encountered on a Cast channel. Recorded when a Cast channel fails to
    open, or when an opened channel fails to respond to keepalive ping request
    and times out.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.DeviceNameLength" units="characters"
    expires_after="2022-05-01">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the length of the friendly name of a Cast device when we succeed to
    open a Cast channel to it.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.Discovery.ConnectedDevicesCount"
    units="devices" expires_after="2024-08-27">
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The number of connected Cast devices. Recorded when browser finishes
    discovering Cast devices. Recording happens roughly once per hour.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.Discovery.KnownDevicesCount" units="devices"
    expires_after="2024-01-11">
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The number of known Cast devices. Recorded when browser finishes discovering
    Cast devices. Recording happens roughly once per hour.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.Discovery.SinkSource"
    enum="MediaRouterCastSinkSource" expires_after="2024-03-17">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>The source of discovery for a newly-created Cast sink.</summary>
</histogram>

<histogram name="MediaRouter.Cast.Feedback.Event"
    enum="MediaRouterCastFeedbackEvent" expires_after="2022-05-01">
  <owner>jrw@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Events related to the WebUI Cast feedback dialog.</summary>
</histogram>

<histogram name="MediaRouter.Cast.LaunchSessionResponse.AppType"
    enum="MediaRouterResponseReceiverAppType" expires_after="2024-02-04">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The type of app that the receiver device choose to launch. Recorded when
    receiving a receiver status response to the launch request.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.Mdns.Channel.Open_Failure" units="ms"
    expires_after="2024-02-04">
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Duration in milliseconds taken to fail to open a cast channel. Recorded when
    one opening channel attempt fails.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.Mdns.Channel.Open_Success" units="ms"
    expires_after="2024-09-03">
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Duration in milliseconds taken to successfully open a cast channel. Recorded
    when one opening channel attempt succeeds.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.PendingUserAuthLatency" units="s"
    expires_after="2024-08-20">
  <owner>ahmedmoussa@google.com</owner>
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    In some scenarios casting doesn't start until the user approves it on the
    receiver side. This histogram records the time it takes between requesting
    to start casting and receiving a response from the receiver that it is now
    waiting for user approval.
  </summary>
</histogram>

<histogram name="MediaRouter.Cast.UserPromptWhenLaunchingCast"
    enum="MediaRouterUserPromptWhenLaunchingCast" expires_after="2024-08-20">
  <owner>ahmedmoussa@google.com</owner>
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    This histogram is recorded whenever the user attempts to start casting and a
    receiver-side prompt is shown, and when the user disapproves it. The other
    two cases, when the user approves it or when it times out, are not recorded.
    As both these cases can be received without a prompt before it and this
    should not be recorded.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Audio.PlaybackOnReceiver"
    enum="Boolean" expires_after="2023-11-12">
  <owner>takumif@chromium.org</owner>
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records whether audio is played on the receiver device. If not, then on the
    sender side. Recorded when a new site-initiated mirroring session is
    started.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Session.Launch" units="ms"
    expires_after="2024-02-11">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Total time to launch a Cast Streaming mirror session.</summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Session.Length" units="ms"
    expires_after="2024-02-11">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Total length of a Cast Streaming mirror session of any type, including the
    time spent in media remoting.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Session.Length.AccessCode"
    units="ms" expires_after="2024-01-28">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Total length of a Cast Streaming mirror session of any type, when the cast
    sink was discovered via access code.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Session.Length.File" units="ms"
    expires_after="2022-07-01">
  <obsolete>
    Removed 04/2022 as local file casting is no longer done via the Cast UI.
  </obsolete>
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Total length of a Cast Streaming File mirror session.</summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Session.Length.OffscreenTab"
    units="ms" expires_after="2024-05-01">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Total length of a Cast Streaming Offscreen Tab mirror session.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Session.Length.Screen" units="ms"
    expires_after="2024-05-01">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Total length of a Cast Streaming Screen mirror session.</summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Session.Length.Tab" units="ms"
    expires_after="2024-05-01">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Total length of a Cast Streaming mirror session of type Tab and NOT of types
    offscreen tab or local file. This includes the time spent in media remoting.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Start.Failure.AccessCodeManualEntry"
    enum="MirroringServiceErrorType" expires_after="2023-12-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Whenever a Cast Streaming session to a device discovered by access code
    manual entry fails to start, record the error associated with the event.
  </summary>
</histogram>

<histogram
    name="MediaRouter.CastStreaming.Start.Failure.AccessCodeRememberedDevice"
    enum="MirroringServiceErrorType" expires_after="2023-12-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Whenever a Cast Streaming session to a device discovered by access code and
    remembered via caching fails to start, record the error associated with the
    event.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Start.Failure.Native"
    enum="MirroringServiceErrorType" expires_after="2024-03-10">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Whenever a Cast Streaming session fails to start, record the error
    associated with the event. This is recorded only for the native Cast MRP.
    See MediaRouter.CastStreaming.Start.Failure for the extension MRP.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Start.Success" enum="MirrorType"
    expires_after="2024-03-17">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Whenever a Cast Streaming session is successfully started, record if it was
    for a Tab or Desktop mirroring session.
  </summary>
</histogram>

<histogram name="MediaRouter.CastStreaming.Start.Success.AccessCodeManualEntry"
    enum="MirrorType" expires_after="2024-02-04">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Whenever a Cast Streaming session is successfully started, when the device
    was discovered by access code maual entry, record if it was for a Tab or
    Desktop mirroring session.
  </summary>
</histogram>

<histogram
    name="MediaRouter.CastStreaming.Start.Success.AccessCodeRememberedDevice"
    enum="MirrorType" expires_after="2024-03-17">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    Whenever a Cast Streaming session is successfully started, when the device
    was discovered by access code remembered device caching, record if it was
    for a Tab or Desktop mirroring session.
  </summary>
</histogram>

<histogram name="MediaRouter.Dial.AvailableDevicesCount" units="devices"
    expires_after="2024-09-03">
  <owner>mfoltz@chromium.org</owner>
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The number of available DIAL devices. Recorded when browser finishes
    discovering DIAL devices. Recording happens roughly once per hour.
  </summary>
</histogram>

<histogram name="MediaRouter.Dial.CreateRoute"
    enum="MediaRouterDialCreateRouteResult" expires_after="2024-03-17">
  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The result of a DIAL CreateRoute request. Recorded when the user requests to
    create a media route to a DIAL device.
  </summary>
</histogram>

<histogram name="MediaRouter.Dial.DeviceDescriptionParsingResult"
    enum="MediaRouterDeviceDescriptionParsingResult" expires_after="2024-04-16">
  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Result from parsing DIAL device description XML text. Recorded when utility
    process returns a DIAL device description object to the DIAL Media Route
    Provider.
  </summary>
</histogram>

<histogram name="MediaRouter.Dial.FetchAppInfo"
    enum="MediaRouterDialFetchAppInfoResult" expires_after="2024-02-25">
  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The result of a DIAL app info request. Recorded when an app info request is
    issued to a DIAL device.
  </summary>
</histogram>

<histogram name="MediaRouter.Dial.KnownDevicesCount" units="devices"
    expires_after="2024-09-10">
  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The number of known DIAL devices. Recorded when browser finishes discovering
    DIAL devices. Recording happens roughly once per hour.
  </summary>
</histogram>

<histogram name="MediaRouter.Icon.Click.Location"
    enum="MediaRouterDialogActivationLocation" expires_after="2024-04-30">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>Location the user clicked to open the Media Router dialog.</summary>
</histogram>

<histogram name="MediaRouter.MirroringService.SessionError"
    enum="MirroringServiceErrorType" expires_after="2024-01-14">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records errors encountered by the Mirroring Service. If an error occurs
    while media remoting, the service attempts to revert to mirroring. Otherwise
    mirroring is terminated.
  </summary>
</histogram>

<histogram name="MediaRouter.PresentationRequest.AvailabilityUrlType"
    enum="PresentationUrlType" expires_after="2024-01-21">
  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The type of Presentation URL used in a PresentationRequest by a web page.
  </summary>
</histogram>

<histogram name="MediaRouter.PresentationRequest.UrlBySink"
    enum="PresentationUrlBySink" expires_after="2024-03-03">
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Logged when the Media Router starts a presentation according to the type of
    presentation URL and the type of media sink.
  </summary>
</histogram>

<histogram name="MediaRouter.Provider.CreateRoute.Result"
    enum="MediaRouteProviderResult" expires_after="2024-02-25">
<!-- Name completed by histogram_suffixes name="MediaRouteProvider" -->

  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Result of a request to a MediaRouteProvider to create a route.
    CreateRoute.Result (without a suffix) is recorded for the extension or an
    unknown MRP.
  </summary>
</histogram>

<histogram name="MediaRouter.Provider.JoinRoute.Result"
    enum="MediaRouteProviderResult" expires_after="2024-06-04">
<!-- Name completed by histogram_suffixes name="MediaRouteProvider" -->

  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Result of a request to a MediaRouteProvider to join a route.
    JoinRoute.Result (without a suffix) is recorded for the extension or an
    unknown MRP.
  </summary>
</histogram>

<histogram name="MediaRouter.Provider.TerminateRoute.Result"
    enum="MediaRouteProviderResult" expires_after="2024-05-01">
<!-- Name completed by histogram_suffixes name="MediaRouteProvider" -->

  <owner>takumif@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Result of a request to a MediaRouteProvider to terminate a route.
    TerminateRoute.Result (without a suffix) is recorded for the extension or an
    unknown MRP.
  </summary>
</histogram>

<histogram name="MediaRouter.RemotePlayback.SessionLoadTime" units="ms"
    expires_after="2024-02-04">
  <owner>muyaoxu@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Measures how long, from the start of a streaming session, until it switches
    to Remoting for Remote Playback sessions. The start time is measured when
    the streaming session has started and the end time is measured when the
    remoting starts. The metric is recorded when both the start time and end
    time are measured and duration time is calculated.
  </summary>
</histogram>

<histogram name="MediaRouter.RemotePlayback.SessionStartsBeforeTimeout"
    enum="Boolean" expires_after="2024-02-04">
  <owner>muyaoxu@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Whether Remoting starts before it timeouts for Remote Playback sessions.
    Recorded when the timeout callback is fired and when Remoting starts.
  </summary>
</histogram>

<histogram name="MediaRouter.RemotePlayback.SinkCapability.SupportedAudioCodec"
    enum="AudioCodec" expires_after="2024-02-04">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Recorded when a Cast sink is discovered for a Remote Playback MediaSource
    and this sink supports the MediaSource's AudioCodec. It is not recorded if
    the model is not known to support Remoting, in which case the sink's audio
    capability is unknown.
  </summary>
</histogram>

<histogram name="MediaRouter.RemotePlayback.SinkCapability.SupportedVideoCodec"
    enum="VideoCodec" expires_after="2024-02-04">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Recorded when a Cast sink is discovered for a Remote Playback MediaSource
    and this sink supports the MediaSource's VideoCodec. It is not recorded if
    the model is not known to support Remoting, in which case the sink's video
    capability is unknown.
  </summary>
</histogram>

<histogram
    name="MediaRouter.RemotePlayback.SinkCapability.UnsupportedAudioCodec"
    enum="AudioCodec" expires_after="2024-03-24">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Recorded when a Cast sink is discovered for a Remote Playback MediaSource
    and this sink does not support the MediaSource's AudioCodec. It is not
    recorded if the model is not known to support Remoting, in which case the
    sink's audio capability is unknown.
  </summary>
</histogram>

<histogram
    name="MediaRouter.RemotePlayback.SinkCapability.UnsupportedVideoCodec"
    enum="VideoCodec" expires_after="2024-02-04">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Recorded when a Cast sink is discovered for a Remote Playback MediaSource
    and this sink does not support the MediaSource's VideoCodec. It is not
    recorded if the model is not known to support Remoting, in which case the
    sink's video capability is unknown.
  </summary>
</histogram>

<histogram name="MediaRouter.RemotePlayback.SinkModelCompatibility"
    enum="Boolean" expires_after="2024-02-04">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records whether the discovered sink is known to support Media Remoting. It
    is recorded when media sink query results are sent to the
    CastMediaRouteProvider.
  </summary>
</histogram>

<histogram name="MediaRouter.Sink.SelectedType" enum="MediaSinkType"
    expires_after="2024-03-03">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The type of the Media Sink that media is being cast to. Recorded each time
    the user selects a Media Sink to start casting. Recorded for all the UI
    entry points.
  </summary>
</histogram>

<histogram name="MediaRouter.Sink.SelectedType.{Ui}" enum="MediaSinkType"
    expires_after="2024-05-03">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The type of the Media Sink that media is being cast to. Recorded each time
    the user selects a Media Sink to start casting from {Ui}.
  </summary>
  <token key="Ui">
    <variant name="CastHarmony"/>
    <variant name="GlobalMediaControls"/>
  </token>
</histogram>

<histogram name="MediaRouter.Source.CastingSource"
    enum="MediaRouterSourceTypes" expires_after="2024-03-17">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The source of a Media Router session. This is recorded to keep track of what
    kind of media is being streamed.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Action.CloseLatency" units="ms"
    expires_after="2023-11-12">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Duration in milliseconds taken from the user opening the Media Router dialog
    to the user closing the dialog. This is only recorded if closing the dialog
    is the first action the user takes.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Action.StartLocal.Latency" units="ms"
    expires_after="2023-11-12">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Duration in milliseconds taken from the Media Router dialog showing the sink
    list and being populated with at least one device to the user selecting a
    device immediately after to create a new route.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Action.StartLocalPosition"
    enum="MediaRouterSinkPositionLabel" expires_after="2023-11-12">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>The index of the sink that was selected in the sink list.</summary>
</histogram>

<histogram name="MediaRouter.Ui.Action.StopRoute" enum="MediaRouteType"
    expires_after="2023-11-12">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>The number of times a user stops different types of routes.</summary>
</histogram>

<histogram name="MediaRouter.Ui.Android.DialogAction"
    enum="MediaRouterAndroidDialogAction" expires_after="2024-05-01">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    A Mediarouter dialog can be two types: (1) A route controller dialog where
    users can stop casting. (2) A device picker where users can select a device
    and cast to it. This histogram records when users interact with the dialog
    (start or stop casting).
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Android.DialogType"
    enum="MediaRouterAndroidDialogType" expires_after="2024-05-01">
  <owner>muyaoxu@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    A MediaRouter dialog is opened when users click on the Cast buttons supplied
    by the Cast SDK or the default HTML media player. This histogram records the
    type of the dialog when the dialog is created.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Device.Count" units="units"
    expires_after="2023-12-24">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Counts the number of devices known and populated to the Media Router dialog
    (or the Global Media Controls' device picker) three seconds after the dialog
    loads. Always expected to be non-negative. This includes data recorded from
    Clank, which uses Android's MediaRouter framework.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Dialog.ActivationLocationAndCastMode"
    enum="MediaRouterDialogActivationLocationAndCastMode"
    expires_after="2024-03-17">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    This records how the Cast dialog was opened and what Cast mode was used
    whenever a Cast session starts.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Dialog.IconStateAtOpen"
    enum="MediaRouterIconState" expires_after="2024-02-25">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Whether the Cast toolbar icon is in its ephemeral state (shown only when the
    feature is active), or is pinned to the toolbar by user pref / admin policy.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Dialog.LoadedWithData" units="ms"
    expires_after="2024-05-03">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Duration in milliseconds taken from the user click to open the Media Router
    dialog to initializing the dialog with data.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.Dialog.Paint" units="ms"
    expires_after="2023-11-12">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Duration in milliseconds taken from a user click to open the Media Router
    dialog to the initial paint.
  </summary>
</histogram>

<histogram name="MediaRouter.WiredDisplay.AvailableDevicesCount" units="units"
    expires_after="2024-02-25">
  <owner>takumif@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The number of Media Sinks available for Casting a Presentation API URL to
    local screens. Recorded at most once an hour, when the Wired Display Media
    Route Provider reports an update on the sink count.
  </summary>
</histogram>

</histograms>

</histogram-configuration>
