<!--
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="AudioDirection">
  <variant name="Input" summary="for input streams"/>
  <variant name="Output" summary="for output streams"/>
</variants>

<variants name="AudioLatencyTag">
  <variant name="" summary="All latency tags are combined"/>
  <variant name=".LatencyExactMs" summary="Latency tag is ExactMS"/>
  <variant name=".LatencyInteractive" summary="Latency tag is Interactive"/>
  <variant name=".LatencyPlayback" summary="Latency tag is Playback"/>
  <variant name=".LatencyRtc" summary="Latency tag is RTC"/>
  <variant name=".LatencyUnknown" summary="Latency tag is Unknown"/>
</variants>

<variants name="CaptureApiType">
  <variant name="" summary="any video capture"/>
  <variant name=".GetDisplayMedia" summary="screen capture (getDisplayMedia)"/>
  <variant name=".GetUserMedia" summary="camera capture (getUserMedia)"/>
</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="PlayReady" summary="PlayReady key system"/>
  <variant name="Widevine" summary="Widevine key system"/>
</variants>

<variants name="KeySystemForHardwareSecureOnly">
  <variant name="PlayReady" summary="PlayReady key system"/>
  <variant name="Widevine" summary="Widevine key system"/>
</variants>

<variants name="KeySystemWithRobustness">
  <variant name="ClearKey" summary="Clear Key key system"/>
  <variant name="PlayReady.HardwareSecure"
      summary="Hardware secure PlayReady key system"/>
  <variant name="PlayReady.SoftwareSecure"
      summary="Software secure PlayReady 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="MediaFoundationCodecPackage">
  <variant name="AC4"/>
  <variant name="AV1"/>
  <variant name="DolbyVision"/>
  <variant name="EAC3"/>
<!-- NOTE: H264 is always supported. Do not remove this. -->

  <variant name="H264"/>
  <variant name="HEVC"/>
  <variant name="VP9"/>
</variants>

<variants name="MediaRebufferingCategories">
  <variant name=".Audio.EME"
      summary="Metric for EME media with an audio track."/>
  <variant name=".Audio.HLS"
      summary="Metric for HLS media with an audio track."/>
  <variant name=".Audio.MSE"
      summary="Metric for MSE media with an audio track."/>
  <variant name=".Audio.SRC"
      summary="Metric for SRC media with an audio track."/>
  <variant name=".AudioVideo.EME"
      summary="Metric for EME media with both an audio and video track."/>
  <variant name=".AudioVideo.HLS"
      summary="Metric for HLS media with both an audio and video track."/>
  <variant name=".AudioVideo.MSE"
      summary="Metric for MSE media with both an audio and video track."/>
  <variant name=".AudioVideo.SRC"
      summary="Metric for SRC media with both an audio and video track."/>
</variants>

<variants name="MediaRouteProvider">
  <variant name=".AndroidCaf"
      summary="Cast Application Framework (CAF) base MRPs on Clank"/>
  <variant name=".Cast" summary="Native Cast MRP"/>
  <variant name=".DIAL" summary="Native DIAL MRP"/>
  <variant name=".WiredDisplay" summary="Wired Display MRP"/>
</variants>

<variants name="MF_MEDIA_ENGINE_ERR">
  <variant name="MF_MEDIA_ENGINE_ERR_ABORTED"/>
  <variant name="MF_MEDIA_ENGINE_ERR_DECODE"/>
  <variant name="MF_MEDIA_ENGINE_ERR_ENCRYPTED"/>
  <variant name="MF_MEDIA_ENGINE_ERR_NETWORK"/>
  <variant name="MF_MEDIA_ENGINE_ERR_NOERROR"/>
  <variant name="MF_MEDIA_ENGINE_ERR_SRC_NOT_SUPPORTED"/>
</variants>

<variants name="RenderedVideoFrameDetectionResultReason">
  <variant name="Detected"/>
  <variant name="NotDetected"/>
  <variant name="UnknownByPlaybackEnd"/>
  <variant name="UnknownByPlaybackError"/>
  <variant name="UnknownByShutdown"/>
</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="Unknown"/>
  <variant name="VC1"/>
  <variant name="VP8"/>
  <variant name="VP9"/>
</variants>

<variants name="VideoEncoderImpl">
  <variant name="HW"/>
  <variant name="SW"/>
</variants>

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

<variants name="VideoSource">
  <variant name="Rtc"/>
  <variant name="Video"/>
</variants>

<histogram name="AccessCodeCast.Discovery.AddSinkResult.New"
    enum="AccessCodeCastAddSinkResult" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The result of adding a cast sink to the media router sink list via the
    AccessCodeCastSinkService when discovering it using an access code. Recorded
    after the cast sink is added. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Discovery.AddSinkResult.Remembered"
    enum="AccessCodeCastAddSinkResult" expires_after="2026-11-15">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The result of adding a cast sink to the media router sink list via the
    AccessCodeCastSinkService when the device was remembered due to device
    policy. Recorded after the cast sink is added. Logged only on desktop
    platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Discovery.CastModeOnSuccess"
    enum="AccessCodeCastCastMode" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The selected cast mode when a cast session is successfully started
    (ResultCode::OK) after a user enters an access code. Logged only on desktop
    platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Discovery.DeviceDurationOnRoute"
    units="seconds" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The duration in seconds an access code device will stay in the list of cast
    devices. Recorded on successful creation of a cast session to an access code
    device. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Discovery.RememberedDevicesCount"
    units="cast devices" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The count of cast devices which have been successfully remembered via the
    access code cast sink service. Recorded when the browser starts, and any
    time the network changes. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Session.FreezeCount" units="instances"
    expires_after="2026-12-27">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The count of times that a local cast mirroring session is frozen, or paused,
    during its duration. Recorded at the end of a cast mirroring session. Logged
    only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Session.FreezeDuration" units="ms"
    expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The amount of time in milliseconds that a local cast mirroring session is
    frozen, or paused, until it is resumed or ended. Recorded when the session
    is resumed, or when the session ends. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Session.NewDeviceRouteCreationDuration"
    units="ms" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The amount of time in milliseconds that it takes to connect to a new device.
    It is the combination of connecting to our server, validating the access
    code, constructing a cast device, opening a channel to that device, and then
    waiting for success. It is only recorded if the request was successful; not
    recorded for non-local routes. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Session.RouteDiscoveryTypeAndSource"
    enum="AccessCodeCastDiscoveryTypeAndSource" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The discovery type of the associated sink and the cast media source for an
    access code route. Recorded when at the start of a local access code route.
    Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Session.RouteDuration" units="ms"
    expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The amount of time in milliseconds that a route to an access code device
    lasts. Recorded at the end of a local access code route; not recorded for
    non-local routes. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Session.SavedDeviceRouteCreationDuration"
    units="ms" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The amount of time in milliseconds that it takes to connect to a saved
    device. It is a combination of the time to request a mirroring route +
    waiting for a success. It is only recorded if the request was successful;
    not recorded for non-local routes. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Ui.AccessCodeInputTime" units="ms"
    expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The amount of time in milliseconds for the user to input an access code
    after the UI is enabled for a cast attempt. Recorded when the user presses
    enter or the submit button after typing an access code. Logged only on
    desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Ui.AccessCodeNotFoundCount" units="instances"
    expires_after="2026-10-25">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The count of ACCESS_CODE_NOT_FOUND errors received while the
    AccessCodeCastDialog is open, correlating to the number of times a user
    typed an incorrect access code. Recorded after the dialog is closed. Logged
    only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Ui.CastAttemptLength" units="ms"
    expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The amount of time in milliseconds that the dialog is loading while
    attempting to cast to a new device via access code. Recorded after a cast
    attempt completes, and does not depend on whether the attempt was successful
    or ended in error. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Ui.DialogCloseReason"
    enum="AccessCodeCastDialogCloseReason" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The reason why the Access Code Cast dialog closed. Recorded when the Access
    Code Cast dialog closes. Logged only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Ui.DialogLoadTime" units="ms"
    expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The length of time for the AccessCodeCast dialog to finish loading after
    instantiation. Recorded after the UI creates a page handler object. Logged
    only on desktop platforms.
  </summary>
</histogram>

<histogram name="AccessCodeCast.Ui.DialogOpenLocation"
    enum="AccessCodeCastDialogOpenLocation" expires_after="2027-05-01">
  <owner>bzielinski@google.com</owner>
  <owner>cros-edu-eng@google.com</owner>
  <summary>
    The location from which the AccessCodeCast dialog is opened. Recorded after
    the dialog opens. Only logged on desktop platforms.
  </summary>
</histogram>

<histogram name="Cast.Channel.Certificate" enum="CastCertificateStatus"
    expires_after="never">
<!-- expires-never: Used for Cast device health monitoring. -->

  <owner>ryanchung@google.com</owner>
  <summary>
    Records the result of the Cast certificate verification on the Cast sender.
  </summary>
</histogram>

<histogram name="Cast.Channel.LaunchSession.Flags" enum="CastChannelFlag"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records any flags observed on the Cast channel used to launch a Cast
    session. A single channel may have multiple flags, and each flag is logged
    as a separate count.

    Warning: this histogram was expired from 2025-11-16 to 2026-02-02; data may
    be missing.
  </summary>
</histogram>

<histogram name="Cast.Channel.Nonce" enum="CastNonceStatus"
    expires_after="never">
<!-- expires-never: Used for Cast device health monitoring. -->

  <owner>ryanchung@google.com</owner>
  <summary>
    Records whether the correct nonce challenge was in the Cast receiver's
    response.
  </summary>
</histogram>

<histogram name="Cast.Channel.Signature" enum="CastSignatureStatus"
    expires_after="never">
<!-- expires-never: Used for Cast device health monitoring. -->

  <owner>ryanchung@google.com</owner>
  <summary>
    Records whether the signature returned by the Cast receiver is verifiable
    with the challenge and device certificate.
  </summary>
</histogram>

<histogram name="Cast.Sender.RemotePlayback.InitiationLocation"
    enum="RemotePlaybackInitiationLocation" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the location when users interact with the RemotePlayback API on
    Clank. Please note, this metric does not show whether a session is started
    or stopped and does not include RemotePlayback sessions initiated through
    the Cast SDK.
  </summary>
</histogram>

<histogram name="Cast.Sender.VideoEncodeAcceleratorInitializeSuccess"
    enum="BooleanSuccess" expires_after="2027-02-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Indicates whether initialization of a video encode accelerator for Cast
    sender was successful.

    Warning: this histogram was expired from 2021-10-17 to 2022-12-15; data may
    be missing.
  </summary>
</histogram>

<histogram name="CastStreaming.Sender.Audio.NegotiatedCodec" enum="AudioCodec"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records which audio codec was negotiated during a mirroring session.
  </summary>
</histogram>

<histogram name="CastStreaming.Sender.Video.Bitrate" units="kbps"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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.EncoderType"
    enum="CastStreamingVideoEncoderType" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records which video codec was negotiated during a mirroring session. Records
    the selected encoder configuration whenever a negotiation between the sender
    and receiver devices is completed. This configuration includes the encoder
    codec as well as whether it is software or hardware based.
  </summary>
</histogram>

<histogram name="CastStreaming.Sender.Video.NegotiatedCodec" enum="VideoCodec"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records which video codec was negotiated during a mirroring session.
  </summary>
</histogram>

<histogram
    name="CastStreaming.Sender.{CastStreamingSenderAudioVideo}.AverageCaptureLatency"
    units="ms" expires_after="2027-08-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>anasr@google.com</owner>
  <owner>bzielinski@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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="2026-07-07">
  <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. NOTE: metric expired from 2024-12-15
    to 2025-07-07.
  </summary>
</histogram>

<histogram name="Media.AImageReaderGLOwner.CodecType"
    enum="TextureOwnerCodecType" expires_after="2026-07-12">
  <owner>vasilyt@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs whether we use MediaCodec or MediaPlayer (aka StreamTexture path). This
    is recorded when AImageReader acquireNextImage or acquireLatestImage is
    called.
  </summary>
</histogram>

<histogram name="Media.AImageReaderGLOwner.HasFence" enum="Boolean"
    expires_after="2026-01-18">
  <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.AudioBecomingNoisyPaused" enum="Boolean"
    expires_after="2027-06-01">
  <owner>philyan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records whether playback is paused when a headset unplug event is received.
    If the feature flag NoPauseMediaOnHeadphoneUnplug is enabled, this will
    record false. Otherwise, it will record true. Only recorded when a headset
    unplug event (AudioManager.ACTION_AUDIO_BECOMING_NOISY) is received while
    the media notification is active and not already paused.
  </summary>
</histogram>

<histogram name="Media.Android.AudioBecomingNoisyPaused.TimeToResume"
    units="ms" expires_after="2027-06-01">
  <owner>philyan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the duration of time between when playback is paused due to a
    headset unplug event (AudioBecomingNoisy) and when it is next resumed. Only
    recorded when the user manually resumes playback after the auto-pause. Not
    recorded if the user pauses manually before resuming, or if the notification
    is cleared.
  </summary>
</histogram>

<histogram name="Media.Android.AudioFocusRequestResult"
    enum="AudioFocusRequestResult" expires_after="2027-02-08">
  <owner>philyan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>Records the result of the audio focus request on Android.</summary>
</histogram>

<histogram name="Media.Android.GetColorSpaceError" enum="BooleanError"
    expires_after="2025-06-08">
  <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.MediaCodec.VideoInputExceedsMaxCapacity"
    enum="Boolean" expires_after="2027-03-24">
  <owner>sobek@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaCodec instance is released (`ReleaseCodec`). It will
    be true if this MediaCodec instance encountered an input buffer that
    exceeded the max input buffer size configured by the codec
    (`max_input_size_`). It will be false otherwise.

    This helps track the frequency of heuristic failures for input buffer
    estimations during MediaCodec decoder configuration.
  </summary>
</histogram>

<histogram name="Media.Audible.ConcurrentTabsTime" units="ms"
    expires_after="2027-04-07">
  <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="2027-04-07">
  <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="2027-04-07">
  <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.Android.AAudio.CallbackSizeDistribution.{Direction}"
    units="frames" expires_after="2027-01-10">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of frames delivered in each AAudio data callback for {Direction}
    streams. Logged sub-sampled (once every 100 callbacks) to evaluate variable
    callback dynamics.
  </summary>
  <token key="Direction" variants="AudioDirection"/>
</histogram>

<histogram
    name="Media.Audio.Android.AAudio.CallbackTransitionsPer1000.{Direction}"
    units="transitions" expires_after="2027-01-10">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of callback size transitions per 1000 callbacks for {Direction}
    streams. Logged on stream close for streams lasting longer than 10 seconds.
  </summary>
  <token key="Direction" variants="AudioDirection"/>
</histogram>

<histogram name="Media.Audio.Android.AAudio.InputTimestampDiscontinuitySize"
    units="ms" expires_after="2027-01-10">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The size (magnitude of deviation from expected callback interval) of a
    timestamp discontinuity for AAudio input streams. Logged whenever a
    discontinuity is detected (i.e. the actual interval differs from the
    expected interval by more than 10% of the callback duration).
  </summary>
</histogram>

<histogram name="Media.Audio.Android.AAudio.InputTimestampDiscontinuitySizeV2"
    units="ms" expires_after="2027-01-10">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The size (magnitude of deviation from expected callback interval) of a
    timestamp discontinuity for AAudio input streams. Logged whenever a
    discontinuity is detected (i.e. the actual interval differs from the
    expected interval by more than 10% of the callback duration). This V2
    version tracks timestamps from the start of captured audio buffers (the
    oldest sample, as expected by the media pipeline) rather than the most
    recent sample, fixing errors caused by variable-sized callbacks.
  </summary>
</histogram>

<histogram name="Media.Audio.Android.AAudio.TimestampDiscontinuitiesPer10s"
    units="discontinuities" expires_after="2027-01-03">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of discontinuities in OnData() timestamps per 10 second interval
    for AAudio input streams. A discontinuity is counted if the timestamp
    differs from the expected timestamp by more than 10% of the callback
    duration. Logged periodically every 10 seconds while the stream is running.
    Streams shorter than 10 seconds are ignored.
  </summary>
</histogram>

<histogram name="Media.Audio.Android.AAudio.TimestampDiscontinuitiesPer10sV2"
    units="discontinuities" expires_after="2027-01-03">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of discontinuities in OnData() timestamps per 10 second interval
    for AAudio input streams. A discontinuity is counted if the timestamp
    differs from the expected timestamp by more than 10% of the callback
    duration. Logged periodically every 10 seconds while the stream is running.
    Streams shorter than 10 seconds are ignored. This V2 version tracks
    timestamps from the start of captured audio buffers (the oldest sample, as
    expected by the media pipeline) rather than the most recent sample, fixing
    errors caused by variable-sized callbacks.
  </summary>
</histogram>

<histogram
    name="Media.Audio.Android.AAudioBufferSizeInFrames.{Direction}{AudioLatencyTag}"
    units="frames" expires_after="2026-11-29">
  <owner>kawasin@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <summary>
    The buffer size in frames of an AAudio {Direction} stream got by
    `AAudioStream_getBufferSizeInFrames()` and {AudioLatencyTag}. Logged when an
    AAudio stream is opened.
  </summary>
  <token key="Direction" variants="AudioDirection"/>
  <token key="AudioLatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram
    name="Media.Audio.Android.AAudioFramesPerBurst.{Direction}{AudioLatencyTag}"
    units="frames" expires_after="2027-01-31">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The frames per burst of an AAudio {Direction} stream retrieved by
    `AAudioStream_getFramesPerBurst()` and {AudioLatencyTag}. Logged when an
    AAudio stream is opened.
  </summary>
  <token key="Direction" variants="AudioDirection"/>
  <token key="AudioLatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram
    name="Media.Audio.Android.AAudioFramesPerBurstChanged.{Direction}{AudioLatencyTag}"
    enum="Boolean" expires_after="2027-01-31">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether the value returned by `AAudioStream_getFramesPerBurst()` changed
    bewtween when an {Direction} stream was opened and when it was closed.
    Logged when an AAudio stream is closed.
  </summary>
  <token key="Direction" variants="AudioDirection"/>
  <token key="AudioLatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram
    name="Media.Audio.Android.AAudioFramesPerDataCallback.{Direction}{AudioLatencyTag}"
    units="frames" expires_after="2027-09-27">
  <owner>kawasin@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of frames per data callback for an AAudio stream got by
    `AAudioStream_getFramesPerDataCallback()` and {AudioLatencyTag}. Logged when
    an AAudio stream is opened. The requested value by the client is logged as
    `Media.Audio.Android.RequestedInputFramesPerBuffer` or
    `Media.Audio.Android.RequestedOutputFramesPerBuffer`. Note that
    `Media.Audio.Android.AAudioFramesPerDataCallback` can be different from the
    actual buffer size used by the stream on Android which is logged as
    `Media.Audio.Android.AAudioBufferSizeInFrames`.
  </summary>
  <token key="Direction" variants="AudioDirection"/>
  <token key="AudioLatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram name="Media.Audio.Android.AAudioSetDeviceId.{Direction}.{Result}"
    enum="AndroidAudioDeviceType" expires_after="M155">
  <owner>mjel@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    For every AAudio {Direction} stream that is opened without resulting in an
    internal AAudio error and with a non-default device requested, records if
    setting the device ID was a {Result}. This operation is considered
    successful if the requested device (passed to
    AAudioStreamBuilder_setDeviceId) is the same as the actual device assigned
    to the stream (received via AAudioStream_getDeviceId).
  </summary>
  <token key="Direction">
    <variant name="Input"/>
    <variant name="Output"/>
  </token>
  <token key="Result">
    <variant name="Failure"/>
    <variant name="Success"/>
  </token>
</histogram>

<histogram name="Media.Audio.Android.AAudioXRunCount.Input.Interval"
    units="glitches" expires_after="2027-01-03">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs the number of glitches reported by `AAudioStream_getXRunCount()` in a
    regular 10s interval. Logged once every 10s, for each input stream. Note:
    glitch counts cannot be mapped back to a number of frames or a duration.
    There is no way to assess the severity of glitches, only the number of
    glitches. Note: Some input devices do not support `getXRunCount()`, and
    always report 0 glitches in that case.
  </summary>
</histogram>

<histogram name="Media.Audio.Android.AAudioXRunCount.Input.Short"
    units="glitches" expires_after="2027-01-03">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs the number of glitches reported by `AAudioStream_getXRunCount()`, when
    we've accumulated fewer than 10s of data. This covers all input streams who
    are closed within 10s of being created, as well as the last few seconds of
    any longer-lived stream's lifetime. Logged on stream closure, for each input
    stream. Note: glitch counts cannot be mapped back to a number of frames or a
    duration. There is no way to assess the severity of glitches, only the
    number of glitches. Note: Some input devices do not support
    `getXRunCount()`, and always report 0 glitches in that case.
  </summary>
</histogram>

<histogram name="Media.Audio.Android.AAudioXRunCount.Output.Interval"
    units="glitches" expires_after="2027-01-03">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs the number of glitches reported by `AAudioStream_getXRunCount()` in a
    regular 10s interval. Logged once every 10s, for each output stream. Note:
    glitch counts cannot be mapped back to a number of frames or a duration.
    There is no way to assess the severity of glitches, only the number of
    glitches.
  </summary>
</histogram>

<histogram name="Media.Audio.Android.AAudioXRunCount.Output.Short"
    units="glitches" expires_after="2027-01-03">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs the number of glitches reported by `AAudioStream_getXRunCount()`, when
    we've accumulated fewer than 10s of data. This covers all output streams who
    are closed within 10s of being created, as well as the last few seconds of
    any longer-lived stream's lifetime. Logged on stream closure, for each
    output stream. Note: glitch counts cannot be mapped back to a number of
    frames or a duration. There is no way to assess the severity of glitches,
    only the number of glitches.
  </summary>
</histogram>

<histogram name="Media.Audio.Android.DevicesChanged" enum="DeviceChangeKind"
    expires_after="2026-12-20">
  <owner>mjel@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    For every call to SystemMonitor::ProcessDevicesChanged indicating a change
    in available audio devices, records whether it was caused by devices being
    added or removed.
  </summary>
</histogram>

<histogram name="Media.Audio.Android.MissingChannelMask" units="sparse"
    expires_after="2027-06-01">
  <owner>dvalenzuela@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the AudioDevice channel masks that are supported by Android
    automotive, but not yet mapped to a corresponding media::ChannelLayout. To
    interpret these numbers as AudioFormat.channelMasks, see:
    https://developer.android.com/reference/android/media/AudioFormat#channelMask
  </summary>
