/* 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 <memory>

#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 {

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);

  // 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);

  // 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_;
};

}  // namespace cros

#endif  // CAMERA_HAL_USB_METADATA_HANDLER_H_
