Camera3Device.h revision 42368d9308db27a47c9ac706f9b040fa269257a9
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>
257fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
267fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "CameraDeviceBase.h"
27f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#include "camera3/Camera3Stream.h"
28f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala#include "camera3/Camera3OutputStream.h"
297fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#include "hardware/camera3.h"
317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
327fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
337fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * Function pointer types with C calling convention to
347fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * use for HAL callback functions.
357fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
367fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaextern "C" {
377fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    typedef void (callbacks_process_capture_result_t)(
387fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const struct camera3_callback_ops *,
397fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_capture_result_t *);
407fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
417fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    typedef void (callbacks_notify_t)(
427fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const struct camera3_callback_ops *,
437fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        const camera3_notify_msg_t *);
447fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}
457fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
467fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalanamespace android {
477fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
487fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala/**
497fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala * CameraDevice for HAL devices with version CAMERA_DEVICE_API_VERSION_3_0
507fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala */
517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvalaclass Camera3Device :
527fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            public CameraDeviceBase,
537fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            private camera3_callback_ops {
547fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  public:
557fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    Camera3Device(int id);
567fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
577fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual ~Camera3Device();
587fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
597fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
60f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * CameraDeviceBase interface
617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
62f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
6371381051e2d048b2705c447b3d59db6e972493eeIgor Murashkin    virtual int      getId() const;
64f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
65f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to idle state on success.
667fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t initialize(camera_module_t *module);
677fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t disconnect();
687fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t dump(int fd, const Vector<String16> &args);
697fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual const CameraMetadata& info() const;
70f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
71f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Capture and setStreamingRequest will configure streams if currently in
72f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // idle state
737fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t capture(CameraMetadata &request);
747fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamingRequest(const CameraMetadata &request);
757fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t clearStreamingRequest();
76f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
777fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilRequestReceived(int32_t requestId, nsecs_t timeout);
78f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
79f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Actual stream creation/deletion is delayed until first request is submitted
80f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // If adding streams while actively capturing, will pause device before adding
81f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // stream, reconfiguring device, and unpausing.
827fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createStream(sp<ANativeWindow> consumer,
837fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            uint32_t width, uint32_t height, int format, size_t size,
847fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            int *id);
857fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createReprocessStreamFromStream(int outputId, int *id);
86f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
877fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getStreamInfo(int id,
887fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            uint32_t *width, uint32_t *height, uint32_t *format);
897fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setStreamTransform(int id, int transform);
90f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
917fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteStream(int id);
927fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t deleteReprocessStream(int id);
93f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t createDefaultRequest(int templateId, CameraMetadata *request);
95f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
96f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Transitions to the idle state on success
977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitUntilDrained();
98f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t setNotifyCallback(NotificationListener *listener);
1007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t waitForNextFrame(nsecs_t timeout);
1017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t getNextFrame(CameraMetadata *frame);
102f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerAutofocus(uint32_t id);
1047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerCancelAutofocus(uint32_t id);
1057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t triggerPrecaptureMetering(uint32_t id);
106f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
1077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    virtual status_t pushReprocessBuffer(int reprocessStreamId,
1087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala            buffer_handle_t *buffer, wp<BufferReleasedListener> listener);
1097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
1107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala  private:
11142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const size_t        kInFlightWarnLimit = 20;
11242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    static const nsecs_t       kShutdownTimeout   = 5000000000; // 5 sec
1134d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct                     RequestTrigger;
114f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
115f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Mutex                      mLock;
116f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
117f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** Scope for mLock ****/
118f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
119f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    const int                  mId;
120f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    camera3_device_t          *mHal3Device;
121f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
122f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    CameraMetadata             mDeviceInfo;
123f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    vendor_tag_query_ops_t     mVendorTagOps;
124f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
125f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    enum {
126f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ERROR,
127f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_UNINITIALIZED,
128f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_IDLE,
129f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        STATUS_ACTIVE
130f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    }                          mStatus;
131f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
132b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    // Tracking cause of fatal errors when in STATUS_ERROR
133b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    String8                    mErrorCause;
134b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
135f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Mapping of stream IDs to stream instances
136f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    typedef KeyedVector<int, sp<camera3::Camera3OutputStream> > StreamSet;
137f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
138f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    StreamSet                  mOutputStreams;
139f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<camera3::Camera3Stream> mInputStream;
140f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    int                        mNextStreamId;
141f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
142f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    // Need to hold on to stream references until configure completes.
143f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    Vector<sp<camera3::Camera3Stream> > mDeletedStreams;
144f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
145f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**** End scope for mLock ****/
146f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
147f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class CaptureRequest : public LightRefBase<CaptureRequest> {
148f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala      public:
149f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        CameraMetadata                      mSettings;
150f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<camera3::Camera3Stream>          mInputStream;
151f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Vector<sp<camera3::Camera3Stream> > mOutputStreams;
152f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    };
153f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    typedef List<sp<CaptureRequest> > RequestList;
154f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
155f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
156f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Lock-held version of waitUntilDrained. Will transition to IDLE on
157f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * success.
158f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
159f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           waitUntilDrainedLocked();
160f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
161f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
162f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Do common work for setting up a streaming or single capture request.
163f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * On success, will transition to ACTIVE if in IDLE.
164f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
165f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> setUpRequestLocked(const CameraMetadata &request);
166f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
167f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
168f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Build a CaptureRequest request from the CameraDeviceBase request
169f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * settings.
170f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
171f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<CaptureRequest> createCaptureRequest(const CameraMetadata &request);
1727fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
173f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    /**
174f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * Take the currently-defined set of streams and configure the HAL to use
175f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     * them. This is a long-running operation (may be several hundered ms).
176f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala     */
177f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    status_t           configureStreamsLocked();
1787fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
179b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    /**
180b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * Set device into an error state due to some fatal failure, and set an
181b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * error message to indicate why. Only the first call's message will be
182b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     * used. The message is also sent to the log.
183b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala     */
184b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorState(const char *fmt, ...);
185b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateV(const char *fmt, va_list args);
186b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLocked(const char *fmt, ...);
187b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala    void               setErrorStateLockedV(const char *fmt, va_list args);
188b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
1894d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    struct RequestTrigger {
1904d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata tag number, e.g. android.control.aePrecaptureTrigger
1914d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        uint32_t metadataTag;
1924d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Metadata value, e.g. 'START' or the trigger ID
1934d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t entryValue;
1944d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
1954d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // The last part of the fully qualified path, e.g. afTrigger
1964d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        const char *getTagName() const {
1974d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_name(metadataTag) ?: "NULL";
1984d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
1994d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2004d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // e.g. TYPE_BYTE, TYPE_INT32, etc.
2014d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int getTagType() const {
2024d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin            return get_camera_metadata_tag_type(metadataTag);
2034d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        }
2044d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin    };
2054d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
2077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Thread for managing capture request submission to HAL device.
2087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
209f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    class RequestThread : public Thread {
2107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      public:
2127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
213f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestThread(wp<Camera3Device> parent,
214f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                camera3_device_t *hal3Device);
215f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
216f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
217f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Call after stream (re)-configuration is completed.
218f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
219f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     configurationComplete();
220f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
221f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
222f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Set or clear the list of repeating requests. Does not block
223f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * on either. Use waitUntilPaused to wait until request queue
224f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * has emptied out.
225f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
226f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t setRepeatingRequests(const RequestList& requests);
227f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t clearRepeatingRequests();
228f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
229f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t queueRequest(sp<CaptureRequest> request);
230f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
231f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
2324d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Queue a trigger to be dispatched with the next outgoing
2334d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * process_capture_request. The settings for that request only
2344d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * will be temporarily rewritten to add the trigger tag/value.
2354d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Subsequent requests will not be rewritten (for this tag).
2364d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
2374d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t queueTrigger(RequestTrigger trigger[], size_t count);
2384d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2394d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
240f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Pause/unpause the capture thread. Doesn't block, so use
241f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * waitUntilPaused to wait until the thread is paused.
242f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
243f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void     setPaused(bool paused);
244f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
245f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        /**
246f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * Wait until thread is paused, either due to setPaused(true)
247f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * or due to lack of input requests. Returns TIMED_OUT in case
248f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         * the thread does not pause within the timeout.
249f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala         */
250f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        status_t waitUntilPaused(nsecs_t timeout);
2517fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2524d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        /**
2534d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Wait until thread processes the capture request with settings'
2544d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * android.request.id == requestId.
2554d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         *
2564d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * Returns TIMED_OUT in case the thread does not process the request
2574d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         * within the timeout.
2584d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin         */
2594d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t waitUntilRequestProcessed(int32_t requestId, nsecs_t timeout);
2604d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
2617fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      protected:
2627fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2637fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala        virtual bool threadLoop();
2647fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
2657fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala      private:
26642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        static int         getId(const wp<Camera3Device> &device);
26742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
2684d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           queueTriggerLocked(RequestTrigger trigger);
2694d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Mix-in queued triggers into this request
2704d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            insertTriggers(const sp<CaptureRequest> &request);
2714d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // Purge the queued triggers from this request,
2724d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        //  restoring the old field values for those tags.
2734d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        status_t           removeTriggers(const sp<CaptureRequest> &request);
2744d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
275f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        static const nsecs_t kRequestTimeout = 50e6; // 50 ms
276f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
277f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Waits for a request, or returns NULL if times out.
278f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> waitForNextRequest();
279f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
280f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Return buffers, etc, for a request that couldn't be fully
281f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // constructed. The buffers will be returned in the ERROR state
282f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // to mark them as not having valid data.
283f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // All arguments will be modified.
284f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        void cleanUpFailedRequest(camera3_capture_request_t &request,
285f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                sp<CaptureRequest> &nextRequest,
286f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala                Vector<camera3_stream_buffer_t> &outputBuffers);
287f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
288f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Pause handling
289f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               waitIfPaused();
290f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
291b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        // Relay error to parent device object setErrorState
292b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala        void               setErrorState(const char *fmt, ...);
293b2058d19297e508133a66b033d29380924b5d267Eino-Ville Talvala
294f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        wp<Camera3Device>  mParent;
295f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        camera3_device_t  *mHal3Device;
296f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
29742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        const int          mId;
29842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
299f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mRequestLock;
300f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mRequestSignal;
301f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRequestQueue;
302f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        RequestList        mRepeatingRequests;
303f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
304f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mReconfigured;
305f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala
306f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        // Used by waitIfPaused, waitForNextRequest, and waitUntilPaused
307f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Mutex              mPauseLock;
308f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mDoPause;
309f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mDoPauseSignal;
310f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        bool               mPaused;
311f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        Condition          mPausedSignal;
3127fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
313f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala        sp<CaptureRequest> mPrevRequest;
3144d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mPrevTriggers;
3157fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
31642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        uint32_t           mFrameNumber;
3174d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3184d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex              mLatestRequestMutex;
3194d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Condition          mLatestRequestSignal;
3204d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        // android.request.id for latest process_capture_request
3214d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        int32_t            mLatestRequestId;
3224d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin
3234d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        typedef KeyedVector<uint32_t/*tag*/, RequestTrigger> TriggerMap;
3244d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        Mutex              mTriggerMutex;
3254d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerMap;
3264d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerRemovedMap;
3274d2f2e8414df33337d4f09e5235719dfcc705674Igor Murashkin        TriggerMap         mTriggerReplacedMap;
3287fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    };
329f76e027c43f531fc6f9287838b5c332236a4338aEino-Ville Talvala    sp<RequestThread> mRequestThread;
3307fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3317fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
33242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     * In-flight queue for tracking completion of capture requests.
33342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala     */
33442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
33542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    struct InFlightRequest {
33642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by notify() SHUTTER call.
33742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        nsecs_t captureTimestamp;
33842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Set by process_capture_result call with valid metadata
33942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        bool    haveResultMetadata;
34042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // Decremented by calls to process_capture_result with valid output
34142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        // buffers
34242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        int     numBuffersLeft;
34342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
34442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        InFlightRequest() :
34542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
34642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
34742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(0) {
34842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
34942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
35042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        explicit InFlightRequest(int numBuffers) :
35142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                captureTimestamp(0),
35242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                haveResultMetadata(false),
35342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala                numBuffersLeft(numBuffers) {
35442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala        }
35542368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    };
35642368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    // Map from frame number to the in-flight request state
35742368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    typedef KeyedVector<uint32_t, InFlightRequest> InFlightMap;
35842368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
35942368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    Mutex                  mInFlightLock; // Protects mInFlightMap
36042368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    InFlightMap            mInFlightMap;
36142368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
36242368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    status_t registerInFlight(int32_t frameNumber, int32_t numBuffers);
36342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala
36442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    /**
3657d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     * Output result queue and current HAL device 3A state
3667d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala     */
3677d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
3687d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    // Lock for output side of device
3697d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Mutex                  mOutputLock;
3707d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
3717d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** Scope for mOutputLock ****/
3727d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
37342368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextResultFrameNumber;
37442368d9308db27a47c9ac706f9b040fa269257a9Eino-Ville Talvala    uint32_t               mNextShutterFrameNumber;
3757d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    List<CameraMetadata>   mResultQueue;
3767d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    Condition              mResultSignal;
3777d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    NotificationListener  *mListener;
3787d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
3797d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    struct AlgState {
3807d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        camera_metadata_enum_android_control_ae_state  aeState;
3817d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        camera_metadata_enum_android_control_af_state  afState;
3827d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        camera_metadata_enum_android_control_awb_state awbState;
3837d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
3847d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        AlgState() :
3857d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                aeState(ANDROID_CONTROL_AE_STATE_INACTIVE),
3867d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                afState(ANDROID_CONTROL_AF_STATE_INACTIVE),
3877d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala                awbState(ANDROID_CONTROL_AWB_STATE_INACTIVE) {
3887d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala        }
3897d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    } m3AState;
3907d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
3917d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**** End scope for mOutputLock ****/
3927d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala
3937d346fa448551703f98e8892ae7f4eb56675b92aEino-Ville Talvala    /**
3947fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Callback functions from HAL device
3957fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
3967fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void processCaptureResult(const camera3_capture_result *result);
3977fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
3987fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    void notify(const camera3_notify_msg *msg);
3997fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4007fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    /**
4017fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     * Static callback forwarding methods from HAL to instance
4027fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala     */
4037fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_process_capture_result_t sProcessCaptureResult;
4047fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4057fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala    static callbacks_notify_t sNotify;
4067fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4077fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // class Camera3Device
4087fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4097fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala}; // namespace android
4107fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala
4117fa43f376ebd63fda24d85c9ebf97e0ddf534083Eino-Ville Talvala#endif
412