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