/*
 * Copyright 2019 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_HAL_ADAPTER_REPROCESS_EFFECT_GPU_ALGO_MANAGER_H_
#define CAMERA_HAL_ADAPTER_REPROCESS_EFFECT_GPU_ALGO_MANAGER_H_

#include <map>
#include <memory>
#include <vector>

#include <base/callback.h>
#include <base/synchronization/lock.h>

#include "cros-camera/camera_algorithm_bridge.h"
#include "cros-camera/camera_mojo_channel_manager.h"

namespace cros {

class GPUAlgoManager final : public camera_algorithm_callback_ops_t {
 public:
  static GPUAlgoManager* GetInstance(CameraMojoChannelManager* mojo_manager);

  int32_t RegisterBuffer(int buffer_fd);

  void Request(const std::vector<uint8_t>& req_header,
               int32_t buffer_handle,
               base::Callback<void(uint32_t, int32_t)> cb);

  void DeregisterBuffers(const std::vector<int32_t>& buffer_handles);

 private:
  explicit GPUAlgoManager(CameraMojoChannelManager* mojo_manager);
  GPUAlgoManager(const GPUAlgoManager&) = delete;
  GPUAlgoManager& operator=(const GPUAlgoManager&) = delete;

  ~GPUAlgoManager() = default;

  static void ReturnCallbackForwarder(
      const camera_algorithm_callback_ops_t* callback_ops,
      uint32_t req_id,
      uint32_t status,
      int32_t buffer_handle);

  void ReturnCallback(uint32_t req_id, uint32_t status, int32_t buffer_handle);

  std::unique_ptr<CameraAlgorithmBridge> bridge_;

  // Lock to protect |req_id_| and |cb_map_|
  base::Lock lock_;

  uint32_t req_id_;

  std::map<uint32_t, base::Callback<void(uint32_t, int32_t)>> cb_map_;
};

}  // namespace cros

#endif  // CAMERA_HAL_ADAPTER_REPROCESS_EFFECT_GPU_ALGO_MANAGER_H_
