// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Next min version: 5

module cros.mojom;

import "camera/mojo/camera_metadata.mojom";

[Extensible]
enum HalPixelFormat {
  HAL_PIXEL_FORMAT_RGBA_8888 = 0x1,
  HAL_PIXEL_FORMAT_RGBX_8888 = 0x2,
  HAL_PIXEL_FORMAT_BGRA_8888 = 0x5,
  HAL_PIXEL_FORMAT_YCrCb_420_SP = 0x11,
  HAL_PIXEL_FORMAT_YCbCr_422_I = 0x14,
  HAL_PIXEL_FORMAT_BLOB = 0x21,
  HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED = 0x22,
  HAL_PIXEL_FORMAT_YCbCr_420_888 = 0x23,
  HAL_PIXEL_FORMAT_YV12 = 0x32315659,
};

// We wrap |crop_rotate_scale_degrees| into a struct because it's a newly added
// field in Camera3Stream. Therefore it needs to be nullable to be
// backward-compatible. Primitive types, like enum, are not nullable.
struct CropRotateScaleInfo {
  Camera3StreamRotation crop_rotate_scale_degrees;
};

// The following enums are from Android's camera HAL v3 API header
// (https://goo.gl/jciSjC).

enum Camera3StreamType {
  CAMERA3_STREAM_OUTPUT = 0,
  CAMERA3_STREAM_INPUT = 1,
  CAMERA3_STREAM_BIDIRECTIONAL = 2,
  CAMERA3_NUM_STREAM_TYPES,
};

enum Camera3StreamRotation {
  CAMERA3_STREAM_ROTATION_0 = 0,
  CAMERA3_STREAM_ROTATION_90 = 1,
  CAMERA3_STREAM_ROTATION_180 = 2,
  CAMERA3_STREAM_ROTATION_270 = 3,
};

enum Camera3StreamConfigurationMode {
  CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE = 0,
  CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE =1,
};

struct Camera3Stream {
  uint64 id;
  Camera3StreamType stream_type;
  uint32 width;
  uint32 height;
  HalPixelFormat format;
  // usage stores the gralloc usage flags for this stream and determines the
  // nature of it. The value is used by Chrome VCD, Android framework and camera
  // HAL. Read more on:
  // https://source.android.com/devices/graphics/arch-bq-gralloc#gralloc_HAL
  uint32 usage;
  uint32 max_buffers;
  uint32 data_space;
  Camera3StreamRotation rotation;
  [MinVersion=1] CropRotateScaleInfo? crop_rotate_scale_info;
  // Required for camera HAL device API versions >= 3.5.
  [MinVersion=4] string? physical_camera_id;
};

struct Camera3StreamConfiguration {
  array<Camera3Stream> streams;
  Camera3StreamConfigurationMode operation_mode;
  // Required for camera HAL device API versions >= 3.5.
  [MinVersion=4] CameraMetadata? session_parameters;
};

enum Camera3BufferStatus {
  CAMERA3_BUFFER_STATUS_OK = 0,
  CAMERA3_BUFFER_STATUS_ERROR = 1,
};

// Structure that contains needed information about a camera buffer that could
// be used to map in userspace.
struct CameraBufferHandle {
  uint64 buffer_id;
  array<handle> fds;
  uint32 drm_format;
  HalPixelFormat hal_pixel_format;
  uint32 width;
  uint32 height;
  array<uint32> strides;
  array<uint32> offsets;
  [MinVersion=3] array<uint32>? sizes;
};

struct Camera3StreamBuffer {
  uint64 stream_id;
  uint64 buffer_id;
  Camera3BufferStatus status;
  handle? acquire_fence;
  handle? release_fence;
  [MinVersion=2] CameraBufferHandle? buffer_handle;
};

enum Camera3MsgType {
  CAMERA3_MSG_ERROR = 1,
  CAMERA3_MSG_SHUTTER = 2,
  CAMERA3_NUM_MESSAGES,
};

