1 /*
2 * Copyright (C) 2022 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_TAG "AidlCamera3-Device"
18 #define ATRACE_TAG ATRACE_TAG_CAMERA
19 //#define LOG_NDEBUG 0
20 //#define LOG_NNDEBUG 0 // Per-frame verbose logging
21
22 #ifdef LOG_NNDEBUG
23 #define ALOGVV(...) ALOGV(__VA_ARGS__)
24 #else
25 #define ALOGVV(...) ((void)0)
26 #endif
27
28 // Convenience macro for transient errors
29 #define CLOGE(fmt, ...) ALOGE("Camera %s: %s: " fmt, mId.string(), __FUNCTION__, \
30 ##__VA_ARGS__)
31
32 #define CLOGW(fmt, ...) ALOGW("Camera %s: %s: " fmt, mId.string(), __FUNCTION__, \
33 ##__VA_ARGS__)
34
35 // Convenience macros for transitioning to the error state
36 #define SET_ERR(fmt, ...) setErrorState( \
37 "%s: " fmt, __FUNCTION__, \
38 ##__VA_ARGS__)
39 #define SET_ERR_L(fmt, ...) setErrorStateLocked( \
40 "%s: " fmt, __FUNCTION__, \
41 ##__VA_ARGS__)
42
43 #include <inttypes.h>
44
45 #include <utility>
46
47 #include <utils/Log.h>
48 #include <utils/Trace.h>
49 #include <utils/Timers.h>
50 #include <cutils/properties.h>
51
52 #include <aidl/android/hardware/camera/device/ICameraInjectionSession.h>
53 #include <aidlcommonsupport/NativeHandle.h>
54 #include <android/binder_ibinder_platform.h>
55 #include <android/hardware/camera2/ICameraDeviceUser.h>
56
57 #include "utils/CameraTraces.h"
58 #include "mediautils/SchedulingPolicyService.h"
59 #include "device3/Camera3OutputStream.h"
60 #include "device3/Camera3InputStream.h"
61 #include "device3/Camera3FakeStream.h"
62 #include "device3/Camera3SharedOutputStream.h"
63 #include "device3/aidl/AidlCamera3OutputUtils.h"
64 #include "device3/aidl/AidlCamera3OfflineSession.h"
65 #include "CameraService.h"
66 #include "utils/CameraThreadState.h"
67 #include "utils/SessionConfigurationUtils.h"
68 #include "utils/TraceHFR.h"
69 #include "utils/CameraServiceProxyWrapper.h"
70
71 #include "../../common/aidl/AidlProviderInfo.h"
72
73 #include <algorithm>
74
75 #include "AidlCamera3Device.h"
76
77 using namespace android::camera3;
78 using namespace aidl::android::hardware;
79 using aidl::android::hardware::camera::metadata::SensorPixelMode;
80 using aidl::android::hardware::camera::metadata::RequestAvailableDynamicRangeProfilesMap;
81 using aidl::android::hardware::camera::metadata::ScalerAvailableStreamUseCases;
82
83 namespace android {
84
85 RequestAvailableDynamicRangeProfilesMap
mapToAidlDynamicProfile(int64_t dynamicRangeProfile)86 mapToAidlDynamicProfile(int64_t dynamicRangeProfile) {
87 return static_cast<RequestAvailableDynamicRangeProfilesMap>(dynamicRangeProfile);
88 }
89
mapToAidlPixelFormat(int frameworkFormat)90 aidl::android::hardware::graphics::common::PixelFormat AidlCamera3Device::mapToAidlPixelFormat(
91 int frameworkFormat) {
92 return (aidl::android::hardware::graphics::common::PixelFormat) frameworkFormat;
93 }
94
mapToAidlDataspace(android_dataspace dataSpace)95 aidl::android::hardware::graphics::common::Dataspace AidlCamera3Device::mapToAidlDataspace(
96 android_dataspace dataSpace) {
97 return (aidl::android::hardware::graphics::common::Dataspace)dataSpace;
98 }
99
mapToAidlConsumerUsage(uint64_t usage)100 aidl::android::hardware::graphics::common::BufferUsage AidlCamera3Device::mapToAidlConsumerUsage(
101 uint64_t usage) {
102 return (aidl::android::hardware::graphics::common::BufferUsage)usage;
103 }
104
105 aidl::android::hardware::camera::device::StreamRotation
mapToAidlStreamRotation(camera_stream_rotation_t rotation)106 AidlCamera3Device::mapToAidlStreamRotation(camera_stream_rotation_t rotation) {
107 switch (rotation) {
108 case CAMERA_STREAM_ROTATION_0:
109 return aidl::android::hardware::camera::device::StreamRotation::ROTATION_0;
110 case CAMERA_STREAM_ROTATION_90:
111 return aidl::android::hardware::camera::device::StreamRotation::ROTATION_90;
112 case CAMERA_STREAM_ROTATION_180:
113 return aidl::android::hardware::camera::device::StreamRotation::ROTATION_180;
114 case CAMERA_STREAM_ROTATION_270:
115 return aidl::android::hardware::camera::device::StreamRotation::ROTATION_270;
116 }
117 ALOGE("%s: Unknown stream rotation %d", __FUNCTION__, rotation);
118 return aidl::android::hardware::camera::device::StreamRotation::ROTATION_0;
119 }
120
mapToAidlStreamConfigurationMode(camera_stream_configuration_mode_t operationMode,aidl::android::hardware::camera::device::StreamConfigurationMode * mode)121 status_t AidlCamera3Device::mapToAidlStreamConfigurationMode(
122 camera_stream_configuration_mode_t operationMode,
123 aidl::android::hardware::camera::device::StreamConfigurationMode *mode) {
124 using StreamConfigurationMode =
125 aidl::android::hardware::camera::device::StreamConfigurationMode;
126 if (mode == nullptr) return BAD_VALUE;
127 if (operationMode < CAMERA_VENDOR_STREAM_CONFIGURATION_MODE_START) {
128 switch(operationMode) {
129 case CAMERA_STREAM_CONFIGURATION_NORMAL_MODE:
130 *mode = StreamConfigurationMode::NORMAL_MODE;
131 break;
132 case CAMERA_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE:
133 *mode = StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE;
134 break;
135 default:
136 ALOGE("%s: Unknown stream configuration mode %d", __FUNCTION__, operationMode);
137 return BAD_VALUE;
138 }
139 } else {
140 *mode = static_cast<StreamConfigurationMode>(operationMode);
141 }
142 return OK;
143 }
144
mapToFrameworkFormat(aidl::android::hardware::graphics::common::PixelFormat pixelFormat)145 int AidlCamera3Device::mapToFrameworkFormat(
146 aidl::android::hardware::graphics::common::PixelFormat pixelFormat) {
147 return static_cast<uint32_t>(pixelFormat);
148 }
149
mapToFrameworkDataspace(aidl::android::hardware::graphics::common::Dataspace dataSpace)150 android_dataspace AidlCamera3Device::mapToFrameworkDataspace(
151 aidl::android::hardware::graphics::common::Dataspace dataSpace) {
152 return static_cast<android_dataspace>(dataSpace);
153 }
154
mapConsumerToFrameworkUsage(aidl::android::hardware::graphics::common::BufferUsage usage)155 uint64_t AidlCamera3Device::mapConsumerToFrameworkUsage(
156 aidl::android::hardware::graphics::common::BufferUsage usage) {
157 return (uint64_t)usage;
158 }
159
mapProducerToFrameworkUsage(aidl::android::hardware::graphics::common::BufferUsage usage)160 uint64_t AidlCamera3Device::mapProducerToFrameworkUsage(
161 aidl::android::hardware::graphics::common::BufferUsage usage) {
162 return (uint64_t)usage;
163 }
164
AidlCamera3Device(const String8 & id,bool overrideForPerfClass,bool overrideToPortrait,bool legacyClient)165 AidlCamera3Device::AidlCamera3Device(const String8& id, bool overrideForPerfClass,
166 bool overrideToPortrait, bool legacyClient) :
167 Camera3Device(id, overrideForPerfClass, overrideToPortrait, legacyClient) {
168 mCallbacks = ndk::SharedRefBase::make<AidlCameraDeviceCallbacks>(this);
169 }
170
initialize(sp<CameraProviderManager> manager,const String8 & monitorTags)171 status_t AidlCamera3Device::initialize(sp<CameraProviderManager> manager,
172 const String8& monitorTags) {
173 ATRACE_CALL();
174 Mutex::Autolock il(mInterfaceLock);
175 Mutex::Autolock l(mLock);
176
177 ALOGV("%s: Initializing AIDL device for camera %s", __FUNCTION__, mId.string());
178 if (mStatus != STATUS_UNINITIALIZED) {
179 CLOGE("Already initialized!");
180 return INVALID_OPERATION;
181 }
182 if (manager == nullptr) return INVALID_OPERATION;
183
184 std::shared_ptr<camera::device::ICameraDeviceSession> session;
185 ATRACE_BEGIN("CameraHal::openSession");
186 status_t res = manager->openAidlSession(mId.string(), mCallbacks,
187 /*out*/ &session);
188 ATRACE_END();
189 if (res != OK) {
190 SET_ERR_L("Could not open camera session: %s (%d)", strerror(-res), res);
191 return res;
192 }
193 if (session == nullptr) {
194 SET_ERR("Session iface returned is null");
195 return INVALID_OPERATION;
196 }
197 res = manager->getCameraCharacteristics(mId.string(), mOverrideForPerfClass, &mDeviceInfo,
198 mOverrideToPortrait);
199 if (res != OK) {
200 SET_ERR_L("Could not retrieve camera characteristics: %s (%d)", strerror(-res), res);
201 session->close();
202 return res;
203 }
204 mSupportNativeZoomRatio = manager->supportNativeZoomRatio(mId.string());
205
206 std::vector<std::string> physicalCameraIds;
207 bool isLogical = manager->isLogicalCamera(mId.string(), &physicalCameraIds);
208 if (isLogical) {
209 for (auto& physicalId : physicalCameraIds) {
210 // Do not override characteristics for physical cameras
211 res = manager->getCameraCharacteristics(
212 physicalId, /*overrideForPerfClass*/false, &mPhysicalDeviceInfoMap[physicalId],
213 mOverrideToPortrait);
214 if (res != OK) {
215 SET_ERR_L("Could not retrieve camera %s characteristics: %s (%d)",
216 physicalId.c_str(), strerror(-res), res);
217 session->close();
218 return res;
219 }
220
221 bool usePrecorrectArray =
222 DistortionMapper::isDistortionSupported(mPhysicalDeviceInfoMap[physicalId]);
223 if (usePrecorrectArray) {
224 res = mDistortionMappers[physicalId].setupStaticInfo(
225 mPhysicalDeviceInfoMap[physicalId]);
226 if (res != OK) {
227 SET_ERR_L("Unable to read camera %s's calibration fields for distortion "
228 "correction", physicalId.c_str());
229 session->close();
230 return res;
231 }
232 }
233
234 mZoomRatioMappers[physicalId] = ZoomRatioMapper(
235 &mPhysicalDeviceInfoMap[physicalId],
236 mSupportNativeZoomRatio, usePrecorrectArray);
237
238 if (SessionConfigurationUtils::isUltraHighResolutionSensor(
239 mPhysicalDeviceInfoMap[physicalId])) {
240 mUHRCropAndMeteringRegionMappers[physicalId] =
241 UHRCropAndMeteringRegionMapper(mPhysicalDeviceInfoMap[physicalId],
242 usePrecorrectArray);
243 }
244 }
245 }
246
247 std::shared_ptr<AidlRequestMetadataQueue> queue;
248 ::aidl::android::hardware::common::fmq::MQDescriptor<
249 int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite> desc;
250
251 ::ndk::ScopedAStatus requestQueueRet = session->getCaptureRequestMetadataQueue(&desc);
252 if (!requestQueueRet.isOk()) {
253 ALOGE("Transaction error when getting result metadata queue from camera session: %s",
254 requestQueueRet.getMessage());
255 return AidlProviderInfo::mapToStatusT(requestQueueRet);
256 }
257 queue = std::make_unique<AidlRequestMetadataQueue>(desc);
258 if (!queue->isValid() || queue->availableToWrite() <= 0) {
259 ALOGE("HAL returns empty result metadata fmq, not use it");
260 queue = nullptr;
261 // Don't use resQueue onwards.
262 }
263
264 std::unique_ptr<AidlResultMetadataQueue>& resQueue = mResultMetadataQueue;
265 ::aidl::android::hardware::common::fmq::MQDescriptor<
266 int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite> resDesc;
267 ::ndk::ScopedAStatus resultQueueRet = session->getCaptureResultMetadataQueue(&resDesc);
268 if (!resultQueueRet.isOk()) {
269 ALOGE("Transaction error when getting result metadata queue from camera session: %s",
270 resultQueueRet.getMessage());
271 return AidlProviderInfo::mapToStatusT(resultQueueRet);
272 }
273 resQueue = std::make_unique<AidlResultMetadataQueue>(resDesc);
274 if (!resQueue->isValid() || resQueue->availableToWrite() <= 0) {
275 ALOGE("HAL returns empty result metadata fmq, not use it");
276 resQueue = nullptr;
277 // Don't use resQueue onwards.
278 }
279
280 camera_metadata_entry bufMgrMode =
281 mDeviceInfo.find(ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION);
282 if (bufMgrMode.count > 0) {
283 mUseHalBufManager = (bufMgrMode.data.u8[0] ==
284 ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5);
285 }
286
287 camera_metadata_entry_t capabilities = mDeviceInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
288 for (size_t i = 0; i < capabilities.count; i++) {
289 uint8_t capability = capabilities.data.u8[i];
290 if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_OFFLINE_PROCESSING) {
291 mSupportOfflineProcessing = true;
292 }
293 }
294
295 mInterface = new AidlHalInterface(session, queue, mUseHalBufManager, mSupportOfflineProcessing);
296
297 std::string providerType;
298 mVendorTagId = manager->getProviderTagIdLocked(mId.string());
299 mTagMonitor.initialize(mVendorTagId);
300 if (!monitorTags.isEmpty()) {
301 mTagMonitor.parseTagsToMonitor(String8(monitorTags));
302 }
303
304 for (size_t i = 0; i < capabilities.count; i++) {
305 uint8_t capability = capabilities.data.u8[i];
306 if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) {
307 mNeedFixupMonochromeTags = true;
308 }
309 }
310
311 return initializeCommonLocked();
312 }
313
processCaptureResult(const std::vector<camera::device::CaptureResult> & results)314 ::ndk::ScopedAStatus AidlCamera3Device::AidlCameraDeviceCallbacks::processCaptureResult(
315 const std::vector<camera::device::CaptureResult>& results) {
316 sp<AidlCamera3Device> p = mParent.promote();
317 if (p == nullptr) {
318 ALOGE("%s Parent AidlCameraDevice not alive, can't process callbacks", __FUNCTION__);
319 return ::ndk::ScopedAStatus::ok();
320 }
321 return p->processCaptureResult(results);
322 }
323
notify(const std::vector<camera::device::NotifyMsg> & msgs)324 ::ndk::ScopedAStatus AidlCamera3Device::AidlCameraDeviceCallbacks::notify(
325 const std::vector<camera::device::NotifyMsg>& msgs) {
326 sp<AidlCamera3Device> p = mParent.promote();
327 if (p == nullptr) {
328 ALOGE("%s Parent AidlCameraDevice not alive, can't process callbacks", __FUNCTION__);
329 return ::ndk::ScopedAStatus::ok();
330 }
331 return p->notify(msgs);
332 }
333
processCaptureResult(const std::vector<camera::device::CaptureResult> & results)334 ::ndk::ScopedAStatus AidlCamera3Device::processCaptureResult(
335 const std::vector<camera::device::CaptureResult>& results) {
336 // Ideally we should grab mLock, but that can lead to deadlock, and
337 // it's not super important to get up to date value of mStatus for this
338 // warning print, hence skipping the lock here
339 if (mStatus == STATUS_ERROR) {
340 // Per API contract, HAL should act as closed after device error
341 // But mStatus can be set to error by framework as well, so just log
342 // a warning here.
343 ALOGW("%s: received capture result in error state.", __FUNCTION__);
344 }
345
346 sp<NotificationListener> listener;
347 {
348 std::lock_guard<std::mutex> l(mOutputLock);
349 listener = mListener.promote();
350 }
351
352 if (mProcessCaptureResultLock.tryLock() != OK) {
353 // This should never happen; it indicates a wrong client implementation
354 // that doesn't follow the contract. But, we can be tolerant here.
355 ALOGE("%s: callback overlapped! waiting 1s...",
356 __FUNCTION__);
357 if (mProcessCaptureResultLock.timedLock(1000000000 /* 1s */) != OK) {
358 ALOGE("%s: cannot acquire lock in 1s, dropping results",
359 __FUNCTION__);
360 // really don't know what to do, so bail out.
361 return ::ndk::ScopedAStatus::ok();
362 }
363 }
364 AidlCaptureOutputStates states {
365 {
366 mId,
367 mInFlightLock, mLastCompletedRegularFrameNumber,
368 mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber,
369 mInFlightMap, mOutputLock, mResultQueue, mResultSignal,
370 mNextShutterFrameNumber,
371 mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
372 mNextResultFrameNumber,
373 mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
374 mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
375 mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
376 mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
377 mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this,
378 *this, *(mInterface), mLegacyClient, mMinExpectedDuration, mIsFixedFps,
379 mOverrideToPortrait, mActivePhysicalId}, mResultMetadataQueue
380 };
381
382 for (const auto& result : results) {
383 processOneCaptureResultLocked(states, result, result.physicalCameraMetadata);
384 }
385 mProcessCaptureResultLock.unlock();
386 return ::ndk::ScopedAStatus::ok();
387 }
388
notify(const std::vector<camera::device::NotifyMsg> & msgs)389 ::ndk::ScopedAStatus AidlCamera3Device::notify(
390 const std::vector<camera::device::NotifyMsg>& msgs) {
391 // Ideally we should grab mLock, but that can lead to deadlock, and
392 // it's not super important to get up to date value of mStatus for this
393 // warning print, hence skipping the lock here
394 if (mStatus == STATUS_ERROR) {
395 // Per API contract, HAL should act as closed after device error
396 // But mStatus can be set to error by framework as well, so just log
397 // a warning here.
398 ALOGW("%s: received notify message in error state.", __FUNCTION__);
399 }
400
401 sp<NotificationListener> listener;
402 {
403 std::lock_guard<std::mutex> l(mOutputLock);
404 listener = mListener.promote();
405 }
406
407 AidlCaptureOutputStates states {
408 { mId,
409 mInFlightLock, mLastCompletedRegularFrameNumber,
410 mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber,
411 mInFlightMap, mOutputLock, mResultQueue, mResultSignal,
412 mNextShutterFrameNumber,
413 mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
414 mNextResultFrameNumber,
415 mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber,
416 mUseHalBufManager, mUsePartialResult, mNeedFixupMonochromeTags,
417 mNumPartialResults, mVendorTagId, mDeviceInfo, mPhysicalDeviceInfoMap,
418 mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers,
419 mTagMonitor, mInputStream, mOutputStreams, mSessionStatsBuilder, listener, *this,
420 *this, *(mInterface), mLegacyClient, mMinExpectedDuration, mIsFixedFps,
421 mOverrideToPortrait, mActivePhysicalId}, mResultMetadataQueue
422 };
423 for (const auto& msg : msgs) {
424 camera3::notify(states, msg);
425 }
426 return ::ndk::ScopedAStatus::ok();
427
428 }
429
switchToOffline(const std::vector<int32_t> & streamsToKeep,sp<CameraOfflineSessionBase> * session)430 status_t AidlCamera3Device::switchToOffline(
431 const std::vector<int32_t>& streamsToKeep,
432 /*out*/ sp<CameraOfflineSessionBase>* session) {
433 ATRACE_CALL();
434 if (session == nullptr) {
435 ALOGE("%s: session must not be null", __FUNCTION__);
436 return BAD_VALUE;
437 }
438
439 Mutex::Autolock il(mInterfaceLock);
440
441 bool hasInputStream = mInputStream != nullptr;
442 int32_t inputStreamId = hasInputStream ? mInputStream->getId() : -1;
443 bool inputStreamSupportsOffline = hasInputStream ?
444 mInputStream->getOfflineProcessingSupport() : false;
445 auto outputStreamIds = mOutputStreams.getStreamIds();
446 auto streamIds = outputStreamIds;
447 if (hasInputStream) {
448 streamIds.push_back(mInputStream->getId());
449 }
450
451 // Check all streams in streamsToKeep supports offline mode
452 for (auto id : streamsToKeep) {
453 if (std::find(streamIds.begin(), streamIds.end(), id) == streamIds.end()) {
454 ALOGE("%s: Unknown stream ID %d", __FUNCTION__, id);
455 return BAD_VALUE;
456 } else if (id == inputStreamId) {
457 if (!inputStreamSupportsOffline) {
458 ALOGE("%s: input stream %d cannot be switched to offline",
459 __FUNCTION__, id);
460 return BAD_VALUE;
461 }
462 } else {
463 sp<camera3::Camera3OutputStreamInterface> stream = mOutputStreams.get(id);
464 if (!stream->getOfflineProcessingSupport()) {
465 ALOGE("%s: output stream %d cannot be switched to offline",
466 __FUNCTION__, id);
467 return BAD_VALUE;
468 }
469 }
470 }
471 // TODO: block surface sharing and surface group streams until we can support them
472
473 // Stop repeating request, wait until all remaining requests are submitted, then call into
474 // HAL switchToOffline
475 camera::device::CameraOfflineSessionInfo offlineSessionInfo;
476 std::shared_ptr<camera::device::ICameraOfflineSession> offlineSession;
477 camera3::BufferRecords bufferRecords;
478 status_t ret = static_cast<AidlRequestThread *>(mRequestThread.get())->switchToOffline(
479 streamsToKeep, &offlineSessionInfo, &offlineSession, &bufferRecords);
480
481 if (ret != OK) {
482 SET_ERR("Switch to offline failed: %s (%d)", strerror(-ret), ret);
483 return ret;
484 }
485
486 bool succ = mRequestBufferSM.onSwitchToOfflineSuccess();
487 if (!succ) {
488 SET_ERR("HAL must not be calling requestStreamBuffers call");
489 // TODO: block ALL callbacks from HAL till app configured new streams?
490 return UNKNOWN_ERROR;
491 }
492
493 // Verify offlineSessionInfo
494 std::vector<int32_t> offlineStreamIds;
495 offlineStreamIds.reserve(offlineSessionInfo.offlineStreams.size());
496 for (auto offlineStream : offlineSessionInfo.offlineStreams) {
497 // verify stream IDs
498 int32_t id = offlineStream.id;
499 if (std::find(streamIds.begin(), streamIds.end(), id) == streamIds.end()) {
500 SET_ERR("stream ID %d not found!", id);
501 return UNKNOWN_ERROR;
502 }
503
504 // When not using HAL buf manager, only allow streams requested by app to be preserved
505 if (!mUseHalBufManager) {
506 if (std::find(streamsToKeep.begin(), streamsToKeep.end(), id) == streamsToKeep.end()) {
507 SET_ERR("stream ID %d must not be switched to offline!", id);
508 return UNKNOWN_ERROR;
509 }
510 }
511
512 offlineStreamIds.push_back(id);
513 sp<Camera3StreamInterface> stream = (id == inputStreamId) ?
514 static_cast<sp<Camera3StreamInterface>>(mInputStream) :
515 static_cast<sp<Camera3StreamInterface>>(mOutputStreams.get(id));
516 // Verify number of outstanding buffers
517 if (stream->getOutstandingBuffersCount() != (uint32_t)offlineStream.numOutstandingBuffers) {
518 SET_ERR("Offline stream %d # of remaining buffer mismatch: (%zu,%d) (service/HAL)",
519 id, stream->getOutstandingBuffersCount(), offlineStream.numOutstandingBuffers);
520 return UNKNOWN_ERROR;
521 }
522 }
523
524 // Verify all streams to be deleted don't have any outstanding buffers
525 if (hasInputStream && std::find(offlineStreamIds.begin(), offlineStreamIds.end(),
526 inputStreamId) == offlineStreamIds.end()) {
527 if (mInputStream->hasOutstandingBuffers()) {
528 SET_ERR("Input stream %d still has %zu outstanding buffer!",
529 inputStreamId, mInputStream->getOutstandingBuffersCount());
530 return UNKNOWN_ERROR;
531 }
532 }
533
534 for (const auto& outStreamId : outputStreamIds) {
535 if (std::find(offlineStreamIds.begin(), offlineStreamIds.end(),
536 outStreamId) == offlineStreamIds.end()) {
537 auto outStream = mOutputStreams.get(outStreamId);
538 if (outStream->hasOutstandingBuffers()) {
539 SET_ERR("Output stream %d still has %zu outstanding buffer!",
540 outStreamId, outStream->getOutstandingBuffersCount());
541 return UNKNOWN_ERROR;
542 }
543 }
544 }
545
546 InFlightRequestMap offlineReqs;
547 // Verify inflight requests and their pending buffers
548 {
549 std::lock_guard<std::mutex> l(mInFlightLock);
550 for (auto offlineReq : offlineSessionInfo.offlineRequests) {
551 int idx = mInFlightMap.indexOfKey(offlineReq.frameNumber);
552 if (idx == NAME_NOT_FOUND) {
553 SET_ERR("Offline request frame number %d not found!", offlineReq.frameNumber);
554 return UNKNOWN_ERROR;
555 }
556
557 const auto& inflightReq = mInFlightMap.valueAt(idx);
558 // TODO: check specific stream IDs
559 size_t numBuffersLeft = static_cast<size_t>(inflightReq.numBuffersLeft);
560 if (numBuffersLeft != offlineReq.pendingStreams.size()) {
561 SET_ERR("Offline request # of remaining buffer mismatch: (%d,%d) (service/HAL)",
562 inflightReq.numBuffersLeft, offlineReq.pendingStreams.size());
563 return UNKNOWN_ERROR;
564 }
565 offlineReqs.add(offlineReq.frameNumber, inflightReq);
566 }
567 }
568
569 // Create Camera3OfflineSession and transfer object ownership
570 // (streams, inflight requests, buffer caches)
571 camera3::StreamSet offlineStreamSet;
572 sp<camera3::Camera3Stream> inputStream;
573 for (auto offlineStream : offlineSessionInfo.offlineStreams) {
574 int32_t id = offlineStream.id;
575 if (mInputStream != nullptr && id == mInputStream->getId()) {
576 inputStream = mInputStream;
577 } else {
578 offlineStreamSet.add(id, mOutputStreams.get(id));
579 }
580 }
581
582 // TODO: check if we need to lock before copying states
583 // though technically no other thread should be talking to Camera3Device at this point
584 Camera3OfflineStates offlineStates(
585 mTagMonitor, mVendorTagId, mUseHalBufManager, mNeedFixupMonochromeTags,
586 mUsePartialResult, mNumPartialResults, mLastCompletedRegularFrameNumber,
587 mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber,
588 mNextResultFrameNumber, mNextReprocessResultFrameNumber,
589 mNextZslStillResultFrameNumber, mNextShutterFrameNumber,
590 mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber,
591 mDeviceInfo, mPhysicalDeviceInfoMap, mDistortionMappers,
592 mZoomRatioMappers, mRotateAndCropMappers);
593
594 *session = new AidlCamera3OfflineSession(mId, inputStream, offlineStreamSet,
595 std::move(bufferRecords), offlineReqs, offlineStates, offlineSession);
596
597 // Delete all streams that has been transferred to offline session
598 Mutex::Autolock l(mLock);
599 for (auto offlineStream : offlineSessionInfo.offlineStreams) {
600 int32_t id = offlineStream.id;
601 if (mInputStream != nullptr && id == mInputStream->getId()) {
602 mInputStream.clear();
603 } else {
604 mOutputStreams.remove(id);
605 }
606 }
607
608 // disconnect all other streams and switch to UNCONFIGURED state
609 if (mInputStream != nullptr) {
610 ret = mInputStream->disconnect();
611 if (ret != OK) {
612 SET_ERR_L("disconnect input stream failed!");
613 return UNKNOWN_ERROR;
614 }
615 }
616
617 for (auto streamId : mOutputStreams.getStreamIds()) {
618 sp<Camera3StreamInterface> stream = mOutputStreams.get(streamId);
619 ret = stream->disconnect();
620 if (ret != OK) {
621 SET_ERR_L("disconnect output stream %d failed!", streamId);
622 return UNKNOWN_ERROR;
623 }
624 }
625
626 mInputStream.clear();
627 mOutputStreams.clear();
628 mNeedConfig = true;
629 internalUpdateStatusLocked(STATUS_UNCONFIGURED);
630 mOperatingMode = NO_MODE;
631 mIsConstrainedHighSpeedConfiguration = false;
632 mRequestThread->clearPreviousRequest();
633
634 return OK;
635 // TO be done by CameraDeviceClient/Camera3OfflineSession
636 // register the offline client to camera service
637 // Setup result passthing threads etc
638 // Initialize offline session so HAL can start sending callback to it (result Fmq)
639 // TODO: check how many onIdle callback will be sent
640 // Java side to make sure the CameraCaptureSession is properly closed
641 }
642
requestStreamBuffers(const std::vector<camera::device::BufferRequest> & bufReqs,std::vector<aidl::android::hardware::camera::device::StreamBufferRet> * outBuffers,aidl::android::hardware::camera::device::BufferRequestStatus * status)643 ::ndk::ScopedAStatus AidlCamera3Device::AidlCameraDeviceCallbacks::requestStreamBuffers(
644 const std::vector<camera::device::BufferRequest>& bufReqs,
645 std::vector<aidl::android::hardware::camera::device::StreamBufferRet>* outBuffers,
646 aidl::android::hardware::camera::device::BufferRequestStatus* status) {
647
648 sp<AidlCamera3Device> p = mParent.promote();
649 if (p == nullptr) {
650 ALOGE("%s Parent AidlCameraDevice not alive, can't process callbacks", __FUNCTION__);
651 return ::ndk::ScopedAStatus::ok();
652 }
653 return p->requestStreamBuffers(bufReqs, outBuffers, status);
654 }
655
requestStreamBuffers(const std::vector<camera::device::BufferRequest> & bufReqs,std::vector<aidl::android::hardware::camera::device::StreamBufferRet> * outBuffers,aidl::android::hardware::camera::device::BufferRequestStatus * status)656 ::ndk::ScopedAStatus AidlCamera3Device::requestStreamBuffers(
657 const std::vector<camera::device::BufferRequest>& bufReqs,
658 std::vector<aidl::android::hardware::camera::device::StreamBufferRet>* outBuffers,
659 aidl::android::hardware::camera::device::BufferRequestStatus* status) {
660
661 RequestBufferStates states {
662 mId, mRequestBufferInterfaceLock, mUseHalBufManager, mOutputStreams,
663 mSessionStatsBuilder, *this, *(mInterface), *this};
664 camera3::requestStreamBuffers(states, bufReqs, outBuffers, status);
665 return ::ndk::ScopedAStatus::ok();
666 }
667
returnStreamBuffers(const std::vector<camera::device::StreamBuffer> & buffers)668 ::ndk::ScopedAStatus AidlCamera3Device::AidlCameraDeviceCallbacks::returnStreamBuffers(
669 const std::vector<camera::device::StreamBuffer>& buffers) {
670 sp<AidlCamera3Device> p = mParent.promote();
671 if (p == nullptr) {
672 ALOGE("%s Parent AidlCameraDevice not alive, can't process callbacks", __FUNCTION__);
673 return ::ndk::ScopedAStatus::ok();
674 }
675 return p->returnStreamBuffers(buffers);
676 }
677
createBinder()678 ::ndk::SpAIBinder AidlCamera3Device::AidlCameraDeviceCallbacks::createBinder() {
679 auto binder = BnCameraDeviceCallback::createBinder();
680 AIBinder_setInheritRt(binder.get(), /*inheritRt*/ true);
681 return binder;
682 }
683
returnStreamBuffers(const std::vector<camera::device::StreamBuffer> & buffers)684 ::ndk::ScopedAStatus AidlCamera3Device::returnStreamBuffers(
685 const std::vector<camera::device::StreamBuffer>& buffers) {
686 ReturnBufferStates states {
687 mId, mUseHalBufManager, mOutputStreams, mSessionStatsBuilder,
688 *(mInterface)};
689 camera3::returnStreamBuffers(states, buffers);
690 return ::ndk::ScopedAStatus::ok();
691 }
692
AidlHalInterface(std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceSession> & session,std::shared_ptr<AidlRequestMetadataQueue> queue,bool useHalBufManager,bool supportOfflineProcessing)693 AidlCamera3Device::AidlHalInterface::AidlHalInterface(
694 std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceSession> &session,
695 std::shared_ptr<AidlRequestMetadataQueue> queue,
696 bool useHalBufManager, bool supportOfflineProcessing) :
697 HalInterface(useHalBufManager, supportOfflineProcessing),
698 mAidlSession(session),
699 mRequestMetadataQueue(queue) { }
700
AidlHalInterface(std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceSession> & deviceSession,std::shared_ptr<aidl::android::hardware::camera::device::ICameraInjectionSession> & injectionSession,std::shared_ptr<AidlRequestMetadataQueue> queue,bool useHalBufManager,bool supportOfflineProcessing)701 AidlCamera3Device::AidlHalInterface::AidlHalInterface(
702 std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceSession>
703 &deviceSession,
704 std::shared_ptr<aidl::android::hardware::camera::device::ICameraInjectionSession>
705 &injectionSession, std::shared_ptr<AidlRequestMetadataQueue> queue,
706 bool useHalBufManager, bool supportOfflineProcessing) :
707 HalInterface(useHalBufManager, supportOfflineProcessing),
708 mAidlSession(deviceSession),
709 mAidlInjectionSession(injectionSession),
710 mRequestMetadataQueue(queue) { }
711
valid()712 bool AidlCamera3Device::AidlHalInterface::valid() {
713 return (mAidlSession != nullptr);
714 }
715
clear()716 void AidlCamera3Device::AidlHalInterface::clear() {
717 mAidlSession.reset();
718 }
719
flush()720 status_t AidlCamera3Device::AidlHalInterface::flush() {
721 ATRACE_NAME("CameraHal::flush");
722 if (!valid()) return INVALID_OPERATION;
723 status_t res = OK;
724
725 auto err = mAidlSession->flush();
726 if (!err.isOk()) {
727 ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
728 res = AidlProviderInfo::mapToStatusT(err);
729 }
730
731 return res;
732 }
733
dump(int)734 status_t AidlCamera3Device::AidlHalInterface::dump(int /*fd*/) {
735 ATRACE_NAME("CameraHal::dump");
736 if (!valid()) return INVALID_OPERATION;
737
738 // Handled by CameraProviderManager::dump
739
740 return OK;
741 }
742
repeatingRequestEnd(uint32_t frameNumber,const std::vector<int32_t> & streamIds)743 status_t AidlCamera3Device::AidlHalInterface::repeatingRequestEnd(uint32_t frameNumber,
744 const std::vector<int32_t> &streamIds) {
745 ATRACE_NAME("AidlCameraHal::repeatingRequestEnd");
746 if (!valid()) return INVALID_OPERATION;
747
748 auto err = mAidlSession->repeatingRequestEnd(frameNumber, streamIds);
749 if (!err.isOk()) {
750 ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
751 return AidlProviderInfo::mapToStatusT(err);
752 }
753
754 return OK;
755 }
756
close()757 status_t AidlCamera3Device::AidlHalInterface::close() {
758 ATRACE_NAME("CameraHal::close()");
759 if (!valid()) return INVALID_OPERATION;
760 status_t res = OK;
761
762 auto err = mAidlSession->close();
763 // Interface will be dead shortly anyway, so don't log errors
764 if (!err.isOk()) {
765 res = DEAD_OBJECT;
766 }
767
768 return res;
769 }
770
signalPipelineDrain(const std::vector<int> & streamIds)771 void AidlCamera3Device::AidlHalInterface::signalPipelineDrain(const std::vector<int>& streamIds) {
772 ATRACE_NAME("CameraHal::signalPipelineDrain");
773 if (!valid()) {
774 ALOGE("%s called on invalid camera!", __FUNCTION__);
775 return;
776 }
777
778 auto err = mAidlSession->signalStreamFlush(streamIds, mNextStreamConfigCounter - 1);
779 if (!err.isOk()) {
780 ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
781 return;
782 }
783 }
784
isReconfigurationRequired(CameraMetadata & oldSessionParams,CameraMetadata & newSessionParams)785 bool AidlCamera3Device::AidlHalInterface::isReconfigurationRequired(
786 CameraMetadata& oldSessionParams, CameraMetadata& newSessionParams) {
787 // We do reconfiguration by default;
788 bool required = true;
789 if (mIsReconfigurationQuerySupported) {
790 aidl::android::hardware::camera::device::CameraMetadata oldParams, newParams;
791 camera_metadata_t* oldSessionMeta = const_cast<camera_metadata_t*>(
792 oldSessionParams.getAndLock());
793 uint8_t *oldSessionByteP = reinterpret_cast<uint8_t*>(oldSessionMeta);
794
795 camera_metadata_t* newSessionMeta = const_cast<camera_metadata_t*>(
796 newSessionParams.getAndLock());
797 uint8_t *newSessionByteP = reinterpret_cast<uint8_t*>(newSessionMeta);
798 // std::vector has no setToExternal, so we hacve to copy
799 oldParams.metadata.assign(oldSessionByteP,
800 oldSessionByteP + get_camera_metadata_size(oldSessionMeta));
801 newParams.metadata.assign(newSessionByteP,
802 newSessionByteP + get_camera_metadata_size(newSessionMeta));
803 auto err = mAidlSession->isReconfigurationRequired(oldParams, newParams, &required);
804 oldSessionParams.unlock(oldSessionMeta);
805 newSessionParams.unlock(newSessionMeta);
806 if (!err.isOk()) {
807 ALOGE("%s: Unexpected binder error: %s", __FUNCTION__, err.getMessage());
808 return true;
809 }
810 }
811
812 return required;
813 }
814
constructDefaultRequestSettings(camera_request_template_t templateId,camera_metadata_t ** requestTemplate)815 status_t AidlCamera3Device::AidlHalInterface::constructDefaultRequestSettings(
816 camera_request_template_t templateId,
817 /*out*/ camera_metadata_t **requestTemplate) {
818 ATRACE_NAME("CameraAidlHal::constructDefaultRequestSettings");
819 using aidl::android::hardware::camera::device::RequestTemplate;
820 if (!valid()) return INVALID_OPERATION;
821 status_t res = OK;
822
823 RequestTemplate id;
824 aidl::android::hardware::camera::device::CameraMetadata request;
825 switch (templateId) {
826 case CAMERA_TEMPLATE_PREVIEW:
827 id = RequestTemplate::PREVIEW;
828 break;
829 case CAMERA_TEMPLATE_STILL_CAPTURE:
830 id = RequestTemplate::STILL_CAPTURE;
831 break;
832 case CAMERA_TEMPLATE_VIDEO_RECORD:
833 id = RequestTemplate::VIDEO_RECORD;
834 break;
835 case CAMERA_TEMPLATE_VIDEO_SNAPSHOT:
836 id = RequestTemplate::VIDEO_SNAPSHOT;
837 break;
838 case CAMERA_TEMPLATE_ZERO_SHUTTER_LAG:
839 id = RequestTemplate::ZERO_SHUTTER_LAG;
840 break;
841 case CAMERA_TEMPLATE_MANUAL:
842 id = RequestTemplate::MANUAL;
843 break;
844 default:
845 // Unknown template ID, or this HAL is too old to support it
846 return BAD_VALUE;
847 }
848 auto err = mAidlSession->constructDefaultRequestSettings(id, &request);
849
850 if (!err.isOk()) {
851 ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
852 return AidlProviderInfo::mapToStatusT(err);
853 }
854 const camera_metadata *r =
855 reinterpret_cast<const camera_metadata_t*>(request.metadata.data());
856 size_t expectedSize = request.metadata.size();
857 int ret = validate_camera_metadata_structure(r, &expectedSize);
858 if (ret == OK || ret == CAMERA_METADATA_VALIDATION_SHIFTED) {
859 *requestTemplate = clone_camera_metadata(r);
860 if (*requestTemplate == nullptr) {
861 ALOGE("%s: Unable to clone camera metadata received from HAL",
862 __FUNCTION__);
863 res = UNKNOWN_ERROR;
864 }
865 } else {
866 ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
867 res = UNKNOWN_ERROR;
868 }
869
870 return res;
871 }
872
configureStreams(const camera_metadata_t * sessionParams,camera_stream_configuration * config,const std::vector<uint32_t> & bufferSizes)873 status_t AidlCamera3Device::AidlHalInterface::configureStreams(
874 const camera_metadata_t *sessionParams,
875 camera_stream_configuration *config, const std::vector<uint32_t>& bufferSizes) {
876 using camera::device::StreamType;
877 using camera::device::StreamConfigurationMode;
878
879 ATRACE_NAME("CameraHal::configureStreams");
880 if (!valid()) return INVALID_OPERATION;
881 status_t res = OK;
882
883 // Convert stream config to AIDL
884 std::set<int> activeStreams;
885 camera::device::StreamConfiguration requestedConfiguration;
886 requestedConfiguration.streams.resize(config->num_streams);
887 for (size_t i = 0; i < config->num_streams; i++) {
888 camera::device::Stream &dst = requestedConfiguration.streams[i];
889 camera3::camera_stream_t *src = config->streams[i];
890
891 Camera3Stream* cam3stream = Camera3Stream::cast(src);
892 cam3stream->setBufferFreedListener(this);
893 int streamId = cam3stream->getId();
894 StreamType streamType;
895 switch (src->stream_type) {
896 case CAMERA_STREAM_OUTPUT:
897 streamType = StreamType::OUTPUT;
898 break;
899 case CAMERA_STREAM_INPUT:
900 streamType = StreamType::INPUT;
901 break;
902 default:
903 ALOGE("%s: Stream %d: Unsupported stream type %d",
904 __FUNCTION__, streamId, config->streams[i]->stream_type);
905 return BAD_VALUE;
906 }
907 dst.id = streamId;
908 dst.streamType = streamType;
909 dst.width = src->width;
910 dst.height = src->height;
911 dst.usage = mapToAidlConsumerUsage(cam3stream->getUsage());
912 dst.rotation = mapToAidlStreamRotation((camera_stream_rotation_t) src->rotation);
913 dst.format = mapToAidlPixelFormat(cam3stream->isFormatOverridden() ?
914 cam3stream->getOriginalFormat() : src->format);
915 dst.dataSpace = mapToAidlDataspace(cam3stream->isDataSpaceOverridden() ?
916 cam3stream->getOriginalDataSpace() : src->data_space);
917
918 dst.bufferSize = bufferSizes[i];
919 if (src->physical_camera_id != nullptr) {
920 dst.physicalCameraId = src->physical_camera_id;
921 }
922 dst.groupId = cam3stream->getHalStreamGroupId();
923 dst.sensorPixelModesUsed.resize(src->sensor_pixel_modes_used.size());
924 size_t j = 0;
925 for (int mode : src->sensor_pixel_modes_used) {
926 dst.sensorPixelModesUsed[j++] = static_cast<SensorPixelMode>(mode);
927 }
928 dst.dynamicRangeProfile = mapToAidlDynamicProfile(src->dynamic_range_profile);
929 dst.useCase = static_cast<ScalerAvailableStreamUseCases>(src->use_case);
930 activeStreams.insert(streamId);
931 // Create Buffer ID map if necessary
932 mBufferRecords.tryCreateBufferCache(streamId);
933 }
934 // remove BufferIdMap for deleted streams
935 mBufferRecords.removeInactiveBufferCaches(activeStreams);
936
937 StreamConfigurationMode operationMode;
938 res = mapToAidlStreamConfigurationMode(
939 (camera_stream_configuration_mode_t) config->operation_mode,
940 /*out*/ &operationMode);
941 if (res != OK) {
942 return res;
943 }
944 requestedConfiguration.operationMode = operationMode;
945 size_t sessionParamSize = get_camera_metadata_size(sessionParams);
946 uint8_t *sessionParamP =
947 reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(sessionParams));
948
949 // std::vector has no setToExternal, so we have to copy
950 requestedConfiguration.sessionParams.metadata.assign(
951 sessionParamP, sessionParamP + sessionParamSize);
952 requestedConfiguration.operationMode = operationMode;
953
954 // Invoke configureStreams
955 std::vector<camera::device::HalStream> finalConfiguration;
956
957 requestedConfiguration.streamConfigCounter = mNextStreamConfigCounter++;
958 requestedConfiguration.multiResolutionInputImage = config->input_is_multi_resolution;
959 auto err = mAidlSession->configureStreams(requestedConfiguration, &finalConfiguration);
960 if (!err.isOk()) {
961 ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
962 return AidlProviderInfo::mapToStatusT(err);
963 }
964
965 // And convert output stream configuration from AIDL
966
967 for (size_t i = 0; i < config->num_streams; i++) {
968 camera3::camera_stream_t *dst = config->streams[i];
969 int streamId = Camera3Stream::cast(dst)->getId();
970
971 // Start scan at i, with the assumption that the stream order matches
972 size_t realIdx = i;
973 bool found = false;
974 size_t halStreamCount = finalConfiguration.size();
975 for (size_t idx = 0; idx < halStreamCount; idx++) {
976 if (finalConfiguration[realIdx].id == streamId) {
977 found = true;
978 break;
979 }
980 realIdx = (realIdx >= halStreamCount - 1) ? 0 : realIdx + 1;
981 }
982 if (!found) {
983 ALOGE("%s: Stream %d not found in stream configuration response from HAL",
984 __FUNCTION__, streamId);
985 return INVALID_OPERATION;
986 }
987 camera::device::HalStream &src = finalConfiguration[realIdx];
988
989 Camera3Stream* dstStream = Camera3Stream::cast(dst);
990 int overrideFormat = mapToFrameworkFormat(src.overrideFormat);
991 android_dataspace overrideDataSpace = mapToFrameworkDataspace(src.overrideDataSpace);
992
993 dstStream->setOfflineProcessingSupport(src.supportOffline);
994
995 if (dstStream->getOriginalFormat() != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
996 dstStream->setFormatOverride(false);
997 dstStream->setDataSpaceOverride(false);
998 if (dst->format != overrideFormat) {
999 ALOGE("%s: Stream %d: Format override not allowed for format 0x%x", __FUNCTION__,
1000 streamId, dst->format);
1001 }
1002 if (dst->data_space != overrideDataSpace) {
1003 ALOGE("%s: Stream %d: DataSpace override not allowed for format 0x%x", __FUNCTION__,
1004 streamId, dst->format);
1005 }
1006 } else {
1007 bool needFormatOverride =
1008 requestedConfiguration.streams[i].format != src.overrideFormat;
1009 bool needDataspaceOverride =
1010 requestedConfiguration.streams[i].dataSpace != src.overrideDataSpace;
1011 // Override allowed with IMPLEMENTATION_DEFINED
1012 dstStream->setFormatOverride(needFormatOverride);
1013 dstStream->setDataSpaceOverride(needDataspaceOverride);
1014 dst->format = overrideFormat;
1015 dst->data_space = overrideDataSpace;
1016 }
1017
1018 if (dst->stream_type == CAMERA_STREAM_INPUT) {
1019 if (static_cast<int64_t>(src.producerUsage) != 0) {
1020 ALOGE("%s: Stream %d: INPUT streams must have 0 for producer usage",
1021 __FUNCTION__, streamId);
1022 return INVALID_OPERATION;
1023 }
1024 dstStream->setUsage(
1025 mapConsumerToFrameworkUsage(src.consumerUsage));
1026 } else {
1027 // OUTPUT
1028 if (static_cast<int64_t>(src.consumerUsage) != 0) {
1029 ALOGE("%s: Stream %d: OUTPUT streams must have 0 for consumer usage",
1030 __FUNCTION__, streamId);
1031 return INVALID_OPERATION;
1032 }
1033 dstStream->setUsage(
1034 mapProducerToFrameworkUsage(src.producerUsage));
1035 }
1036 dst->max_buffers = src.maxBuffers;
1037 }
1038
1039 return res;
1040 }
1041
configureInjectedStreams(const camera_metadata_t * sessionParams,camera_stream_configuration * config,const std::vector<uint32_t> & bufferSizes,const CameraMetadata & cameraCharacteristics)1042 status_t AidlCamera3Device::AidlHalInterface::configureInjectedStreams(
1043 const camera_metadata_t* sessionParams, camera_stream_configuration* config,
1044 const std::vector<uint32_t>& bufferSizes,
1045 const CameraMetadata& cameraCharacteristics) {
1046 using camera::device::StreamType;
1047 using camera::device::StreamConfigurationMode;
1048
1049 ATRACE_NAME("InjectionCameraHal::configureStreams");
1050 if (!valid()) return INVALID_OPERATION;
1051 status_t res = OK;
1052
1053 if (config->input_is_multi_resolution) {
1054 ALOGE("%s: Injection camera device doesn't support multi-resolution input "
1055 "stream", __FUNCTION__);
1056 return BAD_VALUE;
1057 }
1058
1059 // Convert stream config to AIDL
1060 std::set<int> activeStreams;
1061 camera::device::StreamConfiguration requestedConfiguration;
1062 requestedConfiguration.streams.resize(config->num_streams);
1063 for (size_t i = 0; i < config->num_streams; i++) {
1064 camera::device::Stream& dst = requestedConfiguration.streams[i];
1065 camera3::camera_stream_t* src = config->streams[i];
1066
1067 Camera3Stream* cam3stream = Camera3Stream::cast(src);
1068 cam3stream->setBufferFreedListener(this);
1069 int streamId = cam3stream->getId();
1070 StreamType streamType;
1071 switch (src->stream_type) {
1072 case CAMERA_STREAM_OUTPUT:
1073 streamType = StreamType::OUTPUT;
1074 break;
1075 case CAMERA_STREAM_INPUT:
1076 streamType = StreamType::INPUT;
1077 break;
1078 default:
1079 ALOGE("%s: Stream %d: Unsupported stream type %d", __FUNCTION__,
1080 streamId, config->streams[i]->stream_type);
1081 return BAD_VALUE;
1082 }
1083 dst.id = streamId;
1084 dst.streamType = streamType;
1085 dst.width = src->width;
1086 dst.height = src->height;
1087 dst.usage = mapToAidlConsumerUsage(cam3stream->getUsage());
1088 dst.rotation = mapToAidlStreamRotation((camera_stream_rotation_t)src->rotation);
1089 dst.format =
1090 mapToAidlPixelFormat(cam3stream->isFormatOverridden() ? cam3stream->getOriginalFormat()
1091 : src->format);
1092 dst.dataSpace =
1093 mapToAidlDataspace(cam3stream->isDataSpaceOverridden() ?
1094 cam3stream->getOriginalDataSpace() : src->data_space);
1095 dst.bufferSize = bufferSizes[i];
1096 if (src->physical_camera_id != nullptr) {
1097 dst.physicalCameraId = src->physical_camera_id;
1098 }
1099 dst.groupId = cam3stream->getHalStreamGroupId();
1100 dst.sensorPixelModesUsed.resize(src->sensor_pixel_modes_used.size());
1101 size_t j = 0;
1102 for (int mode : src->sensor_pixel_modes_used) {
1103 dst.sensorPixelModesUsed[j++] = static_cast<SensorPixelMode>(mode);
1104 }
1105 activeStreams.insert(streamId);
1106 // Create Buffer ID map if necessary
1107 mBufferRecords.tryCreateBufferCache(streamId);
1108 }
1109 // remove BufferIdMap for deleted streams
1110 mBufferRecords.removeInactiveBufferCaches(activeStreams);
1111
1112 StreamConfigurationMode operationMode;
1113 res = mapToAidlStreamConfigurationMode(
1114 (camera_stream_configuration_mode_t)config->operation_mode,
1115 /*out*/ &operationMode);
1116 if (res != OK) {
1117 return res;
1118 }
1119 requestedConfiguration.operationMode = operationMode;
1120 size_t sessionParamSize = get_camera_metadata_size(sessionParams);
1121 uint8_t *sessionParamP =
1122 reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(sessionParams));
1123 requestedConfiguration.operationMode = operationMode;
1124 requestedConfiguration.sessionParams.metadata.assign(
1125 sessionParamP, sessionParamP + sessionParamSize);
1126
1127 // See which version of HAL we have
1128 if (mAidlInjectionSession != nullptr) {
1129 requestedConfiguration.streamConfigCounter = mNextStreamConfigCounter++;
1130 requestedConfiguration.multiResolutionInputImage = config->input_is_multi_resolution;
1131
1132 const camera_metadata_t* rawMetadata = cameraCharacteristics.getAndLock();
1133 uint8_t *aidlCharsP =
1134 reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(rawMetadata));
1135 aidl::android::hardware::camera::device::CameraMetadata aidlChars;
1136 aidlChars.metadata.assign(aidlCharsP, aidlCharsP + get_camera_metadata_size(rawMetadata));
1137 cameraCharacteristics.unlock(rawMetadata);
1138
1139 auto err = mAidlInjectionSession->configureInjectionStreams(requestedConfiguration,
1140 aidlChars);
1141 if (!err.isOk()) {
1142 ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
1143 return AidlProviderInfo::mapToStatusT(err);
1144 }
1145 } else {
1146 ALOGE("%s: mAidlInjectionSession == nullptr, the injection not supported ", __FUNCTION__);
1147 return INVALID_OPERATION;
1148 }
1149
1150 return res;
1151 }
1152
processBatchCaptureRequests(std::vector<camera_capture_request_t * > & requests,uint32_t * numRequestProcessed)1153 status_t AidlCamera3Device::AidlHalInterface::processBatchCaptureRequests(
1154 std::vector<camera_capture_request_t*>& requests,/*out*/uint32_t* numRequestProcessed) {
1155 ATRACE_NAME("CameraHal::processBatchCaptureRequests");
1156 if (!valid()) return INVALID_OPERATION;
1157
1158 std::vector<camera::device::CaptureRequest> captureRequests;
1159 size_t batchSize = requests.size();
1160 if (batchSize > INT_MAX) {
1161 ALOGE("%s batchSize %zu > INT_MAX, aidl interface cannot handle batch size", __FUNCTION__,
1162 batchSize);
1163 return BAD_VALUE;
1164 }
1165 captureRequests.resize(batchSize);
1166 std::vector<native_handle_t*> handlesCreated;
1167 std::vector<std::pair<int32_t, int32_t>> inflightBuffers;
1168
1169 status_t res = OK;
1170 for (size_t i = 0; i < batchSize; i++) {
1171 res = wrapAsAidlRequest(requests[i], /*out*/&captureRequests[i],
1172 /*out*/&handlesCreated, /*out*/&inflightBuffers);
1173
1174 if (res != OK) {
1175 mBufferRecords.popInflightBuffers(inflightBuffers);
1176 cleanupNativeHandles(&handlesCreated);
1177 return res;
1178 }
1179 }
1180
1181 std::vector<camera::device::BufferCache> cachesToRemove;
1182 {
1183 std::lock_guard<std::mutex> lock(mFreedBuffersLock);
1184 for (auto& pair : mFreedBuffers) {
1185 // The stream might have been removed since onBufferFreed
1186 if (mBufferRecords.isStreamCached(pair.first)) {
1187 cachesToRemove.push_back({pair.first, static_cast<int64_t>(pair.second)});
1188 }
1189 }
1190 mFreedBuffers.clear();
1191 }
1192
1193 *numRequestProcessed = 0;
1194
1195 // Write metadata to FMQ.
1196 for (size_t i = 0; i < batchSize; i++) {
1197 camera_capture_request_t* request = requests[i];
1198 camera::device::CaptureRequest* captureRequest;
1199 captureRequest = &captureRequests[i];
1200
1201 if (request->settings != nullptr) {
1202 size_t settingsSize = get_camera_metadata_size(request->settings);
1203 if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write(
1204 reinterpret_cast<const int8_t*>(request->settings), settingsSize)) {
1205 captureRequest->settings.metadata.resize(0);
1206 captureRequest->fmqSettingsSize = settingsSize;
1207 } else {
1208 if (mRequestMetadataQueue != nullptr) {
1209 ALOGW("%s: couldn't utilize fmq, fallback to hwbinder", __FUNCTION__);
1210 }
1211 uint8_t *settingsP =
1212 reinterpret_cast<uint8_t*>(
1213 const_cast<camera_metadata_t*>(request->settings));
1214 size_t settingsSize = get_camera_metadata_size(request->settings);
1215 captureRequest->settings.metadata.assign(settingsP, settingsP + settingsSize);
1216 captureRequest->fmqSettingsSize = 0u;
1217 }
1218 } else {
1219 // A null request settings maps to a size-0 CameraMetadata
1220 captureRequest->settings.metadata.resize(0);
1221 captureRequest->fmqSettingsSize = 0u;
1222 }
1223
1224 captureRequest ->inputWidth = request->input_width;
1225 captureRequest->inputHeight = request->input_height;
1226
1227 std::vector<camera::device::PhysicalCameraSetting>& physicalCameraSettings =
1228 captureRequest->physicalCameraSettings;
1229 physicalCameraSettings.resize(request->num_physcam_settings);
1230 for (size_t j = 0; j < request->num_physcam_settings; j++) {
1231 if (request->physcam_settings != nullptr) {
1232 size_t settingsSize = get_camera_metadata_size(request->physcam_settings[j]);
1233 if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write(
1234 reinterpret_cast<const int8_t*>(request->physcam_settings[j]),
1235 settingsSize)) {
1236 physicalCameraSettings[j].settings.metadata.resize(0);
1237 physicalCameraSettings[j].fmqSettingsSize = settingsSize;
1238 } else {
1239 if (mRequestMetadataQueue != nullptr) {
1240 ALOGW("%s: couldn't utilize fmq, fallback to hwbinder", __FUNCTION__);
1241 }
1242 uint8_t *physicalSettingsP =
1243 reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(
1244 request->physcam_settings[j]));
1245 physicalCameraSettings[j].settings.metadata.assign(physicalSettingsP,
1246 physicalSettingsP + settingsSize);
1247 physicalCameraSettings[j].fmqSettingsSize = 0u;
1248 }
1249 } else {
1250 physicalCameraSettings[j].fmqSettingsSize = 0u;
1251 physicalCameraSettings[j].settings.metadata.resize(0);
1252 }
1253 physicalCameraSettings[j].physicalCameraId = request->physcam_id[j];
1254 }
1255 }
1256
1257 int32_t numRequests = 0;
1258 auto retS = mAidlSession->processCaptureRequest(captureRequests, cachesToRemove,
1259 &numRequests);
1260 if (!retS.isOk()) {
1261 res = AidlProviderInfo::mapToStatusT(retS);
1262 }
1263 if (res == OK) {
1264 if (numRequests < 0) {
1265 res = INVALID_OPERATION;
1266 } else {
1267 *numRequestProcessed = static_cast<uint32_t>(numRequests);
1268 }
1269
1270 }
1271 if (res == OK && *numRequestProcessed == batchSize) {
1272 if (mAidlSession->isRemote()) {
1273 // Only close acquire fence FDs when the AIDL transaction succeeds (so the FDs have been
1274 // sent to camera HAL processes)
1275 cleanupNativeHandles(&handlesCreated, /*closeFd*/true);
1276 } else {
1277 // In passthrough mode the FDs are now owned by HAL
1278 cleanupNativeHandles(&handlesCreated);
1279 }
1280 } else {
1281 ALOGE("%s Error with processCaptureRequest %s ", __FUNCTION__, retS.getMessage());
1282 mBufferRecords.popInflightBuffers(inflightBuffers);
1283 cleanupNativeHandles(&handlesCreated);
1284 }
1285 return res;
1286 }
1287
wrapAsAidlRequest(camera_capture_request_t * request,camera::device::CaptureRequest * captureRequest,std::vector<native_handle_t * > * handlesCreated,std::vector<std::pair<int32_t,int32_t>> * inflightBuffers)1288 status_t AidlCamera3Device::AidlHalInterface::wrapAsAidlRequest(camera_capture_request_t* request,
1289 /*out*/camera::device::CaptureRequest* captureRequest,
1290 /*out*/std::vector<native_handle_t*>* handlesCreated,
1291 /*out*/std::vector<std::pair<int32_t, int32_t>>* inflightBuffers) {
1292 using camera::device::BufferStatus;
1293 using camera::device::StreamBuffer;
1294 ATRACE_CALL();
1295 if (captureRequest == nullptr || handlesCreated == nullptr || inflightBuffers == nullptr) {
1296 ALOGE("%s: captureRequest (%p), handlesCreated (%p), and inflightBuffers(%p) "
1297 "must not be null", __FUNCTION__, captureRequest, handlesCreated, inflightBuffers);
1298 return BAD_VALUE;
1299 }
1300
1301 captureRequest->frameNumber = request->frame_number;
1302
1303 captureRequest->fmqSettingsSize = 0;
1304
1305 {
1306 if (request->input_buffer != nullptr) {
1307 int32_t streamId = Camera3Stream::cast(request->input_buffer->stream)->getId();
1308 buffer_handle_t buf = *(request->input_buffer->buffer);
1309 auto pair = getBufferId(buf, streamId);
1310 bool isNewBuffer = pair.first;
1311 uint64_t bufferId = pair.second;
1312 captureRequest->inputBuffer.streamId = streamId;
1313 captureRequest->inputBuffer.bufferId = bufferId;
1314 captureRequest->inputBuffer.buffer =
1315 (isNewBuffer) ? camera3::dupToAidlIfNotNull(buf) :
1316 aidl::android::hardware::common::NativeHandle();
1317 captureRequest->inputBuffer.status = BufferStatus::OK;
1318 native_handle_t *acquireFence = nullptr;
1319 if (request->input_buffer->acquire_fence != -1) {
1320 acquireFence = native_handle_create(1,0);
1321 acquireFence->data[0] = request->input_buffer->acquire_fence;
1322 handlesCreated->push_back(acquireFence);
1323 }
1324 // duping here is okay, in aidl ownership is not given to aidl_handle
1325 captureRequest->inputBuffer.acquireFence = camera3::dupToAidlIfNotNull(acquireFence);
1326 captureRequest->inputBuffer.releaseFence =
1327 aidl::android::hardware::common::NativeHandle();
1328
1329 mBufferRecords.pushInflightBuffer(captureRequest->frameNumber, streamId,
1330 request->input_buffer->buffer);
1331 inflightBuffers->push_back(std::make_pair(captureRequest->frameNumber, streamId));
1332 } else {
1333 captureRequest->inputBuffer.streamId = -1;
1334 captureRequest->inputBuffer.bufferId = BUFFER_ID_NO_BUFFER;
1335 }
1336
1337 captureRequest->outputBuffers.resize(request->num_output_buffers);
1338 for (size_t i = 0; i < request->num_output_buffers; i++) {
1339 const camera_stream_buffer_t *src = request->output_buffers + i;
1340 StreamBuffer &dst = captureRequest->outputBuffers[i];
1341 int32_t streamId = Camera3Stream::cast(src->stream)->getId();
1342 if (src->buffer != nullptr) {
1343 buffer_handle_t buf = *(src->buffer);
1344 auto pair = getBufferId(buf, streamId);
1345 bool isNewBuffer = pair.first;
1346 dst.bufferId = pair.second;
1347 dst.buffer = isNewBuffer ?
1348 camera3::dupToAidlIfNotNull(buf) :
1349 aidl::android::hardware::common::NativeHandle();
1350 native_handle_t *acquireFence = nullptr;
1351 if (src->acquire_fence != -1) {
1352 acquireFence = native_handle_create(1,0);
1353 acquireFence->data[0] = src->acquire_fence;
1354 handlesCreated->push_back(acquireFence);
1355 }
1356 dst.acquireFence = camera3::dupToAidlIfNotNull(acquireFence);
1357 } else if (mUseHalBufManager) {
1358 // HAL buffer management path
1359 dst.bufferId = BUFFER_ID_NO_BUFFER;
1360 dst.buffer = aidl::android::hardware::common::NativeHandle();
1361 dst.acquireFence = aidl::android::hardware::common::NativeHandle();
1362 } else {
1363 ALOGE("%s: cannot send a null buffer in capture request!", __FUNCTION__);
1364 return BAD_VALUE;
1365 }
1366 dst.streamId = streamId;
1367 dst.status = BufferStatus::OK;
1368 dst.releaseFence = aidl::android::hardware::common::NativeHandle();
1369
1370 // Output buffers are empty when using HAL buffer manager
1371 if (!mUseHalBufManager) {
1372 mBufferRecords.pushInflightBuffer(
1373 captureRequest->frameNumber, streamId, src->buffer);
1374 inflightBuffers->push_back(std::make_pair(captureRequest->frameNumber, streamId));
1375 }
1376 }
1377 }
1378 return OK;
1379 }
1380
switchToOffline(const std::vector<int32_t> & streamsToKeep,aidl::android::hardware::camera::device::CameraOfflineSessionInfo * offlineSessionInfo,std::shared_ptr<aidl::android::hardware::camera::device::ICameraOfflineSession> * offlineSession,camera3::BufferRecords * bufferRecords)1381 status_t AidlCamera3Device::AidlHalInterface::switchToOffline(
1382 const std::vector<int32_t>& streamsToKeep,
1383 /*out*/aidl::android::hardware::camera::device::CameraOfflineSessionInfo*
1384 offlineSessionInfo,
1385 /*out*/std::shared_ptr<aidl::android::hardware::camera::device::ICameraOfflineSession>*
1386 offlineSession,
1387 /*out*/camera3::BufferRecords* bufferRecords) {
1388 ATRACE_NAME("CameraHal::switchToOffline");
1389 if (!valid()) {
1390 ALOGE("%s called on invalid camera!", __FUNCTION__);
1391 return INVALID_OPERATION;
1392 }
1393
1394 if (offlineSessionInfo == nullptr || offlineSession == nullptr || bufferRecords == nullptr) {
1395 ALOGE("%s: output arguments must not be null!", __FUNCTION__);
1396 return INVALID_OPERATION;
1397 }
1398
1399 auto err = mAidlSession->switchToOffline(streamsToKeep, offlineSessionInfo, offlineSession);
1400
1401 if (!err.isOk()) {
1402 ALOGE("%s: Transaction error: %s", __FUNCTION__, err.getMessage());
1403 return AidlProviderInfo::mapToStatusT(err);
1404 }
1405
1406 return verifyBufferCaches(offlineSessionInfo, bufferRecords);
1407 }
1408
AidlRequestThread(wp<Camera3Device> parent,sp<camera3::StatusTracker> statusTracker,sp<HalInterface> interface,const Vector<int32_t> & sessionParamKeys,bool useHalBufManager,bool supportCameraMute,bool overrideToPortrait)1409 AidlCamera3Device::AidlRequestThread::AidlRequestThread(wp<Camera3Device> parent,
1410 sp<camera3::StatusTracker> statusTracker,
1411 sp<HalInterface> interface,
1412 const Vector<int32_t>& sessionParamKeys,
1413 bool useHalBufManager,
1414 bool supportCameraMute,
1415 bool overrideToPortrait) :
1416 RequestThread(parent, statusTracker, interface, sessionParamKeys, useHalBufManager,
1417 supportCameraMute, overrideToPortrait) {}
1418
switchToOffline(const std::vector<int32_t> & streamsToKeep,camera::device::CameraOfflineSessionInfo * offlineSessionInfo,std::shared_ptr<camera::device::ICameraOfflineSession> * offlineSession,camera3::BufferRecords * bufferRecords)1419 status_t AidlCamera3Device::AidlRequestThread::switchToOffline(
1420 const std::vector<int32_t>& streamsToKeep,
1421 /*out*/camera::device::CameraOfflineSessionInfo* offlineSessionInfo,
1422 /*out*/std::shared_ptr<camera::device::ICameraOfflineSession>* offlineSession,
1423 /*out*/camera3::BufferRecords* bufferRecords) {
1424 Mutex::Autolock l(mRequestLock);
1425 clearRepeatingRequestsLocked(/*lastFrameNumber*/nullptr);
1426
1427 // Wait until request thread is fully stopped
1428 // TBD: check if request thread is being paused by other APIs (shouldn't be)
1429
1430 // We could also check for mRepeatingRequests.empty(), but the API interface
1431 // is serialized by Camera3Device::mInterfaceLock so no one should be able to submit any
1432 // new requests during the call; hence skip that check.
1433 bool queueEmpty = mNextRequests.empty() && mRequestQueue.empty();
1434 while (!queueEmpty) {
1435 status_t res = mRequestSubmittedSignal.waitRelative(mRequestLock, kRequestSubmitTimeout);
1436 if (res == TIMED_OUT) {
1437 ALOGE("%s: request thread failed to submit one request within timeout!", __FUNCTION__);
1438 return res;
1439 } else if (res != OK) {
1440 ALOGE("%s: request thread failed to submit a request: %s (%d)!",
1441 __FUNCTION__, strerror(-res), res);
1442 return res;
1443 }
1444 queueEmpty = mNextRequests.empty() && mRequestQueue.empty();
1445 }
1446 return (static_cast<AidlHalInterface *>(mInterface.get()))->switchToOffline(
1447 streamsToKeep, offlineSessionInfo, offlineSession, bufferRecords);
1448 }
1449
injectionInitialize(const String8 & injectedCamId,sp<CameraProviderManager> manager,const std::shared_ptr<camera::device::ICameraDeviceCallback> & callback)1450 status_t AidlCamera3Device::AidlCamera3DeviceInjectionMethods::injectionInitialize(
1451 const String8& injectedCamId, sp<CameraProviderManager> manager,
1452 const std::shared_ptr<camera::device::ICameraDeviceCallback>&callback) {
1453 ATRACE_CALL();
1454 Mutex::Autolock lock(mInjectionLock);
1455
1456 if (manager == nullptr) {
1457 ALOGE("%s: manager does not exist!", __FUNCTION__);
1458 return INVALID_OPERATION;
1459 }
1460
1461 sp<Camera3Device> parent = mParent.promote();
1462 if (parent == nullptr) {
1463 ALOGE("%s: parent does not exist!", __FUNCTION__);
1464 return INVALID_OPERATION;
1465 }
1466
1467 if (parent->getTransportType() != IPCTransport::AIDL) {
1468 ALOGE("%s Parent transport not AIDL for injected camera id %s, aborting", __FUNCTION__,
1469 injectedCamId.c_str());
1470 return INVALID_OPERATION;
1471 }
1472 mInjectedCamId = injectedCamId;
1473 std::shared_ptr<camera::device::ICameraInjectionSession> injectionSession;
1474 ATRACE_BEGIN("Injection CameraHal::openSession");
1475 status_t res = manager->openAidlInjectionSession(injectedCamId.string(), callback,
1476 /*out*/ &injectionSession);
1477 ATRACE_END();
1478 if (res != OK) {
1479 ALOGE("Injection camera could not open camera session: %s (%d)",
1480 strerror(-res), res);
1481 return res;
1482 }
1483 std::shared_ptr<camera::device::ICameraDeviceSession> deviceSession = nullptr;
1484 auto ret = injectionSession->getCameraDeviceSession(&deviceSession);
1485 if (!ret.isOk() || deviceSession == nullptr) {
1486 ALOGE("%s Camera injection session couldn't return ICameraDeviceSession", __FUNCTION__);
1487 return AidlProviderInfo::mapToStatusT(ret);
1488 }
1489
1490 std::shared_ptr<AidlRequestMetadataQueue> queue;
1491 ::aidl::android::hardware::common::fmq::MQDescriptor<
1492 int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite> desc;
1493
1494 ::ndk::ScopedAStatus requestQueueRet = deviceSession->getCaptureRequestMetadataQueue(&desc);
1495 if (!requestQueueRet.isOk()) {
1496 ALOGE("Injection camera transaction error when getting result metadata queue from camera"
1497 " session: %s", requestQueueRet.getMessage());
1498 return AidlProviderInfo::mapToStatusT(requestQueueRet);
1499 }
1500 queue = std::make_unique<AidlRequestMetadataQueue>(desc);
1501 if (!queue->isValid() || queue->availableToWrite() <= 0) {
1502 ALOGE("HAL returns empty result metadata fmq, not use it");
1503 queue = nullptr;
1504 // Don't use resQueue onwards.
1505 }
1506
1507 std::unique_ptr<AidlResultMetadataQueue>& resQueue = mInjectionResultMetadataQueue;
1508 ::aidl::android::hardware::common::fmq::MQDescriptor<
1509 int8_t, ::aidl::android::hardware::common::fmq::SynchronizedReadWrite> resDesc;
1510 ::ndk::ScopedAStatus resultQueueRet = deviceSession->getCaptureResultMetadataQueue(&resDesc);
1511 if (!resultQueueRet.isOk()) {
1512 ALOGE("Transaction error when getting result metadata queue from camera session: %s",
1513 resultQueueRet.getMessage());
1514 return AidlProviderInfo::mapToStatusT(resultQueueRet);
1515 }
1516 resQueue = std::make_unique<AidlResultMetadataQueue>(resDesc);
1517 if (!resQueue->isValid() || resQueue->availableToWrite() <= 0) {
1518 ALOGE("HAL returns empty result metadata fmq, not use it");
1519 resQueue = nullptr;
1520 // Don't use resQueue onwards.
1521 }
1522
1523 ALOGV("%s: Injection camera interface = new HalInterface()", __FUNCTION__);
1524
1525 mInjectedCamHalInterface =
1526 new AidlHalInterface(deviceSession, injectionSession, queue, parent->mUseHalBufManager,
1527 parent->mSupportOfflineProcessing);
1528 if (mInjectedCamHalInterface == nullptr) {
1529 ALOGE("%s: mInjectedCamHalInterface does not exist!", __FUNCTION__);
1530 return DEAD_OBJECT;
1531 }
1532
1533 return OK;
1534 }
1535
replaceHalInterface(sp<HalInterface> newHalInterface,bool keepBackup)1536 status_t AidlCamera3Device::AidlCamera3DeviceInjectionMethods::replaceHalInterface(
1537 sp<HalInterface> newHalInterface, bool keepBackup) {
1538 Mutex::Autolock lock(mInjectionLock);
1539 if (newHalInterface.get() == nullptr) {
1540 ALOGE("%s: The newHalInterface does not exist, to stop replacing.",
1541 __FUNCTION__);
1542 return DEAD_OBJECT;
1543 }
1544
1545 sp<Camera3Device> parent = mParent.promote();
1546 if (parent == nullptr) {
1547 ALOGE("%s: parent does not exist!", __FUNCTION__);
1548 return INVALID_OPERATION;
1549 }
1550 if (parent->getTransportType() != IPCTransport::AIDL ||
1551 newHalInterface->getTransportType() != IPCTransport::AIDL) {
1552 ALOGE("%s Parent transport not AIDL for replacing hal interface", __FUNCTION__);
1553 return INVALID_OPERATION;
1554 }
1555
1556 AidlCamera3Device *aidlParent = static_cast<AidlCamera3Device *>(parent.get());
1557 if (keepBackup) {
1558 if (mBackupHalInterface == nullptr) {
1559 mBackupHalInterface = parent->mInterface;
1560 }
1561 if (mBackupResultMetadataQueue == nullptr) {
1562 mBackupResultMetadataQueue = std::move(aidlParent->mResultMetadataQueue);
1563 aidlParent->mResultMetadataQueue = std::move(mInjectionResultMetadataQueue);
1564 }
1565 } else {
1566 mBackupHalInterface = nullptr;
1567 aidlParent->mResultMetadataQueue = std::move(mBackupResultMetadataQueue);
1568 mBackupResultMetadataQueue = nullptr;
1569 }
1570 parent->mInterface = newHalInterface;
1571 return OK;
1572 }
1573
injectionCameraInitialize(const String8 & injectedCamId,sp<CameraProviderManager> manager)1574 status_t AidlCamera3Device::injectionCameraInitialize(const String8 &injectedCamId,
1575 sp<CameraProviderManager> manager) {
1576 return (static_cast<AidlCamera3DeviceInjectionMethods *>
1577 (mInjectionMethods.get()))->injectionInitialize(injectedCamId, manager,
1578 std::shared_ptr<camera::device::ICameraDeviceCallback>(mCallbacks));
1579 };
1580
createNewRequestThread(wp<Camera3Device> parent,sp<camera3::StatusTracker> statusTracker,sp<Camera3Device::HalInterface> interface,const Vector<int32_t> & sessionParamKeys,bool useHalBufManager,bool supportCameraMute,bool overrideToPortrait)1581 sp<Camera3Device::RequestThread> AidlCamera3Device::createNewRequestThread(
1582 wp<Camera3Device> parent, sp<camera3::StatusTracker> statusTracker,
1583 sp<Camera3Device::HalInterface> interface,
1584 const Vector<int32_t>& sessionParamKeys,
1585 bool useHalBufManager,
1586 bool supportCameraMute,
1587 bool overrideToPortrait) {
1588 return new AidlRequestThread(parent, statusTracker, interface, sessionParamKeys,
1589 useHalBufManager, supportCameraMute, overrideToPortrait);
1590 };
1591
1592 sp<Camera3Device::Camera3DeviceInjectionMethods>
createCamera3DeviceInjectionMethods(wp<Camera3Device> parent)1593 AidlCamera3Device::createCamera3DeviceInjectionMethods(wp<Camera3Device> parent) {
1594 return new AidlCamera3DeviceInjectionMethods(parent);
1595 }
1596
1597 }; // namespace android
1598