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