</histogram>

<histogram
    name="Media.Audio.Android.PreferredOutputFramesPerBuffer{AudioLatencyTagWithInvalidInputParams}"
    units="frames" expires_after="2027-09-27">
  <owner>kawasin@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The preferred output buffer size in frames for an audio output stream
    calculated from OS provided buffer size on Android. This is for audio output
    streams that {AudioLatencyTagWithInvalidInputParams}. Logged when
    GetPreferredOutputStreamParameters() is called. This value is usally used by
    the client to calculate the buffer size in frames for an audio output stream
    which is logged as `Media.Audio.Android.RequestedOutputFramesPerBuffer`.
  </summary>
  <token key="AudioLatencyTagWithInvalidInputParams">
    <variant name="" summary="All latency tags are combined"/>
    <variant name=".InvalidInputParams"
        summary="The input parameters are invalid to calculate the buffer
                 size from"/>
    <variant name=".LatencyExactMs" summary="Latency tag is ExactMS"/>
    <variant name=".LatencyInteractive" summary="Latency tag is Interactive"/>
    <variant name=".LatencyPlayback" summary="Latency tag is Playback"/>
    <variant name=".LatencyRtc" summary="Latency tag is RTC"/>
    <variant name=".LatencyUnknown" summary="Latency tag is Unknown"/>
  </token>
</histogram>

<histogram
    name="Media.Audio.Android.RequestedInputFramesPerBuffer{AudioLatencyTag}"
    units="frames" expires_after="2026-12-18">
  <owner>kawasin@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@chromium.org</owner>
  <summary>
    The number of frames per data callback for an audio input stream requested
    by the client and {AudioLatencyTag}. Logged on stream creation.
    `Media.Audio.Android.AAudioFramesPerDataCallback.Input` logs the actual
    values used in an AAudio input stream.
  </summary>
  <token key="AudioLatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram
    name="Media.Audio.Android.RequestedOutputFramesPerBuffer{AudioLatencyTag}"
    units="frames" expires_after="2027-09-27">
  <owner>kawasin@google.com</owner>
  <owner>olka@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>webrtc-audio-uma@chromium.org</owner>
  <summary>
    The number of frames per data callback for an audio output stream requested
    by the client and {AudioLatencyTag}. Logged on stream creation.
    `Media.Audio.Android.AAudioFramesPerDataCallback.Output` logs the actual
    values used in an AAudio output stream.
  </summary>
  <token key="AudioLatencyTag" variants="AudioLatencyTag"/>
</histogram>

<histogram name="Media.Audio.Android.SupportedChannelMask" units="sparse"
    expires_after="2027-06-01">
  <owner>dvalenzuela@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the AudioDevice channel masks that are supported by Android
    automotive. These only include masks that are mapped to a corresponding
    media::ChannelLayout. To interpret these numbers as
    AudioFormat.channelMasks, see:
    https://developer.android.com/reference/android/media/AudioFormat#channelMask
  </summary>
</histogram>

<histogram name="Media.Audio.Autoplay" enum="AutoplaySource"
    expires_after="2027-04-07">
  <owner>evliu@google.com</owner>
  <owner>dalecurtis@chromium.org</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="2027-02-07">
  <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="2026-11-03">
  <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="2027-05-24">
  <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="2027-02-14">
  <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.AUAudioInputStream.ChosenSampleFormat"
    enum="SampleFormat" expires_after="2027-02-07">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The SampleFormat macOS chooses when initializing audio input capture. Used
    to determine which proportion of devices do not support Float32 and fallback
    to SignedInt16. This is logged once per stream initialization. This accounts
    for both regular input streams and VoiceProcessing input streams. There are
    only two valid options, F32 and S16. All other cases will be recorded as
    kUnknownSampleFormat.
  </summary>
</histogram>

<histogram
    name="Media.Audio.Capture.Mac.GetApplicationAudioCaptureIdDuration.{Status}"
    units="ms" expires_after="2027-05-04">
  <owner>brandstrom@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Measures the time required to retrieve the ApplicationAudioCaptureId for a
    given process identifier on macOS. Logged for each call to
    GetApplicationAudioCaptureIdForProcess() with the status variant (Success or
    Failure).
  </summary>
  <token key="Status">
    <variant name="Failure"/>
    <variant name="Success"/>
  </token>
</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="2026-10-04">
  <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.NeuralResidualEchoEstimationModelAvailable"
    enum="BooleanAvailable" expires_after="2027-02-07">
  <owner>saza@chromium.org</owner>
  <owner>devicentepena@webrtc.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    A boolean that reflects whether or not an ML model for neural residual echo
    estimation is available. Logged when an audio processor with echo
    cancellation is constructed. Logging is restricted to when audio service ML
    model delivery is enabled.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.ProcessingAudioFifo.MaxUsage"
    units="buffers" expires_after="2027-01-17">
  <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="2027-01-17">
  <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="2027-02-01">
  <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.

    Warning: this histogram was expired from 2025-12-28 to 2026-02-02; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.SCK.ContentEnumerationTimeMs" units="ms"
    expires_after="2027-02-01">
  <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.

    Warning: this histogram was expired from 2025-12-28 to 2026-02-02; data may
    be missing.
  </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="2027-02-01">
  <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
    timestamp 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 difference 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.AudioEngineFormat" enum="SampleFormat"
    expires_after="2026-12-27">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This is the SampleFormat the Windows Audio Engine returns as its preferred
    format when we open an Audio Input Stream. This is recorded everytime a user
    decides to record audio (e.g. record via microphone). This is recorded once
    per Input Stream, notably recorded at Stream Open rather than Stream
    Initialization.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.AudioEngineFormat.Unknown"
    units="combined_format" expires_after="2026-10-28">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This is the SubFormat.Data1 (i.e. wFormatTag) the Windows Audio Engine
    returns as its preferred format when we open an Audio Input Stream, recorded
    only when the format does not map to a known media::SampleFormat. This is
    potentially recorded everytime a user decides to record audio (e.g. record
    via microphone). This is recorded once per Input Stream, notably recorded at
    Stream Open rather than Stream Initialization.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.FakeTimestamps" enum="Boolean"
    expires_after="2027-02-01">
  <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
    timestamps 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.GetAudioClientTimedOut" enum="Boolean"
    expires_after="2027-02-07">
  <owner>henrika@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logs whether the attempt to acquire an input audio client asynchronously
    timed out or not. A timeout corresponds to a waiting time which exceeds 10
    seconds. Logged once when an input audio stream is opened and the specified
    device ID is a process loopback device. Only supported on Windows.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.Glitches2" units="glitches"
    expires_after="2026-11-15">
  <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.FormatRelated"
    enum="AudioStreamFormatRelatedInitError" expires_after="2027-01-17">
  <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.InitError.SystemPermissionDenied"
    enum="Boolean" expires_after="2027-05-15">
  <owner>henrika@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logs true if IAudioClient::Initialize() failed with E_ACCESSDENIED in
    WASAPIAudioInputStream::InitializeAudioEngine on Windows, indicating that
    audio capture was blocked by system permissions. Logged once per
    initialization attempt.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.InitError2" enum="Hresult"
    expires_after="2027-05-15">
  <owner>henrika@chromium.org</owner>
  <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. E_ACCESSDENIED is
    intentionally excluded and is tracked by
    Media.Audio.Capture.Win.SystemPermissionDenied instead.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.Open" enum="AudioStreamOpenResult"
    expires_after="2027-02-14">
  <owner>gudiou@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>fhernqvist@google.com</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.Capture.Win.ProcessLoopbackInitError2"
    enum="Hresult" expires_after="2027-05-15">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The HRESULT code for an error when initializing for process loopback
    capture. This is recorded only when initialization fails and the device is a
    process loopback device. E_ACCESSDENIED is intentionally excluded and is
    tracked by Media.Audio.Capture.Win.SystemPermissionDenied instead.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.TimeToGetAudioClient" units="ms"
    expires_after="2027-02-07">
  <owner>henrika@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This histogram records the time it takes to activate an audio client
    asynchronously, which occurs on the audio.CrUtilityMain thread in the
    AudioService process. Logged once when an input audio stream is successfully
    opened and the specified device ID is a process loopback device. Only
    supported on Windows and when Media.Audio.Capture.Win.GetAudioClientTimedOut
    is false.
  </summary>
</histogram>

<histogram name="Media.Audio.Capture.Win.VoiceProcessingEffects"
    enum="AudioEffectType" expires_after="2027-03-01">
  <owner>henrika@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Supported audio effect types detected for audio input devices. Emitted each
    time a client requests the preferred audio parameters for a specified device
    but also each time a client opens an audio input stream where an AEC effect
    is requested by the input parameters. Only supported on Windows and when the
    EnforceSystemEchoCancellation flag is enabled.
  </summary>
</histogram>

<histogram name="Media.Audio.CrasInputStreamNotifyStreamError"
    units="errorcode" expires_after="2026-05-17">
  <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="2026-06-21">
  <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="2025-04-28">
  <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="2026-05-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 CrasUnifiedStream.
  </summary>
</histogram>

<histogram name="Media.Audio.CrasUnifiedStreamOpenSuccess"
    enum="CrasUnifiedStreamOpenSuccess" expires_after="2026-04-05">
  <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="2026-05-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 CrasUnifiedStream::Start to indicate any errors.
  </summary>
</histogram>

<histogram name="Media.Audio.Decode.OpusCodecDelayMismatch" units="packets"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When there is a codec delay mismatch between the container and the decoder
    for the OpusAudioDecoder, reports the absolute difference in value.
  </summary>
</histogram>

<histogram name="Media.Audio.DecoderType" enum="AudioDecoderType"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the audio decoder type used for a playback session. Recorded when
    the metrics provider is destructed.
  </summary>
</histogram>

<histogram name="Media.Audio.Iamf.InitStatus" enum="DecoderStatus"
    expires_after="2027-06-30">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the outcome of the IamfAudioDecoder initialization, including
    success or specific failure reasons. It is recorded once per decoder during
    initialization within IamfAudioDecoder::Initialize().
  </summary>
</histogram>

<histogram name="Media.Audio.Iamf.InputChannelCount" units="channels"
    expires_after="2027-06-30">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the number of spatial audio channels in the input IAMF stream. It is
    recorded once per decoder during successful initialization within
    IamfAudioDecoder::Initialize().
  </summary>
</histogram>

<histogram name="Media.Audio.Iamf.MixMode" enum="IamfMixMode"
    expires_after="2027-06-30">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records whether the IAMF decoder upmixed, downmixed, or passed through the
    input channel layout to the requested output layout. It is recorded once per
    decoder during successful initialization within
    IamfAudioDecoder::Initialize().
  </summary>
</histogram>

<histogram name="Media.Audio.Iamf.OutputLayout" enum="IamfOutputLayout"
    expires_after="2027-06-30">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the IAMF output layout requested or configured by the decoder. It is
    recorded once per decoder during successful initialization within
    IamfAudioDecoder::VerifyStreamParameters().
  </summary>
</histogram>

<histogram name="Media.Audio.Iamf.UsageTime" units="ms"
    expires_after="2027-06-30">
  <owner>lowkey@google.com</owner>
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the total duration of audio successfully decoded by the
    IamfAudioDecoder in a single session. It is recorded once per decoder when
    the decoder is destroyed within IamfAudioDecoder::~IamfAudioDecoder(),
    provided there was at least one successful temporal unit decoded.
  </summary>
</histogram>

<histogram name="Media.Audio.InputController.Delay.{AECType}" units="ms"
    expires_after="2027-03-27">
  <owner>henrika@chromium.org</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the audio delays seen by the audio::InputController::OnData()
    callback for a source of type {AECType}.
  </summary>
  <token key="AECType">
    <variant name="ChromeWideAEC"/>
    <variant name="LoopbackAEC"/>
    <variant name="NoAudioServiceAEC"/>
  </token>
</histogram>

<histogram name="Media.Audio.InputStartupSuccessMac{MacAudioInputVariants}"
    enum="BooleanSuccess" expires_after="2027-01-31">
  <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.
    {MacAudioInputVariants}
  </summary>
  <token key="MacAudioInputVariants">
    <variant name=""/>
    <variant name="_HighLatency"
        summary="Measures the standard Mac audio driver (i.e. not
                 low-latency)."/>
  </token>
</histogram>

<histogram name="Media.Audio.LoopbackReference.HadRuntimeError"
    enum="BooleanRuntimeError" expires_after="2027-01-03">
  <owner>henrika@google.com</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports if a loopback AEC reference audio input stream was closed due to a
    runtime error or not. Only supported on Windows and Mac.
  </summary>
</histogram>

<histogram name="Media.Audio.LoopbackReference.OpenResult2"
    enum="ReferenceOpenOutcome" expires_after="2026-11-15">
  <owner>henrika@google.com</owner>
  <owner>fhernqvist@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports success/error cases for opening a loopback AEC reference audio input
    stream on Windows or Mac. This is a V2 metric replacing
    Media.Audio.LoopbackReference.OpenResult to include the new
    STREAM_OPEN_DEVICE_REMOVED_ERROR outcome.
  </summary>
</histogram>

<histogram name="Media.Audio.Mac.AggregateDeviceCompositionPropertyIsNull"
    enum="Boolean" expires_after="2027-02-20">
  <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.Mac.AggregateDeviceIsPrivate{Type}" enum="Boolean"
    expires_after="2027-02-22">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the number of occurences of private aggregate devices where the
    dictionary entry for kAudioAggregateDeviceIsPrivateKey is successfully
    interpreted as a {Type}. Recorded for each call to
    IsPrivateAggregateDevice() if the AudioObjectID is of type
    kAudioDeviceTransportTypeAggregate and there is a dictionary. This histogram
    is used to determine the type of the value in the dictionary for
    kAudioAggregateDeviceIsPrivateKey. If no occurences of type Number are
    detected, we can remove the code path that parses the dictionary as a
    number.
  </summary>
  <token key="Type">
    <variant name="Boolean"/>
    <variant name="Number"/>
  </token>
</histogram>

<histogram name="Media.Audio.Mac.CatapAudioInputStream.ChannelCountMismatch"
    units="count" expires_after="2026-12-27">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the number of callbacks where the channel count in the sample
    callback did not match the channel count of the stream. The histogram is
    recorded when the capture is stopped.
  </summary>
</histogram>

<histogram name="Media.Audio.Mac.CatapAudioInputStream.FramesMismatch"
    units="count" expires_after="2027-02-15">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the number of callbacks where the number of frames in the sample
    callback did not match the frames per buffer of the stream. The histogram is
    recorded when the capture is stopped.
  </summary>
</histogram>

<histogram name="Media.Audio.Mac.CatapAudioInputStream.HostTimeStatus"
    enum="CatapAudioInputStreamHostTimeStatus" expires_after="2027-01-17">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    This metric reports whether host time was provided in the sample callbacks.
    It also tracks recoveries, defined as a callback with host time occurring
    after a callback without host time. The histogram is recorded when the
    capture is stopped.
  </summary>
</histogram>

<histogram name="Media.Audio.Mac.CatapAudioInputStream.IsAlive" enum="Boolean"
    expires_after="2027-02-15">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the IsAlive property of the CoreAudio tap's aggregated device. The
    histogram is recorded in the property listener's callback when the IsAlive
    property is reported to have changed.
  </summary>
</histogram>

<histogram
    name="Media.Audio.Mac.CatapAudioInputStream.OperationDuration.{Operation}.{Status}"
    units="ms" expires_after="2027-02-07">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the duration of the operation {Operation} in CatapAudioInputStream.
    The duration is measured from the time the operation is called until the
    operation completes with a success or failure. The result is immediately
    logged. This histogram tracks the duration of operations that result in a
    {Status}.
  </summary>
  <token key="Operation">
    <variant name="Close"/>
    <variant name="GetProcessAudioDeviceIds"/>
    <variant name="GetProcessAudioDeviceIdsFromBundleId"/>
    <variant name="Open"/>
    <variant name="Start"/>
    <variant name="Stop"/>
  </token>
  <token key="Status">
    <variant name="Failure"/>
    <variant name="Success"/>
  </token>
</histogram>

<histogram name="Media.Audio.Mac.CatapAudioInputStream.Status.Close"
    enum="CatapAudioInputStreamStatusClose" expires_after="2027-01-03">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the status of the operation Close in CatapAudioInputStream. Failures
    are recorded directly after the failure occurs. The histogram is recorded
    immediately after the operation completes, either with a success or failure.
  </summary>
</histogram>

<histogram name="Media.Audio.Mac.CatapAudioInputStream.Status.Open"
    enum="CatapAudioInputStreamStatusOpen" expires_after="2027-01-03">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the status of the operation Open in CatapAudioInputStream. Failures
    are recorded directly after the failure occurs. The histogram is recorded
    immediately after the operation completes, either with a success or failure.
  </summary>
</histogram>

<histogram name="Media.Audio.Mac.CatapAudioInputStream.Status.{Operation}"
    enum="BooleanSuccess" expires_after="2027-02-07">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Reports the status of the operation {Operation} in CatapAudioInputStream.
    Failures are recorded directly after the failure occurs. The histogram is
    recorded immediately after the operation completes, either with a success or
    failure.
  </summary>
  <token key="Operation">
    <variant name="Start"/>
    <variant name="Stop"/>
  </token>
</histogram>

<histogram name="Media.Audio.Mac.HardwareLatency.{Direction}.{Component}"
    units="misses" expires_after="2027-03-22">
  <owner>tguilbert@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The reported hardware latency, used to adjust timestamps for A/V sync.
    Logged once per low-latency input stream creation (AUAudioInputStream only),
    or once per output stream creation.
  </summary>
  <token key="Direction">
    <variant name="Input" summary="Audio capture"/>
    <variant name="Output" summary="Audio playback"/>
  </token>
  <token key="Component">
    <variant name="AudioUnit" summary="Latency reported by AudioUnit"/>
    <variant name="Device" summary="Latency reported by the HW device"/>
    <variant name="Stream" summary="Latency reported by the stream"/>
    <variant name="Total" summary="Total reported latency"/>
  </token>
</histogram>

<histogram name="Media.Audio.Mac.NoiseSuppressionAvailable"
    enum="BooleanSuccess" expires_after="2027-02-07">
  <owner>brandstrom@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    If the device reports that system noise supression is available.
  </summary>
</histogram>

<histogram name="Media.Audio.MakeAudioInputStreamStatus"
    enum="MakeAudioStreamStatus" expires_after="2026-08-30">
  <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.MakeAudioOutputStreamStatus"
    enum="MakeAudioStreamStatus" expires_after="2027-01-03">
  <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::MakeAudioOutputStream to indicate
    any errors.
  </summary>
</histogram>

<histogram name="Media.Audio.Output.Win.{AudioOutputMethod}Error2"
    enum="Hresult" expires_after="2027-05-19">
  <owner>henrika@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Logs the exact COM HRESULTs encountered during various phases of the Windows
    WASAPI audio output stream lifecycle (Open, Start, Stop, Render, and Run).
    This is version 2 of the metric, which strictly logs HRESULTs instead of
    mixing them with raw Win32 errors.

    Note on overlap between Run and Render: There is an intentional overlap for
    fatal rendering errors. If a fatal error (like failing to get the endpoint
    buffer) occurs during the rendering pass, it is logged to the Render
    histogram. Because this fatal error also causes the background thread to
    terminate, the exact same HRESULT is subsequently logged to the Run
    histogram.

    The Render histogram captures ALL rendering errors (including non-fatal ones
    that do not kill the thread). The Run histogram acts as a catch-all for
    whatever killed the background thread (including fatal Render errors as well
    as thread synchronization failures).
  </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="2027-01-03">
  <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.OutputDeviceMixer.MixedPlaybackStatus"
    enum="AudioOutputDeviceMixerMixedPlaybackStatus" expires_after="2026-10-04">
  <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.OvertimeCount" units="count"
    expires_after="2026-09-13">
  <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. Warning: this histogram was expired from 2025-11-17 to
    2025-12-01; data may be missing.
  </summary>
</histogram>

<histogram name="Media.Audio.OutputDeviceMixer.StreamStatus"
    enum="AudioOutputDeviceMixerStreamStatus" expires_after="2026-11-15">
  <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="2027-05-11">
  <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="2026-12-27">
  <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="2026-10-27">
  <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="2026-09-06">
  <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="2026-10-27">
  <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="2026-10-27">
  <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="2026-10-27">
  <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="2027-01-04">
  <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="2027-05-11">
  <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="2027-05-11">
  <owner>fhernqvist@google.com</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="2027-05-11">
  <owner>fhernqvist@google.com</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="2027-01-24">
  <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="2027-01-31">
  <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="2026-08-23">
  <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="2027-02-14">
  <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="2026-09-13">
  <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.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="2027-02-14">
  <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.Symphonia.DecodeError"
    enum="SymphoniaDecodeStatus" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the error code associated with a failed Symphonia audio decoder
    decoding attempt.
  </summary>
</histogram>

<histogram name="Media.Audio.Symphonia.InitStatus" enum="SymphoniaInitStatus"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the status code returned by the Symphonia audio decoder for each
    initialization attempt.
  </summary>
</histogram>

<histogram name="Media.Audio.Symphonia.OversizedPcmPacket" units="frames"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Reports the number of frames in a PCM packet that was larger than the static
    buffer used for decoding.
  </summary>
</histogram>

<histogram name="Media.Audio.TabAudioMuted" enum="Boolean"
    expires_after="2027-06-01">
  <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.Win.CoreAudioUtil.SharedModeInitializeTime"
    units="ms" expires_after="2027-01-10">
  <owner>henrika@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>media-audio@chromium.org</owner>
  <summary>
    Measures the execution time of CoreAudioUtil::SharedModeInitialize. Recorded
    when Chrome attempts to initialize the audio stream between the client and
    the device in shared mode. This captures the synchronous time spent waiting
    for the Windows WASAPI driver to initialize a shared-mode audio endpoint.

    Note: Although this function is currently only used for output (render)
    streams, we intentionally omit &quot;Output.Win&quot; from the metric name
    to maintain a 1:1 mapping with the underlying C++ CoreAudioUtil method name.
  </summary>
</histogram>

