blob: 38ec800b288c305c4248d7355036d7f5b6276727 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chromecast/media/cma/pipeline/audio_pipeline_impl.h"
#include <stddef.h>
#include <utility>
#include "base/bind.h"
#include "chromecast/media/cma/base/buffering_defs.h"
#include "chromecast/media/cma/base/cma_logging.h"
#include "chromecast/media/cma/base/coded_frame_provider.h"
#include "chromecast/media/cma/base/decoder_config_adapter.h"
#include "chromecast/public/media/decoder_config.h"
#include "media/base/audio_decoder_config.h"
namespace chromecast {
namespace media {
namespace {
const size_t kMaxAudioFrameSize = 32 * 1024;
}
AudioPipelineImpl::AudioPipelineImpl(
MediaPipelineBackend::AudioDecoder* decoder,
const AvPipelineClient& client)
: AvPipelineImpl(decoder, client), audio_decoder_(decoder) {
DCHECK(audio_decoder_);
}
AudioPipelineImpl::~AudioPipelineImpl() {}
::media::PipelineStatus AudioPipelineImpl::Initialize(
const ::media::AudioDecoderConfig& audio_config,
std::unique_ptr<CodedFrameProvider> frame_provider) {
CMALOG(kLogControl) << __FUNCTION__ << " "
<< audio_config.AsHumanReadableString();
if (frame_provider) {
SetCodedFrameProvider(std::move(frame_provider), kAppAudioBufferSize,
kMaxAudioFrameSize);
}
DCHECK(audio_config.IsValidConfig());
AudioConfig cast_audio_config =
DecoderConfigAdapter::ToCastAudioConfig(kPrimary, audio_config);
encryption_scheme_ = cast_audio_config.encryption_scheme;
if (!audio_decoder_->SetConfig(cast_audio_config)) {
return ::media::PIPELINE_ERROR_INITIALIZATION_FAILED;
}
set_state(kFlushed);
return ::media::PIPELINE_OK;
}
void AudioPipelineImpl::SetVolume(float volume) {
audio_decoder_->SetVolume(volume);
}
void AudioPipelineImpl::OnUpdateConfig(
StreamId id,
const ::media::AudioDecoderConfig& audio_config,
const ::media::VideoDecoderConfig& video_config) {
if (audio_config.IsValidConfig()) {
CMALOG(kLogControl) << __FUNCTION__ << " id:" << id << " "
<< audio_config.AsHumanReadableString();
AudioConfig cast_audio_config =
DecoderConfigAdapter::ToCastAudioConfig(id, audio_config);
encryption_scheme_ = cast_audio_config.encryption_scheme;
bool success = audio_decoder_->SetConfig(cast_audio_config);
if (!success && !client().playback_error_cb.is_null())
client().playback_error_cb.Run(::media::PIPELINE_ERROR_DECODE);
}
}
const EncryptionScheme& AudioPipelineImpl::GetEncryptionScheme(
StreamId id) const {
return encryption_scheme_;
}
void AudioPipelineImpl::UpdateStatistics() {
if (client().statistics_cb.is_null())
return;
// TODO(mbjorge): Give Statistics a default constructor when the
// next system update happens. b/32802298
MediaPipelineBackend::AudioDecoder::Statistics audio_stats = {};
audio_decoder_->GetStatistics(&audio_stats);
::media::PipelineStatistics current_stats;
current_stats.audio_bytes_decoded = audio_stats.decoded_bytes;
::media::PipelineStatistics delta_stats;
delta_stats.audio_bytes_decoded =
current_stats.audio_bytes_decoded - previous_stats_.audio_bytes_decoded;
bytes_decoded_since_last_update_ = delta_stats.audio_bytes_decoded;
previous_stats_ = current_stats;
client().statistics_cb.Run(delta_stats);
}
} // namespace media
} // namespace chromecast