Home | History | Annotate | Download | only in filters
      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 std::string GetDisplayName() const OVERRIDE;
     35   virtual void Initialize(const AudioDecoderConfig& config,
     36                           const PipelineStatusCB& status_cb,
     37                           const OutputCB& output_cb) OVERRIDE;
     38   virtual void Decode(const scoped_refptr<DecoderBuffer>& buffer,
     39                       const DecodeCB& decode_cb) OVERRIDE;
     40   virtual void Reset(const base::Closure& closure) 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