Camera3Device.h revision 90e59c98c343e941b1a75307ffa4b4b5f1eb50d6
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);
8290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    virtual status_t captureList(const List<const CameraMetadata> &requests);
837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamingRequest(const CameraMetadata &request);
8490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    virtual status_t setStreamingRequestList(const List<const CameraMetadata> &requests);
857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t clearStreamingRequest();
86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
88f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
89f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Actual stream creation/deletion is delayed until first request is submitted
90f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // If adding streams while actively capturing, will pause device before adding
91f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // stream, reconfiguring device, and unpausing.
927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createStream(sp<ANativeWindow> consumer,
937fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            uint32_t width, uint32_t height, int format, size_t size,
947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            int *id);
955a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t createInputStream(
965a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            uint32_t width, uint32_t height, int format,
975a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            int *id);
982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual status_t createZslStream(
992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            uint32_t width, uint32_t height,
1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int depth,
1012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            /*out*/
1022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int *id,
1032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<camera3::Camera3ZslStream>* zslStream);
1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createReprocessStreamFromStream(int outputId, int *id);
105f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getStreamInfo(int id,
1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamTransform(int id, int transform);
109f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteStream(int id);
1117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteReprocessStream(int id);
112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createDefaultRequest(int templateId, CameraMetadata *request);
114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to the idle state on success
1167fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilDrained();
117f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setNotifyCallback(NotificationListener *listener);
11946910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    virtual bool     willNotify3A();
1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitForNextFrame(nsecs_t timeout);
1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getNextFrame(CameraMetadata *frame);
122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1237fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerAutofocus(uint32_t id);
1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerCancelAutofocus(uint32_t id);
1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerPrecaptureMetering(uint32_t id);
126f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t pushReprocessBuffer(int reprocessStreamId,
1287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
130abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    virtual status_t flush();
131abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
132f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Methods called by subclasses
133f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    void             notifyStatus(bool idle); // updates from StatusTracker
134f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
1357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  private:
1361e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpLockAttempts  = 10;
1371e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpSleepDuration = 100000; // 0.10 sec
13842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const size_t        kInFlightWarnLimit = 20;
13942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const nsecs_t       kShutdownTimeout   = 5000000000; // 5 sec
140f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    static const nsecs_t       kActiveTimeout     = 500000000;  // 500 ms
1414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct                     RequestTrigger;
142f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
143f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // A lock to enforce serialization on the input/configure side
144f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // of the public interface.
145f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Only locked by public methods inherited from CameraDeviceBase.
146f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Not locked by methods guarded by mOutputLock, since they may act
147f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // concurrently to the input/configure side of the interface.
148f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Must be locked before mLock if both will be locked by a method
149f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Mutex                      mInterfaceLock;
150f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
151f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // The main lock on internal state
152f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex                      mLock;
153f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
154f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Camera device ID
155f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    const int                  mId;
156f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** Scope for mLock ****/
158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_device_t          *mHal3Device;
160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    CameraMetadata             mDeviceInfo;
162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    vendor_tag_query_ops_t     mVendorTagOps;
163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
164f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    enum Status {
165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ERROR,
166f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_UNINITIALIZED,
167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_UNCONFIGURED,
168f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_CONFIGURED,
169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ACTIVE
170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }                          mStatus;
171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Vector<Status>             mRecentStatusUpdates;
172f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Condition                  mStatusChanged;
173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
174b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    // Tracking cause of fatal errors when in STATUS_ERROR
175b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    String8                    mErrorCause;
176b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Mapping of stream IDs to stream instances
1782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> >
1792fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            StreamSet;
180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    StreamSet                  mOutputStreams;
182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<camera3::Camera3Stream> mInputStream;
183f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    int                        mNextStreamId;
184ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    bool                       mNeedConfig;
185f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Whether to send state updates upstream
187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Pause when doing transparent reconfiguration
188f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool                       mPauseStateNotify;
189f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Need to hold on to stream references until configure completes.
1912fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams;
192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
193fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Whether quirk ANDROID_QUIRKS_USE_PARTIAL_RESULT is enabled
194fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool                       mUsePartialResultQuirk;
195fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** End scope for mLock ****/
197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class CaptureRequest : public LightRefBase<CaptureRequest> {
199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala      public:
200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        CameraMetadata                      mSettings;
201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<camera3::Camera3Stream>          mInputStream;
2022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        Vector<sp<camera3::Camera3OutputStreamInterface> >
2032fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                            mOutputStreams;
204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    };
205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    typedef List<sp<CaptureRequest> > RequestList;
206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
20790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t checkStatusOkToCaptureLocked();
20890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
20990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t convertMetadataListToRequestListLocked(
21090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            const List<const CameraMetadata> &metadataList,
21190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            /*out*/RequestList *requestList);
21290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
21390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating);
21490e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
2161e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Get the last request submitted to the hal by the request thread.
2171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     *
2181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Takes mLock.
2191e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     */
220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual CameraMetadata getLatestRequestLocked();
221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
223f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Pause processing and flush everything, but don't tell the clients.
224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * This is for reconfiguring outputs transparently when according to the
225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * CameraDeviceBase interface we shouldn't need to.
226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
228f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalPauseAndWaitLocked();
2291e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
2301e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    /**
231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Resume work after internalPauseAndWaitLocked()
232f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
233f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalResumeLocked();
235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Wait until status tracker tells us we've transitioned to the target state
238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * set, which is either ACTIVE when active==true or IDLE (which is any
239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * non-ACTIVE state) when active==false.
240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Needs to be called with mLock and mInterfaceLock held.  This means there
242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * can ever only be one waiter at most.
243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * During the wait mLock is released.
245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
247f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t waitUntilStateThenRelock(bool active, nsecs_t timeout);
248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Do common work for setting up a streaming or single capture request.
251f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * On success, will transition to ACTIVE if in IDLE.
252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request);
254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Build a CaptureRequest request from the CameraDeviceBase request
257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * settings.
258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request);
2607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Take the currently-defined set of streams and configure the HAL to use
263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * them. This is a long-running operation (may be several hundered ms).
264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           configureStreamsLocked();
2667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
267b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    /**
268b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * Set device into an error state due to some fatal failure, and set an
269b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * error message to indicate why. Only the first call's message will be
270b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * used. The message is also sent to the log.
271b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     */
272b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorState(const char *fmt, ...);
273b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateV(const char *fmt, va_list args);
274b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLocked(const char *fmt, ...);
275b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLockedV(const char *fmt, va_list args);
276b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
277f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
278f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Debugging trylock/spin method
279f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Try to acquire a lock a few times with sleeps between before giving up.
280f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
281f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool               tryLockSpinRightRound(Mutex& lock);
282f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
2834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct RequestTrigger {
2844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata tag number, e.g. android.control.aePrecaptureTrigger
2854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t metadataTag;
2864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata value, e.g. 'START' or the trigger ID
2874d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t entryValue;
2884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // The last part of the fully qualified path, e.g. afTrigger
2904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const char *getTagName() const {
2914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_name(metadataTag) ?: "NULL";
2924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
2934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // e.g. TYPE_BYTE, TYPE_INT32, etc.
2954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int getTagType() const {
2964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_type(metadataTag);
2974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
2984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
2994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
3017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Thread for managing capture request submission to HAL device.
3027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class RequestThread : public Thread {
3047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      public:
3067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestThread(wp<Camera3Device> parent,
308f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                sp<camera3::StatusTracker> statusTracker,
309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                camera3_device_t *hal3Device);
310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
312f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Call after stream (re)-configuration is completed.
313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
314f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     configurationComplete();
315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Set or clear the list of repeating requests. Does not block
318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * on either. Use waitUntilPaused to wait until request queue
319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * has emptied out.
320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t setRepeatingRequests(const RequestList& requests);
322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t clearRepeatingRequests();
323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t queueRequest(sp<CaptureRequest> request);
325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
32690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        status_t queueRequestList(List<sp<CaptureRequest> > &requests);
32790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
329abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         * Remove all queued and repeating requests, and pending triggers
330abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         */
331abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        status_t clear();
332abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
333abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        /**
3344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Queue a trigger to be dispatched with the next outgoing
3354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * process_capture_request. The settings for that request only
3364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * will be temporarily rewritten to add the trigger tag/value.
3374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Subsequent requests will not be rewritten (for this tag).
3384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
3394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t queueTrigger(RequestTrigger trigger[], size_t count);
3404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Pause/unpause the capture thread. Doesn't block, so use
343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * waitUntilPaused to wait until the thread is paused.
344f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
345f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     setPaused(bool paused);
346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
3484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Wait until thread processes the capture request with settings'
3494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * android.request.id == requestId.
3504d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *
3514d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Returns TIMED_OUT in case the thread does not process the request
3524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * within the timeout.
3534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
3544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout);
3554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3561e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        /**
357f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * Shut down the thread. Shutdown is asynchronous, so thread may
358f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * still be running once this method returns.
359f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         */
360f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        virtual void requestExit();
361f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
362f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        /**
3631e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * Get the latest request that was sent to the HAL
3641e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * with process_capture_request.
3651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         */
3661e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata getLatestRequest() const;
3671e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
3687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      protected:
3697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3707fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        virtual bool threadLoop();
3717fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      private:
37342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        static int         getId(const wp<Camera3Device> &device);
37442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
3754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           queueTriggerLocked(RequestTrigger trigger);
3764d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Mix-in queued triggers into this request
3774d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            insertTriggers(const sp<CaptureRequest> &request);
3784d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Purge the queued triggers from this request,
3794d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        //  restoring the old field values for those tags.
3804d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           removeTriggers(const sp<CaptureRequest> &request);
3812f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
3822f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // HAL workaround: Make sure a trigger ID always exists if
3832f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // a trigger does
3842f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        status_t          addDummyTriggerIds(const sp<CaptureRequest> &request);
3854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
386f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        static const nsecs_t kRequestTimeout = 50e6; // 50 ms
387f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
388f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Waits for a request, or returns NULL if times out.
389f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> waitForNextRequest();
390f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
391f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Return buffers, etc, for a request that couldn't be fully
392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // constructed. The buffers will be returned in the ERROR state
393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // to mark them as not having valid data.
394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // All arguments will be modified.
395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void cleanUpFailedRequest(camera3_capture_request_t &request,
396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                sp<CaptureRequest> &nextRequest,
397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                Vector<camera3_stream_buffer_t> &outputBuffers);
398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Pause handling
400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               waitIfPaused();
40126fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        void               unpauseForNewRequests();
402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
403b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        // Relay error to parent device object setErrorState
404b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        void               setErrorState(const char *fmt, ...);
405b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        wp<Camera3Device>  mParent;
407f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        wp<camera3::StatusTracker>  mStatusTracker;
408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t  *mHal3Device;
409f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
410f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        const int          mId;       // The camera ID
411f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int                mStatusId; // The RequestThread's component ID for
412f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                                      // status tracking
41342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mRequestLock;
415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mRequestSignal;
416f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRequestQueue;
417f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRepeatingRequests;
418f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
419f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mReconfigured;
420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused
422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mPauseLock;
423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mDoPause;
424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mDoPauseSignal;
425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mPaused;
426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mPausedSignal;
4277fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> mPrevRequest;
4294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mPrevTriggers;
4307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
43142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        uint32_t           mFrameNumber;
4324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4331e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mutable Mutex      mLatestRequestMutex;
4344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Condition          mLatestRequestSignal;
4354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // android.request.id for latest process_capture_request
4364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mLatestRequestId;
4371e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata     mLatestRequest;
4384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
4404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex              mTriggerMutex;
4414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerMap;
4424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerRemovedMap;
4434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerReplacedMap;
4447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    };
445f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<RequestThread> mRequestThread;
4467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
44842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     * In-flight queue for tracking completion of capture requests.
44942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     */
45042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
45142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    struct InFlightRequest {
452f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // android.request.id for the request
453f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int     requestId;
45442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by notify() SHUTTER call.
45542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        nsecs_t captureTimestamp;
4561d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        int     requestStatus;
45742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by process_capture_result call with valid metadata
45842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        bool    haveResultMetadata;
45942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Decremented by calls to process_capture_result with valid output
46042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // buffers
46142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        int     numBuffersLeft;
46242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
463fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Fields used by the partial result quirk only
464fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        struct PartialResultQuirkInFlight {
465fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            // Set by process_capture_result once 3A has been sent to clients
466fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            bool    haveSent3A;
467fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            // Result metadata collected so far, when partial results are in use
468fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            CameraMetadata collectedResult;
469fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
470fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            PartialResultQuirkInFlight():
471fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    haveSent3A(false) {
472fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            }
473fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        } partialResultQuirk;
474fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
475f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Default constructor needed by KeyedVector
47642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest() :
477f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                requestId(0),
47842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
4791d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                requestStatus(OK),
48042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
48142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(0) {
48242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
48342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
484f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        InFlightRequest(int id, int numBuffers) :
485f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                requestId(id),
48642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
487cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He                requestStatus(OK),
48842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
48942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(numBuffers) {
49042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
49142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    };
49242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Map from frame number to the in-flight request state
49342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap;
49442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
49542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex                  mInFlightLock; // Protects mInFlightMap
49642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    InFlightMap            mInFlightMap;
49742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
498f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t registerInFlight(int32_t frameNumber, int32_t requestId,
499f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            int32_t numBuffers);
500f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
501f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
502fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * For the partial result quirk, check if all 3A state fields are available
503fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * and if so, queue up 3A-only result to the client. Returns true if 3A
504fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * is sent.
505fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     */
506184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    bool processPartial3AQuirk(int32_t frameNumber, int32_t requestId,
507184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala            const CameraMetadata& partial);
508fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
509fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Helpers for reading and writing 3A metadata into to/from partial results
510fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    template<typename T>
511fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool get3AResult(const CameraMetadata& result, int32_t tag,
512fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            T* value, int32_t frameNumber);
513fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
514fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    template<typename T>
515fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool insert3AResult(CameraMetadata &result, int32_t tag, const T* value,
516fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            int32_t frameNumber);
517fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    /**
518f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Tracking for idle detection
519f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
520f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<camera3::StatusTracker> mStatusTracker;
52142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
52242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    /**
5237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     * Output result queue and current HAL device 3A state
5247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     */
5257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Lock for output side of device
5277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex                  mOutputLock;
5287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** Scope for mOutputLock ****/
5307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
53142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextResultFrameNumber;
53242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextShutterFrameNumber;
5337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    List<CameraMetadata>   mResultQueue;
5347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Condition              mResultSignal;
5357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener  *mListener;
5367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5377d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** End scope for mOutputLock ****/
5387d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**
5407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Callback functions from HAL device
5417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
5427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void processCaptureResult(const camera3_capture_result *result);
5437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void notify(const camera3_notify_msg *msg);
5457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
5477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Static callback forwarding methods from HAL to instance
5487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
5497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_process_capture_result_t sProcessCaptureResult;
5507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_notify_t sNotify;
5527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device
5547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
5567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif
558