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