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

/// A stream that the camera manager can provide.  Video streams reference a
/// a camera, but may have additional hardware and bandwidth restrictions
/// from and ISP or other processing units.
/// This is being deprecated - please use VideoStreamV2 (below).
struct VideoStream {
    /// The camera_id corresponds to the camera_id that is given in the DeviceInfo
    /// received from GetDevices.
    uint64 camera_id;
    /// The requested video format.  Note that this is field is necessary to
    /// set The frame rate, even when calling CreateStream.
    /// When calling CreateStream, format.format should match buffer_info.format.
    VideoFormat format;
};

/// Preferred version of stream.
/// A version of stream that relies on definition of VideoFormat coming out of
/// fuchsia.hardware.camera. Streams reference a camera, but may have additional
/// hardware and bandwidth restrictions from an ISP or other processing units.
/// New code should depend on this as the other version will be deprecated when
/// dependencies are removed.
struct VideoStreamV2 {
    /// The camera_id corresponds to the camera_id that is given in DeviceInfo
    /// received from GetDevices.
    uint64 camera_id;
    /// The requested video format. Note that this field is necessary to set the
    /// frame rate, even when calling CreateStream. When calling CreateStream
    /// format.format should match buffer_info.format.
    VideoFormat format;
};

/// The Camera Manager grants access to individual or sets of cameras
/// 1) You request the list of cameras, which gives you camera descriptions
/// 2) You request the list of formats available for the camera to which you
///    wish to connect.
/// 3) You request a Stream interface using CreateStream.
[Discoverable]
protocol Manager {
    /// Returns a list of all the video devices that are currently plugged in
    /// and enumerated.  The camera_id field of the DeviceInfo is used to specify
    /// a device in GetFormats, GetStream and GetStreamAndBufferCollection.
    GetDevices() -> (vector<DeviceInfo> descriptions);

    /// Get all the available formats for a camera.
    /// `camera_id` is obtained from a DeviceInfo returned by GetDevices.
    GetFormats(uint64 camera_id, uint32 index)
        -> (vector<VideoFormat> formats, uint32 total_format_count);

    /// Create a Stream with the specified access rights.  This may not succeed.
    /// If it does succeed, the Stream will have the rights indicated.
    /// `buffer_info` contains a set of buffers to be used with the Stream.
    /// This is being deprecated - please use CreateStreamV2.
    CreateStream(VideoStream request,
                 fuchsia.sysmem.BufferCollectionInfo buffer_info,
                 request<Stream> stream, handle<eventpair> client_token);

    /// Create a Stream with the specified access rights.  This may not succeed.
    /// If it does succeed, the Stream will have the rights indicated.
    /// `buffer_info` contains a set of buffers to be used with the Stream.
    [Transitional="This is meant to replace CreateStream"]
    CreateStreamV2(VideoStreamV2 request,
                   fuchsia.sysmem.BufferCollectionInfo buffer_info,
                   request<Stream> stream,
                   handle<eventpair> client_token);

};
