ACameraDevice.h revision ead9146f844ee194a4f4244ba8ae1a3aece12b63
10dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/*
20dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Copyright (C) 2015 The Android Open Source Project
30dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *
40dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License");
50dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * you may not use this file except in compliance with the License.
60dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * You may obtain a copy of the License at
70dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *
80dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *      http://www.apache.org/licenses/LICENSE-2.0
90dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh *
100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Unless required by applicable law or agreed to in writing, software
110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS,
120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * See the License for the specific language governing permissions and
140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * limitations under the License.
150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */
160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#ifndef _ACAMERA_DEVICE_H
170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#define _ACAMERA_DEVICE_H
180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <memory>
20ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include <map>
21ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include <set>
220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <atomic>
230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/StrongPointer.h>
240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/Mutex.h>
250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/String8.h>
26ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include <utils/List.h>
27ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include <utils/Vector.h>
280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/ALooper.h>
300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/AHandler.h>
310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <media/stagefright/foundation/AMessage.h>
32ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include <camera/CaptureResult.h>
330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <camera/camera2/ICameraDeviceCallbacks.h>
340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <camera/camera2/ICameraDeviceUser.h>
35ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include <camera/camera2/OutputConfiguration.h>
36ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include <camera/camera2/CaptureRequest.h>
370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <NdkCameraDevice.h>
390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include "ACameraMetadata.h"
400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehusing namespace android;
420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehnamespace android {
440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
45ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh// Wrap ACameraCaptureFailure so it can be ref-counter
46ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehstruct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {};
47ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
48ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehclass CameraDevice final : public RefBase {
490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh  public:
500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                  std::unique_ptr<ACameraMetadata> chars,
520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                  ACameraDevice* wrapper);
530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ~CameraDevice();
540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    inline const char* getId() const { return mCameraId.string(); }
560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t createCaptureRequest(
580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ACameraDevice_request_template templateId,
590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ACaptureRequest** request) const;
600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
61ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    camera_status_t createCaptureSession(
62ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            const ACaptureSessionOutputContainer*       outputs,
63ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            const ACameraCaptureSession_stateCallbacks* callbacks,
64ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            /*out*/ACameraCaptureSession** session);
65ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Callbacks from camera service
670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    class ServiceCallback : public BnCameraDeviceCallbacks {
680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      public:
690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        ServiceCallback(CameraDevice* device) : mDevice(device) {}
700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        void onDeviceError(CameraErrorCode errorCode,
710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                           const CaptureResultExtras& resultExtras) override;
720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        void onDeviceIdle() override;
730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        void onCaptureStarted(const CaptureResultExtras& resultExtras,
740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                              int64_t timestamp) override;
750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        void onResultReceived(const CameraMetadata& metadata,
760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                              const CaptureResultExtras& resultExtras) override;
770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        void onPrepared(int streamId) override;
780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      private:
790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const wp<CameraDevice> mDevice;
800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    inline sp<ICameraDeviceCallbacks> getServiceCallback() { return mServiceCallback; };
820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Camera device is only functional after remote being set
840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    void setRemoteDevice(sp<ICameraDeviceUser> remote);
850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
86ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    inline ACameraDevice* getWrapper() const { return mWrapper; };
87ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh  private:
89ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    friend ACameraCaptureSession;
900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t checkCameraClosedOrErrorLocked() const;
910dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
92ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // device goes into fatal error state after this
93ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    void setCameraDeviceErrorLocked(camera_status_t error);
94ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
95ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    void disconnectLocked(); // disconnect from camera service
96ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
97ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    camera_status_t stopRepeatingLocked();
98ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
99ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    camera_status_t waitUntilIdleLocked();
100ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
101ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
102ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    camera_status_t captureLocked(sp<ACameraCaptureSession> session,
103ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
104ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            int numRequests, ACaptureRequest** requests,
105ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            /*optional*/int* captureSequenceId);
106ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
107ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session,
108ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
109ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            int numRequests, ACaptureRequest** requests,
110ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            /*optional*/int* captureSequenceId);
111ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
112ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    camera_status_t submitRequestsLocked(
113ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            sp<ACameraCaptureSession> session,
114ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
115ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            int numRequests, ACaptureRequest** requests,
116ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            /*out*/int* captureSequenceId,
117ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            bool isRepeating);
118ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
119ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static camera_status_t allocateCaptureRequest(
120ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            const ACaptureRequest* request, sp<CaptureRequest>& outReq);
121ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
122ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req);
123ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static void freeACaptureRequest(ACaptureRequest*);
124ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
125ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // only For session to hold device lock
126ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // Always grab device lock before grabbing session lock
127ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    void lockDeviceForSessionOps() const { mDeviceLock.lock(); };
128ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    void unlockDevice() const { mDeviceLock.unlock(); };
129ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
130ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // For capture session to notify its end of life
131ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);
132ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
133ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs);
134ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
135ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static camera_status_t getIGBPfromSessionOutput(
136ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            const ACaptureSessionOutput& config, sp<IGraphicBufferProducer>& out);
137ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
138ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static camera_status_t getSurfaceFromANativeWindow(
139ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            ANativeWindow* anw, sp<Surface>& out);
1400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    mutable Mutex mDeviceLock;
1420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    const String8 mCameraId;                          // Camera ID
1430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
1440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    const std::unique_ptr<ACameraMetadata> mChars;    // Camera characteristics
1450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    const sp<ServiceCallback> mServiceCallback;
1460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ACameraDevice* mWrapper;
1470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
148ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // stream id -> OutputConfiguration map
149ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    std::map<int, OutputConfiguration> mConfiguredOutputs;
150ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
1510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // TODO: maybe a bool will suffice for synchronous implementation?
1520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    std::atomic_bool mClosing;
1530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    inline bool isClosed() { return mClosing; }
1540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    bool mInError;
1560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t mError;
1570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    void onCaptureErrorLocked(
1580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ICameraDeviceCallbacks::CameraErrorCode errorCode,
1590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            const CaptureResultExtras& resultExtras);
1600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    bool mIdle;
162ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // This will avoid a busy session being deleted before it's back to idle state
163ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    sp<ACameraCaptureSession> mBusySession;
1640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<ICameraDeviceUser> mRemote;
1660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Looper thread to handle callback to app
1680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<ALooper> mCbLooper;
1690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // definition of handler and message
1700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    enum {
171ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        // Device state callbacks
172ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        kWhatOnDisconnected, // onDisconnected
173ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        kWhatOnError,        // onError
174ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        // Session state callbacks
175ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        kWhatSessionStateCb, // onReady, onActive
176ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        // Capture callbacks
177ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        kWhatCaptureStart,   // onCaptureStarted
178ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        kWhatCaptureResult,  // onCaptureProgressed, onCaptureCompleted
179ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        kWhatCaptureFail,    // onCaptureFailed
180ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        kWhatCaptureSeqEnd,  // onCaptureSequenceCompleted
181ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        kWhatCaptureSeqAbort // onCaptureSequenceAborted
1820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
1830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static const char* kContextKey;
1840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static const char* kDeviceKey;
1850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    static const char* kErrorCodeKey;
186ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const char* kCallbackFpKey;
187ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const char* kSessionSpKey;
188ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const char* kCaptureRequestKey;
189ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const char* kTimeStampKey;
190ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const char* kCaptureResultKey;
191ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const char* kCaptureFailureKey;
192ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const char* kSequenceIdKey;
193ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const char* kFrameNumberKey;
1940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    class CallbackHandler : public AHandler {
1950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh      public:
1960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        CallbackHandler() {}
1970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        void onMessageReceived(const sp<AMessage> &msg) override;
1980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
1990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<CallbackHandler> mHandler;
2000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
201ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    /***********************************
202ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh     * Capture session related members *
203ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh     ***********************************/
204ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // The current active session
205ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    ACameraCaptureSession* mCurrentSession = nullptr;
2060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
207ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    int mNextSessionId = 0;
2080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // TODO: might need another looper/handler to handle callbacks from service
2090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
210ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const int REQUEST_ID_NONE = -1;
211ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    int mRepeatingSequenceId = REQUEST_ID_NONE;
212ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
213ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // sequence id -> last frame number map
214ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    std::map<int, int64_t> mSequenceLastFrameNumberMap;
215ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
216ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    struct CallbackHolder {
217ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        CallbackHolder(sp<ACameraCaptureSession>          session,
218ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                       const Vector<sp<CaptureRequest> >& requests,
219ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                       bool                               isRepeating,
220ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                       ACameraCaptureSession_captureCallbacks* cbs);
221ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
222ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        static ACameraCaptureSession_captureCallbacks fillCb(
223ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                ACameraCaptureSession_captureCallbacks* cbs) {
224ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            if (cbs != nullptr) {
225ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                return *cbs;
226ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            }
227ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            return { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
228ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        }
229ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
230ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        sp<ACameraCaptureSession>   mSession;
231ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        Vector<sp<CaptureRequest> > mRequests;
232ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        const bool                  mIsRepeating;
233ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ACameraCaptureSession_captureCallbacks mCallbacks;
234ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    };
235ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // sequence id -> callbacks map
236ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    std::map<int, CallbackHolder> mSequenceCallbackMap;
237ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
238ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    static const int64_t NO_FRAMES_CAPTURED = -1;
239ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    class FrameNumberTracker {
240ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh      public:
241ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        // TODO: Called in onResultReceived and onCaptureErrorLocked
242ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        void updateTracker(int64_t frameNumber, bool isError);
243ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; }
244ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh      private:
245ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        void update();
246ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        void updateCompletedFrameNumber(int64_t frameNumber);
247ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
248ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED;
249ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        List<int64_t> mSkippedFrameNumbers;
250ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        std::set<int64_t> mFutureErrorSet;
251ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    };
252ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    FrameNumberTracker mFrameNumberTracker;
253ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
254ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber);
255ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    void checkAndFireSequenceCompleteLocked();
256ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
257ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    // Misc variables
258ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    int32_t mShadingMapSize[2];   // const after constructor
259ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    int32_t mPartialResultCount;  // const after constructor
2600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh};
2620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} // namespace android;
2640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/**
2660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * ACameraDevice opaque struct definition
2670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Leave outside of android namespace because it's NDK struct
2680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */
2690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehstruct ACameraDevice {
2700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
2710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh                  std::unique_ptr<ACameraMetadata> chars) :
2720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            mDevice(new CameraDevice(id, cb, std::move(chars), this)) {}
2730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ~ACameraDevice() {};
2750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
276ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    /*******************
277ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh     * NDK public APIs *
278ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh     *******************/
2790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    inline const char* getId() const { return mDevice->getId(); }
2800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    camera_status_t createCaptureRequest(
2820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ACameraDevice_request_template templateId,
2830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh            ACaptureRequest** request) const {
2840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return mDevice->createCaptureRequest(templateId, request);
2850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
2860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
287ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    camera_status_t createCaptureSession(
288ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            const ACaptureSessionOutputContainer*       outputs,
289ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            const ACameraCaptureSession_stateCallbacks* callbacks,
290ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh            /*out*/ACameraCaptureSession** session) {
291ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        return mDevice->createCaptureSession(outputs, callbacks, session);
292ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    }
293ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh
294ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    /***********************
295ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh     * Device interal APIs *
296ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh     ***********************/
2970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    inline sp<ICameraDeviceCallbacks> getServiceCallback() {
2980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        return mDevice->getServiceCallback();
2990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    };
3000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
3010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    // Camera device is only functional after remote being set
3020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    inline void setRemoteDevice(sp<ICameraDeviceUser> remote) {
3030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        mDevice->setRemoteDevice(remote);
3040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    }
3050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
3060dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh  private:
3070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    sp<CameraDevice> mDevice;
3080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh};
3090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
3100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#endif // _ACAMERA_DEVICE_H
311