// Copyright 2020 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.camera3;

const uint32 MAX_IDENTIFIER_LENGTH = 256;
const uint32 MAX_CONFIGURATIONS_PER_CAMERA = 256;
const uint32 MAX_STREAMS_PER_CONFIGURATION = 256;

/// A Device represents a unique physical camera present in the system. Only one client may connect
/// to an unbound physical camera, however the "Rebind" method can be used to create multiple
/// connections to it to be used by a coordinated set of clients.
protocol Device {
    /// Returns an identifier for the camera. If present, identical devices on different systems
    /// will have the same identifier. Clients may use this to determine if additional semantics
    /// known a priori for a given device apply to the current camera.
    // TODO(fxbug.dev/43247): unify device identification
    // go/unified-device-discovery will eliminate the need for this protocol
    GetIdentifier() -> (string:MAX_IDENTIFIER_LENGTH? identifier);

    /// Returns a list of configurations supported by the camera. All cameras will have at least
    /// one configuration. The values returned are immutable - they will not change for the
    /// lifetime of the client's connection to the Camera.
    [Transitional, Deprecated = "Use GetConfigurations2"]
    GetConfigurations() -> (vector<Configuration>:MAX_CONFIGURATIONS_PER_CAMERA configurations);

    /// Returns a list of configurations supported by the camera. All cameras will have at least
    /// one configuration. The values returned are immutable - they will not change for the
    /// lifetime of the client's connection to the Camera.
    [Transitional]
    GetConfigurations2() -> (vector<Configuration2>:MAX_CONFIGURATIONS_PER_CAMERA configurations);

    /// Returns the index of the current configuration when it has changed from a previously
    /// returned configuration, or is called by a client for the first time.
    WatchCurrentConfiguration() -> (uint32 index);

    /// Sets the configuration using the provided index. Calling this method disconnects any
    /// existing Stream clients associated with this camera. An epitaph of ZX_OK
    /// will be sent for any connected Stream clients on closing.
    SetCurrentConfiguration(uint32 index);

    /// Returns the camera's current mute state when it has changed from a previously returned
    /// state, or is called by a client for the first time. A camera may be muted using
    /// SetSoftwareMuteState or by a physical switch. If either muted mode is active, stream
    /// clients associated with this physical camera will stop receiving new frames.
    WatchMuteState() -> (bool software_muted, bool hardware_muted);

    /// Sets the current camera's software mute state. When transitioning to the muted state, this
    /// method returns when the camera has successfully ceased sending new frames to stream
    /// clients. When transitioning to the unmuted state, this method returns immediately.
    SetSoftwareMuteState(bool muted) -> ();

    /// Connects to the Stream at the provided index. If any clients already exist for this stream,
    /// the request is closed with the ZX_ERR_ALREADY_BOUND epitaph.
    ConnectToStream(uint32 index, request<Stream> request);

    /// Request another connection to this Device. This allows a client to delegate different
    /// operations to different coordinated clients.
    Rebind(request<Device> request);
};

/// Describes a distinct configuration for the camera.
struct Configuration {
    /// Descriptions of streams that are concurrently available in the configuration.
    vector<StreamProperties>:MAX_STREAMS_PER_CONFIGURATION streams;
};

/// Describes a distinct configuration for the camera.
table Configuration2 {
    /// Descriptions of streams that are concurrently available in the configuration.
    1: vector<StreamProperties2>:MAX_STREAMS_PER_CONFIGURATION streams;
};
