ce9d001076
The new framework implementation derives capture buffer loss notification from other information, and treats HAL notify() with ERROR_BUFFER as no-op. Test: Build Bug: 155353799 Change-Id: Ia7ea52ee2750c7404b657467e1cfda4c05e6cc78
154 lines
7.4 KiB
Text
154 lines
7.4 KiB
Text
/*
|
|
* 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.camera.common@1.0::types;
|
|
|
|
/**
|
|
*
|
|
* Callback methods for the HAL to call into the framework.
|
|
*
|
|
* These methods are used to return metadata and image buffers for a completed
|
|
* or failed captures, and to notify the framework of asynchronous events such
|
|
* as errors.
|
|
*
|
|
* The framework must not call back into the HAL from within these callbacks,
|
|
* and these calls must not block for extended periods.
|
|
*
|
|
*/
|
|
interface ICameraDeviceCallback {
|
|
|
|
/**
|
|
* processCaptureResult:
|
|
*
|
|
* Send results from one or more completed or partially completed captures
|
|
* to the framework.
|
|
* processCaptureResult() may be invoked multiple times by the HAL in
|
|
* response to a single capture request. This allows, for example, the
|
|
* metadata and low-resolution buffers to be returned in one call, and
|
|
* post-processed JPEG buffers in a later call, once it is available. Each
|
|
* call must include the frame number of the request it is returning
|
|
* metadata or buffers for. Only one call to processCaptureResult
|
|
* may be made at a time by the HAL although the calls may come from
|
|
* different threads in the HAL.
|
|
*
|
|
* A component (buffer or metadata) of the complete result may only be
|
|
* included in one process_capture_result call. A buffer for each stream,
|
|
* and the result metadata, must be returned by the HAL for each request in
|
|
* one of the processCaptureResult calls, even in case of errors producing
|
|
* some of the output. A call to processCaptureResult() with neither
|
|
* output buffers or result metadata is not allowed.
|
|
*
|
|
* The order of returning metadata and buffers for a single result does not
|
|
* matter, but buffers for a given stream must be returned in FIFO order. So
|
|
* the buffer for request 5 for stream A must always be returned before the
|
|
* buffer for request 6 for stream A. This also applies to the result
|
|
* metadata; the metadata for request 5 must be returned before the metadata
|
|
* for request 6.
|
|
*
|
|
* However, different streams are independent of each other, so it is
|
|
* acceptable and expected that the buffer for request 5 for stream A may be
|
|
* returned after the buffer for request 6 for stream B is. And it is
|
|
* acceptable that the result metadata for request 6 for stream B is
|
|
* returned before the buffer for request 5 for stream A is. If multiple
|
|
* capture results are included in a single call, camera framework must
|
|
* process results sequentially from lower index to higher index, as if
|
|
* these results were sent to camera framework one by one, from lower index
|
|
* to higher index.
|
|
*
|
|
* The HAL retains ownership of result structure, which only needs to be
|
|
* valid to access during this call.
|
|
*
|
|
* The output buffers do not need to be filled yet; the framework must wait
|
|
* on the stream buffer release sync fence before reading the buffer
|
|
* data. Therefore, this method should be called by the HAL as soon as
|
|
* possible, even if some or all of the output buffers are still in
|
|
* being filled. The HAL must include valid release sync fences into each
|
|
* output_buffers stream buffer entry, or -1 if that stream buffer is
|
|
* already filled.
|
|
*
|
|
* If the result buffer cannot be constructed for a request, the HAL must
|
|
* return an empty metadata buffer, but still provide the output buffers and
|
|
* their sync fences. In addition, notify() must be called with an
|
|
* ERROR_RESULT message.
|
|
*
|
|
* If an output buffer cannot be filled, its status field must be set to
|
|
* STATUS_ERROR. In this case, notify() isn't required to be called with
|
|
* an ERROR_BUFFER message. The framework will simply treat the notify()
|
|
* call with ERROR_BUFFER as a no-op, and derive whether and when to notify
|
|
* the application of buffer loss based on the buffer status and whether or not
|
|
* the entire capture has failed.
|
|
*
|
|
* If the entire capture has failed, then this method still needs to be
|
|
* called to return the output buffers to the framework. All the buffer
|
|
* statuses must be STATUS_ERROR, and the result metadata must be an
|
|
* empty buffer. In addition, notify() must be called with a ERROR_REQUEST
|
|
* message. In this case, individual ERROR_RESULT/ERROR_BUFFER messages
|
|
* must not be sent. Note that valid partial results are still allowed
|
|
* as long as the final result metadata fails to be generated.
|
|
*
|
|
* Performance requirements:
|
|
*
|
|
* This is a non-blocking call. The framework must handle each CaptureResult
|
|
* within 5ms.
|
|
*
|
|
* The pipeline latency (see S7 for definition) should be less than or equal to
|
|
* 4 frame intervals, and must be less than or equal to 8 frame intervals.
|
|
*
|
|
*/
|
|
processCaptureResult(vec<CaptureResult> results);
|
|
|
|
/**
|
|
* notify:
|
|
*
|
|
* Asynchronous notification callback from the HAL, fired for various
|
|
* reasons. Only for information independent of frame capture, or that
|
|
* require specific timing. Multiple messages may be sent in one call; a
|
|
* message with a higher index must be considered to have occurred after a
|
|
* message with a lower index.
|
|
*
|
|
* Multiple threads may call notify() simultaneously.
|
|
*
|
|
* Buffers delivered to the framework must not be dispatched to the
|
|
* application layer until a start of exposure timestamp (or input image's
|
|
* start of exposure timestamp for a reprocess request) has been received
|
|
* via a SHUTTER notify() call. It is highly recommended to dispatch this
|
|
* call as early as possible.
|
|
*
|
|
* The SHUTTER notify calls for requests with android.control.enableZsl
|
|
* set to TRUE and ANDROID_CONTROL_CAPTURE_INTENT == STILL_CAPTURE may be
|
|
* out-of-order compared to SHUTTER notify for other kinds of requests
|
|
* (including regular, reprocess, or zero-shutter-lag requests with
|
|
* different capture intents).
|
|
*
|
|
* As a result, the capture results of zero-shutter-lag requests with
|
|
* ANDROID_CONTROL_CAPTURE_INTENT == STILL_CAPTURE may be out-of-order
|
|
* compared to capture results for other kinds of requests.
|
|
*
|
|
* Different SHUTTER notify calls for zero-shutter-lag requests with
|
|
* ANDROID_CONTROL_CAPTURE_INTENT == STILL_CAPTURE must be in order between
|
|
* them, as is for other kinds of requests. SHUTTER notify calls for
|
|
* zero-shutter-lag requests with non STILL_CAPTURE intent must be in order
|
|
* with SHUTTER notify calls for regular requests.
|
|
* ------------------------------------------------------------------------
|
|
* Performance requirements:
|
|
*
|
|
* This is a non-blocking call. The framework must handle each message in 5ms.
|
|
*/
|
|
notify(vec<NotifyMsg> msgs);
|
|
|
|
};
|