/*
 * Copyright (C) 2016 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package android.hardware.camera.device@3.2;

import android.hardware.graphics.common@1.0::types;

typedef vec<uint8_t> CameraMetadata;
typedef bitfield<BufferUsage> BufferUsageFlags;
typedef bitfield<Dataspace> DataspaceFlags;

/**
 * StreamType:
 *
 * The type of the camera stream, which defines whether the camera HAL device is
 * the producer or the consumer for that stream, and how the buffers of the
 * stream relate to the other streams.
 */
enum StreamType : uint32_t {
    /**
     * This stream is an output stream; the camera HAL device must fill buffers
     * from this stream with newly captured or reprocessed image data.
     */
    OUTPUT = 0,

    /**
     * This stream is an input stream; the camera HAL device must read buffers
     * from this stream and send them through the camera processing pipeline,
     * as if the buffer was a newly captured image from the imager.
     *
     * The pixel format for input stream can be any format reported by
     * android.scaler.availableInputOutputFormatsMap. The pixel format of the
     * output stream that is used to produce the reprocessing data may be any
     * format reported by android.scaler.availableStreamConfigurations. The
     * supported input/output stream combinations depends the camera device
     * capabilities, see android.scaler.availableInputOutputFormatsMap for
     * stream map details.
     *
     * This kind of stream is generally used to reprocess data into higher
     * quality images (that otherwise would cause a frame rate performance
     * loss), or to do off-line reprocessing.
     *
     * The typical use cases are OPAQUE (typically ZSL) and YUV reprocessing,
     * see S8.2, S8.3 and S10 for more details.
     */
    INPUT = 1

};

/**
 * StreamRotation:
 *
 * The required counterclockwise rotation of camera stream.
 */
enum StreamRotation : uint32_t  {
    /** No rotation */
    ROTATION_0 = 0,

    /** Rotate by 90 degree counterclockwise */
    ROTATION_90 = 1,

    /** Rotate by 180 degree counterclockwise */
    ROTATION_180 = 2,

    /** Rotate by 270 degree counterclockwise */
    ROTATION_270 = 3

};

/**
 * StreamConfigurationMode:
 *
 * This defines the general operation mode for the HAL (for a given stream
 * configuration) where modes besides NORMAL have different semantics, and
 * usually limit the generality of the API in exchange for higher performance in
 * some particular area.
 */
enum StreamConfigurationMode : uint32_t {
    /**
     * Normal stream configuration operation mode. This is the default camera
     * operation mode, where all semantics of HAL APIs and metadata controls
     * apply.
     */
    NORMAL_MODE = 0,

