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