15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef MEDIA_FILTERS_AUDIO_FILE_READER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define MEDIA_FILTERS_AUDIO_FILE_READER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/media_export.h" 116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "media/filters/ffmpeg_glue.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVCodecContext; 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liustruct AVPacket; 156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)struct AVStream; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { class TimeDelta; } 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AudioBus; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FFmpegURLProtocol; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MEDIA_EXPORT AudioFileReader { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Audio file data will be read using the given protocol. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The AudioFileReader does not take ownership of |protocol| and 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // simply maintains a weak reference to it. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit AudioFileReader(FFmpegURLProtocol* protocol); 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AudioFileReader(); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Open() reads the audio data format so that the sample_rate(), 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // channels(), GetDuration(), and GetNumberOfFrames() methods can be called. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It returns |true| on success. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool Open(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Close(); 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // After a call to Open(), attempts to fully fill |audio_bus| with decoded 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // audio data. Any unfilled frames will be zeroed out. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |audio_data| must be of the same size as channels(). 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The audio data will be decoded as floating-point linear PCM with 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a nominal range of -1.0 -> +1.0. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the number of sample-frames actually read which will always be 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // <= audio_bus->frames() 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int Read(AudioBus* audio_bus); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These methods can be called once Open() has been called. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int channels() const { return channels_; } 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int sample_rate() const { return sample_rate_; } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Please note that GetDuration() and GetNumberOfFrames() attempt to be 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // accurate, but are only estimates. For some encoded formats, the actual 53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // duration of the file can only be determined once all the file data has been 54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // read. The Read() method returns the actual number of sample-frames it has 55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // read. 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeDelta GetDuration() const; 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int GetNumberOfFrames() const; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 596d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // The methods below are helper methods which allow AudioFileReader to double 606d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // as a test utility for demuxing audio files. 616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // -------------------------------------------------------------------------- 626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Similar to Open() but does not initialize the decoder. 646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool OpenDemuxerForTesting(); 656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Returns true if a packet could be demuxed from the first audio stream in 676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // the file, |output_packet| will contain the demuxed packet then. 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool ReadPacketForTesting(AVPacket* output_packet); 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // Seeks to the given point and returns true if successful. |seek_time| will 716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // be converted to the stream's time base automatically. 726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool SeekForTesting(base::TimeDelta seek_time); 736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) 746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) const AVStream* GetAVStreamForTesting() const; 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu const AVCodecContext* codec_context_for_testing() const { 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return codec_context_; 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu } 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool OpenDemuxer(); 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) bool OpenDecoder(); 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu bool ReadPacket(AVPacket* output_packet); 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<FFmpegGlue> glue_; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AVCodecContext* codec_context_; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int stream_index_; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FFmpegURLProtocol* protocol_; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int channels_; 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int sample_rate_; 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int64_t end_padding_; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // AVSampleFormat initially requested; not Chrome's SampleFormat. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int av_sample_format_; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AudioFileReader); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace media 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // MEDIA_FILTERS_AUDIO_FILE_READER_H_ 101