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