    /**
     * Special constrained high speed operation mode for devices that can not
     * support high speed output in NORMAL mode. All streams in this
     * configuration are operating at high speed mode and have different
     * characteristics and limitations to achieve high speed output. The NORMAL
     * mode can still be used for high speed output if the HAL can support high
     * speed output while satisfying all the semantics of HAL APIs and metadata
     * controls. It is recommended for the HAL to support high speed output in
     * NORMAL mode (by advertising the high speed FPS ranges in
     * android.control.aeAvailableTargetFpsRanges) if possible.
     *
     * This mode has below limitations/requirements:
     *
     *   1. The HAL must support up to 2 streams with sizes reported by
     *      android.control.availableHighSpeedVideoConfigurations.
     *   2. In this mode, the HAL is expected to output up to 120fps or
     *      higher. This mode must support the targeted FPS range and size
     *      configurations reported by
     *      android.control.availableHighSpeedVideoConfigurations.
     *   3. The HAL must support IMPLEMENTATION_DEFINED output
     *      stream format.
     *   4. To achieve efficient high speed streaming, the HAL may have to
     *      aggregate multiple frames together and send to camera device for
     *      processing where the request controls are same for all the frames in
     *      this batch (batch mode). The HAL must support max batch size and the
     *      max batch size requirements defined by
     *      android.control.availableHighSpeedVideoConfigurations.
     *   5. In this mode, the HAL must override aeMode, awbMode, and afMode to
     *      ON, ON, and CONTINUOUS_VIDEO, respectively. All post-processing
     *      block mode controls must be overridden to be FAST. Therefore, no
     *      manual control of capture and post-processing parameters is
     *      possible. All other controls operate the same as when
     *      android.control.mode == AUTO. This means that all other
     *      android.control.* fields must continue to work, such as
     *
     *      android.control.aeTargetFpsRange
     *      android.control.aeExposureCompensation
     *      android.control.aeLock
     *      android.control.awbLock
     *      android.control.effectMode
     *      android.control.aeRegions
     *      android.control.afRegions
     *      android.control.awbRegions
     *      android.control.afTrigger
     *      android.control.aePrecaptureTrigger
     *
     *      Outside of android.control.*, the following controls must work:
     *
     *      android.flash.mode (TORCH mode only, automatic flash for still
     *          capture must not work since aeMode is ON)
     *      android.lens.opticalStabilizationMode (if it is supported)
     *      android.scaler.cropRegion
     *      android.statistics.faceDetectMode (if it is supported)
     *   6. To reduce the amount of data passed across process boundaries at
     *      high frame rate, within one batch, camera framework only propagates
     *      the last shutter notify and the last capture results (including partial
     *      results and final result) to the app. The shutter notifies and capture
     *      results for the other requests in the batch are derived by
     *      the camera framework. As a result, the HAL can return empty metadata
     *      except for the last result in the batch.
     *
     * For more details about high speed stream requirements, see
     * android.control.availableHighSpeedVideoConfigurations and
     * CONSTRAINED_HIGH_SPEED_VIDEO capability defined in
     * android.request.availableCapabilities.
     *
     * This mode only needs to be supported by HALs that include
     * CONSTRAINED_HIGH_SPEED_VIDEO in the android.request.availableCapabilities
     * static metadata.
     */
    CONSTRAINED_HIGH_SPEED_MODE = 1,

    /**
     * A set of vendor-defined operating modes, for custom default camera
     * application features that can't be implemented in the fully flexible fashion
     * required for NORMAL_MODE.
     */
    VENDOR_MODE_0 = 0x8000,
    VENDOR_MODE_1,
    VENDOR_MODE_2,
    VENDOR_MODE_3,
    VENDOR_MODE_4,
    VENDOR_MODE_5,
    VENDOR_MODE_6,
    VENDOR_MODE_7
};

/**
 * Stream:
 *
 * A descriptor for a single camera input or output stream. A stream is defined
 * by the framework by its buffer resolution and format, and additionally by the
 * HAL with the gralloc usage flags and the maximum in-flight buffer count.
 *
 * If a configureStreams() call returns a non-fatal error, all active streams
 * remain valid as if configureStreams() had not been called.
 *
 */
struct Stream {
    /**
     * Stream ID - a nonnegative integer identifier for a stream.
     *
     * The identical stream ID must reference the same stream, with the same
     * width/height/format, across consecutive calls to configureStreams.
     *
     * If previously-used stream ID is not used in a new call to
     * configureStreams, then that stream is no longer active. Such a stream ID
     * may be reused in a future configureStreams with a new
     * width/height/format.
     *
     */
    int32_t id;

    /**
     * The type of the stream (input vs output, etc).
     */
    StreamType streamType;

    /**
     * The width in pixels of the buffers in this stream
     */
    uint32_t width;

    /**
     * The height in pixels of the buffers in this stream
     */
    uint32_t height;

    /**
     * The pixel format for the buffers in this stream.
     *
     * If IMPLEMENTATION_DEFINED is used, then the platform
     * gralloc module must select a format based on the usage flags provided by
     * the camera device and the other endpoint of the stream.
     *
     */
    android.hardware.graphics.common@1.0::PixelFormat format;

