/*
 * 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_COMMON_TYPES_H_
#define CAMERA_HAL_USB_COMMON_TYPES_H_

#include <string>
#include <vector>

#include "cros-camera/common_types.h"
#include "cros-camera/timezone.h"

// TODO(crbug.com/661877): Wrap this with kernel version check once the
// format is introduced to kernel.
#ifndef V4L2_PIX_FMT_INVZ
// 16 bit depth, Realsense SR300.
#define V4L2_PIX_FMT_INVZ v4l2_fourcc('I', 'N', 'V', 'Z')
#endif

namespace cros {

// The definition should match camera_metadata_enum_android_lens_facing_t
// in camera_metadata_tags.h.
enum class LensFacing {
  kFront,
  kBack,
  kExternal,
};

struct DeviceInfo {
  int camera_id = -1;

  // TODO(shik): Change this to base::FilePath.
  // ex: /dev/video0
  std::string device_path;

  // Whether the device is an emulated vivid camera.
  bool is_vivid = false;

  // USB vendor id, the emulated vivid devices do not have this field.
  std::string usb_vid;

  // USB product id, the emulated vivid devices do not have this field.
  std::string usb_pid;

  // Some cameras need to wait several frames to output correct images.
  uint32_t frames_to_skip_after_streamon = 0;

  // Power line frequency supported by device, which will be filled according to
  // the current location instead of camera_characteristics.conf.
  PowerLineFrequency power_line_frequency = PowerLineFrequency::FREQ_DEFAULT;

  // The camera doesn't support constant frame rate. That means HAL cannot set
  // V4L2_CID_EXPOSURE_AUTO_PRIORITY to 0 to have constant frame rate in low
  // light environment.
  bool constant_framerate_unsupported = false;

  // Region of interest is used for 3A. If this is true, it will enable
  // face detection and report ROI information to camera.
  bool region_of_interest_supported = false;

  // Enable face detection and ROI control by camera module from
  // camera_characteristics.conf.
  // TODO(henryhsu): Remove it when we enable the feature for all modules which
  // support ROI.
  bool enable_face_detection = false;

  // Member definitions can be found in https://developer.android.com/
  // reference/android/hardware/camera2/CameraCharacteristics.html
  LensFacing lens_facing = LensFacing::kFront;
  int32_t sensor_orientation = 0;

  // Special settings for device specific quirks.
  uint32_t quirks = 0;

  // These fields are not available for external cameras.
  std::vector<float> lens_info_available_apertures;
  std::vector<float> lens_info_available_focal_lengths;
  float lens_info_minimum_focus_distance = 0;
  float lens_info_optimal_focus_distance = 0;
  float sensor_info_physical_size_width = 0;
  float sensor_info_physical_size_height = 0;
  int32_t sensor_info_pixel_array_size_width = 0;
  int32_t sensor_info_pixel_array_size_height = 0;
  Rect<int32_t> sensor_info_active_array_size;

  // These values are only used for legacy devices (v1 devices).
  float horizontal_view_angle_16_9 = 0;
  float horizontal_view_angle_4_3 = 0;
  float vertical_view_angle_16_9 = 0;
  float vertical_view_angle_4_3 = 0;
};

typedef std::vector<DeviceInfo> DeviceInfos;

struct SupportedFormat {
  uint32_t width = 0;
  uint32_t height = 0;
  uint32_t fourcc = 0;
  // All the supported frame rates in fps with given width, height, and
  // pixelformat. This is not sorted. For example, suppose width, height, and
  // fourcc are 640x480 YUYV. If frame rates are 15.0 and 30.0, the camera
  // supports outputting 640x480 YUYV in 15fps or 30fps.
  std::vector<float> frame_rates;

  uint32_t area() const { return width * height; }
  bool operator<(const SupportedFormat& rhs) const {
    if (area() == rhs.area()) {
      return width < rhs.width;
    }
    return area() < rhs.area();
  }
  bool operator==(const SupportedFormat& rhs) const {
    return width == rhs.width && height == rhs.height;
  }
};

typedef std::vector<SupportedFormat> SupportedFormats;

}  // namespace cros

#endif  // CAMERA_HAL_USB_COMMON_TYPES_H_
