audio_decoder.cc revision 72a454cd3513ac24fbdd0e0cb9ad70b86a99b801
121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Copyright (c) 2010 The Chromium Authors. All rights reserved. 221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Use of this source code is governed by a BSD-style license that can be 321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// found in the LICENSE file. 421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "webkit/glue/media/audio_decoder.h" 621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <vector> 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/basictypes.h" 921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/string_util.h" 1021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "base/time.h" 1121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "media/filters/audio_file_reader.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "third_party/WebKit/Source/WebKit/chromium/public/WebAudioBus.h" 1321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing media::AudioFileReader; 1521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing media::InMemoryDataReader; 1621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing std::vector; 1721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenusing WebKit::WebAudioBus; 1821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 1921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsennamespace webkit_glue { 2021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen// Decode in-memory audio file data. 2221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool DecodeAudioFileData( 2321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen WebKit::WebAudioBus* destination_bus, 2421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen const char* data, size_t data_size, double sample_rate) { 2521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DCHECK(destination_bus); 2621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!destination_bus) 2721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 2821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 2921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Uses the FFmpeg library for audio file reading. 3021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen InMemoryDataReader data_reader(data, data_size); 3121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen AudioFileReader reader(&data_reader); 3221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 3321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen if (!reader.Open()) 3421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return false; 3521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 3621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen size_t number_of_channels = reader.channels(); 3721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double file_sample_rate = reader.sample_rate(); 3821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double duration = reader.duration().InSecondsF(); 3921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen size_t number_of_frames = static_cast<size_t>(reader.number_of_frames()); 4021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // TODO(crogers) : do sample-rate conversion with FFmpeg. 4221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // For now, we're ignoring the requested 'sample_rate' and returning 4321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // the WebAudioBus at the file's sample-rate. 4421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // double destination_sample_rate = 4521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // (sample_rate != 0.0) ? sample_rate : file_sample_rate; 4621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen double destination_sample_rate = file_sample_rate; 4721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 4821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen DLOG(INFO) << "Decoding file data -" 4921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << " data: " << data 5021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << " data size: " << data_size 5121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << " duration: " << duration 5221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << " number of frames: " << number_of_frames 5321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << " sample rate: " << file_sample_rate 5421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen << " number of channels: " << number_of_channels; 5521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 5621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Change to destination sample-rate. 5721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen number_of_frames = static_cast<size_t>(number_of_frames * 5821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen (destination_sample_rate / file_sample_rate)); 5921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Allocate and configure the output audio channel data. 6121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen destination_bus->initialize(number_of_channels, 6221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen number_of_frames, 6321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen destination_sample_rate); 6421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 6521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Wrap the channel pointers which will receive the decoded PCM audio. 6621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen vector<float*> audio_data; 6721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen audio_data.reserve(number_of_channels); 6821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen for (size_t i = 0; i < number_of_channels; ++i) { 6921d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen audio_data.push_back(destination_bus->channelData(i)); 7021d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen } 7121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7221d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen // Decode the audio file data. 7321d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return reader.Read(audio_data, number_of_frames); 7421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 7521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 7621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} // namespace webkit_glue 77