1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/filters/decoder_stream.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/callback_helpers.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/debug/trace_event.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/location.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/logging.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/single_thread_task_runner.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/base/audio_decoder.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/bind_to_current_loop.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/decoder_buffer.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/demuxer_stream.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/base/video_decoder.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/filters/decrypting_demuxer_stream.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media { 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// TODO(rileya): Devise a better way of specifying trace/UMA/etc strings for 23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// templated classes such as this. 24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)static const char* GetTraceString(); 26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define FUNCTION_DVLOG(level) \ 2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) DVLOG(level) << __FUNCTION__ << \ 2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) "<" << DecoderStreamTraits<StreamType>::ToString() << ">" 3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <> 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char* GetTraceString<DemuxerStream::VIDEO>() { 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "DecoderStream<VIDEO>::Decode"; 34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <> 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char* GetTraceString<DemuxerStream::AUDIO>() { 38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return "DecoderStream<AUDIO>::Decode"; 39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DecoderStream<StreamType>::DecoderStream( 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ScopedVector<Decoder> decoders, 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const SetDecryptorReadyCB& set_decryptor_ready_cb, 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<MediaLog>& media_log) 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : task_runner_(task_runner), 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_(media_log), 49868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) state_(STATE_UNINITIALIZED), 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream_(NULL), 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) low_delay_(false), 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_selector_( 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new DecoderSelector<StreamType>(task_runner, 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoders.Pass(), 5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) set_decryptor_ready_cb)), 560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch active_splice_(false), 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoding_eos_(false), 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) pending_decode_requests_(0), 5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) weak_factory_(this) {} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DecoderStream<StreamType>::~DecoderStream() { 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FUNCTION_DVLOG(2); 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(task_runner_->BelongsToCurrentThread()); 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch decoder_selector_.reset(); 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!init_cb_.is_null()) { 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch task_runner_->PostTask(FROM_HERE, 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(base::ResetAndReturn(&init_cb_), false)); 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!read_cb_.is_null()) { 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch task_runner_->PostTask(FROM_HERE, base::Bind( 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::ResetAndReturn(&read_cb_), ABORTED, scoped_refptr<Output>())); 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!reset_cb_.is_null()) 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch task_runner_->PostTask(FROM_HERE, base::ResetAndReturn(&reset_cb_)); 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch stream_ = NULL; 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch decoder_.reset(); 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch decrypting_demuxer_stream_.reset(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::Initialize(DemuxerStream* stream, 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool low_delay, 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const StatisticsCB& statistics_cb, 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const InitCB& init_cb) { 8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 91868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(state_, STATE_UNINITIALIZED) << state_; 92868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(init_cb_.is_null()); 93868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!init_cb.is_null()); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) statistics_cb_ = statistics_cb; 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) init_cb_ = init_cb; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream_ = stream; 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu low_delay_ = low_delay; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) state_ = STATE_INITIALIZING; 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(xhwang): DecoderSelector only needs a config to select a decoder. 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) decoder_selector_->SelectDecoder( 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu stream, low_delay, 104a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&DecoderStream<StreamType>::OnDecoderSelected, 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) weak_factory_.GetWeakPtr()), 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&DecoderStream<StreamType>::OnDecodeOutputReady, 1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) weak_factory_.GetWeakPtr())); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::Read(const ReadCB& read_cb) { 11223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(state_ != STATE_UNINITIALIZED && state_ != STATE_INITIALIZING) 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch << state_; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No two reads in the flight at any time. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(read_cb_.is_null()); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // No read during resetting or stopping process. 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(reset_cb_.is_null()); 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 121868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (state_ == STATE_ERROR) { 1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) task_runner_->PostTask( 1236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FROM_HERE, base::Bind(read_cb, DECODE_ERROR, scoped_refptr<Output>())); 1246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 1276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (state_ == STATE_END_OF_STREAM && ready_outputs_.empty()) { 1286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) task_runner_->PostTask( 1296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FROM_HERE, base::Bind(read_cb, OK, StreamTraits::CreateEOSOutput())); 130868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!ready_outputs_.empty()) { 1346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) task_runner_->PostTask(FROM_HERE, 1356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) base::Bind(read_cb, OK, ready_outputs_.front())); 136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ready_outputs_.pop_front(); 1376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } else { 1386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) read_cb_ = read_cb; 139010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 1407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (state_ == STATE_NORMAL && CanDecodeMore()) 142010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReadFromDemuxerStream(); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 145a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::Reset(const base::Closure& closure) { 14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(state_ != STATE_UNINITIALIZED)<< state_; 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(reset_cb_.is_null()); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) reset_cb_ = closure; 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!read_cb_.is_null()) { 155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) task_runner_->PostTask(FROM_HERE, base::Bind( 156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::ResetAndReturn(&read_cb_), ABORTED, scoped_refptr<Output>())); 157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ready_outputs_.clear(); 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 161a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // During decoder reinitialization, the Decoder does not need to be and 1627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // cannot be Reset(). |decrypting_demuxer_stream_| was reset before decoder 163868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // reinitialization. 1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (state_ == STATE_REINITIALIZING_DECODER) 1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return; 1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // During pending demuxer read and when not using DecryptingDemuxerStream, 168a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the Decoder will be reset after demuxer read is returned 1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // (in OnBufferReady()). 1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (state_ == STATE_PENDING_DEMUXER_READ && !decrypting_demuxer_stream_) 171868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 172868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decrypting_demuxer_stream_) { 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) decrypting_demuxer_stream_->Reset(base::Bind( 175a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) &DecoderStream<StreamType>::ResetDecoder, weak_factory_.GetWeakPtr())); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ResetDecoder(); 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool DecoderStream<StreamType>::CanReadWithoutStalling() const { 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return !ready_outputs_.empty() || decoder_->CanReadWithoutStalling(); 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 188a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <> 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool DecoderStream<DemuxerStream::AUDIO>::CanReadWithoutStalling() const { 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return true; 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)int DecoderStream<StreamType>::GetMaxDecodeRequests() const { 196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return decoder_->GetMaxDecodeRequests(); 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <> 200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)int DecoderStream<DemuxerStream::AUDIO>::GetMaxDecodeRequests() const { 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return 1; 202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <DemuxerStream::Type StreamType> 205010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool DecoderStream<StreamType>::CanDecodeMore() const { 206010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 207010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 208010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Limit total number of outputs stored in |ready_outputs_| and being decoded. 209010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // It only makes sense to saturate decoder completely when output queue is 210010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // empty. 211010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) int num_decodes = 212010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<int>(ready_outputs_.size()) + pending_decode_requests_; 2131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return !decoding_eos_ && num_decodes < GetMaxDecodeRequests(); 214010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 215010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 216010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)template <DemuxerStream::Type StreamType> 217a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::OnDecoderSelected( 218a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<Decoder> selected_decoder, 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<DecryptingDemuxerStream> decrypting_demuxer_stream) { 22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(state_, STATE_INITIALIZING) << state_; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!init_cb_.is_null()); 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(read_cb_.is_null()); 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(reset_cb_.is_null()); 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) decoder_selector_.reset(); 228a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (decrypting_demuxer_stream) 229a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) stream_ = decrypting_demuxer_stream.get(); 2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!selected_decoder) { 232868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) state_ = STATE_UNINITIALIZED; 23303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::ResetAndReturn(&init_cb_).Run(false); 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 237116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch state_ = STATE_NORMAL; 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch decoder_ = selected_decoder.Pass(); 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch decrypting_demuxer_stream_ = decrypting_demuxer_stream.Pass(); 24003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string stream_type = DecoderStreamTraits<StreamType>::ToString(); 2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_->SetBooleanProperty((stream_type + "_dds").c_str(), 2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decrypting_demuxer_stream_); 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_log_->SetStringProperty((stream_type + "_decoder").c_str(), 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoder_->GetDisplayName()); 2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 24703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (StreamTraits::NeedsBitstreamConversion(decoder_.get())) 24803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) stream_->EnableBitstreamConverter(); 24903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) base::ResetAndReturn(&init_cb_).Run(true); 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 252a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::SatisfyRead( 254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Status status, 255a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const scoped_refptr<Output>& output) { 2567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(!read_cb_.is_null()); 257a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::ResetAndReturn(&read_cb_).Run(status, output); 2587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 260a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::Decode( 262a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const scoped_refptr<DecoderBuffer>& buffer) { 26323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 2647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER) << state_; 265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK_LT(pending_decode_requests_, GetMaxDecodeRequests()); 2667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(reset_cb_.is_null()); 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(buffer.get()); 2687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 269ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch int buffer_size = buffer->end_of_stream() ? 0 : buffer->data_size(); 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 271a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TRACE_EVENT_ASYNC_BEGIN0("media", GetTraceString<StreamType>(), this); 2721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (buffer->end_of_stream()) 2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoding_eos_ = true; 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 276010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ++pending_decode_requests_; 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_->Decode(buffer, 278f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&DecoderStream<StreamType>::OnDecodeDone, 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_factory_.GetWeakPtr(), 280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) buffer_size, 281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) buffer->end_of_stream())); 2827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 285a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::FlushDecoder() { 286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Decode(DecoderBuffer::CreateEOSBuffer()); 2877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 289a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DecoderStream<StreamType>::OnDecodeDone(int buffer_size, 291f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool end_of_stream, 292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) typename Decoder::Status status) { 293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) FUNCTION_DVLOG(2) << status; 294010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER || 295010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR) 296010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << state_; 297010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_GT(pending_decode_requests_, 0); 298010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 299010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) --pending_decode_requests_; 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 301a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) TRACE_EVENT_ASYNC_END0("media", GetTraceString<StreamType>(), this); 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (end_of_stream) 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci decoding_eos_ = false; 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 306010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (state_ == STATE_ERROR) { 307010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(read_cb_.is_null()); 308010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 309010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 310010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 311f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Drop decoding result if Reset() was called during decoding. 312f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // The resetting process will be handled when the decoder is reset. 313f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!reset_cb_.is_null()) 314558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch return; 315558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch 316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) switch (status) { 317f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case Decoder::kDecodeError: 318f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case Decoder::kDecryptError: 319f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) state_ = STATE_ERROR; 320f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ready_outputs_.clear(); 321f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!read_cb_.is_null()) 322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SatisfyRead(DECODE_ERROR, NULL); 3236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 325f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case Decoder::kAborted: 326f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Decoder can return kAborted only when Reset is pending. 327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) NOTREACHED(); 3286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 329f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) case Decoder::kOk: 331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Any successful decode counts! 3326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (buffer_size > 0) 333f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StreamTraits::ReportStatistics(statistics_cb_, buffer_size); 334f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (state_ == STATE_NORMAL) { 3366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (end_of_stream) { 3376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) state_ = STATE_END_OF_STREAM; 3386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (ready_outputs_.empty() && !read_cb_.is_null()) 3396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SatisfyRead(OK, StreamTraits::CreateEOSOutput()); 3406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 3416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) } 3426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (CanDecodeMore()) 344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ReadFromDemuxerStream(); 3456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 3476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 3486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (state_ == STATE_FLUSHING_DECODER && !pending_decode_requests_) 3496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ReinitializeDecoder(); 3506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 351868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 353868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <DemuxerStream::Type StreamType> 355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DecoderStream<StreamType>::OnDecodeOutputReady( 356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const scoped_refptr<Output>& output) { 3576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FUNCTION_DVLOG(2) << ": " << output->timestamp().InMilliseconds() << " ms"; 3581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(output.get()); 3596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) DCHECK(!output->end_of_stream()); 360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER || 361f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR) 362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << state_; 363a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (state_ == STATE_ERROR) { 365f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(read_cb_.is_null()); 366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 3677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 3687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Drop decoding result if Reset() was called during decoding. 3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // The resetting process will be handled when the decoder is reset. 371010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!reset_cb_.is_null()) 372868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 373868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 374f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // TODO(xhwang): VideoDecoder doesn't need to return EOS after it's flushed. 375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // Fix all decoders and remove this block. 376010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Store decoded output. 377010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ready_outputs_.push_back(output); 378010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 3796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) if (read_cb_.is_null()) 3806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return; 3816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 382010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Satisfy outstanding read request, if any. 3836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) scoped_refptr<Output> read_result = ready_outputs_.front(); 3846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) ready_outputs_.pop_front(); 3856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) SatisfyRead(OK, output); 3867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::ReadFromDemuxerStream() { 39023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 3917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK_EQ(state_, STATE_NORMAL) << state_; 392010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(CanDecodeMore()); 3937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(reset_cb_.is_null()); 3947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 3957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch state_ = STATE_PENDING_DEMUXER_READ; 396a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) stream_->Read(base::Bind(&DecoderStream<StreamType>::OnBufferReady, 397a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_factory_.GetWeakPtr())); 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 400a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 401a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::OnBufferReady( 402868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DemuxerStream::Status status, 403868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const scoped_refptr<DecoderBuffer>& buffer) { 4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) FUNCTION_DVLOG(2) << ": " << status << ", " 4051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << (buffer.get() ? buffer->AsHumanReadableString() 4061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci : "NULL"); 4076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 4085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(state_ == STATE_PENDING_DEMUXER_READ || state_ == STATE_ERROR) 410010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) << state_; 411868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(buffer.get() != NULL, status == DemuxerStream::kOk) << status; 4127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 413010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Decoding has been stopped (e.g due to an error). 414010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (state_ != STATE_PENDING_DEMUXER_READ) { 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(state_ == STATE_ERROR); 416010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK(read_cb_.is_null()); 417010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 418010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 419010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 4207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch state_ = STATE_NORMAL; 4217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 422868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (status == DemuxerStream::kConfigChanged) { 42323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2) << ": " << "ConfigChanged"; 424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch DCHECK(stream_->SupportsConfigChanges()); 425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (!config_change_observer_cb_.is_null()) 427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch config_change_observer_cb_.Run(); 428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 429868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) state_ = STATE_FLUSHING_DECODER; 4307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!reset_cb_.is_null()) { 4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If we are using DecryptingDemuxerStream, we already called DDS::Reset() 4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // which will continue the resetting process in it's callback. 4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!decrypting_demuxer_stream_) 4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Reset(base::ResetAndReturn(&reset_cb_)); 4357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Reinitialization will continue after Reset() is done. 4367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } else { 4377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FlushDecoder(); 4387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 4407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!reset_cb_.is_null()) { 4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // If we are using DecryptingDemuxerStream, we already called DDS::Reset() 4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // which will continue the resetting process in it's callback. 4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!decrypting_demuxer_stream_) 4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) Reset(base::ResetAndReturn(&reset_cb_)); 4477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 4487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 4497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 4507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (status == DemuxerStream::kAborted) { 451f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!read_cb_.is_null()) 452f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SatisfyRead(DEMUXER_READ_ABORTED, NULL); 453868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 454868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 455868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4560529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!splice_observer_cb_.is_null() && !buffer->end_of_stream()) { 4570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const bool has_splice_ts = buffer->splice_timestamp() != kNoTimestamp(); 4580529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (active_splice_ || has_splice_ts) { 4590529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch splice_observer_cb_.Run(buffer->splice_timestamp()); 4600529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch active_splice_ = has_splice_ts; 4610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch } 462effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 463effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 4647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(status == DemuxerStream::kOk) << status; 4657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Decode(buffer); 466010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 467010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Read more data if the decoder supports multiple parallel decoding requests. 4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CanDecodeMore()) 469010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ReadFromDemuxerStream(); 470868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 471868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 472a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 473a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::ReinitializeDecoder() { 47423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 4755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 476868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(state_, STATE_FLUSHING_DECODER) << state_; 477010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) DCHECK_EQ(pending_decode_requests_, 0); 478868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 479a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DCHECK(StreamTraits::GetDecoderConfig(*stream_).IsValidConfig()); 480868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) state_ = STATE_REINITIALIZING_DECODER; 4815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DecoderStreamTraits<StreamType>::Initialize( 4825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu decoder_.get(), 483a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) StreamTraits::GetDecoderConfig(*stream_), 4845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu low_delay_, 485a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::Bind(&DecoderStream<StreamType>::OnDecoderReinitialized, 486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) weak_factory_.GetWeakPtr()), 487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&DecoderStream<StreamType>::OnDecodeOutputReady, 488a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) weak_factory_.GetWeakPtr())); 489868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 490868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 491a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 492a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::OnDecoderReinitialized(PipelineStatus status) { 49323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 4945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 495868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK_EQ(state_, STATE_REINITIALIZING_DECODER) << state_; 496868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 4977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // ReinitializeDecoder() can be called in two cases: 498a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // 1, Flushing decoder finished (see OnDecodeOutputReady()). 4997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // 2, Reset() was called during flushing decoder (see OnDecoderReset()). 5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // Also, Reset() can be called during pending ReinitializeDecoder(). 5017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // This function needs to handle them all! 5027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 503868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) state_ = (status == PIPELINE_OK) ? STATE_NORMAL : STATE_ERROR; 504868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (!reset_cb_.is_null()) { 506868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::ResetAndReturn(&reset_cb_).Run(); 507010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return; 5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 5097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 5107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (read_cb_.is_null()) 5117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 512868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 513868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) if (state_ == STATE_ERROR) { 514558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch SatisfyRead(DECODE_ERROR, NULL); 515868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 516868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 517868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 5187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch ReadFromDemuxerStream(); 519868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)} 520868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 521a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 522a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::ResetDecoder() { 52323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 5257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER || 5266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) state_ == STATE_ERROR || state_ == STATE_END_OF_STREAM) << state_; 5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!reset_cb_.is_null()); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 529a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) decoder_->Reset(base::Bind(&DecoderStream<StreamType>::OnDecoderReset, 5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) weak_factory_.GetWeakPtr())); 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 533a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template <DemuxerStream::Type StreamType> 534a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void DecoderStream<StreamType>::OnDecoderReset() { 53523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) FUNCTION_DVLOG(2); 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK(task_runner_->BelongsToCurrentThread()); 5377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DCHECK(state_ == STATE_NORMAL || state_ == STATE_FLUSHING_DECODER || 5386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) state_ == STATE_ERROR || state_ == STATE_END_OF_STREAM) << state_; 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // If Reset() was called during pending read, read callback should be fired 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before the reset callback is fired. 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(read_cb_.is_null()); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!reset_cb_.is_null()); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (state_ != STATE_FLUSHING_DECODER) { 5456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) state_ = STATE_NORMAL; 5466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) active_splice_ = false; 547868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::ResetAndReturn(&reset_cb_).Run(); 548868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return; 549868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 550868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 551868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The resetting process will be continued in OnDecoderReinitialized(). 552868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ReinitializeDecoder(); 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 555a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template class DecoderStream<DemuxerStream::VIDEO>; 556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template class DecoderStream<DemuxerStream::AUDIO>; 557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace media 559