• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #ifndef _ACAMERA_DEVICE_H
17 #define _ACAMERA_DEVICE_H
18 
19 #include <memory>
20 #include <map>
21 #include <set>
22 #include <atomic>
23 #include <utility>
24 #include <utils/StrongPointer.h>
25 #include <utils/Mutex.h>
26 #include <utils/String8.h>
27 #include <utils/List.h>
28 #include <utils/Vector.h>
29 
30 #include <android/hardware/camera2/BnCameraDeviceCallbacks.h>
31 #include <android/hardware/camera2/ICameraDeviceUser.h>
32 #include <media/stagefright/foundation/ALooper.h>
33 #include <media/stagefright/foundation/AHandler.h>
34 #include <media/stagefright/foundation/AMessage.h>
35 #include <camera/CaptureResult.h>
36 #include <camera/camera2/OutputConfiguration.h>
37 #include <camera/camera2/CaptureRequest.h>
38 
39 #include <camera/NdkCameraDevice.h>
40 #include "ACameraMetadata.h"
41 
42 namespace android {
43 
44 // Wrap ACameraCaptureFailure so it can be ref-counter
45 struct CameraCaptureFailure : public RefBase, public ACameraCaptureFailure {};
46 
47 class CameraDevice final : public RefBase {
48   public:
49     CameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
50                   std::unique_ptr<ACameraMetadata> chars,
51                   ACameraDevice* wrapper);
52     ~CameraDevice();
53 
getId()54     inline const char* getId() const { return mCameraId.string(); }
55 
56     camera_status_t createCaptureRequest(
57             ACameraDevice_request_template templateId,
58             ACaptureRequest** request) const;
59 
60     camera_status_t createCaptureSession(
61             const ACaptureSessionOutputContainer*       outputs,
62             const ACameraCaptureSession_stateCallbacks* callbacks,
63             /*out*/ACameraCaptureSession** session);
64 
65     // Callbacks from camera service
66     class ServiceCallback : public hardware::camera2::BnCameraDeviceCallbacks {
67       public:
ServiceCallback(CameraDevice * device)68         explicit ServiceCallback(CameraDevice* device) : mDevice(device) {}
69         binder::Status onDeviceError(int32_t errorCode,
70                            const CaptureResultExtras& resultExtras) override;
71         binder::Status onDeviceIdle() override;
72         binder::Status onCaptureStarted(const CaptureResultExtras& resultExtras,
73                               int64_t timestamp) override;
74         binder::Status onResultReceived(const CameraMetadata& metadata,
75                               const CaptureResultExtras& resultExtras) override;
76         binder::Status onPrepared(int streamId) override;
77         binder::Status onRequestQueueEmpty() override;
78         binder::Status onRepeatingRequestError(int64_t lastFrameNumber,
79                 int32_t stoppedSequenceId) override;
80       private:
81         const wp<CameraDevice> mDevice;
82     };
getServiceCallback()83     inline sp<hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
84         return mServiceCallback;
85     };
86 
87     // Camera device is only functional after remote being set
88     void setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote);
89 
getWrapper()90     inline ACameraDevice* getWrapper() const { return mWrapper; };
91 
92   private:
93     friend ACameraCaptureSession;
94     camera_status_t checkCameraClosedOrErrorLocked() const;
95 
96     // device goes into fatal error state after this
97     void setCameraDeviceErrorLocked(camera_status_t error);
98 
99     void disconnectLocked(); // disconnect from camera service
100 
101     camera_status_t stopRepeatingLocked();
102 
103     camera_status_t flushLocked(ACameraCaptureSession*);
104 
105     camera_status_t waitUntilIdleLocked();
106 
107 
108     camera_status_t captureLocked(sp<ACameraCaptureSession> session,
109             /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
110             int numRequests, ACaptureRequest** requests,
111             /*optional*/int* captureSequenceId);
112 
113     camera_status_t setRepeatingRequestsLocked(sp<ACameraCaptureSession> session,
114             /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
115             int numRequests, ACaptureRequest** requests,
116             /*optional*/int* captureSequenceId);
117 
118     camera_status_t submitRequestsLocked(
119             sp<ACameraCaptureSession> session,
120             /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
121             int numRequests, ACaptureRequest** requests,
122             /*out*/int* captureSequenceId,
123             bool isRepeating);
124 
125     static camera_status_t allocateCaptureRequest(
126             const ACaptureRequest* request, sp<CaptureRequest>& outReq);
127 
128     static ACaptureRequest* allocateACaptureRequest(sp<CaptureRequest>& req);
129     static void freeACaptureRequest(ACaptureRequest*);
130 
131     // only For session to hold device lock
132     // Always grab device lock before grabbing session lock
lockDeviceForSessionOps()133     void lockDeviceForSessionOps() const { mDeviceLock.lock(); };
unlockDevice()134     void unlockDevice() const { mDeviceLock.unlock(); };
135 
136     // For capture session to notify its end of life
137     void notifySessionEndOfLifeLocked(ACameraCaptureSession* session);
138 
139     camera_status_t configureStreamsLocked(const ACaptureSessionOutputContainer* outputs);
140 
141     static camera_status_t getIGBPfromAnw(
142             ANativeWindow* anw, sp<IGraphicBufferProducer>& out);
143 
144     static camera_status_t getSurfaceFromANativeWindow(
145             ANativeWindow* anw, sp<Surface>& out);
146 
147     mutable Mutex mDeviceLock;
148     const String8 mCameraId;                          // Camera ID
149     const ACameraDevice_StateCallbacks mAppCallbacks; // Callback to app
150     const std::unique_ptr<ACameraMetadata> mChars;    // Camera characteristics
151     const sp<ServiceCallback> mServiceCallback;
152     ACameraDevice* mWrapper;
153 
154     // stream id -> pair of (ANW* from application, OutputConfiguration used for camera service)
155     std::map<int, std::pair<ANativeWindow*, OutputConfiguration>> mConfiguredOutputs;
156 
157     // TODO: maybe a bool will suffice for synchronous implementation?
158     std::atomic_bool mClosing;
isClosed()159     inline bool isClosed() { return mClosing; }
160 
161     bool mInError = false;
162     camera_status_t mError = ACAMERA_OK;
163     void onCaptureErrorLocked(
164             int32_t errorCode,
165             const CaptureResultExtras& resultExtras);
166 
167     bool mIdle = true;
168     // This will avoid a busy session being deleted before it's back to idle state
169     sp<ACameraCaptureSession> mBusySession;
170 
171     sp<hardware::camera2::ICameraDeviceUser> mRemote;
172 
173     // Looper thread to handle callback to app
174     sp<ALooper> mCbLooper;
175     // definition of handler and message
176     enum {
177         // Device state callbacks
178         kWhatOnDisconnected,   // onDisconnected
179         kWhatOnError,          // onError
180         // Session state callbacks
181         kWhatSessionStateCb,   // onReady, onActive
182         // Capture callbacks
183         kWhatCaptureStart,     // onCaptureStarted
184         kWhatCaptureResult,    // onCaptureProgressed, onCaptureCompleted
185         kWhatCaptureFail,      // onCaptureFailed
186         kWhatCaptureSeqEnd,    // onCaptureSequenceCompleted
187         kWhatCaptureSeqAbort,  // onCaptureSequenceAborted
188         kWhatCaptureBufferLost // onCaptureBufferLost
189     };
190     static const char* kContextKey;
191     static const char* kDeviceKey;
192     static const char* kErrorCodeKey;
193     static const char* kCallbackFpKey;
194     static const char* kSessionSpKey;
195     static const char* kCaptureRequestKey;
196     static const char* kTimeStampKey;
197     static const char* kCaptureResultKey;
198     static const char* kCaptureFailureKey;
199     static const char* kSequenceIdKey;
200     static const char* kFrameNumberKey;
201     static const char* kAnwKey;
202     class CallbackHandler : public AHandler {
203       public:
CallbackHandler()204         CallbackHandler() {}
205         void onMessageReceived(const sp<AMessage> &msg) override;
206     };
207     sp<CallbackHandler> mHandler;
208 
209     /***********************************
210      * Capture session related members *
211      ***********************************/
212     // The current active session
213     ACameraCaptureSession* mCurrentSession = nullptr;
214     bool mFlushing = false;
215 
216     int mNextSessionId = 0;
217     // TODO: might need another looper/handler to handle callbacks from service
218 
219     static const int REQUEST_ID_NONE = -1;
220     int mRepeatingSequenceId = REQUEST_ID_NONE;
221 
222     // sequence id -> last frame number map
223     std::map<int, int64_t> mSequenceLastFrameNumberMap;
224 
225     struct CallbackHolder {
226         CallbackHolder(sp<ACameraCaptureSession>          session,
227                        const Vector<sp<CaptureRequest> >& requests,
228                        bool                               isRepeating,
229                        ACameraCaptureSession_captureCallbacks* cbs);
230 
fillCbCallbackHolder231         static ACameraCaptureSession_captureCallbacks fillCb(
232                 ACameraCaptureSession_captureCallbacks* cbs) {
233             if (cbs != nullptr) {
234                 return *cbs;
235             }
236             return { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
237         }
238 
239         sp<ACameraCaptureSession>   mSession;
240         Vector<sp<CaptureRequest> > mRequests;
241         const bool                  mIsRepeating;
242         ACameraCaptureSession_captureCallbacks mCallbacks;
243     };
244     // sequence id -> callbacks map
245     std::map<int, CallbackHolder> mSequenceCallbackMap;
246 
247     static const int64_t NO_FRAMES_CAPTURED = -1;
248     class FrameNumberTracker {
249       public:
250         // TODO: Called in onResultReceived and onCaptureErrorLocked
251         void updateTracker(int64_t frameNumber, bool isError);
getCompletedFrameNumber()252         inline int64_t getCompletedFrameNumber() { return mCompletedFrameNumber; }
253       private:
254         void update();
255         void updateCompletedFrameNumber(int64_t frameNumber);
256 
257         int64_t mCompletedFrameNumber = NO_FRAMES_CAPTURED;
258         List<int64_t> mSkippedFrameNumbers;
259         std::set<int64_t> mFutureErrorSet;
260     };
261     FrameNumberTracker mFrameNumberTracker;
262 
263     void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber);
264     void checkAndFireSequenceCompleteLocked();
265 
266     // Misc variables
267     int32_t mShadingMapSize[2];   // const after constructor
268     int32_t mPartialResultCount;  // const after constructor
269 
270 };
271 
272 } // namespace android;
273 
274 /**
275  * ACameraDevice opaque struct definition
276  * Leave outside of android namespace because it's NDK struct
277  */
278 struct ACameraDevice {
ACameraDeviceACameraDevice279     ACameraDevice(const char* id, ACameraDevice_StateCallbacks* cb,
280                   std::unique_ptr<ACameraMetadata> chars) :
281             mDevice(new CameraDevice(id, cb, std::move(chars), this)) {}
282 
~ACameraDeviceACameraDevice283     ~ACameraDevice() {};
284 
285     /*******************
286      * NDK public APIs *
287      *******************/
getIdACameraDevice288     inline const char* getId() const { return mDevice->getId(); }
289 
createCaptureRequestACameraDevice290     camera_status_t createCaptureRequest(
291             ACameraDevice_request_template templateId,
292             ACaptureRequest** request) const {
293         return mDevice->createCaptureRequest(templateId, request);
294     }
295 
createCaptureSessionACameraDevice296     camera_status_t createCaptureSession(
297             const ACaptureSessionOutputContainer*       outputs,
298             const ACameraCaptureSession_stateCallbacks* callbacks,
299             /*out*/ACameraCaptureSession** session) {
300         return mDevice->createCaptureSession(outputs, callbacks, session);
301     }
302 
303     /***********************
304      * Device interal APIs *
305      ***********************/
getServiceCallbackACameraDevice306     inline android::sp<android::hardware::camera2::ICameraDeviceCallbacks> getServiceCallback() {
307         return mDevice->getServiceCallback();
308     };
309 
310     // Camera device is only functional after remote being set
setRemoteDeviceACameraDevice311     inline void setRemoteDevice(android::sp<android::hardware::camera2::ICameraDeviceUser> remote) {
312         mDevice->setRemoteDevice(remote);
313     }
314 
315   private:
316     android::sp<android::CameraDevice> mDevice;
317 };
318 
319 #endif // _ACAMERA_DEVICE_H
320