diff --git a/content/renderer/media/audio_renderer_impl.cc b/content/renderer/media/audio_renderer_impl.cc index 87228d3df38c02..cc9b68a973c846 100644 --- a/content/renderer/media/audio_renderer_impl.cc +++ b/content/renderer/media/audio_renderer_impl.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -50,22 +50,14 @@ base::TimeDelta AudioRendererImpl::ConvertToDuration(int bytes) { return base::TimeDelta(); } -bool AudioRendererImpl::OnInitialize(const media::MediaFormat& media_format) { - // Parse integer values in MediaFormat. - if (!ParseMediaFormat(media_format, - ¶ms_.channels, - ¶ms_.sample_rate, - ¶ms_.bits_per_sample)) { - return false; - } - params_.format = AudioParameters::AUDIO_PCM_LINEAR; +bool AudioRendererImpl::OnInitialize(const media::AudioDecoderConfig& config) { + AudioParameters params(config); + params.format = AudioParameters::AUDIO_PCM_LINEAR; - // Calculate the number of bytes per second using information of the stream. - bytes_per_second_ = params_.sample_rate * params_.channels * - params_.bits_per_sample / 8; + bytes_per_second_ = params.GetBytesPerSecond(); io_loop_->PostTask(FROM_HERE, - NewRunnableMethod(this, &AudioRendererImpl::CreateStreamTask, params_)); + NewRunnableMethod(this, &AudioRendererImpl::CreateStreamTask, params)); return true; } diff --git a/content/renderer/media/audio_renderer_impl.h b/content/renderer/media/audio_renderer_impl.h index 1e509fb7e8c93a..e08332e455b772 100644 --- a/content/renderer/media/audio_renderer_impl.h +++ b/content/renderer/media/audio_renderer_impl.h @@ -82,7 +82,7 @@ class AudioRendererImpl : public media::AudioRendererBase, protected: // Methods called on audio renderer thread ---------------------------------- // These methods are called from AudioRendererBase. - virtual bool OnInitialize(const media::MediaFormat& media_format); + virtual bool OnInitialize(const media::AudioDecoderConfig& config); virtual void OnStop(); // Called when the decoder completes a Read(). @@ -114,8 +114,7 @@ class AudioRendererImpl : public media::AudioRendererBase, // Called on IO thread when message loop is dying. virtual void WillDestroyCurrentMessageLoop(); - // Information about the audio stream. - AudioParameters params_; + // Used to calculate audio delay given bytes. uint32 bytes_per_second_; scoped_refptr filter_; diff --git a/content/renderer/media/audio_renderer_impl_unittest.cc b/content/renderer/media/audio_renderer_impl_unittest.cc index f29f39fc73e39d..ba7a0567b67ed5 100644 --- a/content/renderer/media/audio_renderer_impl_unittest.cc +++ b/content/renderer/media/audio_renderer_impl_unittest.cc @@ -6,13 +6,12 @@ #include "content/common/audio_messages.h" #include "content/renderer/media/audio_renderer_impl.h" #include "media/base/data_buffer.h" -#include "media/base/media_format.h" #include "media/base/mock_callback.h" #include "media/base/mock_filter_host.h" #include "media/base/mock_filters.h" #include "testing/gtest/include/gtest/gtest.h" -using ::testing::ReturnRef; +using ::testing::Return; class AudioRendererImplTest : public ::testing::Test { public: @@ -33,12 +32,8 @@ class AudioRendererImplTest : public ::testing::Test { // Setup expectations for initialization. decoder_ = new media::MockAudioDecoder(); - // Associate media format with decoder - decoder_media_format_.SetAsInteger(media::MediaFormat::kChannels, 2); - decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleRate, 48000); - decoder_media_format_.SetAsInteger(media::MediaFormat::kSampleBits, 16); - EXPECT_CALL(*decoder_, media_format()) - .WillRepeatedly(ReturnRef(decoder_media_format_)); + ON_CALL(*decoder_, config()) + .WillByDefault(Return(media::AudioDecoderConfig(16, 1, 44100))); // Create and initialize audio renderer. renderer_ = new AudioRendererImpl(filter_); @@ -68,7 +63,6 @@ class AudioRendererImplTest : public ::testing::Test { media::MockFilterHost host_; scoped_refptr decoder_; scoped_refptr renderer_; - media::MediaFormat decoder_media_format_; private: DISALLOW_COPY_AND_ASSIGN(AudioRendererImplTest); diff --git a/media/audio/audio_parameters.cc b/media/audio/audio_parameters.cc index d1d44a7b5e6544..dfe2d075649c9a 100644 --- a/media/audio/audio_parameters.cc +++ b/media/audio/audio_parameters.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -14,6 +14,14 @@ AudioParameters::AudioParameters() samples_per_packet(0) { } +AudioParameters::AudioParameters(const media::AudioDecoderConfig& config) + : format(AUDIO_PCM_LINEAR), + channels(config.channels_per_sample), + sample_rate(config.sample_rate), + bits_per_sample(config.bits_per_channel), + samples_per_packet(0) { +} + AudioParameters::AudioParameters(Format format, int channels, int sample_rate, int bits_per_sample, int samples_per_packet) @@ -38,6 +46,10 @@ int AudioParameters::GetPacketSize() const { return samples_per_packet * channels * bits_per_sample / 8; } +int AudioParameters::GetBytesPerSecond() const { + return sample_rate * channels * bits_per_sample / 8; +} + bool AudioParameters::Compare::operator()( const AudioParameters& a, const AudioParameters& b) const { diff --git a/media/audio/audio_parameters.h b/media/audio/audio_parameters.h index 2842bc1f4c6e08..ac08067a2f0f36 100644 --- a/media/audio/audio_parameters.h +++ b/media/audio/audio_parameters.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -6,6 +6,7 @@ #define MEDIA_AUDIO_AUDIO_PARAMETERS_H_ #include "base/basictypes.h" +#include "media/base/audio_decoder_config.h" struct AudioParameters { // Compare is useful when AudioParameters is used as a key in std::map. @@ -30,6 +31,8 @@ struct AudioParameters { AudioParameters(); + explicit AudioParameters(const media::AudioDecoderConfig& config); + AudioParameters(Format format, int channels, int sample_rate, int bits_per_sample, int samples_per_packet); @@ -40,6 +43,9 @@ struct AudioParameters { // Returns size of audio packets in bytes. int GetPacketSize() const; + // Returns the number of bytes representing one second of audio. + int GetBytesPerSecond() const; + Format format; // Format of the stream. int channels; // Number of channels. int sample_rate; // Sampling frequency/rate. diff --git a/media/audio/audio_parameters_unittest.cc b/media/audio/audio_parameters_unittest.cc index 61b8ad05d30164..9f5bb2b60c63ae 100644 --- a/media/audio/audio_parameters_unittest.cc +++ b/media/audio/audio_parameters_unittest.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -7,6 +7,41 @@ #include "media/audio/audio_parameters.h" #include "testing/gtest/include/gtest/gtest.h" +using media::AudioDecoderConfig; + +TEST(AudioParameters, Constructor_Default) { + AudioParameters::Format expected_format = AudioParameters::AUDIO_PCM_LINEAR; + int expected_bits = 0; + int expected_channels = 0; + int expected_rate = 0; + int expected_samples = 0; + + AudioParameters params; + + EXPECT_EQ(expected_format, params.format); + EXPECT_EQ(expected_bits, params.bits_per_sample); + EXPECT_EQ(expected_channels, params.channels); + EXPECT_EQ(expected_rate, params.sample_rate); + EXPECT_EQ(expected_samples, params.samples_per_packet); +} + +TEST(AudioParameters, Constructor_AudioDecoderConfig) { + AudioParameters::Format expected_format = AudioParameters::AUDIO_PCM_LINEAR; + int expected_bits = 8; + int expected_channels = 2; + int expected_rate = 44000; + int expected_samples = 0; + + AudioDecoderConfig config(expected_bits, expected_channels, expected_rate); + AudioParameters params(config); + + EXPECT_EQ(expected_format, params.format); + EXPECT_EQ(expected_bits, params.bits_per_sample); + EXPECT_EQ(expected_channels, params.channels); + EXPECT_EQ(expected_rate, params.sample_rate); + EXPECT_EQ(expected_samples, params.samples_per_packet); +} + TEST(AudioParameters, GetPacketSize) { EXPECT_EQ(100, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, 1, 1000, 8, 100).GetPacketSize()); @@ -20,6 +55,19 @@ TEST(AudioParameters, GetPacketSize) { 2, 1000, 16, 200).GetPacketSize()); } +TEST(AudioParameters, GetBytesPerSecond) { + EXPECT_EQ(0, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, + 0, 0, 0, 0).GetBytesPerSecond()); + EXPECT_EQ(0, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, + 2, 0, 0, 0).GetBytesPerSecond()); + EXPECT_EQ(0, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, + 0, 100, 0, 0).GetBytesPerSecond()); + EXPECT_EQ(0, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, + 0, 0, 8, 0).GetBytesPerSecond()); + EXPECT_EQ(200, AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, + 2, 100, 8, 0).GetBytesPerSecond()); +} + TEST(AudioParameters, Compare) { AudioParameters values[] = { AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, 1, 1000, 8, 100), diff --git a/media/base/audio_decoder_config.h b/media/base/audio_decoder_config.h new file mode 100644 index 00000000000000..791d2cd33d7c81 --- /dev/null +++ b/media/base/audio_decoder_config.h @@ -0,0 +1,24 @@ +// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ +#define MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ + +namespace media { + +struct AudioDecoderConfig { + AudioDecoderConfig(int bits, int channels, int rate) + : bits_per_channel(bits), + channels_per_sample(channels), + sample_rate(rate) { + } + + int bits_per_channel; + int channels_per_sample; + int sample_rate; +}; + +} // namespace media + +#endif // MEDIA_BASE_AUDIO_DECODER_CONFIG_H_ diff --git a/media/base/filters.h b/media/base/filters.h index 7d56114ab1af79..f290fecf92d8b9 100644 --- a/media/base/filters.h +++ b/media/base/filters.h @@ -30,6 +30,7 @@ #include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "base/time.h" +#include "media/base/audio_decoder_config.h" #include "media/base/media_format.h" #include "media/base/video_frame.h" @@ -238,6 +239,8 @@ class AudioDecoder : public Filter { virtual void Initialize(DemuxerStream* stream, FilterCallback* callback, StatisticsCallback* stats_callback) = 0; + virtual AudioDecoderConfig config() = 0; + // |set_fill_buffer_done_callback| install permanent callback from downstream // filter (i.e. Renderer). The callback is used to deliver buffers at // runtime to downstream filter. @@ -255,9 +258,6 @@ class AudioDecoder : public Filter { // We could also pass empty pointer here to let decoder provide buffers pool. virtual void ProduceAudioSamples(scoped_refptr buffer) = 0; - // Returns the media format produced by this decoder. - virtual const MediaFormat& media_format() = 0; - protected: AudioDecoder(); ~AudioDecoder(); diff --git a/media/base/mock_filters.h b/media/base/mock_filters.h index 636b60f6c3b034..7a5809598b1df6 100644 --- a/media/base/mock_filters.h +++ b/media/base/mock_filters.h @@ -214,7 +214,7 @@ class MockAudioDecoder : public AudioDecoder { MOCK_METHOD3(Initialize, void(DemuxerStream* stream, FilterCallback* callback, StatisticsCallback* stats_callback)); - MOCK_METHOD0(media_format, const MediaFormat&()); + MOCK_METHOD0(config, AudioDecoderConfig()); MOCK_METHOD1(ProduceAudioSamples, void(scoped_refptr)); // change to public to allow unittest for access; diff --git a/media/filters/audio_renderer_base.cc b/media/filters/audio_renderer_base.cc index 4dec0a451d183c..7e40ba11dce01a 100644 --- a/media/filters/audio_renderer_base.cc +++ b/media/filters/audio_renderer_base.cc @@ -90,16 +90,6 @@ void AudioRendererBase::Initialize(AudioDecoder* decoder, decoder_->set_consume_audio_samples_callback( NewCallback(this, &AudioRendererBase::ConsumeAudioSamples)); - // Get the media properties to initialize our algorithms. - int channels = 0; - int sample_rate = 0; - int sample_bits = 0; - if (!ParseMediaFormat(decoder_->media_format(), &channels, &sample_rate, - &sample_bits)) { - host()->SetError(PIPELINE_ERROR_INITIALIZATION_FAILED); - callback->Run(); - return; - } // Create a callback so our algorithm can request more reads. AudioRendererAlgorithmBase::RequestReadCallback* cb = @@ -110,14 +100,15 @@ void AudioRendererBase::Initialize(AudioDecoder* decoder, // Initialize our algorithm with media properties, initial playback rate, // and a callback to request more reads from the data source. - algorithm_->Initialize(channels, - sample_rate, - sample_bits, + AudioDecoderConfig config = decoder_->config(); + algorithm_->Initialize(config.channels_per_sample, + config.sample_rate, + config.bits_per_channel, 0.0f, cb); // Give the subclass an opportunity to initialize itself. - if (!OnInitialize(decoder_->media_format())) { + if (!OnInitialize(config)) { host()->SetError(PIPELINE_ERROR_INITIALIZATION_FAILED); callback->Run(); return; @@ -253,17 +244,6 @@ void AudioRendererBase::ScheduleRead_Locked() { decoder_->ProduceAudioSamples(buffer); } -// static -bool AudioRendererBase::ParseMediaFormat(const MediaFormat& media_format, - int* channels_out, - int* sample_rate_out, - int* sample_bits_out) { - // TODO(scherkus): might be handy to support NULL parameters. - return media_format.GetAsInteger(MediaFormat::kChannels, channels_out) && - media_format.GetAsInteger(MediaFormat::kSampleRate, sample_rate_out) && - media_format.GetAsInteger(MediaFormat::kSampleBits, sample_bits_out); -} - void AudioRendererBase::SetPlaybackRate(float playback_rate) { algorithm_->set_playback_rate(playback_rate); } diff --git a/media/filters/audio_renderer_base.h b/media/filters/audio_renderer_base.h index 6c77acb0a04e7d..0b13e02aecf725 100644 --- a/media/filters/audio_renderer_base.h +++ b/media/filters/audio_renderer_base.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -44,10 +44,9 @@ class AudioRendererBase : public AudioRenderer { virtual bool HasEnded(); protected: - // Called by Initialize(). |media_format| is the format of the AudioDecoder. // Subclasses should return true if they were able to initialize, false // otherwise. - virtual bool OnInitialize(const MediaFormat& media_format) = 0; + virtual bool OnInitialize(const AudioDecoderConfig& config) = 0; // Called by Stop(). Subclasses should perform any necessary cleanup during // this time, such as stopping any running threads. @@ -79,12 +78,6 @@ class AudioRendererBase : public AudioRenderer { const base::TimeDelta& playback_delay, bool buffers_empty); - // Helper to parse a media format and return whether we were successful - // retrieving all the information we care about. - static bool ParseMediaFormat(const MediaFormat& media_format, - int* channels_out, int* sample_rate_out, - int* sample_bits_out); - // Get/Set the playback rate of |algorithm_|. virtual void SetPlaybackRate(float playback_rate); virtual float GetPlaybackRate(); diff --git a/media/filters/audio_renderer_base_unittest.cc b/media/filters/audio_renderer_base_unittest.cc index c1af178892f014..f63bad914b9849 100644 --- a/media/filters/audio_renderer_base_unittest.cc +++ b/media/filters/audio_renderer_base_unittest.cc @@ -16,7 +16,6 @@ using ::testing::InSequence; using ::testing::Invoke; using ::testing::NotNull; using ::testing::Return; -using ::testing::ReturnRef; using ::testing::StrictMock; namespace media { @@ -32,7 +31,7 @@ class MockAudioRendererBase : public AudioRendererBase { MOCK_METHOD1(SetVolume, void(float volume)); // AudioRendererBase implementation. - MOCK_METHOD1(OnInitialize, bool(const MediaFormat& media_format)); + MOCK_METHOD1(OnInitialize, bool(const AudioDecoderConfig& config)); MOCK_METHOD0(OnStop, void()); // Used for verifying check points during tests. @@ -57,12 +56,9 @@ class AudioRendererBaseTest : public ::testing::Test { EXPECT_CALL(*decoder_, ProduceAudioSamples(_)) .WillRepeatedly(Invoke(this, &AudioRendererBaseTest::EnqueueCallback)); - // Sets the essential media format keys for this decoder. - decoder_media_format_.SetAsInteger(MediaFormat::kChannels, 1); - decoder_media_format_.SetAsInteger(MediaFormat::kSampleRate, 44100); - decoder_media_format_.SetAsInteger(MediaFormat::kSampleBits, 16); - EXPECT_CALL(*decoder_, media_format()) - .WillRepeatedly(ReturnRef(decoder_media_format_)); + // Set up audio properties. + ON_CALL(*decoder_, config()) + .WillByDefault(Return(AudioDecoderConfig(16, 1, 44100))); } virtual ~AudioRendererBaseTest() { @@ -78,7 +74,6 @@ class AudioRendererBaseTest : public ::testing::Test { scoped_refptr renderer_; scoped_refptr decoder_; StrictMock host_; - MediaFormat decoder_media_format_; // Number of asynchronous read requests sent to |decoder_|. size_t pending_reads_; diff --git a/media/filters/audio_renderer_impl.cc b/media/filters/audio_renderer_impl.cc index b0dcaf1b4dd1bf..ae9199329a86df 100644 --- a/media/filters/audio_renderer_impl.cc +++ b/media/filters/audio_renderer_impl.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -72,19 +72,11 @@ void AudioRendererImpl::OnError(AudioOutputStream* stream, int code) { NOTIMPLEMENTED(); } -bool AudioRendererImpl::OnInitialize(const MediaFormat& media_format) { - // Parse out audio parameters. - AudioParameters params; - if (!ParseMediaFormat(media_format, ¶ms.channels, - ¶ms.sample_rate, ¶ms.bits_per_sample)) { - return false; - } - - // Set packet size. +bool AudioRendererImpl::OnInitialize(const AudioDecoderConfig& config) { + AudioParameters params(config); params.samples_per_packet = kSamplesPerBuffer; - bytes_per_second_ = params.sample_rate * params.channels * - params.bits_per_sample / 8; + bytes_per_second_ = params.GetBytesPerSecond(); // Create our audio stream. stream_ = AudioManager::GetAudioManager()->MakeAudioOutputStream(params); diff --git a/media/filters/audio_renderer_impl.h b/media/filters/audio_renderer_impl.h index 3e19992a76bde9..b0ffc875b1fd51 100644 --- a/media/filters/audio_renderer_impl.h +++ b/media/filters/audio_renderer_impl.h @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -44,7 +44,7 @@ class AudioRendererImpl : public AudioRendererBase, protected: // AudioRendererBase implementation. - virtual bool OnInitialize(const MediaFormat& media_format); + virtual bool OnInitialize(const AudioDecoderConfig& config); virtual void OnStop(); private: diff --git a/media/filters/decoder_base.h b/media/filters/decoder_base.h index 086aa960463d08..280c0bf6b44114 100644 --- a/media/filters/decoder_base.h +++ b/media/filters/decoder_base.h @@ -53,8 +53,6 @@ class DecoderBase : public Decoder { callback)); } - virtual const MediaFormat& media_format() { return media_format_; } - // Audio decoder. // Note that this class is only used by the audio decoder, this will // eventually be merged into FFmpegAudioDecoder. @@ -97,8 +95,7 @@ class DecoderBase : public Decoder { // the demuxer stream. Returns true if successful, otherwise false indicates // a fatal error. The derived class should NOT call the filter host's // InitializationComplete() method. If this method returns true, then the - // base class will call the host to complete initialization. During this - // call, the derived class must fill in the media_format_ member. + // base class will call the host to complete initialization. virtual void DoInitialize(DemuxerStream* demuxer_stream, bool* success, Task* done_cb) = 0; @@ -118,8 +115,6 @@ class DecoderBase : public Decoder { // the EnequeueResult() method from within this method. virtual void DoDecode(Buffer* input) = 0; - MediaFormat media_format_; - void OnDecodeComplete(const PipelineStatistics& statistics) { statistics_callback_->Run(statistics); diff --git a/media/filters/ffmpeg_audio_decoder.cc b/media/filters/ffmpeg_audio_decoder.cc index 74085a739732f0..0dfc783d632f69 100644 --- a/media/filters/ffmpeg_audio_decoder.cc +++ b/media/filters/ffmpeg_audio_decoder.cc @@ -30,6 +30,7 @@ const size_t FFmpegAudioDecoder::kOutputBufferSize = FFmpegAudioDecoder::FFmpegAudioDecoder(MessageLoop* message_loop) : DecoderBase(message_loop), codec_context_(NULL), + config_(0, 0, 0), estimated_next_timestamp_(kNoTimestamp) { } @@ -68,17 +69,10 @@ void FFmpegAudioDecoder::DoInitialize(DemuxerStream* demuxer_stream, return; } - // When calling avcodec_find_decoder(), |codec_context_| might be altered by - // the decoder to give more accurate values of the output format of the - // decoder. So set the media format after a decoder is allocated. - // TODO(hclam): Reuse the information provided by the demuxer for now, we may - // need to wait until the first buffer is decoded to know the correct - // information. - media_format_.SetAsInteger(MediaFormat::kChannels, codec_context_->channels); - media_format_.SetAsInteger(MediaFormat::kSampleBits, - av_get_bits_per_sample_fmt(codec_context_->sample_fmt)); - media_format_.SetAsInteger(MediaFormat::kSampleRate, - codec_context_->sample_rate); + config_.bits_per_channel = + av_get_bits_per_sample_fmt(codec_context_->sample_fmt); + config_.channels_per_sample = codec_context_->channels; + config_.sample_rate = codec_context_->sample_rate; // Prepare the output buffer. output_buffer_.reset(static_cast(av_malloc(kOutputBufferSize))); @@ -89,6 +83,10 @@ void FFmpegAudioDecoder::DoInitialize(DemuxerStream* demuxer_stream, *success = true; } +AudioDecoderConfig FFmpegAudioDecoder::config() { + return config_; +} + void FFmpegAudioDecoder::DoSeek(base::TimeDelta time, Task* done_cb) { avcodec_flush_buffers(codec_context_); estimated_next_timestamp_ = kNoTimestamp; diff --git a/media/filters/ffmpeg_audio_decoder.h b/media/filters/ffmpeg_audio_decoder.h index 20bc22e23983aa..c3ca8010757089 100644 --- a/media/filters/ffmpeg_audio_decoder.h +++ b/media/filters/ffmpeg_audio_decoder.h @@ -1,4 +1,4 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -19,6 +19,9 @@ class FFmpegAudioDecoder : public DecoderBase { explicit FFmpegAudioDecoder(MessageLoop* message_loop); virtual ~FFmpegAudioDecoder(); + // AudioDecoder implementation. + virtual AudioDecoderConfig config(); + protected: virtual void DoInitialize(DemuxerStream* demuxer_stream, bool* success, Task* done_cb); @@ -36,6 +39,8 @@ class FFmpegAudioDecoder : public DecoderBase { // is initialized in OnInitialize(). AVCodecContext* codec_context_; + AudioDecoderConfig config_; + // Estimated timestamp for next packet. Useful for packets without timestamps. base::TimeDelta estimated_next_timestamp_; diff --git a/media/filters/null_audio_renderer.cc b/media/filters/null_audio_renderer.cc index 15fd41b3bb188b..de04f0a73b2ff5 100644 --- a/media/filters/null_audio_renderer.cc +++ b/media/filters/null_audio_renderer.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. +// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -60,18 +60,11 @@ void NullAudioRenderer::ThreadMain() { } } -bool NullAudioRenderer::OnInitialize(const MediaFormat& media_format) { - // Parse out audio parameters. - int channels; - int sample_rate; - int sample_bits; - if (!ParseMediaFormat(media_format, &channels, &sample_rate, &sample_bits)) { - return false; - } - +bool NullAudioRenderer::OnInitialize(const AudioDecoderConfig& config) { // Calculate our bytes per millisecond value and allocate our buffer. - bytes_per_millisecond_ = (channels * sample_rate * sample_bits / 8) - / base::Time::kMillisecondsPerSecond; + bytes_per_millisecond_ = + (config.channels_per_sample * config.sample_rate * + config.bits_per_channel / 8) / base::Time::kMillisecondsPerSecond; buffer_size_ = bytes_per_millisecond_ * kBufferSizeInMilliseconds; buffer_.reset(new uint8[buffer_size_]); DCHECK(buffer_.get()); diff --git a/media/filters/null_audio_renderer.h b/media/filters/null_audio_renderer.h index db57276d77aac7..28da99b9510698 100644 --- a/media/filters/null_audio_renderer.h +++ b/media/filters/null_audio_renderer.h @@ -41,7 +41,7 @@ class NullAudioRenderer : public AudioRendererBase, protected: // AudioRendererBase implementation. - virtual bool OnInitialize(const MediaFormat& media_format); + virtual bool OnInitialize(const AudioDecoderConfig& config); virtual void OnStop(); private: