1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MEDIA_FILTERS_OPUS_AUDIO_DECODER_H_ 6 #define MEDIA_FILTERS_OPUS_AUDIO_DECODER_H_ 7 8 #include "base/callback.h" 9 #include "base/time/time.h" 10 #include "media/base/audio_decoder.h" 11 #include "media/base/demuxer_stream.h" 12 #include "media/base/sample_format.h" 13 14 struct OpusMSDecoder; 15 16 namespace base { 17 class SingleThreadTaskRunner; 18 } 19 20 namespace media { 21 22 class AudioBuffer; 23 class AudioDiscardHelper; 24 class DecoderBuffer; 25 struct QueuedAudioBuffer; 26 27 class MEDIA_EXPORT OpusAudioDecoder : public AudioDecoder { 28 public: 29 explicit OpusAudioDecoder( 30 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner); 31 virtual ~OpusAudioDecoder(); 32 33 // AudioDecoder implementation. 34 virtual void Initialize(const AudioDecoderConfig& config, 35 const PipelineStatusCB& status_cb, 36 const OutputCB& output_cb) OVERRIDE; 37 virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer, 38 const DecodeCB& decode_cb) OVERRIDE; 39 virtual void Reset(const base::Closure& closure) OVERRIDE; 40 virtual void Stop() OVERRIDE; 41 42 private: 43 // Reads from the demuxer stream with corresponding callback method. 44 void ReadFromDemuxerStream(); 45 void DecodeBuffer(const scoped_refptr<DecoderBuffer>& input, 46 const DecodeCB& decode_cb); 47 48 bool ConfigureDecoder(); 49 void CloseDecoder(); 50 void ResetTimestampState(); 51 bool Decode(const scoped_refptr<DecoderBuffer>& input, 52 scoped_refptr<AudioBuffer>* output_buffer); 53 54 scoped_refptr<base::SingleThreadTaskRunner> task_runner_; 55 56 AudioDecoderConfig config_; 57 OutputCB output_cb_; 58 OpusMSDecoder* opus_decoder_; 59 60 // When the input timestamp is |start_input_timestamp_| the decoder needs to 61 // drop |config_.codec_delay()| frames. 62 base::TimeDelta start_input_timestamp_; 63 64 scoped_ptr<AudioDiscardHelper> discard_helper_; 65 66 DISALLOW_IMPLICIT_CONSTRUCTORS(OpusAudioDecoder); 67 }; 68 69 } // namespace media 70 71 #endif // MEDIA_FILTERS_OPUS_AUDIO_DECODER_H_ 72