// 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 <fuchsia/hardware/mediacodec/llcpp/fidl.h>

#include <ddktl/device.h>
#include <ddktl/protocol/empty-protocol.h>

#include "amlogic-video.h"
#include "device_fidl.h"
#include "driver_ctx.h"

class AmlogicVideo;
class DeviceCtx;

using DdkDeviceType = ddk::Device<DeviceCtx, ddk::Messageable>;

// 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 llcpp::fuchsia::hardware::mediacodec::Device::TypedChannelInterface,
                  public DdkDeviceType,
                  public ddk::EmptyProtocol<ZX_PROTOCOL_MEDIA_CODEC> {
 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();

  zx_status_t DdkMessage(fidl_incoming_msg_t* msg, fidl_txn_t* txn);
  void DdkRelease() { delete this; }

  // mediacodec impl.
  void GetCodecFactory(zx::channel request, GetCodecFactoryCompleter::Sync& completer) override;
  void SetAuxServiceDirectory(fidl::ClientEnd<llcpp::fuchsia::io::Directory> directory,
                              SetAuxServiceDirectoryCompleter::Sync& completer) override;

 private:
  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_;
};

#endif  // SRC_MEDIA_DRIVERS_AMLOGIC_DECODER_DEVICE_CTX_H_
