// Copyright 2019 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.camera2.hal;

using fuchsia.camera2;
using fuchsia.sysmem;
using zx;

/// Maximum number of configurations per device.
const uint64 MAX_CONFIGURATIONS = 256;

/// Maximum number of streams per config.
const uint64 MAX_STREAMS = 64;

/// Represents one stream within a particular configuration.
struct StreamConfig {
    fuchsia.camera2.FrameRate frame_rate;
    /// `constraints` should allow for all the image formats listed in image_formats.
    fuchsia.sysmem.BufferCollectionConstraints constraints;

    /// Properties of the stream:
    fuchsia.camera2.StreamProperties properties;

    /// We need to specify both the constraints & the image formats because
    /// there are fixed set of resolutions supported by the Camera Controller
    /// so a range within the `constraints` won't be sufficient.
    /// Some streams support multiple resolutions for same configuration
    /// We would need to change the resolution runtime, without stopping the
    /// streaming. This provides a list of resolutions a stream would be providing.
    /// At least one format must be provided.
    vector<fuchsia.sysmem.ImageFormat_2>:fuchsia.camera2.MAX_IMAGE_FORMATS image_formats;
};

/// Represents one configuration
struct Config {
    // One configuration could have multiple streams.
    vector<StreamConfig>:MAX_STREAMS stream_configs;
};

/// This is the interface to the camera driver
/// which allows setting up a given configuration
/// and setting up a stream.
[Discoverable]
protocol Controller {
    // TODO(48707): Change to GetConfig() which returns a single configuration instead
    /// of a vector of Configs.
    /// Get an available configurations which the camera driver supports.
    /// Clients need to keep calling GetConfigs() to get all available configurations.
    /// Returns |nullptr| if no new configurations are supported.
    GetConfigs() -> (vector<Config>:MAX_CONFIGURATIONS? configs, zx.status status);

    /// Set a particular configuration and create the requested stream.
    /// `config_index` : Configuration index from the vector which needs to be applied.
    /// `stream_index` : Stream index from the vector of streams provided within a config.
    /// `buffer_collection` : Buffer collections for the stream.
    /// `stream` : Stream channel for the stream requested
    /// `image_format_index` : Image format index which needs to be set up upon creation.
    /// If there is already an active configuration which is different than the one
    /// which is requested to be set, then the HAL will be closing all existing streams
    /// and honor this new setup call.
    /// If the new stream requested is already part of the existing running configuration
    /// the HAL will just be creating this new stream while the other stream still exists as is.
    CreateStream(uint32 config_index,
                 uint32 stream_index,
                 uint32 image_format_index,
                 fuchsia.sysmem.BufferCollectionInfo_2 buffer_collection,
                 request<fuchsia.camera2.Stream> stream);

    /// Enable/Disable Streaming
    EnableStreaming();
    DisableStreaming();

    // Get identifying information about the device:
    GetDeviceInfo() -> (fuchsia.camera2.DeviceInfo info);
};
