// Copyright 2016 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.

module arc;

struct MojoDeviceInfo {
  string device_path@0;
  string usb_vid@1;
  string usb_pid@2;
  // Direction the camera faces relative to device screen.
  // The value is ANDROID_LENS_FACING_* in camera_metadata_tags.h
  [MinVersion=1] uint32 lens_facing@3;
  // Clockwise angle through which the output image needs to be rotated to be
  // upright on the device screen in its native orientation.
  // Only [0, 90, 180, 270] values are valid.
  [MinVersion=1] int32 sensor_orientation@4;
  // The number of frames will be skipped after stream on.
  [MinVersion=1] uint32 frames_to_skip_after_streamon@5;
  // The horizontal field of view for 16:9 aspect ratio.
  [MinVersion=1] float horizontal_view_angle_16_9@6;
  // The horizontal field of view for 4:3 aspect ratio.
  [MinVersion=1] float horizontal_view_angle_4_3@7;
  // List of focal lengths that are supported by this camera device.
  [MinVersion=1] array<float>? lens_info_available_focal_lengths@8;
  // Shortest distance from frontmost surface of the lens that can be brought
  // into sharp focus.
  [MinVersion=1] float lens_info_minimum_focus_distance@9;
  // The distance from frontmost surface of the lens that the image is
  // sharpest.
  [MinVersion=1] float lens_info_optimal_focus_distance@10;
  // The vertical field of view for 16:9 aspect ratio.
  [MinVersion=1] float vertical_view_angle_16_9@11;
  // The vertical field of view for 4:3 aspect ratio.
  [MinVersion=1] float vertical_view_angle_4_3@12;
};

struct MojoSupportedFormat {
  uint32 width;
  uint32 height;
  uint32 fourcc;
  array<float> frameRates;
};

interface ArcCameraService {
  // Connect camera device with |device_path|. Return 0 in |result| if device is
  // opened successfully; -errno otherwise.
  Connect@0(string device_path) => (int32 result);
  // Disconnect camera device. This function is a no-op if the camera device
  // is not connected. If the stream is on, this function will also stop the
  // stream.
  Disconnect@1() => ();
  // Enable camera device stream. Set up captured frame with |width|x|height|
  // resolution, |pixel_format|, and |frame_rate|. |pixel_format| is
  // V4L2_PIX_FORMAT_* in videodev2.h. Return frame buffer file descriptors
  // |fds| and |buffer_size|. |buffer_size| is the size allocated for each
  // buffer. The ownership of |fds| are transferred to the caller and |fds|
  // should be closed when done. Caller can memory map |fds| and should unmap
  // when done. Return 0 in |result| if device supports the format; -errno
  // otherwise. This function should be called after Connect().
  StreamOn@2(uint32 width, uint32 height, uint32 pixel_format, float frame_rate)
      => (array<handle> fds, uint32 buffer_size, int32 result);
  // Disable camera device stream. Return 0 in |result| if device disables
  // stream successfully; -errno otherwise. This function is a no-op if the
  // stream is already stopped.
  StreamOff@3() => (int32 result);
  // Get next frame buffer from device. Device returns the corresponding
  // buffer with |buffer_id| and |data_size| bytes. |buffer_id| is the index
  // into the array of handles |fds| returned from StreamOn. |data_size| is the
  // number of bytes used in the buffer for this frame. Return 0 in |result| if
  // device gets the buffer successfully; -errno otherwise. Return -EAGAIN
  // immediately if next frame buffer is not ready. This function should be
  // called after StreamOn().
  GetNextFrameBuffer@4() => (uint32 buffer_id, uint32 data_size, int32 result);
  // Return |buffer_id| buffer to device. Return 0 in |result| if the buffer is
  // returned successfully; -errno otherwise. This function should be called
  // after StreamOn().
  ReuseFrameBuffer@5(uint32 buffer_id) => (int32 result);
  // Get all supported formats of device by |device_path|. This function can be
  // called without calling Connect().
  GetDeviceSupportedFormats@6(string device_path)
      => (array<MojoSupportedFormat> supported_formats);
  // Get all camera devices information. This function can be called without
  // calling Connect().
  GetCameraDeviceInfos@7() => (array<MojoDeviceInfo> device_infos);
};

interface ArcCameraInstance {
};
