Index: media/filters/decoder_stream.cc |
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc |
index 039b2b95f2276517e89902fc4815227d040b6cd4..55fad6c4406f53c3c5dc56fcbf0ae8e6c65aeaab 100644 |
--- a/media/filters/decoder_stream.cc |
+++ b/media/filters/decoder_stream.cc |
@@ -42,6 +42,16 @@ const char* GetTraceString<DemuxerStream::AUDIO>() { |
return "DecoderStream<AUDIO>::Decode"; |
} |
+template <typename T> |
+AudioBuffer* GetAudioBuffer(T* buffer_ptr) { |
+ return nullptr; |
+} |
+ |
+template <> |
+AudioBuffer* GetAudioBuffer<>(AudioBuffer* buffer_ptr) { |
+ return buffer_ptr; |
+} |
+ |
template <DemuxerStream::Type StreamType> |
DecoderStream<StreamType>::DecoderStream( |
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
@@ -110,6 +120,11 @@ void DecoderStream<StreamType>::Initialize( |
waiting_for_decryption_key_cb_ = waiting_for_decryption_key_cb; |
stream_ = stream; |
+ if (DecoderStreamTraits<StreamType>::kShouldValidateTimestamps) { |
+ audio_ts_validator_.reset(new AudioTimestampValidator( |
+ stream_->audio_decoder_config(), media_log_)); |
+ } |
+ |
state_ = STATE_INITIALIZING; |
SelectDecoder(cdm_context); |
} |
@@ -166,6 +181,11 @@ void DecoderStream<StreamType>::Reset(const base::Closure& closure) { |
ready_outputs_.clear(); |
+ if (DecoderStreamTraits<StreamType>::kShouldValidateTimestamps) { |
+ audio_ts_validator_.reset(new AudioTimestampValidator( |
+ stream_->audio_decoder_config(), media_log_)); |
+ } |
+ |
// It's possible to have received a DECODE_ERROR and entered STATE_ERROR right |
// before a Reset() is executed. If we are still waiting for a demuxer read, |
// OnBufferReady() will handle the reset callback. |
@@ -348,6 +368,9 @@ void DecoderStream<StreamType>::DecodeInternal( |
DCHECK(reset_cb_.is_null()); |
DCHECK(buffer.get()); |
+ if (DecoderStreamTraits<StreamType>::kShouldValidateTimestamps) |
+ audio_ts_validator_->CheckForTimestampGap(buffer); |
+ |
int buffer_size = buffer->end_of_stream() ? 0 : buffer->data_size(); |
TRACE_EVENT_ASYNC_BEGIN2( |
@@ -476,6 +499,16 @@ void DecoderStream<StreamType>::OnDecodeOutputReady( |
if (!reset_cb_.is_null()) |
return; |
+ if (DecoderStreamTraits<StreamType>::kShouldValidateTimestamps) { |
+ // error: static_cast from 'media::VideoFrame *' to 'media::AudioBuffer *', |
chcunningham
2016/05/27 21:35:05
This comment is just for CR discussion. I was surp
|
+ // which are not related by inheritance, is not allowed |
+ // if (output.get()) { |
+ // AudioBuffer* audio_buffer = static_cast<AudioBuffer*>(output.get()); |
+ // audio_ts_validator_->RecordOutputDuration(audio_buffer); |
+ // } |
+ audio_ts_validator_->RecordOutputDuration(GetAudioBuffer(output.get())); |
+ } |
+ |
++decoded_frames_since_fallback_; |
// |decoder_| sucessfully decoded a frame. No need to keep buffers for a |