enum Camera3ErrorMsgCode {
  CAMERA3_MSG_ERROR_DEVICE = 1,
  CAMERA3_MSG_ERROR_REQUEST = 2,
  CAMERA3_MSG_ERROR_RESULT = 3,
  CAMERA3_MSG_ERROR_BUFFER = 4,
  CAMERA3_MSG_NUM_ERRORS,
};

struct Camera3ErrorMsg {
  uint32 frame_number;
  uint64 error_stream_id;
  Camera3ErrorMsgCode error_code;
};

struct Camera3ShutterMsg {
  uint32 frame_number;
  uint64 timestamp;
};

union Camera3NotifyMsgMessage {
  Camera3ErrorMsg error;
  Camera3ShutterMsg shutter;
  array<uint8> generic;
};

struct Camera3NotifyMsg {
  Camera3MsgType type;
  Camera3NotifyMsgMessage message;
};

enum Camera3RequestTemplate {
  CAMERA3_TEMPLATE_PREVIEW = 1,
  CAMERA3_TEMPLATE_STILL_CAPTURE = 2,
  CAMERA3_TEMPLATE_VIDEO_RECORD = 3,
  CAMERA3_TEMPLATE_VIDEO_SNAPSHOT = 4,
  CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG = 5,
  CAMERA3_TEMPLATE_MANUAL = 6,
  CAMERA3_TEMPLATE_COUNT,
};

struct Camera3PhyscamMetadata {
  // |id| is the camera ID of the physical camera, and comes from
  // CameraCharacteristics.getPhysicalCameraIds(). All values are guaranteed to
  // be integers.
  int32 id;
  CameraMetadata metadata;
};

struct Camera3CaptureRequest {
  uint32 frame_number;
  CameraMetadata settings;
  Camera3StreamBuffer? input_buffer;
  array<Camera3StreamBuffer> output_buffers;
  // Required for camera HAL device API versions >= 3.5.
  [MinVersion=4] array<Camera3PhyscamMetadata>? physcam_settings;
};

struct Camera3CaptureResult {
  uint32 frame_number;
  CameraMetadata result;
  array<Camera3StreamBuffer>? output_buffers;
  Camera3StreamBuffer? input_buffer;
  uint32 partial_result;
  // Required for camera HAL device API versions >= 3.5.
  [MinVersion=4] array<Camera3PhyscamMetadata>? physcam_metadata;
};

// Camera3CallbackOps is a translation of the camera3_callback_ops_t API
// in Android camera HAL v3.  For the work flow of the functions in
// Camera3CallbackOps, see the comments about Camera3DeviceOps above.
//
// Next method ID: 2
interface Camera3CallbackOps {
  // ProcessCaptureResult() is called by the camera HAL to send result metadata
  // and filled buffer to the client.
  ProcessCaptureResult@0(Camera3CaptureResult result);

  // Notify() is called by the camera HAL to notify the client of the start of
  // each capture, and of errors encountered.
  Notify@1(Camera3NotifyMsg msg);
};