<histogram name="Media.Audio.{Direction}DeviceEnumerationOutcome"
    enum="AudioDeviceEnumerationOutcome" expires_after="2027-05-01">
  <owner>frederikh@google.com</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Tracks the success and failure outcomes of platform-specific audio
    {Direction} device enumerations (e.g., WASAPI, CoreAudio). Helps detect if
    OS errors are causing the browser to cache incomplete or empty device lists.
    Recorded when the browser requests the list of audio {Direction} devices
    from the OS (e.g. during enumerateDevices).
  </summary>
  <token key="Direction">
    <variant name="Input" summary="input"/>
    <variant name="Output" summary="output"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.EarlyGlitchDetected" enum="BooleanDetected"
    expires_after="2027-01-03">
  <owner>olka@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Whether a glitch in the {Type} 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="Loopback"/>
    <variant name="LoopbackReference"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.Glitches2" units="glitches"
    expires_after="2027-01-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
    {Type} 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="Loopback"/>
    <variant name="LoopbackReference"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.LargestGlitchMs2" units="ms"
    expires_after="2027-02-07">
  <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 {Type} 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="Loopback"/>
    <variant name="LoopbackReference"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.LostFramesInMs2" units="ms"
    expires_after="2027-05-11">
  <owner>olka@chromium.org</owner>
  <owner>saza@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    The combined length in milliseconds of {Type} 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="Loopback"/>
    <variant name="LoopbackReference"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.Audio.{Type}.SystemGlitchDuration" units="ms"
    expires_after="2027-02-14">
  <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 Loopback, and
    AudioOutputStream for Render). Reported every time a glitch occurs.
  </summary>
  <token key="Type">
    <variant name="Capture"/>
    <variant name="Loopback"/>
    <variant name="Render"/>
  </token>
</histogram>

<histogram name="Media.AudioCapturerAudioGlitches" enum="AudioGlitchResult"
    expires_after="2027-01-31">
  <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="2027-05-24">
  <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.AudioCapturerDroppedDataBelow10s" units="drops"
    expires_after="2027-05-24">
  <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="2027-05-24">
  <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.AudioCapturerMissedReadDeadlineBelow10s" units="misses"
    expires_after="2027-05-24">
  <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="2027-06-08">
  <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.AudioDeviceConnectionStatus.{AudioDeviceType}"
    enum="AudioDeviceConnectionStatus" expires_after="2026-06-28">
  <owner>iwells@chromium.org</owner>
  <owner>clank-readaloud@google.com</owner>
  <summary>
    Records connection status changes for {AudioDeviceType} audio devices,
    emitted when a device is connected or disconnected. Disconnection of
    Bluetooth devices may be reported more than fifteen seconds after the device
    is actually disconnected. If using a 3.5mm-to-USB adapter, a 3.5mm device
    may be reported as USB.
  </summary>
  <token key="AudioDeviceType">
    <variant name="Bluetooth"/>
    <variant name="USB"/>
    <variant name="Wired"/>
  </token>
</histogram>

<histogram name="Media.AudioDuckerWin.UnduckSessionIterationResult"
    enum="BooleanSuccess" expires_after="2026-05-10">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the AudioDuckerWin attempts to stop ducking other applications
    while at least 1 application is currently being ducked. Records `Failure` if
    we receive errors querying the OS for the list of audio sessions, otherwise
    records `Success`.
  </summary>
</histogram>

<histogram name="Media.AudioDuckerWin.UnduckSessionResult"
    enum="BooleanSuccess" expires_after="2027-01-17">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the AudioDuckerWin attempts to stop ducking another
    application. Records `Failure` if we receive errors from the OS when
    attempting to re-adjust the other application's volume, otherwise records
    `Success`.
  </summary>
</histogram>

<histogram name="Media.AudioInputController{MediaAudioInputControllerTime}"
    units="ms" expires_after="2027-04-01">
  <owner>dalecurtis@chromium.org</owner>
  <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>
    Measures the execution time of
    AudioInputController{MediaAudioInputControllerTime}. Recorded when the
    corresponding AudioInputController method finishes execution.
  </summary>
  <token key="MediaAudioInputControllerTime">
    <variant name=".CloseTime"/>
    <variant name=".CreateTime"/>
    <variant name=".RecordTime"/>
  </token>
</histogram>

<histogram name="Media.AudioInputDevice.AudioServiceDelay" units="ms"
    expires_after="2027-01-31">
  <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="2027-02-07">
  <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="2027-01-31">
  <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="2027-01-31">
  <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="2026-09-13">
  <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="2026-07-12">
  <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.AudioOutputController{MediaAudioOutputControllerTime}"
    units="ms" expires_after="2027-03-30">
  <owner>olka@chromium.org</owner>
  <owner>henrika@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Measures the execution time of
    AudioOutputController{MediaAudioOutputControllerTime}. Recorded when the
    corresponding AudioOutputController method finishes execution.
  </summary>
  <token key="MediaAudioOutputControllerTime">
    <variant name=".CloseTime"/>
    <variant name=".CreateTime"/>
    <variant name=".PauseTime"/>
    <variant name=".PlayTime"/>
    <variant name=".ProcessDeviceChangeTime"/>
    <variant name=".StartStreamTime"/>
    <variant name=".StopStreamTime"/>
    <variant name=".ToggleLocalOutputTime"/>
  </token>
</histogram>

<histogram name="Media.AudioOutputDevice.AudioServiceDelay{LatencyTag}"
    units="ms" expires_after="2027-01-31">
  <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="2027-02-07">
  <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="2027-01-31">
  <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.OpenLowLatencyStream2"
    enum="AudioOutputResamplerLowLatencyOpenStreamResult"
    expires_after="2027-01-31">
  <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. In case audio output stream is opened in offload mode, record
    successful opening in offload mode explicitly to distinguish from
    non-offload mode.
  </summary>
</histogram>

<histogram name="Media.AudioOutputStreamProxy.StreamFormat"
    enum="AudioOutputProxyStreamFormat" expires_after="2027-05-11">
  <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.
  </summary>
</histogram>

<histogram name="Media.AudioRendererAudioGlitches2.{LatencyTag}"
    enum="AudioGlitchResult" expires_after="2027-01-31">
  <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="2027-02-14">
  <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.AudioRendererMissedDeadline3{Mixing}{Duration}{LatencyTag}"
    units="misses" expires_after="2027-02-07">
  <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="2026-12-27">
  <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.AutoPictureInPicture.BackToTabPostHideTime" units="ms"
    expires_after="2026-10-31">
  <owner>philyan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the time elapsed between the user hiding an auto-picture-in-picture
    window and the user returning to the original tab. This is only recorded
    when the user taps the &quot;hide&quot; button (a headphone icon) on the PiP
    window on Android, which keeps the audio playing in the background. The hide
    icon is only visible for auto-pip initialized pausable media.
  </summary>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.PromptResultV2"
    enum="MediaAutoPictureInPicturePromptResult" expires_after="2027-01-10">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded for automatic picture in picture reason
    &quot;{AutomaticReason}&quot;, when the user either selects an option from
    the Automatic picture-in-picture permission prompt, or when the user
    manually closes the picture-in-picture window without responding to the
    prompt, or when we decide to not show the prompt at all. When the prompt is
    shown, this records their selection (or &quot;Ignored&quot; if they did not
    select an option). When the prompt is not shown, records why it was not
    shown.
  </summary>
  <token key="AutomaticReason">
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.TotalTime"
    units="ms" expires_after="2027-01-03">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent on a Picture in Picture window for automatic picture in
    picture reason &quot;{AutomaticReason}&quot;. The timer starts counting
    every time the AutoPictureInPictureTabHelper calls
    `EnterAutoPictureInPicture`; the time elapsed is recorded when the Picture
    in Picture window is closed. This metric is recorded regardless of the
    Picture in Picture window type (document vs video), and of the reason for
    closing the window (UI interaction, returning back to opener tab, etc.).
  </summary>
  <token key="AutomaticReason">
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.TotalTimeForSession"
    units="ms" expires_after="2026-10-25">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent accross all Picture in Picture windows opened by the
    `AutoPictureInPictureTabHelper`, for automatic picture in picture reason
    &quot;{AutomaticReason}&quot;. The timer starts counting every time the
    AutoPictureInPictureTabHelper calls `EnterAutoPictureInPicture`; the time is
    accumulated any time the tab helper opens and subsequently closes a picture
    in picture window. The total picture in picture time is recorded when the
    `AutoPictureInPictureTabHelper` is destroyed. This metric does not
    differentiate between the Picture in Picture window types (document vs
    video).
  </summary>
  <token key="AutomaticReason">
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.TotalTimeForSessionV2"
    units="ms" expires_after="2027-01-03">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent accross all Picture in Picture windows opened by the
    `AutoPictureInPictureTabHelper`, for automatic picture in picture reason
    &quot;{AutomaticReason}&quot;. The timer starts counting every time the
    AutoPictureInPictureTabHelper calls `EnterAutoPictureInPicture`; the time is
    accumulated any time the tab helper opens and subsequently closes a picture
    in picture window. The total picture in picture time is recorded when the
    `AutoPictureInPictureTabHelper` is destroyed. This metric does not
    differentiate between the Picture in Picture window types (document vs
    video).

    Similar to
    Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.TotalTimeForSession,
    but with a maximum of 10 hours and a bucket size of 100.
  </summary>
  <token key="AutomaticReason">
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.TotalTimeV2"
    units="ms" expires_after="2027-01-03">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent on a Picture in Picture window for automatic picture in
    picture reason &quot;{AutomaticReason}&quot;. The timer starts counting
    every time the AutoPictureInPictureTabHelper calls
    `EnterAutoPictureInPicture`; the time elapsed is recorded when the Picture
    in Picture window is closed. This metric is recorded regardless of the
    Picture in Picture window type (document vs video), and of the reason for
    closing the window (UI interaction, returning back to opener tab, etc.).

    Similar to
    Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.TotalTime,
    but with a maximum of 10 hours and a bucket size of 100.
  </summary>
  <token key="AutomaticReason">
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReasonV2.MediaPlayback.PlaybackToTotalTimeRatio"
    units="%" expires_after="2026-11-22">
  <owner>philyan@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the ratio of watch time (i.e., when the video was actively playing)
    to total time the Picture-in-Picture window was open, for windows opened
    automatically for the MediaPlayback reason. Recorded when the window is
    closed. This helps understand user engagement with auto-PiP windows.
  </summary>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReasonV2.MediaPlayback.TotalPlaybackTime"
    units="ms" expires_after="2026-11-22">
  <owner>philyan@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the cumulative watch time (i.e., when the video was actively
    playing) within a Picture-in-Picture window that was opened automatically
    for the MediaPlayback reason. Recorded when the window is closed. To
    understand the proportion of time spent watching video vs the total time the
    window was open, see `PlaybackToTotalTimeRatio`.
  </summary>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReasonV2.{AutomaticReason}.PromptResultV2"
    enum="MediaAutoPictureInPicturePromptResult" expires_after="2027-01-03">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded for automatic picture in picture reason
    &quot;{AutomaticReason}&quot;, when the user either selects an option from
    the Automatic picture-in-picture permission prompt, or when the user
    manually closes the picture-in-picture window without responding to the
    prompt, or when we decide to not show the prompt at all. When the prompt is
    shown, this records their selection (or &quot;Ignored&quot; if they did not
    select an option). When the prompt is not shown, records why it was not
    shown.

    The AutomaticReasonV2 histograms add the BrowserInitiated bucket.
  </summary>
  <token key="AutomaticReason">
    <variant name="BrowserInitiated"/>
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReasonV2.{AutomaticReason}.TotalTime"
    units="ms" expires_after="2027-01-03">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent on a Picture in Picture window for automatic picture in
    picture reason &quot;{AutomaticReason}&quot;. The timer starts counting
    every time the AutoPictureInPictureTabHelper calls
    `EnterAutoPictureInPicture`; the time elapsed is recorded when the Picture
    in Picture window is closed. This metric is recorded regardless of the
    Picture in Picture window type (document vs video), and of the reason for
    closing the window (UI interaction, returning back to opener tab, etc.).

    The AutomaticReasonV2 histograms add the BrowserInitiated bucket.
  </summary>
  <token key="AutomaticReason">
    <variant name="BrowserInitiated"/>
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReasonV2.{AutomaticReason}.TotalTimeForSession"
    units="ms" expires_after="2027-01-03">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent accross all Picture in Picture windows opened by the
    `AutoPictureInPictureTabHelper`, for automatic picture in picture reason
    &quot;{AutomaticReason}&quot;. The timer starts counting every time the
    AutoPictureInPictureTabHelper calls `EnterAutoPictureInPicture`; the time is
    accumulated any time the tab helper opens and subsequently closes a picture
    in picture window. The total picture in picture time is recorded when the
    `AutoPictureInPictureTabHelper` is destroyed. This metric does not
    differentiate between the Picture in Picture window types (document vs
    video).

    The AutomaticReasonV2 histograms add the BrowserInitiated bucket.
  </summary>
  <token key="AutomaticReason">
    <variant name="BrowserInitiated"/>
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReasonV2.{AutomaticReason}.TotalTimeForSessionV2"
    units="ms" expires_after="2027-01-03">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent accross all Picture in Picture windows opened by the
    `AutoPictureInPictureTabHelper`, for automatic picture in picture reason
    &quot;{AutomaticReason}&quot;. The timer starts counting every time the
    AutoPictureInPictureTabHelper calls `EnterAutoPictureInPicture`; the time is
    accumulated any time the tab helper opens and subsequently closes a picture
    in picture window. The total picture in picture time is recorded when the
    `AutoPictureInPictureTabHelper` is destroyed. This metric does not
    differentiate between the Picture in Picture window types (document vs
    video).

    Similar to
    Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.TotalTimeForSession,
    but with a maximum of 10 hours and a bucket size of 100.

    The AutomaticReasonV2 histograms add the BrowserInitiated bucket.
  </summary>
  <token key="AutomaticReason">
    <variant name="BrowserInitiated"/>
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReasonV2.{AutomaticReason}.TotalTimeV2"
    units="ms" expires_after="2027-01-03">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent on a Picture in Picture window for automatic picture in
    picture reason &quot;{AutomaticReason}&quot;. The timer starts counting
    every time the AutoPictureInPictureTabHelper calls
    `EnterAutoPictureInPicture`; the time elapsed is recorded when the Picture
    in Picture window is closed. This metric is recorded regardless of the
    Picture in Picture window type (document vs video), and of the reason for
    closing the window (UI interaction, returning back to opener tab, etc.).

    Similar to
    Media.AutoPictureInPicture.EnterPictureInPicture.AutomaticReason.{AutomaticReason}.TotalTime,
    but with a maximum of 10 hours and a bucket size of 100.

    The AutomaticReasonV2 histograms add the BrowserInitiated bucket.
  </summary>
  <token key="AutomaticReason">
    <variant name="BrowserInitiated"/>
    <variant name="MediaPlayback"/>
    <variant name="VideoConferencing"/>
  </token>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.HappinessTrackingSurvey.TimeFromWindowOpenToPromptResult"
    units="ms" expires_after="2026-12-30">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the elapsed time from when an AutoPictureInPicture window opens to
    when the permission prompt result is recorded. Recorded once per PiP session
    when SetPromptResult is invoked.
  </summary>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.HappinessTrackingSurvey.TimeFromWindowOpenToSurveyLaunch"
    units="ms" expires_after="2026-12-30">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the elapsed time from when an AutoPictureInPicture window opens to
    when a Happiness Tracking Survey launch is initiated. Recorded inside the
    success callback when the survey is launched.
  </summary>
</histogram>

<histogram
    name="Media.AutoPictureInPicture.HappinessTrackingSurvey.TriggerResult"
    enum="MediaAutoPictureInPictureHappinessTrackingSurveyTriggerResult"
    expires_after="2026-12-30">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records whether an AutoPictureInPicture Happiness Tracking Survey launch was
    initiated or the reason why it was dropped. Recorded every time an
    AutoPictureInPicture window closes and survey eligibility is evaluated.
  </summary>
</histogram>

<histogram name="Media.AutoPictureInPicture.PromptResultV2"
    enum="MediaAutoPictureInPicturePromptResult" expires_after="2026-12-27">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the user either selects an option from the Automatic
    picture-in-picture permission prompt, or when the user manually closes the
    picture-in-picture window without responding to the prompt, or when we
    decide to not show the prompt at all. When the prompt is shown, this records
    their selection (or &quot;Ignored&quot; if they did not select an option).
    When the prompt is not shown, records why it was not shown.
  </summary>
</histogram>

<histogram name="Media.AutoPictureInPicture.SafeBrowsingCheckResult"
    enum="AutoPictureInPictureSafeBrowsingCheckResult"
    expires_after="2027-02-07">
  <owner>thefrog@chromium.org</owner>
  <owner>chrome-counter-abuse-alerts@google.com</owner>
  <summary>
    Records the result of the Safe Browsing blocklist check for Auto
    Picture-in-Picture URL safety. Logged when the check completes or times out.
  </summary>
</histogram>

<histogram name="Media.Autoplay.EnterprisePolicyOverride" enum="Boolean"
    expires_after="2027-03-01">
  <owner>philyan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records whether an enterprise policy override allowed media autoplay.
    Recorded when media begins playing in a WebContents, based on the cached
    policy decision.
  </summary>
</histogram>

<histogram name="Media.Autoplay.PolicyStatus" enum="AutoplayPolicyStatus"
    expires_after="2027-03-01">
  <owner>philyan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the policy status that governed autoplay. Recorded when media begins
    playing in a WebContents, based on the cached policy decision.
  </summary>
</histogram>

<histogram name="Media.BreakoutBox.Usage" enum="BreakoutBoxUsage"
    expires_after="2027-01-17">
  <owner>guidou@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.Capabilities.TimedOut.{QueryType}"
    enum="BooleanTimedOut" expires_after="2027-08-24">
  <owner>kron@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records whether an asynchronous MediaCapabilities {QueryType} query timed
    out (true) or completed and resolved before timing out (false). Recorded
    just before the query promise is resolved, either upon normal completion
    with capabilities or upon timing out with fallback capabilities.
  </summary>
  <token key="QueryType">
    <variant name="Decoding"
        summary="non-WebRTC decoding (file or media-source)"/>
    <variant name="WebrtcDecoding" summary="WebRTC decoding"/>
    <variant name="WebrtcEncoding" summary="WebRTC encoding"/>
  </token>
</histogram>

<histogram name="Media.CodedSizeGuessing" enum="CodedSizeGuessStatus"
    expires_after="2026-12-23">
  <owner>vasilyt@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records if the guessed coded size and/or
    MediaFormat.KEY_WIDTH/MediaFormat.KEY_HEIGHT were correct. Recorded once per
    resolution change (including the first frame).
  </summary>
</histogram>

<histogram name="Media.ContentAudioDecoder.CreateReaderSuccess"
    enum="BooleanSuccess" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records whether creating an AudioFileReader for processing WebAudio was
    successful.
  </summary>
</histogram>

<histogram name="Media.ContentAudioDecoder.DecodeTimePerFrame" units="ms"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the average amount of time per frame required to decode an audio
    file provided to the WebAudio API.
  </summary>
</histogram>

<histogram name="Media.ContentAudioDecoder.Duration" units="ms"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the file duration calculated during decoding an audio file provided
    to the WebAudio API.
  </summary>
</histogram>

<histogram name="Media.Controls.CTR{MediaControlsElements}"
    enum="MediaControlsCTREvent" expires_after="2025-01-05">
  <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. {MediaControlsElements}
  </summary>
  <token key="MediaControlsElements">
    <variant name=""/>
    <variant name=".CastButton" summary="Cast button"/>
    <variant name=".CastOverflowButton" summary="Cast overflow button"/>
    <variant name=".CastOverlayButton" summary="Cast overlay button"/>
    <variant name=".ClosedCaptionButton" summary="Closed caption button"/>
    <variant name=".ClosedCaptionOverflowButton"
        summary="Closed caption overflow button"/>
    <variant name=".DisplayCutoutFullscreenButton"
        summary="Display cutout fullscreen button"/>
    <variant name=".DownloadButton" summary="Download button"/>
    <variant name=".DownloadOverflowButton" summary="Download overflow button"/>
    <variant name=".FullscreenButton" summary="Fullscreen button"/>
    <variant name=".FullscreenOverflowButton"
        summary="Fullscreen overflow button"/>
    <variant name=".MuteButton" summary="Mute button"/>
    <variant name=".MuteOverflowButton" summary="Mute overflow button"/>
    <variant name=".OverflowButton" summary="Overflow button"/>
    <variant name=".PictureInPictureButton"
        summary="Picture-in-Picture button"/>
    <variant name=".PictureInPictureOverflowButton"
        summary="Picture-in-Picture overflow button"/>
    <variant name=".PlaybackSpeedButton" summary="Playback speed button"/>
    <variant name=".PlaybackSpeedOverflowButton"
        summary="Playback speed overlay button"/>
    <variant name=".PlayOverlayButton" summary="Play overlay button"/>
    <variant name=".PlayPauseButton" summary="Play/pause button"/>
    <variant name=".PlayPauseOverflowButton"
        summary="Play/pause overflow button"/>
    <variant name=".TimelineSlider" summary="Timeline slider"/>
    <variant name=".VolumeSlider" summary="Volume slider"/>
  </token>
</histogram>

<histogram name="Media.CrosGlobalMediaControls.PinAction" enum="BooleanPinned"
    expires_after="2027-03-31">
  <owner>yrw@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Record each time user pins/unpins CrOS global media controls. Warning: this
    histogram was expired from 2022-04-24 to 2024-01-04; data may be missing.
  </summary>
</histogram>

<histogram name="Media.CrosGlobalMediaControls.RepeatUsageInQuickSetting"
    enum="BooleanIsRepeat" expires_after="2027-03-31">
  <owner>yrw@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. Warning: this histogram was expired from 2022-05-01
    to 2024-01-04; data may be missing.
  </summary>
</histogram>

<histogram name="Media.CrosGlobalMediaControls.RepeatUsageOnShelf"
    enum="BooleanIsRepeat" expires_after="2027-03-31">
  <owner>yrw@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. Warning: this histogram was expired from 2022-04-24 to
    2024-01-04; data may be missing.
  </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="2026-07-26">
  <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.DocumentPictureInPicture.RequestedInitialHeight"
    units="px" expires_after="2026-12-16">
  <owner>steimel@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the height that the website has requested for a document
    picture-in-picture window. Recorded when calculating the initial bounds of a
    newly-opened document picture-in-picture window.
  </summary>
</histogram>

<histogram name="Media.DocumentPictureInPicture.RequestedInitialWidth"
    units="px" expires_after="2026-02-01">
  <owner>steimel@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the width that the website has requested for a document
    picture-in-picture window. Recorded when calculating the initial bounds of a
    newly-opened document picture-in-picture window. If the website requests a
    size larger than the area of the screen, it will be recorded as 100%. If a
    website does not request a size or requests a size of zero, it is recorded
    as 1%.
  </summary>
