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