blob: 8e7219e67d8f24c5baa4c2018c58d6983a2f4f90 [file] [log] [blame]
// Copyright 2018 The Fuchsia 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 "src/media/playback/mediaplayer/fidl/fidl_decoder_factory.h"
#include <fuchsia/mediacodec/cpp/fidl.h>
#include <lib/syslog/cpp/macros.h>
#include "lib/fidl/cpp/clone.h"
#include "src/media/playback/mediaplayer/fidl/fidl_processor.h"
#include "src/media/playback/mediaplayer/fidl/fidl_type_conversions.h"
namespace media_player {
// static
std::unique_ptr<DecoderFactory> FidlDecoderFactory::Create(ServiceProvider* service_provider) {
return std::make_unique<FidlDecoderFactory>(service_provider);
}
FidlDecoderFactory::FidlDecoderFactory(ServiceProvider* service_provider)
: service_provider_(service_provider) {
codec_factory_ = service_provider_->ConnectToService<fuchsia::mediacodec::CodecFactory>();
}
FidlDecoderFactory::~FidlDecoderFactory() {}
void FidlDecoderFactory::CreateDecoder(const StreamType& stream_type,
fit::function<void(std::shared_ptr<Processor>)> callback) {
FX_DCHECK(callback);
auto format_details = fidl::To<fuchsia::media::FormatDetailsPtr>(stream_type);
if (!format_details || !codec_factory_) {
// If we don't know how to build |CodecFormatDetails| or we don't have a
// codec factory, we don't know how to make a decoder.
callback(nullptr);
return;
}
fuchsia::mediacodec::CreateDecoder_Params decoder_params;
decoder_params.set_input_details(fidl::Clone(*format_details));
decoder_params.set_promise_separate_access_units_on_input(true);
decoder_params.set_require_hw(true);
fuchsia::media::StreamProcessorPtr decoder;
codec_factory_->CreateDecoder(std::move(decoder_params), decoder.NewRequest());
FX_DCHECK(decoder);
FidlProcessor::Create(service_provider_, stream_type.medium(), FidlProcessor::Function::kDecode,
std::move(decoder), std::move(callback));
}
} // namespace media_player