</histogram>

<histogram name="Media.DocumentPictureInPicture.RequestedLargeInitialSize"
    enum="BooleanOccurred" expires_after="2026-03-19">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when a website opens a document picture-in-picture window. Records
    `Occurred` if the website requested a window size larger than the maximum
    allowed window size, otherwise records `Did not occur`.
  </summary>
</histogram>

<histogram name="Media.DocumentPictureInPicture.RequestedLargeResize"
    enum="BooleanOccurred" expires_after="2026-11-29">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when a website resizes a document picture-in-picture window via the
    `resizeTo()` or `resizeBy()` APIs. Records `Occurred` if the website
    requested a window size larger than the maximum allowed window size,
    otherwise records `Did not occur`.
  </summary>
</histogram>

<histogram name="Media.DocumentPictureInPicture.RequestedSizeToScreenRatio"
    units="%" expires_after="2026-12-06">
  <owner>steimel@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the ratio of the total screen area that the website has requested
    for the picture-in-picture window, specifically the requested width times
    the requested height as a ratio of the screen's width times height. Recorded
    when calculating the initial bounds of a newly-opened document
    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="2027-02-07">
  <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.ElementCapture.ProduceTarget.Function.Result"
    enum="ProduceTargetFunctionResult" expires_after="2024-08-29">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Tracks the result of calls to RestrictionTarget.fromElement(). 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.ElementCapture.ProduceTarget.Promise.Result"
    enum="ProduceTargetPromiseResult" expires_after="2024-08-29">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    When RestrictionTarget.fromElement() is called for the first time on a given
    Element, a new Promise is produced. This histogram tracks the result of this
    Promise - whether it was resolved or rejected.
  </summary>
</histogram>

<histogram name="Media.ElementCapture.RestrictTo.Latency" units="ms"
    expires_after="2024-09-20">
  <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.restrictTo() 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.ElementCapture.RestrictTo.Result"
    enum="ApplySubCaptureTargetResult" expires_after="2027-03-25">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Tracks the result of calls to BrowserCaptureMediaStreamTrack.restrictTo().
    Recorded when resolving the promise produced by restrictTo().

    Warning: this histogram was expired from 2024-09-20 to 2025-03-25; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.EME.CdmFileIO.FileSizeKBOnError" units="KB"
    expires_after="2026-12-09">
  <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="2026-12-09">
  <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="2026-12-09">
  <owner>sangbaekpark@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.WriteFile.DataSizeKB" units="KB"
    expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Size in KB of a file written by the CDM through CDM FileIO. This is recorded
    once per write through the CDM.
  </summary>
</histogram>

<histogram name="Media.EME.CdmFileIO.{FileOperation}{IncognitoOrNormal}"
    enum="BooleanSuccess" expires_after="2026-12-09">
  <owner>sangbaekpark@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="2026-12-09">
  <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="2027-02-07">
  <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="2027-02-07">
  <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="2026-12-09">
  <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="2027-02-07">
  <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="2027-02-07">
  <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.CdmProcessDebuggerAttached" enum="Boolean"
    expires_after="2027-02-07">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Counts every time a debugger is attached to a CDM utility process.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabase.IncompatibleDatabaseDetected"
    enum="Boolean" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records when the CdmStorageDatabase for a profile is incompatible.
    This UMA is recorded on every OpenDatabase call that detects the database
    with a version number of one, which means that it is operating under a
    schema that does not include file_size and last_modified.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabase.WriteFileForBigData"
    enum="Boolean" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records when the data being written to the CdmStorageDatabase
    exceeds 15 KB. This UMA is recorded on every write over 15KB that succeeds.
  </summary>
</histogram>

<histogram name="Media.EME.CdmStorageDatabaseSQLiteError"
    enum="SqliteLoggedResultCode" expires_after="2026-12-09">
  <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.{CdmDatabaseOperation}"
    enum="SqliteLoggedResultCode" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records SQLite specific errors that occur when executing the
    operation {CdmDatabaseOperation}. This UMA is recorded on every error for
    this operation.
  </summary>
  <token key="CdmDatabaseOperation">
    <variant name="AlterDatabaseForFileSize"/>
    <variant name="AlterDatabaseForLastModified"/>
    <variant name="ClearDatabase"/>
    <variant name="DeleteFile"/>
    <variant name="DeleteForStorageKey"/>
    <variant name="DeleteForTimeFrame"/>
    <variant name="DeleteIfEmptyDatabase"/>
    <variant name="GetSizeForFile"/>
    <variant name="GetSizeForStorageKey"/>
    <variant name="GetSizeForTimeFrame"/>
    <variant name="OpenDatabase"/>
    <variant name="QueryPageCount"/>
    <variant name="QueryPageSize"/>
    <variant name="ReadFile"/>
    <variant name="WriteFile"/>
  </token>
</histogram>

<histogram
    name="Media.EME.CdmStorageDatabaseSQLiteError.{CdmDatabaseOperation}.{SqliteError}.Errno"
    units="errno" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records the errno that occur when executing the operation
    {CdmDatabaseOperation} and getting a specific {SqliteError}. This UMA is
    recorded every time this operation errors with the specific {SqliteError}.
  </summary>
  <token key="CdmDatabaseOperation">
    <variant name="AlterDatabaseForFileSize"/>
    <variant name="AlterDatabaseForLastModified"/>
    <variant name="ClearDatabase"/>
    <variant name="DeleteFile"/>
    <variant name="DeleteForStorageKey"/>
    <variant name="DeleteForTimeFrame"/>
    <variant name="DeleteIfEmptyDatabase"/>
    <variant name="GetSizeForFile"/>
    <variant name="GetSizeForStorageKey"/>
    <variant name="GetSizeForTimeFrame"/>
    <variant name="OpenDatabase"/>
    <variant name="ReadFile"/>
    <variant name="WriteFile"/>
  </token>
  <token key="SqliteError">
    <variant name="Busy"/>
    <variant name="CantOpen"/>
    <variant name="FullDisk"/>
    <variant name="Generic"/>
    <variant name="IoTruncate"/>
  </token>
</histogram>

<histogram
    name="Media.EME.CdmStorageManager.CurrentDatabaseUsageKB.{ProfileType}"
    units="KB" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA records the current CdmStorageDatabase size in KB. This UMA is
    recorded only once, on the first read, to retrieve usage levels of the
    CdmStorageDatabase.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DatabaseOpenError"
    enum="CdmStorageOpenError" expires_after="2026-12-09">
  <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.{ProfileType}"
    enum="CdmStorageOpenError" expires_after="2026-12-09">
  <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 {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram name="Media.EME.CdmStorageManager.DeleteFileError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <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 {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram
    name="Media.EME.CdmStorageManager.DeleteForStorageKeyError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <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 {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram
    name="Media.EME.CdmStorageManager.DeleteForTimeFrameError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the DeleteForTimeFrame function.
    Recorded after every call of DeleteForTimeFrame on {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram name="Media.EME.CdmStorageManager.GetSizeForFileError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the GetSizeForFile function. Recorded
    after every call of GetSizeForFile on {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram
    name="Media.EME.CdmStorageManager.GetSizeForStorageKeyError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the GetSizeForStorageKey function.
    Recorded after every call of GetSizeForStorageKey on {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram
    name="Media.EME.CdmStorageManager.GetSizeForTimeFrameError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the GetSizeForTimeFrame function.
    Recorded after every call of GetSizeForTimeFrame on {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram
    name="Media.EME.CdmStorageManager.kDeleteForFilterError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This UMA logs overall error rates from the DeleteForFilter function.
    Recorded after every call of DeleteForFilter on {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram name="Media.EME.CdmStorageManager.ReadFileError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <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 {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram name="Media.EME.CdmStorageManager.WriteFileError.{ProfileType}"
    enum="BooleanError" expires_after="2026-12-09">
  <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 {ProfileType} profile.
  </summary>
  <token key="ProfileType">
    <variant name="Incognito"/>
    <variant name="NonIncognito"/>
  </token>
</histogram>

<histogram name="Media.EME.ContentProtectionWindow.CreateStatus"
    enum="ContentProtectionWindowStatus" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Outcome of attempting to create a browser-owned content-protection HWND
    (used by Media Foundation hardware DRM to pick the correct GPU adapter on
    multi-GPU systems).
  </summary>
</histogram>

<histogram name="Media.EME.CrosCdmType" enum="CrosCdmType"
    expires_after="2026-09-01">
  <owner>hiroh@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. Warning: this histogram
    was expired from 2024-05-19 to 2025-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Media.EME.CrosPlatformCdm.SystemCode" enum="CdmSystemCode"
    expires_after="2026-09-01">
  <owner>hiroh@chromium.org</owner>
  <owner>cros-gfx-video@google.com</owner>
  <summary>
    System code in promise rejection for ChromeOS platform CDM. Warning: this
    histogram was expired from 2024-01-05 to 2025-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Media.EME.DecoderBypassBlockCount" units="perFrame*100"
    expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Ratio of the number of decorder bypass blocks seen / total frames displayed
    * 100. Recorded for each video that could contain decoder bypass blocks.
  </summary>
</histogram>

<histogram name="Media.EME.EncryptedEvent" enum="BooleanEncryptedEvent"
    expires_after="2026-12-09">
  <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="2027-02-07">
  <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="2027-02-07">
  <owner>sangbaekpark@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="2027-02-07">
  <owner>sangbaekpark@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.HardwareSecure.AllowedForSite" enum="BooleanEnabled"
    expires_after="2026-12-09">
  <owner>feras@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether Media Foundation based CDM is enabled or disabled based on previous
    disabled timestamps in a &quot;User Profile&quot; pref. This is reported
    once per browsing session when user requests hardware secure playback if
    Media Foundation based CDM is enabled and available.
  </summary>
</histogram>

<histogram name="Media.EME.IsIncognito" enum="BooleanIncognito"
    expires_after="2026-12-09">
  <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="2027-02-07">
  <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.FirstApiLevel" enum="AndroidApiLevel"
    expires_after="2027-02-07">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The Android Api level the device was released with, retrieved by obtaining
    |ro.product.first_api_level| from the OS. We record this once at time of
    checking the FirstApiLevel during the pre-provisioning flow.
  </summary>
</histogram>

<histogram name="Media.EME.MediaDrm.GetOriginIdResult" enum="GetOriginIdResult"
    expires_after="2027-02-07">
  <owner>sangbaekpark@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="2027-02-07">
  <owner>sangbaekpark@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="2027-02-07">
  <owner>sangbaekpark@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.MediaDrm.Provisioning"
    enum="MediaDrmProvisioningResult" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Result of trying to provision an origin using MediaDrm. Called every time
    provisioning is attempted, once per origin.
  </summary>
</histogram>

<histogram name="Media.EME.MediaDrm.ProvisioningNetworkRetry"
    enum="MediaDrmProvisioningNetworkRetryResult" expires_after="2027-06-03">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Result of a network connection change event triggering a retry attempt for
    background preprovisioning of MediaDrm origin IDs. This records whether the
    event was ignored due to exponential backoff or if a retry was actually
    attempted.
  </summary>
</histogram>

<histogram name="Media.EME.MediaDrmBridge.KeySystemSupport"
    enum="BooleanSupported" expires_after="2027-02-07">
  <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="2026-12-09">
  <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="2027-02-07">
  <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="2027-02-07">
  <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="2027-02-07">
  <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.{KeySystem}.HardwareSecure.FirstInitialize"
    enum="Hresult" expires_after="2027-02-07">
  <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 MediaFoundationService process when using {KeySystem} in hardware
    secure mode. Reported on both successes and failures.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram
    name="Media.EME.MediaFoundationCdm.{KeySystem}.HardwareSecure.Initialize"
    enum="Hresult" expires_after="2027-02-07">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULT of MediaFoundationCdm initialization when using {KeySystem} in
    hardware secure mode. Only reported on failures.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram
    name="Media.EME.MediaFoundationCdm.{KeySystem}.HardwareSecure.SetContentProtectionWindow"
    enum="Hresult" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULT of setting the content protection window for GPU adapter selection
    when using {KeySystem} in hardware secure mode. Reported on both successes
    and failures.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

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

<histogram name="Media.EME.MediaFoundationService.Crash2"
    enum="BooleanAfterPowerOrDisplayChange" expires_after="2026-12-09">
  <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.DolbyVisionSupport.WithHdrCheck"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether Dolby Vision codec with HDR check is supported or not. When multiple
    displays are connected to the device, TRUE if the primary display (internal)
    is HDR/HDR. Reported once per browser session lifetime.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.DolbyVisionSupport.WithoutHdrCheck"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether Dolby Vision codec without HDR check is supported or not. Reported
    once per browser session lifetime.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.ErrorAfterPowerOrDisplayChange2"
    enum="Hresult" expires_after="2027-02-07">
  <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="2027-02-07">
  <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="2027-02-07">
  <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.HardwareContextReset.ActiveGpuDisplayInfo"
    enum="ActiveGpuDisplayInfo" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active GPU's display information whether likely built-in or external when a
    HardwareContextReset event happened in the MediaFoundationService process.
    Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.HardwareContextReset.ActiveGpuInfo"
    enum="ActiveGpuInfo" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active and non-active GPU vendor information when a HardwareContextReset
    event happened in the MediaFoundationService process. Reported whenever such
    an event happens.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.HardwareContextReset.ActiveGpuVendorId"
    enum="GpuVendorId" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active GPU vendor ID when a HardwareContextReset event happened in the
    MediaFoundationService process. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.HardwareContextReset.DisplayCount"
    enum="GpuOrDisplayCount" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of displays when a HardwareContextReset event happened in the
    MediaFoundationService process. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.HardwareContextReset.DoesGpuMatchWithDisplayOnMultiGpu"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not the active GPU matches with the display GPU on multi-GPU
    devices when a HardwareContextReset event happened in the
    MediaFoundationService process. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.HardwareContextReset.GpuCount"
    enum="GpuOrDisplayCount" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of GPUs when a HardwareContextReset event happened in the
    MediaFoundationService process. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.HardwareContextReset.MultiGpuNvidiaActiveWithExternalDisplay"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not a multi-GPU device has NVIDIA active GPU associated with an
    external displays when a HardwareContextReset event happened in the
    MediaFoundationService process. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.HardwareContextReset.MultiGpuWithExternalDisplay"
    enum="Boolean" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not a multi-GPU device has an active GPU associated with an
    external displays when a HardwareContextReset event happened in the
    MediaFoundationService process. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.HardwareContextReset.NonActiveGpuVendorId"
    enum="GpuVendorId" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Non-active GPU vendor ID when a HardwareContextReset event happened in the
    MediaFoundationService process. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram name="Media.EME.MediaFoundationService.IsKeySystemSupported"
    units="ms" expires_after="2027-02-07">
  <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.{KeySystem}.HardwareSecure.GetCdmCapability"
    units="ms" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The time spent to get CdmCapability for {KeySystem}. The value will be
    reported once per CDM instance for hw security in MediaFoundationService.
    This value will only be reported for successful retrievals of the CDM
    Capability.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram
    name="Media.EME.MediaFoundationService.{KeySystem}.HardwareSecure.IsTypeSupportedEx"
    units="ms" expires_after="2027-02-07">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time for IMFExtendedDRMTypeSupport::IsTypeSupportedEx() to finish in
    MediaFoundationService when using {KeySystem} in hardware secure mode, which
    are called by MediaFoundationService.IsKeySystemSupported() (called once per
    CDM per browser session lifetime). IsKeySystemSupported() calls
    IsTypeSupportedEx() multiple times, for different audio/video codecs and
    encryption schemes.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram name="Media.EME.MojoCdm.ConnectionError"
    enum="BooleanConnectionError" expires_after="2027-02-07">
  <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="2027-02-07">
  <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="2026-09-01">
  <owner>hiroh@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.
    Warning: this histogram was expired from 2022-01-05 to 2025-09-01; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.EME.RequestMediaKeySystemAccess.{KeySystem}"
    enum="RequestMediaKeySystemAccessStatus" expires_after="2027-02-07">
  <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="2026-12-09">
  <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="2027-02-07">
  <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="2027-02-07">
  <owner>sangbaekpark@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.LibraryCdmAvailable"
    enum="BooleanAvailable" expires_after="2026-12-09">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether the CDM is available for Widevine 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>
</histogram>

<histogram name="Media.EME.Widevine.SoftwareSecure.SystemCode"
    enum="CdmSystemCode" expires_after="2026-12-09">
  <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="2026-12-09">
  <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}.CdmCapabilityQueryStatus.CreateDummyMediaFoundationCdmHresult"
    enum="Hresult" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULT code if CreateDummyMediaFoundationCdm call fails when querying
    hardware secure CDM capability.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram
    name="Media.EME.{KeySystem}.CdmCapabilityQueryStatus.MediaFoundationGetCdmFactoryHresult"
    enum="Hresult" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    HRESULT code if MediaFoundationCdmModule::GetCdmFactory call fails when
    querying {KeySystem} CDM capability.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.CreateCdm" enum="BooleanSuccess"
    expires_after="2027-02-07">
  <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}.CreateCdmStatus" enum="CreateCdmStatus"
    expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The status when creating a CDM instance 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="2027-02-07">
  <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="2027-02-07">
  <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="2027-02-07">
  <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}.HardwareSecure.CdmCapabilityQueryStatus"
    enum="CdmCapabilityQueryStatus" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The status of the CDM capability query. This can be used to inspect the
    reason when no capability reported. Reported at most once per browser
    session per key system when EME query is triggered by a website.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.HardwareSecure.CdmInfoStatus"
    enum="CdmInfoStatus" expires_after="2027-02-07">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The CdmInfo::Status of {KeySystem} hardware secure CDM capability. Reported
    at most once per browser session when EME query is triggered by a website.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.HardwareSecure.Support"
    enum="BooleanSupported" expires_after="2027-02-07">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When hardware secure decryption is enabled, whether {KeySystem} 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 {KeySystem} hardware secure CDM was registered.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.HardwareSecure.Support.{VideoCodec}"
    enum="BooleanSupported" expires_after="2027-02-07">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    When hardware secure decryption is enabled and supported by {KeySystem},
    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 {KeySystem} hardware secure CDM was registered.
  </summary>
  <token key="KeySystem" variants="KeySystemForHardwareSecureOnly"/>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.InitialKeyStatusMix"
    enum="CdmKeyStatusMix" expires_after="2027-02-07">
  <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="2027-02-07">
  <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}.LastKeyStatusMix" enum="CdmKeyStatusMix"
    expires_after="2026-12-09">
  <owner>sangbaekpark@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 last key statuses update when the
    EME CDM session gest closed.
  </summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.TimeTo{ResolveOrReject}.{EmeApi}"
    units="ms" expires_after="2027-02-07">
  <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}.WaitingForKey" enum="Boolean"
    expires_after="2027-02-07">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Reports whether a playback with a CDM attached has been blocked waiting for
    the CDM to be set or waiting for decryption key. Reported once per playback
    when a CDM attached.
  </summary>
  <token key="KeySystem" variants="KeySystemWithRobustness"/>
</histogram>

<histogram name="Media.EME.{KeySystem}.{EmeApi}" enum="CdmPromiseResult"
    expires_after="2027-02-07">
  <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="2027-02-07">
  <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.FallbackToHighLatencyAudioPath2"
    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. The
    fallback might be from either low latency offload path, or from low latency
    non-offload path.
  </summary>
</histogram>

<histogram name="Media.FrameInfo.GuessedInitialCodedSizeSuccess"
    enum="BooleanSuccess" expires_after="2027-02-07">
  <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-12-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.FullscreenVideoPictureInPicture.Android.Duration"
    units="ms" expires_after="2027-03-15">
  <owner>philyan@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The duration of a fullscreen video Picture-in-Picture session on Android.
    Recorded when the PiP session is exited (e.g., when Chrome switches back to
    non-PiP mode or when the PiP window is directly closed).
  </summary>
</histogram>

<histogram name="Media.FullscreenVideoPictureInPicture.Android.Entered"
    enum="FullscreenVideoPictureInPictureEntered" expires_after="2027-03-01">
  <owner>philyan@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when Chrome attempts to enter Picture-in-Picture mode for a
    fullscreen video on Android.

    Logs `Entered` if PiP is successfully set up. Logs `Failed - No WebContents`
    if the tab is closing. Logs `Failed - No ActivityTab` if the activity has no
    active tab.
  </summary>
</histogram>

<histogram name="Media.FullscreenVideoPictureInPicture.Android.ExitReason"
    enum="FullscreenVideoPictureInPictureExitReason" expires_after="2027-03-01">
  <owner>philyan@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The reason why a fullscreen video Picture-in-Picture session ended on
    Android. Recorded when the PiP session is exited.
  </summary>
</histogram>

<histogram
    name="Media.GetDisplayMedia.BasicFlow.Mac.GetAppAudioCaptureIdResult"
    enum="GetAppAudioCaptureIdMacResult" expires_after="2027-05-06">
  <owner>brandstrom@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Records the result of trying to get the audio capture ID of an application
    whose window was selected in the getDisplayMedia() media picker on macOS.
    This is recorded once for each call to
    GetApplicationAudioCaptureIdForProcess().
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.BasicFlow.Win.GetApplicationIdResult"
    enum="GetAppMainProcessIdWinResult" expires_after="2027-05-11">
  <owner>kron@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>gabrielbrito@microsoft.com</owner>
  <summary>
    Records the result of trying to get the application ID of an application
    whose window was selected in the getDisplayMedia() media picker on Windows.
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.Constraints.AudioSelection"
    enum="GetDisplayMediaBooleanConstraint" expires_after="2027-07-16">
  <owner>agpalak@chromium.org</owner>
  <owner>tovep@chromium.org</owner>
  <owner>rtc-meet-in-chrome@google.com</owner>
  <summary>
    Records whether getDisplayMedia was called with the audioSelection
    constraint.
  </summary>
</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.RestrictOwnAudio"
    enum="GetDisplayMediaBooleanConstraint" expires_after="2027-05-20">
  <owner>brandstrom@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Records whether getDisplayMedia was called with the RestrictOwnAudio
    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="2027-01-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.Constraints.WindowAudio"
    enum="GetDisplayMediaSystemWindowOrExcludeConstraint"
    expires_after="2027-01-03">
  <owner>brandstrom@chromium.org</owner>
  <owner>kron@chromium.org</owner>
  <owner>webrtc-audio-uma@google.com</owner>
  <summary>
    Records whether getDisplayMedia was called with the windowAudio constraint.
  </summary>
</histogram>

<histogram name="Media.GetDisplayMedia.RequiresUserActivationResult"
    enum="GetDisplayMediaTransientActivation" expires_after="2025-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="2025-08-24">
  <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="2027-08-01">
  <owner>jophba@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.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="2027-08-01">
  <owner>jophba@chromium.org</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.MediaItemUIUpdatedViewAction"
    enum="MediaItemUIUpdatedViewAction" expires_after="2027-03-31">
  <owner>yrw@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when a user action is performed on the updated media item UI view
    in the media dialog view on non-CrOS desktop platforms.
  </summary>
</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="2027-03-31">
  <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). Note: This histogram was expired from
    2026-01-18 to 2026-08-04; data may be missing.
  </summary>
