Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/filters/decoder_stream_traits.h" | 5 #include "media/filters/decoder_stream_traits.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/metrics/histogram_macros.h" | |
| 8 #include "media/base/audio_buffer.h" | 9 #include "media/base/audio_buffer.h" |
| 9 #include "media/base/audio_decoder.h" | 10 #include "media/base/audio_decoder.h" |
| 10 #include "media/base/audio_decoder_config.h" | 11 #include "media/base/audio_decoder_config.h" |
| 11 #include "media/base/video_decoder.h" | 12 #include "media/base/video_decoder.h" |
| 12 #include "media/base/video_frame.h" | 13 #include "media/base/video_frame.h" |
| 13 | 14 |
| 14 namespace media { | 15 namespace media { |
| 15 | 16 |
| 16 // Audio decoder stream traits implementation. | 17 // Audio decoder stream traits implementation. |
| 17 | 18 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 96 statistics.video_bytes_decoded = bytes_decoded; | 97 statistics.video_bytes_decoded = bytes_decoded; |
| 97 statistics_cb.Run(statistics); | 98 statistics_cb.Run(statistics); |
| 98 } | 99 } |
| 99 | 100 |
| 100 // static | 101 // static |
| 101 scoped_refptr<DecoderStreamTraits<DemuxerStream::VIDEO>::OutputType> | 102 scoped_refptr<DecoderStreamTraits<DemuxerStream::VIDEO>::OutputType> |
| 102 DecoderStreamTraits<DemuxerStream::VIDEO>::CreateEOSOutput() { | 103 DecoderStreamTraits<DemuxerStream::VIDEO>::CreateEOSOutput() { |
| 103 return OutputType::CreateEOSFrame(); | 104 return OutputType::CreateEOSFrame(); |
| 104 } | 105 } |
| 105 | 106 |
| 107 // The samples count for keyframe distance average is picked arbitrarily. | |
|
DaleCurtis
2016/12/06 21:31:04
Generally just put over the variable name.
| |
| 108 DecoderStreamTraits<DemuxerStream::VIDEO>::DecoderStreamTraits( | |
| 109 const scoped_refptr<MediaLog>& media_log) | |
| 110 : keyframe_distance_average_(10) {} | |
| 111 | |
| 106 void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder( | 112 void DecoderStreamTraits<DemuxerStream::VIDEO>::InitializeDecoder( |
| 107 DecoderType* decoder, | 113 DecoderType* decoder, |
| 108 DemuxerStream* stream, | 114 DemuxerStream* stream, |
| 109 CdmContext* cdm_context, | 115 CdmContext* cdm_context, |
| 110 const InitCB& init_cb, | 116 const InitCB& init_cb, |
| 111 const OutputCB& output_cb) { | 117 const OutputCB& output_cb) { |
| 112 DCHECK(stream->video_decoder_config().IsValidConfig()); | 118 DCHECK(stream->video_decoder_config().IsValidConfig()); |
| 113 decoder->Initialize(stream->video_decoder_config(), | 119 decoder->Initialize(stream->video_decoder_config(), |
| 114 stream->liveness() == DemuxerStream::LIVENESS_LIVE, | 120 stream->liveness() == DemuxerStream::LIVENESS_LIVE, |
| 115 cdm_context, init_cb, output_cb); | 121 cdm_context, init_cb, output_cb); |
| 116 } | 122 } |
| 117 | 123 |
| 124 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnStreamReset( | |
| 125 DemuxerStream* stream) { | |
| 126 DCHECK(stream); | |
| 127 ResetMetrics(); | |
| 128 max_average_ = base::TimeDelta(); | |
| 129 } | |
| 130 | |
| 131 void DecoderStreamTraits<DemuxerStream::VIDEO>::OnDecode( | |
| 132 const scoped_refptr<DecoderBuffer>& buffer) { | |
| 133 if (!buffer) | |
| 134 return; | |
| 135 | |
| 136 if (buffer->end_of_stream()) { | |
| 137 ResetMetrics(); | |
| 138 return; | |
| 139 } | |
| 140 | |
| 141 if (!buffer->is_key_frame()) | |
| 142 return; | |
| 143 | |
| 144 base::TimeDelta current_frame_timestamp = buffer->timestamp(); | |
| 145 if (last_keyframe_timestamp_.is_zero()) { | |
| 146 last_keyframe_timestamp_ = current_frame_timestamp; | |
| 147 return; | |
| 148 } | |
| 149 | |
| 150 base::TimeDelta last_keyframe_distance = | |
| 151 current_frame_timestamp - last_keyframe_timestamp_; | |
| 152 last_keyframe_timestamp_ = current_frame_timestamp; | |
| 153 keyframe_distance_average_.AddSample(last_keyframe_distance); | |
| 154 base::TimeDelta new_average = keyframe_distance_average_.Average(); | |
| 155 if (new_average > max_average_) { | |
| 156 max_average_ = new_average; | |
| 157 UMA_HISTOGRAM_MEDIUM_TIMES("Media.Video.KeyFrameDistanceAverage", | |
| 158 new_average); | |
| 159 } | |
| 160 } | |
| 161 | |
| 162 void DecoderStreamTraits<DemuxerStream::VIDEO>::ResetMetrics() { | |
| 163 keyframe_distance_average_.Reset(); | |
| 164 last_keyframe_timestamp_ = base::TimeDelta(); | |
| 165 } | |
| 166 | |
| 118 } // namespace media | 167 } // namespace media |
| OLD | NEW |