1 // Copyright 2017 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef MEDIA_MOJO_SERVICES_MEDIA_METRICS_PROVIDER_H_
6 #define MEDIA_MOJO_SERVICES_MEDIA_METRICS_PROVIDER_H_
11 #include "base/time/time.h"
12 #include "media/base/container_names.h"
13 #include "media/base/pipeline_status.h"
14 #include "media/base/renderer_factory_selector.h"
15 #include "media/base/timestamp_constants.h"
16 #include "media/learning/common/learning_session.h"
17 #include "media/learning/common/value.h"
18 #include "media/mojo/mojom/media_metrics_provider.mojom.h"
19 #include "media/mojo/services/media_mojo_export.h"
20 #include "media/mojo/services/video_decode_perf_history.h"
21 #include "mojo/public/cpp/bindings/pending_receiver.h"
22 #include "services/metrics/public/cpp/ukm_source_id.h"
23 #include "third_party/abseil-cpp/absl/types/optional.h"
28 class VideoDecodePerfHistory;
30 // See mojom::MediaMetricsProvider for documentation.
31 class MEDIA_MOJO_EXPORT MediaMetricsProvider
32 : public mojom::MediaMetricsProvider {
34 enum class BrowsingMode : bool { kIncognito, kNormal };
36 enum class FrameStatus : bool { kTopFrame, kNotTopFrame };
38 using GetLearningSessionCallback =
39 base::RepeatingCallback<learning::LearningSession*()>;
41 using RecordAggregateWatchTimeCallback =
42 base::RepeatingCallback<void(base::TimeDelta total_watch_time,
43 base::TimeDelta time_stamp,
47 using GetRecordAggregateWatchTimeCallback =
48 base::RepeatingCallback<RecordAggregateWatchTimeCallback(void)>;
50 using IsShuttingDownCallback = base::RepeatingCallback<bool(void)>;
52 MediaMetricsProvider(BrowsingMode is_incognito,
53 FrameStatus is_top_frame,
54 ukm::SourceId source_id,
55 learning::FeatureValue origin,
56 VideoDecodePerfHistory::SaveCallback save_cb,
57 GetLearningSessionCallback learning_session_cb,
58 RecordAggregateWatchTimeCallback record_playback_cb,
59 IsShuttingDownCallback is_shutting_down_cb);
61 MediaMetricsProvider(const MediaMetricsProvider&) = delete;
62 MediaMetricsProvider& operator=(const MediaMetricsProvider&) = delete;
64 ~MediaMetricsProvider() override;
66 // Callback for retrieving a ukm::SourceId.
67 using GetSourceIdCallback = base::RepeatingCallback<ukm::SourceId(void)>;
69 using GetLastCommittedURLCallback =
70 base::RepeatingCallback<const GURL&(void)>;
72 // TODO(liberato): This should be from a FeatureProvider, but the way in which
73 // we attach LearningHelper more or less precludes it. Per-frame task
74 // controllers would make this easy, but we bypass that here.
75 using GetOriginCallback =
76 base::RepeatingCallback<learning::FeatureValue(void)>;
78 // Creates a MediaMetricsProvider, |perf_history| may be nullptr if perf
79 // history database recording is disabled.
81 BrowsingMode is_incognito,
82 FrameStatus is_top_frame,
83 ukm::SourceId source_id,
84 learning::FeatureValue origin,
85 VideoDecodePerfHistory::SaveCallback save_cb,
86 GetLearningSessionCallback learning_session_cb,
87 GetRecordAggregateWatchTimeCallback get_record_playback_cb,
88 IsShuttingDownCallback is_shutting_down_cb,
89 mojo::PendingReceiver<mojom::MediaMetricsProvider> receiver);
93 explicit PipelineInfo(bool is_incognito);
96 bool has_ever_played = false;
97 bool has_reached_have_enough = false;
98 bool has_audio = false;
99 bool has_video = false;
101 bool video_decoder_changed = false;
102 AudioCodec audio_codec = AudioCodec::kUnknown;
103 VideoCodec video_codec = VideoCodec::kUnknown;
104 VideoPipelineInfo video_pipeline_info;
105 AudioPipelineInfo audio_pipeline_info;
106 PipelineStatusCodes last_pipeline_status = PIPELINE_OK;
111 const mojom::MediaURLScheme url_scheme;
112 const mojom::MediaStreamType media_stream_type;
115 // mojom::MediaMetricsProvider implementation:
116 void Initialize(bool is_mse,
117 mojom::MediaURLScheme url_scheme,
118 mojom::MediaStreamType media_stream_type) override;
119 void OnError(const PipelineStatus& status) override;
120 void OnFallback(const PipelineStatus& status) override;
121 void SetAudioPipelineInfo(const AudioPipelineInfo& info) override;
122 void SetContainerName(
123 container_names::MediaContainerName container_name) override;
124 void SetRendererType(RendererType renderer_type) override;
125 void SetKeySystem(const std::string& key_system) override;
126 void SetIsHardwareSecure() override;
127 void SetHasAudio(AudioCodec audio_codec) override;
128 void SetHasPlayed() override;
129 void SetHasVideo(VideoCodec video_codec) override;
130 void SetHaveEnough() override;
131 void SetIsEME() override;
132 void SetTimeToMetadata(base::TimeDelta elapsed) override;
133 void SetTimeToFirstFrame(base::TimeDelta elapsed) override;
134 void SetTimeToPlayReady(base::TimeDelta elapsed) override;
135 void SetVideoPipelineInfo(const VideoPipelineInfo& info) override;
137 void AcquireWatchTimeRecorder(
138 mojom::PlaybackPropertiesPtr properties,
139 mojo::PendingReceiver<mojom::WatchTimeRecorder> receiver) override;
140 void AcquireVideoDecodeStatsRecorder(
141 mojo::PendingReceiver<mojom::VideoDecodeStatsRecorder> receiver) override;
142 void AcquirePlaybackEventsRecorder(
143 mojo::PendingReceiver<mojom::PlaybackEventsRecorder> receiver) override;
144 void AcquireLearningTaskController(
145 const std::string& taskName,
146 mojo::PendingReceiver<learning::mojom::LearningTaskController> receiver)
149 void ReportPipelineUMA();
150 std::string GetUMANameForAVStream(const PipelineInfo& player_info);
152 bool IsInitialized() const;
154 // Session unique ID which maps to a given WebMediaPlayerImpl instances. Used
155 // to coordinate multiply logged events with a singly logged metric.
156 const uint64_t player_id_;
158 // Are UKM reports for the main frame or for a subframe?
159 const bool is_top_frame_;
161 const ukm::SourceId source_id_;
162 const learning::FeatureValue origin_;
164 const VideoDecodePerfHistory::SaveCallback save_cb_;
165 const GetLearningSessionCallback learning_session_cb_;
166 const RecordAggregateWatchTimeCallback record_playback_cb_;
167 const IsShuttingDownCallback is_shutting_down_cb_;
169 // UMA pipeline packaged data
170 PipelineInfo uma_info_;
172 // The values below are only set if `Initialize` has been called.
173 absl::optional<MediaInfo> media_info_;
175 RendererType renderer_type_ = RendererType::kRendererImpl;
176 std::string key_system_;
177 bool is_hardware_secure_ = false;
179 base::TimeDelta time_to_metadata_ = kNoTimestamp;
180 base::TimeDelta time_to_first_frame_ = kNoTimestamp;
181 base::TimeDelta time_to_play_ready_ = kNoTimestamp;
183 absl::optional<container_names::MediaContainerName> container_name_;
188 #endif // MEDIA_MOJO_SERVICES_MEDIA_METRICS_PROVIDER_H_