blob: 7997768e6e5809d7c06dbbf1295fdbb86705b5e2 [file] [log] [blame]
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001/*
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
17//#define LOG_NDEBUG 0
18#define LOG_TAG "ACameraDevice"
19
Yin-Chia Yehead91462016-01-06 16:45:08 -080020#include <vector>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080021#include <inttypes.h>
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -080022#include <android/hardware/ICameraService.h>
Yin-Chia Yehead91462016-01-06 16:45:08 -080023#include <gui/Surface.h>
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080024#include "ACameraDevice.h"
25#include "ACameraMetadata.h"
26#include "ACaptureRequest.h"
Yin-Chia Yehead91462016-01-06 16:45:08 -080027#include "ACameraCaptureSession.h"
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080028
Jayant Chowdharya8488c92019-06-21 12:45:34 -070029ACameraDevice::~ACameraDevice() {
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -070030 mDevice->stopLooperAndDisconnect();
Jayant Chowdharya8488c92019-06-21 12:45:34 -070031}
32
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080033namespace android {
Jayant Chowdhary6df26072018-11-06 23:55:12 -080034namespace acam {
35
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080036// Static member definitions
Yin-Chia Yehead91462016-01-06 16:45:08 -080037const char* CameraDevice::kContextKey = "Context";
38const char* CameraDevice::kDeviceKey = "Device";
39const char* CameraDevice::kErrorCodeKey = "ErrorCode";
40const char* CameraDevice::kCallbackFpKey = "Callback";
41const char* CameraDevice::kSessionSpKey = "SessionSp";
42const char* CameraDevice::kCaptureRequestKey = "CaptureRequest";
43const char* CameraDevice::kTimeStampKey = "TimeStamp";
44const char* CameraDevice::kCaptureResultKey = "CaptureResult";
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -080045const char* CameraDevice::kPhysicalCaptureResultKey = "PhysicalCaptureResult";
Yin-Chia Yehead91462016-01-06 16:45:08 -080046const char* CameraDevice::kCaptureFailureKey = "CaptureFailure";
47const char* CameraDevice::kSequenceIdKey = "SequenceId";
48const char* CameraDevice::kFrameNumberKey = "FrameNumber";
Yin-Chia Yehe081c592016-03-29 18:26:44 -070049const char* CameraDevice::kAnwKey = "Anw";
Emilian Peevedec62d2019-03-19 17:59:24 -070050const char* CameraDevice::kFailingPhysicalCameraId= "FailingPhysicalCameraId";
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080051
52/**
53 * CameraDevice Implementation
54 */
55CameraDevice::CameraDevice(
56 const char* id,
57 ACameraDevice_StateCallbacks* cb,
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -070058 sp<ACameraMetadata> chars,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080059 ACameraDevice* wrapper) :
60 mCameraId(id),
61 mAppCallbacks(*cb),
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -070062 mChars(chars),
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080063 mServiceCallback(new ServiceCallback(this)),
64 mWrapper(wrapper),
65 mInError(false),
66 mError(ACAMERA_OK),
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -070067 mIdle(true),
68 mCurrentSession(nullptr) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080069 mClosing = false;
70 // Setup looper thread to perfrom device callbacks to app
71 mCbLooper = new ALooper;
72 mCbLooper->setName("C2N-dev-looper");
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -080073 status_t err = mCbLooper->start(
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080074 /*runOnCallingThread*/false,
75 /*canCallJava*/ true,
Yin-Chia Yehead91462016-01-06 16:45:08 -080076 PRIORITY_DEFAULT);
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -080077 if (err != OK) {
78 ALOGE("%s: Unable to start camera device callback looper: %s (%d)",
79 __FUNCTION__, strerror(-err), err);
80 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
81 }
Shuzhen Wang6c17e212019-02-19 14:51:47 -080082 mHandler = new CallbackHandler(id);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -080083 mCbLooper->registerHandler(mHandler);
Yin-Chia Yehead91462016-01-06 16:45:08 -080084
Yin-Chia Yeh8aac03f2016-03-03 15:45:23 -080085 const CameraMetadata& metadata = mChars->getInternalData();
86 camera_metadata_ro_entry entry = metadata.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT);
Yin-Chia Yehead91462016-01-06 16:45:08 -080087 if (entry.count != 1) {
88 ALOGW("%s: bad count %zu for partial result count", __FUNCTION__, entry.count);
89 mPartialResultCount = 1;
90 } else {
91 mPartialResultCount = entry.data.i32[0];
92 }
93
94 entry = metadata.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE);
95 if (entry.count != 2) {
96 ALOGW("%s: bad count %zu for shading map size", __FUNCTION__, entry.count);
97 mShadingMapSize[0] = 0;
98 mShadingMapSize[1] = 0;
99 } else {
100 mShadingMapSize[0] = entry.data.i32[0];
101 mShadingMapSize[1] = entry.data.i32[1];
102 }
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800103
104 size_t physicalIdCnt = 0;
105 const char*const* physicalCameraIds;
106 if (mChars->isLogicalMultiCamera(&physicalIdCnt, &physicalCameraIds)) {
107 for (size_t i = 0; i < physicalIdCnt; i++) {
108 mPhysicalIds.push_back(physicalCameraIds[i]);
109 }
110 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800111}
112
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -0700113CameraDevice::~CameraDevice() { }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800114
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700115void
116CameraDevice::postSessionMsgAndCleanup(sp<AMessage>& msg) {
117 msg->post();
118 msg.clear();
119 sp<AMessage> cleanupMsg = new AMessage(kWhatCleanUpSessions, mHandler);
120 cleanupMsg->post();
121}
122
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800123// TODO: cached created request?
124camera_status_t
125CameraDevice::createCaptureRequest(
126 ACameraDevice_request_template templateId,
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800127 const ACameraIdList* physicalIdList,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800128 ACaptureRequest** request) const {
129 Mutex::Autolock _l(mDeviceLock);
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800130
131 if (physicalIdList != nullptr) {
132 if (physicalIdList->numCameras > static_cast<int>(mPhysicalIds.size())) {
133 ALOGE("%s: physicalIdList size %d exceeds number of available physical cameras %zu",
134 __FUNCTION__, physicalIdList->numCameras, mPhysicalIds.size());
135 return ACAMERA_ERROR_INVALID_PARAMETER;
136 }
137 for (auto i = 0; i < physicalIdList->numCameras; i++) {
138 if (physicalIdList->cameraIds[i] == nullptr) {
139 ALOGE("%s: physicalId is null!", __FUNCTION__);
140 return ACAMERA_ERROR_INVALID_PARAMETER;
141 }
142 if (mPhysicalIds.end() == std::find(
143 mPhysicalIds.begin(), mPhysicalIds.end(), physicalIdList->cameraIds[i])) {
144 ALOGE("%s: Invalid physicalId %s!", __FUNCTION__, physicalIdList->cameraIds[i]);
145 return ACAMERA_ERROR_INVALID_PARAMETER;
146 }
147 }
148 }
149
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800150 camera_status_t ret = checkCameraClosedOrErrorLocked();
151 if (ret != ACAMERA_OK) {
152 return ret;
153 }
154 if (mRemote == nullptr) {
155 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
156 }
157 CameraMetadata rawRequest;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800158 binder::Status remoteRet = mRemote->createDefaultRequest(templateId, &rawRequest);
159 if (remoteRet.serviceSpecificErrorCode() ==
160 hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800161 ALOGW("Create capture request failed! template %d is not supported on this device",
162 templateId);
Yin-Chia Yeha22528a2016-05-12 14:03:11 -0700163 return ACAMERA_ERROR_INVALID_PARAMETER;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800164 } else if (!remoteRet.isOk()) {
165 ALOGE("Create capture request failed: %s", remoteRet.toString8().string());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800166 return ACAMERA_ERROR_UNKNOWN;
167 }
168 ACaptureRequest* outReq = new ACaptureRequest();
169 outReq->settings = new ACameraMetadata(rawRequest.release(), ACameraMetadata::ACM_REQUEST);
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800170 if (physicalIdList != nullptr) {
171 for (auto i = 0; i < physicalIdList->numCameras; i++) {
172 outReq->physicalSettings.emplace(physicalIdList->cameraIds[i],
173 new ACameraMetadata(*(outReq->settings)));
174 }
175 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800176 outReq->targets = new ACameraOutputTargets();
177 *request = outReq;
178 return ACAMERA_OK;
179}
180
Yin-Chia Yehead91462016-01-06 16:45:08 -0800181camera_status_t
182CameraDevice::createCaptureSession(
183 const ACaptureSessionOutputContainer* outputs,
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100184 const ACaptureRequest* sessionParameters,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800185 const ACameraCaptureSession_stateCallbacks* callbacks,
186 /*out*/ACameraCaptureSession** session) {
Shuzhen Wang316781a2020-08-18 18:11:01 -0700187 nsecs_t startTimeNs = systemTime();
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700188 sp<ACameraCaptureSession> currentSession = mCurrentSession.promote();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800189 Mutex::Autolock _l(mDeviceLock);
190 camera_status_t ret = checkCameraClosedOrErrorLocked();
191 if (ret != ACAMERA_OK) {
192 return ret;
193 }
194
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700195 if (currentSession != nullptr) {
196 currentSession->closeByDevice();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800197 stopRepeatingLocked();
198 }
199
200 // Create new session
Shuzhen Wang316781a2020-08-18 18:11:01 -0700201 ret = configureStreamsLocked(outputs, sessionParameters, startTimeNs);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800202 if (ret != ACAMERA_OK) {
203 ALOGE("Fail to create new session. cannot configure streams");
204 return ret;
205 }
206
207 ACameraCaptureSession* newSession = new ACameraCaptureSession(
208 mNextSessionId++, outputs, callbacks, this);
209
Yin-Chia Yehead91462016-01-06 16:45:08 -0800210 // set new session as current session
211 newSession->incStrong((void *) ACameraDevice_createCaptureSession);
212 mCurrentSession = newSession;
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700213 mFlushing = false;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800214 *session = newSession;
215 return ACAMERA_OK;
216}
217
Shuzhen Wang24810e72019-03-18 10:55:01 -0700218camera_status_t CameraDevice::isSessionConfigurationSupported(
219 const ACaptureSessionOutputContainer* sessionOutputContainer) const {
220 Mutex::Autolock _l(mDeviceLock);
221 camera_status_t ret = checkCameraClosedOrErrorLocked();
222 if (ret != ACAMERA_OK) {
223 return ret;
224 }
225
226 SessionConfiguration sessionConfiguration(0 /*inputWidth*/, 0 /*inputHeight*/,
227 -1 /*inputFormat*/, CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE);
228 for (const auto& output : sessionOutputContainer->mOutputs) {
229 sp<IGraphicBufferProducer> iGBP(nullptr);
230 ret = getIGBPfromAnw(output.mWindow, iGBP);
231 if (ret != ACAMERA_OK) {
232 ALOGE("Camera device %s failed to extract graphic producer from native window",
233 getId());
234 return ret;
235 }
236
237 String16 physicalId16(output.mPhysicalCameraId.c_str());
238 OutputConfiguration outConfig(iGBP, output.mRotation, physicalId16,
239 OutputConfiguration::INVALID_SET_ID, true);
240
241 for (auto& anw : output.mSharedWindows) {
242 ret = getIGBPfromAnw(anw, iGBP);
243 if (ret != ACAMERA_OK) {
244 ALOGE("Camera device %s failed to extract graphic producer from native window",
245 getId());
246 return ret;
247 }
248 outConfig.addGraphicProducer(iGBP);
249 }
250
251 sessionConfiguration.addOutputConfiguration(outConfig);
252 }
253
254 bool supported = false;
255 binder::Status remoteRet = mRemote->isSessionConfigurationSupported(
256 sessionConfiguration, &supported);
257 if (remoteRet.serviceSpecificErrorCode() ==
258 hardware::ICameraService::ERROR_INVALID_OPERATION) {
259 return ACAMERA_ERROR_UNSUPPORTED_OPERATION;
260 } else if (!remoteRet.isOk()) {
261 return ACAMERA_ERROR_UNKNOWN;
262 } else {
263 return supported ? ACAMERA_OK : ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
264 }
265}
266
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800267camera_status_t CameraDevice::updateOutputConfigurationLocked(ACaptureSessionOutput *output) {
Emilian Peev40ead602017-09-26 15:46:36 +0100268 camera_status_t ret = checkCameraClosedOrErrorLocked();
269 if (ret != ACAMERA_OK) {
270 return ret;
271 }
272
273 if (output == nullptr) {
274 return ACAMERA_ERROR_INVALID_PARAMETER;
275 }
276
277 if (!output->mIsShared) {
278 ALOGE("Error output configuration is not shared");
279 return ACAMERA_ERROR_INVALID_OPERATION;
280 }
281
282 int32_t streamId = -1;
283 for (auto& kvPair : mConfiguredOutputs) {
284 if (kvPair.second.first == output->mWindow) {
285 streamId = kvPair.first;
286 break;
287 }
288 }
289 if (streamId < 0) {
290 ALOGE("Error: Invalid output configuration");
291 return ACAMERA_ERROR_INVALID_PARAMETER;
292 }
293
294 sp<IGraphicBufferProducer> iGBP(nullptr);
295 ret = getIGBPfromAnw(output->mWindow, iGBP);
296 if (ret != ACAMERA_OK) {
297 ALOGE("Camera device %s failed to extract graphic producer from native window",
298 getId());
299 return ret;
300 }
301
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800302 String16 physicalId16(output->mPhysicalCameraId.c_str());
303 OutputConfiguration outConfig(iGBP, output->mRotation, physicalId16,
304 OutputConfiguration::INVALID_SET_ID, true);
Emilian Peev40ead602017-09-26 15:46:36 +0100305
306 for (auto& anw : output->mSharedWindows) {
307 ret = getIGBPfromAnw(anw, iGBP);
308 if (ret != ACAMERA_OK) {
309 ALOGE("Camera device %s failed to extract graphic producer from native window",
310 getId());
311 return ret;
312 }
313 outConfig.addGraphicProducer(iGBP);
314 }
315
316 auto remoteRet = mRemote->updateOutputConfiguration(streamId, outConfig);
317 if (!remoteRet.isOk()) {
318 switch (remoteRet.serviceSpecificErrorCode()) {
319 case hardware::ICameraService::ERROR_INVALID_OPERATION:
320 ALOGE("Camera device %s invalid operation: %s", getId(),
321 remoteRet.toString8().string());
322 return ACAMERA_ERROR_INVALID_OPERATION;
323 break;
324 case hardware::ICameraService::ERROR_ALREADY_EXISTS:
325 ALOGE("Camera device %s output surface already exists: %s", getId(),
326 remoteRet.toString8().string());
327 return ACAMERA_ERROR_INVALID_PARAMETER;
328 break;
329 case hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT:
330 ALOGE("Camera device %s invalid input argument: %s", getId(),
331 remoteRet.toString8().string());
332 return ACAMERA_ERROR_INVALID_PARAMETER;
333 break;
334 default:
335 ALOGE("Camera device %s failed to add shared output: %s", getId(),
336 remoteRet.toString8().string());
337 return ACAMERA_ERROR_UNKNOWN;
338 }
339 }
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800340 mConfiguredOutputs[streamId] = std::make_pair(output->mWindow, outConfig);
Emilian Peev40ead602017-09-26 15:46:36 +0100341
342 return ACAMERA_OK;
343}
344
Yin-Chia Yehead91462016-01-06 16:45:08 -0800345camera_status_t
346CameraDevice::allocateCaptureRequest(
347 const ACaptureRequest* request, /*out*/sp<CaptureRequest>& outReq) {
348 camera_status_t ret;
349 sp<CaptureRequest> req(new CaptureRequest());
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800350 req->mPhysicalCameraSettings.push_back({getId(),
Emilian Peevaebbe412018-01-15 13:53:24 +0000351 request->settings->getInternalData()});
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800352 for (auto& entry : request->physicalSettings) {
353 req->mPhysicalCameraSettings.push_back({entry.first,
354 entry.second->getInternalData()});
355 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800356 req->mIsReprocess = false; // NDK does not support reprocessing yet
Yin-Chia Yehd39b9e32017-10-30 17:39:23 -0700357 req->mContext = request->context;
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800358 req->mSurfaceConverted = true; // set to true, and fill in stream/surface idx to speed up IPC
Yin-Chia Yehead91462016-01-06 16:45:08 -0800359
360 for (auto outputTarget : request->targets->mOutputs) {
361 ANativeWindow* anw = outputTarget.mWindow;
362 sp<Surface> surface;
363 ret = getSurfaceFromANativeWindow(anw, surface);
364 if (ret != ACAMERA_OK) {
365 ALOGE("Bad output target in capture request! ret %d", ret);
366 return ret;
367 }
368 req->mSurfaceList.push_back(surface);
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800369
370 bool found = false;
371 // lookup stream/surface ID
372 for (const auto& kvPair : mConfiguredOutputs) {
373 int streamId = kvPair.first;
374 const OutputConfiguration& outConfig = kvPair.second.second;
375 const auto& gbps = outConfig.getGraphicBufferProducers();
376 for (int surfaceId = 0; surfaceId < (int) gbps.size(); surfaceId++) {
377 if (gbps[surfaceId] == surface->getIGraphicBufferProducer()) {
378 found = true;
379 req->mStreamIdxList.push_back(streamId);
380 req->mSurfaceIdxList.push_back(surfaceId);
381 break;
382 }
383 }
384 if (found) {
385 break;
386 }
387 }
388 if (!found) {
389 ALOGE("Unconfigured output target %p in capture request!", anw);
390 return ret;
391 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800392 }
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800393
Yin-Chia Yehead91462016-01-06 16:45:08 -0800394 outReq = req;
395 return ACAMERA_OK;
396}
397
398ACaptureRequest*
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800399CameraDevice::allocateACaptureRequest(sp<CaptureRequest>& req, const std::string& deviceId) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800400 ACaptureRequest* pRequest = new ACaptureRequest();
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800401 for (auto& entry : req->mPhysicalCameraSettings) {
402 CameraMetadata clone = entry.settings;
403 if (entry.id == deviceId) {
404 pRequest->settings = new ACameraMetadata(clone.release(), ACameraMetadata::ACM_REQUEST);
405 } else {
406 pRequest->physicalSettings.emplace(entry.id,
407 new ACameraMetadata(clone.release(), ACameraMetadata::ACM_REQUEST));
408 }
409 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800410 pRequest->targets = new ACameraOutputTargets();
411 for (size_t i = 0; i < req->mSurfaceList.size(); i++) {
412 ANativeWindow* anw = static_cast<ANativeWindow*>(req->mSurfaceList[i].get());
413 ACameraOutputTarget outputTarget(anw);
414 pRequest->targets->mOutputs.insert(outputTarget);
415 }
Yin-Chia Yehd39b9e32017-10-30 17:39:23 -0700416 pRequest->context = req->mContext;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800417 return pRequest;
418}
419
420void
421CameraDevice::freeACaptureRequest(ACaptureRequest* req) {
422 if (req == nullptr) {
423 return;
424 }
Yin-Chia Yehdd045bf2018-08-20 12:39:19 -0700425 req->settings.clear();
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800426 req->physicalSettings.clear();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800427 delete req->targets;
428 delete req;
429}
430
431void
432CameraDevice::notifySessionEndOfLifeLocked(ACameraCaptureSession* session) {
433 if (isClosed()) {
434 // Device is closing already. do nothing
435 return;
436 }
437
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700438 if (mCurrentSession != session) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800439 // Session has been replaced by other seesion or device is closed
440 return;
441 }
442 mCurrentSession = nullptr;
443
444 // Should not happen
445 if (!session->mIsClosed) {
446 ALOGE("Error: unclosed session %p reaches end of life!", session);
447 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
448 return;
449 }
450
451 // No new session, unconfigure now
Shuzhen Wang316781a2020-08-18 18:11:01 -0700452 // Note: The unconfiguration of session won't be accounted for session
453 // latency because a stream configuration with 0 streams won't ever become
454 // active.
455 nsecs_t startTimeNs = systemTime();
456 camera_status_t ret = configureStreamsLocked(nullptr, nullptr, startTimeNs);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800457 if (ret != ACAMERA_OK) {
458 ALOGE("Unconfigure stream failed. Device might still be configured! ret %d", ret);
459 }
460}
461
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800462void
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700463CameraDevice::disconnectLocked(sp<ACameraCaptureSession>& session) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800464 if (mClosing.exchange(true)) {
465 // Already closing, just return
466 ALOGW("Camera device %s is already closing.", getId());
467 return;
468 }
469
470 if (mRemote != nullptr) {
471 mRemote->disconnect();
472 }
473 mRemote = nullptr;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800474
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700475 if (session != nullptr) {
476 session->closeByDevice();
Yin-Chia Yehead91462016-01-06 16:45:08 -0800477 }
478}
479
480camera_status_t
481CameraDevice::stopRepeatingLocked() {
482 camera_status_t ret = checkCameraClosedOrErrorLocked();
483 if (ret != ACAMERA_OK) {
484 ALOGE("Camera %s stop repeating failed! ret %d", getId(), ret);
485 return ret;
486 }
487 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
488 int repeatingSequenceId = mRepeatingSequenceId;
489 mRepeatingSequenceId = REQUEST_ID_NONE;
490
491 int64_t lastFrameNumber;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800492 binder::Status remoteRet = mRemote->cancelRequest(repeatingSequenceId, &lastFrameNumber);
Chien-Yu Chene8c535e2016-04-14 12:18:26 -0700493 if (remoteRet.serviceSpecificErrorCode() ==
494 hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
495 ALOGV("Repeating request is already stopped.");
496 return ACAMERA_OK;
497 } else if (!remoteRet.isOk()) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800498 ALOGE("Stop repeating request fails in remote: %s", remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800499 return ACAMERA_ERROR_UNKNOWN;
500 }
501 checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
502 }
503 return ACAMERA_OK;
504}
505
506camera_status_t
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700507CameraDevice::flushLocked(ACameraCaptureSession* session) {
508 camera_status_t ret = checkCameraClosedOrErrorLocked();
509 if (ret != ACAMERA_OK) {
510 ALOGE("Camera %s abort captures failed! ret %d", getId(), ret);
511 return ret;
512 }
513
514 // This should never happen because creating a new session will close
515 // previous one and thus reject any API call from previous session.
516 // But still good to check here in case something unexpected happen.
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700517 if (mCurrentSession != session) {
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700518 ALOGE("Camera %s session %p is not current active session!", getId(), session);
519 return ACAMERA_ERROR_INVALID_OPERATION;
520 }
521
522 if (mFlushing) {
523 ALOGW("Camera %s is already aborting captures", getId());
524 return ACAMERA_OK;
525 }
526
527 mFlushing = true;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700528
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700529 // Send onActive callback to guarantee there is always active->ready transition
530 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
531 msg->setPointer(kContextKey, session->mUserSessionCallback.context);
532 msg->setObject(kSessionSpKey, session);
533 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onActive);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700534 postSessionMsgAndCleanup(msg);
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700535
536 // If device is already idling, send callback and exit early
537 if (mIdle) {
538 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
539 msg->setPointer(kContextKey, session->mUserSessionCallback.context);
540 msg->setObject(kSessionSpKey, session);
541 msg->setPointer(kCallbackFpKey, (void*) session->mUserSessionCallback.onReady);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700542 postSessionMsgAndCleanup(msg);
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -0700543 mFlushing = false;
544 return ACAMERA_OK;
545 }
546
547 int64_t lastFrameNumber;
548 binder::Status remoteRet = mRemote->flush(&lastFrameNumber);
549 if (!remoteRet.isOk()) {
550 ALOGE("Abort captures fails in remote: %s", remoteRet.toString8().string());
551 return ACAMERA_ERROR_UNKNOWN;
552 }
553 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
554 checkRepeatingSequenceCompleteLocked(mRepeatingSequenceId, lastFrameNumber);
555 }
556 return ACAMERA_OK;
557}
558
559camera_status_t
Yin-Chia Yehead91462016-01-06 16:45:08 -0800560CameraDevice::waitUntilIdleLocked() {
561 camera_status_t ret = checkCameraClosedOrErrorLocked();
562 if (ret != ACAMERA_OK) {
563 ALOGE("Wait until camera %s idle failed! ret %d", getId(), ret);
564 return ret;
565 }
566
567 if (mRepeatingSequenceId != REQUEST_ID_NONE) {
568 ALOGE("Camera device %s won't go to idle when there is repeating request!", getId());
569 return ACAMERA_ERROR_INVALID_OPERATION;
570 }
571
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800572 binder::Status remoteRet = mRemote->waitUntilIdle();
573 if (!remoteRet.isOk()) {
574 ALOGE("Camera device %s waitUntilIdle failed: %s", getId(), remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800575 // TODO: define a function to convert status_t -> camera_status_t
576 return ACAMERA_ERROR_UNKNOWN;
577 }
578
579 return ACAMERA_OK;
580}
581
582camera_status_t
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700583CameraDevice::getIGBPfromAnw(
584 ANativeWindow* anw,
Yin-Chia Yehead91462016-01-06 16:45:08 -0800585 sp<IGraphicBufferProducer>& out) {
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800586 sp<Surface> surface;
587 camera_status_t ret = getSurfaceFromANativeWindow(anw, surface);
588 if (ret != ACAMERA_OK) {
589 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800590 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800591 out = surface->getIGraphicBufferProducer();
592 return ACAMERA_OK;
593}
594
595camera_status_t
596CameraDevice::getSurfaceFromANativeWindow(
597 ANativeWindow* anw, sp<Surface>& out) {
598 if (anw == nullptr) {
599 ALOGE("Error: output ANativeWindow is null");
600 return ACAMERA_ERROR_INVALID_PARAMETER;
601 }
602 int value;
603 int err = (*anw->query)(anw, NATIVE_WINDOW_CONCRETE_TYPE, &value);
Eino-Ville Talvala02bf0322016-02-18 12:41:10 -0800604 if (err != OK || value != NATIVE_WINDOW_SURFACE) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800605 ALOGE("Error: ANativeWindow is not backed by Surface!");
606 return ACAMERA_ERROR_INVALID_PARAMETER;
607 }
608 sp<Surface> surface(static_cast<Surface*>(anw));
609 out = surface;
610 return ACAMERA_OK;
611}
612
613camera_status_t
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100614CameraDevice::configureStreamsLocked(const ACaptureSessionOutputContainer* outputs,
Shuzhen Wang316781a2020-08-18 18:11:01 -0700615 const ACaptureRequest* sessionParameters, nsecs_t startTimeNs) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800616 ACaptureSessionOutputContainer emptyOutput;
617 if (outputs == nullptr) {
618 outputs = &emptyOutput;
619 }
620
Yin-Chia Yehead91462016-01-06 16:45:08 -0800621 camera_status_t ret = checkCameraClosedOrErrorLocked();
622 if (ret != ACAMERA_OK) {
623 return ret;
624 }
625
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700626 std::set<std::pair<ANativeWindow*, OutputConfiguration>> outputSet;
Chih-Hung Hsieh3ef324d2018-12-11 11:48:12 -0800627 for (const auto& outConfig : outputs->mOutputs) {
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700628 ANativeWindow* anw = outConfig.mWindow;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800629 sp<IGraphicBufferProducer> iGBP(nullptr);
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700630 ret = getIGBPfromAnw(anw, iGBP);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800631 if (ret != ACAMERA_OK) {
632 return ret;
633 }
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800634 String16 physicalId16(outConfig.mPhysicalCameraId.c_str());
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700635 outputSet.insert(std::make_pair(
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800636 anw, OutputConfiguration(iGBP, outConfig.mRotation, physicalId16,
Emilian Peev40ead602017-09-26 15:46:36 +0100637 OutputConfiguration::INVALID_SET_ID, outConfig.mIsShared)));
Yin-Chia Yehead91462016-01-06 16:45:08 -0800638 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700639 auto addSet = outputSet;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800640 std::vector<int> deleteList;
641
642 // Determine which streams need to be created, which to be deleted
643 for (auto& kvPair : mConfiguredOutputs) {
644 int streamId = kvPair.first;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700645 auto& outputPair = kvPair.second;
646 if (outputSet.count(outputPair) == 0) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800647 deleteList.push_back(streamId); // Need to delete a no longer needed stream
648 } else {
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700649 addSet.erase(outputPair); // No need to add already existing stream
Yin-Chia Yehead91462016-01-06 16:45:08 -0800650 }
651 }
652
653 ret = stopRepeatingLocked();
654 if (ret != ACAMERA_OK) {
655 ALOGE("Camera device %s stop repeating failed, ret %d", getId(), ret);
656 return ret;
657 }
658
659 ret = waitUntilIdleLocked();
660 if (ret != ACAMERA_OK) {
661 ALOGE("Camera device %s wait until idle failed, ret %d", getId(), ret);
662 return ret;
663 }
664
665 // Send onReady to previous session
666 // CurrentSession will be updated after configureStreamLocked, so here
667 // mCurrentSession is the session to be replaced by a new session
668 if (!mIdle && mCurrentSession != nullptr) {
669 if (mBusySession != mCurrentSession) {
670 ALOGE("Current session != busy session");
671 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
672 return ACAMERA_ERROR_CAMERA_DEVICE;
673 }
674 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, mHandler);
675 msg->setPointer(kContextKey, mBusySession->mUserSessionCallback.context);
676 msg->setObject(kSessionSpKey, mBusySession);
677 msg->setPointer(kCallbackFpKey, (void*) mBusySession->mUserSessionCallback.onReady);
678 mBusySession.clear();
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700679 postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800680 }
681 mIdle = true;
682
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800683 binder::Status remoteRet = mRemote->beginConfigure();
684 if (!remoteRet.isOk()) {
685 ALOGE("Camera device %s begin configure failed: %s", getId(), remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800686 return ACAMERA_ERROR_UNKNOWN;
687 }
688
689 // delete to-be-deleted streams
690 for (auto streamId : deleteList) {
691 remoteRet = mRemote->deleteStream(streamId);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800692 if (!remoteRet.isOk()) {
693 ALOGE("Camera device %s failed to remove stream %d: %s", getId(), streamId,
694 remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800695 return ACAMERA_ERROR_UNKNOWN;
696 }
697 mConfiguredOutputs.erase(streamId);
698 }
699
700 // add new streams
Chih-Hung Hsieh3ef324d2018-12-11 11:48:12 -0800701 for (const auto& outputPair : addSet) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800702 int streamId;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700703 remoteRet = mRemote->createStream(outputPair.second, &streamId);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800704 if (!remoteRet.isOk()) {
705 ALOGE("Camera device %s failed to create stream: %s", getId(),
706 remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800707 return ACAMERA_ERROR_UNKNOWN;
708 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700709 mConfiguredOutputs.insert(std::make_pair(streamId, outputPair));
Yin-Chia Yehead91462016-01-06 16:45:08 -0800710 }
711
Emilian Peev5fbe0ba2017-10-20 15:45:45 +0100712 CameraMetadata params;
713 if ((sessionParameters != nullptr) && (sessionParameters->settings != nullptr)) {
714 params.append(sessionParameters->settings->getInternalData());
715 }
Emilian Peevcc0b7952020-01-07 13:54:47 -0800716 std::vector<int> offlineStreamIds;
Shuzhen Wang316781a2020-08-18 18:11:01 -0700717 remoteRet = mRemote->endConfigure(/*isConstrainedHighSpeed*/ false, params,
718 ns2ms(startTimeNs), &offlineStreamIds);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800719 if (remoteRet.serviceSpecificErrorCode() == hardware::ICameraService::ERROR_ILLEGAL_ARGUMENT) {
720 ALOGE("Camera device %s cannnot support app output configuration: %s", getId(),
721 remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800722 return ACAMERA_ERROR_STREAM_CONFIGURE_FAIL;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800723 } else if (!remoteRet.isOk()) {
724 ALOGE("Camera device %s end configure failed: %s", getId(), remoteRet.toString8().string());
Yin-Chia Yehead91462016-01-06 16:45:08 -0800725 return ACAMERA_ERROR_UNKNOWN;
726 }
727
728 return ACAMERA_OK;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800729}
730
731void
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800732CameraDevice::setRemoteDevice(sp<hardware::camera2::ICameraDeviceUser> remote) {
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800733 Mutex::Autolock _l(mDeviceLock);
734 mRemote = remote;
735}
736
737camera_status_t
738CameraDevice::checkCameraClosedOrErrorLocked() const {
739 if (mRemote == nullptr) {
740 ALOGE("%s: camera device already closed", __FUNCTION__);
741 return ACAMERA_ERROR_CAMERA_DISCONNECTED;
742 }
743 if (mInError) {// triggered by onDeviceError
744 ALOGE("%s: camera device has encountered a serious error", __FUNCTION__);
745 return mError;
746 }
747 return ACAMERA_OK;
748}
749
750void
Yin-Chia Yehead91462016-01-06 16:45:08 -0800751CameraDevice::setCameraDeviceErrorLocked(camera_status_t error) {
752 mInError = true;
753 mError = error;
754 return;
755}
756
757void
758CameraDevice::FrameNumberTracker::updateTracker(int64_t frameNumber, bool isError) {
759 ALOGV("updateTracker frame %" PRId64 " isError %d", frameNumber, isError);
760 if (isError) {
761 mFutureErrorSet.insert(frameNumber);
762 } else if (frameNumber <= mCompletedFrameNumber) {
763 ALOGE("Frame number %" PRId64 " decreased! current fn %" PRId64,
764 frameNumber, mCompletedFrameNumber);
765 return;
766 } else {
767 if (frameNumber != mCompletedFrameNumber + 1) {
768 ALOGE("Frame number out of order. Expect %" PRId64 " but get %" PRId64,
769 mCompletedFrameNumber + 1, frameNumber);
770 // Do not assert as in java implementation
771 }
772 mCompletedFrameNumber = frameNumber;
773 }
774 update();
775}
776
777void
778CameraDevice::FrameNumberTracker::update() {
779 for (auto it = mFutureErrorSet.begin(); it != mFutureErrorSet.end();) {
780 int64_t errorFrameNumber = *it;
781 if (errorFrameNumber == mCompletedFrameNumber + 1) {
782 mCompletedFrameNumber++;
783 it = mFutureErrorSet.erase(it);
784 } else if (errorFrameNumber <= mCompletedFrameNumber) {
785 // This should not happen, but deal with it anyway
786 ALOGE("Completd frame number passed through current frame number!");
787 // erase the old error since it's no longer useful
788 it = mFutureErrorSet.erase(it);
789 } else {
790 // Normal requests hasn't catched up error frames, just break
791 break;
792 }
793 }
794 ALOGV("Update complete frame %" PRId64, mCompletedFrameNumber);
795}
796
797void
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800798CameraDevice::onCaptureErrorLocked(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800799 int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800800 const CaptureResultExtras& resultExtras) {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800801 int sequenceId = resultExtras.requestId;
802 int64_t frameNumber = resultExtras.frameNumber;
803 int32_t burstId = resultExtras.burstId;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700804 auto it = mSequenceCallbackMap.find(sequenceId);
805 if (it == mSequenceCallbackMap.end()) {
806 ALOGE("%s: Error: capture sequence index %d not found!",
807 __FUNCTION__, sequenceId);
808 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800809 return;
810 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700811
812 CallbackHolder cbh = (*it).second;
813 sp<ACameraCaptureSession> session = cbh.mSession;
814 if ((size_t) burstId >= cbh.mRequests.size()) {
815 ALOGE("%s: Error: request index %d out of bound (size %zu)",
816 __FUNCTION__, burstId, cbh.mRequests.size());
817 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
818 return;
819 }
820 sp<CaptureRequest> request = cbh.mRequests[burstId];
821
822 // Handle buffer error
823 if (errorCode == hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER) {
824 int32_t streamId = resultExtras.errorStreamId;
825 ACameraCaptureSession_captureCallback_bufferLost onBufferLost =
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800826 cbh.mOnCaptureBufferLost;
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700827 auto outputPairIt = mConfiguredOutputs.find(streamId);
828 if (outputPairIt == mConfiguredOutputs.end()) {
829 ALOGE("%s: Error: stream id %d does not exist", __FUNCTION__, streamId);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800830 setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
831 return;
832 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700833
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800834 const auto& gbps = outputPairIt->second.second.getGraphicBufferProducers();
835 for (const auto& outGbp : gbps) {
Chih-Hung Hsieh3ef324d2018-12-11 11:48:12 -0800836 for (const auto& surface : request->mSurfaceList) {
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800837 if (surface->getIGraphicBufferProducer() == outGbp) {
838 ANativeWindow* anw = static_cast<ANativeWindow*>(surface.get());
839 ALOGV("Camera %s Lost output buffer for ANW %p frame %" PRId64,
840 getId(), anw, frameNumber);
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700841
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800842 sp<AMessage> msg = new AMessage(kWhatCaptureBufferLost, mHandler);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800843 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yeh4dfa4cc2017-11-10 20:00:09 -0800844 msg->setObject(kSessionSpKey, session);
845 msg->setPointer(kCallbackFpKey, (void*) onBufferLost);
846 msg->setObject(kCaptureRequestKey, request);
847 msg->setPointer(kAnwKey, (void*) anw);
848 msg->setInt64(kFrameNumberKey, frameNumber);
849 postSessionMsgAndCleanup(msg);
850 }
851 }
852 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700853 } else { // Handle other capture failures
854 // Fire capture failure callback if there is one registered
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800855 ACameraCaptureSession_captureCallback_failed onError = cbh.mOnCaptureFailed;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800856 sp<CameraCaptureFailure> failure(new CameraCaptureFailure());
857 failure->frameNumber = frameNumber;
858 // TODO: refine this when implementing flush
859 failure->reason = CAPTURE_FAILURE_REASON_ERROR;
860 failure->sequenceId = sequenceId;
861 failure->wasImageCaptured = (errorCode ==
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -0800862 hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800863
Emilian Peevedec62d2019-03-19 17:59:24 -0700864 sp<AMessage> msg = new AMessage(cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureFail :
865 kWhatCaptureFail, mHandler);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800866 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800867 msg->setObject(kSessionSpKey, session);
Emilian Peevedec62d2019-03-19 17:59:24 -0700868 if (cbh.mIsLogicalCameraCallback) {
869 if (resultExtras.errorPhysicalCameraId.size() > 0) {
870 String8 cameraId(resultExtras.errorPhysicalCameraId);
871 msg->setString(kFailingPhysicalCameraId, cameraId.string(), cameraId.size());
872 }
873 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnLogicalCameraCaptureFailed);
874 } else {
875 msg->setPointer(kCallbackFpKey, (void*) onError);
876 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800877 msg->setObject(kCaptureRequestKey, request);
878 msg->setObject(kCaptureFailureKey, failure);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700879 postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800880
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700881 // Update tracker
882 mFrameNumberTracker.updateTracker(frameNumber, /*isError*/true);
883 checkAndFireSequenceCompleteLocked();
884 }
885 return;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800886}
887
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -0700888void CameraDevice::stopLooperAndDisconnect() {
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700889 Mutex::Autolock _l(mDeviceLock);
Jayant Chowdharya8bf1c62019-09-26 08:50:17 -0700890 sp<ACameraCaptureSession> session = mCurrentSession.promote();
891 if (!isClosed()) {
892 disconnectLocked(session);
893 }
894 mCurrentSession = nullptr;
895
Jayant Chowdharya8488c92019-06-21 12:45:34 -0700896 if (mCbLooper != nullptr) {
897 mCbLooper->unregisterHandler(mHandler->id());
898 mCbLooper->stop();
899 }
900 mCbLooper.clear();
901 mHandler.clear();
902}
903
Shuzhen Wang6c17e212019-02-19 14:51:47 -0800904CameraDevice::CallbackHandler::CallbackHandler(const char* id) : mId(id) {
905}
906
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800907void CameraDevice::CallbackHandler::onMessageReceived(
908 const sp<AMessage> &msg) {
909 switch (msg->what()) {
910 case kWhatOnDisconnected:
911 case kWhatOnError:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800912 case kWhatSessionStateCb:
913 case kWhatCaptureStart:
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000914 case kWhatCaptureStart2:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800915 case kWhatCaptureResult:
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800916 case kWhatLogicalCaptureResult:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800917 case kWhatCaptureFail:
Emilian Peevedec62d2019-03-19 17:59:24 -0700918 case kWhatLogicalCaptureFail:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800919 case kWhatCaptureSeqEnd:
920 case kWhatCaptureSeqAbort:
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700921 case kWhatCaptureBufferLost:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800922 ALOGV("%s: Received msg %d", __FUNCTION__, msg->what());
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800923 break;
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -0700924 case kWhatCleanUpSessions:
925 mCachedSessions.clear();
926 return;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800927 default:
928 ALOGE("%s:Error: unknown device callback %d", __FUNCTION__, msg->what());
929 return;
930 }
931 // Check the common part of all message
932 void* context;
933 bool found = msg->findPointer(kContextKey, &context);
934 if (!found) {
935 ALOGE("%s: Cannot find callback context!", __FUNCTION__);
936 return;
937 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800938 switch (msg->what()) {
939 case kWhatOnDisconnected:
940 {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800941 ACameraDevice* dev;
942 found = msg->findPointer(kDeviceKey, (void**) &dev);
943 if (!found || dev == nullptr) {
944 ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
945 return;
946 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800947 ACameraDevice_StateCallback onDisconnected;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800948 found = msg->findPointer(kCallbackFpKey, (void**) &onDisconnected);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800949 if (!found) {
950 ALOGE("%s: Cannot find onDisconnected!", __FUNCTION__);
951 return;
952 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800953 if (onDisconnected == nullptr) {
954 return;
955 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800956 (*onDisconnected)(context, dev);
957 break;
958 }
959 case kWhatOnError:
960 {
Yin-Chia Yehead91462016-01-06 16:45:08 -0800961 ACameraDevice* dev;
962 found = msg->findPointer(kDeviceKey, (void**) &dev);
963 if (!found || dev == nullptr) {
964 ALOGE("%s: Cannot find device pointer!", __FUNCTION__);
965 return;
966 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800967 ACameraDevice_ErrorStateCallback onError;
Yin-Chia Yehead91462016-01-06 16:45:08 -0800968 found = msg->findPointer(kCallbackFpKey, (void**) &onError);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800969 if (!found) {
970 ALOGE("%s: Cannot find onError!", __FUNCTION__);
971 return;
972 }
973 int errorCode;
974 found = msg->findInt32(kErrorCodeKey, &errorCode);
975 if (!found) {
976 ALOGE("%s: Cannot find error code!", __FUNCTION__);
977 return;
978 }
Yin-Chia Yehead91462016-01-06 16:45:08 -0800979 if (onError == nullptr) {
980 return;
981 }
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -0800982 (*onError)(context, dev, errorCode);
Yin-Chia Yehead91462016-01-06 16:45:08 -0800983 break;
984 }
985 case kWhatSessionStateCb:
986 case kWhatCaptureStart:
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +0000987 case kWhatCaptureStart2:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800988 case kWhatCaptureResult:
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -0800989 case kWhatLogicalCaptureResult:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800990 case kWhatCaptureFail:
Emilian Peevedec62d2019-03-19 17:59:24 -0700991 case kWhatLogicalCaptureFail:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800992 case kWhatCaptureSeqEnd:
993 case kWhatCaptureSeqAbort:
Yin-Chia Yehe081c592016-03-29 18:26:44 -0700994 case kWhatCaptureBufferLost:
Yin-Chia Yehead91462016-01-06 16:45:08 -0800995 {
996 sp<RefBase> obj;
997 found = msg->findObject(kSessionSpKey, &obj);
998 if (!found || obj == nullptr) {
999 ALOGE("%s: Cannot find session pointer!", __FUNCTION__);
1000 return;
1001 }
1002 sp<ACameraCaptureSession> session(static_cast<ACameraCaptureSession*>(obj.get()));
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001003 mCachedSessions.push(session);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001004 sp<CaptureRequest> requestSp = nullptr;
1005 switch (msg->what()) {
1006 case kWhatCaptureStart:
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001007 case kWhatCaptureStart2:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001008 case kWhatCaptureResult:
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001009 case kWhatLogicalCaptureResult:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001010 case kWhatCaptureFail:
Emilian Peevedec62d2019-03-19 17:59:24 -07001011 case kWhatLogicalCaptureFail:
Yin-Chia Yehe081c592016-03-29 18:26:44 -07001012 case kWhatCaptureBufferLost:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001013 found = msg->findObject(kCaptureRequestKey, &obj);
1014 if (!found) {
1015 ALOGE("%s: Cannot find capture request!", __FUNCTION__);
1016 return;
1017 }
1018 requestSp = static_cast<CaptureRequest*>(obj.get());
1019 break;
1020 }
1021
1022 switch (msg->what()) {
1023 case kWhatSessionStateCb:
1024 {
1025 ACameraCaptureSession_stateCallback onState;
1026 found = msg->findPointer(kCallbackFpKey, (void**) &onState);
1027 if (!found) {
1028 ALOGE("%s: Cannot find state callback!", __FUNCTION__);
1029 return;
1030 }
1031 if (onState == nullptr) {
1032 return;
1033 }
1034 (*onState)(context, session.get());
1035 break;
1036 }
1037 case kWhatCaptureStart:
1038 {
1039 ACameraCaptureSession_captureCallback_start onStart;
1040 found = msg->findPointer(kCallbackFpKey, (void**) &onStart);
1041 if (!found) {
1042 ALOGE("%s: Cannot find capture start callback!", __FUNCTION__);
1043 return;
1044 }
1045 if (onStart == nullptr) {
1046 return;
1047 }
1048 int64_t timestamp;
1049 found = msg->findInt64(kTimeStampKey, &timestamp);
1050 if (!found) {
1051 ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
1052 return;
1053 }
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001054 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001055 (*onStart)(context, session.get(), request, timestamp);
1056 freeACaptureRequest(request);
1057 break;
1058 }
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001059 case kWhatCaptureStart2:
1060 {
1061 ACameraCaptureSession_captureCallback_startV2 onStart2;
1062 found = msg->findPointer(kCallbackFpKey, (void**) &onStart2);
1063 if (!found) {
1064 ALOGE("%s: Cannot find capture startV2 callback!", __FUNCTION__);
1065 return;
1066 }
1067 if (onStart2 == nullptr) {
1068 return;
1069 }
1070 int64_t timestamp;
1071 found = msg->findInt64(kTimeStampKey, &timestamp);
1072 if (!found) {
1073 ALOGE("%s: Cannot find timestamp!", __FUNCTION__);
1074 return;
1075 }
1076 int64_t frameNumber;
1077 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1078 if (!found) {
1079 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1080 return;
1081 }
1082
1083 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1084 (*onStart2)(context, session.get(), request, timestamp, frameNumber);
1085 freeACaptureRequest(request);
1086 break;
1087 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001088 case kWhatCaptureResult:
1089 {
1090 ACameraCaptureSession_captureCallback_result onResult;
1091 found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
1092 if (!found) {
1093 ALOGE("%s: Cannot find capture result callback!", __FUNCTION__);
1094 return;
1095 }
1096 if (onResult == nullptr) {
1097 return;
1098 }
1099
1100 found = msg->findObject(kCaptureResultKey, &obj);
1101 if (!found) {
1102 ALOGE("%s: Cannot find capture result!", __FUNCTION__);
1103 return;
1104 }
1105 sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001106 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001107 (*onResult)(context, session.get(), request, result.get());
1108 freeACaptureRequest(request);
1109 break;
1110 }
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001111 case kWhatLogicalCaptureResult:
1112 {
1113 ACameraCaptureSession_logicalCamera_captureCallback_result onResult;
1114 found = msg->findPointer(kCallbackFpKey, (void**) &onResult);
1115 if (!found) {
1116 ALOGE("%s: Cannot find logicalCamera capture result callback!",
1117 __FUNCTION__);
1118 return;
1119 }
1120 if (onResult == nullptr) {
1121 return;
1122 }
1123
1124 found = msg->findObject(kCaptureResultKey, &obj);
1125 if (!found) {
1126 ALOGE("%s: Cannot find capture result!", __FUNCTION__);
1127 return;
1128 }
1129 sp<ACameraMetadata> result(static_cast<ACameraMetadata*>(obj.get()));
1130
1131 found = msg->findObject(kPhysicalCaptureResultKey, &obj);
1132 if (!found) {
1133 ALOGE("%s: Cannot find physical capture result!", __FUNCTION__);
1134 return;
1135 }
1136 sp<ACameraPhysicalCaptureResultInfo> physicalResult(
1137 static_cast<ACameraPhysicalCaptureResultInfo*>(obj.get()));
1138 std::vector<PhysicalCaptureResultInfo>& physicalResultInfo =
1139 physicalResult->mPhysicalResultInfo;
1140
1141 std::vector<std::string> physicalCameraIds;
1142 std::vector<sp<ACameraMetadata>> physicalMetadataCopy;
1143 for (size_t i = 0; i < physicalResultInfo.size(); i++) {
1144 String8 physicalId8(physicalResultInfo[i].mPhysicalCameraId);
1145 physicalCameraIds.push_back(physicalId8.c_str());
1146
1147 CameraMetadata clone = physicalResultInfo[i].mPhysicalCameraMetadata;
1148 clone.update(ANDROID_SYNC_FRAME_NUMBER,
1149 &physicalResult->mFrameNumber, /*data_count*/1);
1150 sp<ACameraMetadata> metadata =
1151 new ACameraMetadata(clone.release(), ACameraMetadata::ACM_RESULT);
1152 physicalMetadataCopy.push_back(metadata);
1153 }
1154
1155 std::vector<const char*> physicalCameraIdPtrs;
1156 std::vector<const ACameraMetadata*> physicalMetadataCopyPtrs;
1157 for (size_t i = 0; i < physicalResultInfo.size(); i++) {
1158 physicalCameraIdPtrs.push_back(physicalCameraIds[i].c_str());
1159 physicalMetadataCopyPtrs.push_back(physicalMetadataCopy[i].get());
1160 }
1161
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001162 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001163 (*onResult)(context, session.get(), request, result.get(),
1164 physicalResultInfo.size(), physicalCameraIdPtrs.data(),
1165 physicalMetadataCopyPtrs.data());
1166 freeACaptureRequest(request);
1167 break;
1168 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001169 case kWhatCaptureFail:
1170 {
1171 ACameraCaptureSession_captureCallback_failed onFail;
1172 found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
1173 if (!found) {
1174 ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
1175 return;
1176 }
1177 if (onFail == nullptr) {
1178 return;
1179 }
1180
1181 found = msg->findObject(kCaptureFailureKey, &obj);
1182 if (!found) {
1183 ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
1184 return;
1185 }
1186 sp<CameraCaptureFailure> failureSp(
1187 static_cast<CameraCaptureFailure*>(obj.get()));
1188 ACameraCaptureFailure* failure =
1189 static_cast<ACameraCaptureFailure*>(failureSp.get());
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001190 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001191 (*onFail)(context, session.get(), request, failure);
1192 freeACaptureRequest(request);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001193 break;
1194 }
Emilian Peevedec62d2019-03-19 17:59:24 -07001195 case kWhatLogicalCaptureFail:
1196 {
1197 ACameraCaptureSession_logicalCamera_captureCallback_failed onFail;
1198 found = msg->findPointer(kCallbackFpKey, (void**) &onFail);
1199 if (!found) {
1200 ALOGE("%s: Cannot find capture fail callback!", __FUNCTION__);
1201 return;
1202 }
1203 if (onFail == nullptr) {
1204 return;
1205 }
1206
1207 found = msg->findObject(kCaptureFailureKey, &obj);
1208 if (!found) {
1209 ALOGE("%s: Cannot find capture failure!", __FUNCTION__);
1210 return;
1211 }
1212 sp<CameraCaptureFailure> failureSp(
1213 static_cast<CameraCaptureFailure*>(obj.get()));
1214 ALogicalCameraCaptureFailure failure;
1215 AString physicalCameraId;
1216 found = msg->findString(kFailingPhysicalCameraId, &physicalCameraId);
1217 if (found && !physicalCameraId.empty()) {
1218 failure.physicalCameraId = physicalCameraId.c_str();
1219 } else {
1220 failure.physicalCameraId = nullptr;
1221 }
1222 failure.captureFailure = *failureSp;
1223 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
1224 (*onFail)(context, session.get(), request, &failure);
1225 freeACaptureRequest(request);
1226 break;
1227 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001228 case kWhatCaptureSeqEnd:
1229 {
1230 ACameraCaptureSession_captureCallback_sequenceEnd onSeqEnd;
1231 found = msg->findPointer(kCallbackFpKey, (void**) &onSeqEnd);
1232 if (!found) {
1233 ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
1234 return;
1235 }
1236 if (onSeqEnd == nullptr) {
1237 return;
1238 }
1239 int seqId;
1240 found = msg->findInt32(kSequenceIdKey, &seqId);
1241 if (!found) {
1242 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1243 return;
1244 }
1245 int64_t frameNumber;
1246 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1247 if (!found) {
1248 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1249 return;
1250 }
1251 (*onSeqEnd)(context, session.get(), seqId, frameNumber);
1252 break;
1253 }
1254 case kWhatCaptureSeqAbort:
1255 {
1256 ACameraCaptureSession_captureCallback_sequenceAbort onSeqAbort;
1257 found = msg->findPointer(kCallbackFpKey, (void**) &onSeqAbort);
1258 if (!found) {
1259 ALOGE("%s: Cannot find sequence end callback!", __FUNCTION__);
1260 return;
1261 }
1262 if (onSeqAbort == nullptr) {
1263 return;
1264 }
1265 int seqId;
1266 found = msg->findInt32(kSequenceIdKey, &seqId);
1267 if (!found) {
1268 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1269 return;
1270 }
1271 (*onSeqAbort)(context, session.get(), seqId);
1272 break;
1273 }
Yin-Chia Yehe081c592016-03-29 18:26:44 -07001274 case kWhatCaptureBufferLost:
1275 {
1276 ACameraCaptureSession_captureCallback_bufferLost onBufferLost;
1277 found = msg->findPointer(kCallbackFpKey, (void**) &onBufferLost);
1278 if (!found) {
1279 ALOGE("%s: Cannot find buffer lost callback!", __FUNCTION__);
1280 return;
1281 }
1282 if (onBufferLost == nullptr) {
1283 return;
1284 }
1285
1286 ANativeWindow* anw;
1287 found = msg->findPointer(kAnwKey, (void**) &anw);
1288 if (!found) {
1289 ALOGE("%s: Cannot find ANativeWindow!", __FUNCTION__);
1290 return;
1291 }
1292
1293 int64_t frameNumber;
1294 found = msg->findInt64(kFrameNumberKey, &frameNumber);
1295 if (!found) {
1296 ALOGE("%s: Cannot find frame number!", __FUNCTION__);
1297 return;
1298 }
1299
Shuzhen Wang6c17e212019-02-19 14:51:47 -08001300 ACaptureRequest* request = allocateACaptureRequest(requestSp, mId);
Yin-Chia Yehe081c592016-03-29 18:26:44 -07001301 (*onBufferLost)(context, session.get(), request, anw, frameNumber);
1302 freeACaptureRequest(request);
1303 break;
1304 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001305 }
1306 break;
1307 }
1308 }
1309}
1310
1311CameraDevice::CallbackHolder::CallbackHolder(
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001312 sp<ACameraCaptureSession> session,
1313 const Vector<sp<CaptureRequest> >& requests,
1314 bool isRepeating,
1315 ACameraCaptureSession_captureCallbacks* cbs) :
1316 mSession(session), mRequests(requests),
1317 mIsRepeating(isRepeating),
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001318 mIsLogicalCameraCallback(false),
1319 mIs2Callback(false) {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001320 initCaptureCallbacks(cbs);
1321
1322 if (cbs != nullptr) {
1323 mOnCaptureCompleted = cbs->onCaptureCompleted;
Emilian Peevedec62d2019-03-19 17:59:24 -07001324 mOnCaptureFailed = cbs->onCaptureFailed;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001325 }
1326}
1327
1328CameraDevice::CallbackHolder::CallbackHolder(
1329 sp<ACameraCaptureSession> session,
1330 const Vector<sp<CaptureRequest> >& requests,
1331 bool isRepeating,
1332 ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs) :
1333 mSession(session), mRequests(requests),
1334 mIsRepeating(isRepeating),
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001335 mIsLogicalCameraCallback(true),
1336 mIs2Callback(false) {
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001337 initCaptureCallbacks(lcbs);
1338
1339 if (lcbs != nullptr) {
1340 mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted;
Emilian Peevedec62d2019-03-19 17:59:24 -07001341 mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001342 }
1343}
Yin-Chia Yehead91462016-01-06 16:45:08 -08001344
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001345CameraDevice::CallbackHolder::CallbackHolder(
1346 sp<ACameraCaptureSession> session,
1347 const Vector<sp<CaptureRequest> >& requests,
1348 bool isRepeating,
1349 ACameraCaptureSession_captureCallbacksV2* cbs) :
1350 mSession(session), mRequests(requests),
1351 mIsRepeating(isRepeating),
1352 mIsLogicalCameraCallback(false),
1353 mIs2Callback(true) {
1354 initCaptureCallbacksV2(cbs);
1355
1356 if (cbs != nullptr) {
1357 mOnCaptureCompleted = cbs->onCaptureCompleted;
1358 mOnCaptureFailed = cbs->onCaptureFailed;
1359 }
1360}
1361
1362CameraDevice::CallbackHolder::CallbackHolder(
1363 sp<ACameraCaptureSession> session,
1364 const Vector<sp<CaptureRequest> >& requests,
1365 bool isRepeating,
1366 ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs) :
1367 mSession(session), mRequests(requests),
1368 mIsRepeating(isRepeating),
1369 mIsLogicalCameraCallback(true),
1370 mIs2Callback(true) {
1371 initCaptureCallbacksV2(lcbs);
1372
1373 if (lcbs != nullptr) {
1374 mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted;
1375 mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed;
1376 }
1377}
1378
Yin-Chia Yehead91462016-01-06 16:45:08 -08001379void
1380CameraDevice::checkRepeatingSequenceCompleteLocked(
1381 const int sequenceId, const int64_t lastFrameNumber) {
1382 ALOGV("Repeating seqId %d lastFrameNumer %" PRId64, sequenceId, lastFrameNumber);
1383 if (lastFrameNumber == NO_FRAMES_CAPTURED) {
1384 if (mSequenceCallbackMap.count(sequenceId) == 0) {
1385 ALOGW("No callback found for sequenceId %d", sequenceId);
1386 return;
1387 }
1388 // remove callback holder from callback map
1389 auto cbIt = mSequenceCallbackMap.find(sequenceId);
1390 CallbackHolder cbh = cbIt->second;
1391 mSequenceCallbackMap.erase(cbIt);
1392 // send seq aborted callback
1393 sp<AMessage> msg = new AMessage(kWhatCaptureSeqAbort, mHandler);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001394 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001395 msg->setObject(kSessionSpKey, cbh.mSession);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001396 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnCaptureSequenceAborted);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001397 msg->setInt32(kSequenceIdKey, sequenceId);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001398 postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001399 } else {
1400 // Use mSequenceLastFrameNumberMap to track
1401 mSequenceLastFrameNumberMap.insert(std::make_pair(sequenceId, lastFrameNumber));
1402
1403 // Last frame might have arrived. Check now
1404 checkAndFireSequenceCompleteLocked();
1405 }
1406}
1407
1408void
1409CameraDevice::checkAndFireSequenceCompleteLocked() {
1410 int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber();
Yin-Chia Yehead91462016-01-06 16:45:08 -08001411 auto it = mSequenceLastFrameNumberMap.begin();
1412 while (it != mSequenceLastFrameNumberMap.end()) {
1413 int sequenceId = it->first;
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001414 int64_t lastFrameNumber = it->second.lastFrameNumber;
1415 bool hasCallback = true;
1416
1417 if (mRemote == nullptr) {
1418 ALOGW("Camera %s closed while checking sequence complete", getId());
1419 return;
1420 }
1421 ALOGV("%s: seq %d's last frame number %" PRId64 ", completed %" PRId64,
1422 __FUNCTION__, sequenceId, lastFrameNumber, completedFrameNumber);
1423 if (!it->second.isSequenceCompleted) {
1424 // Check if there is callback for this sequence
1425 // This should not happen because we always register callback (with nullptr inside)
1426 if (mSequenceCallbackMap.count(sequenceId) == 0) {
1427 ALOGW("No callback found for sequenceId %d", sequenceId);
1428 hasCallback = false;
1429 }
1430
1431 if (lastFrameNumber <= completedFrameNumber) {
1432 ALOGV("Mark sequenceId %d as sequence completed", sequenceId);
1433 it->second.isSequenceCompleted = true;
1434 }
1435
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001436 }
1437
1438 if (it->second.isSequenceCompleted && it->second.isInflightCompleted) {
Shuzhen Wangacae2642020-12-21 17:11:37 -08001439 sendCaptureSequenceCompletedLocked(sequenceId, lastFrameNumber);
1440
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001441 it = mSequenceLastFrameNumberMap.erase(it);
1442 ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId);
1443 } else {
1444 ++it;
1445 }
1446 }
1447}
1448
1449void
1450CameraDevice::removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber) {
1451 auto it = mSequenceLastFrameNumberMap.begin();
1452 while (it != mSequenceLastFrameNumberMap.end()) {
1453 int sequenceId = it->first;
1454 int64_t lastFrameNumber = it->second.lastFrameNumber;
Shuzhen Wang730a7912020-05-07 11:59:02 -07001455
1456 if (mRemote == nullptr) {
1457 ALOGW("Camera %s closed while checking sequence complete", getId());
1458 return;
1459 }
Shuzhen Wang730a7912020-05-07 11:59:02 -07001460
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001461 ALOGV("%s: seq %d's last frame number %" PRId64
1462 ", completed inflight frame number %" PRId64,
1463 __FUNCTION__, sequenceId, lastFrameNumber,
1464 lastCompletedRegularFrameNumber);
1465 if (lastFrameNumber <= lastCompletedRegularFrameNumber) {
1466 if (it->second.isSequenceCompleted) {
Shuzhen Wangacae2642020-12-21 17:11:37 -08001467 sendCaptureSequenceCompletedLocked(sequenceId, lastFrameNumber);
Shuzhen Wang730a7912020-05-07 11:59:02 -07001468
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001469 it = mSequenceLastFrameNumberMap.erase(it);
1470 ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId);
1471 } else {
1472 ALOGV("Mark sequenceId %d as inflight completed", sequenceId);
1473 it->second.isInflightCompleted = true;
1474 ++it;
1475 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001476 } else {
1477 ++it;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001478 }
1479 }
1480}
1481
1482/**
1483 * Camera service callback implementation
1484 */
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001485binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001486CameraDevice::ServiceCallback::onDeviceError(
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001487 int32_t errorCode,
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001488 const CaptureResultExtras& resultExtras) {
1489 ALOGD("Device error received, code %d, frame number %" PRId64 ", request ID %d, subseq ID %d",
1490 errorCode, resultExtras.frameNumber, resultExtras.requestId, resultExtras.burstId);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001491 binder::Status ret = binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001492 sp<CameraDevice> dev = mDevice.promote();
1493 if (dev == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001494 return ret; // device has been closed
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001495 }
1496
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001497 sp<ACameraCaptureSession> session = dev->mCurrentSession.promote();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001498 Mutex::Autolock _l(dev->mDeviceLock);
1499 if (dev->mRemote == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001500 return ret; // device has been closed
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001501 }
1502 switch (errorCode) {
1503 case ERROR_CAMERA_DISCONNECTED:
1504 {
Yin-Chia Yehead91462016-01-06 16:45:08 -08001505 // Camera is disconnected, close the session and expect no more callbacks
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001506 if (session != nullptr) {
1507 session->closeByDevice();
Yin-Chia Yehead91462016-01-06 16:45:08 -08001508 }
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001509 dev->mCurrentSession = nullptr;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001510 sp<AMessage> msg = new AMessage(kWhatOnDisconnected, dev->mHandler);
1511 msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1512 msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
Yin-Chia Yehead91462016-01-06 16:45:08 -08001513 msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onDisconnected);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001514 msg->post();
1515 break;
1516 }
1517 default:
1518 ALOGE("Unknown error from camera device: %d", errorCode);
Chih-Hung Hsiehe6a2f212018-10-16 12:16:31 -07001519 [[fallthrough]];
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001520 case ERROR_CAMERA_DEVICE:
1521 case ERROR_CAMERA_SERVICE:
1522 {
Jayant Chowdhary694cd472018-10-16 12:44:58 -07001523 int32_t errorVal = ::ERROR_CAMERA_DEVICE;
1524 // We keep this switch since this block might be encountered with
1525 // more than just 2 states. The default fallthrough could have us
1526 // handling more unmatched error cases.
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001527 switch (errorCode) {
1528 case ERROR_CAMERA_DEVICE:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001529 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001530 break;
1531 case ERROR_CAMERA_SERVICE:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001532 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
Jayant Chowdhary694cd472018-10-16 12:44:58 -07001533 errorVal = ::ERROR_CAMERA_SERVICE;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001534 break;
1535 default:
Yin-Chia Yehead91462016-01-06 16:45:08 -08001536 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_UNKNOWN);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001537 break;
1538 }
1539 sp<AMessage> msg = new AMessage(kWhatOnError, dev->mHandler);
1540 msg->setPointer(kContextKey, dev->mAppCallbacks.context);
1541 msg->setPointer(kDeviceKey, (void*) dev->getWrapper());
Yin-Chia Yehead91462016-01-06 16:45:08 -08001542 msg->setPointer(kCallbackFpKey, (void*) dev->mAppCallbacks.onError);
Jayant Chowdhary694cd472018-10-16 12:44:58 -07001543 msg->setInt32(kErrorCodeKey, errorVal);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001544 msg->post();
1545 break;
1546 }
1547 case ERROR_CAMERA_REQUEST:
1548 case ERROR_CAMERA_RESULT:
1549 case ERROR_CAMERA_BUFFER:
1550 dev->onCaptureErrorLocked(errorCode, resultExtras);
1551 break;
1552 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001553 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001554}
1555
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001556binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001557CameraDevice::ServiceCallback::onDeviceIdle() {
1558 ALOGV("Camera is now idle");
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001559 binder::Status ret = binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001560 sp<CameraDevice> dev = mDevice.promote();
1561 if (dev == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001562 return ret; // device has been closed
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001563 }
1564
1565 Mutex::Autolock _l(dev->mDeviceLock);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001566 if (dev->isClosed() || dev->mRemote == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001567 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001568 }
Yin-Chia Yehead91462016-01-06 16:45:08 -08001569
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001570 dev->removeCompletedCallbackHolderLocked(
1571 std::numeric_limits<int64_t>::max()/*lastCompletedRegularFrameNumber*/);
1572
Yin-Chia Yehead91462016-01-06 16:45:08 -08001573 if (dev->mIdle) {
1574 // Already in idle state. Possibly other thread did waitUntilIdle
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001575 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001576 }
1577
1578 if (dev->mCurrentSession != nullptr) {
1579 ALOGE("onDeviceIdle sending state cb");
1580 if (dev->mBusySession != dev->mCurrentSession) {
1581 ALOGE("Current session != busy session");
1582 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_DEVICE);
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001583 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001584 }
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001585
Yin-Chia Yehead91462016-01-06 16:45:08 -08001586 sp<AMessage> msg = new AMessage(kWhatSessionStateCb, dev->mHandler);
1587 msg->setPointer(kContextKey, dev->mBusySession->mUserSessionCallback.context);
1588 msg->setObject(kSessionSpKey, dev->mBusySession);
1589 msg->setPointer(kCallbackFpKey, (void*) dev->mBusySession->mUserSessionCallback.onReady);
1590 // Make sure we clear the sp first so the session destructor can
1591 // only happen on handler thread (where we don't hold device/session lock)
1592 dev->mBusySession.clear();
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001593 dev->postSessionMsgAndCleanup(msg);
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001594 }
1595 dev->mIdle = true;
Yin-Chia Yeh309d05d2016-03-28 10:15:31 -07001596 dev->mFlushing = false;
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001597 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001598}
1599
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001600binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001601CameraDevice::ServiceCallback::onCaptureStarted(
1602 const CaptureResultExtras& resultExtras,
1603 int64_t timestamp) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001604 binder::Status ret = binder::Status::ok();
Yin-Chia Yehead91462016-01-06 16:45:08 -08001605 sp<CameraDevice> dev = mDevice.promote();
1606 if (dev == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001607 return ret; // device has been closed
Yin-Chia Yehead91462016-01-06 16:45:08 -08001608 }
1609 Mutex::Autolock _l(dev->mDeviceLock);
1610 if (dev->isClosed() || dev->mRemote == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001611 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001612 }
1613
Shuzhen Wangb7b42652020-05-07 11:59:02 -07001614 dev->removeCompletedCallbackHolderLocked(
1615 resultExtras.lastCompletedRegularFrameNumber);
1616
Yin-Chia Yehead91462016-01-06 16:45:08 -08001617 int sequenceId = resultExtras.requestId;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001618 int32_t burstId = resultExtras.burstId;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001619 int64_t frameNumber = resultExtras.frameNumber;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001620
1621 auto it = dev->mSequenceCallbackMap.find(sequenceId);
1622 if (it != dev->mSequenceCallbackMap.end()) {
1623 CallbackHolder cbh = (*it).second;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001624 bool v2Callback = cbh.mIs2Callback;
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001625 ACameraCaptureSession_captureCallback_start onStart = cbh.mOnCaptureStarted;
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001626 ACameraCaptureSession_captureCallback_startV2 onStart2 = cbh.mOnCaptureStarted2;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001627 sp<ACameraCaptureSession> session = cbh.mSession;
1628 if ((size_t) burstId >= cbh.mRequests.size()) {
1629 ALOGE("%s: Error: request index %d out of bound (size %zu)",
1630 __FUNCTION__, burstId, cbh.mRequests.size());
1631 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1632 }
1633 sp<CaptureRequest> request = cbh.mRequests[burstId];
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001634 sp<AMessage> msg = nullptr;
1635 if (v2Callback) {
1636 msg = new AMessage(kWhatCaptureStart2, dev->mHandler);
1637 msg->setPointer(kCallbackFpKey, (void*) onStart2);
1638 } else {
1639 msg = new AMessage(kWhatCaptureStart, dev->mHandler);
1640 msg->setPointer(kCallbackFpKey, (void *)onStart);
1641 }
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001642 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001643 msg->setObject(kSessionSpKey, session);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001644 msg->setObject(kCaptureRequestKey, request);
1645 msg->setInt64(kTimeStampKey, timestamp);
Jayant Chowdhary04ba13f2022-01-14 00:21:19 +00001646 msg->setInt64(kFrameNumberKey, frameNumber);
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001647 dev->postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001648 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001649 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001650}
1651
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001652binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001653CameraDevice::ServiceCallback::onResultReceived(
1654 const CameraMetadata& metadata,
Shuzhen Wang5c22c152017-12-31 17:12:25 -08001655 const CaptureResultExtras& resultExtras,
1656 const std::vector<PhysicalCaptureResultInfo>& physicalResultInfos) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001657 binder::Status ret = binder::Status::ok();
1658
Yin-Chia Yehead91462016-01-06 16:45:08 -08001659 sp<CameraDevice> dev = mDevice.promote();
1660 if (dev == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001661 return ret; // device has been closed
Yin-Chia Yehead91462016-01-06 16:45:08 -08001662 }
1663 int sequenceId = resultExtras.requestId;
1664 int64_t frameNumber = resultExtras.frameNumber;
1665 int32_t burstId = resultExtras.burstId;
1666 bool isPartialResult = (resultExtras.partialResultCount < dev->mPartialResultCount);
1667
1668 if (!isPartialResult) {
1669 ALOGV("SeqId %d frame %" PRId64 " result arrive.", sequenceId, frameNumber);
1670 }
1671
1672 Mutex::Autolock _l(dev->mDeviceLock);
1673 if (dev->mRemote == nullptr) {
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001674 return ret; // device has been disconnected
Yin-Chia Yehead91462016-01-06 16:45:08 -08001675 }
1676
1677 if (dev->isClosed()) {
1678 if (!isPartialResult) {
1679 dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1680 }
1681 // early return to avoid callback sent to closed devices
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001682 return ret;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001683 }
1684
1685 CameraMetadata metadataCopy = metadata;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001686 metadataCopy.update(ANDROID_LENS_INFO_SHADING_MAP_SIZE, dev->mShadingMapSize, /*data_count*/2);
Yin-Chia Yehff2a4952016-04-02 16:31:57 -07001687 metadataCopy.update(ANDROID_SYNC_FRAME_NUMBER, &frameNumber, /*data_count*/1);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001688
1689 auto it = dev->mSequenceCallbackMap.find(sequenceId);
1690 if (it != dev->mSequenceCallbackMap.end()) {
1691 CallbackHolder cbh = (*it).second;
Yin-Chia Yehead91462016-01-06 16:45:08 -08001692 sp<ACameraCaptureSession> session = cbh.mSession;
1693 if ((size_t) burstId >= cbh.mRequests.size()) {
1694 ALOGE("%s: Error: request index %d out of bound (size %zu)",
1695 __FUNCTION__, burstId, cbh.mRequests.size());
1696 dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE);
1697 }
1698 sp<CaptureRequest> request = cbh.mRequests[burstId];
1699 sp<ACameraMetadata> result(new ACameraMetadata(
1700 metadataCopy.release(), ACameraMetadata::ACM_RESULT));
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001701 sp<ACameraPhysicalCaptureResultInfo> physicalResult(
1702 new ACameraPhysicalCaptureResultInfo(physicalResultInfos, frameNumber));
Yin-Chia Yehead91462016-01-06 16:45:08 -08001703
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001704 sp<AMessage> msg = new AMessage(
1705 cbh.mIsLogicalCameraCallback ? kWhatLogicalCaptureResult : kWhatCaptureResult,
1706 dev->mHandler);
1707 msg->setPointer(kContextKey, cbh.mContext);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001708 msg->setObject(kSessionSpKey, session);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001709 msg->setObject(kCaptureRequestKey, request);
1710 msg->setObject(kCaptureResultKey, result);
Shuzhen Wang0ff9ae32018-12-05 18:06:12 -08001711 if (isPartialResult) {
1712 msg->setPointer(kCallbackFpKey,
1713 (void *)cbh.mOnCaptureProgressed);
1714 } else if (cbh.mIsLogicalCameraCallback) {
1715 msg->setPointer(kCallbackFpKey,
1716 (void *)cbh.mOnLogicalCameraCaptureCompleted);
1717 msg->setObject(kPhysicalCaptureResultKey, physicalResult);
1718 } else {
1719 msg->setPointer(kCallbackFpKey,
1720 (void *)cbh.mOnCaptureCompleted);
1721 }
Yin-Chia Yeh6e2353b2017-10-24 16:35:20 -07001722 dev->postSessionMsgAndCleanup(msg);
Yin-Chia Yehead91462016-01-06 16:45:08 -08001723 }
1724
1725 if (!isPartialResult) {
1726 dev->mFrameNumberTracker.updateTracker(frameNumber, /*isError*/false);
1727 dev->checkAndFireSequenceCompleteLocked();
1728 }
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001729
1730 return ret;
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001731}
1732
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001733binder::Status
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001734CameraDevice::ServiceCallback::onPrepared(int) {
1735 // Prepare not yet implemented in NDK
Eino-Ville Talvalad56db1d2015-12-17 16:50:35 -08001736 return binder::Status::ok();
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001737}
1738
Chien-Yu Chene8c535e2016-04-14 12:18:26 -07001739binder::Status
Shuzhen Wang9d066012016-09-30 11:30:20 -07001740CameraDevice::ServiceCallback::onRequestQueueEmpty() {
1741 // onRequestQueueEmpty not yet implemented in NDK
1742 return binder::Status::ok();
1743}
1744
1745binder::Status
Yin-Chia Yeh8ca23dc2017-09-05 18:15:56 -07001746CameraDevice::ServiceCallback::onRepeatingRequestError(
1747 int64_t lastFrameNumber, int32_t stoppedSequenceId) {
Chien-Yu Chene8c535e2016-04-14 12:18:26 -07001748 binder::Status ret = binder::Status::ok();
1749
1750 sp<CameraDevice> dev = mDevice.promote();
1751 if (dev == nullptr) {
1752 return ret; // device has been closed
1753 }
1754
1755 Mutex::Autolock _l(dev->mDeviceLock);
1756
1757 int repeatingSequenceId = dev->mRepeatingSequenceId;
Yin-Chia Yeh8ca23dc2017-09-05 18:15:56 -07001758 if (stoppedSequenceId == repeatingSequenceId) {
1759 dev->mRepeatingSequenceId = REQUEST_ID_NONE;
1760 }
Chien-Yu Chene8c535e2016-04-14 12:18:26 -07001761
1762 dev->checkRepeatingSequenceCompleteLocked(repeatingSequenceId, lastFrameNumber);
1763
1764 return ret;
1765}
1766
Shuzhen Wangacae2642020-12-21 17:11:37 -08001767void
1768CameraDevice::sendCaptureSequenceCompletedLocked(int sequenceId, int64_t lastFrameNumber) {
1769 auto cbIt = mSequenceCallbackMap.find(sequenceId);
1770 if (cbIt != mSequenceCallbackMap.end()) {
1771 CallbackHolder cbh = cbIt->second;
1772 mSequenceCallbackMap.erase(cbIt);
1773
1774 // send seq complete callback
1775 sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler);
1776 msg->setPointer(kContextKey, cbh.mContext);
1777 msg->setObject(kSessionSpKey, cbh.mSession);
1778 msg->setPointer(kCallbackFpKey, (void*) cbh.mOnCaptureSequenceCompleted);
1779 msg->setInt32(kSequenceIdKey, sequenceId);
1780 msg->setInt64(kFrameNumberKey, lastFrameNumber);
1781
1782 // Clear the session sp before we send out the message
1783 // This will guarantee the rare case where the message is processed
1784 // before cbh goes out of scope and causing we call the session
1785 // destructor while holding device lock
1786 cbh.mSession.clear();
1787 postSessionMsgAndCleanup(msg);
1788 } else {
1789 // Check if there is callback for this sequence
1790 // This should not happen because we always register callback (with nullptr inside)
1791 ALOGW("No callback found for sequenceId %d", sequenceId);
1792 }
1793}
1794
Jayant Chowdhary6df26072018-11-06 23:55:12 -08001795} // namespace acam
Yin-Chia Yeh0dea57f2015-12-09 16:46:07 -08001796} // namespace android