</histogram>

<histogram name="Media.GlobalMediaControls.UserActionFocus"
    enum="BooleanFocused" expires_after="2027-03-31">
  <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).
    Note: This histogram was expired from 2026-01-18 to 2026-08-04; data may be
    missing.
  </summary>
</histogram>

<histogram name="Media.GPU.MappableSIVideoFrameSupportZeroCopyImport"
    enum="SupportZeroCopyImportType" expires_after="2027-01-03">
  <owner>hitawala@chromium.org</owner>
  <owner>shared-image-team@google.com</owner>
  <summary>
    Records whether Zero Copy import of SharedImage backed by GpuMemoryBuffer
    handle into WebGPU is supported. Result is an enum for support which is
    recorded once per VideoFrame creation.
  </summary>
</histogram>

<histogram name="Media.GPU.OutputFormatHardwareGmb" enum="OutputFormat"
    expires_after="2027-01-24">
  <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
    MappableSharedImageVideoFramePool. Recorded once per VideoFrame creation.
  </summary>
</histogram>

<histogram name="Media.GPU.OutputFormatSoftwareGmb" enum="OutputFormat"
    expires_after="2027-01-24">
  <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
    MappableSharedImageVideoFramePool. Recorded once per VideoFrame creation.
  </summary>
</histogram>

<histogram name="Media.GpuArcVideoDecodeAccelerator.InitializeFailed"
    enum="VideoCodecProfile" expires_after="2026-09-01">
  <owner>andrescj@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Counts the unsuccessful calls to GpuArcVideoDecodeAccelerator::Initialize()
    per VideoCodecProfile. Warning: this histogram was expired from 2025-01-05
    to 2025-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Media.GpuArcVideoDecodeAccelerator.InitializeSucceeded"
    enum="VideoCodecProfile" expires_after="2026-09-01">
  <owner>andrescj@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Counts the successful calls to GpuArcVideoDecodeAccelerator::Initialize()
    per VideoCodecProfile. Warning: this histogram was expired from 2025-01-05
    to 2025-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Media.GpuArcVideoDecodeAccelerator.InstanceCount.All"
    units="instances" expires_after="2026-09-01">
  <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. Warning: this
    histogram was expired from 2024-06-22 to 2025-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Media.GpuArcVideoDecodeAccelerator.InstanceCount.Initialized"
    units="instances" expires_after="2026-09-01">
  <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; 2024-06-22 to
    2025-09-01; data may be missing.
  </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="2026-03-22">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records media key presses that are handled by the
    HardwareKeyMediaController.

    Warning: this histogram was expired from 2021-08-29 to 2023-10-24; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.HasAcceleratedVideoDecode.{CodecType}"
    enum="BooleanSupported" expires_after="2027-02-07">
  <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 name="Media.HLS.InitializationError" enum="HlsDemuxerStatus"
    expires_after="2027-01-17">
  <owner>tmathmeyer@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs any error which occurs during initialization of the hls demuxer.
  </summary>
</histogram>

<histogram name="Media.HLS.ParserError" units="sparse"
    expires_after="2027-01-17">
  <owner>tmathmeyer@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs any error which is caused by manifest parsing during either demuxer
    initialization or mid-playback.
  </summary>
</histogram>

<histogram name="Media.HLS.PlaybackError" enum="HlsDemuxerStatus"
    expires_after="2027-01-17">
  <owner>tmathmeyer@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Logs any error which occurs during playback but NOT during initialization of
    the hls demuxer.
  </summary>
</histogram>

<histogram name="Media.InitializeRendererTimeout" enum="CallbackTimeoutStatus"
    expires_after="2026-12-09">
  <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="2027-05-11">
  <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="2026-12-09">
  <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.LowLatencyAudioCaptureStartupSuccess"
    enum="AudioCaptureStartupResult" expires_after="2027-02-14">
  <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.MappableSharedImageVideoFramePool.UnsupportedFormat"
    enum="VideoPixelFormatUnion" expires_after="2026-05-24">
  <owner>magchen@chromium.org</owner>
  <owner>cros-gfx-video@google.com</owner>
  <summary>
    MappableSharedImageVideoFramePool is called with an unsupported VideoFrame
    pixel format. Emitted on VideoFrame arrival.
  </summary>
</histogram>

<histogram name="Media.MeanTimeBetweenRebuffers{MediaRebufferingCategories}"
    units="ms" expires_after="2027-01-31">
  <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.
    {MediaRebufferingCategories}
  </summary>
  <token key="MediaRebufferingCategories" variants="MediaRebufferingCategories">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Media.MediaCapture.UI.Android.Picker.PreShowFailure"
    enum="MediaCapturePickerPreShowFailureEnum" expires_after="2027-03-01">
  <owner>hscham@chromium.org</owner>
  <owner>lokeric@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the reason why the media capture picker failed to be shown. Recorded
    each time the picker fails to show.
  </summary>
</histogram>

<histogram name="Media.MediaCapture.UI.Android.Picker.Result"
    enum="MediaCapturePickerResult" expires_after="2027-03-01">
  <owner>hscham@chromium.org</owner>
  <owner>lokeric@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the result of a user's interaction with the media capture picker.
    Recorded each time the picker is closed.
  </summary>
</histogram>

<histogram name="Media.MediaCodecError.NegativeCodecExceptionErrorCode"
    units="CodecErrorCode" expires_after="2027-02-07">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Negative error code from a CodecException reported by MediaCodec. Reported
    whenever MediaCodec returns a CodecException, and the CodecException is
    unknown and a negative value.
  </summary>
</histogram>

<histogram name="Media.MediaCodecError.{VideoCodec}.{Secure}"
    enum="MediaCodecError" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Error reported by MediaCodec video streams using codec {VideoCodec} with
    {Secure}. Reported at most once per playback if an error occurs.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
  <token key="Secure">
    <variant name="HardwareSecure" summary="hardware secure decryption"/>
    <variant name="SoftwareSecure" summary="software secure decryption"/>
  </token>
</histogram>

<histogram
    name="Media.MediaDevices.EnumerateDevices.FirstStateOnContextDestroyed"
    enum="EnumerateDevicesFirstStateOnContextDestroyed"
    expires_after="2027-01-03">
  <owner>guidou@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <summary>
    Tracks the state of the first enumerateDevices call in relation to the first
    successful getUserMedia call. Recorded on execution context destruction only
    if there was at least one enumerateDevices call.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.EnumerateDevices.GetUserMediaInteraction"
    enum="EnumerateDevicesGetUserMediaInteraction" expires_after="2027-01-03">
  <owner>guidou@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <summary>
    Recorded when the first enumerateDevices call and/or the first successful
    getUserMedia call are resolved. The members of the histogram are not
    mutually exclusive.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.EnumerateDevices.Latency" units="ms"
    expires_after="2026-12-27">
  <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="2026-12-27">
  <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.FindExistingRequestedDevice.NameMatched"
    enum="Boolean" expires_after="2026-12-20">
  <owner>agpalak@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>rtc-meet-in-chrome@google.com</owner>
  <summary>
    Records whether the device name matched when searching for an existing
    opened device during the processing of getUserMedia request. The search is
    done so that a device is opened only once per render frame. Logged for every
    device that matches the requested ID and type. True means the names matched,
    False means they differed.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetAllScreensMedia.Result3"
    enum="UserMediaRequestResult" expires_after="2026-12-31">
  <owner>simonha@google.com</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    The results of all calls to the navigator.mediaDevices.GetAllScreensMedia()
    API, including successful promise resolutions, error codes, or kTimedOut, if
    the promise was still pending after 6 seconds. The suffix 3 was added at
    milestone 145, after distribution of UserMediaRequestResult was changed. The
    histogram was expired from 2023-05-01 to 2026-01-12.
  </summary>
</histogram>

<histogram
    name="Media.MediaDevices.GetDisplayMedia.Audio.PermissionDeniedBySystem"
    enum="Boolean" expires_after="2027-05-01">
  <owner>kron@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    Tracks the number of attempts to start an audio track from getDisplayMedia
    that results in PermissionDeniedBySystem. This is recorded in
    UserMediaProcessor::RequestInfo::OnTrackStarted when the result of the
    attempt to start the track is availble.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetDisplayMedia.Latency2" units="ms"
    expires_after="2026-10-08">
  <owner>toprice@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <owner>rtc-meet-in-chrome@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. The suffix 2 was added in milestone 143,
    after the kTimedOut interval was increased from 12s to 30s.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetDisplayMedia.Result3"
    enum="UserMediaRequestResult" expires_after="2027-02-14">
  <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 30 seconds. The suffix 3 was added at
    milestone 145, after distribution of UserMediaRequestResult was changed.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetUserMedia.CameraCaptureCapability"
    enum="CameraCaptureCapability" expires_after="2026-04-26">
  <owner>hbos@chromium.org</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    When getUserMedia() is called for video, the capture resolution capabilities
    of the devices (webcams) are logged, including if HD/FullHD devices support
    360p, 480p, neither or both.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetUserMedia.EchoCancellationMode"
    enum="EchoCancellationMode" expires_after="2027-01-03">
  <owner>henrika@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    When getUserMedia() is called for audio, the utilized echoCancellationMode
    is logged. The mode controls how much of the user system playout is removed
    from the microphone signal.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.GetUserMedia.Latency" units="ms"
    expires_after="2026-12-27">
  <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.Result3"
    enum="UserMediaRequestResult" expires_after="2027-01-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. The suffix 3 was added at
    milestone 145, after distribution of UserMediaRequestResult was changed.
  </summary>
</histogram>

<histogram name="Media.MediaDevices.SaltDatabaseErrors"
    enum="SqliteLoggedResultCode" expires_after="2027-01-17">
  <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="2027-01-03">
  <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="2026-10-23">
  <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.MediaFoundation.MediaEngineError.SubsequentError"
    enum="MediaEngineErrorType" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when any subsequent {MediaEngineErrorType} after the first error
    has occurred in MediaFoundationRenderer::MediaEngineNotifyImpl.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundation.MediaEngineError.SubsequentError.{MF_MEDIA_ENGINE_ERR}.Hresult"
    enum="Hresult" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Hresult corresponding to a subsequent {MF_MEDIA_ENGINE_ERR} after the first
    error has occurred in MediaFoundationRenderer::MediaEngineNotifyImpl.
    Recorded only when the first subsequent error happens.
  </summary>
  <token key="MF_MEDIA_ENGINE_ERR" variants="MF_MEDIA_ENGINE_ERR"/>
</histogram>

<histogram name="Media.MediaFoundation.MediaEngineError.SubsequentEvent"
    enum="MediaEngineEventType" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when any subsequent {MF_MEDIA_ENGINE_EVENT} after the first error
    has occurred in MediaFoundationRenderer::MediaEngineNotifyImpl.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundation.MediaEngineError.SubsequentEventOrErrorReported"
    enum="Boolean" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not any subsequent event or error occurs after the first error
    has occurred in MediaFoundationRenderer::MediaEngineNotifyImpl. Recorded
    only when the first subsequent event or error happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundation.MediaEngineError.{MF_MEDIA_ENGINE_ERR}.Hresult"
    enum="Hresult" expires_after="2027-02-07">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Hresult corresponding to a {MF_MEDIA_ENGINE_ERR}. Recorded when the
    MediaEngine hits an error from Event Notify.
  </summary>
  <token key="MF_MEDIA_ENGINE_ERR" variants="MF_MEDIA_ENGINE_ERR"/>
</histogram>

<histogram name="Media.MediaFoundation.MF_E_TOPO_CODEC_NOT_FOUND.{VideoCodec}"
    enum="AudioCodec" expires_after="2026-12-09">
  <owner>vpasupathy@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    This histogram is recorded when MediaEngine hits an error corresponding to
    the HRESULT MF_E_TOPO_CODEC_NOT_FOUND from Event Notify. This histogram
    records the VideoCodec as part of the name, and reports the AudioCodec, so
    we have both to look at the combination of codecs used when this HRESULT
    occurs.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram
    name="Media.MediaFoundationPackageDecoder.{MediaFoundationCodecPackage}"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not a {MediaFoundationCodecPackage} was found. Recorded once when
    the MediaFoundation Renderer is initialized.
  </summary>
  <token key="MediaFoundationCodecPackage"
      variants="MediaFoundationCodecPackage"/>
</histogram>

<histogram name="Media.MediaFoundationRenderer.CreateMediaEngineError"
    enum="Hresult" expires_after="2026-12-09">
  <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.D3D11CreateDeviceFailed"
    enum="Hresult" expires_after="2026-12-09">
  <owner>xhwang@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaFoundationRenderer fails to execute
    D3D11CreateDevice.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.ErrorReason"
    enum="MediaFoundationRendererErrorReason" expires_after="2027-02-07">
  <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="2026-12-09">
  <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="2027-02-07">
  <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="2027-02-07">
  <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.MultiGpu.ActiveGpuDisplayInfo"
    enum="ActiveGpuDisplayInfo" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active GPU's display information whether likely built-in or external when
    the MediaFoundationRenderer starts a playback. Reported only once such an
    event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.MultiGpu.ActiveGpuInfo"
    enum="ActiveGpuInfo" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active and non-active GPU vendor information when the
    MediaFoundationRenderer starts a playback. Reported only once such an event
    happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.MultiGpu.ActiveGpuVendorId"
    enum="GpuVendorId" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active GPU vendor ID when the MediaFoundationRenderer starts a playback.
    Reported only once such an event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.MultiGpu.DisplayCount"
    enum="GpuOrDisplayCount" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of displays when the MediaFoundationRenderer starts a playback.
    Reported only once such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.MultiGpu.DoesGpuMatchWithDisplayOnMultiGpu"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not the active GPU matches with the display GPU on multi-GPU
    devices when the MediaFoundationRenderer starts a playback. Reported only
    once such an event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.MultiGpu.GpuCount"
    enum="GpuOrDisplayCount" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of GPUs when the MediaFoundationRenderer starts a playback.
    Reported only once such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.MultiGpu.MultiGpuNvidiaActiveWithExternalDisplay"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not a multi-GPU device has NVIDIA active GPU associated with an
    external displays when the MediaFoundationRenderer starts a playback.
    Reported only once such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.MultiGpu.MultiGpuWithExternalDisplay"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not a multi-GPU device has an active GPU associated with an
    external displays when the MediaFoundationRenderer starts a playback.
    Reported only once such an event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.MultiGpu.NonActiveGpuVendorId"
    enum="GpuVendorId" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Non-active GPU vendor ID when the MediaFoundationRenderer starts a playback.
    Reported only once such an event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.PlaybackError" enum="Hresult"
    expires_after="2027-02-07">
  <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.MediaFoundationRenderer.PlaybackError.ActiveGpuDisplayInfo"
    enum="ActiveGpuDisplayInfo" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active GPU's display information whether likely built-in or external when
    the MediaFoundationRenderer hits a playback error. Reported whenever such an
    event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.PlaybackError.ActiveGpuInfo"
    enum="ActiveGpuInfo" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active and non-active GPU vendor information when the
    MediaFoundationRenderer hits a playback error. Reported whenever such an
    event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.PlaybackError.ActiveGpuVendorId"
    enum="GpuVendorId" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Active GPU vendor ID when the MediaFoundationRenderer hits a playback error.
    Reported whenever such an event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.PlaybackError.DisplayCount"
    enum="GpuOrDisplayCount" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of displays when the MediaFoundationRenderer hits a playback
    error. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.PlaybackError.DoesGpuMatchWithDisplayOnMultiGpu"
    enum="Boolean" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not the active GPU matches with the display GPU on multi-GPU
    devices when the MediaFoundationRenderer hits a playback error. Reported
    whenever such an event happens.
  </summary>
</histogram>

<histogram name="Media.MediaFoundationRenderer.PlaybackError.GpuCount"
    enum="GpuOrDisplayCount" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of GPUs when the MediaFoundationRenderer hits a playback error.
    Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.PlaybackError.MultiGpuNvidiaActiveWithExternalDisplay"
    enum="Boolean" expires_after="2027-01-03">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not a multi-GPU device has NVIDIA active GPU associated with an
    external displays when the MediaFoundationRenderer hits a playback error.
    Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.PlaybackError.MultiGpuWithExternalDisplay"
    enum="Boolean" expires_after="2026-11-01">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not a multi-GPU device has an active GPU associated with an
    external displays when the MediaFoundationRenderer hits a playback error.
    Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.PlaybackError.NonActiveGpuVendorId"
    enum="GpuVendorId" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Non-active GPU vendor ID when the MediaFoundationRenderer hits a playback
    error. Reported whenever such an event happens.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.RenderedVideoFrameDetectionResult"
    enum="MediaFoundationRendererRenderedVideoFrameDetectionResult"
    expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaFoundationRenderer detects one or more rendered video
    frame within the given time. Only reported once per playback.
  </summary>
</histogram>

<histogram
    name="Media.MediaFoundationRenderer.RenderedVideoFrameDetectionResult.TimeTo.{ResultReason}"
    units="ms" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time in milliseconds from when MediaFoundationRenderer reports the result
    whether one or more rendered video frame within the given time for
    {ResultReason}. Only reported once per playback.
  </summary>
  <token key="ResultReason" variants="RenderedVideoFrameDetectionResultReason"/>
</histogram>

<histogram name="Media.MediaFoundationRenderer.SetOutputRect.Hresult"
    enum="Hresult" expires_after="2026-12-09">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaFoundationRenderer hits an error when trying to set
    output rectangle.
  </summary>
</histogram>

<histogram name="Media.MediaHistory.DatabaseExists" enum="Boolean"
    expires_after="2027-04-06">
  <owner>evliu@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Whether or not the media history database exists. Called on the
    initialization of the profile.
  </summary>
</histogram>

<histogram name="Media.MediaPlaybackWhileNotVisible.InterruptionType"
    enum="MediaPlaybackInterruptionType" expires_after="2027-04-07">
  <owner>dalecurtis@chromium.org</owner>
  <owner>gabrielbrito@microsoft.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Tracks the reason for the HTMLMediaElement being interrupted when the frame
    is being controlled by the MediaPlaybackWhileNotVisible permission policy
    and the frame is not visible.
  </summary>
</histogram>

<histogram name="Media.MediaRecorder.Codec" enum="MediaRecorderVideoCodecImpl"
    expires_after="2026-11-22">
  <owner>clarissagarvey@chromium.org</owner>
  <owner>chromeos-gfx-video@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.Codec.{Query}.{Result}"
    enum="MediaRecorderVideoCodec" expires_after="2026-11-29">
  <owner>handellm@google.com</owner>
  <owner>guidou@google.com</owner>
  <summary>
    Codec queried through MediaRecorder{Query} where the result is {Result}.
    Logged when the call is made.
  </summary>
  <token key="Query">
    <variant name="EncodingInfo" summary="EncodingInfo"/>
    <variant name="IsTypeSupported" summary=".isTypeSupported"/>
    <variant name="MediaRecorderCtor" summary="ctor"/>
    <variant name="Test" summary="Test"/>
  </token>
  <token key="Result">
    <variant name="Supported" summary="supported"/>
    <variant name="Unsupported" summary="unsupported"/>
  </token>
</histogram>

<histogram name="Media.MediaRecorder.HasCorrectAV1CodecString"
    enum="BooleanCorrect" expires_after="2024-06-30">
  <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.TrackTransformationChangeCount"
    units="count" expires_after="2025-06-08">
  <owner>handellm@google.com</owner>
  <owner>guidou@chromium.org</owner>
  <summary>
    The number of transformation changes received on a recorded video track.
    Recorded when a MediaRecorder has stopped recording. 0 means there were no
    frames delivered to the recorder. 1 means the first frame did or did not
    have transformation information attached, and no subsequent changes in
    transformation beyond the first frame. N means there were N-1 changes in
    transformation after the initial received frame.
  </summary>
</histogram>

<histogram name="Media.MediaStreamManager.DesktopVideoDeviceUpdate4"
    enum="MediaStreamRequestResult" expires_after="2026-10-16">
  <owner>agpalak@chromium.org</owner>
  <owner>tovep@chromium.org</owner>
  <summary>
    Records media stream request responses for desktop-video capture
    media-device-update requests. This is a V4 metric replacing the V3 metric to
    include the new DEVICE_REMOVED outcome.
  </summary>
</histogram>

