Camera3Device.h revision 2f876f9ee63396e4e0117f85c5b3132cac7e2c9d
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"
297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to
327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions.
337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" {
357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    typedef void (callbacks_process_capture_result_t)(
367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const struct camera3_callback_ops *,
377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_capture_result_t *);
387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    typedef void (callbacks_notify_t)(
407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const struct camera3_callback_ops *,
417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_notify_msg_t *);
427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android {
457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
467b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalanamespace camera3 {
477b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
487b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3Stream;
497b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3ZslStream;
507b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3OutputStreamInterface;
517b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvalaclass Camera3StreamInterface;
527b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
537b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala}
547b82efe7a376c882f8f938e1c41b8311a8cdda4aEino-Ville Talvala
557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0
577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device :
597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            public CameraDeviceBase,
607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            private camera3_callback_ops {
617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  public:
627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device(int id);
637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual ~Camera3Device();
657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
67f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * CameraDeviceBase interface
687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
69f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
7071381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    virtual int      getId() const;
71f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to idle state on success.
737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t initialize(camera_module_t *module);
747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t disconnect();
757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t dump(int fd, const Vector<String16> &args);
767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual const CameraMetadata& info() const;
77f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
78f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Capture and setStreamingRequest will configure streams if currently in
79f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // idle state
807fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t capture(CameraMetadata &request);
817fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamingRequest(const CameraMetadata &request);
827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t clearStreamingRequest();
83f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
85f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Actual stream creation/deletion is delayed until first request is submitted
87f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // If adding streams while actively capturing, will pause device before adding
88f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // stream, reconfiguring device, and unpausing.
897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createStream(sp<ANativeWindow> consumer,
907fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            uint32_t width, uint32_t height, int format, size_t size,
917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            int *id);
925a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin    virtual status_t createInputStream(
935a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            uint32_t width, uint32_t height, int format,
945a269fa72b419e7fe4bf6bf9b27eec8782b3a963Igor Murashkin            int *id);
952fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    virtual status_t createZslStream(
962fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            uint32_t width, uint32_t height,
972fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int depth,
982fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            /*out*/
992fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            int *id,
1002fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            sp<camera3::Camera3ZslStream>* zslStream);
1017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createReprocessStreamFromStream(int outputId, int *id);
102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getStreamInfo(int id,
1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamTransform(int id, int transform);
106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteStream(int id);
1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteReprocessStream(int id);
109f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createDefaultRequest(int templateId, CameraMetadata *request);
111f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
112f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to the idle state on success
1137fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilDrained();
114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setNotifyCallback(NotificationListener *listener);
11646910bdc57c35ac36bd4adcbb76f4f3a590e3f21Eino-Ville Talvala    virtual bool     willNotify3A();
1177fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitForNextFrame(nsecs_t timeout);
1187fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getNextFrame(CameraMetadata *frame);
119f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1207fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerAutofocus(uint32_t id);
1217fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerCancelAutofocus(uint32_t id);
1227fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerPrecaptureMetering(uint32_t id);
123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1247fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t pushReprocessBuffer(int reprocessStreamId,
1257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
1267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
127abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala    virtual status_t flush();
128abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
1297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  private:
1301e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpLockAttempts  = 10;
1311e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    static const size_t        kDumpSleepDuration = 100000; // 0.10 sec
13242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const size_t        kInFlightWarnLimit = 20;
13342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const nsecs_t       kShutdownTimeout   = 5000000000; // 5 sec
1344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct                     RequestTrigger;
135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
136f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex                      mLock;
137f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
138f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** Scope for mLock ****/
139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    const int                  mId;
141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_device_t          *mHal3Device;
142f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
143f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    CameraMetadata             mDeviceInfo;
144f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    vendor_tag_query_ops_t     mVendorTagOps;
145f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
146f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    enum {
147f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ERROR,
148f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_UNINITIALIZED,
149f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_IDLE,
150f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ACTIVE
151f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }                          mStatus;
152f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
153b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    // Tracking cause of fatal errors when in STATUS_ERROR
154b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    String8                    mErrorCause;
155b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Mapping of stream IDs to stream instances
1572fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> >
1582fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            StreamSet;
159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    StreamSet                  mOutputStreams;
161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<camera3::Camera3Stream> mInputStream;
162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    int                        mNextStreamId;
163ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    bool                       mNeedConfig;
164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Need to hold on to stream references until configure completes.
1662fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams;
167f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** End scope for mLock ****/
169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class CaptureRequest : public LightRefBase<CaptureRequest> {
171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala      public:
172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        CameraMetadata                      mSettings;
173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<camera3::Camera3Stream>          mInputStream;
1742fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        Vector<sp<camera3::Camera3OutputStreamInterface> >
1752fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                            mOutputStreams;
176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    };
177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    typedef List<sp<CaptureRequest> > RequestList;
178f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
1801e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Get the last request submitted to the hal by the request thread.
1811e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     *
1821e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Takes mLock.
1831e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     */
1841e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    virtual CameraMetadata getLatestRequest();
1851e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
1861e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    /**
187f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Lock-held version of waitUntilDrained. Will transition to IDLE on
188f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * success.
189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
190f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           waitUntilDrainedLocked();
191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
192f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
193f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Do common work for setting up a streaming or single capture request.
194f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * On success, will transition to ACTIVE if in IDLE.
195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request);
197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Build a CaptureRequest request from the CameraDeviceBase request
200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * settings.
201f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
202f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request);
2037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Take the currently-defined set of streams and configure the HAL to use
206f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * them. This is a long-running operation (may be several hundered ms).
207f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
208f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           configureStreamsLocked();
2097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
210b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    /**
211b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * Set device into an error state due to some fatal failure, and set an
212b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * error message to indicate why. Only the first call's message will be
213b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * used. The message is also sent to the log.
214b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     */
215b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorState(const char *fmt, ...);
216b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateV(const char *fmt, va_list args);
217b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLocked(const char *fmt, ...);
218b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLockedV(const char *fmt, va_list args);
219b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
2204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct RequestTrigger {
2214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata tag number, e.g. android.control.aePrecaptureTrigger
2224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t metadataTag;
2234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata value, e.g. 'START' or the trigger ID
2244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t entryValue;
2254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // The last part of the fully qualified path, e.g. afTrigger
2274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const char *getTagName() const {
2284d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_name(metadataTag) ?: "NULL";
2294d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
2304d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2314d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // e.g. TYPE_BYTE, TYPE_INT32, etc.
2324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int getTagType() const {
2334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_type(metadataTag);
2344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
2354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
2364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
2387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Thread for managing capture request submission to HAL device.
2397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class RequestThread : public Thread {
2417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      public:
2437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestThread(wp<Camera3Device> parent,
245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                camera3_device_t *hal3Device);
246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Call after stream (re)-configuration is completed.
249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     configurationComplete();
251f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
252f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
253f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Set or clear the list of repeating requests. Does not block
254f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * on either. Use waitUntilPaused to wait until request queue
255f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * has emptied out.
256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t setRepeatingRequests(const RequestList& requests);
258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t clearRepeatingRequests();
259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t queueRequest(sp<CaptureRequest> request);
261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
263abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         * Remove all queued and repeating requests, and pending triggers
264abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         */
265abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        status_t clear();
266abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
267abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        /**
2684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Queue a trigger to be dispatched with the next outgoing
2694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * process_capture_request. The settings for that request only
2704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * will be temporarily rewritten to add the trigger tag/value.
2714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Subsequent requests will not be rewritten (for this tag).
2724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
2734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t queueTrigger(RequestTrigger trigger[], size_t count);
2744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Pause/unpause the capture thread. Doesn't block, so use
277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * waitUntilPaused to wait until the thread is paused.
278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     setPaused(bool paused);
280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
282f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Wait until thread is paused, either due to setPaused(true)
283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * or due to lack of input requests. Returns TIMED_OUT in case
284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * the thread does not pause within the timeout.
285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t waitUntilPaused(nsecs_t timeout);
2877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2884d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
2894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Wait until thread processes the capture request with settings'
2904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * android.request.id == requestId.
2914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *
2924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Returns TIMED_OUT in case the thread does not process the request
2934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * within the timeout.
2944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
2954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout);
2964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2971e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        /**
2981e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * Get the latest request that was sent to the HAL
2991e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * with process_capture_request.
3001e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         */
3011e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata getLatestRequest() const;
3021e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
3037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      protected:
3047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        virtual bool threadLoop();
3067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      private:
30842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        static int         getId(const wp<Camera3Device> &device);
30942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
3104d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           queueTriggerLocked(RequestTrigger trigger);
3114d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Mix-in queued triggers into this request
3124d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            insertTriggers(const sp<CaptureRequest> &request);
3134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Purge the queued triggers from this request,
3144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        //  restoring the old field values for those tags.
3154d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           removeTriggers(const sp<CaptureRequest> &request);
3162f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
3172f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // HAL workaround: Make sure a trigger ID always exists if
3182f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // a trigger does
3192f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        status_t          addDummyTriggerIds(const sp<CaptureRequest> &request);
3204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        static const nsecs_t kRequestTimeout = 50e6; // 50 ms
322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Waits for a request, or returns NULL if times out.
324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> waitForNextRequest();
325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Return buffers, etc, for a request that couldn't be fully
327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // constructed. The buffers will be returned in the ERROR state
328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // to mark them as not having valid data.
329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // All arguments will be modified.
330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void cleanUpFailedRequest(camera3_capture_request_t &request,
331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                sp<CaptureRequest> &nextRequest,
332f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                Vector<camera3_stream_buffer_t> &outputBuffers);
333f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Pause handling
335f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               waitIfPaused();
33626fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        void               unpauseForNewRequests();
337f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
338b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        // Relay error to parent device object setErrorState
339b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        void               setErrorState(const char *fmt, ...);
340b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
341f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        wp<Camera3Device>  mParent;
342f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t  *mHal3Device;
343f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
34442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        const int          mId;
34542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
346f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mRequestLock;
347f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mRequestSignal;
348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRequestQueue;
349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRepeatingRequests;
350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mReconfigured;
352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused
354f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mPauseLock;
355f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mDoPause;
356f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mDoPauseSignal;
357f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mPaused;
358f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mPausedSignal;
3597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
360f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> mPrevRequest;
3614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mPrevTriggers;
3627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
36342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        uint32_t           mFrameNumber;
3644d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3651e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mutable Mutex      mLatestRequestMutex;
3664d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Condition          mLatestRequestSignal;
3674d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // android.request.id for latest process_capture_request
3684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mLatestRequestId;
3691e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata     mLatestRequest;
3704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
3724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex              mTriggerMutex;
3734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerMap;
3744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerRemovedMap;
3754d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerReplacedMap;
3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    };
377f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<RequestThread> mRequestThread;
3787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3797fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
38042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     * In-flight queue for tracking completion of capture requests.
38142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     */
38242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
38342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    struct InFlightRequest {
38442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by notify() SHUTTER call.
38542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        nsecs_t captureTimestamp;
38642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by process_capture_result call with valid metadata
38742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        bool    haveResultMetadata;
38842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Decremented by calls to process_capture_result with valid output
38942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // buffers
39042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        int     numBuffersLeft;
39142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
39242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest() :
39342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
39442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
39542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(0) {
39642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
39742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
39842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        explicit InFlightRequest(int numBuffers) :
39942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
40042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
40142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(numBuffers) {
40242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
40342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    };
40442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Map from frame number to the in-flight request state
40542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap;
40642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
40742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex                  mInFlightLock; // Protects mInFlightMap
40842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    InFlightMap            mInFlightMap;
40942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
41042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    status_t registerInFlight(int32_t frameNumber, int32_t numBuffers);
41142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
41242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    /**
4137d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     * Output result queue and current HAL device 3A state
4147d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     */
4157d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
4167d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Lock for output side of device
4177d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex                  mOutputLock;
4187d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
4197d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** Scope for mOutputLock ****/
4207d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
42142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextResultFrameNumber;
42242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextShutterFrameNumber;
4237d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    List<CameraMetadata>   mResultQueue;
4247d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Condition              mResultSignal;
4257d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener  *mListener;
4267d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
4277d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** End scope for mOutputLock ****/
4287d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
4297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**
4307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Callback functions from HAL device
4317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
4327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void processCaptureResult(const camera3_capture_result *result);
4337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void notify(const camera3_notify_msg *msg);
4357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
4377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Static callback forwarding methods from HAL to instance
4387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
4397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_process_capture_result_t sProcessCaptureResult;
4407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_notify_t sNotify;
4427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device
4447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
4467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif
448