    /**
     * The gralloc usage flags for this stream, as needed by the consumer of
     * the stream.
     *
     * The usage flags from the producer and the consumer must be combined
     * together and then passed to the platform gralloc HAL module for
     * allocating the gralloc buffers for each stream.
     *
     * The HAL may use these consumer flags to decide stream configuration. For
     * streamType INPUT, the value of this field is always 0. For all streams
     * passed via configureStreams(), the HAL must set its own
     * additional usage flags in its output HalStreamConfiguration.
     *
     * The usage flag for an output stream may be bitwise combination of usage
     * flags for multiple consumers, for the purpose of sharing one camera
     * stream between those consumers. The HAL must fail configureStreams call
     * with ILLEGAL_ARGUMENT if the combined flags cannot be supported due to
     * imcompatible buffer format, dataSpace, or other hardware limitations.
     */
    BufferUsageFlags usage;

    /**
     * A field that describes the contents of the buffer. The format and buffer
     * dimensions define the memory layout and structure of the stream buffers,
     * while dataSpace defines the meaning of the data within the buffer.
     *
     * For most formats, dataSpace defines the color space of the image data.
     * In addition, for some formats, dataSpace indicates whether image- or
     * depth-based data is requested. See
     * android.hardware.graphics.common@1.0::types for details of formats and
     * valid dataSpace values for each format.
     *
     * The HAL must use this dataSpace to configure the stream to the correct
     * colorspace, or to select between color and depth outputs if
     * supported. The dataspace values are set using the V0 dataspace
     * definitions.
     */
    DataspaceFlags dataSpace;

    /**
     * The required output rotation of the stream.
     *
     * This must be inspected by HAL along with stream width and height. For
     * example, if the rotation is 90 degree and the stream width and height is
     * 720 and 1280 respectively, camera service must supply buffers of size
     * 720x1280, and HAL must capture a 1280x720 image and rotate the image by
     * 90 degree counterclockwise. The rotation field must be ignored when the
     * stream type is input.
     *
     * The HAL must inspect this field during stream configuration and return
     * IllegalArgument if HAL cannot perform such rotation. HAL must always
     * support ROTATION_0, so a configureStreams() call must not fail for
     * unsupported rotation if rotation field of all streams is ROTATION_0.
     *
     */
    StreamRotation rotation;

};

/**
 * StreamConfiguration:
 *
 * A structure of stream definitions, used by configureStreams(). This
 * structure defines all the output streams and the reprocessing input
 * stream for the current camera use case.
 */
struct StreamConfiguration {
    /**
     * An array of camera stream pointers, defining the input/output
     * configuration for the camera HAL device.
     *
     * At most one input-capable stream may be defined.
     * At least one output-capable stream must be defined.
     */
    vec<Stream> streams;

    /**
     * The operation mode of streams in this configuration. The HAL can use this
     * mode as an indicator to set the stream property (e.g.,
     * HalStream::maxBuffers) appropriately. For example, if the
     * configuration is
     * CONSTRAINED_HIGH_SPEED_MODE, the HAL may
     * want to set aside more buffers for batch mode operation (see
     * android.control.availableHighSpeedVideoConfigurations for batch mode
     * definition).
     *
     */
    StreamConfigurationMode operationMode;

};

/**
 * HalStream:
 *
 * The camera HAL's response to each requested stream configuration.
 *
 * The HAL may specify the desired format, maximum buffers, and
 * usage flags for each stream.
 *
 */
struct HalStream {
    /**
     * Stream ID - a nonnegative integer identifier for a stream.
     *
     * The ID must be one of the stream IDs passed into configureStreams.
     */
    int32_t id;

    /**
     * An override pixel format for the buffers in this stream.
     *
     * The HAL must respect the requested format in Stream unless it is
     * IMPLEMENTATION_DEFINED output, in which case the override format
     * here must be used by the client instead, for this stream. This allows
     * cross-platform HALs to use a standard format since IMPLEMENTATION_DEFINED
     * formats often require device-specific information. In all other cases, the
     * overrideFormat must match the requested format.
     *
     * When HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED is used, then the platform
     * gralloc module must select a format based on the usage flags provided by
     * the camera device and the other endpoint of the stream.
     *
     * For private reprocessing, the HAL must not override the input stream's
     * IMPLEMENTATION_DEFINED format.
     */
    android.hardware.graphics.common@1.0::PixelFormat overrideFormat;

