// 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_
