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

library fuchsia.camera;

using fuchsia.sysmem;
using zx;

const uint32 MAX_FORMATS_PER_RESPONSE = 16;

// A coarse set of capabilities.  This struct is used in the camera description
// to help filter out cameras which will not have the needed capabilities.
// This set of declarations would be the bitfield: CameraOutputCapabilities.
const uint32 CAMERA_OUTPUT_UNKNOWN = 0;
const uint32 CAMERA_OUTPUT_STILL_IMAGE = 0x01;
const uint32 CAMERA_OUTPUT_BURST = 0x02;
const uint32 CAMERA_OUTPUT_STREAM = 0x04;
const uint32 CAMERA_OUTPUT_HDR = 0x08;
const uint32 CAMERA_OUTPUT_DEPTH = 0x10;
const uint32 CAMERA_OUTPUT_STEREO = 0x20;

// Identifying information about the device.
struct DeviceInfo {
  uint64 camera_id;  // Currently populated by the camera manager
  uint16 vendor_id;
  string vendor_name;
  uint16 product_id;
  string product_name;
  string serial_number;
  // The maximum number of stream interfaces that the device can support
  // simultaneously.
  uint16 max_stream_count;
  uint32 output_capabilities;  // CameraOutputCapabilities
  // TODO(CAM-12): Add CameraPose, when we can actually use it.
};

// Status to be set when a frame is signalled available.
enum FrameStatus {
  OK = 0;
  // An error occurred during the production of a frame.
  // No data will be available in the data buffer corresponding to this
  // notification.
  ERROR_FRAME = 1;

  // No space was available in the data buffer, resulting in a dropped frame.
  ERROR_BUFFER_FULL = 2;
};

struct Metadata {
  int64 timestamp;
};

// Sent by the driver to the client when a frame is available for processing,
// or an error occurred.
struct FrameAvailableEvent {
  // Non zero if an error occurred.
  FrameStatus frame_status;

  // The index of the buffer in the buffer collection.
  uint32 buffer_id;

  Metadata metadata;
};

struct FrameRate {
  // The frame rate is frames_per_sec_numerator / frames_per_sec_denominator.
  uint32 frames_per_sec_numerator;
  uint32 frames_per_sec_denominator;
};

struct VideoFormat {
  fuchsia.sysmem.ImageFormat format;
  FrameRate rate;
};

// These are the original interfaces, which are being used for compatibility.
// The names are preserved from the ones in camera.h for porting ease.
[Discoverable]
interface Control {
  // Get the available format types for this device
  // NOTE: The formats are paginated to MAX_FORMATS_PER_RESPONSE, multiple
  // GetFormats need to be issued until total_format_count are received
  1: GetFormats(uint32 index)
          ->(vector<VideoFormat> formats, uint32 total_format_count,
             zx.status status);

  // Sent by the client to indicate desired stream characteristics.
  // If setting the format is successful, the stream request will be honored.
  // The stream token is used to provide additional control over the interface from the
  // Camera Manager.  The driver provides the guarantee that:
  //     1) If the stream token receives the PEER_CLOSED event, the driver will close
  //        the stream.
  //     2) If the Stream interface is closed, the driver will close the eventpair.
  2: CreateStream(fuchsia.sysmem.BufferCollectionInfo buffer_collection,
                  FrameRate rate, request<Stream> stream, handle<eventpair> stream_token);

  3: GetDeviceInfo() -> (DeviceInfo device_info);
};

interface Stream {
  // Starts the streaming of frames.
  1: Start();

  // Stops the streaming of frames.
  2: Stop();

  // Unlocks the specified frame, allowing the driver to reuse the memory.
  3: ReleaseFrame(uint32 buffer_id);

  // Sent by the driver to the client when a frame is available for processing,
  // or an error occurred.
  4:->OnFrameAvailable(FrameAvailableEvent frame);
};
