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