// Camera3DeviceOps is mostly a translation of the camera3_device_ops_t API from
// Android camera HAL v3.  This is the interface to interact with a camera
// device in the camera HAL.
//
// The work flow of the Camera3DeviceOps is:
//
//   1. Call Initialize() to register the Camera3CallbackOps interface with the
//      camera HAL.
//
//   2. Call ConfigureStreams() to negotiate the set of usable video streams
//      with the camera HAL.
//
//   3. After the video streams are successfully configured, call
//      ConstructDefaultRequestSettings() to get the capture settings for each
//      stream.  The capture settings of a stream will be associated with the
//      capture requests of the stream.
//
//   4. Start the capture loop. The capture loop is composed of a series of
//      capture requests and results.
//
//      The capture loop shall call ProcessCaptureRequest() to request capturing
//      each frame.  A request may contain multiple streams and the camera HAL
//      would fill the buffers of each streams per requirements specified in
//      ConfigureStreams().  For example, the camera HAL may fill a frame to a
//      still capture buffer with the native capture resolution, and down-scale
//      the same frame to a lower resolution for the preview buffer.
//
//      The client may continue calling ProcessCaptureRequest() up to the
//      pipe-line depth configured in ConfigureStreams().
//
//      When the camera HAL is done with a capture request, the capture result
//      is sent back to the client through the callbacks in Camera3CallbackOps.
//
//      For each capture result:
//        a. The camera HAL notifies the client through Notify() of the shutter
//           time of the captured frame.  If an error happens while capturing a
//           frame or filling a buffer, the camera HAL notifies the client
//           through Notify() of the error.
//        b. The camera HAL returns the capture result with various result
//           metadata and the filled buffers to the client in
//           ProcessCaptureResult().  The result metadata may be sent partially
//           in multiple stages, and the client must wait until all the partial
//           metadata are received before handing the capture result to upper
//           layer.
//
//    5. Dump() can be used to dump various information of the camera HAL for
//       debug purpose.
//
//    6. Flush() tells the camera HAL to finish processing or discard the
//       current on-going capture requests and return to the state where
//       ConfigureStreams() can be called again to set up new streams.
//
//    7. Close() closes the camera device.
//
// Next method ID: 9
interface Camera3DeviceOps {
  // Initialize() is called once after the camera device is opened to register
  // the Camera3CallbackOps handle.
  Initialize@0(pending_remote<Camera3CallbackOps> callback_ops)
      => (int32 result);

  // ConfigureStreams() is called every time the client needs to set up new set
  // of streams.
  ConfigureStreams@1(Camera3StreamConfiguration config) =>
      (int32 result, Camera3StreamConfiguration? updated_config);

  // ConstructDefaultRequestSettings() is called to get the request settings for
  // common use cases, e.g. preview, still capture, video recording...etc.
  ConstructDefaultRequestSettings@2(Camera3RequestTemplate type) =>
      (CameraMetadata? settings);

  // ProcessCaptureRequest() is the core method and is called for every captured
  // frame to provide the camera HAL with the capture settings and the
  // associated buffers to fill.
  ProcessCaptureRequest@3(Camera3CaptureRequest request) => (int32 result);

  // Dump() is called to gather various states and information about the camera
  // HAL; it is mainly for debug purpose.
  Dump@4(handle fd);

  // Flush() is called to clear out any in-progress captures and return the
  // camera HAL to idle state.
  Flush@5() => (int32 result);

  // [Deprecated in version 2]
  //
  // The type of buffers the CrOS camera service currently supports.
  // DMABUF is for the DMA buffer allocated through GBM.
  // SHM is for the shared memory buffer allocated by Chrome. Deprecated.
  enum BufferType {
    DMABUF = 0,   // DMA buffer. Needs to be imported through GBM.
    SHM = 1,      // Shared memory buffer. Deprecated and not used.
  };

  // [Deprecated in version 2]
  //
  // RegisterBuffer() is called to register a buffer with the camera HAL.  The
  // registered buffer can then be specified in ProcessCaptureRequest() for the
  // camera HAL to fill captured frame.  RegisterBuffer() is not part of the
  // Android camera HAL v3 API; it is added for CrOS camera service to pass
  // buffer handles across different processes.
  RegisterBuffer@6(uint64 buffer_id, BufferType type, array<handle> fds,
                   uint32 drm_format, HalPixelFormat hal_pixel_format,
                   uint32 width, uint32 height, array<uint32> strides,
                   array<uint32> offsets) =>
      (int32 result);

  // Close() is called to close the camera device.
  Close@7() => (int32 result);

  // ConfigureStreamsAndGetAllocatedBuffers() is called every time the client
  // needs to set up new set of streams. Also allocated buffers for clients that
  // do not have capabilities to allocate DMA-bufs.
  [MinVersion=3]
  ConfigureStreamsAndGetAllocatedBuffers@8(Camera3StreamConfiguration config) =>
      (int32 result, Camera3StreamConfiguration? updated_config,
       map<uint64, array<Camera3StreamBuffer>> allocated_buffers);
};
