Index: media/filters/decoder_stream_traits.cc |
diff --git a/media/filters/decoder_stream_traits.cc b/media/filters/decoder_stream_traits.cc |
index fcbc19e4baa8e7f680afb3b22f3caa0d6842a03c..a2f8c99c11b5ad97dd7d7d4796387bcfda15d2c8 100644 |
--- a/media/filters/decoder_stream_traits.cc |
+++ b/media/filters/decoder_stream_traits.cc |
@@ -4,6 +4,8 @@ |
#include "media/filters/decoder_stream_traits.h" |
+#include <limits> |
+ |
#include "base/logging.h" |
#include "base/metrics/histogram_macros.h" |
#include "media/base/audio_buffer.h" |
@@ -28,15 +30,6 @@ bool DecoderStreamTraits<DemuxerStream::AUDIO>::NeedsBitstreamConversion( |
} |
// static |
-void DecoderStreamTraits<DemuxerStream::AUDIO>::ReportStatistics( |
- const StatisticsCB& statistics_cb, |
- int bytes_decoded) { |
- PipelineStatistics statistics; |
- statistics.audio_bytes_decoded = bytes_decoded; |
- statistics_cb.Run(statistics); |
-} |
- |
-// static |
scoped_refptr<DecoderStreamTraits<DemuxerStream::AUDIO>::OutputType> |
DecoderStreamTraits<DemuxerStream::AUDIO>::CreateEOSOutput() { |
return OutputType::CreateEOSBuffer(); |
@@ -46,6 +39,14 @@ DecoderStreamTraits<DemuxerStream::AUDIO>::DecoderStreamTraits( |
const scoped_refptr<MediaLog>& media_log) |
: media_log_(media_log) {} |
+void DecoderStreamTraits<DemuxerStream::AUDIO>::ReportStatistics( |
+ const StatisticsCB& statistics_cb, |
+ int bytes_decoded) { |
+ PipelineStatistics statistics; |
+ statistics.audio_bytes_decoded = bytes_decoded; |
+ statistics_cb.Run(statistics); |
+} |
+ |
void DecoderStreamTraits<DemuxerStream::AUDIO>::InitializeDecoder( |
DecoderType* decoder, |
DemuxerStream* stream, |
@@ -90,18 +91,32 @@ bool DecoderStreamTraits<DemuxerStream::VIDEO>::NeedsBitstreamConversion( |
} |
// static |
+scoped_refptr<DecoderStreamTraits<DemuxerStream::VIDEO>::OutputType> |
+DecoderStreamTraits<DemuxerStream::VIDEO>::CreateEOSOutput() { |
+ return OutputType::CreateEOSFrame(); |
+} |
+ |
+DecoderStreamTraits<DemuxerStream::VIDEO>::DecoderStreamTraits( |
+ const scoped_refptr<MediaLog>& media_log) |
+ // Randomly selected number of samples to keep. |
+ : keyframe_distance_average_(16) {} |
+ |
void DecoderStreamTraits<DemuxerStream::VIDEO>::ReportStatistics( |
const StatisticsCB& statistics_cb, |
int bytes_decoded) { |
PipelineStatistics statistics; |
statistics.video_bytes_decoded = bytes_decoded; |
- statistics_cb.Run(statistics); |
-} |
-// static |
-scoped_refptr<DecoderStreamTraits<DemuxerStream::VIDEO>::OutputType> |
- DecoderStreamTraits<DemuxerStream::VIDEO>::CreateEOSOutput() { |
- return OutputType::CreateEOSFrame(); |
+ // Before we have enough keyframes to calculate the average distance, we will |
+ // assume the average keyframe distance is infinitely large. |
+ if (keyframe_distance_average_.count() < 3) { |
+ statistics.video_keyframe_distance_average = base::TimeDelta::Max(); |
+ } else { |
+ statistics.video_keyframe_distance_average = |
+ keyframe_distance_average_.Average(); |
+ } |
+ |
+ statistics_cb.Run(statistics); |
} |
void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder( |
@@ -120,6 +135,7 @@ void DecoderStreamTraits<DemuxerStream::VIDEO>::OnStreamReset( |
DemuxerStream* stream) { |
DCHECK(stream); |
last_keyframe_timestamp_ = base::TimeDelta(); |
+ keyframe_distance_average_.Reset(); |
} |
void DecoderStreamTraits<DemuxerStream::VIDEO>::OnDecode( |
@@ -141,10 +157,11 @@ void DecoderStreamTraits<DemuxerStream::VIDEO>::OnDecode( |
return; |
} |
- UMA_HISTOGRAM_MEDIUM_TIMES( |
- "Media.Video.KeyFrameDistance", |
- current_frame_timestamp - last_keyframe_timestamp_); |
+ base::TimeDelta frame_distance = |
+ current_frame_timestamp - last_keyframe_timestamp_; |
+ UMA_HISTOGRAM_MEDIUM_TIMES("Media.Video.KeyFrameDistance", frame_distance); |
last_keyframe_timestamp_ = current_frame_timestamp; |
+ keyframe_distance_average_.AddSample(frame_distance); |
} |
} // namespace media |