Home | History | Annotate | Download | only in filters
      1 // Copyright (c) 2011 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_AUDIO_FILE_READER_H_
      6 #define MEDIA_FILTERS_AUDIO_FILE_READER_H_
      7 
      8 #include "base/basictypes.h"
      9 #include "base/memory/scoped_ptr.h"
     10 #include "media/base/media_export.h"
     11 
     12 struct AVCodecContext;
     13 
     14 namespace base { class TimeDelta; }
     15 
     16 namespace media {
     17 
     18 class AudioBus;
     19 class FFmpegGlue;
     20 class FFmpegURLProtocol;
     21 
     22 class MEDIA_EXPORT AudioFileReader {
     23  public:
     24   // Audio file data will be read using the given protocol.
     25   // The AudioFileReader does not take ownership of |protocol| and
     26   // simply maintains a weak reference to it.
     27   explicit AudioFileReader(FFmpegURLProtocol* protocol);
     28   virtual ~AudioFileReader();
     29 
     30   // Open() reads the audio data format so that the sample_rate(),
     31   // channels(), duration(), and number_of_frames() methods can be called.
     32   // It returns |true| on success.
     33   bool Open();
     34   void Close();
     35 
     36   // After a call to Open(), attempts to fully fill |audio_bus| with decoded
     37   // audio data.  Any unfilled frames will be zeroed out.
     38   // |audio_data| must be of the same size as channels().
     39   // The audio data will be decoded as floating-point linear PCM with
     40   // a nominal range of -1.0 -> +1.0.
     41   // Returns the number of sample-frames actually read which will always be
     42   // <= audio_bus->frames()
     43   int Read(AudioBus* audio_bus);
     44 
     45   // These methods can be called once Open() has been called.
     46   int channels() const { return channels_; }
     47   int sample_rate() const { return sample_rate_; }
     48 
     49   // Please note that duration() and number_of_frames() attempt to be accurate,
     50   // but are only estimates.  For some encoded formats, the actual duration
     51   // of the file can only be determined once all the file data has been read.
     52   // The Read() method returns the actual number of sample-frames it has read.
     53   base::TimeDelta duration() const;
     54   int64 number_of_frames() const;
     55 
     56  private:
     57   scoped_ptr<FFmpegGlue> glue_;
     58   AVCodecContext* codec_context_;
     59   int stream_index_;
     60   FFmpegURLProtocol* protocol_;
     61   int channels_;
     62   int sample_rate_;
     63 
     64   // AVSampleFormat initially requested; not Chrome's SampleFormat.
     65   int av_sample_format_;
     66 
     67   DISALLOW_COPY_AND_ASSIGN(AudioFileReader);
     68 };
     69 
     70 }  // namespace media
     71 
     72 #endif  // MEDIA_FILTERS_AUDIO_FILE_READER_H_
     73