diff options
Diffstat (limited to 'chromium/media/base/android/audio_media_codec_decoder.cc')
-rw-r--r-- | chromium/media/base/android/audio_media_codec_decoder.cc | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/chromium/media/base/android/audio_media_codec_decoder.cc b/chromium/media/base/android/audio_media_codec_decoder.cc index 5654e7ca4a0..bf9939de1e5 100644 --- a/chromium/media/base/android/audio_media_codec_decoder.cc +++ b/chromium/media/base/android/audio_media_codec_decoder.cc @@ -40,8 +40,8 @@ AudioMediaCodecDecoder::AudioMediaCodecDecoder( waiting_for_decryption_key_cb, error_cb), volume_(-1.0), - bytes_per_frame_(0), output_sampling_rate_(0), + output_num_channels_(0), frame_count_(0), update_current_time_cb_(update_current_time_cb) {} @@ -65,8 +65,10 @@ void AudioMediaCodecDecoder::SetDemuxerConfigs(const DemuxerConfigs& configs) { DVLOG(1) << class_name() << "::" << __FUNCTION__ << " " << configs; configs_ = configs; - if (!media_codec_bridge_) + if (!media_codec_bridge_) { output_sampling_rate_ = configs.audio_sampling_rate; + output_num_channels_ = configs.audio_channels; + } } bool AudioMediaCodecDecoder::IsContentEncrypted() const { @@ -159,7 +161,6 @@ MediaCodecDecoder::ConfigStatus AudioMediaCodecDecoder::ConfigureInternal( SetVolumeInternal(); - bytes_per_frame_ = kBytesPerAudioOutputSample * configs_.audio_channels; frame_count_ = 0; ResetTimestampHelper(); @@ -169,16 +170,44 @@ MediaCodecDecoder::ConfigStatus AudioMediaCodecDecoder::ConfigureInternal( return kConfigOk; } -void AudioMediaCodecDecoder::OnOutputFormatChanged() { +bool AudioMediaCodecDecoder::OnOutputFormatChanged() { DCHECK(decoder_thread_.task_runner()->BelongsToCurrentThread()); DCHECK(media_codec_bridge_); - int old_sampling_rate = output_sampling_rate_; + // Recreate AudioTrack if either sample rate or output channel count changed. + // If we cannot obtain these values we assume they did not change. + bool needs_recreate_audio_track = false; + + const int old_sampling_rate = output_sampling_rate_; MediaCodecStatus status = media_codec_bridge_->GetOutputSamplingRate(&output_sampling_rate_); - if (status != MEDIA_CODEC_OK || output_sampling_rate_ != old_sampling_rate) + + if (status == MEDIA_CODEC_OK && old_sampling_rate != output_sampling_rate_) { + DCHECK_GT(output_sampling_rate_, 0); + DVLOG(2) << __FUNCTION__ << ": new sampling rate " << output_sampling_rate_; + needs_recreate_audio_track = true; + ResetTimestampHelper(); + } + + const int old_num_channels = output_num_channels_; + status = media_codec_bridge_->GetOutputChannelCount(&output_num_channels_); + + if (status == MEDIA_CODEC_OK && old_num_channels != output_num_channels_) { + DCHECK_GT(output_sampling_rate_, 0); + DVLOG(2) << __FUNCTION__ << ": new channel count " << output_num_channels_; + needs_recreate_audio_track = true; + } + + if (needs_recreate_audio_track && + !static_cast<AudioCodecBridge*>(media_codec_bridge_.get()) + ->CreateAudioTrack(output_sampling_rate_, output_num_channels_)) { + DLOG(ERROR) << __FUNCTION__ << ": cannot create AudioTrack"; + return false; + } + + return true; } void AudioMediaCodecDecoder::Render(int buffer_index, @@ -220,7 +249,9 @@ void AudioMediaCodecDecoder::Render(int buffer_index, if (postpone && !frame_count_) SetBaseTimestamp(pts); - size_t new_frames_count = size / bytes_per_frame_; + const size_t bytes_per_frame = + kBytesPerAudioOutputSample * output_num_channels_; + const size_t new_frames_count = size / bytes_per_frame; frame_count_ += new_frames_count; audio_timestamp_helper_->AddFrames(new_frames_count); @@ -286,7 +317,7 @@ void AudioMediaCodecDecoder::ResetTimestampHelper() { base_timestamp_ = audio_timestamp_helper_->GetTimestamp(); audio_timestamp_helper_.reset( - new AudioTimestampHelper(configs_.audio_sampling_rate)); + new AudioTimestampHelper(output_sampling_rate_)); audio_timestamp_helper_->SetBaseTimestamp(base_timestamp_); } |