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