// Copyright 2020 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_CAMERA_BIN_BENCHMARK_BANDWIDTH_H_
#define SRC_CAMERA_BIN_BENCHMARK_BANDWIDTH_H_

#include <fuchsia/camera3/cpp/fidl.h>
#include <fuchsia/hardware/ram/metrics/cpp/fidl.h>
#include <fuchsia/sysmem/cpp/fidl.h>
#include <lib/fit/function.h>

#include <sstream>
#include <string_view>

#include <soc/aml-common/aml-ram.h>

namespace camera::benchmark {

// Measures memory bandwidth consumption by the camera stack.
class Bandwidth {
 public:
  Bandwidth(fuchsia::sysmem::AllocatorHandle sysmem_allocator,
            fuchsia::camera3::DeviceWatcherHandle camera_device_watcher,
            fuchsia::hardware::ram::metrics::DeviceHandle metrics_device,
            async_dispatcher_t* dispatcher);

  // Profiles camera-relevant bandwidth channels for all configurations, writing the results to
  // |sink| in the fuchsia benchmark json format. Invokes |callback| when profiling has completed.
  void Profile(std::ostream& sink, fit::closure callback);

 private:
  void OnDevicesChanged(std::vector<fuchsia::camera3::WatchDevicesEvent> events);
  void OnConfigurationChanged(uint32_t index);
  void StartAllStreams(uint32_t configuration_index, fit::closure callback);
  void ConnectSequential(uint32_t stream_index);

  struct RamChannelMeasurement {
    std::string_view name;
    uint64_t bandwidth_bytes_per_second;
  };
  void MeasureRamChannels(fit::function<void(std::vector<RamChannelMeasurement>)> callback);
  void WriteResults(std::string mode, std::vector<RamChannelMeasurement> results);
  std::ostream& sink();

  fuchsia::sysmem::AllocatorPtr sysmem_allocator_;
  fuchsia::camera3::DeviceWatcherPtr camera_device_watcher_;
  fuchsia::hardware::ram::metrics::DevicePtr metrics_device_;
  async_dispatcher_t* dispatcher_;
  std::ostream* sink_;
  fit::closure callback_;
  fuchsia::camera3::DevicePtr camera_device_;
  std::vector<fuchsia::camera3::Configuration> camera_configurations_;
  struct PerStream {
    fuchsia::camera3::StreamPtr ptr;
    fuchsia::sysmem::BufferCollectionTokenPtr token;
    fuchsia::sysmem::BufferCollectionPtr collection;
    fuchsia::camera3::Stream::GetNextFrameCallback frame_callback;
    uint64_t frames_received = 0;
  };
  std::vector<PerStream> streams_;
  uint32_t warm_streams_ = 0;
  bool first_result_ = true;
};

}  // namespace camera::benchmark

#endif  // SRC_CAMERA_BIN_BENCHMARK_BANDWIDTH_H_
