Camera3Device.h revision 95dd5ba5bf83716f2eed5fe72366c4212464d710
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/**
5795dd5ba5bf83716f2eed5fe72366c4212464d710Zhijun He * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0 or higher.
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
163f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    enum Status {
164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ERROR,
165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_UNINITIALIZED,
166f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_UNCONFIGURED,
167f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        STATUS_CONFIGURED,
168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ACTIVE
169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }                          mStatus;
170f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Vector<Status>             mRecentStatusUpdates;
171f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    Condition                  mStatusChanged;
172f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
173b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    // Tracking cause of fatal errors when in STATUS_ERROR
174b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    String8                    mErrorCause;
175b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Mapping of stream IDs to stream instances
1772fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    typedef KeyedVector<int, sp<camera3::Camera3OutputStreamInterface> >
1782fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin            StreamSet;
179f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
180f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    StreamSet                  mOutputStreams;
181f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<camera3::Camera3Stream> mInputStream;
182f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    int                        mNextStreamId;
183ea26c7772f4721657db409068d4bed194ae49c94Eino-Ville Talvala    bool                       mNeedConfig;
184f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
185f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Whether to send state updates upstream
186f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    // Pause when doing transparent reconfiguration
187f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool                       mPauseStateNotify;
188f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
189f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Need to hold on to stream references until configure completes.
1902fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin    Vector<sp<camera3::Camera3StreamInterface> > mDeletedStreams;
191f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
192fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Whether quirk ANDROID_QUIRKS_USE_PARTIAL_RESULT is enabled
193fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool                       mUsePartialResultQuirk;
194fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
195f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** End scope for mLock ****/
196f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
197f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class CaptureRequest : public LightRefBase<CaptureRequest> {
198f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala      public:
199f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        CameraMetadata                      mSettings;
200f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<camera3::Camera3Stream>          mInputStream;
2012fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin        Vector<sp<camera3::Camera3OutputStreamInterface> >
2022fba584544e8687b526e3388bf7160b696da1dbaIgor Murashkin                                            mOutputStreams;
203f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    };
204f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    typedef List<sp<CaptureRequest> > RequestList;
205f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
20690e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t checkStatusOkToCaptureLocked();
20790e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
20890e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t convertMetadataListToRequestListLocked(
20990e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            const List<const CameraMetadata> &metadataList,
21090e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei            /*out*/RequestList *requestList);
21190e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
21290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei    status_t submitRequestsHelper(const List<const CameraMetadata> &requests, bool repeating);
21390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
2151e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Get the last request submitted to the hal by the request thread.
2161e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     *
2171e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     * Takes mLock.
2181e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin     */
219f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    virtual CameraMetadata getLatestRequestLocked();
220f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
221f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
222f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Pause processing and flush everything, but don't tell the clients.
223f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * This is for reconfiguring outputs transparently when according to the
224f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * CameraDeviceBase interface we shouldn't need to.
225f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
226f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
227f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalPauseAndWaitLocked();
2281e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
2291e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin    /**
230f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Resume work after internalPauseAndWaitLocked()
231f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Must be called with mLock and mInterfaceLock both held.
232f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
233f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t internalResumeLocked();
234f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
235f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
236f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Wait until status tracker tells us we've transitioned to the target state
237f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * set, which is either ACTIVE when active==true or IDLE (which is any
238f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * non-ACTIVE state) when active==false.
239f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
240f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Needs to be called with mLock and mInterfaceLock held.  This means there
241f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * can ever only be one waiter at most.
242f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
243f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * During the wait mLock is released.
244f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     *
245f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
246f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t waitUntilStateThenRelock(bool active, nsecs_t timeout);
247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
24969a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     * Implementation of waitUntilDrained. On success, will transition to IDLE state.
25069a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     *
25169a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     * Need to be called with mLock and mInterfaceLock held.
25269a374897392c8bd70f441b7284f6f578c651ec9Zhijun He     */
25369a374897392c8bd70f441b7284f6f578c651ec9Zhijun He    status_t waitUntilDrainedLocked();
25469a374897392c8bd70f441b7284f6f578c651ec9Zhijun He
25569a374897392c8bd70f441b7284f6f578c651ec9Zhijun He    /**
256f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Do common work for setting up a streaming or single capture request.
257f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * On success, will transition to ACTIVE if in IDLE.
258f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
259f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request);
260f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
261f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
262f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Build a CaptureRequest request from the CameraDeviceBase request
263f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * settings.
264f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
265f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request);
2667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
267f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
268f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Take the currently-defined set of streams and configure the HAL to use
269f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * them. This is a long-running operation (may be several hundered ms).
270f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
271f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           configureStreamsLocked();
2727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
273b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    /**
274b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * Set device into an error state due to some fatal failure, and set an
275b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * error message to indicate why. Only the first call's message will be
276b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * used. The message is also sent to the log.
277b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     */
278b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorState(const char *fmt, ...);
279b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateV(const char *fmt, va_list args);
280b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLocked(const char *fmt, ...);
281b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLockedV(const char *fmt, va_list args);
282b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
283f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
284f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Debugging trylock/spin method
285f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Try to acquire a lock a few times with sleeps between before giving up.
286f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
287f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    bool               tryLockSpinRightRound(Mutex& lock);
288f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
2894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct RequestTrigger {
2904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata tag number, e.g. android.control.aePrecaptureTrigger
2914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t metadataTag;
2924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata value, e.g. 'START' or the trigger ID
2934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t entryValue;
2944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // The last part of the fully qualified path, e.g. afTrigger
2964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const char *getTagName() const {
2974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_name(metadataTag) ?: "NULL";
2984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
2994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // e.g. TYPE_BYTE, TYPE_INT32, etc.
3014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int getTagType() const {
3024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_type(metadataTag);
3034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
3044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
3054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
3077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Thread for managing capture request submission to HAL device.
3087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class RequestThread : public Thread {
3107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      public:
3127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestThread(wp<Camera3Device> parent,
314f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                sp<camera3::StatusTracker> statusTracker,
315f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                camera3_device_t *hal3Device);
316f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
317f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
318f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Call after stream (re)-configuration is completed.
319f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
320f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     configurationComplete();
321f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
322f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
323f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Set or clear the list of repeating requests. Does not block
324f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * on either. Use waitUntilPaused to wait until request queue
325f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * has emptied out.
326f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
327f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t setRepeatingRequests(const RequestList& requests);
328f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t clearRepeatingRequests();
329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
330f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t queueRequest(sp<CaptureRequest> request);
331f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
33290e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei        status_t queueRequestList(List<sp<CaptureRequest> > &requests);
33390e59c98c343e941b1a75307ffa4b4b5f1eb50d6Jianing Wei
334f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
335abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         * Remove all queued and repeating requests, and pending triggers
336abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala         */
337abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        status_t clear();
338abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala
339abaa51d3ca31f0eda99e1d271e6dc64c877dbf58Eino-Ville Talvala        /**
3404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Queue a trigger to be dispatched with the next outgoing
3414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * process_capture_request. The settings for that request only
3424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * will be temporarily rewritten to add the trigger tag/value.
3434d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Subsequent requests will not be rewritten (for this tag).
3444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
3454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t queueTrigger(RequestTrigger trigger[], size_t count);
3464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
348f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Pause/unpause the capture thread. Doesn't block, so use
349f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * waitUntilPaused to wait until the thread is paused.
350f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
351f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     setPaused(bool paused);
352f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
353f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
3544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Wait until thread processes the capture request with settings'
3554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * android.request.id == requestId.
3564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *
3574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Returns TIMED_OUT in case the thread does not process the request
3584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * within the timeout.
3594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
3604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout);
3614d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3621e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        /**
363f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * Shut down the thread. Shutdown is asynchronous, so thread may
364f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         * still be running once this method returns.
365f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala         */
366f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        virtual void requestExit();
367f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
368f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        /**
3691e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * Get the latest request that was sent to the HAL
3701e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         * with process_capture_request.
3711e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin         */
3721e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata getLatestRequest() const;
3731e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin
3747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      protected:
3757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3767fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        virtual bool threadLoop();
3777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      private:
37942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        static int         getId(const wp<Camera3Device> &device);
38042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
3814d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           queueTriggerLocked(RequestTrigger trigger);
3824d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Mix-in queued triggers into this request
3834d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            insertTriggers(const sp<CaptureRequest> &request);
3844d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Purge the queued triggers from this request,
3854d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        //  restoring the old field values for those tags.
3864d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           removeTriggers(const sp<CaptureRequest> &request);
3872f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala
3882f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // HAL workaround: Make sure a trigger ID always exists if
3892f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        // a trigger does
3902f876f9ee63396e4e0117f85c5b3132cac7e2c9dEino-Ville Talvala        status_t          addDummyTriggerIds(const sp<CaptureRequest> &request);
3914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
392f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        static const nsecs_t kRequestTimeout = 50e6; // 50 ms
393f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
394f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Waits for a request, or returns NULL if times out.
395f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> waitForNextRequest();
396f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
397f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Return buffers, etc, for a request that couldn't be fully
398f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // constructed. The buffers will be returned in the ERROR state
399f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // to mark them as not having valid data.
400f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // All arguments will be modified.
401f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void cleanUpFailedRequest(camera3_capture_request_t &request,
402f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                sp<CaptureRequest> &nextRequest,
403f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                Vector<camera3_stream_buffer_t> &outputBuffers);
404f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
405f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Pause handling
406f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               waitIfPaused();
40726fe6c7c56477ef227205c68f17df07ca3501d65Eino-Ville Talvala        void               unpauseForNewRequests();
408f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
409b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        // Relay error to parent device object setErrorState
410b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        void               setErrorState(const char *fmt, ...);
411b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
412f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        wp<Camera3Device>  mParent;
413f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        wp<camera3::StatusTracker>  mStatusTracker;
414f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t  *mHal3Device;
415f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
416f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        const int          mId;       // The camera ID
417f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int                mStatusId; // The RequestThread's component ID for
418f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                                      // status tracking
41942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
420f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mRequestLock;
421f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mRequestSignal;
422f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRequestQueue;
423f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRepeatingRequests;
424f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
425f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mReconfigured;
426f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
427f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused
428f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mPauseLock;
429f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mDoPause;
430f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mDoPauseSignal;
431f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mPaused;
432f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mPausedSignal;
4337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
434f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> mPrevRequest;
4354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mPrevTriggers;
4367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
43742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        uint32_t           mFrameNumber;
4384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4391e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        mutable Mutex      mLatestRequestMutex;
4404d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Condition          mLatestRequestSignal;
4414d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // android.request.id for latest process_capture_request
4424d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mLatestRequestId;
4431e479c0f4cb3e2174dde0b02e5656fb658f73495Igor Murashkin        CameraMetadata     mLatestRequest;
4444d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
4454d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
4464d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex              mTriggerMutex;
4474d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerMap;
4484d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerRemovedMap;
4494d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerReplacedMap;
4507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    };
451f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<RequestThread> mRequestThread;
4527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
45442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     * In-flight queue for tracking completion of capture requests.
45542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     */
45642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
45742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    struct InFlightRequest {
458f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // android.request.id for the request
459f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        int     requestId;
46042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by notify() SHUTTER call.
46142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        nsecs_t captureTimestamp;
4621d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He        int     requestStatus;
46342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by process_capture_result call with valid metadata
46442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        bool    haveResultMetadata;
46542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Decremented by calls to process_capture_result with valid output
46642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // buffers
46742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        int     numBuffersLeft;
46842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
469fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        // Fields used by the partial result quirk only
470fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        struct PartialResultQuirkInFlight {
471fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            // Set by process_capture_result once 3A has been sent to clients
472fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            bool    haveSent3A;
473fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            // Result metadata collected so far, when partial results are in use
474fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            CameraMetadata collectedResult;
475fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
476fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            PartialResultQuirkInFlight():
477fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                    haveSent3A(false) {
478fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            }
479fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala        } partialResultQuirk;
480fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
481f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        // Default constructor needed by KeyedVector
48242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest() :
483f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                requestId(0),
48442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
4851d1f846c0dbaa36d0944e7b1e54cc07863e00a92Zhijun He                requestStatus(OK),
48642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
48742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(0) {
48842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
48942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
490f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala        InFlightRequest(int id, int numBuffers) :
491f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala                requestId(id),
49242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
493cc27e117ed01c9a2b4def5a9c7a3103af83ee47eZhijun He                requestStatus(OK),
49442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
49542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(numBuffers) {
49642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
49742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    };
49842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Map from frame number to the in-flight request state
49942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap;
50042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
50142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex                  mInFlightLock; // Protects mInFlightMap
50242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    InFlightMap            mInFlightMap;
50342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
504f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    status_t registerInFlight(int32_t frameNumber, int32_t requestId,
505f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala            int32_t numBuffers);
506f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala
507f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    /**
508fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * For the partial result quirk, check if all 3A state fields are available
509fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * and if so, queue up 3A-only result to the client. Returns true if 3A
510fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     * is sent.
511fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala     */
512184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala    bool processPartial3AQuirk(int32_t frameNumber, int32_t requestId,
513184dfe4ea5e2ba33951bed2b1366007aee0ce3daEino-Ville Talvala            const CameraMetadata& partial);
514fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
515fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    // Helpers for reading and writing 3A metadata into to/from partial results
516fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    template<typename T>
517fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool get3AResult(const CameraMetadata& result, int32_t tag,
518fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            T* value, int32_t frameNumber);
519fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
520fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    template<typename T>
521fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    bool insert3AResult(CameraMetadata &result, int32_t tag, const T* value,
522fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala            int32_t frameNumber);
523fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    /**
524f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     * Tracking for idle detection
525f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala     */
526f1e98d857ec377f2c9b916073d40732e6ebb7cedEino-Ville Talvala    sp<camera3::StatusTracker> mStatusTracker;
52742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
52842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    /**
5297d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     * Output result queue and current HAL device 3A state
5307d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     */
5317d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5327d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Lock for output side of device
5337d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex                  mOutputLock;
5347d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5357d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** Scope for mOutputLock ****/
5367d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
53742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextResultFrameNumber;
53842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextShutterFrameNumber;
5397d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    List<CameraMetadata>   mResultQueue;
5407d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Condition              mResultSignal;
5417d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener  *mListener;
5427d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5437d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** End scope for mOutputLock ****/
5447d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
5457d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**
5467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Callback functions from HAL device
5477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
5487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void processCaptureResult(const camera3_capture_result *result);
5497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void notify(const camera3_notify_msg *msg);
5517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
5537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Static callback forwarding methods from HAL to instance
5547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
5557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_process_capture_result_t sProcessCaptureResult;
5567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_notify_t sNotify;
5587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device
5607fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
5627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
5637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif
564