Chromium Code Reviews| Index: media/filters/decoder_stream.cc |
| diff --git a/media/filters/decoder_stream.cc b/media/filters/decoder_stream.cc |
| index 495fec15680f9a744280f0f2e26263557ede4f42..0f32494d5cc70f9428e94177d52e6d294fb89fea 100644 |
| --- a/media/filters/decoder_stream.cc |
| +++ b/media/filters/decoder_stream.cc |
| @@ -42,12 +42,41 @@ 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(); |
| +} |
| + |
| +// This silly method (and its specialization) convinces the compiler that we |
|
DaleCurtis
2016/06/22 01:19:24
Are these still necessary?
chcunningham
2016/06/23 23:39:52
Removed
|
| +// won't try to cast a VideoFrame to an AudioBuffer when passing to the |
| +// AudioTimestampValidator. |
| +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, |
| 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 +139,8 @@ void DecoderStream<StreamType>::Initialize( |
| waiting_for_decryption_key_cb_ = waiting_for_decryption_key_cb; |
| stream_ = stream; |
| + traits_.OnStreamReset(GetConfig<Config>(stream_)); |
| + |
| state_ = STATE_INITIALIZING; |
| SelectDecoder(cdm_context); |
| } |
| @@ -165,6 +196,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 +277,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 +392,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 +459,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 +522,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 +724,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()), |