1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100

media / mojo / mojom / watch_time_recorder.mojom [blame]

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

module media.mojom;

import "media/mojo/mojom/media_types.mojom";
import "mojo/public/mojom/base/time.mojom";
import "ui/gfx/geometry/mojom/geometry.mojom";

// Structure describing immutable properties for the current watch time report.
// If any of these properties change a new WatchTimeRecorder will be requested.
struct PlaybackProperties {
  bool has_audio;
  bool has_video;
  bool is_background;  // Is report for playback in the background?
  bool is_muted;       // Is report for muted playback?
  bool is_mse;
  bool is_eme;
  bool is_embedded_media_experience;  // Playback from 'Downloads' on Android.
  // Type of played-back MediaStream, or kNone if the playback is not from a
  // MediaStream.
  MediaStreamType media_stream_type;
  RendererType renderer_type;
};

// Structure describing mutable properties for the current watch time report.
// The WatchTimeRecorder will use changes of these properties only for UKM
// reporting and will not interrupt UMA reporting for changes.
struct SecondaryPlaybackProperties {
  AudioCodec audio_codec;  // Note: We may not know the codec during all
  VideoCodec video_codec;  // playbacks (HLS, remoting, etc).
  AudioCodecProfile audio_codec_profile;
  VideoCodecProfile video_codec_profile;
  AudioDecoderType audio_decoder;
  VideoDecoderType video_decoder;
  EncryptionScheme audio_encryption_scheme;
  EncryptionScheme video_encryption_scheme;
  gfx.mojom.Size natural_size;  // Size of video frame; (0, 0) if audio only.
};

// Interface by which the WatchTimeReporter reports watch time. This is used to
// cache the reported values in a process without fast shutdown since we would
// otherwise lose watch time data. See the WatchTimeReporter for more details on
// how and when watch time is reported.
//
// Values will be recorded to UMA and UKM upon requesting finalization or the
// destruction of the WatchTimeRecorder binding.
//
// Note: Not all values recorded by UKM are recorded by UMA. See implementations
// for more details; specifically WatchTimeRecorder::ShouldReportToUma().
//
// Note: There are some UMA values that the WatchTimeRecorder will generate
// based on the recorded keys and values. Such metrics will only be generated
// when finalizing everything via FinalizeWatchTime({}) or destruction.
//
// Note: UKM metrics are only reported upon destruction of the recorder.
interface WatchTimeRecorder {
  // Reports |watch_time| for |key|. Note this should be an absolute value and
  // not a delta since the last call. Any necessary relative processing should
  // be handled prior to calling this method. As described in WatchTimeReporter,
  // |watch_time| is the elapsed media (not wall clock) time for |key|.
  RecordWatchTime(WatchTimeKey key, mojo_base.mojom.TimeDelta watch_time);

  // Request finalization (recording to UMA) for the given keys. If no keys are
  // specified, all currently held keys will be finalized.
  FinalizeWatchTime(array<WatchTimeKey> watch_time_keys);

  // Called when a playback ends in error. The status is reported to UKM when
  // finalizing UKM watch time.
  OnError(PipelineStatus status);

  // Updates properties that the recorder will create a new UKM BasicPlayback
  // record for, but for which UMA will continue accruing.
  UpdateSecondaryProperties(SecondaryPlaybackProperties secondary_properties);

  // Lazily sets the autoplay status of the player. Must not be called multiple
  // times with different values.
  //
  // Note: this is using a setter because the status is only known when playback
  // starts but the reporter is created before.
  SetAutoplayInitiated(bool value);

  // Updates the duration maintained by the recorder. May be called any number
  // of times during playback. Duration is rounded to the most significant digit
  // when greater than 1 second for privacy protection. E.g., 14s will become
  // 10s, and 15s will become 20s. May be called any number of times.
  OnDurationChanged(mojo_base.mojom.TimeDelta duration);

  // Updates the total number of frames decoded and dropped. As with other
  // values, these are absolute and not relative since the last call.
  UpdateVideoDecodeStats(uint32 frames_decoded, uint32 frames_dropped);

  // Indicates that an underflow event has occurred while collecting watch time.
  // Used to report mean values for rebuffering metrics. As with watch time,
  // this is an absolute count and not relative since the last call.
  UpdateUnderflowCount(int32 total_count);
  UpdateUnderflowDuration(int32 total_completed_count,
                          mojo_base.mojom.TimeDelta total_duration);
};