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 ec6c7993a1464c4c1347ae0af971a8ad288d85e8..7d0076cce4be1b02a5dcb6f8091f7f142db9186c 100644 |
| --- a/media/filters/decoder_stream_traits.cc |
| +++ b/media/filters/decoder_stream_traits.cc |
| @@ -5,6 +5,7 @@ |
| #include "media/filters/decoder_stream_traits.h" |
| #include "base/logging.h" |
| +#include "base/metrics/histogram_macros.h" |
| #include "media/base/audio_buffer.h" |
| #include "media/base/audio_decoder.h" |
| #include "media/base/audio_decoder_config.h" |
| @@ -103,6 +104,11 @@ scoped_refptr<DecoderStreamTraits<DemuxerStream::VIDEO>::OutputType> |
| return OutputType::CreateEOSFrame(); |
| } |
| +// The samples count for keyframe distance average is picked arbitrarily. |
|
DaleCurtis
2016/12/06 21:31:04
Generally just put over the variable name.
|
| +DecoderStreamTraits<DemuxerStream::VIDEO>::DecoderStreamTraits( |
| + const scoped_refptr<MediaLog>& media_log) |
| + : keyframe_distance_average_(10) {} |
| + |
| void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder( |
| DecoderType* decoder, |
| DemuxerStream* stream, |
| @@ -115,4 +121,47 @@ void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder( |
| cdm_context, init_cb, output_cb); |
| } |
| +void DecoderStreamTraits<DemuxerStream::VIDEO>::OnStreamReset( |
| + DemuxerStream* stream) { |
| + DCHECK(stream); |
| + ResetMetrics(); |
| + max_average_ = base::TimeDelta(); |
| +} |
| + |
| +void DecoderStreamTraits<DemuxerStream::VIDEO>::OnDecode( |
| + const scoped_refptr<DecoderBuffer>& buffer) { |
| + if (!buffer) |
| + return; |
| + |
| + if (buffer->end_of_stream()) { |
| + ResetMetrics(); |
| + return; |
| + } |
| + |
| + if (!buffer->is_key_frame()) |
| + return; |
| + |
| + base::TimeDelta current_frame_timestamp = buffer->timestamp(); |
| + if (last_keyframe_timestamp_.is_zero()) { |
| + last_keyframe_timestamp_ = current_frame_timestamp; |
| + return; |
| + } |
| + |
| + base::TimeDelta last_keyframe_distance = |
| + current_frame_timestamp - last_keyframe_timestamp_; |
| + last_keyframe_timestamp_ = current_frame_timestamp; |
| + keyframe_distance_average_.AddSample(last_keyframe_distance); |
| + base::TimeDelta new_average = keyframe_distance_average_.Average(); |
| + if (new_average > max_average_) { |
| + max_average_ = new_average; |
| + UMA_HISTOGRAM_MEDIUM_TIMES("Media.Video.KeyFrameDistanceAverage", |
| + new_average); |
| + } |
| +} |
| + |
| +void DecoderStreamTraits<DemuxerStream::VIDEO>::ResetMetrics() { |
| + keyframe_distance_average_.Reset(); |
| + last_keyframe_timestamp_ = base::TimeDelta(); |
| +} |
| + |
| } // namespace media |