/*
 * Copyright 2017 The Chromium OS 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 CAMERA_INCLUDE_CROS_CAMERA_CAMERA_ALGORITHM_BRIDGE_H_
#define CAMERA_INCLUDE_CROS_CAMERA_CAMERA_ALGORITHM_BRIDGE_H_

#include <cinttypes>
#include <memory>
#include <string>
#include <vector>

#include "cros-camera/camera_algorithm.h"
#include "cros-camera/camera_mojo_channel_manager.h"
#include "cros-camera/export.h"

namespace cros {

// Specifies the backend algorithm service that will be connected through IPC.
enum class CameraAlgorithmBackend {
  // Platform-specific 3A and extra algorithms running on CPU.
  kVendorCpu,
  // Platform-specific imaging algorithms running on GPU.
  kVendorGpu,
  // Google camera algorithms using GPU, e.g. Portrait Mode.
  kGoogleGpu,
  // For testing.
  kTest,
};

// The class is for a camera HAL to access camera algorithm library.
//
// The class is thread-safe.
//
// Example usage:
//
//  #include <cros-camera/camera_algorithm_bridge.h>
//  auto* mojo_manager = GetMojoChannelManager();
//  auto algo = CameraAlgorithmBridge::CreateInstance(backend, mojo_manager);
//  algo->Initialize(this);
//  std::vector<int32_t> handles(2);
//  handles[0] = algo->RegisterBuffer(buffer_fd0);
//  handles[1] = algo->RegisterBuffer(buffer_fd1);
//  std::vector<uint8_t> req_headers(2);
//  algo->Request(req_headers[0], handles[0]);
//  algo->Request(req_headers[1], handles[1]);
//  /* |return_callback_fn| is called to return buffer */
//  algo->Deregister(handles);

class CROS_CAMERA_EXPORT CameraAlgorithmBridge {
 public:
  // [DEPRECATED]
  //
  // This method creates and returns the CameraAlgorithmBridge instance of
  // vendor algorithms.
  //
  // Returns:
  //    Unique pointer to instance on success; nullptr on failure.
  static std::unique_ptr<CameraAlgorithmBridge> CreateInstance(
      CameraAlgorithmBackend backend);

  // This method creates and returns the CameraAlgorithmBridge instance of
  // vendor algorithms.
  //
  // Args:
  //    |mojo_manager|: The camera mojo channel manager instance which is used
  //                    for mojo communication.
  // Returns:
  //    Unique pointer to instance on success; nullptr on failure.
  static std::unique_ptr<CameraAlgorithmBridge> CreateInstance(
      CameraAlgorithmBackend backend, CameraMojoChannelManager* mojo_manager);

  virtual ~CameraAlgorithmBridge() {}

  // This method is one-time initialization that registers a callback function
  // for the camera algorithm library to return a buffer handle. It must be
  // called before any other functions.
  //
  // Args:
  //    |callback_ops|: Pointer to callback functions. The callback functions
  //      will be called on a different thread from the one calling
  //      Initialize, and the caller needs to take care of the
  //      synchronization.
  //
  // Returns:
  //    0 on success; corresponding error code on failure.
  virtual int32_t Initialize(
      const camera_algorithm_callback_ops_t* callback_ops) = 0;

  // This method registers a buffer to the camera algorithm library and gets
  // the handle associated with it.
  //
  // Args:
  //    |buffer_fd|: The buffer file descriptor to register.
  //
  // Returns:
  //    A handle on success; corresponding error code on failure.
  virtual int32_t RegisterBuffer(int buffer_fd) = 0;

  // This method posts a request for the camera algorithm library to process the
  // given buffer. This method is asynchronous and returns immediately after the
  // bridge sends the IPC message out. A callback to the registered
  // |callback_ops| will be invoked to return the processing status and buffer
  // handle.
  //
  // Args:
  //    |req_id|: The ID that uniquely identifies this request and needs to be
  //      sent back in camera_algorithm_callback_ops_t.return_callback().
  //    |req_header|: The request header indicating request details. The
  //      interpretation depends on the HAL implementation.
  //    |buffer_handle|: Handle of the buffer to process.
  virtual void Request(uint32_t req_id,
                       const std::vector<uint8_t>& req_header,
                       int32_t buffer_handle) = 0;

  // This method deregisters buffers to the camera algorithm library. The camera
  // algorithm shall release all the registered buffers on return of this
  // function.
  //
  // Args:
  //    |buffer_handles|: The buffer handles to deregister.
  //
  // Returns:
  //    A handle on success; -1 on failure.
  virtual void DeregisterBuffers(
      const std::vector<int32_t>& buffer_handles) = 0;

 protected:
  CameraAlgorithmBridge() {}

 private:
  // Disallow copy and assign
  CameraAlgorithmBridge(const CameraAlgorithmBridge&) = delete;
  void operator=(const CameraAlgorithmBridge&) = delete;
};

}  // namespace cros

#endif  // CAMERA_INCLUDE_CROS_CAMERA_CAMERA_ALGORITHM_BRIDGE_H_
