Index: media/filters/decoder_stream.cc |
diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc |
index 495fec15680f9a744280f0f2e26263557ede4f42..d03bdea9965a09be610ddc6435bf4f5b0dba1952 100644 |
--- a/media/filters/decoder_stream.cc |
+++ b/media/filters/decoder_stream.cc |
@@ -42,12 +42,28 @@ const char* GetTraceString<DemuxerStream::AUDIO>() { |
return "DecoderStream<AUDIO>::Decode"; |
} |
+template <typename ConfigType> |
+ConfigType GetConfig(DemuxerStream* stream) { |
+ return nullptr; |
+} |
+ |
+template <> |
+AudioDecoderConfig GetConfig(DemuxerStream* stream) { |
+ return stream->audio_decoder_config(); |
+} |
+ |
+template <> |
+VideoDecoderConfig GetConfig(DemuxerStream* stream) { |
+ return stream->video_decoder_config(); |
+} |
+ |
template <DemuxerStream::Type StreamType> |
DecoderStream<StreamType>::DecoderStream( |
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
ScopedVector<Decoder> decoders, |
const scoped_refptr<MediaLog>& media_log) |
- : task_runner_(task_runner), |
+ : traits_(media_log), |
+ task_runner_(task_runner), |
media_log_(media_log), |
state_(STATE_UNINITIALIZED), |
stream_(NULL), |
@@ -110,6 +126,8 @@ void DecoderStream<StreamType>::Initialize( |
waiting_for_decryption_key_cb_ = waiting_for_decryption_key_cb; |
stream_ = stream; |
+ traits_.OnStreamReset(GetConfig<Config>(stream_)); |
DaleCurtis
2016/06/24 00:11:29
Why was GetConfig() necessary again? Seems like yo
chcunningham
2016/06/24 01:56:34
We chatted. Documenting for posterity:
I disliked
|
+ |
state_ = STATE_INITIALIZING; |
SelectDecoder(cdm_context); |
} |
@@ -165,6 +183,7 @@ void DecoderStream<StreamType>::Reset(const base::Closure& closure) { |
} |
ready_outputs_.clear(); |
+ traits_.OnStreamReset(GetConfig<Config>(stream_)); |
// 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, |
@@ -245,7 +264,7 @@ base::TimeDelta DecoderStream<StreamType>::AverageDuration() const { |
template <DemuxerStream::Type StreamType> |
void DecoderStream<StreamType>::SelectDecoder(CdmContext* cdm_context) { |
decoder_selector_->SelectDecoder( |
- stream_, cdm_context, |
+ &traits_, stream_, cdm_context, |
base::Bind(&DecoderStream<StreamType>::OnDecoderSelected, |
weak_factory_.GetWeakPtr()), |
base::Bind(&DecoderStream<StreamType>::OnDecodeOutputReady, |
@@ -360,6 +379,8 @@ void DecoderStream<StreamType>::DecodeInternal( |
DCHECK(reset_cb_.is_null()); |
DCHECK(buffer.get()); |
+ traits_.OnDecode(buffer); |
+ |
int buffer_size = buffer->end_of_stream() ? 0 : buffer->data_size(); |
TRACE_EVENT_ASYNC_BEGIN2( |
@@ -425,7 +446,7 @@ void DecoderStream<StreamType>::OnDecodeDone(int buffer_size, |
state_ = STATE_REINITIALIZING_DECODER; |
decoder_selector_->SelectDecoder( |
- stream_, nullptr, |
+ &traits_, stream_, nullptr, |
base::Bind(&DecoderStream<StreamType>::OnDecoderSelected, |
weak_factory_.GetWeakPtr()), |
base::Bind(&DecoderStream<StreamType>::OnDecodeOutputReady, |
@@ -488,6 +509,8 @@ void DecoderStream<StreamType>::OnDecodeOutputReady( |
if (!reset_cb_.is_null()) |
return; |
+ traits_.OnDecodeDone(output); |
+ |
++decoded_frames_since_fallback_; |
// |decoder_| sucessfully decoded a frame. No need to keep buffers for a |
@@ -688,7 +711,7 @@ void DecoderStream<StreamType>::ReinitializeDecoder() { |
state_ = STATE_REINITIALIZING_DECODER; |
// Decoders should not need a new CDM during reinitialization. |
- DecoderStreamTraits<StreamType>::InitializeDecoder( |
+ traits_.InitializeDecoder( |
decoder_.get(), stream_, nullptr, |
base::Bind(&DecoderStream<StreamType>::OnDecoderReinitialized, |
weak_factory_.GetWeakPtr()), |