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

// This file is being deprecated - please do not rely on any of the structs or
// protocols here moving forward.

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;
    /// The maximum number of stream interfaces that the device can support
    /// simultaneously.
    uint16 max_stream_count;
    uint32 output_capabilities; // CameraOutputCapabilities
    // TODO(fxbug.dev/3397): 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]
protocol 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
    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.
    CreateStream(fuchsia.sysmem.BufferCollectionInfo buffer_collection,
                 FrameRate rate, request<Stream> stream, zx.handle:EVENTPAIR stream_token);

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

protocol Stream {
    /// Starts the streaming of frames.
    Start();

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

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

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