13551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
23551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
33551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// found in the LICENSE file.
43551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
53551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "media/base/android/audio_decoder_job.h"
63551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
73551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/bind.h"
83551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/lazy_instance.h"
93551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "base/threading/thread.h"
103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "media/base/android/media_codec_bridge.h"
110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "media/base/audio_timestamp_helper.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochnamespace {
140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Use 16bit PCM for audio output. Keep this value in sync with the output
160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// format we passed to AudioTrack in MediaCodecBridge.
170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochconst int kBytesPerAudioOutputSample = 2;
180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)namespace media {
213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class AudioDecoderThread : public base::Thread {
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) public:
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  AudioDecoderThread() : base::Thread("MediaSource_AudioDecoderThread") {
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    Start();
263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  }
273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)};
283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// TODO(qinmin): Check if it is tolerable to use worker pool to handle all the
303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// decoding tasks so that we don't need a global thread here.
313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// http://crbug.com/245750
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)base::LazyInstance<AudioDecoderThread>::Leaky
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    g_audio_decoder_thread = LAZY_INSTANCE_INITIALIZER;
343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)AudioDecoderJob::AudioDecoderJob(
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::Closure& request_data_cb,
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const base::Closure& on_demuxer_config_changed_cb)
383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)    : MediaDecoderJob(g_audio_decoder_thread.Pointer()->message_loop_proxy(),
3946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                      request_data_cb,
4046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                      on_demuxer_config_changed_cb),
4146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      audio_codec_(kUnknownAudioCodec),
4246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      num_channels_(0),
4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      sampling_rate_(0),
4446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      volume_(-1.0),
4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      bytes_per_frame_(0) {
463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)AudioDecoderJob::~AudioDecoderJob() {}
4946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool AudioDecoderJob::HasStream() const {
5146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return audio_codec_ != kUnknownAudioCodec;
523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
545b892326406927b709cdaf6c384d4ababf456332Ben Murdochvoid AudioDecoderJob::SetDemuxerConfigs(const DemuxerConfigs& configs) {
555b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  // TODO(qinmin): split DemuxerConfig for audio and video separately so we
565b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  // can simply store the stucture here.
575b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  audio_codec_ = configs.audio_codec;
585b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  num_channels_ = configs.audio_channels;
595b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  sampling_rate_ = configs.audio_sampling_rate;
605b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  set_is_content_encrypted(configs.is_audio_encrypted);
615b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  audio_extra_data_ = configs.audio_extra_data;
625b892326406927b709cdaf6c384d4ababf456332Ben Murdoch  bytes_per_frame_ = kBytesPerAudioOutputSample * num_channels_;
635b892326406927b709cdaf6c384d4ababf456332Ben Murdoch}
645b892326406927b709cdaf6c384d4ababf456332Ben Murdoch
653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void AudioDecoderJob::SetVolume(double volume) {
6646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  volume_ = volume;
6746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetVolumeInternal();
683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
693551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
700529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid AudioDecoderJob::SetBaseTimestamp(base::TimeDelta base_timestamp) {
7146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  DCHECK(!is_decoding());
7246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  base_timestamp_ = base_timestamp;
7346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (audio_timestamp_helper_)
7446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    audio_timestamp_helper_->SetBaseTimestamp(base_timestamp_);
750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch}
760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)void AudioDecoderJob::ReleaseOutputBuffer(
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    int output_buffer_index,
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    size_t size,
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    bool render_output,
810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    base::TimeDelta current_presentation_timestamp,
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    const ReleaseOutputCompletionCallback& callback) {
830529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  render_output = render_output && (size != 0u);
840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  if (render_output) {
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    int64 head_position = (static_cast<AudioCodecBridge*>(
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        media_codec_bridge_.get()))->PlayOutputBuffer(
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)            output_buffer_index, size);
8846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    audio_timestamp_helper_->AddFrames(size / bytes_per_frame_);
890529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    int64 frames_to_play =
900529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        audio_timestamp_helper_->frame_count() - head_position;
910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    DCHECK_GE(frames_to_play, 0);
920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    current_presentation_timestamp =
930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        audio_timestamp_helper_->GetTimestamp() -
940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch        audio_timestamp_helper_->GetFrameDuration(frames_to_play);
950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  } else {
960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    current_presentation_timestamp = kNoTimestamp();
970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  }
9846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  media_codec_bridge_->ReleaseOutputBuffer(output_buffer_index, false);
9946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  callback.Run(current_presentation_timestamp,
1010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch               audio_timestamp_helper_->GetTimestamp());
1023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1033551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)bool AudioDecoderJob::ComputeTimeToRender() const {
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  return false;
1063551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
1073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
10846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool AudioDecoderJob::AreDemuxerConfigsChanged(
10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const DemuxerConfigs& configs) const {
11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return audio_codec_ != configs.audio_codec ||
11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)     num_channels_ != configs.audio_channels ||
11246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)     sampling_rate_ != configs.audio_sampling_rate ||
11346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)     is_content_encrypted() != configs.is_audio_encrypted ||
11446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)     audio_extra_data_.size() != configs.audio_extra_data.size() ||
11546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)     !std::equal(audio_extra_data_.begin(),
11646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 audio_extra_data_.end(),
11746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                 configs.audio_extra_data.begin());
11846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
11946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool AudioDecoderJob::CreateMediaCodecBridgeInternal() {
12146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  media_codec_bridge_.reset(AudioCodecBridge::Create(audio_codec_));
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!media_codec_bridge_)
12346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
12446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
12546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!(static_cast<AudioCodecBridge*>(media_codec_bridge_.get()))->Start(
12646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      audio_codec_, sampling_rate_, num_channels_, &audio_extra_data_[0],
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      audio_extra_data_.size(), true, GetMediaCrypto().obj())) {
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    media_codec_bridge_.reset();
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
13046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
13146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  SetVolumeInternal();
13346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Need to pass the base timestamp to the new decoder.
13546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (audio_timestamp_helper_)
13646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    base_timestamp_ = audio_timestamp_helper_->GetTimestamp();
13746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  audio_timestamp_helper_.reset(new AudioTimestampHelper(sampling_rate_));
13846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  audio_timestamp_helper_->SetBaseTimestamp(base_timestamp_);
13946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return true;
14046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AudioDecoderJob::SetVolumeInternal() {
14346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (media_codec_bridge_) {
14446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    static_cast<AudioCodecBridge*>(media_codec_bridge_.get())->SetVolume(
14546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        volume_);
14646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
14746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
14846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}  // namespace media
150