diff --git a/cobalt/media/base/metrics_provider.cc b/cobalt/media/base/metrics_provider.cc
index b6b4d72a591..6184f0c4481 100644
--- a/cobalt/media/base/metrics_provider.cc
+++ b/cobalt/media/base/metrics_provider.cc
@@ -122,6 +122,20 @@ void MediaMetricsProvider::EndTrackingAction(MediaAction action) {
tracked_actions_start_times_.erase(action);
}
+void MediaMetricsProvider::EndTrackingAction(MediaAction action,
+ int number_of_samples) {
+ DCHECK(IsActionCurrentlyTracked(action));
+ base::AutoLock scoped_lock(mutex_);
+
+ auto duration = clock_->NowTicks() - tracked_actions_start_times_[action];
+ if (number_of_samples > 0) {
+ // Report latency UMA if it writes non-zero samples.
+ auto duration_per_sample = duration / number_of_samples;
+ ReportActionLatencyUMA(action, duration_per_sample);
+ }
+ tracked_actions_start_times_.erase(action);
+}
+
bool MediaMetricsProvider::IsActionCurrentlyTracked(MediaAction action) {
base::AutoLock scoped_lock(mutex_);
return tracked_actions_start_times_.find(action) !=
@@ -151,6 +165,18 @@ void MediaMetricsProvider::ReportActionLatencyUMA(
UMA_HISTOGRAM_TIMES("Cobalt.Media.SbPlayer.Destroy.LatencyTiming",
action_duration);
break;
+ case MediaAction::SBPLAYER_WRITE_SAMPLES_AUDIO:
+ UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
+ "Cobalt.Media.SbPlayer.WriteSamples.Audio.LatencyTiming",
+ action_duration, base::TimeDelta::FromMicroseconds(1),
+ base::TimeDelta::FromMilliseconds(100), 50);
+ break;
+ case MediaAction::SBPLAYER_WRITE_SAMPLES_VIDEO:
+ UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
+ "Cobalt.Media.SbPlayer.WriteSamples.Video.LatencyTiming",
+ action_duration, base::TimeDelta::FromMicroseconds(1),
+ base::TimeDelta::FromMilliseconds(100), 50);
+ break;
case MediaAction::SBDRM_DESTROY:
UMA_HISTOGRAM_CUSTOM_MICROSECONDS_TIMES(
"Cobalt.Media.SbDrm.Destroy.LatencyTiming", action_duration,
diff --git a/cobalt/media/base/metrics_provider.h b/cobalt/media/base/metrics_provider.h
index 56a5c8328f0..2bf2f5a2b35 100644
--- a/cobalt/media/base/metrics_provider.h
+++ b/cobalt/media/base/metrics_provider.h
@@ -44,6 +44,8 @@ enum class MediaAction : uint8_t {
SBPLAYER_CREATE,
SBPLAYER_CREATE_URL_PLAYER,
SBPLAYER_DESTROY,
+ SBPLAYER_WRITE_SAMPLES_AUDIO,
+ SBPLAYER_WRITE_SAMPLES_VIDEO,
SBDRM_DESTROY,
SBDRM_GENERATE_SESSION_UPDATE_REQUEST,
SBDRM_UPDATE_SESSION,
@@ -87,6 +89,7 @@ class MediaMetricsProvider {
// Used to record the latency of an action in the WebMediaPlayer.
void StartTrackingAction(MediaAction action);
void EndTrackingAction(MediaAction action);
+ void EndTrackingAction(MediaAction action, int number_of_samples);
bool IsActionCurrentlyTracked(MediaAction action);
void Reset();
diff --git a/cobalt/media/base/metrics_provider_test.cc b/cobalt/media/base/metrics_provider_test.cc
index 46a5470605f..78f043bf0b6 100644
--- a/cobalt/media/base/metrics_provider_test.cc
+++ b/cobalt/media/base/metrics_provider_test.cc
@@ -94,6 +94,28 @@ TEST_F(MediaMetricsProviderTest, SbPlayerDestroy) {
std::string(kUmaPrefix) + "SbPlayer.Destroy.LatencyTiming", 100, 1);
}
+TEST_F(MediaMetricsProviderTest, SbPlayerWriteSamplesAudio) {
+ metrics_.StartTrackingAction(MediaAction::SBPLAYER_WRITE_SAMPLES_AUDIO);
+
+ clock_.Advance(base::TimeDelta::FromMicroseconds(570));
+ metrics_.EndTrackingAction(MediaAction::SBPLAYER_WRITE_SAMPLES_AUDIO);
+
+ histogram_tester_.ExpectUniqueSample(
+ std::string(kUmaPrefix) + "SbPlayer.WriteSamples.Audio.LatencyTiming",
+ 570, 1);
+}
+
+TEST_F(MediaMetricsProviderTest, SbPlayerWriteSamplesVideoAudio) {
+ metrics_.StartTrackingAction(MediaAction::SBPLAYER_WRITE_SAMPLES_VIDEO);
+
+ clock_.Advance(base::TimeDelta::FromMicroseconds(570));
+ metrics_.EndTrackingAction(MediaAction::SBPLAYER_WRITE_SAMPLES_VIDEO);
+
+ histogram_tester_.ExpectUniqueSample(
+ std::string(kUmaPrefix) + "SbPlayer.WriteSamples.Video.LatencyTiming",
+ 570, 1);
+}
+
TEST_F(MediaMetricsProviderTest, SbDrmCloseSession) {
metrics_.StartTrackingAction(MediaAction::SBDRM_CLOSE_SESSION);
diff --git a/cobalt/media/base/sbplayer_interface.cc b/cobalt/media/base/sbplayer_interface.cc
index ec7b76d1acc..c854e1b241b 100644
--- a/cobalt/media/base/sbplayer_interface.cc
+++ b/cobalt/media/base/sbplayer_interface.cc
@@ -106,6 +106,10 @@ void DefaultSbPlayerInterface::WriteSamples(
SbPlayer player, SbMediaType sample_type,
const SbPlayerSampleInfo* sample_infos, int number_of_sample_infos) {
DCHECK(!IsEnhancedAudioExtensionEnabled());
+ auto media_action = (sample_type == kSbMediaTypeAudio)
+ ? MediaAction::SBPLAYER_WRITE_SAMPLES_AUDIO
+ : MediaAction::SBPLAYER_WRITE_SAMPLES_VIDEO;
+ media_metrics_provider_.StartTrackingAction(media_action);
#if SB_API_VERSION >= 15
SbPlayerWriteSamples(player, sample_type, sample_infos,
number_of_sample_infos);
@@ -113,6 +117,8 @@ void DefaultSbPlayerInterface::WriteSamples(
SbPlayerWriteSample2(player, sample_type, sample_infos,
number_of_sample_infos);
#endif // SB_API_VERSION >= 15
+ media_metrics_provider_.EndTrackingAction(media_action,
+ number_of_sample_infos);
}
void DefaultSbPlayerInterface::WriteSamples(
diff --git a/tools/metrics/histograms/metadata/cobalt/histograms.xml b/tools/metrics/histograms/metadata/cobalt/histograms.xml
index 1cc9ae95c45..5a6319ad3ed 100644
--- a/tools/metrics/histograms/metadata/cobalt/histograms.xml
+++ b/tools/metrics/histograms/metadata/cobalt/histograms.xml
@@ -338,6 +338,24 @@ Always run the pretty print utility on this file after editing:
Timing data for the destruction of SbPlayer.
+
+
+
+ borongchen@google.com
+ cobalt-team@google.com
+ Timing data for writing single audio sample.
+
+
+
+
+
+ borongchen@google.com
+ cobalt-team@google.com
+ Timing data for writing single video sample.
+
+