blob: ba1a885f45f05b4473bf25c3f2ae93a4688d6f35 [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.
#ifndef SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_DEVICE_CTX_H_
#define SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_DEVICE_CTX_H_
#include <fidl/fuchsia.hardware.mediacodec/cpp/wire.h>
#include <lib/inspect/cpp/inspect.h>
#include <lib/media/codec_impl/codec_diagnostics.h>
#include <lib/media/codec_impl/codec_metrics.h>
#include <lib/zx/thread.h>
#include <ddktl/device.h>
#include <ddktl/protocol/empty-protocol.h>
#include "amlogic-video.h"
#include "device_fidl.h"
#include "driver_ctx.h"
#include "thread_role.h"
namespace amlogic_decoder {
class DeviceCtx;
using DdkDeviceType =
ddk::Device<DeviceCtx, ddk::Messageable<fuchsia_hardware_mediacodec::Device>::Mixin,
ddk::Suspendable, ddk::Unbindable>;
// A pointer to an instance of this class is the per-device "ctx". The purpose
// of this class is to provide a place for device-lifetime stuff to be rooted,
// without itself being any particular aspect of the driver.
//
// TODO(dustingreen): If this device's release() can get called, we'll want to
// sequence the shutdown more carefully/explicitly. Just destructing an
// instance of this class isn't tested to actually shut down cleanly (yet).
class DeviceCtx : public DdkDeviceType,
public ddk::EmptyProtocol<ZX_PROTOCOL_MEDIA_CODEC>,
public AmlogicVideo::Owner {
public:
DeviceCtx(DriverCtx* driver, zx_device_t* parent);
~DeviceCtx();
zx_status_t Bind();
DriverCtx* driver() { return driver_; }
AmlogicVideo* video() { return video_.get(); }
DeviceFidl* device_fidl() { return device_fidl_.get(); }
CodecAdmissionControl* codec_admission_control() { return &codec_admission_control_; }
CodecMetrics& metrics();
CodecDiagnostics& diagnostics();
void DdkRelease() { delete this; }
void DdkSuspend(ddk::SuspendTxn txn);
void DdkUnbind(ddk::UnbindTxn txn);
// AmlogicVideo::Owner implementation
void SetThreadProfile(zx::unowned_thread thread, ThreadRole role) const override;
// mediacodec impl.
void GetCodecFactory(GetCodecFactoryRequestView request,
GetCodecFactoryCompleter::Sync& completer) override;
void SetAuxServiceDirectory(SetAuxServiceDirectoryRequestView request,
SetAuxServiceDirectoryCompleter::Sync& completer) override;
private:
void TeardownDeviceFidl();
DriverCtx* driver_ = nullptr;
//
// Generic driver/device interfacing:
//
// Specific device driving:
std::unique_ptr<AmlogicVideo> video_;
// FIDL interface handling:
std::unique_ptr<DeviceFidl> device_fidl_;
// Codec admission control:
CodecAdmissionControl codec_admission_control_;
};
} // namespace amlogic_decoder
#endif // SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_DEVICE_CTX_H_