    /**
     * The gralloc usage flags for this stream, as needed by the HAL.
     *
     * For output streams, these are the HAL's producer usage flags. For input
     * streams, these are the HAL's consumer usage flags. The usage flags from
     * the producer and the consumer must be combined together and then passed
     * to the platform graphics allocator HAL for allocating the gralloc buffers
     * for each stream.
     *
     * If the stream's type is INPUT, then producerUsage must be 0, and
     * consumerUsage must be set. For other types, producerUsage must be set,
     * and consumerUsage must be 0.
     */
    BufferUsageFlags producerUsage;
    BufferUsageFlags consumerUsage;

    /**
     * The maximum number of buffers the HAL device may need to have dequeued at
     * the same time. The HAL device may not have more buffers in-flight from
     * this stream than this value.
     */
    uint32_t maxBuffers;

};

/**
 * HalStreamConfiguration:
 *
 * A structure of stream definitions, returned by configureStreams(). This
 * structure defines the HAL's desired parameters for each stream.
 *
 * All streams that were defined in the input to configureStreams() must have a
 * corresponding entry in this structure when returned by configureStreams().
 */
struct HalStreamConfiguration {
    vec<HalStream> streams;
};

/**
 * BufferStatus:
 *
 * The current status of a single stream buffer.
 */
enum BufferStatus : uint32_t {
    /**
     * The buffer is in a normal state, and can be used after waiting on its
     * sync fence.
     */
    OK = 0,

    /**
     * The buffer does not contain valid data, and the data in it must not be
     * used. The sync fence must still be waited on before reusing the buffer.
     */
    ERROR = 1
};

/**
 * StreamBuffer:
 *
 * A single buffer from a camera3 stream. It includes a handle to its parent
 * stream, the handle to the gralloc buffer itself, and sync fences
 *
 * The buffer does not specify whether it is to be used for input or output;
 * that is determined by its parent stream type and how the buffer is passed to
 * the HAL device.
 */
struct StreamBuffer {
    /**
     * The ID of the stream this buffer is associated with. -1 indicates an
     * invalid (empty) StreamBuffer, in which case buffer must also point to
     * null and bufferId must be 0.
     */
    int32_t streamId;

    /**
     * The unique ID of the buffer within this StreamBuffer. 0 indicates this
     * StreamBuffer contains no buffer.
     * For StreamBuffers sent to the HAL in a CaptureRequest, this ID uniquely
     * identifies a buffer. When a buffer is sent to HAL for the first time,
     * both bufferId and buffer handle must be filled. HAL must keep track of
     * the mapping between bufferId and corresponding buffer until the
     * corresponding stream is removed from stream configuration or until camera
     * device session is closed. After the first time a buffer is introduced to
     * HAL, in the future camera service must refer to the same buffer using
     * only bufferId, and keep the buffer handle null.
     */
    uint64_t bufferId;

    /**
     * The graphics buffer handle to the buffer.
     *
     * For StreamBuffers sent to the HAL in a CaptureRequest, if the bufferId
     * is not seen by the HAL before, this buffer handle is guaranteed to be a
     * valid handle to a graphics buffer, with dimensions and format matching
     * that of the stream. If the bufferId has been sent to the HAL before, this
     * buffer handle must be null and HAL must look up the actual buffer handle
     * to use from its own bufferId to buffer handle map.
     *
     * For StreamBuffers returned in a CaptureResult, this must be null, since
     * the handle to the buffer is already known to the client (since the client
     * sent it in the matching CaptureRequest), and the handle can be identified
     * by the combination of frame number and stream ID.
     */
    handle buffer;

    /**
     * Current state of the buffer. The framework must not pass buffers to the
     * HAL that are in an error state. In case a buffer could not be filled by
     * the HAL, it must have its status set to ERROR when returned to the
     * framework with processCaptureResult().
     */
    BufferStatus status;

