blob: b51375bcac54f9325b7fb70caec9768ec5f02b88 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "media/mojo/services/mojo_audio_encoder_service.h"
#include <memory>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/logging.h"
#include "media/mojo/common/media_type_converters.h"
namespace media {
MojoAudioEncoderService::MojoAudioEncoderService(
std::unique_ptr<media::AudioEncoder> encoder)
: encoder_(std::move(encoder)) {
DCHECK(encoder_);
weak_this_ = weak_factory_.GetWeakPtr();
}
MojoAudioEncoderService::~MojoAudioEncoderService() = default;
void MojoAudioEncoderService::Initialize(
mojo::PendingAssociatedRemote<mojom::AudioEncoderClient> client,
const AudioEncoderConfig& config,
InitializeCallback callback) {
if (client_.is_bound()) {
std::move(callback).Run(EncoderStatus::Codes::kEncoderInitializeTwice);
return;
}
client_.Bind(std::move(client));
encoder_->Initialize(
config,
base::BindRepeating(&MojoAudioEncoderService::OnOutput, weak_this_),
base::BindOnce(&MojoAudioEncoderService::OnDone, weak_this_,
std::move(callback)));
}
void MojoAudioEncoderService::Encode(mojom::AudioBufferPtr buffer,
EncodeCallback callback) {
if (!client_.is_bound() || !client_.is_connected()) {
std::move(callback).Run(
EncoderStatus::Codes::kEncoderInitializeNeverCompleted);
return;
}
auto audio_buffer = buffer.To<scoped_refptr<AudioBuffer>>();
auto audio_bus = AudioBuffer::WrapOrCopyToAudioBus(audio_buffer);
encoder_->Encode(std::move(audio_bus),
base::TimeTicks() + audio_buffer->timestamp(),
base::BindOnce(&MojoAudioEncoderService::OnDone, weak_this_,
std::move(callback)));
}
void MojoAudioEncoderService::Flush(FlushCallback callback) {
if (!client_.is_bound() || !client_.is_connected()) {
std::move(callback).Run(
EncoderStatus::Codes::kEncoderInitializeNeverCompleted);
return;
}
encoder_->Flush(base::BindOnce(&MojoAudioEncoderService::OnDone, weak_this_,
std::move(callback)));
}
void MojoAudioEncoderService::OnDone(MojoDoneCallback callback,
EncoderStatus error) {
std::move(callback).Run(error);
}
void MojoAudioEncoderService::OnOutput(
EncodedAudioBuffer output,
absl::optional<media::AudioEncoder::CodecDescription> desc) {
client_->OnEncodedBufferReady(
std::move(output),
desc.value_or(media::AudioEncoder::CodecDescription()));
}
} // namespace media