<histogram name="Media.MediaStreamManager.DisplayVideoDeviceUpdate4"
    enum="MediaStreamRequestResult" expires_after="2026-10-16">
  <owner>agpalak@chromium.org</owner>
  <owner>tovep@chromium.org</owner>
  <summary>
    Records media stream request responses for display-video capture
    media-device-update requests. This is a V4 metric replacing the V3 metric to
    include the new DEVICE_REMOVED outcome.
  </summary>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.ComputeOcclusion.ComputeOccludingArea.TotalDuration"
    units="microseconds" expires_after="2027-02-07">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total duration in microseconds taken by the MediaVideoVisibilityTracker to
    compute occluding area. The histogram is recorded every time an element
    occluding a target HTMLVideoElement is found, during the ComputeOcclusion
    operation.

    Note that clients without high-resolution clocks will report 0 for very
    short times.
  </summary>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.ComputeOcclusion.TotalDuration"
    units="ms" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total duration in milliseconds taken by the MediaVideoVisibilityTracker to
    compute occlusion. The histogram is recorded every time the
    MediaVideoVisibilityTracker needs to compute if a tracked HTMLVideoElement
    meets its specified visibility threshold.
  </summary>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.GetClientIdsSet.ItemsInSetCount.TotalCount"
    units="count" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total number of entries in the MediaVideoVisibilityTracker ClientIdsSet.
    Recorded every time the tracker requests the set.
  </summary>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.GetClientIdsSet.NotContentType.Percentage"
    units="%" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the percentage of the total ClientIdsSet entries that are ignored
    due to their DisplayItem::Type not being of &quot;Content&quot; type.

    This metric only accounts for non &quot;Content&quot; type entries that are
    present at the end of the DisplayItemList. The count stops at the first
    DisplayItem::Type that is of &quot;Content&quot; type, when traversing the
    DisplayItemList from tail to head.

    Recorded every time the tracker requests the set.
  </summary>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.GetClientIdsSet.NotContentTypeCount.TotalCount"
    units="count" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total number of entries not added to the MediaVideoVisibilityTracker
    ClientIdsSet, because their DisplayItem::Type is not of &quot;Content&quot;
    type.

    This metric only accounts for elements that are present at the end of the
    DisplayItemList. The count stops at the first DisplayItem::Type that is of
    &quot;Content&quot; type, when traversing the DisplayItemList from tail to
    head.

    Recorded every time the tracker requests the set.
  </summary>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.GetClientIdsSet.SetConstruction.TotalDuration"
    units="microseconds" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total duration, in microseconds, taken by the MediaVideoVisibilityTracker to
    construct a ClientIdsSet. Recorded every time the tracker requests the set.

    Note that clients without high-resolution clocks will report 0 for very
    short times.
  </summary>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.OccludingRectsCount.{BucketSizeIncreases}Histogram.TotalCount"
    units="rects" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total count of rects occluding a target HTMLVideoElement. The histogram is
    recorded after the MediaVideoVisibilityTracker computes whether the
    HTMLVideoElement meets the visibility threshold or not.

    Count is recorded using a histogram with {BucketSizeIncreases} bucket size
    increases.

    Note that this does not represent all elements that could be considered
    occluding, since MeetsVisibilityThreshold may return early depending on the
    size of the occluded area and the visibility threshold.
  </summary>
  <token key="BucketSizeIncreases">
    <variant name="Exponential"
        summary="Histogram with exponential bucket size increases, for
                 understanding the overall distribution"/>
    <variant name="Linear"
        summary="Histogram with linear bucket size increases, for fine
                 grained detail"/>
  </token>
</histogram>

<histogram name="Media.MediaVideoVisibilityTracker.UpdateTime.TotalDuration"
    units="ms" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total duration in milliseconds taken by the MediaVideoVisibilityTracker to
    update HTMLVideoElement s visibility. The histogram is recorded when the
    MediaVideoVisibilityTracker executes DidFinishLifecycleUpdate.
  </summary>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.{NodesCount}.{BucketSizeIncreases}Histogram.TotalCount"
    units="nodes" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total {NodesCount}, hit tested by ComputeOcclusion. The histogram is
    recorded after the MediaVideoVisibilityTracker computes whether the
    HTMLVideoElement meets the visibility threshold or not.

    Count is recorded using a histogram with {BucketSizeIncreases} bucket size
    increases.
  </summary>
  <token key="NodesCount">
    <variant name="HitTestedNodesContributingToOcclusionCount"
        summary="Nodes that contribute to occlusion"/>
    <variant name="HitTestedNodesCount" summary="All hit tested nodes"/>
    <variant name="IgnoredNodesNotOpaqueCount"
        summary="Nodes ignored due to not being opaque"/>
    <variant name="IgnoredNodesUserAgentShadowRootCount"
        summary="Nodes ignored due to being in the shadow root and of user
                 agent type"/>
  </token>
  <token key="BucketSizeIncreases">
    <variant name="Exponential"
        summary="Histogram with exponential bucket size increases, for
                 understanding the overall distribution"/>
    <variant name="Linear"
        summary="Histogram with linear bucket size increases, for fine
                 grained detail"/>
  </token>
</histogram>

<histogram
    name="Media.MediaVideoVisibilityTracker.{PercentageCategory}.Percentage"
    units="%" expires_after="2026-12-01">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the percentage of the total hit tested nodes that are
    {PercentageCategory}. The histogram is recorded after the
    MediaVideoVisibilityTracker computes whether the HTMLVideoElement meets the
    visibility threshold or not.
  </summary>
  <token key="PercentageCategory">
    <variant name="IgnoredNodesNotOpaque"
        summary="Nodes that are ignored due to not being opaque"/>
    <variant name="IgnoredNodesUserAgentShadowRoot"
        summary="Nodes that are ignored due to being in the shadow root and
                 of user agent type"/>
    <variant name="NodesContributingToOcclusion"
        summary="Nodes that contribute to occlusion"/>
  </token>
</histogram>

<histogram name="Media.MicrophoneMuted" enum="MicrophoneMuteResult"
    expires_after="2026-11-15">
  <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{BackendType}"
    enum="MidiSendReceiveUsage" expires_after="2026-12-01">
  <owner>mjwilson@chromium.org</owner>
  <owner>hongchan@chromium.org</owner>
  <owner>src/third_party/blink/renderer/modules/webaudio/OWNERS</owner>
  <summary>
    Reports whether any data was sent or received by {BackendType}. 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>
  <token key="BackendType">
    <variant name="" summary="any kind of MidiManagers"/>
    <variant name=".Usb" summary="a MidiManagerUsb"/>
  </token>
</histogram>

<histogram name="Media.Midi.SysExMessageSizeUpTo1MB" units="bytes"
    expires_after="2026-12-01">
  <owner>mjwilson@chromium.org</owner>
  <owner>hongchan@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="2026-12-01">
  <owner>mjwilson@chromium.org</owner>
  <owner>hongchan@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.MojoAudioDecoder.Initialized" enum="DecoderStatus"
    expires_after="2027-02-14">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the status of each call to MojoAudioDecoderService::Initialize().
  </summary>
</histogram>

<histogram name="Media.MojoAudioDecoder.LastDecodeStatus" enum="DecoderStatus"
    expires_after="2027-02-14">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the status of the last call to MojoAudioDecoderService::Decode()
    prior to destruction of the MojoAudioDecoderService.
  </summary>
</histogram>

<histogram name="Media.MojoStableVideoDecoder.Decode" units="ms"
    expires_after="2026-09-01">
  <owner>andrescj@chromium.org</owner>
  <owner>chromeos-gfx@chromium.org</owner>
  <summary>
    This histogram is analogous to Media.MojoVideoDecoder.Decode but for the
    MojoStableVideoDecoder. It's the delay between a DecoderBuffer (and encoded
    chunk) input and a decoded frame being produced by the remote
    StableVideoDecoder. Output once per successful decode. Warning: this
    histogram was expired from 2025-05-24 to 2025-09-01; data may be missing.
  </summary>
</histogram>

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

  <owner>hiroh@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-05-26">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@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 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.Network.TotalBytesReceived.SRC" units="bytes"
    expires_after="2026-12-27">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Reports the total bytes received over the network by a
    ResourceMultiBufferDataProvider instance. One is created each time a
    src=file playback needs to retrieve non-contiguous data over the network.
    Value is recorded at destruction time, so may be lost in the event of tab
    closure. Range is 1kb to 1gb.
  </summary>
</histogram>

<histogram name="Media.Notification.Cast.Count" units="count"
    expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.Count" units="count"
    expires_after="2027-03-31">
  <owner>yrw@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.DisplayPage"
    enum="MediaNotificationDisplayPage" expires_after="2027-03-31">
  <owner>yrw@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The page where the media notification is displayed to users. This is
    recorded when a media notification starts being displayed.
  </summary>
</histogram>

<histogram name="Media.Notification.Source" enum="MediaNotificationSource"
    expires_after="2027-03-31">
  <owner>yrw@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="2027-03-31">
  <owner>yrw@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The media session action that a user clicked on a media notification
    (including ones for Cast sessions).
  </summary>
</histogram>

<histogram name="Media.OutputStreamDuration" units="ms"
    expires_after="2026-10-11">
  <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.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 name="Media.PictureInPicture.AllowedVideoEncodedSize"
    units="encoded" expires_after="2027-06-18">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the visual size in DIPs of the video that was allowed to enter
    Picture-in-Picture after meeting the minimum size constraint.

    The logged value is a 32-bit integer encoding width and height, both in DIPs
    (Device Independent Pixels): - Upper 16 bits: Width in DIPs. - Lower 16
    bits: Height in DIPs.

    To decode the value: - width = sample &gt;&gt; 16 - height = sample &amp;
    0xFFFF

    Recorded when HTMLVideoElement::RequestEnterPictureInPicture() is called
    with a minimum size constraint and the video's visual size is larger than or
    equal to the requested minimum size.
  </summary>
</histogram>

<histogram name="Media.PictureInPicture.Android.Action"
    enum="PictureInPictureButtonAction" expires_after="2026-11-29">
  <owner>philyan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records which Picture-in-Picture button was clicked. This is recorded when
    the user clicks on a button in the Android Picture-in-Picture window.
  </summary>
</histogram>

<histogram name="Media.PictureInPicture.BlockedVideoEncodedSize"
    units="encoded" expires_after="2027-06-18">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the visual size in DIPs of the video that was blocked from entering
    Picture-in-Picture due to a minimum size constraint.

    The logged value is a 32-bit integer encoding width and height, both in DIPs
    (Device Independent Pixels): - Upper 16 bits: Width in DIPs. - Lower 16
    bits: Height in DIPs.

    To decode the value: - width = sample &gt;&gt; 16 - height = sample &amp;
    0xFFFF

    Recorded when HTMLVideoElement::RequestEnterPictureInPicture() is called
    with a minimum size constraint and the video's visual size is smaller than
    the requested minimum size.
  </summary>
</histogram>

<histogram name="Media.PictureInPicture.Disallowed"
    enum="PictureInPictureDisallowedType" expires_after="2025-08-31">
  <owner>steimel@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <summary>
    Recorded when a picture-in-picture window is closed due to a
    ScopedDisallowPictureInPicture object. Records whether the closed
    picture-in-picture window was just opened or already existed when the
    ScopedDisallowPictureInPicture was created.
  </summary>
</histogram>

<histogram name="Media.PictureInPicture.SizeConstraintResult"
    enum="PictureInPictureSizeConstraintResult" expires_after="2027-06-18">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records whether a Picture-in-Picture request, that carries a minimum size
    constraint, meets the size constraint (SizeConstraintMet) or is blocked
    because of it (SizeConstraintNotMet).

    Note that this metric only tells us information about the size constraint. A
    Picture-in-Picture request that meets the size constraint can still fail due
    to other unrelated constraints.

    Recorded when HTMLVideoElement::RequestEnterPictureInPicture() is called
    with a minimum size constraint.
  </summary>
</histogram>

<histogram name="Media.PictureInPicture.Tucked"
    enum="PictureInPictureTuckedType" expires_after="2026-04-22">
  <owner>steimel@chromium.org</owner>
  <owner>liberato@chromium.org</owner>
  <summary>
    Recorded when a picture-in-picture window is tucked due to a
    ScopedTuckPictureInPicture object. Records whether the tucked
    picture-in-picture window was just opened or already existed when the
    ScopedTuckPictureInPicture was created.
  </summary>
</histogram>

<histogram name="Media.PictureInPicture.Window.TotalTime" units="ms"
    expires_after="2027-07-12">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent on a Picture in Picture window. The timer starts counting
    every time the Picture in Picture window manager receives a call to enter
    Picture in Picture; the time elapsed is recorded when the Picture in Picture
    window manager receives a call to exit Picture in Picture. This metric is
    recorded regardless of the Picture in Picture window type (document vs
    video), and of the reason for closing the window (UI interaction, returning
    back to opener tab, etc.).
  </summary>
</histogram>

<histogram name="Media.PictureInPicture.Window.TotalTimeV2" units="ms"
    expires_after="2027-07-12">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Total time spent on a Picture in Picture window. The timer starts counting
    every time the Picture in Picture window manager receives a call to enter
    Picture in Picture; the time elapsed is recorded when the Picture in Picture
    window manager receives a call to exit Picture in Picture. This metric is
    recorded regardless of the Picture in Picture window type (document vs
    video), and of the reason for closing the window (UI interaction, returning
    back to opener tab, etc.).

    Similar to Media.PictureInPicture.Window.TotalTime, but with a maximum of 10
    hours and a bucket size of 100.
  </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="HardwareSecure.DDS.HW"
        summary="RendererImpl with hardware decoder and
                 DecryptingDemuxerStream, using hardware secure decryption"/>
    <variant name="HardwareSecure.DDS.SW"
        summary="RendererImpl with software decoder and
                 DecryptingDemuxerStream, using hardware secure decryption"/>
    <variant name="HardwareSecure.HW"
        summary="RendererImpl with hardware decoder and hardware secure
                 decryption"/>
    <variant name="HW" summary="RendererImpl with hardware decoder"/>
    <variant name="MediaDrm.HardwareSecure"
        summary="RendererImpl with requested hardware secure decryption and
                 MediaCodecVideoDecoder"/>
    <variant name="MediaDrm.SoftwareSecure"
        summary="RendererImpl with requested software secure decryption and
                 MediaCodecVideoDecoder"/>
    <variant name="MediaFoundationRenderer"/>
    <variant name="SoftwareSecure.DDS.HW"
        summary="RendererImpl with hardware decoder and
                 DecryptingDemuxerStream, using software secure decryption"/>
    <variant name="SoftwareSecure.DDS.SW"
        summary="RendererImpl with software decoder and
                 DecryptingDemuxerStream, using software secure decryption"/>
    <variant name="SW" summary="RendererImpl with software decoder"/>
    <variant name="UnknownRenderer" summary="an unknown Renderer"/>
  </token>
</histogram>

<histogram
    name="Media.PipelineStatus.HardwareContextResetRecovery.LastPipelineStatus"
    enum="PipelineStatus" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The last status of media pipeline when trying to recover from a hardware
    context reset. Recorded once when either the media pipeline is destroyed or
    we fail to recover from a subsequent error.
  </summary>
</histogram>

<histogram
    name="Media.PipelineStatus.HardwareContextResetRecovery.TimeDeltaSinceLastHardwareContextReset"
    units="ms" expires_after="2027-02-07">
  <owner>sangbaekpark@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The media time delta since the last hardware context reset when trying to
    recover from a hardware context reset. Recorded once when either the media
    pipeline is destroyed or we fail to recover from a subsequent error.
  </summary>
</histogram>

<histogram name="Media.PipelineStatus.Start" enum="PipelineStatus"
    expires_after="2027-02-07">
  <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>hiroh@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.PlatformVideoDecoding.VideoCodecProfile"
    enum="VideoCodecProfile" expires_after="2026-09-01">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    VideoCodecProfile used to Initialize() the platform VideoDecoder
    implementation; this is emitted once per video (or per track, when using
    MSE) initialization and after verifying that the codec profile is thought to
    be supported. Warning: this histogram was expired from 2025-11-09 to
    2025-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Media.RebuffersCount{MediaRebufferingCategories}"
    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.
    {MediaRebufferingCategories}
  </summary>
  <token key="MediaRebufferingCategories" variants="MediaRebufferingCategories">
    <variant name=""/>
  </token>
</histogram>

<histogram name="Media.RegionCapture.CropTo.Latency" units="ms"
    expires_after="2027-03-25">
  <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.

    Warning: this histogram was expired from 2025-01-07 to 2025-03-25; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.RegionCapture.CropTo.Result2"
    enum="ApplySubCaptureTargetResult" expires_after="2027-03-25">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Tracks the result of calls to BrowserCaptureMediaStreamTrack.cropTo().
    Recorded when resolving the promise produced by cropTo().

    Warning: this histogram was expired from 2025-01-07 to 2025-03-25; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.RegionCapture.ProduceCropTarget.Function.Result"
    enum="ProduceTargetFunctionResult" expires_after="2027-03-25">
  <owner>eladalon@chromium.org</owner>
  <owner>jophba@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    Tracks the result of calls to CropTarget.fromElement(). 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.

    Warning: this histogram was expired from 2025-01-07 to 2025-03-25; data may
    be missing.
  </summary>
</histogram>

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

    Warning: this histogram was expired from 2025-01-07 to 2025-03-25; data may
    be missing.
  </summary>
</histogram>

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

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

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

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

<histogram name="Media.Remoting.AudioCodec" enum="AudioCodec"
    expires_after="2027-08-01">
  <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="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Audio sampling rate while remoting audio content.

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

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

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

<histogram name="Media.Remoting.Compatibility" enum="RemotingCompatibility"
    expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <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="2027-08-01">
  <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="2027-08-01">
  <owner>jophba@chromium.org</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="2027-08-01">
  <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{RemotingSessionDuration}"
    enum="RemotingStopTrigger" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Tracks the trigger for stopping a remoting session.
    {RemotingSessionDuration}
  </summary>
  <token key="RemotingSessionDuration">
    <variant name=""/>
    <variant name=".Duration0To100MilliSec"
        summary="remoting sessions have duration in (0, 0.1] seconds"/>
    <variant name=".Duration1To3Sec"
        summary="remoting sessions have duration in (1, 3] seconds"/>
    <variant name=".Duration3To5Sec"
        summary="remoting sessions have duration in (3, 5] seconds"/>
    <variant name=".Duration5To10Sec"
        summary="remoting sessions have duration in (5, 10] seconds"/>
    <variant name=".Duration10To15Sec"
        summary="remoting sessions have duration in (10, 15] seconds"/>
    <variant name=".Duration100MilliSecTo1Sec"
        summary="remoting sessions have duration in (0.1, 1] seconds"/>
  </token>
</histogram>

<histogram name="Media.Remoting.ShortSessionDuration" units="ms"
    expires_after="2027-08-01">
  <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="2027-08-01">
  <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.

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

<histogram name="Media.Remoting.TimeUntilRemoteInitialized" units="ms"
    expires_after="2027-08-01">
  <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.

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

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

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

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

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

<histogram name="Media.Remoting.VideoBitrate" units="kbps"
    expires_after="2027-08-01">
  <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="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Video codec used while remoting content.

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

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

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

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

    NOTE: was expired 2025-02-01 to 2025-03-12, some data may be missing.
  </summary>
</histogram>

<histogram name="Media.Remoting.VideoPixelRateSupport"
    enum="RemotingVideoPixelRateSupport" expires_after="2027-08-01">
  <owner>jophba@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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2026-03-15">
  <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="2027-03-09">
  <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>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="2027-05-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. Recorded directly after a decoder is initialized.
  </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>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="2027-04-27">
  <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. Recorded directly after a decoder is reinitialized.
  </summary>
</histogram>

<histogram name="Media.RTCVideoEncoder.Initialize" units="ms"
    expires_after="2026-09-01">
  <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. Warning: this
    histogram was expired from 2024-09-30 to 2025-09-01; data may be missing.
  </summary>
</histogram>

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

  <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>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>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.ScreenCaptureKit.FullscreenModuleMode"
    enum="ScreenCaptureKitFullscreenModuleMode" expires_after="2027-03-09">
  <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.
    Warning: this histogram was expired from 2026-01 to 2026-03; data may be
    missing.
  </summary>
</histogram>

<histogram name="Media.ScreenCaptureKit.SCContentSharingPicker.SessionEvent"
    enum="ScreenCaptureKitSCContentSharingPickerSessionEvent"
    expires_after="2027-01-04">
  <owner>tovep@chromium.org</owner>
  <owner>kron@chromium.org</owner>
  <owner>brandstrom@chromium.org</owner>
  <summary>
    Records lifecycle and modification events for SCContentSharingPicker capture
    sessions on macOS, including opening the picker, updating the window list,
    removal of the primary app, and requests for application-audio. Each event
    is only logged once per session, when it first happens.
  </summary>
</histogram>

<histogram name="Media.ScreenCaptureKit.SCContentSharingPicker.StopAudioEvent"
    enum="SCContentSharingPickerStopAudioEvent" expires_after="2027-01-04">
  <owner>tovep@chromium.org</owner>
  <owner>kron@chromium.org</owner>
  <owner>brandstrom@chromium.org</owner>
  <summary>
    Records when the macOS native sharing picker triggers a stop_audio_callback
    and when application audio capture is actually stopped.
  </summary>
</histogram>

<histogram name="Media.ScreenCaptureKit.SCContentSharingPicker2"
    enum="ScreenCaptureKitSCContentSharingPicker" expires_after="2027-01-04">
  <owner>tovep@chromium.org</owner>
  <owner>kron@chromium.org</owner>
  <owner>eladalon@chromium.org</owner>
  <summary>
    Records calls to SCContentSharingPicker and responses to the
    SCContentSharingPickerObserver.
  </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.EnterPictureInPictureV2"
    enum="MediaSessionEnterPictureInPictureType" expires_after="2027-01-31">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when EnterPictureInPicture or EnterAutoPictureInPicture is called
    on a MediaSessionImpl. Records why picture-in-picture was triggered (whether
    it was for the default handler or a website-provided one, and whether the
    trigger was manual or automatic).
  </summary>
</histogram>

<histogram name="Media.Session.Pause" enum="MediaSessionActionSource"
    expires_after="2027-04-28">
  <owner>philyan@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    The number of times the user paused playback of a media session using other
    means than the pause button on the page.
  </summary>
</histogram>

<histogram name="Media.Session.PictureInPicture.TotalTimeForSession" units="ms"
    expires_after="2027-08-23">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time during which Picture in Picture windows have been open during a
    MediaSession. The time spent is accumulated every time a Picture in Picture
    window is opened using MediaSession and subsequently closed; The total time
    is recorded when the MediaSession is destroyed. This metric is recorded
    regardless of the Picture in Picture window type (document vs video), and of
    the reason for closing the window (UI interaction, returning back to opener
    tab, etc.).
  </summary>
</histogram>

<histogram name="Media.Session.PictureInPicture.TotalTimeForSessionV2"
    units="ms" expires_after="2027-08-23">
  <owner>bkeen@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Time during which Picture in Picture windows have been open during a
    MediaSession. The time spent is accumulated every time a Picture in Picture
    window is opened using MediaSession and subsequently closed; The total time
    is recorded when the MediaSession is destroyed. This metric is recorded
    regardless of the Picture in Picture window type (document vs video), and of
    the reason for closing the window (UI interaction, returning back to opener
    tab, etc.).

    Similar to Media.Session.PictureInPicture.TotalTimeForSession, but with a
    maximum of 10 hours and a bucket size of 100.
  </summary>
</histogram>

<histogram name="Media.Session.Play" enum="MediaSessionActionSource"
    expires_after="2027-04-28">
  <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.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 name="Media.ThumbnailCapturerMac.ShareableContentErrorPercentage"
    units="%" expires_after="2027-03-09">
  <owner>kron@google.com</owner>
  <owner>eladalon@google.com</owner>
  <summary>
    This histogram tracks the percentage of callbacks where there was no
    shareable content returned from the OS. This is recorded in the destructor
    of ThumbnailCapturerMac. The metric is rounded upwards so that a single
    error shows up as at least 1%.
  </summary>
