// 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 MAX_FORMATS_PER_RESPONSE uint32 = 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 CAMERA_OUTPUT_UNKNOWN uint32 = 0;
const CAMERA_OUTPUT_STILL_IMAGE uint32 = 0x01;
const CAMERA_OUTPUT_BURST uint32 = 0x02;
const CAMERA_OUTPUT_STREAM uint32 = 0x04;
const CAMERA_OUTPUT_HDR uint32 = 0x08;
const CAMERA_OUTPUT_DEPTH uint32 = 0x10;
const CAMERA_OUTPUT_STEREO uint32 = 0x20;

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

/// Status to be set when a frame is signalled available.
type FrameStatus = strict enum {
    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;
};

type Metadata = struct {
    timestamp int64;
};

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

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

    metadata Metadata;
};

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

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

/// 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(struct {
        index uint32;
    }) -> (struct {
        formats vector<VideoFormat>;
        total_format_count uint32;
        status zx.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(resource struct {
        buffer_collection fuchsia.sysmem.BufferCollectionInfo;
        rate FrameRate;
        stream server_end:Stream;
        stream_token zx.handle:EVENTPAIR;
    });

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

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(struct {
        buffer_id uint32;
    });

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