    /**
     * The acquire sync fence for this buffer. The HAL must wait on this fence
     * fd before attempting to read from or write to this buffer.
     *
     * In a buffer included in a CaptureRequest, the client may set this to null
     * to indicate that no waiting is necessary for this buffer.
     *
     * When the HAL returns an input or output buffer to the framework with
     * processCaptureResult(), the acquireFence must be set to null. If the HAL
     * never waits on the acquireFence due to an error in filling or reading a
     * buffer, when calling processCaptureResult() the HAL must set the
     * releaseFence of the buffer to be the acquireFence passed to it by the
     * client. This allows the client to wait on the fence before reusing the
     * buffer.
     */
    handle acquireFence;

    /**
     * The release sync fence for this buffer. The HAL must set this to a valid
     * fence fd when returning the input buffer or output buffers to the client
     * in a CaptureResult, or set it to null to indicate that no waiting is
     * required for this buffer.
     *
     * The client must set this to be null for all buffers included in a
     * processCaptureRequest call.
     *
     * After signaling the releaseFence for this buffer, the HAL
     * must not make any further attempts to access this buffer as the
     * ownership has been fully transferred back to the client.
     *
     * If this is null, then the ownership of this buffer is transferred back
     * immediately upon the call of processCaptureResult.
     */
    handle releaseFence;

};

/**
 * CameraBlob:
 *
 * Transport header for camera blob types; generally compressed JPEG buffers in
 * output streams.
 *
 * To capture JPEG images, a stream is created using the pixel format
 * HAL_PIXEL_FORMAT_BLOB and dataspace HAL_DATASPACE_V0_JFIF. The buffer size
 * for the stream is calculated by the framework, based on the static metadata
 * field android.jpeg.maxSize. Since compressed JPEG images are of variable
 * size, the HAL needs to include the final size of the compressed image using
 * this structure inside the output stream buffer. The camera blob ID field must
 * be set to CameraBlobId::JPEG.
 *
 * The transport header must be at the end of the JPEG output stream
 * buffer. That means the jpegBlobId must start at byte[buffer_size -
 * sizeof(CameraBlob)], where the buffer_size is the size of gralloc
 * buffer. Any HAL using this transport header must account for it in
 * android.jpeg.maxSize. The JPEG data itself starts at the beginning of the
 * buffer and must be blobSize bytes long.
 */
enum CameraBlobId : uint16_t {
    JPEG = 0x00FF,
};

struct CameraBlob {
    CameraBlobId blobId;

    uint32_t blobSize;
};

/**
 * MsgType:
 *
 * Indicates the type of message sent, which specifies which member of the
 * message union is valid.
 *
 */
enum MsgType : uint32_t {
    /**
     * An error has occurred. NotifyMsg::Message::Error contains the
     * error information.
     */
    ERROR = 1,

    /**
     * The exposure of a given request or processing a reprocess request has
     * begun. NotifyMsg::Message::Shutter contains the information
     * the capture.
     */
    SHUTTER = 2
};

/**
 * Defined error codes for MsgType::ERROR
 */
enum ErrorCode : uint32_t {
    /**
     * A serious failure occured. No further frames or buffer streams must
     * be produced by the device. Device must be treated as closed. The
     * client must reopen the device to use it again. The frameNumber field
     * is unused.
     */
    ERROR_DEVICE = 1,

    /**
     * An error has occurred in processing a request. No output (metadata or
     * buffers) must be produced for this request. The frameNumber field
     * specifies which request has been dropped. Subsequent requests are
     * unaffected, and the device remains operational.
     */
    ERROR_REQUEST = 2,

    /**
     * An error has occurred in producing an output result metadata buffer
     * for a request, but output stream buffers for it must still be
     * available. Subsequent requests are unaffected, and the device remains
     * operational. The frameNumber field specifies the request for which
     * result metadata won't be available.
     */
    ERROR_RESULT = 3,

    /**
     * An error has occurred in placing an output buffer into a stream for a
     * request. The frame metadata and other buffers may still be
     * available. Subsequent requests are unaffected, and the device remains
     * operational. The frameNumber field specifies the request for which the
     * buffer was dropped, and errorStreamId indicates the stream
     * that dropped the frame.
     */
    ERROR_BUFFER = 4,
};

/**
 * ErrorMsg:
 *
 * Message contents for MsgType::ERROR
 */