</histogram>

<histogram name="Media.TimeToFirstFrame.{PlaybackType}" 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>
  <token key="PlaybackType">
    <variant name="All" summary="all"/>
    <variant name="EME"/>
    <variant name="HLS"/>
    <variant name="MediaFoundationRenderer"/>
    <variant name="MSE"/>
    <variant name="SRC"/>
  </token>
</histogram>

<histogram name="Media.TimeToMetadata.{PlaybackType}" 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>
  <token key="PlaybackType">
    <variant name="All" summary="all"/>
    <variant name="EME"/>
    <variant name="HLS"/>
    <variant name="MSE"/>
    <variant name="SRC"/>
  </token>
</histogram>

<histogram name="Media.TimeToPlayReady.{PlaybackType}" 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>
  <token key="PlaybackType">
    <variant name="All" summary="all"/>
    <variant name="EME"/>
    <variant name="HLS"/>
    <variant name="MediaFoundationRenderer"/>
    <variant name="MSE"/>
    <variant name="SRC"/>
  </token>
</histogram>

<histogram name="Media.TrackChangePipelineStatus.{DemuxerName}"
    enum="PipelineStatus" expires_after="2026-12-28">
  <owner>tmathmeyer@chromium.org</owner>
  <owner>media-dev@chromium.org</owner>
  <summary>
    Reports the final pipeline status for playbacks that had at least one audio
    or video track change. This is logged at the end of playback, either on
    destruction or when an error occurs.
  </summary>
  <token key="DemuxerName">
    <variant name="ChunkDemuxer" summary="ChunkDemuxer (MSE)"/>
    <variant name="FFmpegDemuxer" summary="FFmpegDemuxer"/>
    <variant name="ManifestDemuxer" summary="ManifestDemuxer (HLS)"/>
    <variant name="UnknownDemuxer" summary="All other demuxer types."/>
  </token>
</histogram>

<histogram
    name="Media.Ui.GetDisplayMedia.AudioCapturePermissionChecker.Interactions"
    enum="AudioCapturePermissionCheckerInteractions" expires_after="2027-01-10">
  <owner>kron@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    Records the flow and user interactions related to checking system audio
    capture permission on macOS during getDisplayMedia. This includes whether
    the check is enabled, when it is initiated, the result of the check
    (granted/denied), and the user's subsequent actions if permission is denied
    (e.g., opening settings, cancelling, or sharing with/without audio).

    Recorded at different stages: Enabled/Disabled: When the media picker dialog
    is opened. CheckInitiated: When the permission check is started.
    PermissionGranted/Denied: When the permission check completes.
    SystemSettingsOpenedAfterDenial: The first time the open system settings
    button is clicked. CancelSharingAfterDenial: When the user cancels the
    dialog after a permission denial. Share...AfterDenial: When the user accepts
    a selected source after a permission denial.
  </summary>
</histogram>

<histogram
    name="Media.Ui.GetDisplayMedia.BasicFlow.HighlightedTabDiscardStatus"
    enum="HighlightedTabDiscardStatus" expires_after="2025-08-24">
  <owner>eladalon@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    When getDisplayMedia() is called, the user is shown a list of tabs, windows
    and screens they can choose to capture. If the user highlights a discarded
    tab, no preview is shown - which is a problem. This histogram tracks how
    often the user sees at least one missing preview due to highlighting a
    discarded tab. (Contrast this with SelectedTabDiscardStatus.) The histogram
    is recorded when the media-picker dialog is closed - either through the user
    accepting or rejecting the dialog, or if the document that called
    getDisplayMedia() is unloaded (e.g. if the tab is closed).
  </summary>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.BasicFlow.SelectedTabDiscardStatus"
    enum="SelectedTabDiscardStatus" expires_after="2025-08-24">
  <owner>eladalon@chromium.org</owner>
  <owner>mfoltz@chromium.org</owner>
  <summary>
    When getDisplayMedia() is called, the user is shown a list of tabs, windows
    and screens they can choose to capture. If the user highlights a discarded
    tab, no preview is shown - which is a problem. This histogram tracks how
    often the user ends up choosing to share a discarded tab. (Contrast this
    with HighlightedTabDiscardStatus.) The histogram is recorded when the
    media-picker dialog is closed - either through the user accepting or
    rejecting the dialog, or if the document that called getDisplayMedia() is
    unloaded (e.g. if the tab is closed).
  </summary>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.BasicFlow.SourceCount.{Type}"
    units="count" expires_after="2027-05-24">
  <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"/>
    <variant name="Tabs"/>
    <variant name="Windows"/>
  </token>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.BasicFlow.UserInteraction"
    enum="MediaUiGetDisplayMediaBasicFlowUserInteraction"
    expires_after="2027-01-03">
  <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.HasScreenRecordingPermission"
    enum="Boolean" expires_after="2027-09-25">
  <owner>tovep@chromium.org</owner>
  <owner>eladalon@chromium.org</owner>
  <owner>kron@chromium.org</owner>
  <summary>
    Records whether the user has screen recording permission when the
    DesktopMedia picker dialog is opened.
  </summary>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.PreferCurrentTabFlow.UserInteraction"
    enum="MediaUiGetDisplayMediaPreferCurrentTabFlowUserInteraction"
    expires_after="2024-09-22">
  <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.TabSharingInfoBarInteraction"
    enum="MediaUiGetDisplayMediaTabSharingInfoBarInteraction"
    expires_after="2027-01-17">
  <owner>tovep@chromium.org</owner>
  <owner>eladalon@chromium.org</owner>
  <summary>
    Records which controls are clicked in the TabSharingInfoBar. The histogram
    is recorded for each click on such a control.
  </summary>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.{Flow}.AudioToggleState.{Type}"
    enum="GetDisplayMediaAudioToggleStatus" expires_after="2027-07-24">
  <owner>tovep@chromium.org</owner>
  <owner>olka@chromium.org</owner>
  <owner>agpalak@chromium.org</owner>
  <owner>rtc-meet-in-chrome@google.com</owner>
  <summary>
    Recorded after a Web application calls getDisplayMedia() {Flow}, after the
    user chooses to share a display surface of type {Type}. (Not recorded if the
    user rejects the prompt.) Tracks the state of the audio toggle at the time
    when the user approved the capture. If the audio toggle is not present, this
    histogram distinguishes the reason for its absence. Note that
    `AudioSelectionPreferred` is a subset of `BasicFlow` (which is logged for
    all requests). Also note that `WindowsAppAudio` and `WindowsSystemAudio` are
    subsets of `Windows` where the option to share application audio or system
    audio (respectively) is provided.
  </summary>
  <token key="Flow">
    <variant name="AudioSelectionPreferred"
        summary="with audioSelection='preferred'"/>
    <variant name="BasicFlow" summary="in the basic flow"/>
  </token>
  <token key="Type">
    <variant name="Screens"/>
    <variant name="Tabs"/>
    <variant name="Windows"/>
    <variant name="WindowsAppAudio"/>
    <variant name="WindowsSystemAudio"/>
  </token>
</histogram>

<histogram name="Media.Ui.GetDisplayMedia.{Flow}.DialogDuration" units="ms"
    expires_after="2027-06-28">
  <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 name="Media.Ui.GetDisplayMedia.{Type}.UserInteractionWithControls"
    enum="GetDisplayMediaUserInteractionWithControls"
    expires_after="2026-10-25">
  <owner>eladalon@chromium.org</owner>
  <owner>tovep@chromium.org</owner>
  <summary>
    When the user shares a tab, window or screen, the browser shows the user
    some UX elements which can control the session - stop sharing, hide
    controls, share something else, change active tab, etc. Which UX elements
    are available depends on what is shared as well as other factors. The
    histograms defined here track which controls the user interacted with, if
    any. Recording takes place when the interaction happens; if no interaction
    occurs, this is recorded when the controls are hidden from the user
    (typically when the capture session ends through other means). It should be
    noted that, while the name indicates getDisplayMedia(), this histogram is
    actually recorded for any screen-sharing session, including casting and
    extension APIs.
  </summary>
  <token key="Type">
    <variant name="Screens"/>
    <variant name="Tabs"/>
    <variant name="Windows"/>
  </token>
</histogram>

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

  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev-uma@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>
  <token key="PlaybackType">
    <variant name="All" summary="all"/>
    <variant name="EME"/>
    <variant name="HLS"/>
    <variant name="MediaFoundationRenderer"/>
    <variant name="MSE"/>
    <variant name="SRC"/>
  </token>
</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="2026-09-01">
  <owner>hiroh@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. Warning: this histogram
    was expired from 2024-05-19 to 2025-09-01; data may be missing.
  </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="2026-09-01">
  <owner>hiroh@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="2026-09-01">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Whether the creation of VaapiWrapper succeeded or not inside
    VaapiVideoDecoder. Warning: this histogram was expired from 2023-02-12 to
    2025-09-01; data may be missing.
  </summary>
</histogram>

<histogram name="Media.VaapiWrapper.VADisplayStateInitializeSuccess"
    enum="BooleanSuccess" expires_after="2026-09-01">
  <owner>hiroh@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.VAVDA.VaapiWrapperCreationSuccess" enum="BooleanSuccess"
    expires_after="2026-09-01">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@google.com</owner>
  <summary>
    Whether the creation of VaapiWrapper succeeded or not inside VaVDA.Warning:
    this histogram was expired from 2023-02-12 to 2025-09-01; data may be
    missing.
  </summary>
</histogram>

<histogram name="Media.Video.Autoplay" enum="AutoplaySource"
    expires_after="2027-02-07">
  <owner>evliu@google.com</owner>
  <owner>dalecurtis@chromium.org</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="2027-02-26">
  <owner>evliu@google.com</owner>
  <owner>dalecurtis@chromium.org</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="2027-02-26">
  <owner>evliu@google.com</owner>
  <owner>dalecurtis@chromium.org</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="2027-02-26">
  <owner>evliu@google.com</owner>
  <owner>dalecurtis@chromium.org</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.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.UserMedia"
    enum="SystemMediaCapturePermission" expires_after="2026-12-27">
  <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="2025-07-27">
  <owner>avi@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. Warning: this
    histogram was expired from 2024-02-11 to 2024-09-16; data may be missing.
  </summary>
</histogram>

<histogram name="Media.Video.Roughness{VideoFrameRateRange}" units="ms"
    expires_after="2027-02-07">
  <owner>eugene@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Video playback roughness for a 100s interval. Suffixed by the framerate.
    {VideoFrameRateRange}
  </summary>
  <token key="VideoFrameRateRange">
    <variant name=""/>
    <variant name=".24fps" summary="24 fps"/>
    <variant name=".25fps" summary="25 fps"/>
    <variant name=".30fps" summary="30 fps"/>
    <variant name=".50fps" summary="50 fps"/>
    <variant name=".60fps" summary="60 fps"/>
  </token>
</histogram>

<histogram name="Media.VideoCapture.AspectRatio" units="%"
    expires_after="2027-08-01">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@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.

    Warning: this histogram was expired from 2026-03-25 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.CreateDeviceSuccessLatency" units="ms"
    expires_after="2027-02-15">
  <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="2026-10-11">
  <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.PixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2027-01-03">
  <owner>bryantchandler@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.SupportedPixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2027-01-03">
  <owner>eshr@google.com</owner>
  <owner>handellm@google.com</owner>
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</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.)
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Device.SupportedResolution"
    enum="VideoResolutionDesignation" expires_after="2027-08-01">
  <owner>bryantchandler@chromium.org</owner>
  <owner>eshr@google.com</owner>
  <owner>handellm@google.com</owner>
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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.)

    Warning: this histogram was expired from 2026-03-25 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Error" enum="VideoCaptureError"
    expires_after="2027-01-03">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@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.FrameRate" units="fps"
    expires_after="2027-06-30">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@chromium.org</owner>
  <owner>guidou@chromium.org</owner>
  <owner>armax@chromium.org</owner>
  <owner>handellm@google.com</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.Height" units="pixels"
    expires_after="2027-08-01">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@chromium.org</owner>
  <owner>handellm@google.com</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.

    Warning: this histogram was expired from 2023-12-31 to 2025-03-25; data may
    be missing.

    Warning: this histogram was expired from 2026-03-25 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Mac.Device.ImplementationClassification"
    enum="ImplementationClassification" expires_after="2026-12-06">
  <owner>avi@chromium.org</owner>
  <owner>mark@chromium.org</owner>
  <summary>
    A classification of the type of AVCaptureDevice being used for capture. This
    UMA is recorded once per opening of the device.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Mac.Device.ReactionEffectsGesturesState"
    enum="ReactionEffectsGesturesState" expires_after="2026-09-21">
  <owner>guidou@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    An enumeration count of whether reaction effects are enabled and can be
    triggered by gestures. This is recorded once per opening of the camera.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Mac.ValidColorSpaceAfterTransform"
    enum="Boolean" expires_after="2026-12-07">
  <owner>kron@google.com</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    A boolean count of how often a valid color space can be determined from the
    transformed buffer in VideoCaptureDeviceAVFoundation. This is recorded for
    the first frame in didOutputSampleBuffer that has been passed through the
    transformer.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.ScaleOverride" units="units"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</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.

    Warning: this histogram was expired from 2026-03-25 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.ScaleOverrideChangeCount" units="units"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    The number of times the scale override changed in a single capture session.
    Recorded when capture of a web contents is stopped.

    Warning: this histogram was expired from 2026-03-25 to 2026-06-10; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Start" enum="Boolean"
    expires_after="2026-11-22">
  <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{ApiType}"
    enum="VideoCaptureError" expires_after="2027-02-07">
  <owner>agpalak@chromium.org</owner>
  <owner>toprice@chromium.org</owner>
  <owner>rtc-meet-in-chrome@google.com</owner>
  <summary>
    Counts detailed outcomes of first starting {ApiType}, 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. Recorded in
    VideoCaptureImpl::OnStateChanged() when a video capture attempt finishes,
    either successfully transitioning to STARTED or failing.
  </summary>
  <token key="ApiType" variants="CaptureApiType"/>
</histogram>

<histogram name="Media.VideoCapture.StartOutcome"
    enum="VideoCaptureStartOutcome" expires_after="2027-02-14">
  <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="2026-07-05">
  <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.StreamShared" enum="Boolean"
    expires_after="2025-06-22">
  <owner>wtlee@chromium.org</owner>
  <owner>chromeos-camera-app-eng@google.com</owner>
  <summary>
    Records when attempting to access a camera and the value represents whether
    the camera is shared due to multiple camera access.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.StreamSharedSameOrigin" enum="Boolean"
    expires_after="2025-10-26">
  <owner>wtlee@chromium.org</owner>
  <owner>chromeos-camera-app-eng@google.com</owner>
  <summary>
    Records when attempting to share a camera and the value represents whether
    the origin requesting to share the camera stream is the same origin
    initiating the video capture device.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Track.FrameDrop.{StreamType}"
    enum="VideoCaptureFrameDropReason" expires_after="2027-06-30">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@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 for a {StreamType} video source, but gets suppressed after
    `MediaStreamVideoTrack::kMaxConsecutiveFrameDropForSameReasonCount`
    consecutive drops. Logging resumes again if another frame is delivered or if
    the frame drop reason changes. The frame drop is recorder on a per-track
    basis (i.e. cloned tracks also log) and includes out-of-process frame drops
    (e.g. a DeviceCapture webcam source dropping frames in the capture process).

    Warning: this histogram was expired from 2024-03-03 to 2025-03-25; data may
    be missing.

    Warning: this histogram was expired from 2026-03-25 to 2026-06-10; data may
    be missing.
  </summary>
  <token key="StreamType">
    <variant name="DeviceCapture"/>
    <variant name="DisplayCapture"/>
    <variant name="DisplayCaptureCurrentTab"/>
    <variant name="GumDesktopCapture"/>
    <variant name="GumTabCapture"/>
  </token>
</histogram>

<histogram name="Media.VideoCapture.Width" units="pixels"
    expires_after="2026-11-29">
  <owner>hiroh@chromium.org</owner>
  <owner>chromeos-gfx-video@chromium.org</owner>
  <owner>handellm@google.com</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.

    Warning: this histogram was expired from 2024-05-05 to 2024-05-21; data may
    be missing.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.D3DDeviceRemovedReason" enum="Hresult"
    expires_after="2027-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.CaptureBeginTime.Interval"
    units="ms" expires_after="2027-04-19">
  <owner>ilnik@google.com</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    Counts the difference between consecutive capture begin times received from
    MFSamples. Recorded on each received sample. Offset by +150ms to allow
    recording of negative values.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.Device.CaptureBeginTime.MFTimeOffset"
    units="ms" expires_after="2027-06-22">
  <owner>ilnik@google.com</owner>
  <owner>video-cmi-mpp@google.com</owner>
  <summary>
    Counts the difference between local chrome clock and MFTIME clock. Recorded
    on each received sample. Offset by +150ms to allow recording of negative
    values.
  </summary>
</histogram>

<histogram name="Media.VideoCapture.Win.Device.CapturePixelFormat"
    enum="VideoPixelFormatUnion" expires_after="2026-09-20">
  <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="2027-08-09">
  <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="2027-04-28">
  <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="2026-09-20">
  <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="2026-12-14">
  <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="2027-02-07">
  <owner>toprice@chromium.org</owner>
  <owner>video-cmi-apis@google.com</owner>
  <summary>
    Error codes received by VideoCaptureDeviceMFWin on Windows which caused a
    kWinMediaFoundationGetMediaEventStatusFailed error, ending video capture.
    Warning: this histogram was expired from 2025-03-30 to 2025-06-03; data may
    be missing.
  </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.VideoCaptureManager.DesktopCaptureImplementationAndType"
    enum="DesktopCaptureImplementationAndType" expires_after="2027-01-17">
  <owner>handellm@google.com</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. Warning: this histogram was expired from 2025-07-27 to 2025-09-05;
    data may be missing.
  </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.VideoEncode.MFVEA.KeyFrameRequestFullfilled.{VideoCodec}"
    enum="Boolean" expires_after="2026-12-06">
  <owner>eugene@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records if the MediaFoundation {VideoCodec} encoder returns a delta frame on
    an explicit key frame request. Recorded on every key frame request.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.VideoEncoder.D3D12VEA.EncodeStatus.{VideoCodec}"
    enum="EncoderStatus" expires_after="2027-02-07">
  <owner>eugene@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records if the {VideoCodec} 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="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.VideoEncoder.D3D12VEA.InitSuccessRate.{VideoCodec}"
    enum="VEAInitSuccessRate" expires_after="2027-02-07">
  <owner>eugene@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the usage and success rate of D3D12 video encode accelerator for
    {VideoCodec} codec. kInit is recorded every time VEA Initialize() is called.
    kSuccess is recorded only when VEA initialization completes successfully.
    Success percentage = (kSuccess count / kInit count) * 100.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.VideoEncoder.NDKVEA.EncodeStatus.{VideoCodec}"
    enum="EncoderStatus" expires_after="2026-10-04">
  <owner>eugene@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records if the {VideoCodec} 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 on Android.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.VideoEncoder.NDKVEA.InitStatus.{VideoCodec}"
    enum="EncoderStatus" expires_after="2026-12-06">
  <owner>eugene@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the initialization status of the NdkVideoEncodeAccelerator for
    {VideoCodec}. Recorded every time Initialize() is called.
  </summary>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.VideoEncoder.NDKVEA.TemporalLayerEncodingEnabled"
    enum="BooleanEnabled" expires_after="2027-04-02">
  <owner>philyan@google.com</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Records the underlying platform capability for temporal layer encoding on
    Android, independent of Finch experiment flags or strict OS version
    enforcement in the NDK VEA. Logged during encoder initialization if multiple
    temporal layers are requested.
  </summary>
</histogram>

<histogram name="Media.VideoEncoder.{Impl}.EncodingLatency.{VideoCodec}"
    units="ms" expires_after="2027-02-07">
  <owner>eugene@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Average encoding latency in milliseconds per frame for the {VideoCodec}
    codec when using the {Impl}. Recorded on every key frame or when the
    encoding session is destroyed so remaining samples are reported.
  </summary>
  <token key="Impl">
    <variant name="D3D12VEA" summary=""/>
    <variant name="MFVEA" summary=""/>
    <variant name="NDKVEA" summary=""/>
  </token>
  <token key="VideoCodec" variants="VideoCodec"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.{Impl}.Area" units="pixels"
    expires_after="2026-04-26">
  <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"/>
  <token key="Impl" variants="VideoEncoderImpl"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.{Impl}.Frames" units="frames"
    expires_after="2026-04-01">
  <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"/>
  <token key="Impl" variants="VideoEncoderImpl"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.{Impl}.Height" units="pixels"
    expires_after="2026-04-26">
  <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"/>
  <token key="Impl" variants="VideoEncoderImpl"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.{Impl}.Profile"
    enum="VideoCodecProfile" expires_after="2027-02-07">
  <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"/>
  <token key="Impl" variants="VideoEncoderImpl"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.{Impl}.Status" enum="EncoderStatus"
    expires_after="2027-01-10">
  <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"/>
  <token key="Impl" variants="VideoEncoderImpl"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.{Impl}.SVC"
    enum="SVCScalabilityMode" expires_after="2026-04-26">
  <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"/>
  <token key="Impl" variants="VideoEncoderImpl"/>
</histogram>

<histogram name="Media.VideoEncoder.{Usage}.{Impl}.Width" units="pixels"
    expires_after="2026-04-26">
  <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"/>
  <token key="Impl" variants="VideoEncoderImpl"/>
</histogram>

<histogram name="Media.VideoFrameSubmitter.{Source}.PresentationDelay"
    units="ms" expires_after="never">
<!-- expires-never: used by ChromeOS and RTC test infrastructure -->

  <owner>kron@chromium.org</owner>
  <owner>video-performance-team@google.com</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).
    Recorded when VideoFrameSubmitter::OnBeginFrame() is called based on the
    frame timing details that is passed as parameter.
  </summary>
  <token key="Source" variants="VideoSource"/>
</histogram>

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

  <owner>kron@chromium.org</owner>
  <owner>video-performance-team@google.com</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.{Source}.PresentationDelay. Recorded when the
    composition frame is created.
  </summary>
  <token key="Source" variants="VideoSource"/>
</histogram>

<histogram name="Media.VideoHeight.Initial.{PlaybackType}" units="pixels"
    expires_after="2027-02-07">
  <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="HLS"/>
    <variant name="MediaFoundationRenderer"/>
    <variant name="MSE"/>
    <variant name="SRC"/>
  </token>
