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. + +