/*
|
* 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, 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.
|
*/
|
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;
|
};
|