struct ErrorMsg {
    /**
     * Frame number of the request the error applies to. 0 if the frame number
     * isn't applicable to the error.
     */
    uint32_t frameNumber;

    /**
     * Pointer to the stream that had a failure. -1 if the stream isn't
     * applicable to the error.
     */
    int32_t errorStreamId;

    /**
     * The code for this error.
     */
    ErrorCode errorCode;

};

/**
 * ShutterMsg:
 *
 * Message contents for MsgType::SHUTTER
 */
struct ShutterMsg {
    /**
     * Frame number of the request that has begun exposure or reprocessing.
     */
    uint32_t frameNumber;

    /**
     * Timestamp for the start of capture. For a reprocess request, this must
     * be input image's start of capture. This must match the capture result
     * metadata's sensor exposure start timestamp.
     */
    uint64_t timestamp;

};

/**
 * NotifyMsg:
 *
 * The message structure sent to ICameraDevice3Callback::notify()
 */
struct NotifyMsg {
    /**
     * The message type.
     */
    MsgType type;

    union Message {
        /**
         * Error message contents. Valid if type is MsgType::ERROR
         */
        ErrorMsg error;

        /**
         * Shutter message contents. Valid if type is MsgType::SHUTTER
         */
        ShutterMsg shutter;
    } msg;

};

/**
 * RequestTemplate:
 *
 * Available template types for
 * ICameraDevice::constructDefaultRequestSettings()
 */
enum RequestTemplate : uint32_t {
    /**
     * Standard camera preview operation with 3A on auto.
     */
    PREVIEW = 1,

    /**
     * Standard camera high-quality still capture with 3A and flash on auto.
     */
    STILL_CAPTURE = 2,

    /**
     * Standard video recording plus preview with 3A on auto, torch off.
     */
    VIDEO_RECORD = 3,

    /**
     * High-quality still capture while recording video. Applications typically
     * include preview, video record, and full-resolution YUV or JPEG streams in
     * request. Must not cause stuttering on video stream. 3A on auto.
     */
    VIDEO_SNAPSHOT = 4,

    /**
     * Zero-shutter-lag mode. Application typically request preview and
     * full-resolution data for each frame, and reprocess it to JPEG when a
     * still image is requested by user. Settings must provide highest-quality
     * full-resolution images without compromising preview frame rate. 3A on
     * auto.
     */
    ZERO_SHUTTER_LAG = 5,

    /**
     * A basic template for direct application control of capture
     * parameters. All automatic control is disabled (auto-exposure, auto-white
     * balance, auto-focus), and post-processing parameters are set to preview
     * quality. The manual capture parameters (exposure, sensitivity, etc.)
     * are set to reasonable defaults, but may be overridden by the
     * application depending on the intended use case.
     */
    MANUAL = 6,

    /**
     * First value for vendor-defined request templates
     */
    VENDOR_TEMPLATE_START = 0x40000000,

};

/**
 * CaptureRequest:
 *
 * A single request for image capture/buffer reprocessing, sent to the Camera
 * HAL device by the framework in processCaptureRequest().
 *
 * The request contains the settings to be used for this capture, and the set of
 * output buffers to write the resulting image data in. It may optionally
 * contain an input buffer, in which case the request is for reprocessing that
 * input buffer instead of capturing a new image with the camera sensor. The
 * capture is identified by the frameNumber.
 *
 * In response, the camera HAL device must send a CaptureResult
 * structure asynchronously to the framework, using the processCaptureResult()
 * callback.
 */
struct CaptureRequest {
    /**
     * The frame number is an incrementing integer set by the framework to
     * uniquely identify this capture. It needs to be returned in the result
     * call, and is also used to identify the request in asynchronous
     * notifications sent to ICameraDevice3Callback::notify().
     */
    uint32_t frameNumber;

    /**
     * If non-zero, read settings from request queue instead
     * (see ICameraDeviceSession.getCaptureRequestMetadataQueue).
     * If zero, read settings from .settings field.
     */
    uint64_t fmqSettingsSize;

