blob: 60e8ab5b257f4fcd8040e31f78f92a838619d547 [file] [log] [blame]
// Copyright 2023 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef COBALT_MEDIA_BASE_METRICS_PROVIDER_H_
#define COBALT_MEDIA_BASE_METRICS_PROVIDER_H_
#include <map>
#include <string>
#include "base/containers/small_map.h"
#include "base/time/default_tick_clock.h"
#include "base/time/tick_clock.h"
#include "base/time/time.h"
#include "media/base/audio_codecs.h"
#include "media/base/container_names.h"
#include "media/base/pipeline_status.h"
#include "media/base/timestamp_constants.h"
#include "media/base/video_codecs.h"
#include "starboard/common/mutex.h"
#include "starboard/types.h"
namespace cobalt {
namespace media {
using AudioCodec = ::media::AudioCodec;
using VideoCodec = ::media::VideoCodec;
using PipelineStatus = ::media::PipelineStatus;
using VideoDecoderType = ::media::VideoDecoderType;
enum class MediaAction : uint8_t {
UNKNOWN_ACTION,
WEBMEDIAPLAYER_SEEK,
SBPLAYER_CREATE,
SBPLAYER_CREATE_URL_PLAYER,
SBPLAYER_DESTROY,
};
class MediaMetricsProvider {
public:
MediaMetricsProvider(
const base::TickClock* clock = base::DefaultTickClock::GetInstance())
: clock_(clock) {}
~MediaMetricsProvider();
private:
struct PipelineInfo {
PipelineInfo() = default;
~PipelineInfo() = default;
bool has_ever_played = false;
bool has_reached_have_enough = false;
bool has_audio = false;
bool has_video = false;
bool is_eme = false;
bool video_decoder_changed = false;
::media::AudioCodec audio_codec;
::media::VideoCodec video_codec;
::media::PipelineStatus last_pipeline_status =
::media::PipelineStatus::PIPELINE_OK;
};
public:
// based on mojom::MediaMetricsProvider
void OnError(const ::media::PipelineStatus status);
void SetHasAudio(::media::AudioCodec audio_codec);
void SetHasVideo(::media::VideoCodec video_codec);
void SetHasPlayed();
void SetHaveEnough();
void SetIsEME();
void ReportPipelineUMA();
// Used to record the latency of an action in the WebMediaPlayer.
void StartTrackingAction(MediaAction action);
void EndTrackingAction(MediaAction action);
bool IsActionCurrentlyTracked(MediaAction action);
private:
std::string GetUMANameForAVStream(const PipelineInfo& player_info) const;
void ReportActionLatencyUMA(MediaAction action,
const base::TimeDelta& action_duration);
private:
// Media player action latency data.
const base::TickClock* clock_;
base::small_map<std::map<MediaAction, base::TimeTicks>, 5>
tracked_actions_start_times_;
// UMA pipeline packaged data
PipelineInfo uma_info_;
starboard::Mutex mutex_;
};
} // namespace media
} // namespace cobalt
#endif // COBALT_MEDIA_BASE_METRICS_PROVIDER_H_