• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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