    /**
     * If fmqSettingsSize is zero,
     * the settings buffer contains the capture and processing parameters for
     * the request. As a special case, an empty settings buffer indicates that
     * the settings are identical to the most-recently submitted capture
     * request. A empty buffer cannot be used as the first submitted request
     * after a configureStreams() call.
     *
     * This field must be used if fmqSettingsSize is zero. It must not be used
     * if fmqSettingsSize is non-zero.
     */
    CameraMetadata settings;

    /**
     * The input stream buffer to use for this request, if any.
     *
     * An invalid inputBuffer is signified by a null inputBuffer::buffer, in
     * which case the value of all other members of inputBuffer must be ignored.
     *
     * If inputBuffer is invalid, then the request is for a new capture from the
     * imager. If inputBuffer is valid, the request is for reprocessing the
     * image contained in inputBuffer, and the HAL must release the inputBuffer
     * back to the client in a subsequent processCaptureResult call.
     *
     * The HAL is required to wait on the acquire sync fence of the input buffer
     * before accessing it.
     *
     */
    StreamBuffer inputBuffer;

    /**
     * An array of at least 1 stream buffers, to be filled with image
     * data from this capture/reprocess. The HAL must wait on the acquire fences
     * of each stream buffer before writing to them.
     *
     * The HAL takes ownership of the handles in outputBuffers; the client
     * must not access them until they are returned in a CaptureResult.
     *
     * Any or all of the buffers included here may be brand new in this
     * request (having never before seen by the HAL).
     */
    vec<StreamBuffer> outputBuffers;

};

/**
 * CaptureResult:
 *
 * The result of a single capture/reprocess by the camera HAL device. This is
 * sent to the framework asynchronously with processCaptureResult(), in
 * response to a single capture request sent to the HAL with
 * processCaptureRequest(). Multiple processCaptureResult() calls may be
 * performed by the HAL for each request.
 *
 * Each call, all with the same frame
 * number, may contain some subset of the output buffers, and/or the result
 * metadata.
 *
 * The result structure contains the output metadata from this capture, and the
 * set of output buffers that have been/will be filled for this capture. Each
 * output buffer may come with a release sync fence that the framework must wait
 * on before reading, in case the buffer has not yet been filled by the HAL.
 *
 * The metadata may be provided multiple times for a single frame number. The
 * framework must accumulate together the final result set by combining each
 * partial result together into the total result set.
 *
 * If an input buffer is given in a request, the HAL must return it in one of
 * the processCaptureResult calls, and the call may be to just return the
 * input buffer, without metadata and output buffers; the sync fences must be
 * handled the same way they are done for output buffers.
 *
 * Performance considerations:
 *
 * Applications receive these partial results immediately, so sending partial
 * results is a highly recommended performance optimization to avoid the total
 * pipeline latency before sending the results for what is known very early on
 * in the pipeline.
 *
 * A typical use case might be calculating the AF state halfway through the
 * pipeline; by sending the state back to the framework immediately, we get a
 * 50% performance increase and perceived responsiveness of the auto-focus.
 *
 */
struct CaptureResult {
    /**
     * The frame number is an incrementing integer set by the framework in the
     * submitted request to uniquely identify this capture. It is also used to
     * identify the request in asynchronous notifications sent to
     * ICameraDevice3Callback::notify().
     */
    uint32_t frameNumber;

    /**
     * If non-zero, read result from result queue instead
     * (see ICameraDeviceSession.getCaptureResultMetadataQueue).
     * If zero, read result from .result field.
     */
    uint64_t fmqResultSize;

    /**
     * The result metadata for this capture. This contains information about the
     * final capture parameters, the state of the capture and post-processing
     * hardware, the state of the 3A algorithms, if enabled, and the output of
     * any enabled statistics units.
     *
     * If there was an error producing the result metadata, result must be an
     * empty metadata buffer, and notify() must be called with
     * ErrorCode::ERROR_RESULT.
     *
     * Multiple calls to processCaptureResult() with a given frameNumber
     * may include (partial) result metadata.
     *
     * Partial metadata submitted must not include any metadata key returned
     * in a previous partial result for a given frame. Each new partial result
     * for that frame must also set a distinct partialResult value.
     *
     * If notify has been called with ErrorCode::ERROR_RESULT, all further
     * partial results for that frame are ignored by the framework.
     */
    CameraMetadata result;