</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.VideoResourceUpdater.FrameFormat"
    enum="VideoPixelFormatUnion" expires_after="2027-02-14">
  <owner>dalecurtis@chromium.org</owner>
  <owner>media-dev@chromium.org</owner>
  <summary>
    The format of each VideoFrame passed to VideoResourceUpdater. Recorded prior
    to resources being obtained for passing to Viz.
  </summary>
</histogram>

<histogram name="Media.WatchTime{MediaWatchTimeCategories}" units="ms"
    expires_after="2027-01-31">
  <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. {MediaWatchTimeCategories}
  </summary>
  <token key="MediaWatchTimeCategories">
    <variant name=""/>
    <variant name=".Audio.AC"
        summary="Watch time for all media with only an audio track on AC
                 power."/>
    <variant name=".Audio.All"
        summary="Watch time for all media with only an audio track."/>
    <variant name=".Audio.AutoPipMediaPlayback"
        summary="Watch time for all media with only an audio track on a
                 window opened due to auto picture in picture for media
                 playback."/>
    <variant name=".Audio.Background.AC"
        summary="Background watch time for all media with only an audio track
                 on AC power."/>
    <variant name=".Audio.Background.All"
        summary="Background watch time for all media with only an audio
                 track."/>
    <variant name=".Audio.Background.Battery"
        summary="Background watch time for all media with only an audio track
                 on battery power."/>
    <variant name=".Audio.Background.EmbeddedExperience"
        summary="Background watch time for downloaded media on Android with
                 only an audio track."/>
    <variant name=".Audio.Background.EME"
        summary="Background watch time for EME media with only an audio
                 track."/>
    <variant name=".Audio.Background.HLS"
        summary="Background watch time for HLS media with only an audio
                 track."/>
    <variant name=".Audio.Background.MSE"
        summary="Background watch time for MSE media with only an audio
                 track."/>
    <variant name=".Audio.Background.SRC"
        summary="Background watch time for SRC media with only an audio
                 track."/>
    <variant name=".Audio.Battery"
        summary="Watch time for all media with only an audio track on battery
                 power."/>
    <variant name=".Audio.Discarded.EME"
        summary="Watch time less than 7 seconds for EME media with only an
                 audio track."/>
    <variant name=".Audio.Discarded.HLS"
        summary="Watch time less than 7 seconds for HLS media with only an
                 audio track."/>
    <variant name=".Audio.Discarded.MSE"
        summary="Watch time less than 7 seconds for MSE media with only an
                 audio track."/>
    <variant name=".Audio.Discarded.SRC"
        summary="Watch time less than 7 seconds for SRC media with only an
                 audio track."/>
    <variant name=".Audio.EmbeddedExperience"
        summary="Watch time for downloaded media on Android with only an
                 audio track."/>
    <variant name=".Audio.EME"
        summary="Watch time for EME media with only an audio track."/>
    <variant name=".Audio.HLS"
        summary="Watch time for HLS media with only an audio track."/>
    <variant name=".Audio.MSE"
        summary="Watch time for MSE media with only an audio track."/>
    <variant name=".Audio.NativeControlsOff"
        summary="Watch time for all media with only an audio track not using
                 native controls."/>
    <variant name=".Audio.NativeControlsOn"
        summary="Watch time for all media with only an audio track using
                 native controls."/>
    <variant name=".Audio.SRC"
        summary="Watch time for SRC media with only an audio track."/>
    <variant name=".AudioVideo.AC"
        summary="Watch time for all media with both an audio and video track
                 on AC power."/>
    <variant name=".AudioVideo.All"
        summary="Watch time for all media with both an audio and video track."/>
    <variant name=".AudioVideo.AutoPipMediaPlayback"
        summary="Watch time for all media with both an audio and video track
                 on a window opened due to auto picture in picture for media
                 playback."/>
    <variant name=".AudioVideo.AuxiliaryVisibleContent"
        summary="Watch time for all media with both an audio and video track
                 displayed as a smaller element on screen."/>
    <variant name=".AudioVideo.Background.AC"
        summary="Background watch time for all media with both an audio and
                 video track on AC power."/>
    <variant name=".AudioVideo.Background.All"
        summary="Background watch time for all media with both an audio and
                 video track."/>
    <variant name=".AudioVideo.Background.Battery"
        summary="Background watch time for all media with both an audio and
                 video track on battery power."/>
    <variant name=".AudioVideo.Background.EmbeddedExperience"
        summary="Background watch time for downloaded media on Android with
                 both an audio and video track."/>
    <variant name=".AudioVideo.Background.EME"
        summary="Background watch time for EME media with both an audio and
                 video track."/>
    <variant name=".AudioVideo.Background.HLS"
        summary="Background watch time for HLS media with both an audio and
                 video track."/>
    <variant name=".AudioVideo.Background.MSE"
        summary="Background watch time for MSE media with both an audio and
                 video track."/>
    <variant name=".AudioVideo.Background.SRC"
        summary="Background watch time for SRC media with both an audio and
                 video track."/>
    <variant name=".AudioVideo.Battery"
        summary="Watch time for all media with both an audio and video track
                 on battery power."/>
    <variant name=".AudioVideo.Discarded.EME"
        summary="Watch time less than 7 seconds for EME media with only with
                 both an audio and video track."/>
    <variant name=".AudioVideo.Discarded.HLS"
        summary="Watch time less than 7 seconds for HLS media with with both
                 an audio and video track."/>
    <variant name=".AudioVideo.Discarded.MSE"
        summary="Watch time less than 7 seconds for MSE media with only with
                 both an audio and video track."/>
    <variant name=".AudioVideo.Discarded.SRC"
        summary="Watch time less than 7 seconds for SRC media with with both
                 an audio and video track."/>
    <variant name=".AudioVideo.DisplayFullscreen"
        summary="Watch time for all media with both an audio and video track
                 displayed in fullscreen."/>
    <variant name=".AudioVideo.DisplayInline"
        summary="Watch time for all media with both an audio and video track
                 displayed inline."/>
    <variant name=".AudioVideo.DisplayPictureInPicture"
        summary="Watch time for all media with both an audio and video track
                 displayed in picture-in-picture."/>
    <variant name=".AudioVideo.DominantVisibleContent"
        summary="Watch time for all media with both an audio and video track
                 displayed as the dominant visible content on screen."/>
    <variant name=".AudioVideo.EmbeddedExperience"
        summary="Watch time for downloaded media on Android with both an
                 audio and video track."/>
    <variant name=".AudioVideo.EME"
        summary="Watch time for EME media with both an audio and video track."/>
    <variant name=".AudioVideo.HDR.All"
        summary="HDR watch time for all media with both an audio and video
                 track."/>
    <variant name=".AudioVideo.HDR.EME"
        summary="HDR watch time for EME media with both an audio and video
                 track."/>
    <variant name=".AudioVideo.HLS"
        summary="Watch time for HLS media with both an audio and video track."/>
    <variant name=".AudioVideo.MediaFoundation.All"
        summary="MediaFoundations renderer watch time for all media with both
                 an audio and video track."/>
    <variant name=".AudioVideo.MediaFoundation.Eme"
        summary="MediaFoundations renderer watch time for EME media with both
                 an audio and video track."/>
    <variant name=".AudioVideo.MediaFoundation.HDR.All"
        summary="MediaFoundations renderer HDR watch time for all media with
                 both an audio and video track."/>
    <variant name=".AudioVideo.MediaFoundation.HDR.EME"
        summary="MediaFoundations renderer HDR watch time for EME media with
                 both an audio and video track."/>
    <variant name=".AudioVideo.MSE"
        summary="Watch time for MSE media with both an audio and video track."/>
    <variant name=".AudioVideo.Muted.All"
        summary="Muted watch time for all media with both an audio and video
                 track."/>
    <variant name=".AudioVideo.Muted.AuxiliaryVisibleContent"
        summary="Muted watch time for all media with both an audio and video
                 track displayed as a smaller element on screen."/>
    <variant name=".AudioVideo.Muted.DominantVisibleContent"
        summary="Muted watch time for all media with both an audio and video
                 track displayed as the dominant visible content on screen."/>
    <variant name=".AudioVideo.Muted.EME"
        summary="Muted watch time for EME media with both an audio and video
                 track."/>
    <variant name=".AudioVideo.Muted.HLS"
        summary="Muted watch time for HLS media with both an audio and video
                 track."/>
    <variant name=".AudioVideo.Muted.MSE"
        summary="Muted watch time for MSE media with both an audio and video
                 track."/>
    <variant name=".AudioVideo.Muted.SRC"
        summary="Muted watch time for SRC media with both an audio and video
                 track."/>
    <variant name=".AudioVideo.NativeControlsOff"
        summary="Watch time for all media with both an audio and video track
                 not using native controls."/>
    <variant name=".AudioVideo.NativeControlsOn"
        summary="Watch time for all media with both an audio and video track
                 using native controls."/>
    <variant name=".AudioVideo.SRC"
        summary="Watch time for SRC media with both an audio and video track."/>
  </token>
</histogram>

<histogram name="Media.WebMediaPlayerCompositor.10xHarmonicFrameRate"
    units="Hz" expires_after="2027-02-14">
  <owner>handellm@google.com</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    10x the harmonic frame rate of the video frames that were presented by the
    compositor. This is computed as one over the weighted average of frame
    durations where the weights are the durations themselves. This is a measure
    of the effective frame rate of the video, penalizing hitches heavily. This
    metric is only recorded for non-screencast video. Higher is better. The
    metric is reported every 10 seconds provided frames have been presented.
  </summary>
</histogram>

<histogram name="Media.WebMediaPlayerCompositor.NegativeDisplayDurationCount"
    units="count" expires_after="2027-02-14">
  <owner>handellm@google.com</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    The number of times the compositor presented consecutive frames whose
    duration since last displayed frame was negative. The metric is reported
    every 10 seconds provided relevant frames have been presented.
  </summary>
</histogram>

<histogram name="Media.WebMediaPlayerCompositor.ReasonToClearRenderBuffer"
    enum="ReasonToClearRenderBuffer" expires_after="2026-10-15">
  <owner>kron@chromium.org</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    Returns the reason why the render buffer was cleared in
    WebMediaPlayerMsCompositor. Recorded in the call to EnqueueFrame() if the
    render buffer is cleared. If multiple conditions apply, only the first
    matching enum is reported.
  </summary>
</histogram>

<histogram
    name="Media.WebMediaPlayerCompositor.ReproductionJitter.{ContentType}.{Origin}"
    units="ms" expires_after="2027-02-14">
  <owner>handellm@google.com</owner>
  <owner>webrtc-video@google.com</owner>
  <summary>
    A RMSE-like measure of the difference between the presented and captured
    frame durations. This metric can handle both isochronous as well as variable
    frame rate video. Lower is better. The metric is reported every 10 seconds
    provided relevant frames have been presented.
  </summary>
  <token key="ContentType">
    <variant name="Screencast"/>
    <variant name="Unspecified"/>
  </token>
  <token key="Origin">
    <variant name="Capture"/>
    <variant name="Remote"/>
  </token>
</histogram>

<histogram name="Media.WebrtcVideoPerfHistory.GetPerfInfoCodecProfile"
    enum="VideoCodecProfile" expires_after="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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="2027-03-09">
  <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.{VaapiClientName}.VAAPIError" enum="VaapiFunctions"
    expires_after="2026-09-01">
  <owner>hiroh@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} Warning: this histogram was expired
    from 2025-06-01 to 2025-09-01; data may be missing.
  </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="MediaLauncherActivityStarted"
    enum="MediaLauncherActivityEnabledReason" expires_after="2027-01-17">
  <owner>steimel@chromium.org</owner>
  <owner>media-dev-uma@chromium.org</owner>
  <summary>
    Recorded when the MediaLauncherActivity starts up. Records the reaosn that
    MediaLauncherActivity is enabled.
  </summary>
</histogram>

<histogram name="MediaPreviews.UI.DeviceSelection.PageInfo.Camera.NumDevices"
    units="devices" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the number of camera devices available in the PageInfo combobox.
    Note: There is a change for the zero device case starting from M128 where we
    no longer record the zero case if the list of devices is not initialized
    yet.
  </summary>
</histogram>

<histogram name="MediaPreviews.UI.DeviceSelection.PageInfo.Mic.NumDevices"
    units="devices" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the number of microphones (audio input) devices available in the
    PageInfo combobox. Note: There is a change for the zero device case starting
    from M128 where we no longer record the zero case if the list of devices is
    not initialized yet.
  </summary>
</histogram>

<histogram
    name="MediaPreviews.UI.DeviceSelection.Permissions.Camera.NumDevices"
    units="devices" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the number of camera devices available in the Permissions combobox.
    Note: There is a change for the zero device case starting from M128 where we
    no longer record the zero case if the list of devices is not initialized
    yet.
  </summary>
</histogram>

<histogram name="MediaPreviews.UI.DeviceSelection.Permissions.Mic.NumDevices"
    units="devices" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the number of microphones (audio input) devices available in the
    Permissions combobox. Note: There is a change for the zero device case
    starting from M128 where we no longer record the zero case if the list of
    devices is not initialized yet.
  </summary>
</histogram>

<histogram name="MediaPreviews.UI.DeviceSelection.{UiLocation}.{Type}.Action"
    enum="MediaPreviewDeviceSelectionUserAction" expires_after="2027-01-16">
  <owner>ahmedmoussa@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the kind of user interaction with combobox shown in {UiLocation}
    media preview. This is recorded during media preview destructor.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo"/>
    <variant name="Permissions"/>
  </token>
  <token key="Type">
    <variant name="Camera"/>
    <variant name="Mic"/>
  </token>
</histogram>

<histogram name="MediaPreviews.UI.PageInfo.Camera.NumInUseDevices"
    units="devices" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the number of previews shown for camera devices in use on PageInfo.
  </summary>
</histogram>

<histogram name="MediaPreviews.UI.PageInfo.Camera.PixelHeight" units="pixels"
    expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the height in pixels of the camera frames rendered in the PageInfo
    preview (not the actual height of the preview itself).
  </summary>
</histogram>

<histogram name="MediaPreviews.UI.PageInfo.Mic.NumInUseDevices" units="devices"
    expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the number of previews shown for microphones (audio input) devices
    in use on PageInfo.
  </summary>
</histogram>

<histogram name="MediaPreviews.UI.Permissions.Camera.PixelHeight"
    units="pixels" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the height in pixels of the camera frames rendered in the
    Permissions preview (not the actual height of the preview itself).
  </summary>
</histogram>

<histogram name="MediaPreviews.UI.Preview.{UiLocation}.Video.ActualFPS"
    units="fps" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the actual FPS of the {UiLocation} camera preview for the time it's
    on screen.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo" summary="PageInfo video preview Actual FPS"/>
    <variant name="Permissions" summary="Permissions video preview Actual FPS"/>
  </token>
</histogram>

<histogram name="MediaPreviews.UI.Preview.{UiLocation}.Video.Delay" units="ms"
    expires_after="2027-01-16">
  <owner>ahmedmoussa@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the duration in which the camera took till getting the first frame.
    This would help measuring the delay of camera stream.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo"/>
    <variant name="Permissions"/>
  </token>
</histogram>

<histogram name="MediaPreviews.UI.Preview.{UiLocation}.Video.ExpectedFPS"
    units="fps" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the actual FPS of the {UiLocation} camera preview for the time it's
    on screen.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo" summary="PageInfo video preview Expected FPS"/>
    <variant name="Permissions"
        summary="Permissions video preview Expected FPS"/>
  </token>
</histogram>

<histogram name="MediaPreviews.UI.Preview.{UiLocation}.Video.RenderedPercent"
    units="%" expires_after="2027-01-16">
  <owner>bryantchandler@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the percentage of frames that we got from the camera (ActualFPS)
    that were actually rendered. Recorded when the {UiLocation} preview is
    closed.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo" summary="PageInfo video Rendered Percent"/>
    <variant name="Permissions" summary="Permissions video Rendered Percent"/>
  </token>
</histogram>

<histogram
    name="MediaPreviews.UI.Preview.{UiLocation}.Video.TimeToActionWithoutPreview"
    units="ms" expires_after="2027-01-16">
  <owner>ahmedmoussa@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the duration till media preview dialog closes if there were no
    frames received.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo"/>
    <variant name="Permissions"/>
  </token>
</histogram>

<histogram
    name="MediaPreviews.UI.Preview.{UiLocation}.Video.TotalVisibleDuration"
    units="ms" expires_after="2027-01-16">
  <owner>ahmedmoussa@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the duration in which media preview dialog is actually receiving
    camera feed. If the user switched between multiple cameras, a sum of the
    camera feeds durations is recorded. If the dialog closes in under 50 ms,
    this is treated the same way as if we didn't receive any frames. This would
    help verifying whether the preview was actually seen by the user or not.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo"/>
    <variant name="Permissions"/>
  </token>
</histogram>

<histogram name="MediaPreviews.UI.Preview.{UiLocation}.VideoCaptureError"
    units="VideoCaptureError" expires_after="2027-01-16">
  <owner>ahmedmoussa@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records video capture errors received from the {UiLocation} camera preview.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo"/>
    <variant name="Permissions"/>
  </token>
</histogram>

<histogram name="MediaPreviews.UI.{UiLocation}.{Type}.Duration" units="s"
    expires_after="2027-01-16">
  <owner>ahmedmoussa@google.com</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records the length of time the preview is on-screen. As a simplification, we
    will just record the length of time where {UiLocation} is open. Recorded in
    the destructor of {UiLocation}.
  </summary>
  <token key="UiLocation">
    <variant name="PageInfo"/>
    <variant name="Permissions"/>
  </token>
  <token key="Type">
    <variant name="Camera"/>
    <variant name="CameraAndMic"/>
    <variant name="Mic"/>
  </token>
</histogram>

<histogram name="MediaRouter.Cast.App.Availability{MediaRouterSuccess}"
    units="ms" expires_after="2027-08-01">
  <owner>jophba@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. {MediaRouterSuccess}
  </summary>
  <token key="MediaRouterSuccess">
    <variant name=".Failure" summary="Failure"/>
    <variant name=".Success" summary="Success"/>
  </token>
</histogram>

<histogram name="MediaRouter.Cast.Channel.ConnectResult" enum="BooleanSuccess"
    expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.Discovery.ConnectedDevicesCount"
    units="devices" expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <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="2027-08-01">
  <owner>jophba@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.LaunchSessionResponse.AppType"
    enum="MediaRouterResponseReceiverAppType" expires_after="2027-08-01">
  <owner>jophba@chromium.org</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="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.CastStreaming.Session.Launch" units="ms"
    expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.OffscreenTab"
    units="ms" expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.Success" enum="MirrorType"
    expires_after="2027-08-01">
  <owner>jophba@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.Dial.AvailableDevicesCount" units="devices"
    expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.Discovery.LocalNetworkAccessPermissionGranted"
    enum="Boolean" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Whether the local network access permission is granted when the local
    discovery starts. Recorded once per browser session. Recorded on macOS 15 or
    later.
  </summary>
</histogram>

<histogram name="MediaRouter.Icon.Click.Location"
    enum="MediaRouterDialogActivationLocation" expires_after="2027-08-01">
  <owner>jophba@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.DisabledHardwareCodecAndRenegotiated"
    enum="VideoCodec" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records when a hardware encoder gets disabled during a mirroring session,
    which prompts a renegotiation without that hardware encoder configuration
    being offered.
  </summary>
</histogram>

<histogram name="MediaRouter.MirroringService.GpuFactoryContextLost"
    enum="VideoCodec" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Records when the GPU context for the MirroringGpuFactoriesFactory instance
    is lost. This should prompt a renegotiation without that hardware encoder
    configuration being offered.
  </summary>
</histogram>

<histogram name="MediaRouter.MirroringService.SessionError"
    enum="MirroringServiceErrorType" expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.UrlBySink2"
    enum="PresentationUrlBySink" expires_after="2027-08-01">
  <owner>jophba@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.

    Warning: this histogram was expired from 2025-08-31 to 2026-02-02; data may
    be missing.
  </summary>
</histogram>

<histogram name="MediaRouter.Provider.CreateRoute.Result{MediaRouteProvider}"
    enum="MediaRouteProviderResult" expires_after="2027-08-01">
  <owner>jophba@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. {MediaRouteProvider}
  </summary>
  <token key="MediaRouteProvider" variants="MediaRouteProvider">
    <variant name=""/>
  </token>
</histogram>

<histogram name="MediaRouter.Provider.JoinRoute.Result{MediaRouteProvider}"
    enum="MediaRouteProviderResult" expires_after="2027-08-01">
  <owner>jophba@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. {MediaRouteProvider}
  </summary>
  <token key="MediaRouteProvider" variants="MediaRouteProvider">
    <variant name=""/>
  </token>
</histogram>

<histogram
    name="MediaRouter.Provider.TerminateRoute.Result{MediaRouteProvider}"
    enum="MediaRouteProviderResult" expires_after="2027-08-01">
  <owner>jophba@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. {MediaRouteProvider}
  </summary>
  <token key="MediaRouteProvider" variants="MediaRouteProvider">
    <variant name=""/>
  </token>
</histogram>

<histogram name="MediaRouter.Sink.SelectedType" enum="MediaSinkType"
    expires_after="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.Android.DialogAction"
    enum="MediaRouterAndroidDialogAction" expires_after="2027-08-01">
  <owner>jophba@chromium.org</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="2027-08-01">
  <owner>jophba@chromium.org</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="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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="2027-08-01">
  <owner>jophba@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.PermissionRejectedViewAction"
    enum="MediaRouterUiPermissionRejectedViewEvents" expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Recorded when the permission rejected error is shown in the Cast/Gmc dialog
    and when users click on the system settings link in the error message.
  </summary>
</histogram>

<histogram name="MediaRouter.Ui.{DialogType}Dialog.LoadedWithData" units="ms"
    expires_after="2027-08-01">
  <owner>jophba@chromium.org</owner>
  <owner>openscreen-eng@google.com</owner>
  <summary>
    Duration in milliseconds taken from the user click to open the {DialogType}
    dialog to show available devices. Recorded only when there are discovered
    devices shown in the dialog.
  </summary>
  <token key="DialogType">
    <variant name="Cast" summary="Cast"/>
    <variant name="GMC" summary="Global Media Controls"/>
  </token>
</histogram>

<histogram name="MediaRouter.WiredDisplay.AvailableDevicesCount" units="units"
    expires_after="2027-08-01">
  <owner>jophba@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>
