Camera3Device.h revision 184dfe4ea5e2ba33951bed2b1366007aee0ce3da
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>
267b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include <hardware/camera3.h>
277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
287b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala#include "common/CameraDeviceBase.h"
29f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala#include "device3/StatusTracker.h"
307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to
337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions.
347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" {
367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    typedef void (callbacks_process_capture_result_t)(
377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const struct camera3_callback_ops *,
387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_capture_result_t *);
397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    typedef void (callbacks_notify_t)(
417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const struct camera3_callback_ops *,
427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_notify_msg_t *);
437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android {
467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
477b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalanamespace camera3 {
487b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
497b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3Stream;
507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3ZslStream;
517b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3OutputStreamInterface;
527b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3StreamInterface;
537b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
547b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala}
557b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0
587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device :
607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            public CameraDeviceBase,
617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            private camera3_callback_ops {
627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  public:
637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device(int id);
647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual ~Camera3Device();
667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
68f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * CameraDeviceBase interface
697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
70f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
7171381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    virtual int      getId() const;
72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
73f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to idle state on success.
747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t initialize(camera_module_t *module);
757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t disconnect();
767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t dump(int fd, const Vector<String16> &args);
777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual const CameraMetadata& info() const;
78f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
79f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Capture and setStreamingRequest will configure streams if currently in
80f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // idle state
817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t capture(CameraMetadata &request);
827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamingRequest(const CameraMetadata &request);
837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t clearStreamingRequest();
84f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
87f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Actual stream creation/deletion is delayed until first request is submitted
88f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // If adding streams while actively capturing, will pause device before adding
89f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // stream, reconfiguring device, and unpausing.
907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createStream(sp<ANativeWindow> consumer,
917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            uint32_t width, uint32_t height, int format, size_t size,
927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            int *id);
935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t createInputStream(
945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            uint32_t width, uint32_t height, int format,
955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            int *id);
962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual status_t createZslStream(
972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            uint32_t width, uint32_t height,
982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int depth,
992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            /*out*/
1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int *id,
1012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<camera3::Camera3ZslStream>* zslStream);
1027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createReprocessStreamFromStream(int outputId, int *id);
103f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getStreamInfo(int id,
1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamTransform(int id, int transform);
107f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteStream(int id);
1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteReprocessStream(int id);
110f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createDefaultRequest(int templateId, CameraMetadata *request);
112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
113f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to the idle state on success
1147fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilDrained();
115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setNotifyCallback(NotificationListener *listener);
11746910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    virtual bool     willNotify3A();
1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitForNextFrame(nsecs_t timeout);
1197fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getNextFrame(CameraMetadata *frame);
120f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerAutofocus(uint32_t id);
1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerCancelAutofocus(uint32_t id);
1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerPrecaptureMetering(uint32_t id);
124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t pushReprocessBuffer(int reprocessStreamId,
1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
128abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    virtual status_t flush();
129abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
130f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Methods called by subclasses
131f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    void             notifyStatus(bool idle); // updates from StatusTracker
132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  private:
1341e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpLockAttempts  = 10;
1351e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpSleepDuration = 100000; // 0.10 sec
13642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const size_t        kInFlightWarnLimit = 20;
13742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const nsecs_t       kShutdownTimeout   = 5000000000; // 5 sec
138f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    static const nsecs_t       kActiveTimeout     = 500000000;  // 500 ms
1394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct                     RequestTrigger;
140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
141f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // A lock to enforce serialization on the input/configure side
142f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // of the public interface.
143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Only locked by public methods inherited from CameraDeviceBase.
144f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Not locked by methods guarded by mOutputLock, since they may act
145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // concurrently to the input/configure side of the interface.
146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Must be locked before mLock if both will be locked by a method
147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex                      mInterfaceLock;
148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // The main lock on internal state
150f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex                      mLock;
151f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
152f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Camera device ID
153f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    const int                  mId;
154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** Scope for mLock ****/
156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_device_t          *mHal3Device;
158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    CameraMetadata             mDeviceInfo;
160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    vendor_tag_query_ops_t     mVendorTagOps;
161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
162f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    enum Status {
163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ERROR,
164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_UNINITIALIZED,
165f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_UNCONFIGURED,
166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_CONFIGURED,
167f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ACTIVE
168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }                          mStatus;
169f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Vector<Status>             mRecentStatusUpdates;
170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Condition                  mStatusChanged;
171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
172b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    // Tracking cause of fatal errors when in STATUS_ERROR
173b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    String8                    mErrorCause;
174b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Mapping of stream IDs to stream instances
1762fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> >
1772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            StreamSet;
178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    StreamSet                  mOutputStreams;
180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<camera3::Camera3Stream> mInputStream;
181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    int                        mNextStreamId;
182ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    bool                       mNeedConfig;
183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
184f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Whether to send state updates upstream
185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Pause when doing transparent reconfiguration
186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool                       mPauseStateNotify;
187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Need to hold on to stream references until configure completes.
1892fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams;
190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
191fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Whether quirk ANDROID_QUIRKS_USE_PARTIAL_RESULT is enabled
192fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool                       mUsePartialResultQuirk;
193fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** End scope for mLock ****/
195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class CaptureRequest : public LightRefBase<CaptureRequest> {
197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala      public:
198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        CameraMetadata                      mSettings;
199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<camera3::Camera3Stream>          mInputStream;
2002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        Vector<sp<camera3::Camera3OutputStreamInterface> >
2012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                            mOutputStreams;
202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    };
203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    typedef List<sp<CaptureRequest> > RequestList;
204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
2061e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Get the last request submitted to the hal by the request thread.
2071e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     *
2081e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Takes mLock.
2091e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     */
210f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual CameraMetadata getLatestRequestLocked();
211f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
212f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
213f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Pause processing and flush everything, but don't tell the clients.
214f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * This is for reconfiguring outputs transparently when according to the
215f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * CameraDeviceBase interface we shouldn't need to.
216f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
217f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
218f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalPauseAndWaitLocked();
2191e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
2201e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    /**
221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Resume work after internalPauseAndWaitLocked()
222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalResumeLocked();
225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Wait until status tracker tells us we've transitioned to the target state
228f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * set, which is either ACTIVE when active==true or IDLE (which is any
229f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * non-ACTIVE state) when active==false.
230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Needs to be called with mLock and mInterfaceLock held.  This means there
232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * can ever only be one waiter at most.
233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * During the wait mLock is released.
235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t waitUntilStateThenRelock(bool active, nsecs_t timeout);
238f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
239f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Do common work for setting up a streaming or single capture request.
241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * On success, will transition to ACTIVE if in IDLE.
242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request);
244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Build a CaptureRequest request from the CameraDeviceBase request
247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * settings.
248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request);
2507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
251f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Take the currently-defined set of streams and configure the HAL to use
253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * them. This is a long-running operation (may be several hundered ms).
254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           configureStreamsLocked();
2567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
257b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    /**
258b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * Set device into an error state due to some fatal failure, and set an
259b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * error message to indicate why. Only the first call's message will be
260b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * used. The message is also sent to the log.
261b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     */
262b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorState(const char *fmt, ...);
263b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateV(const char *fmt, va_list args);
264b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLocked(const char *fmt, ...);
265b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLockedV(const char *fmt, va_list args);
266b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
267f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
268f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Debugging trylock/spin method
269f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Try to acquire a lock a few times with sleeps between before giving up.
270f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
271f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool               tryLockSpinRightRound(Mutex& lock);
272f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
2734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct RequestTrigger {
2744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata tag number, e.g. android.control.aePrecaptureTrigger
2754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t metadataTag;
2764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata value, e.g. 'START' or the trigger ID
2774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t entryValue;
2784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // The last part of the fully qualified path, e.g. afTrigger
2804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const char *getTagName() const {
2814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_name(metadataTag) ?: "NULL";
2824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
2834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // e.g. TYPE_BYTE, TYPE_INT32, etc.
2854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int getTagType() const {
2864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_type(metadataTag);
2874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
2884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
2894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
2917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Thread for managing capture request submission to HAL device.
2927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
293f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class RequestThread : public Thread {
2947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      public:
2967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
297f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestThread(wp<Camera3Device> parent,
298f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                sp<camera3::StatusTracker> statusTracker,
299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                camera3_device_t *hal3Device);
300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Call after stream (re)-configuration is completed.
303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     configurationComplete();
305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Set or clear the list of repeating requests. Does not block
308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * on either. Use waitUntilPaused to wait until request queue
309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * has emptied out.
310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t setRepeatingRequests(const RequestList& requests);
312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t clearRepeatingRequests();
313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t queueRequest(sp<CaptureRequest> request);
315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
317abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         * Remove all queued and repeating requests, and pending triggers
318abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         */
319abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        status_t clear();
320abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
321abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        /**
3224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Queue a trigger to be dispatched with the next outgoing
3234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * process_capture_request. The settings for that request only
3244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * will be temporarily rewritten to add the trigger tag/value.
3254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Subsequent requests will not be rewritten (for this tag).
3264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
3274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t queueTrigger(RequestTrigger trigger[], size_t count);
3284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Pause/unpause the capture thread. Doesn't block, so use
331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * waitUntilPaused to wait until the thread is paused.
332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     setPaused(bool paused);
334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
3364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Wait until thread processes the capture request with settings'
3374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * android.request.id == requestId.
3384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *
3394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Returns TIMED_OUT in case the thread does not process the request
3404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * within the timeout.
3414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
3424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout);
3434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3441e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        /**
345f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * Shut down the thread. Shutdown is asynchronous, so thread may
346f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * still be running once this method returns.
347f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         */
348f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        virtual void requestExit();
349f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
350f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        /**
3511e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * Get the latest request that was sent to the HAL
3521e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * with process_capture_request.
3531e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         */
3541e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata getLatestRequest() const;
3551e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
3567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      protected:
3577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        virtual bool threadLoop();
3597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      private:
36142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        static int         getId(const wp<Camera3Device> &device);
36242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
3634d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           queueTriggerLocked(RequestTrigger trigger);
3644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Mix-in queued triggers into this request
3654d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            insertTriggers(const sp<CaptureRequest> &request);
3664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Purge the queued triggers from this request,
3674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        //  restoring the old field values for those tags.
3684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           removeTriggers(const sp<CaptureRequest> &request);
3692f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
3702f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // HAL workaround: Make sure a trigger ID always exists if
3712f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // a trigger does
3722f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        status_t          addDummyTriggerIds(const sp<CaptureRequest> &request);
3734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
374f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        static const nsecs_t kRequestTimeout = 50e6; // 50 ms
375f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
376f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Waits for a request, or returns NULL if times out.
377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> waitForNextRequest();
378f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
379f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Return buffers, etc, for a request that couldn't be fully
380f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // constructed. The buffers will be returned in the ERROR state
381f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // to mark them as not having valid data.
382f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // All arguments will be modified.
383f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void cleanUpFailedRequest(camera3_capture_request_t &request,
384f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                sp<CaptureRequest> &nextRequest,
385f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                Vector<camera3_stream_buffer_t> &outputBuffers);
386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Pause handling
388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               waitIfPaused();
38926fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        void               unpauseForNewRequests();
390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
391b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        // Relay error to parent device object setErrorState
392b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        void               setErrorState(const char *fmt, ...);
393b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        wp<Camera3Device>  mParent;
395f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        wp<camera3::StatusTracker>  mStatusTracker;
396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t  *mHal3Device;
397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
398f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        const int          mId;       // The camera ID
399f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int                mStatusId; // The RequestThread's component ID for
400f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                                      // status tracking
40142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mRequestLock;
403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mRequestSignal;
404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRequestQueue;
405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRepeatingRequests;
406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
407f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mReconfigured;
408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused
410f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mPauseLock;
411f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mDoPause;
412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mDoPauseSignal;
413f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mPaused;
414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mPausedSignal;
4157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> mPrevRequest;
4174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mPrevTriggers;
4187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
41942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        uint32_t           mFrameNumber;
4204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4211e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mutable Mutex      mLatestRequestMutex;
4224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Condition          mLatestRequestSignal;
4234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // android.request.id for latest process_capture_request
4244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mLatestRequestId;
4251e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata     mLatestRequest;
4264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
4284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex              mTriggerMutex;
4294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerMap;
4304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerRemovedMap;
4314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerReplacedMap;
4327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    };
433f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<RequestThread> mRequestThread;
4347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
43642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     * In-flight queue for tracking completion of capture requests.
43742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     */
43842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
43942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    struct InFlightRequest {
440f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // android.request.id for the request
441f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int     requestId;
44242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by notify() SHUTTER call.
44342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        nsecs_t captureTimestamp;
4441d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        int     requestStatus;
44542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by process_capture_result call with valid metadata
44642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        bool    haveResultMetadata;
44742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Decremented by calls to process_capture_result with valid output
44842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // buffers
44942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        int     numBuffersLeft;
45042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
451fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Fields used by the partial result quirk only
452fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        struct PartialResultQuirkInFlight {
453fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            // Set by process_capture_result once 3A has been sent to clients
454fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            bool    haveSent3A;
455fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            // Result metadata collected so far, when partial results are in use
456fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            CameraMetadata collectedResult;
457fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
458fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            PartialResultQuirkInFlight():
459fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    haveSent3A(false) {
460fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            }
461fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        } partialResultQuirk;
462fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
463f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Default constructor needed by KeyedVector
46442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest() :
465f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                requestId(0),
46642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
4671d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                requestStatus(OK),
46842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
46942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(0) {
47042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
47142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
472f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        InFlightRequest(int id, int numBuffers) :
473f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                requestId(id),
47442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
475cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He                requestStatus(OK),
47642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
47742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(numBuffers) {
47842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
47942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    };
48042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Map from frame number to the in-flight request state
48142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap;
48242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
48342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex                  mInFlightLock; // Protects mInFlightMap
48442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    InFlightMap            mInFlightMap;
48542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
486f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t registerInFlight(int32_t frameNumber, int32_t requestId,
487f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            int32_t numBuffers);
488f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
489f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
490fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * For the partial result quirk, check if all 3A state fields are available
491fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * and if so, queue up 3A-only result to the client. Returns true if 3A
492fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * is sent.
493fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     */
494184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    bool processPartial3AQuirk(int32_t frameNumber, int32_t requestId,
495184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala            const CameraMetadata& partial);
496fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
497fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Helpers for reading and writing 3A metadata into to/from partial results
498fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    template<typename T>
499fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool get3AResult(const CameraMetadata& result, int32_t tag,
500fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            T* value, int32_t frameNumber);
501fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
502fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    template<typename T>
503fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool insert3AResult(CameraMetadata &result, int32_t tag, const T* value,
504fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            int32_t frameNumber);
505fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    /**
506f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Tracking for idle detection
507f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
508f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<camera3::StatusTracker> mStatusTracker;
50942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
51042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    /**
5117d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     * Output result queue and current HAL device 3A state
5127d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     */
5137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Lock for output side of device
5157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex                  mOutputLock;
5167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** Scope for mOutputLock ****/
5187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
51942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextResultFrameNumber;
52042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextShutterFrameNumber;
5217d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    List<CameraMetadata>   mResultQueue;
5227d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Condition              mResultSignal;
5237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener  *mListener;
5247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** End scope for mOutputLock ****/
5267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**
5287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Callback functions from HAL device
5297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
5307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void processCaptureResult(const camera3_capture_result *result);
5317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void notify(const camera3_notify_msg *msg);
5337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
5357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Static callback forwarding methods from HAL to instance
5367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
5377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_process_capture_result_t sProcessCaptureResult;
5387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_notify_t sNotify;
5407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device
5427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
5447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif
546