Chromium Code Reviews| 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(); |
|
DaleCurtis
2017/01/11 23:44:48
We typically use kNoTimestamp() in media for this.
whywhat
2017/01/12 00:16:32
That would be a minimum value though so we will en
DaleCurtis
2017/01/12 01:13:38
Ah, I guess that works, but anyone looking at stat
|
| + } 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 |