/* Copyright 2016 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_USB_METADATA_HANDLER_H_
#define CAMERA_HAL_USB_METADATA_HANDLER_H_

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

#include <base/threading/thread_checker.h>
#include <camera/camera_metadata.h>
#include <hardware/camera3.h>

#include "hal/usb/common_types.h"
#include "hal/usb/sensor_handler.h"
#include "hal/usb/v4l2_camera_device.h"

namespace cros {

using AwbModeToTemperatureMap =
    std::map<camera_metadata_enum_android_control_awb_mode, uint32_t>;

struct CameraMetadataDeleter {
  inline void operator()(camera_metadata_t* metadata) const {
    free_camera_metadata(metadata);
  }
};

typedef std::unique_ptr<camera_metadata_t, CameraMetadataDeleter>
    ScopedCameraMetadata;

// MetadataHandler is thread-safe. It is used for saving metadata states of
// CameraDevice.
class MetadataHandler {
 public:
  MetadataHandler(const camera_metadata_t& static_metadata,
                  const camera_metadata_t& request_template,
                  const DeviceInfo& device_info,
                  V4L2CameraDevice* device,
                  const SupportedFormats& supported_formats);
  ~MetadataHandler();

  static int FillDefaultMetadata(android::CameraMetadata* static_metadata,
                                 android::CameraMetadata* request_metadata);

  static int FillMetadataFromSupportedFormats(
      const SupportedFormats& supported_formats,
      const DeviceInfo& device_info,
      android::CameraMetadata* static_metadata,
      android::CameraMetadata* request_metadata);

  static int FillMetadataFromDeviceInfo(
      const DeviceInfo& device_info,
      android::CameraMetadata* static_metadata,
      android::CameraMetadata* request_metadata);

  static int FillSensorInfo(const DeviceInfo& device_info,
                            android::CameraMetadata* metadata,
                            int32_t array_width,
                            int32_t array_height);

  // Get default settings according to the |template_type|. Can be called on
  // any thread.
  const camera_metadata_t* GetDefaultRequestSettings(int template_type);

  // PreHandleRequest and PostHandleRequest should run on the same thread.

  // Called before the request is processed. This function is used for checking
  // metadata values to setup related states and image settings.
  int PreHandleRequest(int frame_number,
                       const Size& resolution,
                       android::CameraMetadata* metadata);

  // Called after the request is processed. This function is used to update
  // required metadata which can be gotton from 3A or image processor.
  int PostHandleRequest(int frame_number,
                        int64_t timestamp,
                        android::CameraMetadata* metadata);

 private:
  // Check |template_type| is valid or not.
  bool IsValidTemplateType(int template_type);

  // Check if constant frame rate should be enabled or not.
  bool ShouldEnableConstantFrameRate(
      const android::CameraMetadata* metadata) const;

  // Return a copy of metadata according to |template_type|.
  ScopedCameraMetadata CreateDefaultRequestSettings(int template_type);
  int FillDefaultPreviewSettings(android::CameraMetadata* metadata);
  int FillDefaultStillCaptureSettings(android::CameraMetadata* metadata);
  int FillDefaultVideoRecordSettings(android::CameraMetadata* metadata);
  int FillDefaultVideoSnapshotSettings(android::CameraMetadata* metadata);
  int FillDefaultZeroShutterLagSettings(android::CameraMetadata* metadata);
  int FillDefaultManualSettings(android::CameraMetadata* metadata);

  static AwbModeToTemperatureMap GetAvailableAwbTemperatures(
      const DeviceInfo& device_info);

  // Metadata containing persistent camera characteristics.
  android::CameraMetadata static_metadata_;
  // The base template for constructing request settings.
  android::CameraMetadata request_template_;

  // Static array of standard camera settings templates. These are owned by
  // CameraClient.
  ScopedCameraMetadata template_settings_[CAMERA3_TEMPLATE_COUNT];

  // Use to check PreHandleRequest and PostHandleRequest are called on the same
  // thread.
  base::ThreadChecker thread_checker_;

  // Camera device information.
  const DeviceInfo device_info_;

  // Delegate to communicate with camera device. Caller owns the ownership.
  V4L2CameraDevice* device_;

  int current_frame_number_;

  bool af_trigger_;

  int max_supported_fps_;

  // Sensor handler to get sensor related metadata.
  std::unique_ptr<SensorHandler> sensor_handler_;

  // Awb mode to color temperature map
  AwbModeToTemperatureMap awb_temperature_;
  bool is_awb_control_supported_;

  bool is_brightness_control_supported_;
  bool is_contrast_control_supported_;
  bool is_pan_control_supported_;
  bool is_saturation_control_supported_;
  bool is_sharpness_control_supported_;
  bool is_tilt_control_supported_;
  bool is_zoom_control_supported_;

  uint32_t focus_distance_normalize_factor_;
  ControlRange focus_distance_range_;
};

}  // namespace cros

#endif  // CAMERA_HAL_USB_METADATA_HANDLER_H_
