Camera3Device.h revision 2cbf6cea23539bfe99e36d1d221de62255452e86
17fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/*
27fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Copyright (C) 2013 The Android Open Source Project
37fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala *
47fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
57fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * you may not use this file except in compliance with the License.
67fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * You may obtain a copy of the License at
77fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala *
87fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
97fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala *
107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * See the License for the specific language governing permissions and
147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * limitations under the License.
157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
17f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#ifndef ANDROID_SERVERS_CAMERA3DEVICE_H
18f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#define ANDROID_SERVERS_CAMERA3DEVICE_H
197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Condition.h>
217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Errors.h>
227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/List.h>
237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Mutex.h>
247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include <utils/Thread.h>
257b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <utils/KeyedVector.h>
26c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang#include <utils/Timers.h>
277b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <hardware/camera3.h>
28cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei#include <camera/CaptureResult.h>
297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
307b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h"
31f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala#include "device3/StatusTracker.h"
32125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He#include "device3/Camera3BufferManager.h"
337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to
367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions.
377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" {
397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    typedef void (callbacks_process_capture_result_t)(
407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const struct camera3_callback_ops *,
417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_capture_result_t *);
427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    typedef void (callbacks_notify_t)(
447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const struct camera3_callback_ops *,
457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_notify_msg_t *);
467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android {
497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalanamespace camera3 {
517b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
527b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3Stream;
537b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3ZslStream;
547b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3OutputStreamInterface;
557b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3StreamInterface;
567b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
577b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala}
587b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
6095dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 or higher.
617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device :
637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            public CameraDeviceBase,
647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            private camera3_callback_ops {
657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  public:
66c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk
677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device(int id);
687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual ~Camera3Device();
707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * CameraDeviceBase interface
737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
74f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
7571381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    virtual int      getId() const;
76f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
77f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to idle state on success.
78e074a93046ebe5cea0b55c3a479e082a426e1e07Yin-Chia Yeh    virtual status_t initialize(CameraModule *module);
797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t disconnect();
807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t dump(int fd, const Vector<String16> &args);
817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual const CameraMetadata& info() const;
82f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
83f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Capture and setStreamingRequest will configure streams if currently in
84f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // idle state
85cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t capture(CameraMetadata &request, int64_t *lastFrameNumber = NULL);
86cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t captureList(const List<const CameraMetadata> &requests,
87cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                 int64_t *lastFrameNumber = NULL);
88cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t setStreamingRequest(const CameraMetadata &request,
89cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                         int64_t *lastFrameNumber = NULL);
90cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests,
91cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                             int64_t *lastFrameNumber = NULL);
92cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t clearStreamingRequest(int64_t *lastFrameNumber = NULL);
93f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
95f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
96f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Actual stream creation/deletion is delayed until first request is submitted
97f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // If adding streams while actively capturing, will pause device before adding
9828c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He    // stream, reconfiguring device, and unpausing.
99727d172137b4f32681c098de8e2623c0b65a6406Eino-Ville Talvala    virtual status_t createStream(sp<Surface> consumer,
1003d82c0d9ed2b3e956ad699a9ca2c8a70c9d24678Eino-Ville Talvala            uint32_t width, uint32_t height, int format,
101125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id,
102125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He            int streamSetId = camera3::CAMERA3_STREAM_SET_ID_INVALID);
1035a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t createInputStream(
1045a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            uint32_t width, uint32_t height, int format,
1055a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            int *id);
1062fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual status_t createZslStream(
1072fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            uint32_t width, uint32_t height,
1082fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int depth,
1092fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            /*out*/
1102fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int *id,
1112fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<camera3::Camera3ZslStream>* zslStream);
1127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createReprocessStreamFromStream(int outputId, int *id);
113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getStreamInfo(int id,
115d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala            uint32_t *width, uint32_t *height,
116d46a6b9fd8b2a4f9098757384711e2cd03a91651Eino-Ville Talvala            uint32_t *format, android_dataspace *dataSpace);
1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamTransform(int id, int transform);
118f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteStream(int id);
1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteReprocessStream(int id);
121f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1221fa8999c91d5df81949aa723000058380cd3faa2Zhijun He    virtual status_t configureStreams(bool isConstraiedHighSpeed = false);
123618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    virtual status_t getInputBufferProducer(
124618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            sp<IGraphicBufferProducer> *producer);
125e2d167eb689d7a536805f950c31f11b9e9c578aeIgor Murashkin
1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createDefaultRequest(int templateId, CameraMetadata *request);
127f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
128f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to the idle state on success
1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilDrained();
130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setNotifyCallback(NotificationListener *listener);
13246910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    virtual bool     willNotify3A();
1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitForNextFrame(nsecs_t timeout);
134cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t getNextResult(CaptureResult *frame);
135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerAutofocus(uint32_t id);
1377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerCancelAutofocus(uint32_t id);
1387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerPrecaptureMetering(uint32_t id);
139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t pushReprocessBuffer(int reprocessStreamId,
1417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
1427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
143cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    virtual status_t flush(int64_t *lastFrameNumber = NULL);
144abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    virtual status_t prepare(int streamId);
1464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
147b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala    virtual status_t tearDown(int streamId);
148b25e3c87724b6147ed1da7c1d6617c39bfce2fbfEino-Ville Talvala
149c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    virtual status_t prepare(int maxCount, int streamId);
150c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk
151204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    virtual uint32_t getDeviceVersion();
152204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He
15328c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He    virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const;
15495a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala    ssize_t getPointCloudBufferSize() const;
155d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    ssize_t getRawOpaqueBufferSize(int32_t width, int32_t height) const;
15628c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He
157f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Methods called by subclasses
158f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    void             notifyStatus(bool idle); // updates from StatusTracker
159f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  private:
1611e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpLockAttempts  = 10;
1621e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpSleepDuration = 100000; // 0.10 sec
16342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const nsecs_t       kShutdownTimeout   = 5000000000; // 5 sec
164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    static const nsecs_t       kActiveTimeout     = 500000000;  // 500 ms
165c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen    static const size_t        kInFlightWarnLimit = 20;
166c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen    static const size_t        kInFlightWarnLimitHighSpeed = 256; // batch size 32 * pipe depth 8
167f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala    // SCHED_FIFO priority for request submission thread in HFR mode
1684a8f4a3f567d8b3134b1c7ab21ca774f279ab9c2Chien-Yu Chen    static const int           kConstrainedHighSpeedThreadPriority = 1;
169c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen
1704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct                     RequestTrigger;
171f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He    // minimal jpeg buffer size: 256KB + blob header
172f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He    static const ssize_t       kMinJpegBufferSize = 256 * 1024 + sizeof(camera3_jpeg_blob);
17316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    // Constant to use for stream ID when one doesn't exist
17416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    static const int           NO_STREAM = -1;
175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
176f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // A lock to enforce serialization on the input/configure side
177f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // of the public interface.
178f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Only locked by public methods inherited from CameraDeviceBase.
179f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Not locked by methods guarded by mOutputLock, since they may act
180f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // concurrently to the input/configure side of the interface.
181f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Must be locked before mLock if both will be locked by a method
182f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex                      mInterfaceLock;
183f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
184f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // The main lock on internal state
185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex                      mLock;
186f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Camera device ID
188f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    const int                  mId;
189f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1901fa8999c91d5df81949aa723000058380cd3faa2Zhijun He    // Flag indicating is the current active stream configuration is constrained high speed.
1911fa8999c91d5df81949aa723000058380cd3faa2Zhijun He    bool                       mIsConstrainedHighSpeedConfiguration;
1921fa8999c91d5df81949aa723000058380cd3faa2Zhijun He
193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** Scope for mLock ****/
194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_device_t          *mHal3Device;
196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    CameraMetadata             mDeviceInfo;
198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
199a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He    CameraMetadata             mRequestTemplateCache[CAMERA3_TEMPLATE_COUNT];
200a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He
201204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    uint32_t                   mDeviceVersion;
202cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
203618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    struct Size {
204618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        uint32_t width;
205618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        uint32_t height;
206618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        Size(uint32_t w = 0, uint32_t h = 0) : width(w), height(h){}
207618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    };
208618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // Map from format to size.
209618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    Vector<Size>               mSupportedOpaqueInputSizes;
210618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
211f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    enum Status {
212f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ERROR,
213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_UNINITIALIZED,
214f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_UNCONFIGURED,
215f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_CONFIGURED,
216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ACTIVE
217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }                          mStatus;
218183f056393423b344e73f388f21d30379a38e519Ruben Brunk
219183f056393423b344e73f388f21d30379a38e519Ruben Brunk    // Only clear mRecentStatusUpdates, mStatusWaiters from waitUntilStateThenRelock
220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Vector<Status>             mRecentStatusUpdates;
221183f056393423b344e73f388f21d30379a38e519Ruben Brunk    int                        mStatusWaiters;
222183f056393423b344e73f388f21d30379a38e519Ruben Brunk
223f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Condition                  mStatusChanged;
224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
225b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    // Tracking cause of fatal errors when in STATUS_ERROR
226b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    String8                    mErrorCause;
227b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Mapping of stream IDs to stream instances
2292fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> >
2302fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            StreamSet;
231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    StreamSet                  mOutputStreams;
233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<camera3::Camera3Stream> mInputStream;
234f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    int                        mNextStreamId;
235ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    bool                       mNeedConfig;
236f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
23716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    int                        mDummyStreamId;
23816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala
239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Whether to send state updates upstream
240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Pause when doing transparent reconfiguration
241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool                       mPauseStateNotify;
242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Need to hold on to stream references until configure completes.
2442fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams;
245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
246204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    // Whether the HAL will send partial result
247204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    bool                       mUsePartialResult;
248204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He
249204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    // Number of partial results that will be delivered by the HAL.
250204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    uint32_t                   mNumPartialResults;
251fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** End scope for mLock ****/
253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
254c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    // The offset converting from clock domain of other subsystem
255c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    // (video/hardware composer) to that of camera. Assumption is that this
256c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    // offset won't change during the life cycle of the camera device. In other
257c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    // words, camera device shouldn't be open during CPU suspend.
258c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    nsecs_t                    mTimestampOffset;
259c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang
260d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen    typedef struct AeTriggerCancelOverride {
261d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        bool applyAeLock;
262d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        uint8_t aeLock;
263d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        bool applyAePrecaptureTrigger;
264d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        uint8_t aePrecaptureTrigger;
265d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen    } AeTriggerCancelOverride_t;
266d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class CaptureRequest : public LightRefBase<CaptureRequest> {
268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala      public:
269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        CameraMetadata                      mSettings;
270f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<camera3::Camera3Stream>          mInputStream;
271c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen        camera3_stream_buffer_t             mInputBuffer;
2722fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        Vector<sp<camera3::Camera3OutputStreamInterface> >
2732fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                            mOutputStreams;
274cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        CaptureResultExtras                 mResultExtras;
275d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // Used to cancel AE precapture trigger for devices doesn't support
276d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
277d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        AeTriggerCancelOverride_t           mAeTriggerCancelOverride;
27885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // The number of requests that should be submitted to HAL at a time.
27985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // For example, if batch size is 8, this request and the following 7
28085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // requests will be submitted to HAL at a time. The batch size for
28185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // the following 7 requests will be ignored by the request thread.
28285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        int                                 mBatchSize;
283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    };
284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    typedef List<sp<CaptureRequest> > RequestList;
285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
28690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t checkStatusOkToCaptureLocked();
28790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
28890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t convertMetadataListToRequestListLocked(
28990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            const List<const CameraMetadata> &metadataList,
2902d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei            /*out*/
2912d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei            RequestList *requestList);
29290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
293cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating,
294cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                  int64_t *lastFrameNumber = NULL);
29590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
2971e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Get the last request submitted to the hal by the request thread.
2981e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     *
2991e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Takes mLock.
3001e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     */
301f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual CameraMetadata getLatestRequestLocked();
302f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
303f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
304183f056393423b344e73f388f21d30379a38e519Ruben Brunk     * Update the current device status and wake all waiting threads.
305183f056393423b344e73f388f21d30379a38e519Ruben Brunk     *
306183f056393423b344e73f388f21d30379a38e519Ruben Brunk     * Must be called with mLock held.
307183f056393423b344e73f388f21d30379a38e519Ruben Brunk     */
308183f056393423b344e73f388f21d30379a38e519Ruben Brunk    void internalUpdateStatusLocked(Status status);
309183f056393423b344e73f388f21d30379a38e519Ruben Brunk
310183f056393423b344e73f388f21d30379a38e519Ruben Brunk    /**
311f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Pause processing and flush everything, but don't tell the clients.
312f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * This is for reconfiguring outputs transparently when according to the
313f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * CameraDeviceBase interface we shouldn't need to.
314f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
315f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
316f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalPauseAndWaitLocked();
3171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
3181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    /**
319f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Resume work after internalPauseAndWaitLocked()
320f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
322f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalResumeLocked();
323f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
324f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
325f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Wait until status tracker tells us we've transitioned to the target state
326f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * set, which is either ACTIVE when active==true or IDLE (which is any
327f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * non-ACTIVE state) when active==false.
328f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
329f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Needs to be called with mLock and mInterfaceLock held.  This means there
330f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * can ever only be one waiter at most.
331f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
332f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * During the wait mLock is released.
333f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
334f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
335f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t waitUntilStateThenRelock(bool active, nsecs_t timeout);
336f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
33869a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     * Implementation of waitUntilDrained. On success, will transition to IDLE state.
33969a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     *
34069a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     * Need to be called with mLock and mInterfaceLock held.
34169a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     */
34269a374897392c8bd70f441b7284f6f578c651ec9Zhijun He    status_t waitUntilDrainedLocked();
34369a374897392c8bd70f441b7284f6f578c651ec9Zhijun He
34469a374897392c8bd70f441b7284f6f578c651ec9Zhijun He    /**
345f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Do common work for setting up a streaming or single capture request.
346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * On success, will transition to ACTIVE if in IDLE.
347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request);
349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Build a CaptureRequest request from the CameraDeviceBase request
352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * settings.
353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request);
3557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Take the currently-defined set of streams and configure the HAL to use
358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * them. This is a long-running operation (may be several hundered ms).
359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           configureStreamsLocked();
3617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
362b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    /**
36316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     * Add a dummy stream to the current stream set as a workaround for
36416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     * not allowing 0 streams in the camera HAL spec.
36516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     */
36616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    status_t           addDummyStreamLocked();
36716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala
36816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    /**
36916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     * Remove a dummy stream if the current config includes real streams.
37016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     */
37116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    status_t           tryRemoveDummyStreamLocked();
37216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala
37316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    /**
374b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * Set device into an error state due to some fatal failure, and set an
375b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * error message to indicate why. Only the first call's message will be
376b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * used. The message is also sent to the log.
377b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     */
378b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorState(const char *fmt, ...);
379b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateV(const char *fmt, va_list args);
380b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLocked(const char *fmt, ...);
381b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLockedV(const char *fmt, va_list args);
382b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
383f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
384f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Debugging trylock/spin method
385f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Try to acquire a lock a few times with sleeps between before giving up.
386f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
387f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool               tryLockSpinRightRound(Mutex& lock);
388f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
389618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    /**
390618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen     * Helper function to determine if an input size for implementation defined
391618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen     * format is supported.
392618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen     */
393618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    bool isOpaqueInputSizeSupported(uint32_t width, uint32_t height);
394cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
395cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    /**
396cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh     * Helper function to get the largest Jpeg resolution (in area)
397cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh     * Return Size(0, 0) if static metatdata is invalid
398cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh     */
399cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Size getMaxJpegResolution() const;
400cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
401c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    /**
402c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang     * Helper function to get the offset between MONOTONIC and BOOTTIME
403c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang     * timestamp.
404c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang     */
405c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    static nsecs_t getMonoToBoottimeOffset();
406c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang
4072cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala    /**
4082cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala     * Helper function to map between legacy and new dataspace enums
4092cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala     */
4102cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala    static android_dataspace mapToLegacyDataspace(android_dataspace dataSpace);
4112cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala
4124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct RequestTrigger {
4134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata tag number, e.g. android.control.aePrecaptureTrigger
4144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t metadataTag;
4154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata value, e.g. 'START' or the trigger ID
4164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t entryValue;
4174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // The last part of the fully qualified path, e.g. afTrigger
4194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const char *getTagName() const {
4204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_name(metadataTag) ?: "NULL";
4214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
4224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // e.g. TYPE_BYTE, TYPE_INT32, etc.
4244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int getTagType() const {
4254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_type(metadataTag);
4264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
4274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
4284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
4307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Thread for managing capture request submission to HAL device.
4317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class RequestThread : public Thread {
4337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      public:
4357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
436f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestThread(wp<Camera3Device> parent,
437f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                sp<camera3::StatusTracker> statusTracker,
438ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen                camera3_device_t *hal3Device,
439ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen                bool aeLockAvailable);
440f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
4414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        void     setNotificationListener(NotificationListener *listener);
4421754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
443f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Call after stream (re)-configuration is completed.
445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
446f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     configurationComplete();
447f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
449f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Set or clear the list of repeating requests. Does not block
450f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * on either. Use waitUntilPaused to wait until request queue
451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * has emptied out.
452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
4532d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        status_t setRepeatingRequests(const RequestList& requests,
4542d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                      /*out*/
4552d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                      int64_t *lastFrameNumber = NULL);
4562d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        status_t clearRepeatingRequests(/*out*/
4572d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                        int64_t *lastFrameNumber = NULL);
4582d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei
4592d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        status_t queueRequestList(List<sp<CaptureRequest> > &requests,
4602d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                  /*out*/
4612d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                  int64_t *lastFrameNumber = NULL);
46290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
464abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         * Remove all queued and repeating requests, and pending triggers
465abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         */
4661754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala        status_t clear(NotificationListener *listener,
4671754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala                       /*out*/
4682d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                       int64_t *lastFrameNumber = NULL);
469abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
470abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        /**
47185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen         * Flush all pending requests in HAL.
47285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen         */
47385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        status_t flush();
47485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
47585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        /**
4764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Queue a trigger to be dispatched with the next outgoing
4774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * process_capture_request. The settings for that request only
4784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * will be temporarily rewritten to add the trigger tag/value.
4794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Subsequent requests will not be rewritten (for this tag).
4804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
4814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t queueTrigger(RequestTrigger trigger[], size_t count);
4824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
484f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Pause/unpause the capture thread. Doesn't block, so use
485f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * waitUntilPaused to wait until the thread is paused.
486f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
487f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     setPaused(bool paused);
488f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
489f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
4904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Wait until thread processes the capture request with settings'
4914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * android.request.id == requestId.
4924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *
4934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Returns TIMED_OUT in case the thread does not process the request
4944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * within the timeout.
4954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
4964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout);
4974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4981e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        /**
499f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * Shut down the thread. Shutdown is asynchronous, so thread may
500f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * still be running once this method returns.
501f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         */
502f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        virtual void requestExit();
503f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
504f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        /**
5051e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * Get the latest request that was sent to the HAL
5061e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * with process_capture_request.
5071e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         */
5081e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata getLatestRequest() const;
5091e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
5104d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        /**
5114d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         * Returns true if the stream is a target of any queued or repeating
5124d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         * capture request
5134d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         */
5144d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        bool isStreamPending(sp<camera3::Camera3StreamInterface>& stream);
5154d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
5167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      protected:
5177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        virtual bool threadLoop();
5197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      private:
52142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        static int         getId(const wp<Camera3Device> &device);
52242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
5234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           queueTriggerLocked(RequestTrigger trigger);
5244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Mix-in queued triggers into this request
5254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            insertTriggers(const sp<CaptureRequest> &request);
5264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Purge the queued triggers from this request,
5274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        //  restoring the old field values for those tags.
5284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           removeTriggers(const sp<CaptureRequest> &request);
5292f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
5302f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // HAL workaround: Make sure a trigger ID always exists if
5312f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // a trigger does
5322f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        status_t          addDummyTriggerIds(const sp<CaptureRequest> &request);
5334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
534f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        static const nsecs_t kRequestTimeout = 50e6; // 50 ms
535f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
53685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // Used to prepare a batch of requests.
53785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        struct NextRequest {
53885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen            sp<CaptureRequest>              captureRequest;
53985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen            camera3_capture_request_t       halRequest;
54085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen            Vector<camera3_stream_buffer_t> outputBuffers;
54185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen            bool                            submitted;
54285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        };
54385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
54457ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // Wait for the next batch of requests and put them in mNextRequests. mNextRequests will
54557ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // be empty if it times out.
54657ea29251d93c9423030de387573142064366a30Chien-Yu Chen        void waitForNextRequestBatch();
547f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
54885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // Waits for a request, or returns NULL if times out. Must be called with mRequestLock hold.
54985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        sp<CaptureRequest> waitForNextRequestLocked();
55085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
55157ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // Prepare HAL requests and output buffers in mNextRequests. Return TIMED_OUT if getting any
55257ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // output buffer timed out. If an error is returned, the caller should clean up the pending
55357ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // request batch.
55457ea29251d93c9423030de387573142064366a30Chien-Yu Chen        status_t prepareHalRequests();
55585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
55657ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // Return buffers, etc, for requests in mNextRequests that couldn't be fully constructed and
55757ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // send request errors if sendRequestError is true. The buffers will be returned in the
55857ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // ERROR state to mark them as not having valid data. mNextRequests will be cleared.
55957ea29251d93c9423030de387573142064366a30Chien-Yu Chen        void cleanUpFailedRequests(bool sendRequestError);
560f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
561f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Pause handling
562f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               waitIfPaused();
56326fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        void               unpauseForNewRequests();
564f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
565b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        // Relay error to parent device object setErrorState
566b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        void               setErrorState(const char *fmt, ...);
567b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
5688684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh        // If the input request is in mRepeatingRequests. Must be called with mRequestLock hold
5698684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh        bool isRepeatingRequestLocked(const sp<CaptureRequest>);
5708684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh
571d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // Handle AE precapture trigger cancel for devices <= CAMERA_DEVICE_API_VERSION_3_2.
572d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        void handleAePrecaptureCancelRequest(sp<CaptureRequest> request);
573d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
574f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        wp<Camera3Device>  mParent;
575f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        wp<camera3::StatusTracker>  mStatusTracker;
576f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t  *mHal3Device;
577f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
5781754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala        NotificationListener *mListener;
5791754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
580f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        const int          mId;       // The camera ID
581f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int                mStatusId; // The RequestThread's component ID for
582f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                                      // status tracking
58342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
584f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mRequestLock;
585f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mRequestSignal;
586f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRequestQueue;
587f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRepeatingRequests;
58857ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // The next batch of requests being prepped for submission to the HAL, no longer
589e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala        // on the request queue. Read-only even with mRequestLock held, outside
590e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala        // of threadLoop
59157ea29251d93c9423030de387573142064366a30Chien-Yu Chen        Vector<NextRequest> mNextRequests;
59285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
59385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // To protect flush() and sending a request batch to HAL.
59485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        Mutex              mFlushLock;
595f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
596f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mReconfigured;
597f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
598f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused
599f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mPauseLock;
600f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mDoPause;
601f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mDoPauseSignal;
602f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mPaused;
603f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mPausedSignal;
6047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
605f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> mPrevRequest;
6064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mPrevTriggers;
6077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
60842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        uint32_t           mFrameNumber;
6094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
6101e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mutable Mutex      mLatestRequestMutex;
6114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Condition          mLatestRequestSignal;
6124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // android.request.id for latest process_capture_request
6134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mLatestRequestId;
6141e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata     mLatestRequest;
6154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
6164d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
6174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex              mTriggerMutex;
6184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerMap;
6194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerRemovedMap;
6204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerReplacedMap;
621c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh        uint32_t           mCurrentAfTriggerId;
622c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh        uint32_t           mCurrentPreCaptureTriggerId;
623cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
6242d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        int64_t            mRepeatingLastFrameNumber;
625d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
626d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // Whether the device supports AE lock
627d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        bool               mAeLockAvailable;
6287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    };
629f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<RequestThread> mRequestThread;
6307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
63242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     * In-flight queue for tracking completion of capture requests.
63342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     */
63442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
63542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    struct InFlightRequest {
63642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by notify() SHUTTER call.
63743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        nsecs_t shutterTimestamp;
63843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // Set by process_capture_result().
63943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        nsecs_t sensorTimestamp;
6401d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        int     requestStatus;
64142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by process_capture_result call with valid metadata
64242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        bool    haveResultMetadata;
64342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Decremented by calls to process_capture_result with valid output
644f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He        // and input buffers
64542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        int     numBuffersLeft;
646cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        CaptureResultExtras resultExtras;
647c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He        // If this request has any input buffer
648c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He        bool hasInputBuffer;
64942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
65043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // The last metadata that framework receives from HAL and
65143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // not yet send out because the shutter event hasn't arrived.
65243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // It's added by process_capture_result and sent when framework
65343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // receives the shutter event.
65443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        CameraMetadata pendingMetadata;
65543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
6565cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen        // The metadata of the partial results that framework receives from HAL so far
6575cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen        // and has sent out.
6585cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen        CameraMetadata collectedPartialResult;
6595cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen
66043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // Buffers are added by process_capture_result when output buffers
66143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // return from HAL but framework has not yet received the shutter
66243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // event. They will be returned to the streams when framework receives
66343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // the shutter event.
66443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        Vector<camera3_stream_buffer_t> pendingOutputBuffers;
66543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
666d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // Used to cancel AE precapture trigger for devices doesn't support
667d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
668d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        AeTriggerCancelOverride_t aeTriggerCancelOverride;
669d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
670f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Default constructor needed by KeyedVector
67142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest() :
67243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen                shutterTimestamp(0),
67343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen                sensorTimestamp(0),
6741d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                requestStatus(OK),
67542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
676c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He                numBuffersLeft(0),
677d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                hasInputBuffer(false),
678d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                aeTriggerCancelOverride({false, 0, false, 0}){
67942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
680cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
681d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        InFlightRequest(int numBuffers, CaptureResultExtras extras, bool hasInput,
682d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                AeTriggerCancelOverride aeTriggerCancelOverride) :
68343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen                shutterTimestamp(0),
68443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen                sensorTimestamp(0),
685cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                requestStatus(OK),
686cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                haveResultMetadata(false),
687cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                numBuffersLeft(numBuffers),
688c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He                resultExtras(extras),
689d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                hasInputBuffer(hasInput),
690d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                aeTriggerCancelOverride(aeTriggerCancelOverride){
691c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He        }
6924d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    };
6934d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
69442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Map from frame number to the in-flight request state
69542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap;
69642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
69742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex                  mInFlightLock; // Protects mInFlightMap
69842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    InFlightMap            mInFlightMap;
69942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
700cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    status_t registerInFlight(uint32_t frameNumber,
701d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen            int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput,
702d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen            const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
703f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
704f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
705d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen     * Override result metadata for cancelling AE precapture trigger applied in
706d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen     * handleAePrecaptureCancelRequest().
707d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen     */
708d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen    void overrideResultForPrecaptureCancel(CameraMetadata* result,
709d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen            const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
710d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
711fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    /**
712f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Tracking for idle detection
713f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
714f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<camera3::StatusTracker> mStatusTracker;
71542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
71642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    /**
717125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Graphic buffer manager for output streams. Each device has a buffer manager, which is used
718125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * by the output streams to get and return buffers if these streams are registered to this
719125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * buffer manager.
720125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
721125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    sp<camera3::Camera3BufferManager> mBufferManager;
722125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
723125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
7244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Thread for preparing streams
7254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
7264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    class PreparerThread : private Thread, public virtual RefBase {
7274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala      public:
7284d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        PreparerThread();
7294d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        ~PreparerThread();
7304d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7314d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        void setNotificationListener(NotificationListener *listener);
7324d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7334d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        /**
734c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk         * Queue up a stream to be prepared. Streams are processed by a background thread in FIFO
735c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk         * order.  Pre-allocate up to maxCount buffers for the stream, or the maximum number needed
736c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk         * for the pipeline if maxCount is ALLOCATE_PIPELINE_MAX.
7374d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         */
738c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk        status_t prepare(int maxCount, sp<camera3::Camera3StreamInterface>& stream);
7394d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7404d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        /**
7414d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         * Cancel all current and pending stream preparation
7424d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         */
7434d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        status_t clear();
7444d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala      private:
7464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        Mutex mLock;
7474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        virtual bool threadLoop();
7494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        // Guarded by mLock
7514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        NotificationListener *mListener;
7534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        List<sp<camera3::Camera3StreamInterface> > mPendingStreams;
7544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        bool mActive;
7554d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        bool mCancelNow;
7564d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7574d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        // Only accessed by threadLoop and the destructor
7584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7594d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        sp<camera3::Camera3StreamInterface> mCurrentStream;
7604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    };
7614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    sp<PreparerThread> mPreparerThread;
7624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
7647d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     * Output result queue and current HAL device 3A state
7657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     */
7667d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
7677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Lock for output side of device
7687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex                  mOutputLock;
7697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
7707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** Scope for mOutputLock ****/
771618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // the minimal frame number of the next non-reprocess result
77242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextResultFrameNumber;
773618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // the minimal frame number of the next reprocess result
774618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    uint32_t               mNextReprocessResultFrameNumber;
7753df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen    // the minimal frame number of the next non-reprocess shutter
77642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextShutterFrameNumber;
7773df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen    // the minimal frame number of the next reprocess shutter
7783df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen    uint32_t               mNextReprocessShutterFrameNumber;
779cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    List<CaptureResult>   mResultQueue;
7807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Condition              mResultSignal;
7817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener  *mListener;
7827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
7837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** End scope for mOutputLock ****/
7847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
7857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**
7867fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Callback functions from HAL device
7877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
7887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void processCaptureResult(const camera3_capture_result *result);
7897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void notify(const camera3_notify_msg *msg);
7917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
7921754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    // Specific notify handlers
7931754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    void notifyError(const camera3_error_msg_t &msg,
7941754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala            NotificationListener *listener);
7951754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    void notifyShutter(const camera3_shutter_msg_t &msg,
7961754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala            NotificationListener *listener);
7971754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
79843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    // helper function to return the output buffers to the streams.
79943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    void returnOutputBuffers(const camera3_stream_buffer_t *outputBuffers,
80043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen            size_t numBuffers, nsecs_t timestamp);
80143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
8025cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // Send a partial capture result.
8035cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    void sendPartialCaptureResult(const camera_metadata_t * partialResult,
8045cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen            const CaptureResultExtras &resultExtras, uint32_t frameNumber,
8055cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen            const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
8065cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen
8075cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // Send a total capture result given the pending metadata and result extras,
80843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    // partial results, and the frame number to the result queue.
80943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    void sendCaptureResult(CameraMetadata &pendingMetadata,
81043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen            CaptureResultExtras &resultExtras,
811618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            CameraMetadata &collectedPartialResult, uint32_t frameNumber,
812d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen            bool reprocess, const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
81343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
8145cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // Insert the result to the result queue after updating frame number and overriding AE
8155cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // trigger cancel.
8165cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // mOutputLock must be held when calling this function.
8175cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    void insertResultLocked(CaptureResult *result, uint32_t frameNumber,
8185cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen            const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
8195cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen
82043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    /**** Scope for mInFlightLock ****/
82143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
82243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    // Remove the in-flight request of the given index from mInFlightMap
82343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    // if it's no longer needed. It must only be called with mInFlightLock held.
82443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    void removeInFlightRequestIfReadyLocked(int idx);
82543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
82643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    /**** End scope for mInFlightLock ****/
82743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
8287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
8297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Static callback forwarding methods from HAL to instance
8307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
8317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_process_capture_result_t sProcessCaptureResult;
8327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_notify_t sNotify;
8347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device
8367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
8387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif
840