Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / media / filters / opus_audio_decoder.h
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_