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
149b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang    virtual status_t addBufferListenerForStream(int streamId,
150b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang            wp<camera3::Camera3StreamBufferListener> listener);
151b0fdc1ed2182fe851ef7ca98a1b4a552b53b3033Shuzhen Wang
152c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk    virtual status_t prepare(int maxCount, int streamId);
153c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk
154204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    virtual uint32_t getDeviceVersion();
155204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He
15628c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He    virtual ssize_t getJpegBufferSize(uint32_t width, uint32_t height) const;
15795a1d0f2fb1ea85c549ef8b869ab9ab52601d1dbEino-Ville Talvala    ssize_t getPointCloudBufferSize() const;
158d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    ssize_t getRawOpaqueBufferSize(int32_t width, int32_t height) const;
15928c9b6f298134624cb52b1af4ed8716dddb983d3Zhijun He
160f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Methods called by subclasses
161f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    void             notifyStatus(bool idle); // updates from StatusTracker
162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  private:
1641e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpLockAttempts  = 10;
1651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpSleepDuration = 100000; // 0.10 sec
16642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const nsecs_t       kShutdownTimeout   = 5000000000; // 5 sec
167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    static const nsecs_t       kActiveTimeout     = 500000000;  // 500 ms
168c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen    static const size_t        kInFlightWarnLimit = 20;
169c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen    static const size_t        kInFlightWarnLimitHighSpeed = 256; // batch size 32 * pipe depth 8
170f99498ee4de7123e2fd71778c6877be44fbd1506Eino-Ville Talvala    // SCHED_FIFO priority for request submission thread in HFR mode
1714a8f4a3f567d8b3134b1c7ab21ca774f279ab9c2Chien-Yu Chen    static const int           kConstrainedHighSpeedThreadPriority = 1;
172c96ac8dfcae66a45b7ae67b82dabdf19f60f859dChien-Yu Chen
1734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct                     RequestTrigger;
174f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He    // minimal jpeg buffer size: 256KB + blob header
175f7da096db8655531c2f2b7bddccd1064b1021155Zhijun He    static const ssize_t       kMinJpegBufferSize = 256 * 1024 + sizeof(camera3_jpeg_blob);
17616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    // Constant to use for stream ID when one doesn't exist
17716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    static const int           NO_STREAM = -1;
178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
179f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // A lock to enforce serialization on the input/configure side
180f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // of the public interface.
181f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Only locked by public methods inherited from CameraDeviceBase.
182f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Not locked by methods guarded by mOutputLock, since they may act
183f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // concurrently to the input/configure side of the interface.
184f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Must be locked before mLock if both will be locked by a method
185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex                      mInterfaceLock;
186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // The main lock on internal state
188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex                      mLock;
189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
190f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Camera device ID
191f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    const int                  mId;
192f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1931fa8999c91d5df81949aa723000058380cd3faa2Zhijun He    // Flag indicating is the current active stream configuration is constrained high speed.
1941fa8999c91d5df81949aa723000058380cd3faa2Zhijun He    bool                       mIsConstrainedHighSpeedConfiguration;
1951fa8999c91d5df81949aa723000058380cd3faa2Zhijun He
196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** Scope for mLock ****/
197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_device_t          *mHal3Device;
199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    CameraMetadata             mDeviceInfo;
201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
202a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He    CameraMetadata             mRequestTemplateCache[CAMERA3_TEMPLATE_COUNT];
203a1530f1b16f093a91edbbbaf7dac9f9809867817Zhijun He
204204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    uint32_t                   mDeviceVersion;
205cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2064c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh    // whether Camera3Device should derive ANDROID_CONTROL_POST_RAW_SENSITIVITY_BOOST for
2074c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh    // backward compatibility. Should not be changed after initialization.
2084c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh    bool                       mDerivePostRawSensKey = false;
2094c060997514cb37aec9a9a7cec02a3f257d3a74dYin-Chia Yeh
210618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    struct Size {
211618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        uint32_t width;
212618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        uint32_t height;
213618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen        Size(uint32_t w = 0, uint32_t h = 0) : width(w), height(h){}
214618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    };
215618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // Map from format to size.
216618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    Vector<Size>               mSupportedOpaqueInputSizes;
217618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen
218f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    enum Status {
219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ERROR,
220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_UNINITIALIZED,
221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_UNCONFIGURED,
222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_CONFIGURED,
223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ACTIVE
224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }                          mStatus;
225183f056393423b344e73f388f21d30379a38e519Ruben Brunk
226183f056393423b344e73f388f21d30379a38e519Ruben Brunk    // Only clear mRecentStatusUpdates, mStatusWaiters from waitUntilStateThenRelock
227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Vector<Status>             mRecentStatusUpdates;
228183f056393423b344e73f388f21d30379a38e519Ruben Brunk    int                        mStatusWaiters;
229183f056393423b344e73f388f21d30379a38e519Ruben Brunk
230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Condition                  mStatusChanged;
231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
232b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    // Tracking cause of fatal errors when in STATUS_ERROR
233b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    String8                    mErrorCause;
234b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
235f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Mapping of stream IDs to stream instances
2362fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> >
2372fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            StreamSet;
238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    StreamSet                  mOutputStreams;
240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<camera3::Camera3Stream> mInputStream;
241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    int                        mNextStreamId;
242ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    bool                       mNeedConfig;
243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
24416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    int                        mDummyStreamId;
24516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala
246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Whether to send state updates upstream
247f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Pause when doing transparent reconfiguration
248f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool                       mPauseStateNotify;
249f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Need to hold on to stream references until configure completes.
2512fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams;
252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
253204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    // Whether the HAL will send partial result
254204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    bool                       mUsePartialResult;
255204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He
256204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    // Number of partial results that will be delivered by the HAL.
257204e3295e2814052aef7e45ee9edd60128efbbd0Zhijun He    uint32_t                   mNumPartialResults;
258fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** End scope for mLock ****/
260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
261c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    // The offset converting from clock domain of other subsystem
262c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    // (video/hardware composer) to that of camera. Assumption is that this
263c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    // offset won't change during the life cycle of the camera device. In other
264c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    // words, camera device shouldn't be open during CPU suspend.
265c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    nsecs_t                    mTimestampOffset;
266c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang
267d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen    typedef struct AeTriggerCancelOverride {
268d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        bool applyAeLock;
269d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        uint8_t aeLock;
270d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        bool applyAePrecaptureTrigger;
271d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        uint8_t aePrecaptureTrigger;
272d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen    } AeTriggerCancelOverride_t;
273d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
274f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class CaptureRequest : public LightRefBase<CaptureRequest> {
275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala      public:
276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        CameraMetadata                      mSettings;
277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<camera3::Camera3Stream>          mInputStream;
278c2adf48e2dfae0b2b5ddd9de9e7d79ca471bfd37Chien-Yu Chen        camera3_stream_buffer_t             mInputBuffer;
2792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        Vector<sp<camera3::Camera3OutputStreamInterface> >
2802fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                            mOutputStreams;
281cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        CaptureResultExtras                 mResultExtras;
282d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // Used to cancel AE precapture trigger for devices doesn't support
283d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
284d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        AeTriggerCancelOverride_t           mAeTriggerCancelOverride;
28585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // The number of requests that should be submitted to HAL at a time.
28685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // For example, if batch size is 8, this request and the following 7
28785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // requests will be submitted to HAL at a time. The batch size for
28885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // the following 7 requests will be ignored by the request thread.
28985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        int                                 mBatchSize;
290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    };
291f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    typedef List<sp<CaptureRequest> > RequestList;
292f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
29390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t checkStatusOkToCaptureLocked();
29490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
29590e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t convertMetadataListToRequestListLocked(
29690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            const List<const CameraMetadata> &metadataList,
2972d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei            /*out*/
2982d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei            RequestList *requestList);
29990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
300cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating,
301cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                                  int64_t *lastFrameNumber = NULL);
30290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
3041e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Get the last request submitted to the hal by the request thread.
3051e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     *
3061e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Takes mLock.
3071e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     */
308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual CameraMetadata getLatestRequestLocked();
309f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
310f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
311183f056393423b344e73f388f21d30379a38e519Ruben Brunk     * Update the current device status and wake all waiting threads.
312183f056393423b344e73f388f21d30379a38e519Ruben Brunk     *
313183f056393423b344e73f388f21d30379a38e519Ruben Brunk     * Must be called with mLock held.
314183f056393423b344e73f388f21d30379a38e519Ruben Brunk     */
315183f056393423b344e73f388f21d30379a38e519Ruben Brunk    void internalUpdateStatusLocked(Status status);
316183f056393423b344e73f388f21d30379a38e519Ruben Brunk
317183f056393423b344e73f388f21d30379a38e519Ruben Brunk    /**
318f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Pause processing and flush everything, but don't tell the clients.
319f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * This is for reconfiguring outputs transparently when according to the
320f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * CameraDeviceBase interface we shouldn't need to.
321f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
322f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
323f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalPauseAndWaitLocked();
3241e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
3251e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    /**
326f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Resume work after internalPauseAndWaitLocked()
327f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
329f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalResumeLocked();
330f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
331f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
332f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Wait until status tracker tells us we've transitioned to the target state
333f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * set, which is either ACTIVE when active==true or IDLE (which is any
334f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * non-ACTIVE state) when active==false.
335f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
336f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Needs to be called with mLock and mInterfaceLock held.  This means there
337f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * can ever only be one waiter at most.
338f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
339f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * During the wait mLock is released.
340f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
341f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
342f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t waitUntilStateThenRelock(bool active, nsecs_t timeout);
343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
34569a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     * Implementation of waitUntilDrained. On success, will transition to IDLE state.
34669a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     *
34769a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     * Need to be called with mLock and mInterfaceLock held.
34869a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     */
34969a374897392c8bd70f441b7284f6f578c651ec9Zhijun He    status_t waitUntilDrainedLocked();
35069a374897392c8bd70f441b7284f6f578c651ec9Zhijun He
35169a374897392c8bd70f441b7284f6f578c651ec9Zhijun He    /**
352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Do common work for setting up a streaming or single capture request.
353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * On success, will transition to ACTIVE if in IDLE.
354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request);
356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Build a CaptureRequest request from the CameraDeviceBase request
359f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * settings.
360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
361f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request);
3627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
363f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
364f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Take the currently-defined set of streams and configure the HAL to use
365f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * them. This is a long-running operation (may be several hundered ms).
366f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
367f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           configureStreamsLocked();
3687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
369b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    /**
3709b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen     * Cancel stream configuration that did not finish successfully.
3719b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen     */
3729b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen    void               cancelStreamsConfigurationLocked();
3739b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen
3749b5860bd84adb5c7d497f188b5e6ade7f066ba3cChien-Yu Chen    /**
37516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     * Add a dummy stream to the current stream set as a workaround for
37616a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     * not allowing 0 streams in the camera HAL spec.
37716a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     */
37816a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    status_t           addDummyStreamLocked();
37916a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala
38016a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    /**
38116a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     * Remove a dummy stream if the current config includes real streams.
38216a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala     */
38316a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    status_t           tryRemoveDummyStreamLocked();
38416a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala
38516a2ada049447c156648812b94d25be07869f284Eino-Ville Talvala    /**
386b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * Set device into an error state due to some fatal failure, and set an
387b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * error message to indicate why. Only the first call's message will be
388b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * used. The message is also sent to the log.
389b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     */
390b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorState(const char *fmt, ...);
391b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateV(const char *fmt, va_list args);
392b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLocked(const char *fmt, ...);
393b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLockedV(const char *fmt, va_list args);
394b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
396f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Debugging trylock/spin method
397f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Try to acquire a lock a few times with sleeps between before giving up.
398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool               tryLockSpinRightRound(Mutex& lock);
400f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
401618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    /**
402618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen     * Helper function to determine if an input size for implementation defined
403618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen     * format is supported.
404618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen     */
405618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    bool isOpaqueInputSizeSupported(uint32_t width, uint32_t height);
406cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
407cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    /**
408cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh     * Helper function to get the largest Jpeg resolution (in area)
409cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh     * Return Size(0, 0) if static metatdata is invalid
410cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh     */
411cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Size getMaxJpegResolution() const;
412cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
413c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    /**
414c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang     * Helper function to get the offset between MONOTONIC and BOOTTIME
415c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang     * timestamp.
416c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang     */
417c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang    static nsecs_t getMonoToBoottimeOffset();
418c28dcccb9bc0a94950a7475f9bd8a6a38be34419Shuzhen Wang
4192cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala    /**
4202cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala     * Helper function to map between legacy and new dataspace enums
4212cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala     */
4222cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala    static android_dataspace mapToLegacyDataspace(android_dataspace dataSpace);
4232cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala
4244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct RequestTrigger {
4254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata tag number, e.g. android.control.aePrecaptureTrigger
4264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t metadataTag;
4274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata value, e.g. 'START' or the trigger ID
4284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t entryValue;
4294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // The last part of the fully qualified path, e.g. afTrigger
4314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const char *getTagName() const {
4324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_name(metadataTag) ?: "NULL";
4334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
4344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // e.g. TYPE_BYTE, TYPE_INT32, etc.
4364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int getTagType() const {
4374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_type(metadataTag);
4384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
4394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
4404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
4427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Thread for managing capture request submission to HAL device.
4437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
444f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class RequestThread : public Thread {
4457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      public:
4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
448f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestThread(wp<Camera3Device> parent,
449f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                sp<camera3::StatusTracker> statusTracker,
450ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen                camera3_device_t *hal3Device,
451ab5135b254c6f9aaac8edb816596f8823dbdb3d5Chien-Yu Chen                bool aeLockAvailable);
452f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
4534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        void     setNotificationListener(NotificationListener *listener);
4541754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
455f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
456f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Call after stream (re)-configuration is completed.
457f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
458c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen        void     configurationComplete(bool isConstrainedHighSpeed);
459f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
460f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
461f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Set or clear the list of repeating requests. Does not block
462f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * on either. Use waitUntilPaused to wait until request queue
463f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * has emptied out.
464f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
4652d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        status_t setRepeatingRequests(const RequestList& requests,
4662d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                      /*out*/
4672d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                      int64_t *lastFrameNumber = NULL);
4682d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        status_t clearRepeatingRequests(/*out*/
4692d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                        int64_t *lastFrameNumber = NULL);
4702d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei
4712d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        status_t queueRequestList(List<sp<CaptureRequest> > &requests,
4722d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                  /*out*/
4732d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                                  int64_t *lastFrameNumber = NULL);
47490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
475f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
476abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         * Remove all queued and repeating requests, and pending triggers
477abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         */
4781754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala        status_t clear(NotificationListener *listener,
4791754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala                       /*out*/
4802d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei                       int64_t *lastFrameNumber = NULL);
481abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
482abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        /**
48385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen         * Flush all pending requests in HAL.
48485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen         */
48585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        status_t flush();
48685a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
48785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        /**
4884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Queue a trigger to be dispatched with the next outgoing
4894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * process_capture_request. The settings for that request only
4904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * will be temporarily rewritten to add the trigger tag/value.
4914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Subsequent requests will not be rewritten (for this tag).
4924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
4934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t queueTrigger(RequestTrigger trigger[], size_t count);
4944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
496f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Pause/unpause the capture thread. Doesn't block, so use
497f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * waitUntilPaused to wait until the thread is paused.
498f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
499f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     setPaused(bool paused);
500f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
501f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
5024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Wait until thread processes the capture request with settings'
5034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * android.request.id == requestId.
5044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *
5054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Returns TIMED_OUT in case the thread does not process the request
5064d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * within the timeout.
5074d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
5084d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout);
5094d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
5101e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        /**
511f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * Shut down the thread. Shutdown is asynchronous, so thread may
512f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * still be running once this method returns.
513f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         */
514f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        virtual void requestExit();
515f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
516f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        /**
5171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * Get the latest request that was sent to the HAL
5181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * with process_capture_request.
5191e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         */
5201e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata getLatestRequest() const;
5211e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
5224d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        /**
5234d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         * Returns true if the stream is a target of any queued or repeating
5244d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         * capture request
5254d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         */
5264d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        bool isStreamPending(sp<camera3::Camera3StreamInterface>& stream);
5274d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
5287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      protected:
5297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        virtual bool threadLoop();
5317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      private:
53342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        static int         getId(const wp<Camera3Device> &device);
53442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
5354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           queueTriggerLocked(RequestTrigger trigger);
5364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Mix-in queued triggers into this request
5374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            insertTriggers(const sp<CaptureRequest> &request);
5384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Purge the queued triggers from this request,
5394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        //  restoring the old field values for those tags.
5404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           removeTriggers(const sp<CaptureRequest> &request);
5412f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
5422f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // HAL workaround: Make sure a trigger ID always exists if
5432f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // a trigger does
5442f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        status_t          addDummyTriggerIds(const sp<CaptureRequest> &request);
5454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
546f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        static const nsecs_t kRequestTimeout = 50e6; // 50 ms
547f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
54885a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // Used to prepare a batch of requests.
54985a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        struct NextRequest {
55085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen            sp<CaptureRequest>              captureRequest;
55185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen            camera3_capture_request_t       halRequest;
55285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen            Vector<camera3_stream_buffer_t> outputBuffers;
55385a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen            bool                            submitted;
55485a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        };
55585a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
55657ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // Wait for the next batch of requests and put them in mNextRequests. mNextRequests will
55757ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // be empty if it times out.
55857ea29251d93c9423030de387573142064366a30Chien-Yu Chen        void waitForNextRequestBatch();
559f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
56085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // Waits for a request, or returns NULL if times out. Must be called with mRequestLock hold.
56185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        sp<CaptureRequest> waitForNextRequestLocked();
56285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
56357ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // Prepare HAL requests and output buffers in mNextRequests. Return TIMED_OUT if getting any
56457ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // output buffer timed out. If an error is returned, the caller should clean up the pending
56557ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // request batch.
56657ea29251d93c9423030de387573142064366a30Chien-Yu Chen        status_t prepareHalRequests();
56785a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
56857ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // Return buffers, etc, for requests in mNextRequests that couldn't be fully constructed and
56957ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // send request errors if sendRequestError is true. The buffers will be returned in the
57057ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // ERROR state to mark them as not having valid data. mNextRequests will be cleared.
57157ea29251d93c9423030de387573142064366a30Chien-Yu Chen        void cleanUpFailedRequests(bool sendRequestError);
572f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
573e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        // Stop the repeating request if any of its output streams is abandoned.
574e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        void checkAndStopRepeatingRequest();
575e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen
576f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Pause handling
577f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               waitIfPaused();
57826fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        void               unpauseForNewRequests();
579f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
580b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        // Relay error to parent device object setErrorState
581b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        void               setErrorState(const char *fmt, ...);
582b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
5838684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh        // If the input request is in mRepeatingRequests. Must be called with mRequestLock hold
5848684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh        bool isRepeatingRequestLocked(const sp<CaptureRequest>);
5858684b7f7977f535260367040931c1fd994cca3b4Yin-Chia Yeh
586d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // Handle AE precapture trigger cancel for devices <= CAMERA_DEVICE_API_VERSION_3_2.
587d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        void handleAePrecaptureCancelRequest(sp<CaptureRequest> request);
588d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
589e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        // Clear repeating requests. Must be called with mRequestLock held.
590e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen        status_t clearRepeatingRequestsLocked(/*out*/ int64_t *lastFrameNumber = NULL);
591e8c535e833ed135895e99ca81aa3b85d80d7cf3cChien-Yu Chen
592f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        wp<Camera3Device>  mParent;
593f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        wp<camera3::StatusTracker>  mStatusTracker;
594f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t  *mHal3Device;
595f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
5961754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala        NotificationListener *mListener;
5971754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
598f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        const int          mId;       // The camera ID
599f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int                mStatusId; // The RequestThread's component ID for
600f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                                      // status tracking
60142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
602f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mRequestLock;
603f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mRequestSignal;
604f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRequestQueue;
605f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRepeatingRequests;
60657ea29251d93c9423030de387573142064366a30Chien-Yu Chen        // The next batch of requests being prepped for submission to the HAL, no longer
607e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala        // on the request queue. Read-only even with mRequestLock held, outside
608e74c228e83906e0e317c4eb6eac20815ff839c04Eino-Ville Talvala        // of threadLoop
60957ea29251d93c9423030de387573142064366a30Chien-Yu Chen        Vector<NextRequest> mNextRequests;
61085a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen
61185a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        // To protect flush() and sending a request batch to HAL.
61285a6455f269d79adf9bf48d757a4b1b3c81cf760Chien-Yu Chen        Mutex              mFlushLock;
613f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
614f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mReconfigured;
615f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
616f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused
617f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mPauseLock;
618f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mDoPause;
619f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mDoPauseSignal;
620f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mPaused;
621f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mPausedSignal;
6227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
623f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> mPrevRequest;
6244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mPrevTriggers;
6257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
62642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        uint32_t           mFrameNumber;
6274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
6281e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mutable Mutex      mLatestRequestMutex;
6294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Condition          mLatestRequestSignal;
6304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // android.request.id for latest process_capture_request
6314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mLatestRequestId;
6321e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata     mLatestRequest;
6334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
6344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
6354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex              mTriggerMutex;
6364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerMap;
6374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerRemovedMap;
6384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerReplacedMap;
639c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh        uint32_t           mCurrentAfTriggerId;
640c00a25ccce0734bf5627cf02d0c4fb3cf051ce15Yin-Chia Yeh        uint32_t           mCurrentPreCaptureTriggerId;
641cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
6422d6bb3f9e3e7cc1c7debbbe3d74bf9c70b6f39d4Jianing Wei        int64_t            mRepeatingLastFrameNumber;
643d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
644d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // Whether the device supports AE lock
645d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        bool               mAeLockAvailable;
646c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen
647c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen        // Flag indicating if we should prepare video stream for video requests.
648c66969beb346b878701c4adccf83a1475c3a0687Chien-Yu Chen        bool               mPrepareVideoStream;
6497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    };
650f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<RequestThread> mRequestThread;
6517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
6527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
65342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     * In-flight queue for tracking completion of capture requests.
65442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     */
65542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
65642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    struct InFlightRequest {
65742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by notify() SHUTTER call.
65843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        nsecs_t shutterTimestamp;
65943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // Set by process_capture_result().
66043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        nsecs_t sensorTimestamp;
6611d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        int     requestStatus;
66242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by process_capture_result call with valid metadata
66342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        bool    haveResultMetadata;
66442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Decremented by calls to process_capture_result with valid output
665f0d962a6737eb8eec002d6804d9ffbe7bee672a0Zhijun He        // and input buffers
66642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        int     numBuffersLeft;
667cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei        CaptureResultExtras resultExtras;
668c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He        // If this request has any input buffer
669c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He        bool hasInputBuffer;
67042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
67143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // The last metadata that framework receives from HAL and
67243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // not yet send out because the shutter event hasn't arrived.
67343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // It's added by process_capture_result and sent when framework
67443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // receives the shutter event.
67543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        CameraMetadata pendingMetadata;
67643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
6775cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen        // The metadata of the partial results that framework receives from HAL so far
6785cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen        // and has sent out.
6795cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen        CameraMetadata collectedPartialResult;
6805cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen
68143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // Buffers are added by process_capture_result when output buffers
68243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // return from HAL but framework has not yet received the shutter
68343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // event. They will be returned to the streams when framework receives
68443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        // the shutter event.
68543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen        Vector<camera3_stream_buffer_t> pendingOutputBuffers;
68643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
687d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // Used to cancel AE precapture trigger for devices doesn't support
688d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        // CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL
689d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        AeTriggerCancelOverride_t aeTriggerCancelOverride;
690d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
691f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Default constructor needed by KeyedVector
69242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest() :
69343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen                shutterTimestamp(0),
69443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen                sensorTimestamp(0),
6951d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                requestStatus(OK),
69642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
697c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He                numBuffersLeft(0),
698d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                hasInputBuffer(false),
699d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                aeTriggerCancelOverride({false, 0, false, 0}){
70042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
701cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei
702d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen        InFlightRequest(int numBuffers, CaptureResultExtras extras, bool hasInput,
703d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                AeTriggerCancelOverride aeTriggerCancelOverride) :
70443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen                shutterTimestamp(0),
70543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen                sensorTimestamp(0),
706cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                requestStatus(OK),
707cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                haveResultMetadata(false),
708cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei                numBuffersLeft(numBuffers),
709c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He                resultExtras(extras),
710d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                hasInputBuffer(hasInput),
711d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen                aeTriggerCancelOverride(aeTriggerCancelOverride){
712c98bd8d9bf81663b5cd9c79e79d6e7869c1146e6Zhijun He        }
7134d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    };
7144d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
71542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Map from frame number to the in-flight request state
71642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap;
71742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
71842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex                  mInFlightLock; // Protects mInFlightMap
71942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    InFlightMap            mInFlightMap;
72042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
721cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    status_t registerInFlight(uint32_t frameNumber,
722d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen            int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput,
723d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen            const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
724f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
725f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
726d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen     * Override result metadata for cancelling AE precapture trigger applied in
727d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen     * handleAePrecaptureCancelRequest().
728d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen     */
729d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen    void overrideResultForPrecaptureCancel(CameraMetadata* result,
730d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen            const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
731d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen
732fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    /**
733f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Tracking for idle detection
734f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
735f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<camera3::StatusTracker> mStatusTracker;
73642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
73742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    /**
738125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * Graphic buffer manager for output streams. Each device has a buffer manager, which is used
739125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * by the output streams to get and return buffers if these streams are registered to this
740125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     * buffer manager.
741125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He     */
742125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    sp<camera3::Camera3BufferManager> mBufferManager;
743125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He
744125684aba1a11b7adbf5f9d607ee2bcc9449081cZhijun He    /**
7454d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     * Thread for preparing streams
7464d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala     */
7474d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    class PreparerThread : private Thread, public virtual RefBase {
7484d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala      public:
7494d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        PreparerThread();
7504d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        ~PreparerThread();
7514d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7524d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        void setNotificationListener(NotificationListener *listener);
7534d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7544d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        /**
755c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk         * Queue up a stream to be prepared. Streams are processed by a background thread in FIFO
756c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk         * order.  Pre-allocate up to maxCount buffers for the stream, or the maximum number needed
757c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk         * for the pipeline if maxCount is ALLOCATE_PIPELINE_MAX.
7584d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         */
759c78ac26e3a65328fc0118f16ee76a800d0687eb7Ruben Brunk        status_t prepare(int maxCount, sp<camera3::Camera3StreamInterface>& stream);
7604d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7614d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        /**
7624d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         * Cancel all current and pending stream preparation
7634d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala         */
7644d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        status_t clear();
7654d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7664d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala      private:
7674d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        Mutex mLock;
7684d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7694d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        virtual bool threadLoop();
7704d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7714d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        // Guarded by mLock
7724d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7734d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        NotificationListener *mListener;
7744d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        List<sp<camera3::Camera3StreamInterface> > mPendingStreams;
7754d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        bool mActive;
7764d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        bool mCancelNow;
7774d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7784d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        // Only accessed by threadLoop and the destructor
7794d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7804d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala        sp<camera3::Camera3StreamInterface> mCurrentStream;
7814d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    };
7824d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    sp<PreparerThread> mPreparerThread;
7834d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala
7844d44cad22ea925a651463f2d51d6586c14d4b787Eino-Ville Talvala    /**
7857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     * Output result queue and current HAL device 3A state
7867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     */
7877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
7887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Lock for output side of device
7897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex                  mOutputLock;
7907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
7917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** Scope for mOutputLock ****/
792618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // the minimal frame number of the next non-reprocess result
79342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextResultFrameNumber;
794618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    // the minimal frame number of the next reprocess result
795618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen    uint32_t               mNextReprocessResultFrameNumber;
7963df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen    // the minimal frame number of the next non-reprocess shutter
79742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextShutterFrameNumber;
7983df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen    // the minimal frame number of the next reprocess shutter
7993df11ce7240d0ce5d957c626be467832c1c7fde9Chien-Yu Chen    uint32_t               mNextReprocessShutterFrameNumber;
800cb0652e5a850b2fcd919e977247e87239efaf70eJianing Wei    List<CaptureResult>   mResultQueue;
8017d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Condition              mResultSignal;
8027d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener  *mListener;
8037d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
8047d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** End scope for mOutputLock ****/
8057d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
8067d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**
8077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Callback functions from HAL device
8087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
8097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void processCaptureResult(const camera3_capture_result *result);
8107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void notify(const camera3_notify_msg *msg);
8127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8131754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    // Specific notify handlers
8141754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    void notifyError(const camera3_error_msg_t &msg,
8151754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala            NotificationListener *listener);
8161754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala    void notifyShutter(const camera3_shutter_msg_t &msg,
8171754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala            NotificationListener *listener);
8181754351d9199721e7e7943461689e399ef015260Eino-Ville Talvala
81943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    // helper function to return the output buffers to the streams.
82043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    void returnOutputBuffers(const camera3_stream_buffer_t *outputBuffers,
82143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen            size_t numBuffers, nsecs_t timestamp);
82243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
8235cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // Send a partial capture result.
8245cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    void sendPartialCaptureResult(const camera_metadata_t * partialResult,
8255cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen            const CaptureResultExtras &resultExtras, uint32_t frameNumber,
8265cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen            const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
8275cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen
8285cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // Send a total capture result given the pending metadata and result extras,
82943e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    // partial results, and the frame number to the result queue.
83043e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    void sendCaptureResult(CameraMetadata &pendingMetadata,
83143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen            CaptureResultExtras &resultExtras,
832618ff8a48a0c895a78f91f5692510c2a809425c3Chien-Yu Chen            CameraMetadata &collectedPartialResult, uint32_t frameNumber,
833d196d6165aa1ac0dd7c0ad6cc5ada3a2f8e4b49dChien-Yu Chen            bool reprocess, const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
83443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
8355cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // Insert the result to the result queue after updating frame number and overriding AE
8365cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // trigger cancel.
8375cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    // mOutputLock must be held when calling this function.
8385cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen    void insertResultLocked(CaptureResult *result, uint32_t frameNumber,
8395cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen            const AeTriggerCancelOverride_t &aeTriggerCancelOverride);
8405cd8d64b36e0bc87115a5221b06e2fe3c5f9879bChien-Yu Chen
84143e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    /**** Scope for mInFlightLock ****/
84243e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
84343e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    // Remove the in-flight request of the given index from mInFlightMap
84443e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    // if it's no longer needed. It must only be called with mInFlightLock held.
84543e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    void removeInFlightRequestIfReadyLocked(int idx);
84643e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
84743e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen    /**** End scope for mInFlightLock ****/
84843e69a6792f01b86b4aaf2314534f637e11c5843Chien-Yu Chen
8497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
8507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Static callback forwarding methods from HAL to instance
8517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
8527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_process_capture_result_t sProcessCaptureResult;
8537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_notify_t sNotify;
8557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device
8577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
8597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
8607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif
861