// 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;
    string serial_number;
    // The maximum number of stream interfaces that the device can support
    // simultaneously.
    uint16 max_stream_count;
    uint32 output_capabilities; // CameraOutputCapabilities
    // TODO(CAM-12): 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, 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);
};