    /**
     * The completed output stream buffers for this capture.
     *
     * They may not yet be filled at the time the HAL calls
     * processCaptureResult(); the framework must wait on the release sync
     * fences provided by the HAL before reading the buffers.
     *
     * The StreamBuffer::buffer handle must be null for all returned buffers;
     * the client must cache the handle and look it up via the combination of
     * frame number and stream ID.
     *
     * The number of output buffers returned must be less than or equal to the
     * matching capture request's count. If this is less than the buffer count
     * in the capture request, at least one more call to processCaptureResult
     * with the same frameNumber must be made, to return the remaining output
     * buffers to the framework. This may only be zero if the structure includes
     * valid result metadata or an input buffer is returned in this result.
     *
     * The HAL must set the stream buffer's release sync fence to a valid sync
     * fd, or to null if the buffer has already been filled.
     *
     * If the HAL encounters an error while processing the buffer, and the
     * buffer is not filled, the buffer's status field must be set to ERROR. If
     * the HAL did not wait on the acquire fence before encountering the error,
     * the acquire fence must be copied into the release fence, to allow the
     * framework to wait on the fence before reusing the buffer.
     *
     * The acquire fence must be set to null for all output buffers.
     *
     * This vector may be empty; if so, at least one other processCaptureResult
     * call must be made (or have been made) by the HAL to provide the filled
     * output buffers.
     *
     * When processCaptureResult is called with a new buffer for a frame,
     * all previous frames' buffers for that corresponding stream must have been
     * already delivered (the fences need not have yet been signaled).
     *
     * Buffers for a frame may be sent to framework before the corresponding
     * SHUTTER-notify call is made by the HAL.
     *
     * Performance considerations:
     *
     * Buffers delivered to the framework are not dispatched to the
     * application layer until a start of exposure timestamp has been received
     * via a SHUTTER notify() call. It is highly recommended to
     * dispatch that call as early as possible.
     */
    vec<StreamBuffer> outputBuffers;

    /**
     * The handle for the input stream buffer for this capture, if any.
     *
     * It may not yet be consumed at the time the HAL calls
     * processCaptureResult(); the framework must wait on the release sync fence
     * provided by the HAL before reusing the buffer.
     *
     * The HAL must handle the sync fences the same way they are done for
     * outputBuffers.
     *
     * Only one input buffer is allowed to be sent per request. Similarly to
     * output buffers, the ordering of returned input buffers must be
     * maintained by the HAL.
     *
     * Performance considerations:
     *
     * The input buffer should be returned as early as possible. If the HAL
     * supports sync fences, it can call processCaptureResult to hand it back
     * with sync fences being set appropriately. If the sync fences are not
     * supported, the buffer can only be returned when it is consumed, which
     * may take long time; the HAL may choose to copy this input buffer to make
     * the buffer return sooner.
     */
    StreamBuffer inputBuffer;

    /**
     * In order to take advantage of partial results, the HAL must set the
     * static metadata android.request.partialResultCount to the number of
     * partial results it sends for each frame.
     *
     * Each new capture result with a partial result must set
     * this field to a distinct inclusive value between
     * 1 and android.request.partialResultCount.
     *
     * HALs not wishing to take advantage of this feature must not
     * set an android.request.partialResultCount or partial_result to a value
     * other than 1.
     *
     * This value must be set to 0 when a capture result contains buffers only
     * and no metadata.
     */
    uint32_t partialResult;

};

/**
 * BufferCache:
 *
 * A list of cached bufferIds associated with a certain stream.
 * Buffers are passed between camera service and camera HAL via bufferId except
 * the first time a new buffer is being passed to HAL in CaptureRequest. Camera
 * service and camera HAL therefore need to maintain a cached map of bufferId
 * and corresponing native handle.
 *
 */
struct BufferCache {
    /**
     * The ID of the stream this list is associated with.
     */
    int32_t streamId;

    /**
     * A cached buffer ID associated with streamId.
     */
    uint64_t bufferId;
};
