• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2013-2018 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 "Camera3-Device"
18 #define ATRACE_TAG ATRACE_TAG_CAMERA
19 //#define LOG_NDEBUG 0
20 //#define LOG_NNDEBUG 0  // Per-frame verbose logging
21 
22 #ifdef LOG_NNDEBUG
23 #define ALOGVV(...) ALOGV(__VA_ARGS__)
24 #else
25 #define ALOGVV(...) ((void)0)
26 #endif
27 
28 // Convenience macro for transient errors
29 #define CLOGE(fmt, ...) ALOGE("Camera %s: %s: " fmt, mId.string(), __FUNCTION__, \
30             ##__VA_ARGS__)
31 
32 // Convenience macros for transitioning to the error state
33 #define SET_ERR(fmt, ...) setErrorState(   \
34     "%s: " fmt, __FUNCTION__,              \
35     ##__VA_ARGS__)
36 #define SET_ERR_L(fmt, ...) setErrorStateLocked( \
37     "%s: " fmt, __FUNCTION__,                    \
38     ##__VA_ARGS__)
39 
40 #include <inttypes.h>
41 
42 #include <utility>
43 
44 #include <utils/Log.h>
45 #include <utils/Trace.h>
46 #include <utils/Timers.h>
47 #include <cutils/properties.h>
48 
49 #include <android/hardware/camera2/ICameraDeviceUser.h>
50 
51 #include "utils/CameraTraces.h"
52 #include "mediautils/SchedulingPolicyService.h"
53 #include "device3/Camera3Device.h"
54 #include "device3/Camera3OutputStream.h"
55 #include "device3/Camera3InputStream.h"
56 #include "device3/Camera3DummyStream.h"
57 #include "device3/Camera3SharedOutputStream.h"
58 #include "CameraService.h"
59 #include "utils/CameraThreadState.h"
60 
61 #include <tuple>
62 
63 using namespace android::camera3;
64 using namespace android::hardware::camera;
65 using namespace android::hardware::camera::device::V3_2;
66 
67 namespace android {
68 
Camera3Device(const String8 & id)69 Camera3Device::Camera3Device(const String8 &id):
70         mId(id),
71         mOperatingMode(NO_MODE),
72         mIsConstrainedHighSpeedConfiguration(false),
73         mStatus(STATUS_UNINITIALIZED),
74         mStatusWaiters(0),
75         mUsePartialResult(false),
76         mNumPartialResults(1),
77         mTimestampOffset(0),
78         mNextResultFrameNumber(0),
79         mNextReprocessResultFrameNumber(0),
80         mNextZslStillResultFrameNumber(0),
81         mNextShutterFrameNumber(0),
82         mNextReprocessShutterFrameNumber(0),
83         mNextZslStillShutterFrameNumber(0),
84         mListener(NULL),
85         mVendorTagId(CAMERA_METADATA_INVALID_VENDOR_ID),
86         mLastTemplateId(-1),
87         mNeedFixupMonochromeTags(false)
88 {
89     ATRACE_CALL();
90     ALOGV("%s: Created device for camera %s", __FUNCTION__, mId.string());
91 }
92 
~Camera3Device()93 Camera3Device::~Camera3Device()
94 {
95     ATRACE_CALL();
96     ALOGV("%s: Tearing down for camera id %s", __FUNCTION__, mId.string());
97     disconnectImpl();
98 }
99 
getId() const100 const String8& Camera3Device::getId() const {
101     return mId;
102 }
103 
initialize(sp<CameraProviderManager> manager,const String8 & monitorTags)104 status_t Camera3Device::initialize(sp<CameraProviderManager> manager, const String8& monitorTags) {
105     ATRACE_CALL();
106     Mutex::Autolock il(mInterfaceLock);
107     Mutex::Autolock l(mLock);
108 
109     ALOGV("%s: Initializing HIDL device for camera %s", __FUNCTION__, mId.string());
110     if (mStatus != STATUS_UNINITIALIZED) {
111         CLOGE("Already initialized!");
112         return INVALID_OPERATION;
113     }
114     if (manager == nullptr) return INVALID_OPERATION;
115 
116     sp<ICameraDeviceSession> session;
117     ATRACE_BEGIN("CameraHal::openSession");
118     status_t res = manager->openSession(mId.string(), this,
119             /*out*/ &session);
120     ATRACE_END();
121     if (res != OK) {
122         SET_ERR_L("Could not open camera session: %s (%d)", strerror(-res), res);
123         return res;
124     }
125 
126     res = manager->getCameraCharacteristics(mId.string(), &mDeviceInfo);
127     if (res != OK) {
128         SET_ERR_L("Could not retrieve camera characteristics: %s (%d)", strerror(-res), res);
129         session->close();
130         return res;
131     }
132 
133     std::vector<std::string> physicalCameraIds;
134     bool isLogical = manager->isLogicalCamera(mId.string(), &physicalCameraIds);
135     if (isLogical) {
136         for (auto& physicalId : physicalCameraIds) {
137             res = manager->getCameraCharacteristics(
138                     physicalId, &mPhysicalDeviceInfoMap[physicalId]);
139             if (res != OK) {
140                 SET_ERR_L("Could not retrieve camera %s characteristics: %s (%d)",
141                         physicalId.c_str(), strerror(-res), res);
142                 session->close();
143                 return res;
144             }
145 
146             if (DistortionMapper::isDistortionSupported(mPhysicalDeviceInfoMap[physicalId])) {
147                 mDistortionMappers[physicalId].setupStaticInfo(mPhysicalDeviceInfoMap[physicalId]);
148                 if (res != OK) {
149                     SET_ERR_L("Unable to read camera %s's calibration fields for distortion "
150                             "correction", physicalId.c_str());
151                     session->close();
152                     return res;
153                 }
154             }
155         }
156     }
157 
158     std::shared_ptr<RequestMetadataQueue> queue;
159     auto requestQueueRet = session->getCaptureRequestMetadataQueue(
160         [&queue](const auto& descriptor) {
161             queue = std::make_shared<RequestMetadataQueue>(descriptor);
162             if (!queue->isValid() || queue->availableToWrite() <= 0) {
163                 ALOGE("HAL returns empty request metadata fmq, not use it");
164                 queue = nullptr;
165                 // don't use the queue onwards.
166             }
167         });
168     if (!requestQueueRet.isOk()) {
169         ALOGE("Transaction error when getting request metadata fmq: %s, not use it",
170                 requestQueueRet.description().c_str());
171         return DEAD_OBJECT;
172     }
173 
174     std::unique_ptr<ResultMetadataQueue>& resQueue = mResultMetadataQueue;
175     auto resultQueueRet = session->getCaptureResultMetadataQueue(
176         [&resQueue](const auto& descriptor) {
177             resQueue = std::make_unique<ResultMetadataQueue>(descriptor);
178             if (!resQueue->isValid() || resQueue->availableToWrite() <= 0) {
179                 ALOGE("HAL returns empty result metadata fmq, not use it");
180                 resQueue = nullptr;
181                 // Don't use the resQueue onwards.
182             }
183         });
184     if (!resultQueueRet.isOk()) {
185         ALOGE("Transaction error when getting result metadata queue from camera session: %s",
186                 resultQueueRet.description().c_str());
187         return DEAD_OBJECT;
188     }
189     IF_ALOGV() {
190         session->interfaceChain([](
191             ::android::hardware::hidl_vec<::android::hardware::hidl_string> interfaceChain) {
192                 ALOGV("Session interface chain:");
193                 for (const auto& iface : interfaceChain) {
194                     ALOGV("  %s", iface.c_str());
195                 }
196             });
197     }
198 
199     camera_metadata_entry bufMgrMode =
200             mDeviceInfo.find(ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION);
201     if (bufMgrMode.count > 0) {
202          mUseHalBufManager = (bufMgrMode.data.u8[0] ==
203             ANDROID_INFO_SUPPORTED_BUFFER_MANAGEMENT_VERSION_HIDL_DEVICE_3_5);
204     }
205 
206     mInterface = new HalInterface(session, queue, mUseHalBufManager);
207     std::string providerType;
208     mVendorTagId = manager->getProviderTagIdLocked(mId.string());
209     mTagMonitor.initialize(mVendorTagId);
210     if (!monitorTags.isEmpty()) {
211         mTagMonitor.parseTagsToMonitor(String8(monitorTags));
212     }
213 
214     // Metadata tags needs fixup for monochrome camera device version less
215     // than 3.5.
216     hardware::hidl_version maxVersion{0,0};
217     res = manager->getHighestSupportedVersion(mId.string(), &maxVersion);
218     if (res != OK) {
219         ALOGE("%s: Error in getting camera device version id: %s (%d)",
220                 __FUNCTION__, strerror(-res), res);
221         return res;
222     }
223     int deviceVersion = HARDWARE_DEVICE_API_VERSION(
224             maxVersion.get_major(), maxVersion.get_minor());
225 
226     bool isMonochrome = false;
227     camera_metadata_entry_t entry = mDeviceInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
228     for (size_t i = 0; i < entry.count; i++) {
229         uint8_t capability = entry.data.u8[i];
230         if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) {
231             isMonochrome = true;
232         }
233     }
234     mNeedFixupMonochromeTags = (isMonochrome && deviceVersion < CAMERA_DEVICE_API_VERSION_3_5);
235 
236     return initializeCommonLocked();
237 }
238 
initializeCommonLocked()239 status_t Camera3Device::initializeCommonLocked() {
240 
241     /** Start up status tracker thread */
242     mStatusTracker = new StatusTracker(this);
243     status_t res = mStatusTracker->run(String8::format("C3Dev-%s-Status", mId.string()).string());
244     if (res != OK) {
245         SET_ERR_L("Unable to start status tracking thread: %s (%d)",
246                 strerror(-res), res);
247         mInterface->close();
248         mStatusTracker.clear();
249         return res;
250     }
251 
252     /** Register in-flight map to the status tracker */
253     mInFlightStatusId = mStatusTracker->addComponent();
254 
255     if (mUseHalBufManager) {
256         res = mRequestBufferSM.initialize(mStatusTracker);
257         if (res != OK) {
258             SET_ERR_L("Unable to start request buffer state machine: %s (%d)",
259                     strerror(-res), res);
260             mInterface->close();
261             mStatusTracker.clear();
262             return res;
263         }
264     }
265 
266     /** Create buffer manager */
267     mBufferManager = new Camera3BufferManager();
268 
269     Vector<int32_t> sessionParamKeys;
270     camera_metadata_entry_t sessionKeysEntry = mDeviceInfo.find(
271             ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
272     if (sessionKeysEntry.count > 0) {
273         sessionParamKeys.insertArrayAt(sessionKeysEntry.data.i32, 0, sessionKeysEntry.count);
274     }
275 
276     /** Start up request queue thread */
277     mRequestThread = new RequestThread(
278             this, mStatusTracker, mInterface, sessionParamKeys, mUseHalBufManager);
279     res = mRequestThread->run(String8::format("C3Dev-%s-ReqQueue", mId.string()).string());
280     if (res != OK) {
281         SET_ERR_L("Unable to start request queue thread: %s (%d)",
282                 strerror(-res), res);
283         mInterface->close();
284         mRequestThread.clear();
285         return res;
286     }
287 
288     mPreparerThread = new PreparerThread();
289 
290     internalUpdateStatusLocked(STATUS_UNCONFIGURED);
291     mNextStreamId = 0;
292     mDummyStreamId = NO_STREAM;
293     mNeedConfig = true;
294     mPauseStateNotify = false;
295 
296     // Measure the clock domain offset between camera and video/hw_composer
297     camera_metadata_entry timestampSource =
298             mDeviceInfo.find(ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE);
299     if (timestampSource.count > 0 && timestampSource.data.u8[0] ==
300             ANDROID_SENSOR_INFO_TIMESTAMP_SOURCE_REALTIME) {
301         mTimestampOffset = getMonoToBoottimeOffset();
302     }
303 
304     // Will the HAL be sending in early partial result metadata?
305     camera_metadata_entry partialResultsCount =
306             mDeviceInfo.find(ANDROID_REQUEST_PARTIAL_RESULT_COUNT);
307     if (partialResultsCount.count > 0) {
308         mNumPartialResults = partialResultsCount.data.i32[0];
309         mUsePartialResult = (mNumPartialResults > 1);
310     }
311 
312     camera_metadata_entry configs =
313             mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
314     for (uint32_t i = 0; i < configs.count; i += 4) {
315         if (configs.data.i32[i] == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
316                 configs.data.i32[i + 3] ==
317                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT) {
318             mSupportedOpaqueInputSizes.add(Size(configs.data.i32[i + 1],
319                     configs.data.i32[i + 2]));
320         }
321     }
322 
323     if (DistortionMapper::isDistortionSupported(mDeviceInfo)) {
324         res = mDistortionMappers[mId.c_str()].setupStaticInfo(mDeviceInfo);
325         if (res != OK) {
326             SET_ERR_L("Unable to read necessary calibration fields for distortion correction");
327             return res;
328         }
329     }
330     return OK;
331 }
332 
disconnect()333 status_t Camera3Device::disconnect() {
334     return disconnectImpl();
335 }
336 
disconnectImpl()337 status_t Camera3Device::disconnectImpl() {
338     ATRACE_CALL();
339     Mutex::Autolock il(mInterfaceLock);
340 
341     ALOGI("%s: E", __FUNCTION__);
342 
343     status_t res = OK;
344     std::vector<wp<Camera3StreamInterface>> streams;
345     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
346     {
347         Mutex::Autolock l(mLock);
348         if (mStatus == STATUS_UNINITIALIZED) return res;
349 
350         if (mStatus == STATUS_ACTIVE ||
351                 (mStatus == STATUS_ERROR && mRequestThread != NULL)) {
352             res = mRequestThread->clearRepeatingRequests();
353             if (res != OK) {
354                 SET_ERR_L("Can't stop streaming");
355                 // Continue to close device even in case of error
356             } else {
357                 res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
358                 if (res != OK) {
359                     SET_ERR_L("Timeout waiting for HAL to drain (% " PRIi64 " ns)",
360                             maxExpectedDuration);
361                     // Continue to close device even in case of error
362                 }
363             }
364         }
365 
366         if (mStatus == STATUS_ERROR) {
367             CLOGE("Shutting down in an error state");
368         }
369 
370         if (mStatusTracker != NULL) {
371             mStatusTracker->requestExit();
372         }
373 
374         if (mRequestThread != NULL) {
375             mRequestThread->requestExit();
376         }
377 
378         streams.reserve(mOutputStreams.size() + (mInputStream != nullptr ? 1 : 0));
379         for (size_t i = 0; i < mOutputStreams.size(); i++) {
380             streams.push_back(mOutputStreams[i]);
381         }
382         if (mInputStream != nullptr) {
383             streams.push_back(mInputStream);
384         }
385     }
386 
387     // Joining done without holding mLock, otherwise deadlocks may ensue
388     // as the threads try to access parent state
389     if (mRequestThread != NULL && mStatus != STATUS_ERROR) {
390         // HAL may be in a bad state, so waiting for request thread
391         // (which may be stuck in the HAL processCaptureRequest call)
392         // could be dangerous.
393         mRequestThread->join();
394     }
395 
396     if (mStatusTracker != NULL) {
397         mStatusTracker->join();
398     }
399 
400     HalInterface* interface;
401     {
402         Mutex::Autolock l(mLock);
403         mRequestThread.clear();
404         Mutex::Autolock stLock(mTrackerLock);
405         mStatusTracker.clear();
406         interface = mInterface.get();
407     }
408 
409     // Call close without internal mutex held, as the HAL close may need to
410     // wait on assorted callbacks,etc, to complete before it can return.
411     interface->close();
412 
413     flushInflightRequests();
414 
415     {
416         Mutex::Autolock l(mLock);
417         mInterface->clear();
418         mOutputStreams.clear();
419         mInputStream.clear();
420         mDeletedStreams.clear();
421         mBufferManager.clear();
422         internalUpdateStatusLocked(STATUS_UNINITIALIZED);
423     }
424 
425     for (auto& weakStream : streams) {
426         sp<Camera3StreamInterface> stream = weakStream.promote();
427         if (stream != nullptr) {
428             ALOGE("%s: Stream %d leaked! strong reference (%d)!",
429                     __FUNCTION__, stream->getId(), stream->getStrongCount() - 1);
430         }
431     }
432 
433     ALOGI("%s: X", __FUNCTION__);
434     return res;
435 }
436 
437 // For dumping/debugging only -
438 // try to acquire a lock a few times, eventually give up to proceed with
439 // debug/dump operations
tryLockSpinRightRound(Mutex & lock)440 bool Camera3Device::tryLockSpinRightRound(Mutex& lock) {
441     bool gotLock = false;
442     for (size_t i = 0; i < kDumpLockAttempts; ++i) {
443         if (lock.tryLock() == NO_ERROR) {
444             gotLock = true;
445             break;
446         } else {
447             usleep(kDumpSleepDuration);
448         }
449     }
450     return gotLock;
451 }
452 
getMaxJpegResolution() const453 Camera3Device::Size Camera3Device::getMaxJpegResolution() const {
454     int32_t maxJpegWidth = 0, maxJpegHeight = 0;
455     const int STREAM_CONFIGURATION_SIZE = 4;
456     const int STREAM_FORMAT_OFFSET = 0;
457     const int STREAM_WIDTH_OFFSET = 1;
458     const int STREAM_HEIGHT_OFFSET = 2;
459     const int STREAM_IS_INPUT_OFFSET = 3;
460     camera_metadata_ro_entry_t availableStreamConfigs =
461             mDeviceInfo.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
462     if (availableStreamConfigs.count == 0 ||
463             availableStreamConfigs.count % STREAM_CONFIGURATION_SIZE != 0) {
464         return Size(0, 0);
465     }
466 
467     // Get max jpeg size (area-wise).
468     for (size_t i=0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) {
469         int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET];
470         int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET];
471         int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET];
472         int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET];
473         if (isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT
474                 && format == HAL_PIXEL_FORMAT_BLOB &&
475                 (width * height > maxJpegWidth * maxJpegHeight)) {
476             maxJpegWidth = width;
477             maxJpegHeight = height;
478         }
479     }
480 
481     return Size(maxJpegWidth, maxJpegHeight);
482 }
483 
getMonoToBoottimeOffset()484 nsecs_t Camera3Device::getMonoToBoottimeOffset() {
485     // try three times to get the clock offset, choose the one
486     // with the minimum gap in measurements.
487     const int tries = 3;
488     nsecs_t bestGap, measured;
489     for (int i = 0; i < tries; ++i) {
490         const nsecs_t tmono = systemTime(SYSTEM_TIME_MONOTONIC);
491         const nsecs_t tbase = systemTime(SYSTEM_TIME_BOOTTIME);
492         const nsecs_t tmono2 = systemTime(SYSTEM_TIME_MONOTONIC);
493         const nsecs_t gap = tmono2 - tmono;
494         if (i == 0 || gap < bestGap) {
495             bestGap = gap;
496             measured = tbase - ((tmono + tmono2) >> 1);
497         }
498     }
499     return measured;
500 }
501 
mapToPixelFormat(int frameworkFormat)502 hardware::graphics::common::V1_0::PixelFormat Camera3Device::mapToPixelFormat(
503         int frameworkFormat) {
504     return (hardware::graphics::common::V1_0::PixelFormat) frameworkFormat;
505 }
506 
mapToHidlDataspace(android_dataspace dataSpace)507 DataspaceFlags Camera3Device::mapToHidlDataspace(
508         android_dataspace dataSpace) {
509     return dataSpace;
510 }
511 
mapToConsumerUsage(uint64_t usage)512 BufferUsageFlags Camera3Device::mapToConsumerUsage(
513         uint64_t usage) {
514     return usage;
515 }
516 
mapToStreamRotation(camera3_stream_rotation_t rotation)517 StreamRotation Camera3Device::mapToStreamRotation(camera3_stream_rotation_t rotation) {
518     switch (rotation) {
519         case CAMERA3_STREAM_ROTATION_0:
520             return StreamRotation::ROTATION_0;
521         case CAMERA3_STREAM_ROTATION_90:
522             return StreamRotation::ROTATION_90;
523         case CAMERA3_STREAM_ROTATION_180:
524             return StreamRotation::ROTATION_180;
525         case CAMERA3_STREAM_ROTATION_270:
526             return StreamRotation::ROTATION_270;
527     }
528     ALOGE("%s: Unknown stream rotation %d", __FUNCTION__, rotation);
529     return StreamRotation::ROTATION_0;
530 }
531 
mapToStreamConfigurationMode(camera3_stream_configuration_mode_t operationMode,StreamConfigurationMode * mode)532 status_t Camera3Device::mapToStreamConfigurationMode(
533         camera3_stream_configuration_mode_t operationMode, StreamConfigurationMode *mode) {
534     if (mode == nullptr) return BAD_VALUE;
535     if (operationMode < CAMERA3_VENDOR_STREAM_CONFIGURATION_MODE_START) {
536         switch(operationMode) {
537             case CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE:
538                 *mode = StreamConfigurationMode::NORMAL_MODE;
539                 break;
540             case CAMERA3_STREAM_CONFIGURATION_CONSTRAINED_HIGH_SPEED_MODE:
541                 *mode = StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE;
542                 break;
543             default:
544                 ALOGE("%s: Unknown stream configuration mode %d", __FUNCTION__, operationMode);
545                 return BAD_VALUE;
546         }
547     } else {
548         *mode = static_cast<StreamConfigurationMode>(operationMode);
549     }
550     return OK;
551 }
552 
mapHidlBufferStatus(BufferStatus status)553 camera3_buffer_status_t Camera3Device::mapHidlBufferStatus(BufferStatus status) {
554     switch (status) {
555         case BufferStatus::OK: return CAMERA3_BUFFER_STATUS_OK;
556         case BufferStatus::ERROR: return CAMERA3_BUFFER_STATUS_ERROR;
557     }
558     return CAMERA3_BUFFER_STATUS_ERROR;
559 }
560 
mapToFrameworkFormat(hardware::graphics::common::V1_0::PixelFormat pixelFormat)561 int Camera3Device::mapToFrameworkFormat(
562         hardware::graphics::common::V1_0::PixelFormat pixelFormat) {
563     return static_cast<uint32_t>(pixelFormat);
564 }
565 
mapToFrameworkDataspace(DataspaceFlags dataSpace)566 android_dataspace Camera3Device::mapToFrameworkDataspace(
567         DataspaceFlags dataSpace) {
568     return static_cast<android_dataspace>(dataSpace);
569 }
570 
mapConsumerToFrameworkUsage(BufferUsageFlags usage)571 uint64_t Camera3Device::mapConsumerToFrameworkUsage(
572         BufferUsageFlags usage) {
573     return usage;
574 }
575 
mapProducerToFrameworkUsage(BufferUsageFlags usage)576 uint64_t Camera3Device::mapProducerToFrameworkUsage(
577         BufferUsageFlags usage) {
578     return usage;
579 }
580 
getJpegBufferSize(uint32_t width,uint32_t height) const581 ssize_t Camera3Device::getJpegBufferSize(uint32_t width, uint32_t height) const {
582     // Get max jpeg size (area-wise).
583     Size maxJpegResolution = getMaxJpegResolution();
584     if (maxJpegResolution.width == 0) {
585         ALOGE("%s: Camera %s: Can't find valid available jpeg sizes in static metadata!",
586                 __FUNCTION__, mId.string());
587         return BAD_VALUE;
588     }
589 
590     // Get max jpeg buffer size
591     ssize_t maxJpegBufferSize = 0;
592     camera_metadata_ro_entry jpegBufMaxSize = mDeviceInfo.find(ANDROID_JPEG_MAX_SIZE);
593     if (jpegBufMaxSize.count == 0) {
594         ALOGE("%s: Camera %s: Can't find maximum JPEG size in static metadata!", __FUNCTION__,
595                 mId.string());
596         return BAD_VALUE;
597     }
598     maxJpegBufferSize = jpegBufMaxSize.data.i32[0];
599     assert(kMinJpegBufferSize < maxJpegBufferSize);
600 
601     // Calculate final jpeg buffer size for the given resolution.
602     float scaleFactor = ((float) (width * height)) /
603             (maxJpegResolution.width * maxJpegResolution.height);
604     ssize_t jpegBufferSize = scaleFactor * (maxJpegBufferSize - kMinJpegBufferSize) +
605             kMinJpegBufferSize;
606     if (jpegBufferSize > maxJpegBufferSize) {
607         jpegBufferSize = maxJpegBufferSize;
608     }
609 
610     return jpegBufferSize;
611 }
612 
getPointCloudBufferSize() const613 ssize_t Camera3Device::getPointCloudBufferSize() const {
614     const int FLOATS_PER_POINT=4;
615     camera_metadata_ro_entry maxPointCount = mDeviceInfo.find(ANDROID_DEPTH_MAX_DEPTH_SAMPLES);
616     if (maxPointCount.count == 0) {
617         ALOGE("%s: Camera %s: Can't find maximum depth point cloud size in static metadata!",
618                 __FUNCTION__, mId.string());
619         return BAD_VALUE;
620     }
621     ssize_t maxBytesForPointCloud = sizeof(android_depth_points) +
622             maxPointCount.data.i32[0] * sizeof(float) * FLOATS_PER_POINT;
623     return maxBytesForPointCloud;
624 }
625 
getRawOpaqueBufferSize(int32_t width,int32_t height) const626 ssize_t Camera3Device::getRawOpaqueBufferSize(int32_t width, int32_t height) const {
627     const int PER_CONFIGURATION_SIZE = 3;
628     const int WIDTH_OFFSET = 0;
629     const int HEIGHT_OFFSET = 1;
630     const int SIZE_OFFSET = 2;
631     camera_metadata_ro_entry rawOpaqueSizes =
632         mDeviceInfo.find(ANDROID_SENSOR_OPAQUE_RAW_SIZE);
633     size_t count = rawOpaqueSizes.count;
634     if (count == 0 || (count % PER_CONFIGURATION_SIZE)) {
635         ALOGE("%s: Camera %s: bad opaque RAW size static metadata length(%zu)!",
636                 __FUNCTION__, mId.string(), count);
637         return BAD_VALUE;
638     }
639 
640     for (size_t i = 0; i < count; i += PER_CONFIGURATION_SIZE) {
641         if (width == rawOpaqueSizes.data.i32[i + WIDTH_OFFSET] &&
642                 height == rawOpaqueSizes.data.i32[i + HEIGHT_OFFSET]) {
643             return rawOpaqueSizes.data.i32[i + SIZE_OFFSET];
644         }
645     }
646 
647     ALOGE("%s: Camera %s: cannot find size for %dx%d opaque RAW image!",
648             __FUNCTION__, mId.string(), width, height);
649     return BAD_VALUE;
650 }
651 
dump(int fd,const Vector<String16> & args)652 status_t Camera3Device::dump(int fd, const Vector<String16> &args) {
653     ATRACE_CALL();
654     (void)args;
655 
656     // Try to lock, but continue in case of failure (to avoid blocking in
657     // deadlocks)
658     bool gotInterfaceLock = tryLockSpinRightRound(mInterfaceLock);
659     bool gotLock = tryLockSpinRightRound(mLock);
660 
661     ALOGW_IF(!gotInterfaceLock,
662             "Camera %s: %s: Unable to lock interface lock, proceeding anyway",
663             mId.string(), __FUNCTION__);
664     ALOGW_IF(!gotLock,
665             "Camera %s: %s: Unable to lock main lock, proceeding anyway",
666             mId.string(), __FUNCTION__);
667 
668     bool dumpTemplates = false;
669 
670     String16 templatesOption("-t");
671     int n = args.size();
672     for (int i = 0; i < n; i++) {
673         if (args[i] == templatesOption) {
674             dumpTemplates = true;
675         }
676         if (args[i] == TagMonitor::kMonitorOption) {
677             if (i + 1 < n) {
678                 String8 monitorTags = String8(args[i + 1]);
679                 if (monitorTags == "off") {
680                     mTagMonitor.disableMonitoring();
681                 } else {
682                     mTagMonitor.parseTagsToMonitor(monitorTags);
683                 }
684             } else {
685                 mTagMonitor.disableMonitoring();
686             }
687         }
688     }
689 
690     String8 lines;
691 
692     const char *status =
693             mStatus == STATUS_ERROR         ? "ERROR" :
694             mStatus == STATUS_UNINITIALIZED ? "UNINITIALIZED" :
695             mStatus == STATUS_UNCONFIGURED  ? "UNCONFIGURED" :
696             mStatus == STATUS_CONFIGURED    ? "CONFIGURED" :
697             mStatus == STATUS_ACTIVE        ? "ACTIVE" :
698             "Unknown";
699 
700     lines.appendFormat("    Device status: %s\n", status);
701     if (mStatus == STATUS_ERROR) {
702         lines.appendFormat("    Error cause: %s\n", mErrorCause.string());
703     }
704     lines.appendFormat("    Stream configuration:\n");
705     const char *mode =
706             mOperatingMode == static_cast<int>(StreamConfigurationMode::NORMAL_MODE) ? "NORMAL" :
707             mOperatingMode == static_cast<int>(
708                 StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE) ? "CONSTRAINED_HIGH_SPEED" :
709             "CUSTOM";
710     lines.appendFormat("    Operation mode: %s (%d) \n", mode, mOperatingMode);
711 
712     if (mInputStream != NULL) {
713         write(fd, lines.string(), lines.size());
714         mInputStream->dump(fd, args);
715     } else {
716         lines.appendFormat("      No input stream.\n");
717         write(fd, lines.string(), lines.size());
718     }
719     for (size_t i = 0; i < mOutputStreams.size(); i++) {
720         mOutputStreams[i]->dump(fd,args);
721     }
722 
723     if (mBufferManager != NULL) {
724         lines = String8("    Camera3 Buffer Manager:\n");
725         write(fd, lines.string(), lines.size());
726         mBufferManager->dump(fd, args);
727     }
728 
729     lines = String8("    In-flight requests:\n");
730     if (mInFlightMap.size() == 0) {
731         lines.append("      None\n");
732     } else {
733         for (size_t i = 0; i < mInFlightMap.size(); i++) {
734             InFlightRequest r = mInFlightMap.valueAt(i);
735             lines.appendFormat("      Frame %d |  Timestamp: %" PRId64 ", metadata"
736                     " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i),
737                     r.shutterTimestamp, r.haveResultMetadata ? "true" : "false",
738                     r.numBuffersLeft);
739         }
740     }
741     write(fd, lines.string(), lines.size());
742 
743     if (mRequestThread != NULL) {
744         mRequestThread->dumpCaptureRequestLatency(fd,
745                 "    ProcessCaptureRequest latency histogram:");
746     }
747 
748     {
749         lines = String8("    Last request sent:\n");
750         write(fd, lines.string(), lines.size());
751 
752         CameraMetadata lastRequest = getLatestRequestLocked();
753         lastRequest.dump(fd, /*verbosity*/2, /*indentation*/6);
754     }
755 
756     if (dumpTemplates) {
757         const char *templateNames[CAMERA3_TEMPLATE_COUNT] = {
758             "TEMPLATE_PREVIEW",
759             "TEMPLATE_STILL_CAPTURE",
760             "TEMPLATE_VIDEO_RECORD",
761             "TEMPLATE_VIDEO_SNAPSHOT",
762             "TEMPLATE_ZERO_SHUTTER_LAG",
763             "TEMPLATE_MANUAL",
764         };
765 
766         for (int i = 1; i < CAMERA3_TEMPLATE_COUNT; i++) {
767             camera_metadata_t *templateRequest = nullptr;
768             mInterface->constructDefaultRequestSettings(
769                     (camera3_request_template_t) i, &templateRequest);
770             lines = String8::format("    HAL Request %s:\n", templateNames[i-1]);
771             if (templateRequest == nullptr) {
772                 lines.append("       Not supported\n");
773                 write(fd, lines.string(), lines.size());
774             } else {
775                 write(fd, lines.string(), lines.size());
776                 dump_indented_camera_metadata(templateRequest,
777                         fd, /*verbosity*/2, /*indentation*/8);
778             }
779             free_camera_metadata(templateRequest);
780         }
781     }
782 
783     mTagMonitor.dumpMonitoredMetadata(fd);
784 
785     if (mInterface->valid()) {
786         lines = String8("     HAL device dump:\n");
787         write(fd, lines.string(), lines.size());
788         mInterface->dump(fd);
789     }
790 
791     if (gotLock) mLock.unlock();
792     if (gotInterfaceLock) mInterfaceLock.unlock();
793 
794     return OK;
795 }
796 
info(const String8 & physicalId) const797 const CameraMetadata& Camera3Device::info(const String8& physicalId) const {
798     ALOGVV("%s: E", __FUNCTION__);
799     if (CC_UNLIKELY(mStatus == STATUS_UNINITIALIZED ||
800                     mStatus == STATUS_ERROR)) {
801         ALOGW("%s: Access to static info %s!", __FUNCTION__,
802                 mStatus == STATUS_ERROR ?
803                 "when in error state" : "before init");
804     }
805     if (physicalId.isEmpty()) {
806         return mDeviceInfo;
807     } else {
808         std::string id(physicalId.c_str());
809         if (mPhysicalDeviceInfoMap.find(id) != mPhysicalDeviceInfoMap.end()) {
810             return mPhysicalDeviceInfoMap.at(id);
811         } else {
812             ALOGE("%s: Invalid physical camera id %s", __FUNCTION__, physicalId.c_str());
813             return mDeviceInfo;
814         }
815     }
816 }
817 
info() const818 const CameraMetadata& Camera3Device::info() const {
819     String8 emptyId;
820     return info(emptyId);
821 }
822 
checkStatusOkToCaptureLocked()823 status_t Camera3Device::checkStatusOkToCaptureLocked() {
824     switch (mStatus) {
825         case STATUS_ERROR:
826             CLOGE("Device has encountered a serious error");
827             return INVALID_OPERATION;
828         case STATUS_UNINITIALIZED:
829             CLOGE("Device not initialized");
830             return INVALID_OPERATION;
831         case STATUS_UNCONFIGURED:
832         case STATUS_CONFIGURED:
833         case STATUS_ACTIVE:
834             // OK
835             break;
836         default:
837             SET_ERR_L("Unexpected status: %d", mStatus);
838             return INVALID_OPERATION;
839     }
840     return OK;
841 }
842 
convertMetadataListToRequestListLocked(const List<const PhysicalCameraSettingsList> & metadataList,const std::list<const SurfaceMap> & surfaceMaps,bool repeating,RequestList * requestList)843 status_t Camera3Device::convertMetadataListToRequestListLocked(
844         const List<const PhysicalCameraSettingsList> &metadataList,
845         const std::list<const SurfaceMap> &surfaceMaps,
846         bool repeating,
847         RequestList *requestList) {
848     if (requestList == NULL) {
849         CLOGE("requestList cannot be NULL.");
850         return BAD_VALUE;
851     }
852 
853     int32_t burstId = 0;
854     List<const PhysicalCameraSettingsList>::const_iterator metadataIt = metadataList.begin();
855     std::list<const SurfaceMap>::const_iterator surfaceMapIt = surfaceMaps.begin();
856     for (; metadataIt != metadataList.end() && surfaceMapIt != surfaceMaps.end();
857             ++metadataIt, ++surfaceMapIt) {
858         sp<CaptureRequest> newRequest = setUpRequestLocked(*metadataIt, *surfaceMapIt);
859         if (newRequest == 0) {
860             CLOGE("Can't create capture request");
861             return BAD_VALUE;
862         }
863 
864         newRequest->mRepeating = repeating;
865 
866         // Setup burst Id and request Id
867         newRequest->mResultExtras.burstId = burstId++;
868         if (metadataIt->begin()->metadata.exists(ANDROID_REQUEST_ID)) {
869             if (metadataIt->begin()->metadata.find(ANDROID_REQUEST_ID).count == 0) {
870                 CLOGE("RequestID entry exists; but must not be empty in metadata");
871                 return BAD_VALUE;
872             }
873             newRequest->mResultExtras.requestId = metadataIt->begin()->metadata.find(
874                     ANDROID_REQUEST_ID).data.i32[0];
875         } else {
876             CLOGE("RequestID does not exist in metadata");
877             return BAD_VALUE;
878         }
879 
880         requestList->push_back(newRequest);
881 
882         ALOGV("%s: requestId = %" PRId32, __FUNCTION__, newRequest->mResultExtras.requestId);
883     }
884     if (metadataIt != metadataList.end() || surfaceMapIt != surfaceMaps.end()) {
885         ALOGE("%s: metadataList and surfaceMaps are not the same size!", __FUNCTION__);
886         return BAD_VALUE;
887     }
888 
889     // Setup batch size if this is a high speed video recording request.
890     if (mIsConstrainedHighSpeedConfiguration && requestList->size() > 0) {
891         auto firstRequest = requestList->begin();
892         for (auto& outputStream : (*firstRequest)->mOutputStreams) {
893             if (outputStream->isVideoStream()) {
894                 (*firstRequest)->mBatchSize = requestList->size();
895                 break;
896             }
897         }
898     }
899 
900     return OK;
901 }
902 
capture(CameraMetadata & request,int64_t * lastFrameNumber)903 status_t Camera3Device::capture(CameraMetadata &request, int64_t* lastFrameNumber) {
904     ATRACE_CALL();
905 
906     List<const PhysicalCameraSettingsList> requestsList;
907     std::list<const SurfaceMap> surfaceMaps;
908     convertToRequestList(requestsList, surfaceMaps, request);
909 
910     return captureList(requestsList, surfaceMaps, lastFrameNumber);
911 }
912 
convertToRequestList(List<const PhysicalCameraSettingsList> & requestsList,std::list<const SurfaceMap> & surfaceMaps,const CameraMetadata & request)913 void Camera3Device::convertToRequestList(List<const PhysicalCameraSettingsList>& requestsList,
914         std::list<const SurfaceMap>& surfaceMaps,
915         const CameraMetadata& request) {
916     PhysicalCameraSettingsList requestList;
917     requestList.push_back({std::string(getId().string()), request});
918     requestsList.push_back(requestList);
919 
920     SurfaceMap surfaceMap;
921     camera_metadata_ro_entry streams = request.find(ANDROID_REQUEST_OUTPUT_STREAMS);
922     // With no surface list passed in, stream and surface will have 1-to-1
923     // mapping. So the surface index is 0 for each stream in the surfaceMap.
924     for (size_t i = 0; i < streams.count; i++) {
925         surfaceMap[streams.data.i32[i]].push_back(0);
926     }
927     surfaceMaps.push_back(surfaceMap);
928 }
929 
submitRequestsHelper(const List<const PhysicalCameraSettingsList> & requests,const std::list<const SurfaceMap> & surfaceMaps,bool repeating,int64_t * lastFrameNumber)930 status_t Camera3Device::submitRequestsHelper(
931         const List<const PhysicalCameraSettingsList> &requests,
932         const std::list<const SurfaceMap> &surfaceMaps,
933         bool repeating,
934         /*out*/
935         int64_t *lastFrameNumber) {
936     ATRACE_CALL();
937     Mutex::Autolock il(mInterfaceLock);
938     Mutex::Autolock l(mLock);
939 
940     status_t res = checkStatusOkToCaptureLocked();
941     if (res != OK) {
942         // error logged by previous call
943         return res;
944     }
945 
946     RequestList requestList;
947 
948     res = convertMetadataListToRequestListLocked(requests, surfaceMaps,
949             repeating, /*out*/&requestList);
950     if (res != OK) {
951         // error logged by previous call
952         return res;
953     }
954 
955     if (repeating) {
956         res = mRequestThread->setRepeatingRequests(requestList, lastFrameNumber);
957     } else {
958         res = mRequestThread->queueRequestList(requestList, lastFrameNumber);
959     }
960 
961     if (res == OK) {
962         waitUntilStateThenRelock(/*active*/true, kActiveTimeout);
963         if (res != OK) {
964             SET_ERR_L("Can't transition to active in %f seconds!",
965                     kActiveTimeout/1e9);
966         }
967         ALOGV("Camera %s: Capture request %" PRId32 " enqueued", mId.string(),
968               (*(requestList.begin()))->mResultExtras.requestId);
969     } else {
970         CLOGE("Cannot queue request. Impossible.");
971         return BAD_VALUE;
972     }
973 
974     return res;
975 }
976 
requestStreamBuffers(const hardware::hidl_vec<hardware::camera::device::V3_5::BufferRequest> & bufReqs,requestStreamBuffers_cb _hidl_cb)977 hardware::Return<void> Camera3Device::requestStreamBuffers(
978         const hardware::hidl_vec<hardware::camera::device::V3_5::BufferRequest>& bufReqs,
979         requestStreamBuffers_cb _hidl_cb) {
980     using hardware::camera::device::V3_5::BufferRequestStatus;
981     using hardware::camera::device::V3_5::StreamBufferRet;
982     using hardware::camera::device::V3_5::StreamBufferRequestError;
983 
984     std::lock_guard<std::mutex> lock(mRequestBufferInterfaceLock);
985 
986     hardware::hidl_vec<StreamBufferRet> bufRets;
987     if (!mUseHalBufManager) {
988         ALOGE("%s: Camera %s does not support HAL buffer management",
989                 __FUNCTION__, mId.string());
990         _hidl_cb(BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS, bufRets);
991         return hardware::Void();
992     }
993 
994     SortedVector<int32_t> streamIds;
995     ssize_t sz = streamIds.setCapacity(bufReqs.size());
996     if (sz < 0 || static_cast<size_t>(sz) != bufReqs.size()) {
997         ALOGE("%s: failed to allocate memory for %zu buffer requests",
998                 __FUNCTION__, bufReqs.size());
999         _hidl_cb(BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS, bufRets);
1000         return hardware::Void();
1001     }
1002 
1003     if (bufReqs.size() > mOutputStreams.size()) {
1004         ALOGE("%s: too many buffer requests (%zu > # of output streams %zu)",
1005                 __FUNCTION__, bufReqs.size(), mOutputStreams.size());
1006         _hidl_cb(BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS, bufRets);
1007         return hardware::Void();
1008     }
1009 
1010     // Check for repeated streamId
1011     for (const auto& bufReq : bufReqs) {
1012         if (streamIds.indexOf(bufReq.streamId) != NAME_NOT_FOUND) {
1013             ALOGE("%s: Stream %d appear multiple times in buffer requests",
1014                     __FUNCTION__, bufReq.streamId);
1015             _hidl_cb(BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS, bufRets);
1016             return hardware::Void();
1017         }
1018         streamIds.add(bufReq.streamId);
1019     }
1020 
1021     if (!mRequestBufferSM.startRequestBuffer()) {
1022         ALOGE("%s: request buffer disallowed while camera service is configuring",
1023                 __FUNCTION__);
1024         _hidl_cb(BufferRequestStatus::FAILED_CONFIGURING, bufRets);
1025         return hardware::Void();
1026     }
1027 
1028     bufRets.resize(bufReqs.size());
1029 
1030     bool allReqsSucceeds = true;
1031     bool oneReqSucceeds = false;
1032     for (size_t i = 0; i < bufReqs.size(); i++) {
1033         const auto& bufReq = bufReqs[i];
1034         auto& bufRet = bufRets[i];
1035         int32_t streamId = bufReq.streamId;
1036         sp<Camera3OutputStreamInterface> outputStream = mOutputStreams.get(streamId);
1037         if (outputStream == nullptr) {
1038             ALOGE("%s: Output stream id %d not found!", __FUNCTION__, streamId);
1039             hardware::hidl_vec<StreamBufferRet> emptyBufRets;
1040             _hidl_cb(BufferRequestStatus::FAILED_ILLEGAL_ARGUMENTS, emptyBufRets);
1041             mRequestBufferSM.endRequestBuffer();
1042             return hardware::Void();
1043         }
1044 
1045         if (outputStream->isAbandoned()) {
1046             bufRet.val.error(StreamBufferRequestError::STREAM_DISCONNECTED);
1047             allReqsSucceeds = false;
1048             continue;
1049         }
1050 
1051         bufRet.streamId = streamId;
1052         size_t handOutBufferCount = outputStream->getOutstandingBuffersCount();
1053         uint32_t numBuffersRequested = bufReq.numBuffersRequested;
1054         size_t totalHandout = handOutBufferCount + numBuffersRequested;
1055         uint32_t maxBuffers = outputStream->asHalStream()->max_buffers;
1056         if (totalHandout > maxBuffers) {
1057             // Not able to allocate enough buffer. Exit early for this stream
1058             ALOGE("%s: request too much buffers for stream %d: at HAL: %zu + requesting: %d"
1059                     " > max: %d", __FUNCTION__, streamId, handOutBufferCount,
1060                     numBuffersRequested, maxBuffers);
1061             bufRet.val.error(StreamBufferRequestError::MAX_BUFFER_EXCEEDED);
1062             allReqsSucceeds = false;
1063             continue;
1064         }
1065 
1066         hardware::hidl_vec<StreamBuffer> tmpRetBuffers(numBuffersRequested);
1067         bool currentReqSucceeds = true;
1068         std::vector<camera3_stream_buffer_t> streamBuffers(numBuffersRequested);
1069         size_t numAllocatedBuffers = 0;
1070         size_t numPushedInflightBuffers = 0;
1071         for (size_t b = 0; b < numBuffersRequested; b++) {
1072             camera3_stream_buffer_t& sb = streamBuffers[b];
1073             // Since this method can run concurrently with request thread
1074             // We need to update the wait duration everytime we call getbuffer
1075             nsecs_t waitDuration = kBaseGetBufferWait + getExpectedInFlightDuration();
1076             status_t res = outputStream->getBuffer(&sb, waitDuration);
1077             if (res != OK) {
1078                 if (res == NO_INIT || res == DEAD_OBJECT) {
1079                     ALOGV("%s: Can't get output buffer for stream %d: %s (%d)",
1080                             __FUNCTION__, streamId, strerror(-res), res);
1081                     bufRet.val.error(StreamBufferRequestError::STREAM_DISCONNECTED);
1082                 } else {
1083                     ALOGE("%s: Can't get output buffer for stream %d: %s (%d)",
1084                             __FUNCTION__, streamId, strerror(-res), res);
1085                     if (res == TIMED_OUT || res == NO_MEMORY) {
1086                         bufRet.val.error(StreamBufferRequestError::NO_BUFFER_AVAILABLE);
1087                     } else {
1088                         bufRet.val.error(StreamBufferRequestError::UNKNOWN_ERROR);
1089                     }
1090                 }
1091                 currentReqSucceeds = false;
1092                 break;
1093             }
1094             numAllocatedBuffers++;
1095 
1096             buffer_handle_t *buffer = sb.buffer;
1097             auto pair = mInterface->getBufferId(*buffer, streamId);
1098             bool isNewBuffer = pair.first;
1099             uint64_t bufferId = pair.second;
1100             StreamBuffer& hBuf = tmpRetBuffers[b];
1101 
1102             hBuf.streamId = streamId;
1103             hBuf.bufferId = bufferId;
1104             hBuf.buffer = (isNewBuffer) ? *buffer : nullptr;
1105             hBuf.status = BufferStatus::OK;
1106             hBuf.releaseFence = nullptr;
1107 
1108             native_handle_t *acquireFence = nullptr;
1109             if (sb.acquire_fence != -1) {
1110                 acquireFence = native_handle_create(1,0);
1111                 acquireFence->data[0] = sb.acquire_fence;
1112             }
1113             hBuf.acquireFence.setTo(acquireFence, /*shouldOwn*/true);
1114             hBuf.releaseFence = nullptr;
1115 
1116             res = mInterface->pushInflightRequestBuffer(bufferId, buffer, streamId);
1117             if (res != OK) {
1118                 ALOGE("%s: Can't get register request buffers for stream %d: %s (%d)",
1119                         __FUNCTION__, streamId, strerror(-res), res);
1120                 bufRet.val.error(StreamBufferRequestError::UNKNOWN_ERROR);
1121                 currentReqSucceeds = false;
1122                 break;
1123             }
1124             numPushedInflightBuffers++;
1125         }
1126         if (currentReqSucceeds) {
1127             bufRet.val.buffers(std::move(tmpRetBuffers));
1128             oneReqSucceeds = true;
1129         } else {
1130             allReqsSucceeds = false;
1131             for (size_t b = 0; b < numPushedInflightBuffers; b++) {
1132                 StreamBuffer& hBuf = tmpRetBuffers[b];
1133                 buffer_handle_t* buffer;
1134                 status_t res = mInterface->popInflightRequestBuffer(hBuf.bufferId, &buffer);
1135                 if (res != OK) {
1136                     SET_ERR("%s: popInflightRequestBuffer failed for stream %d: %s (%d)",
1137                             __FUNCTION__, streamId, strerror(-res), res);
1138                 }
1139             }
1140             for (size_t b = 0; b < numAllocatedBuffers; b++) {
1141                 camera3_stream_buffer_t& sb = streamBuffers[b];
1142                 sb.acquire_fence = -1;
1143                 sb.status = CAMERA3_BUFFER_STATUS_ERROR;
1144             }
1145             returnOutputBuffers(streamBuffers.data(), numAllocatedBuffers, 0);
1146         }
1147     }
1148 
1149     _hidl_cb(allReqsSucceeds ? BufferRequestStatus::OK :
1150             oneReqSucceeds ? BufferRequestStatus::FAILED_PARTIAL :
1151                              BufferRequestStatus::FAILED_UNKNOWN,
1152             bufRets);
1153     mRequestBufferSM.endRequestBuffer();
1154     return hardware::Void();
1155 }
1156 
returnStreamBuffers(const hardware::hidl_vec<hardware::camera::device::V3_2::StreamBuffer> & buffers)1157 hardware::Return<void> Camera3Device::returnStreamBuffers(
1158         const hardware::hidl_vec<hardware::camera::device::V3_2::StreamBuffer>& buffers) {
1159     if (!mUseHalBufManager) {
1160         ALOGE("%s: Camera %s does not support HAL buffer managerment",
1161                 __FUNCTION__, mId.string());
1162         return hardware::Void();
1163     }
1164 
1165     for (const auto& buf : buffers) {
1166         if (buf.bufferId == HalInterface::BUFFER_ID_NO_BUFFER) {
1167             ALOGE("%s: cannot return a buffer without bufferId", __FUNCTION__);
1168             continue;
1169         }
1170 
1171         buffer_handle_t* buffer;
1172         status_t res = mInterface->popInflightRequestBuffer(buf.bufferId, &buffer);
1173 
1174         if (res != OK) {
1175             ALOGE("%s: cannot find in-flight buffer %" PRIu64 " for stream %d",
1176                     __FUNCTION__, buf.bufferId, buf.streamId);
1177             continue;
1178         }
1179 
1180         camera3_stream_buffer_t streamBuffer;
1181         streamBuffer.buffer = buffer;
1182         streamBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
1183         streamBuffer.acquire_fence = -1;
1184         streamBuffer.release_fence = -1;
1185 
1186         if (buf.releaseFence == nullptr) {
1187             streamBuffer.release_fence = -1;
1188         } else if (buf.releaseFence->numFds == 1) {
1189             streamBuffer.release_fence = dup(buf.releaseFence->data[0]);
1190         } else {
1191             ALOGE("%s: Invalid release fence, fd count is %d, not 1",
1192                     __FUNCTION__, buf.releaseFence->numFds);
1193             continue;
1194         }
1195 
1196         sp<Camera3StreamInterface> stream = mOutputStreams.get(buf.streamId);
1197         if (stream == nullptr) {
1198             ALOGE("%s: Output stream id %d not found!", __FUNCTION__, buf.streamId);
1199             continue;
1200         }
1201         streamBuffer.stream = stream->asHalStream();
1202         returnOutputBuffers(&streamBuffer, /*size*/1, /*timestamp*/ 0);
1203     }
1204     return hardware::Void();
1205 }
1206 
processCaptureResult_3_4(const hardware::hidl_vec<hardware::camera::device::V3_4::CaptureResult> & results)1207 hardware::Return<void> Camera3Device::processCaptureResult_3_4(
1208         const hardware::hidl_vec<
1209                 hardware::camera::device::V3_4::CaptureResult>& results) {
1210     // Ideally we should grab mLock, but that can lead to deadlock, and
1211     // it's not super important to get up to date value of mStatus for this
1212     // warning print, hence skipping the lock here
1213     if (mStatus == STATUS_ERROR) {
1214         // Per API contract, HAL should act as closed after device error
1215         // But mStatus can be set to error by framework as well, so just log
1216         // a warning here.
1217         ALOGW("%s: received capture result in error state.", __FUNCTION__);
1218     }
1219 
1220     if (mProcessCaptureResultLock.tryLock() != OK) {
1221         // This should never happen; it indicates a wrong client implementation
1222         // that doesn't follow the contract. But, we can be tolerant here.
1223         ALOGE("%s: callback overlapped! waiting 1s...",
1224                 __FUNCTION__);
1225         if (mProcessCaptureResultLock.timedLock(1000000000 /* 1s */) != OK) {
1226             ALOGE("%s: cannot acquire lock in 1s, dropping results",
1227                     __FUNCTION__);
1228             // really don't know what to do, so bail out.
1229             return hardware::Void();
1230         }
1231     }
1232     for (const auto& result : results) {
1233         processOneCaptureResultLocked(result.v3_2, result.physicalCameraMetadata);
1234     }
1235     mProcessCaptureResultLock.unlock();
1236     return hardware::Void();
1237 }
1238 
1239 // Only one processCaptureResult should be called at a time, so
1240 // the locks won't block. The locks are present here simply to enforce this.
processCaptureResult(const hardware::hidl_vec<hardware::camera::device::V3_2::CaptureResult> & results)1241 hardware::Return<void> Camera3Device::processCaptureResult(
1242         const hardware::hidl_vec<
1243                 hardware::camera::device::V3_2::CaptureResult>& results) {
1244     hardware::hidl_vec<hardware::camera::device::V3_4::PhysicalCameraMetadata> noPhysMetadata;
1245 
1246     // Ideally we should grab mLock, but that can lead to deadlock, and
1247     // it's not super important to get up to date value of mStatus for this
1248     // warning print, hence skipping the lock here
1249     if (mStatus == STATUS_ERROR) {
1250         // Per API contract, HAL should act as closed after device error
1251         // But mStatus can be set to error by framework as well, so just log
1252         // a warning here.
1253         ALOGW("%s: received capture result in error state.", __FUNCTION__);
1254     }
1255 
1256     if (mProcessCaptureResultLock.tryLock() != OK) {
1257         // This should never happen; it indicates a wrong client implementation
1258         // that doesn't follow the contract. But, we can be tolerant here.
1259         ALOGE("%s: callback overlapped! waiting 1s...",
1260                 __FUNCTION__);
1261         if (mProcessCaptureResultLock.timedLock(1000000000 /* 1s */) != OK) {
1262             ALOGE("%s: cannot acquire lock in 1s, dropping results",
1263                     __FUNCTION__);
1264             // really don't know what to do, so bail out.
1265             return hardware::Void();
1266         }
1267     }
1268     for (const auto& result : results) {
1269         processOneCaptureResultLocked(result, noPhysMetadata);
1270     }
1271     mProcessCaptureResultLock.unlock();
1272     return hardware::Void();
1273 }
1274 
readOneCameraMetadataLocked(uint64_t fmqResultSize,hardware::camera::device::V3_2::CameraMetadata & resultMetadata,const hardware::camera::device::V3_2::CameraMetadata & result)1275 status_t Camera3Device::readOneCameraMetadataLocked(
1276         uint64_t fmqResultSize, hardware::camera::device::V3_2::CameraMetadata& resultMetadata,
1277         const hardware::camera::device::V3_2::CameraMetadata& result) {
1278     if (fmqResultSize > 0) {
1279         resultMetadata.resize(fmqResultSize);
1280         if (mResultMetadataQueue == nullptr) {
1281             return NO_MEMORY; // logged in initialize()
1282         }
1283         if (!mResultMetadataQueue->read(resultMetadata.data(), fmqResultSize)) {
1284             ALOGE("%s: Cannot read camera metadata from fmq, size = %" PRIu64,
1285                     __FUNCTION__, fmqResultSize);
1286             return INVALID_OPERATION;
1287         }
1288     } else {
1289         resultMetadata.setToExternal(const_cast<uint8_t *>(result.data()),
1290                 result.size());
1291     }
1292 
1293     if (resultMetadata.size() != 0) {
1294         status_t res;
1295         const camera_metadata_t* metadata =
1296                 reinterpret_cast<const camera_metadata_t*>(resultMetadata.data());
1297         size_t expected_metadata_size = resultMetadata.size();
1298         if ((res = validate_camera_metadata_structure(metadata, &expected_metadata_size)) != OK) {
1299             ALOGE("%s: Invalid camera metadata received by camera service from HAL: %s (%d)",
1300                     __FUNCTION__, strerror(-res), res);
1301             return INVALID_OPERATION;
1302         }
1303     }
1304 
1305     return OK;
1306 }
1307 
processOneCaptureResultLocked(const hardware::camera::device::V3_2::CaptureResult & result,const hardware::hidl_vec<hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadata)1308 void Camera3Device::processOneCaptureResultLocked(
1309         const hardware::camera::device::V3_2::CaptureResult& result,
1310         const hardware::hidl_vec<
1311                 hardware::camera::device::V3_4::PhysicalCameraMetadata> physicalCameraMetadata) {
1312     camera3_capture_result r;
1313     status_t res;
1314     r.frame_number = result.frameNumber;
1315 
1316     // Read and validate the result metadata.
1317     hardware::camera::device::V3_2::CameraMetadata resultMetadata;
1318     res = readOneCameraMetadataLocked(result.fmqResultSize, resultMetadata, result.result);
1319     if (res != OK) {
1320         ALOGE("%s: Frame %d: Failed to read capture result metadata",
1321                 __FUNCTION__, result.frameNumber);
1322         return;
1323     }
1324     r.result = reinterpret_cast<const camera_metadata_t*>(resultMetadata.data());
1325 
1326     // Read and validate physical camera metadata
1327     size_t physResultCount = physicalCameraMetadata.size();
1328     std::vector<const char*> physCamIds(physResultCount);
1329     std::vector<const camera_metadata_t *> phyCamMetadatas(physResultCount);
1330     std::vector<hardware::camera::device::V3_2::CameraMetadata> physResultMetadata;
1331     physResultMetadata.resize(physResultCount);
1332     for (size_t i = 0; i < physicalCameraMetadata.size(); i++) {
1333         res = readOneCameraMetadataLocked(physicalCameraMetadata[i].fmqMetadataSize,
1334                 physResultMetadata[i], physicalCameraMetadata[i].metadata);
1335         if (res != OK) {
1336             ALOGE("%s: Frame %d: Failed to read capture result metadata for camera %s",
1337                     __FUNCTION__, result.frameNumber,
1338                     physicalCameraMetadata[i].physicalCameraId.c_str());
1339             return;
1340         }
1341         physCamIds[i] = physicalCameraMetadata[i].physicalCameraId.c_str();
1342         phyCamMetadatas[i] = reinterpret_cast<const camera_metadata_t*>(
1343                 physResultMetadata[i].data());
1344     }
1345     r.num_physcam_metadata = physResultCount;
1346     r.physcam_ids = physCamIds.data();
1347     r.physcam_metadata = phyCamMetadatas.data();
1348 
1349     std::vector<camera3_stream_buffer_t> outputBuffers(result.outputBuffers.size());
1350     std::vector<buffer_handle_t> outputBufferHandles(result.outputBuffers.size());
1351     for (size_t i = 0; i < result.outputBuffers.size(); i++) {
1352         auto& bDst = outputBuffers[i];
1353         const StreamBuffer &bSrc = result.outputBuffers[i];
1354 
1355         sp<Camera3StreamInterface> stream = mOutputStreams.get(bSrc.streamId);
1356         if (stream == nullptr) {
1357             ALOGE("%s: Frame %d: Buffer %zu: Invalid output stream id %d",
1358                     __FUNCTION__, result.frameNumber, i, bSrc.streamId);
1359             return;
1360         }
1361         bDst.stream = stream->asHalStream();
1362 
1363         bool noBufferReturned = false;
1364         buffer_handle_t *buffer = nullptr;
1365         if (mUseHalBufManager) {
1366             // This is suspicious most of the time but can be correct during flush where HAL
1367             // has to return capture result before a buffer is requested
1368             if (bSrc.bufferId == HalInterface::BUFFER_ID_NO_BUFFER) {
1369                 if (bSrc.status == BufferStatus::OK) {
1370                     ALOGE("%s: Frame %d: Buffer %zu: No bufferId for stream %d",
1371                             __FUNCTION__, result.frameNumber, i, bSrc.streamId);
1372                     // Still proceeds so other buffers can be returned
1373                 }
1374                 noBufferReturned = true;
1375             }
1376             if (noBufferReturned) {
1377                 res = OK;
1378             } else {
1379                 res = mInterface->popInflightRequestBuffer(bSrc.bufferId, &buffer);
1380             }
1381         } else {
1382             res = mInterface->popInflightBuffer(result.frameNumber, bSrc.streamId, &buffer);
1383         }
1384 
1385         if (res != OK) {
1386             ALOGE("%s: Frame %d: Buffer %zu: No in-flight buffer for stream %d",
1387                     __FUNCTION__, result.frameNumber, i, bSrc.streamId);
1388             return;
1389         }
1390 
1391         bDst.buffer = buffer;
1392         bDst.status = mapHidlBufferStatus(bSrc.status);
1393         bDst.acquire_fence = -1;
1394         if (bSrc.releaseFence == nullptr) {
1395             bDst.release_fence = -1;
1396         } else if (bSrc.releaseFence->numFds == 1) {
1397             if (noBufferReturned) {
1398                 ALOGE("%s: got releaseFence without output buffer!", __FUNCTION__);
1399             }
1400             bDst.release_fence = dup(bSrc.releaseFence->data[0]);
1401         } else {
1402             ALOGE("%s: Frame %d: Invalid release fence for buffer %zu, fd count is %d, not 1",
1403                     __FUNCTION__, result.frameNumber, i, bSrc.releaseFence->numFds);
1404             return;
1405         }
1406     }
1407     r.num_output_buffers = outputBuffers.size();
1408     r.output_buffers = outputBuffers.data();
1409 
1410     camera3_stream_buffer_t inputBuffer;
1411     if (result.inputBuffer.streamId == -1) {
1412         r.input_buffer = nullptr;
1413     } else {
1414         if (mInputStream->getId() != result.inputBuffer.streamId) {
1415             ALOGE("%s: Frame %d: Invalid input stream id %d", __FUNCTION__,
1416                     result.frameNumber, result.inputBuffer.streamId);
1417             return;
1418         }
1419         inputBuffer.stream = mInputStream->asHalStream();
1420         buffer_handle_t *buffer;
1421         res = mInterface->popInflightBuffer(result.frameNumber, result.inputBuffer.streamId,
1422                 &buffer);
1423         if (res != OK) {
1424             ALOGE("%s: Frame %d: Input buffer: No in-flight buffer for stream %d",
1425                     __FUNCTION__, result.frameNumber, result.inputBuffer.streamId);
1426             return;
1427         }
1428         inputBuffer.buffer = buffer;
1429         inputBuffer.status = mapHidlBufferStatus(result.inputBuffer.status);
1430         inputBuffer.acquire_fence = -1;
1431         if (result.inputBuffer.releaseFence == nullptr) {
1432             inputBuffer.release_fence = -1;
1433         } else if (result.inputBuffer.releaseFence->numFds == 1) {
1434             inputBuffer.release_fence = dup(result.inputBuffer.releaseFence->data[0]);
1435         } else {
1436             ALOGE("%s: Frame %d: Invalid release fence for input buffer, fd count is %d, not 1",
1437                     __FUNCTION__, result.frameNumber, result.inputBuffer.releaseFence->numFds);
1438             return;
1439         }
1440         r.input_buffer = &inputBuffer;
1441     }
1442 
1443     r.partial_result = result.partialResult;
1444 
1445     processCaptureResult(&r);
1446 }
1447 
notify(const hardware::hidl_vec<hardware::camera::device::V3_2::NotifyMsg> & msgs)1448 hardware::Return<void> Camera3Device::notify(
1449         const hardware::hidl_vec<hardware::camera::device::V3_2::NotifyMsg>& msgs) {
1450     // Ideally we should grab mLock, but that can lead to deadlock, and
1451     // it's not super important to get up to date value of mStatus for this
1452     // warning print, hence skipping the lock here
1453     if (mStatus == STATUS_ERROR) {
1454         // Per API contract, HAL should act as closed after device error
1455         // But mStatus can be set to error by framework as well, so just log
1456         // a warning here.
1457         ALOGW("%s: received notify message in error state.", __FUNCTION__);
1458     }
1459 
1460     for (const auto& msg : msgs) {
1461         notify(msg);
1462     }
1463     return hardware::Void();
1464 }
1465 
notify(const hardware::camera::device::V3_2::NotifyMsg & msg)1466 void Camera3Device::notify(
1467         const hardware::camera::device::V3_2::NotifyMsg& msg) {
1468 
1469     camera3_notify_msg m;
1470     switch (msg.type) {
1471         case MsgType::ERROR:
1472             m.type = CAMERA3_MSG_ERROR;
1473             m.message.error.frame_number = msg.msg.error.frameNumber;
1474             if (msg.msg.error.errorStreamId >= 0) {
1475                 sp<Camera3StreamInterface> stream = mOutputStreams.get(msg.msg.error.errorStreamId);
1476                 if (stream == nullptr) {
1477                     ALOGE("%s: Frame %d: Invalid error stream id %d", __FUNCTION__,
1478                             m.message.error.frame_number, msg.msg.error.errorStreamId);
1479                     return;
1480                 }
1481                 m.message.error.error_stream = stream->asHalStream();
1482             } else {
1483                 m.message.error.error_stream = nullptr;
1484             }
1485             switch (msg.msg.error.errorCode) {
1486                 case ErrorCode::ERROR_DEVICE:
1487                     m.message.error.error_code = CAMERA3_MSG_ERROR_DEVICE;
1488                     break;
1489                 case ErrorCode::ERROR_REQUEST:
1490                     m.message.error.error_code = CAMERA3_MSG_ERROR_REQUEST;
1491                     break;
1492                 case ErrorCode::ERROR_RESULT:
1493                     m.message.error.error_code = CAMERA3_MSG_ERROR_RESULT;
1494                     break;
1495                 case ErrorCode::ERROR_BUFFER:
1496                     m.message.error.error_code = CAMERA3_MSG_ERROR_BUFFER;
1497                     break;
1498             }
1499             break;
1500         case MsgType::SHUTTER:
1501             m.type = CAMERA3_MSG_SHUTTER;
1502             m.message.shutter.frame_number = msg.msg.shutter.frameNumber;
1503             m.message.shutter.timestamp = msg.msg.shutter.timestamp;
1504             break;
1505     }
1506     notify(&m);
1507 }
1508 
captureList(const List<const PhysicalCameraSettingsList> & requestsList,const std::list<const SurfaceMap> & surfaceMaps,int64_t * lastFrameNumber)1509 status_t Camera3Device::captureList(const List<const PhysicalCameraSettingsList> &requestsList,
1510                                     const std::list<const SurfaceMap> &surfaceMaps,
1511                                     int64_t *lastFrameNumber) {
1512     ATRACE_CALL();
1513 
1514     return submitRequestsHelper(requestsList, surfaceMaps, /*repeating*/false, lastFrameNumber);
1515 }
1516 
setStreamingRequest(const CameraMetadata & request,int64_t *)1517 status_t Camera3Device::setStreamingRequest(const CameraMetadata &request,
1518                                             int64_t* /*lastFrameNumber*/) {
1519     ATRACE_CALL();
1520 
1521     List<const PhysicalCameraSettingsList> requestsList;
1522     std::list<const SurfaceMap> surfaceMaps;
1523     convertToRequestList(requestsList, surfaceMaps, request);
1524 
1525     return setStreamingRequestList(requestsList, /*surfaceMap*/surfaceMaps,
1526                                    /*lastFrameNumber*/NULL);
1527 }
1528 
setStreamingRequestList(const List<const PhysicalCameraSettingsList> & requestsList,const std::list<const SurfaceMap> & surfaceMaps,int64_t * lastFrameNumber)1529 status_t Camera3Device::setStreamingRequestList(
1530         const List<const PhysicalCameraSettingsList> &requestsList,
1531         const std::list<const SurfaceMap> &surfaceMaps, int64_t *lastFrameNumber) {
1532     ATRACE_CALL();
1533 
1534     return submitRequestsHelper(requestsList, surfaceMaps, /*repeating*/true, lastFrameNumber);
1535 }
1536 
setUpRequestLocked(const PhysicalCameraSettingsList & request,const SurfaceMap & surfaceMap)1537 sp<Camera3Device::CaptureRequest> Camera3Device::setUpRequestLocked(
1538         const PhysicalCameraSettingsList &request, const SurfaceMap &surfaceMap) {
1539     status_t res;
1540 
1541     if (mStatus == STATUS_UNCONFIGURED || mNeedConfig) {
1542         // This point should only be reached via API1 (API2 must explicitly call configureStreams)
1543         // so unilaterally select normal operating mode.
1544         res = filterParamsAndConfigureLocked(request.begin()->metadata,
1545                 CAMERA3_STREAM_CONFIGURATION_NORMAL_MODE);
1546         // Stream configuration failed. Client might try other configuraitons.
1547         if (res != OK) {
1548             CLOGE("Can't set up streams: %s (%d)", strerror(-res), res);
1549             return NULL;
1550         } else if (mStatus == STATUS_UNCONFIGURED) {
1551             // Stream configuration successfully configure to empty stream configuration.
1552             CLOGE("No streams configured");
1553             return NULL;
1554         }
1555     }
1556 
1557     sp<CaptureRequest> newRequest = createCaptureRequest(request, surfaceMap);
1558     return newRequest;
1559 }
1560 
clearStreamingRequest(int64_t * lastFrameNumber)1561 status_t Camera3Device::clearStreamingRequest(int64_t *lastFrameNumber) {
1562     ATRACE_CALL();
1563     Mutex::Autolock il(mInterfaceLock);
1564     Mutex::Autolock l(mLock);
1565 
1566     switch (mStatus) {
1567         case STATUS_ERROR:
1568             CLOGE("Device has encountered a serious error");
1569             return INVALID_OPERATION;
1570         case STATUS_UNINITIALIZED:
1571             CLOGE("Device not initialized");
1572             return INVALID_OPERATION;
1573         case STATUS_UNCONFIGURED:
1574         case STATUS_CONFIGURED:
1575         case STATUS_ACTIVE:
1576             // OK
1577             break;
1578         default:
1579             SET_ERR_L("Unexpected status: %d", mStatus);
1580             return INVALID_OPERATION;
1581     }
1582     ALOGV("Camera %s: Clearing repeating request", mId.string());
1583 
1584     return mRequestThread->clearRepeatingRequests(lastFrameNumber);
1585 }
1586 
waitUntilRequestReceived(int32_t requestId,nsecs_t timeout)1587 status_t Camera3Device::waitUntilRequestReceived(int32_t requestId, nsecs_t timeout) {
1588     ATRACE_CALL();
1589     Mutex::Autolock il(mInterfaceLock);
1590 
1591     return mRequestThread->waitUntilRequestProcessed(requestId, timeout);
1592 }
1593 
createInputStream(uint32_t width,uint32_t height,int format,int * id)1594 status_t Camera3Device::createInputStream(
1595         uint32_t width, uint32_t height, int format, int *id) {
1596     ATRACE_CALL();
1597     Mutex::Autolock il(mInterfaceLock);
1598     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
1599     Mutex::Autolock l(mLock);
1600     ALOGV("Camera %s: Creating new input stream %d: %d x %d, format %d",
1601             mId.string(), mNextStreamId, width, height, format);
1602 
1603     status_t res;
1604     bool wasActive = false;
1605 
1606     switch (mStatus) {
1607         case STATUS_ERROR:
1608             ALOGE("%s: Device has encountered a serious error", __FUNCTION__);
1609             return INVALID_OPERATION;
1610         case STATUS_UNINITIALIZED:
1611             ALOGE("%s: Device not initialized", __FUNCTION__);
1612             return INVALID_OPERATION;
1613         case STATUS_UNCONFIGURED:
1614         case STATUS_CONFIGURED:
1615             // OK
1616             break;
1617         case STATUS_ACTIVE:
1618             ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
1619             res = internalPauseAndWaitLocked(maxExpectedDuration);
1620             if (res != OK) {
1621                 SET_ERR_L("Can't pause captures to reconfigure streams!");
1622                 return res;
1623             }
1624             wasActive = true;
1625             break;
1626         default:
1627             SET_ERR_L("%s: Unexpected status: %d", mStatus);
1628             return INVALID_OPERATION;
1629     }
1630     assert(mStatus != STATUS_ACTIVE);
1631 
1632     if (mInputStream != 0) {
1633         ALOGE("%s: Cannot create more than 1 input stream", __FUNCTION__);
1634         return INVALID_OPERATION;
1635     }
1636 
1637     sp<Camera3InputStream> newStream = new Camera3InputStream(mNextStreamId,
1638                 width, height, format);
1639     newStream->setStatusTracker(mStatusTracker);
1640 
1641     mInputStream = newStream;
1642 
1643     *id = mNextStreamId++;
1644 
1645     // Continue captures if active at start
1646     if (wasActive) {
1647         ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
1648         // Reuse current operating mode and session parameters for new stream config
1649         res = configureStreamsLocked(mOperatingMode, mSessionParams);
1650         if (res != OK) {
1651             ALOGE("%s: Can't reconfigure device for new stream %d: %s (%d)",
1652                     __FUNCTION__, mNextStreamId, strerror(-res), res);
1653             return res;
1654         }
1655         internalResumeLocked();
1656     }
1657 
1658     ALOGV("Camera %s: Created input stream", mId.string());
1659     return OK;
1660 }
1661 
add(int streamId,sp<camera3::Camera3OutputStreamInterface> stream)1662 status_t Camera3Device::StreamSet::add(
1663         int streamId, sp<camera3::Camera3OutputStreamInterface> stream) {
1664     if (stream == nullptr) {
1665         ALOGE("%s: cannot add null stream", __FUNCTION__);
1666         return BAD_VALUE;
1667     }
1668     std::lock_guard<std::mutex> lock(mLock);
1669     return mData.add(streamId, stream);
1670 }
1671 
remove(int streamId)1672 ssize_t Camera3Device::StreamSet::remove(int streamId) {
1673     std::lock_guard<std::mutex> lock(mLock);
1674     return mData.removeItem(streamId);
1675 }
1676 
1677 sp<camera3::Camera3OutputStreamInterface>
get(int streamId)1678 Camera3Device::StreamSet::get(int streamId) {
1679     std::lock_guard<std::mutex> lock(mLock);
1680     ssize_t idx = mData.indexOfKey(streamId);
1681     if (idx == NAME_NOT_FOUND) {
1682         return nullptr;
1683     }
1684     return mData.editValueAt(idx);
1685 }
1686 
1687 sp<camera3::Camera3OutputStreamInterface>
operator [](size_t index)1688 Camera3Device::StreamSet::operator[] (size_t index) {
1689     std::lock_guard<std::mutex> lock(mLock);
1690     return mData.editValueAt(index);
1691 }
1692 
size() const1693 size_t Camera3Device::StreamSet::size() const {
1694     std::lock_guard<std::mutex> lock(mLock);
1695     return mData.size();
1696 }
1697 
clear()1698 void Camera3Device::StreamSet::clear() {
1699     std::lock_guard<std::mutex> lock(mLock);
1700     return mData.clear();
1701 }
1702 
getStreamIds()1703 std::vector<int> Camera3Device::StreamSet::getStreamIds() {
1704     std::lock_guard<std::mutex> lock(mLock);
1705     std::vector<int> streamIds(mData.size());
1706     for (size_t i = 0; i < mData.size(); i++) {
1707         streamIds[i] = mData.keyAt(i);
1708     }
1709     return streamIds;
1710 }
1711 
createStream(sp<Surface> consumer,uint32_t width,uint32_t height,int format,android_dataspace dataSpace,camera3_stream_rotation_t rotation,int * id,const String8 & physicalCameraId,std::vector<int> * surfaceIds,int streamSetId,bool isShared,uint64_t consumerUsage)1712 status_t Camera3Device::createStream(sp<Surface> consumer,
1713             uint32_t width, uint32_t height, int format,
1714             android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id,
1715             const String8& physicalCameraId,
1716             std::vector<int> *surfaceIds, int streamSetId, bool isShared, uint64_t consumerUsage) {
1717     ATRACE_CALL();
1718 
1719     if (consumer == nullptr) {
1720         ALOGE("%s: consumer must not be null", __FUNCTION__);
1721         return BAD_VALUE;
1722     }
1723 
1724     std::vector<sp<Surface>> consumers;
1725     consumers.push_back(consumer);
1726 
1727     return createStream(consumers, /*hasDeferredConsumer*/ false, width, height,
1728             format, dataSpace, rotation, id, physicalCameraId, surfaceIds, streamSetId,
1729             isShared, consumerUsage);
1730 }
1731 
createStream(const std::vector<sp<Surface>> & consumers,bool hasDeferredConsumer,uint32_t width,uint32_t height,int format,android_dataspace dataSpace,camera3_stream_rotation_t rotation,int * id,const String8 & physicalCameraId,std::vector<int> * surfaceIds,int streamSetId,bool isShared,uint64_t consumerUsage)1732 status_t Camera3Device::createStream(const std::vector<sp<Surface>>& consumers,
1733         bool hasDeferredConsumer, uint32_t width, uint32_t height, int format,
1734         android_dataspace dataSpace, camera3_stream_rotation_t rotation, int *id,
1735         const String8& physicalCameraId,
1736         std::vector<int> *surfaceIds, int streamSetId, bool isShared, uint64_t consumerUsage) {
1737     ATRACE_CALL();
1738 
1739     Mutex::Autolock il(mInterfaceLock);
1740     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
1741     Mutex::Autolock l(mLock);
1742     ALOGV("Camera %s: Creating new stream %d: %d x %d, format %d, dataspace %d rotation %d"
1743             " consumer usage %" PRIu64 ", isShared %d, physicalCameraId %s", mId.string(),
1744             mNextStreamId, width, height, format, dataSpace, rotation, consumerUsage, isShared,
1745             physicalCameraId.string());
1746 
1747     status_t res;
1748     bool wasActive = false;
1749 
1750     switch (mStatus) {
1751         case STATUS_ERROR:
1752             CLOGE("Device has encountered a serious error");
1753             return INVALID_OPERATION;
1754         case STATUS_UNINITIALIZED:
1755             CLOGE("Device not initialized");
1756             return INVALID_OPERATION;
1757         case STATUS_UNCONFIGURED:
1758         case STATUS_CONFIGURED:
1759             // OK
1760             break;
1761         case STATUS_ACTIVE:
1762             ALOGV("%s: Stopping activity to reconfigure streams", __FUNCTION__);
1763             res = internalPauseAndWaitLocked(maxExpectedDuration);
1764             if (res != OK) {
1765                 SET_ERR_L("Can't pause captures to reconfigure streams!");
1766                 return res;
1767             }
1768             wasActive = true;
1769             break;
1770         default:
1771             SET_ERR_L("Unexpected status: %d", mStatus);
1772             return INVALID_OPERATION;
1773     }
1774     assert(mStatus != STATUS_ACTIVE);
1775 
1776     sp<Camera3OutputStream> newStream;
1777 
1778     if (consumers.size() == 0 && !hasDeferredConsumer) {
1779         ALOGE("%s: Number of consumers cannot be smaller than 1", __FUNCTION__);
1780         return BAD_VALUE;
1781     }
1782 
1783     if (hasDeferredConsumer && format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
1784         ALOGE("Deferred consumer stream creation only support IMPLEMENTATION_DEFINED format");
1785         return BAD_VALUE;
1786     }
1787 
1788     if (format == HAL_PIXEL_FORMAT_BLOB) {
1789         ssize_t blobBufferSize;
1790         if (dataSpace == HAL_DATASPACE_DEPTH) {
1791             blobBufferSize = getPointCloudBufferSize();
1792             if (blobBufferSize <= 0) {
1793                 SET_ERR_L("Invalid point cloud buffer size %zd", blobBufferSize);
1794                 return BAD_VALUE;
1795             }
1796         } else if (dataSpace == static_cast<android_dataspace>(HAL_DATASPACE_JPEG_APP_SEGMENTS)) {
1797             blobBufferSize = width * height;
1798         } else {
1799             blobBufferSize = getJpegBufferSize(width, height);
1800             if (blobBufferSize <= 0) {
1801                 SET_ERR_L("Invalid jpeg buffer size %zd", blobBufferSize);
1802                 return BAD_VALUE;
1803             }
1804         }
1805         newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
1806                 width, height, blobBufferSize, format, dataSpace, rotation,
1807                 mTimestampOffset, physicalCameraId, streamSetId);
1808     } else if (format == HAL_PIXEL_FORMAT_RAW_OPAQUE) {
1809         ssize_t rawOpaqueBufferSize = getRawOpaqueBufferSize(width, height);
1810         if (rawOpaqueBufferSize <= 0) {
1811             SET_ERR_L("Invalid RAW opaque buffer size %zd", rawOpaqueBufferSize);
1812             return BAD_VALUE;
1813         }
1814         newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
1815                 width, height, rawOpaqueBufferSize, format, dataSpace, rotation,
1816                 mTimestampOffset, physicalCameraId, streamSetId);
1817     } else if (isShared) {
1818         newStream = new Camera3SharedOutputStream(mNextStreamId, consumers,
1819                 width, height, format, consumerUsage, dataSpace, rotation,
1820                 mTimestampOffset, physicalCameraId, streamSetId,
1821                 mUseHalBufManager);
1822     } else if (consumers.size() == 0 && hasDeferredConsumer) {
1823         newStream = new Camera3OutputStream(mNextStreamId,
1824                 width, height, format, consumerUsage, dataSpace, rotation,
1825                 mTimestampOffset, physicalCameraId, streamSetId);
1826     } else {
1827         newStream = new Camera3OutputStream(mNextStreamId, consumers[0],
1828                 width, height, format, dataSpace, rotation,
1829                 mTimestampOffset, physicalCameraId, streamSetId);
1830     }
1831 
1832     size_t consumerCount = consumers.size();
1833     for (size_t i = 0; i < consumerCount; i++) {
1834         int id = newStream->getSurfaceId(consumers[i]);
1835         if (id < 0) {
1836             SET_ERR_L("Invalid surface id");
1837             return BAD_VALUE;
1838         }
1839         if (surfaceIds != nullptr) {
1840             surfaceIds->push_back(id);
1841         }
1842     }
1843 
1844     newStream->setStatusTracker(mStatusTracker);
1845 
1846     newStream->setBufferManager(mBufferManager);
1847 
1848     res = mOutputStreams.add(mNextStreamId, newStream);
1849     if (res < 0) {
1850         SET_ERR_L("Can't add new stream to set: %s (%d)", strerror(-res), res);
1851         return res;
1852     }
1853 
1854     *id = mNextStreamId++;
1855     mNeedConfig = true;
1856 
1857     // Continue captures if active at start
1858     if (wasActive) {
1859         ALOGV("%s: Restarting activity to reconfigure streams", __FUNCTION__);
1860         // Reuse current operating mode and session parameters for new stream config
1861         res = configureStreamsLocked(mOperatingMode, mSessionParams);
1862         if (res != OK) {
1863             CLOGE("Can't reconfigure device for new stream %d: %s (%d)",
1864                     mNextStreamId, strerror(-res), res);
1865             return res;
1866         }
1867         internalResumeLocked();
1868     }
1869     ALOGV("Camera %s: Created new stream", mId.string());
1870     return OK;
1871 }
1872 
getStreamInfo(int id,StreamInfo * streamInfo)1873 status_t Camera3Device::getStreamInfo(int id, StreamInfo *streamInfo) {
1874     ATRACE_CALL();
1875     if (nullptr == streamInfo) {
1876         return BAD_VALUE;
1877     }
1878     Mutex::Autolock il(mInterfaceLock);
1879     Mutex::Autolock l(mLock);
1880 
1881     switch (mStatus) {
1882         case STATUS_ERROR:
1883             CLOGE("Device has encountered a serious error");
1884             return INVALID_OPERATION;
1885         case STATUS_UNINITIALIZED:
1886             CLOGE("Device not initialized!");
1887             return INVALID_OPERATION;
1888         case STATUS_UNCONFIGURED:
1889         case STATUS_CONFIGURED:
1890         case STATUS_ACTIVE:
1891             // OK
1892             break;
1893         default:
1894             SET_ERR_L("Unexpected status: %d", mStatus);
1895             return INVALID_OPERATION;
1896     }
1897 
1898     sp<Camera3StreamInterface> stream = mOutputStreams.get(id);
1899     if (stream == nullptr) {
1900         CLOGE("Stream %d is unknown", id);
1901         return BAD_VALUE;
1902     }
1903 
1904     streamInfo->width  = stream->getWidth();
1905     streamInfo->height = stream->getHeight();
1906     streamInfo->format = stream->getFormat();
1907     streamInfo->dataSpace = stream->getDataSpace();
1908     streamInfo->formatOverridden = stream->isFormatOverridden();
1909     streamInfo->originalFormat = stream->getOriginalFormat();
1910     streamInfo->dataSpaceOverridden = stream->isDataSpaceOverridden();
1911     streamInfo->originalDataSpace = stream->getOriginalDataSpace();
1912     return OK;
1913 }
1914 
setStreamTransform(int id,int transform)1915 status_t Camera3Device::setStreamTransform(int id,
1916         int transform) {
1917     ATRACE_CALL();
1918     Mutex::Autolock il(mInterfaceLock);
1919     Mutex::Autolock l(mLock);
1920 
1921     switch (mStatus) {
1922         case STATUS_ERROR:
1923             CLOGE("Device has encountered a serious error");
1924             return INVALID_OPERATION;
1925         case STATUS_UNINITIALIZED:
1926             CLOGE("Device not initialized");
1927             return INVALID_OPERATION;
1928         case STATUS_UNCONFIGURED:
1929         case STATUS_CONFIGURED:
1930         case STATUS_ACTIVE:
1931             // OK
1932             break;
1933         default:
1934             SET_ERR_L("Unexpected status: %d", mStatus);
1935             return INVALID_OPERATION;
1936     }
1937 
1938     sp<Camera3OutputStreamInterface> stream = mOutputStreams.get(id);
1939     if (stream == nullptr) {
1940         CLOGE("Stream %d does not exist", id);
1941         return BAD_VALUE;
1942     }
1943     return stream->setTransform(transform);
1944 }
1945 
deleteStream(int id)1946 status_t Camera3Device::deleteStream(int id) {
1947     ATRACE_CALL();
1948     Mutex::Autolock il(mInterfaceLock);
1949     Mutex::Autolock l(mLock);
1950     status_t res;
1951 
1952     ALOGV("%s: Camera %s: Deleting stream %d", __FUNCTION__, mId.string(), id);
1953 
1954     // CameraDevice semantics require device to already be idle before
1955     // deleteStream is called, unlike for createStream.
1956     if (mStatus == STATUS_ACTIVE) {
1957         ALOGW("%s: Camera %s: Device not idle", __FUNCTION__, mId.string());
1958         return -EBUSY;
1959     }
1960 
1961     if (mStatus == STATUS_ERROR) {
1962         ALOGW("%s: Camera %s: deleteStream not allowed in ERROR state",
1963                 __FUNCTION__, mId.string());
1964         return -EBUSY;
1965     }
1966 
1967     sp<Camera3StreamInterface> deletedStream;
1968     sp<Camera3StreamInterface> stream = mOutputStreams.get(id);
1969     if (mInputStream != NULL && id == mInputStream->getId()) {
1970         deletedStream = mInputStream;
1971         mInputStream.clear();
1972     } else {
1973         if (stream == nullptr) {
1974             CLOGE("Stream %d does not exist", id);
1975             return BAD_VALUE;
1976         }
1977     }
1978 
1979     // Delete output stream or the output part of a bi-directional stream.
1980     if (stream != nullptr) {
1981         deletedStream = stream;
1982         mOutputStreams.remove(id);
1983     }
1984 
1985     // Free up the stream endpoint so that it can be used by some other stream
1986     res = deletedStream->disconnect();
1987     if (res != OK) {
1988         SET_ERR_L("Can't disconnect deleted stream %d", id);
1989         // fall through since we want to still list the stream as deleted.
1990     }
1991     mDeletedStreams.add(deletedStream);
1992     mNeedConfig = true;
1993 
1994     return res;
1995 }
1996 
configureStreams(const CameraMetadata & sessionParams,int operatingMode)1997 status_t Camera3Device::configureStreams(const CameraMetadata& sessionParams, int operatingMode) {
1998     ATRACE_CALL();
1999     ALOGV("%s: E", __FUNCTION__);
2000 
2001     Mutex::Autolock il(mInterfaceLock);
2002     Mutex::Autolock l(mLock);
2003 
2004     // In case the client doesn't include any session parameter, try a
2005     // speculative configuration using the values from the last cached
2006     // default request.
2007     if (sessionParams.isEmpty() &&
2008             ((mLastTemplateId > 0) && (mLastTemplateId < CAMERA3_TEMPLATE_COUNT)) &&
2009             (!mRequestTemplateCache[mLastTemplateId].isEmpty())) {
2010         ALOGV("%s: Speculative session param configuration with template id: %d", __func__,
2011                 mLastTemplateId);
2012         return filterParamsAndConfigureLocked(mRequestTemplateCache[mLastTemplateId],
2013                 operatingMode);
2014     }
2015 
2016     return filterParamsAndConfigureLocked(sessionParams, operatingMode);
2017 }
2018 
filterParamsAndConfigureLocked(const CameraMetadata & sessionParams,int operatingMode)2019 status_t Camera3Device::filterParamsAndConfigureLocked(const CameraMetadata& sessionParams,
2020         int operatingMode) {
2021     //Filter out any incoming session parameters
2022     const CameraMetadata params(sessionParams);
2023     camera_metadata_entry_t availableSessionKeys = mDeviceInfo.find(
2024             ANDROID_REQUEST_AVAILABLE_SESSION_KEYS);
2025     CameraMetadata filteredParams(availableSessionKeys.count);
2026     camera_metadata_t *meta = const_cast<camera_metadata_t *>(
2027             filteredParams.getAndLock());
2028     set_camera_metadata_vendor_id(meta, mVendorTagId);
2029     filteredParams.unlock(meta);
2030     if (availableSessionKeys.count > 0) {
2031         for (size_t i = 0; i < availableSessionKeys.count; i++) {
2032             camera_metadata_ro_entry entry = params.find(
2033                     availableSessionKeys.data.i32[i]);
2034             if (entry.count > 0) {
2035                 filteredParams.update(entry);
2036             }
2037         }
2038     }
2039 
2040     return configureStreamsLocked(operatingMode, filteredParams);
2041 }
2042 
getInputBufferProducer(sp<IGraphicBufferProducer> * producer)2043 status_t Camera3Device::getInputBufferProducer(
2044         sp<IGraphicBufferProducer> *producer) {
2045     ATRACE_CALL();
2046     Mutex::Autolock il(mInterfaceLock);
2047     Mutex::Autolock l(mLock);
2048 
2049     if (producer == NULL) {
2050         return BAD_VALUE;
2051     } else if (mInputStream == NULL) {
2052         return INVALID_OPERATION;
2053     }
2054 
2055     return mInputStream->getInputBufferProducer(producer);
2056 }
2057 
createDefaultRequest(int templateId,CameraMetadata * request)2058 status_t Camera3Device::createDefaultRequest(int templateId,
2059         CameraMetadata *request) {
2060     ATRACE_CALL();
2061     ALOGV("%s: for template %d", __FUNCTION__, templateId);
2062 
2063     if (templateId <= 0 || templateId >= CAMERA3_TEMPLATE_COUNT) {
2064         android_errorWriteWithInfoLog(CameraService::SN_EVENT_LOG_ID, "26866110",
2065                 CameraThreadState::getCallingUid(), nullptr, 0);
2066         return BAD_VALUE;
2067     }
2068 
2069     Mutex::Autolock il(mInterfaceLock);
2070 
2071     {
2072         Mutex::Autolock l(mLock);
2073         switch (mStatus) {
2074             case STATUS_ERROR:
2075                 CLOGE("Device has encountered a serious error");
2076                 return INVALID_OPERATION;
2077             case STATUS_UNINITIALIZED:
2078                 CLOGE("Device is not initialized!");
2079                 return INVALID_OPERATION;
2080             case STATUS_UNCONFIGURED:
2081             case STATUS_CONFIGURED:
2082             case STATUS_ACTIVE:
2083                 // OK
2084                 break;
2085             default:
2086                 SET_ERR_L("Unexpected status: %d", mStatus);
2087                 return INVALID_OPERATION;
2088         }
2089 
2090         if (!mRequestTemplateCache[templateId].isEmpty()) {
2091             *request = mRequestTemplateCache[templateId];
2092             mLastTemplateId = templateId;
2093             return OK;
2094         }
2095     }
2096 
2097     camera_metadata_t *rawRequest;
2098     status_t res = mInterface->constructDefaultRequestSettings(
2099             (camera3_request_template_t) templateId, &rawRequest);
2100 
2101     {
2102         Mutex::Autolock l(mLock);
2103         if (res == BAD_VALUE) {
2104             ALOGI("%s: template %d is not supported on this camera device",
2105                   __FUNCTION__, templateId);
2106             return res;
2107         } else if (res != OK) {
2108             CLOGE("Unable to construct request template %d: %s (%d)",
2109                     templateId, strerror(-res), res);
2110             return res;
2111         }
2112 
2113         set_camera_metadata_vendor_id(rawRequest, mVendorTagId);
2114         mRequestTemplateCache[templateId].acquire(rawRequest);
2115 
2116         *request = mRequestTemplateCache[templateId];
2117         mLastTemplateId = templateId;
2118     }
2119     return OK;
2120 }
2121 
waitUntilDrained()2122 status_t Camera3Device::waitUntilDrained() {
2123     ATRACE_CALL();
2124     Mutex::Autolock il(mInterfaceLock);
2125     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
2126     Mutex::Autolock l(mLock);
2127 
2128     return waitUntilDrainedLocked(maxExpectedDuration);
2129 }
2130 
waitUntilDrainedLocked(nsecs_t maxExpectedDuration)2131 status_t Camera3Device::waitUntilDrainedLocked(nsecs_t maxExpectedDuration) {
2132     switch (mStatus) {
2133         case STATUS_UNINITIALIZED:
2134         case STATUS_UNCONFIGURED:
2135             ALOGV("%s: Already idle", __FUNCTION__);
2136             return OK;
2137         case STATUS_CONFIGURED:
2138             // To avoid race conditions, check with tracker to be sure
2139         case STATUS_ERROR:
2140         case STATUS_ACTIVE:
2141             // Need to verify shut down
2142             break;
2143         default:
2144             SET_ERR_L("Unexpected status: %d",mStatus);
2145             return INVALID_OPERATION;
2146     }
2147     ALOGV("%s: Camera %s: Waiting until idle (%" PRIi64 "ns)", __FUNCTION__, mId.string(),
2148             maxExpectedDuration);
2149     status_t res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
2150     if (res != OK) {
2151         SET_ERR_L("Error waiting for HAL to drain: %s (%d)", strerror(-res),
2152                 res);
2153     }
2154     return res;
2155 }
2156 
2157 
internalUpdateStatusLocked(Status status)2158 void Camera3Device::internalUpdateStatusLocked(Status status) {
2159     mStatus = status;
2160     mRecentStatusUpdates.add(mStatus);
2161     mStatusChanged.broadcast();
2162 }
2163 
pauseStateNotify(bool enable)2164 void Camera3Device::pauseStateNotify(bool enable) {
2165     Mutex::Autolock il(mInterfaceLock);
2166     Mutex::Autolock l(mLock);
2167 
2168     mPauseStateNotify = enable;
2169 }
2170 
2171 // Pause to reconfigure
internalPauseAndWaitLocked(nsecs_t maxExpectedDuration)2172 status_t Camera3Device::internalPauseAndWaitLocked(nsecs_t maxExpectedDuration) {
2173     if (mRequestThread.get() != nullptr) {
2174         mRequestThread->setPaused(true);
2175     } else {
2176         return NO_INIT;
2177     }
2178 
2179     ALOGV("%s: Camera %s: Internal wait until idle (% " PRIi64 " ns)", __FUNCTION__, mId.string(),
2180           maxExpectedDuration);
2181     status_t res = waitUntilStateThenRelock(/*active*/ false, maxExpectedDuration);
2182     if (res != OK) {
2183         SET_ERR_L("Can't idle device in %f seconds!",
2184                 maxExpectedDuration/1e9);
2185     }
2186 
2187     return res;
2188 }
2189 
2190 // Resume after internalPauseAndWaitLocked
internalResumeLocked()2191 status_t Camera3Device::internalResumeLocked() {
2192     status_t res;
2193 
2194     mRequestThread->setPaused(false);
2195 
2196     ALOGV("%s: Camera %s: Internal wait until active (% " PRIi64 " ns)", __FUNCTION__, mId.string(),
2197             kActiveTimeout);
2198     res = waitUntilStateThenRelock(/*active*/ true, kActiveTimeout);
2199     if (res != OK) {
2200         SET_ERR_L("Can't transition to active in %f seconds!",
2201                 kActiveTimeout/1e9);
2202     }
2203     mPauseStateNotify = false;
2204     return OK;
2205 }
2206 
waitUntilStateThenRelock(bool active,nsecs_t timeout)2207 status_t Camera3Device::waitUntilStateThenRelock(bool active, nsecs_t timeout) {
2208     status_t res = OK;
2209 
2210     size_t startIndex = 0;
2211     if (mStatusWaiters == 0) {
2212         // Clear the list of recent statuses if there are no existing threads waiting on updates to
2213         // this status list
2214         mRecentStatusUpdates.clear();
2215     } else {
2216         // If other threads are waiting on updates to this status list, set the position of the
2217         // first element that this list will check rather than clearing the list.
2218         startIndex = mRecentStatusUpdates.size();
2219     }
2220 
2221     mStatusWaiters++;
2222 
2223     if (!active && mUseHalBufManager) {
2224         auto streamIds = mOutputStreams.getStreamIds();
2225         if (mStatus == STATUS_ACTIVE) {
2226             mRequestThread->signalPipelineDrain(streamIds);
2227         }
2228         mRequestBufferSM.onWaitUntilIdle();
2229     }
2230 
2231     bool stateSeen = false;
2232     do {
2233         if (active == (mStatus == STATUS_ACTIVE)) {
2234             // Desired state is current
2235             break;
2236         }
2237 
2238         res = mStatusChanged.waitRelative(mLock, timeout);
2239         if (res != OK) break;
2240 
2241         // This is impossible, but if not, could result in subtle deadlocks and invalid state
2242         // transitions.
2243         LOG_ALWAYS_FATAL_IF(startIndex > mRecentStatusUpdates.size(),
2244                 "%s: Skipping status updates in Camera3Device, may result in deadlock.",
2245                 __FUNCTION__);
2246 
2247         // Encountered desired state since we began waiting
2248         for (size_t i = startIndex; i < mRecentStatusUpdates.size(); i++) {
2249             if (active == (mRecentStatusUpdates[i] == STATUS_ACTIVE) ) {
2250                 stateSeen = true;
2251                 break;
2252             }
2253         }
2254     } while (!stateSeen);
2255 
2256     mStatusWaiters--;
2257 
2258     return res;
2259 }
2260 
2261 
setNotifyCallback(wp<NotificationListener> listener)2262 status_t Camera3Device::setNotifyCallback(wp<NotificationListener> listener) {
2263     ATRACE_CALL();
2264     Mutex::Autolock l(mOutputLock);
2265 
2266     if (listener != NULL && mListener != NULL) {
2267         ALOGW("%s: Replacing old callback listener", __FUNCTION__);
2268     }
2269     mListener = listener;
2270     mRequestThread->setNotificationListener(listener);
2271     mPreparerThread->setNotificationListener(listener);
2272 
2273     return OK;
2274 }
2275 
willNotify3A()2276 bool Camera3Device::willNotify3A() {
2277     return false;
2278 }
2279 
waitForNextFrame(nsecs_t timeout)2280 status_t Camera3Device::waitForNextFrame(nsecs_t timeout) {
2281     ATRACE_CALL();
2282     status_t res;
2283     Mutex::Autolock l(mOutputLock);
2284 
2285     while (mResultQueue.empty()) {
2286         res = mResultSignal.waitRelative(mOutputLock, timeout);
2287         if (res == TIMED_OUT) {
2288             return res;
2289         } else if (res != OK) {
2290             ALOGW("%s: Camera %s: No frame in %" PRId64 " ns: %s (%d)",
2291                     __FUNCTION__, mId.string(), timeout, strerror(-res), res);
2292             return res;
2293         }
2294     }
2295     return OK;
2296 }
2297 
getNextResult(CaptureResult * frame)2298 status_t Camera3Device::getNextResult(CaptureResult *frame) {
2299     ATRACE_CALL();
2300     Mutex::Autolock l(mOutputLock);
2301 
2302     if (mResultQueue.empty()) {
2303         return NOT_ENOUGH_DATA;
2304     }
2305 
2306     if (frame == NULL) {
2307         ALOGE("%s: argument cannot be NULL", __FUNCTION__);
2308         return BAD_VALUE;
2309     }
2310 
2311     CaptureResult &result = *(mResultQueue.begin());
2312     frame->mResultExtras = result.mResultExtras;
2313     frame->mMetadata.acquire(result.mMetadata);
2314     frame->mPhysicalMetadatas = std::move(result.mPhysicalMetadatas);
2315     mResultQueue.erase(mResultQueue.begin());
2316 
2317     return OK;
2318 }
2319 
triggerAutofocus(uint32_t id)2320 status_t Camera3Device::triggerAutofocus(uint32_t id) {
2321     ATRACE_CALL();
2322     Mutex::Autolock il(mInterfaceLock);
2323 
2324     ALOGV("%s: Triggering autofocus, id %d", __FUNCTION__, id);
2325     // Mix-in this trigger into the next request and only the next request.
2326     RequestTrigger trigger[] = {
2327         {
2328             ANDROID_CONTROL_AF_TRIGGER,
2329             ANDROID_CONTROL_AF_TRIGGER_START
2330         },
2331         {
2332             ANDROID_CONTROL_AF_TRIGGER_ID,
2333             static_cast<int32_t>(id)
2334         }
2335     };
2336 
2337     return mRequestThread->queueTrigger(trigger,
2338                                         sizeof(trigger)/sizeof(trigger[0]));
2339 }
2340 
triggerCancelAutofocus(uint32_t id)2341 status_t Camera3Device::triggerCancelAutofocus(uint32_t id) {
2342     ATRACE_CALL();
2343     Mutex::Autolock il(mInterfaceLock);
2344 
2345     ALOGV("%s: Triggering cancel autofocus, id %d", __FUNCTION__, id);
2346     // Mix-in this trigger into the next request and only the next request.
2347     RequestTrigger trigger[] = {
2348         {
2349             ANDROID_CONTROL_AF_TRIGGER,
2350             ANDROID_CONTROL_AF_TRIGGER_CANCEL
2351         },
2352         {
2353             ANDROID_CONTROL_AF_TRIGGER_ID,
2354             static_cast<int32_t>(id)
2355         }
2356     };
2357 
2358     return mRequestThread->queueTrigger(trigger,
2359                                         sizeof(trigger)/sizeof(trigger[0]));
2360 }
2361 
triggerPrecaptureMetering(uint32_t id)2362 status_t Camera3Device::triggerPrecaptureMetering(uint32_t id) {
2363     ATRACE_CALL();
2364     Mutex::Autolock il(mInterfaceLock);
2365 
2366     ALOGV("%s: Triggering precapture metering, id %d", __FUNCTION__, id);
2367     // Mix-in this trigger into the next request and only the next request.
2368     RequestTrigger trigger[] = {
2369         {
2370             ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER,
2371             ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_START
2372         },
2373         {
2374             ANDROID_CONTROL_AE_PRECAPTURE_ID,
2375             static_cast<int32_t>(id)
2376         }
2377     };
2378 
2379     return mRequestThread->queueTrigger(trigger,
2380                                         sizeof(trigger)/sizeof(trigger[0]));
2381 }
2382 
flush(int64_t * frameNumber)2383 status_t Camera3Device::flush(int64_t *frameNumber) {
2384     ATRACE_CALL();
2385     ALOGV("%s: Camera %s: Flushing all requests", __FUNCTION__, mId.string());
2386     Mutex::Autolock il(mInterfaceLock);
2387 
2388     {
2389         Mutex::Autolock l(mLock);
2390 
2391         // b/116514106 "disconnect()" can get called twice for the same device. The
2392         // camera device will not be initialized during the second run.
2393         if (mStatus == STATUS_UNINITIALIZED) {
2394             return OK;
2395         }
2396 
2397         mRequestThread->clear(/*out*/frameNumber);
2398     }
2399 
2400     return mRequestThread->flush();
2401 }
2402 
prepare(int streamId)2403 status_t Camera3Device::prepare(int streamId) {
2404     return prepare(camera3::Camera3StreamInterface::ALLOCATE_PIPELINE_MAX, streamId);
2405 }
2406 
prepare(int maxCount,int streamId)2407 status_t Camera3Device::prepare(int maxCount, int streamId) {
2408     ATRACE_CALL();
2409     ALOGV("%s: Camera %s: Preparing stream %d", __FUNCTION__, mId.string(), streamId);
2410     Mutex::Autolock il(mInterfaceLock);
2411     Mutex::Autolock l(mLock);
2412 
2413     sp<Camera3StreamInterface> stream = mOutputStreams.get(streamId);
2414     if (stream == nullptr) {
2415         CLOGE("Stream %d does not exist", streamId);
2416         return BAD_VALUE;
2417     }
2418 
2419     if (stream->isUnpreparable() || stream->hasOutstandingBuffers() ) {
2420         CLOGE("Stream %d has already been a request target", streamId);
2421         return BAD_VALUE;
2422     }
2423 
2424     if (mRequestThread->isStreamPending(stream)) {
2425         CLOGE("Stream %d is already a target in a pending request", streamId);
2426         return BAD_VALUE;
2427     }
2428 
2429     return mPreparerThread->prepare(maxCount, stream);
2430 }
2431 
tearDown(int streamId)2432 status_t Camera3Device::tearDown(int streamId) {
2433     ATRACE_CALL();
2434     ALOGV("%s: Camera %s: Tearing down stream %d", __FUNCTION__, mId.string(), streamId);
2435     Mutex::Autolock il(mInterfaceLock);
2436     Mutex::Autolock l(mLock);
2437 
2438     sp<Camera3StreamInterface> stream = mOutputStreams.get(streamId);
2439     if (stream == nullptr) {
2440         CLOGE("Stream %d does not exist", streamId);
2441         return BAD_VALUE;
2442     }
2443 
2444     if (stream->hasOutstandingBuffers() || mRequestThread->isStreamPending(stream)) {
2445         CLOGE("Stream %d is a target of a in-progress request", streamId);
2446         return BAD_VALUE;
2447     }
2448 
2449     return stream->tearDown();
2450 }
2451 
addBufferListenerForStream(int streamId,wp<Camera3StreamBufferListener> listener)2452 status_t Camera3Device::addBufferListenerForStream(int streamId,
2453         wp<Camera3StreamBufferListener> listener) {
2454     ATRACE_CALL();
2455     ALOGV("%s: Camera %s: Adding buffer listener for stream %d", __FUNCTION__, mId.string(), streamId);
2456     Mutex::Autolock il(mInterfaceLock);
2457     Mutex::Autolock l(mLock);
2458 
2459     sp<Camera3StreamInterface> stream = mOutputStreams.get(streamId);
2460     if (stream == nullptr) {
2461         CLOGE("Stream %d does not exist", streamId);
2462         return BAD_VALUE;
2463     }
2464     stream->addBufferListener(listener);
2465 
2466     return OK;
2467 }
2468 
2469 /**
2470  * Methods called by subclasses
2471  */
2472 
notifyStatus(bool idle)2473 void Camera3Device::notifyStatus(bool idle) {
2474     ATRACE_CALL();
2475     {
2476         // Need mLock to safely update state and synchronize to current
2477         // state of methods in flight.
2478         Mutex::Autolock l(mLock);
2479         // We can get various system-idle notices from the status tracker
2480         // while starting up. Only care about them if we've actually sent
2481         // in some requests recently.
2482         if (mStatus != STATUS_ACTIVE && mStatus != STATUS_CONFIGURED) {
2483             return;
2484         }
2485         ALOGV("%s: Camera %s: Now %s, pauseState: %s", __FUNCTION__, mId.string(),
2486                 idle ? "idle" : "active", mPauseStateNotify ? "true" : "false");
2487         internalUpdateStatusLocked(idle ? STATUS_CONFIGURED : STATUS_ACTIVE);
2488 
2489         // Skip notifying listener if we're doing some user-transparent
2490         // state changes
2491         if (mPauseStateNotify) return;
2492     }
2493 
2494     sp<NotificationListener> listener;
2495     {
2496         Mutex::Autolock l(mOutputLock);
2497         listener = mListener.promote();
2498     }
2499     if (idle && listener != NULL) {
2500         listener->notifyIdle();
2501     }
2502 }
2503 
setConsumerSurfaces(int streamId,const std::vector<sp<Surface>> & consumers,std::vector<int> * surfaceIds)2504 status_t Camera3Device::setConsumerSurfaces(int streamId,
2505         const std::vector<sp<Surface>>& consumers, std::vector<int> *surfaceIds) {
2506     ATRACE_CALL();
2507     ALOGV("%s: Camera %s: set consumer surface for stream %d",
2508             __FUNCTION__, mId.string(), streamId);
2509 
2510     if (surfaceIds == nullptr) {
2511         return BAD_VALUE;
2512     }
2513 
2514     Mutex::Autolock il(mInterfaceLock);
2515     Mutex::Autolock l(mLock);
2516 
2517     if (consumers.size() == 0) {
2518         CLOGE("No consumer is passed!");
2519         return BAD_VALUE;
2520     }
2521 
2522     sp<Camera3OutputStreamInterface> stream = mOutputStreams.get(streamId);
2523     if (stream == nullptr) {
2524         CLOGE("Stream %d is unknown", streamId);
2525         return BAD_VALUE;
2526     }
2527 
2528     // isConsumerConfigurationDeferred will be off after setConsumers
2529     bool isDeferred = stream->isConsumerConfigurationDeferred();
2530     status_t res = stream->setConsumers(consumers);
2531     if (res != OK) {
2532         CLOGE("Stream %d set consumer failed (error %d %s) ", streamId, res, strerror(-res));
2533         return res;
2534     }
2535 
2536     for (auto &consumer : consumers) {
2537         int id = stream->getSurfaceId(consumer);
2538         if (id < 0) {
2539             CLOGE("Invalid surface id!");
2540             return BAD_VALUE;
2541         }
2542         surfaceIds->push_back(id);
2543     }
2544 
2545     if (isDeferred) {
2546         if (!stream->isConfiguring()) {
2547             CLOGE("Stream %d was already fully configured.", streamId);
2548             return INVALID_OPERATION;
2549         }
2550 
2551         res = stream->finishConfiguration();
2552         if (res != OK) {
2553             // If finishConfiguration fails due to abandoned surface, do not set
2554             // device to error state.
2555             bool isSurfaceAbandoned =
2556                     (res == NO_INIT || res == DEAD_OBJECT) && stream->isAbandoned();
2557             if (!isSurfaceAbandoned) {
2558                 SET_ERR_L("Can't finish configuring output stream %d: %s (%d)",
2559                         stream->getId(), strerror(-res), res);
2560             }
2561             return res;
2562         }
2563     }
2564 
2565     return OK;
2566 }
2567 
updateStream(int streamId,const std::vector<sp<Surface>> & newSurfaces,const std::vector<OutputStreamInfo> & outputInfo,const std::vector<size_t> & removedSurfaceIds,KeyedVector<sp<Surface>,size_t> * outputMap)2568 status_t Camera3Device::updateStream(int streamId, const std::vector<sp<Surface>> &newSurfaces,
2569         const std::vector<OutputStreamInfo> &outputInfo,
2570         const std::vector<size_t> &removedSurfaceIds, KeyedVector<sp<Surface>, size_t> *outputMap) {
2571     Mutex::Autolock il(mInterfaceLock);
2572     Mutex::Autolock l(mLock);
2573 
2574     sp<Camera3OutputStreamInterface> stream = mOutputStreams.get(streamId);
2575     if (stream == nullptr) {
2576         CLOGE("Stream %d is unknown", streamId);
2577         return BAD_VALUE;
2578     }
2579 
2580     for (const auto &it : removedSurfaceIds) {
2581         if (mRequestThread->isOutputSurfacePending(streamId, it)) {
2582             CLOGE("Shared surface still part of a pending request!");
2583             return -EBUSY;
2584         }
2585     }
2586 
2587     status_t res = stream->updateStream(newSurfaces, outputInfo, removedSurfaceIds, outputMap);
2588     if (res != OK) {
2589         CLOGE("Stream %d failed to update stream (error %d %s) ",
2590               streamId, res, strerror(-res));
2591         if (res == UNKNOWN_ERROR) {
2592             SET_ERR_L("%s: Stream update failed to revert to previous output configuration!",
2593                     __FUNCTION__);
2594         }
2595         return res;
2596     }
2597 
2598     return res;
2599 }
2600 
dropStreamBuffers(bool dropping,int streamId)2601 status_t Camera3Device::dropStreamBuffers(bool dropping, int streamId) {
2602     Mutex::Autolock il(mInterfaceLock);
2603     Mutex::Autolock l(mLock);
2604 
2605     sp<Camera3OutputStreamInterface> stream = mOutputStreams.get(streamId);
2606     if (stream == nullptr) {
2607         ALOGE("%s: Stream %d is not found.", __FUNCTION__, streamId);
2608         return BAD_VALUE;
2609     }
2610     return stream->dropBuffers(dropping);
2611 }
2612 
2613 /**
2614  * Camera3Device private methods
2615  */
2616 
createCaptureRequest(const PhysicalCameraSettingsList & request,const SurfaceMap & surfaceMap)2617 sp<Camera3Device::CaptureRequest> Camera3Device::createCaptureRequest(
2618         const PhysicalCameraSettingsList &request, const SurfaceMap &surfaceMap) {
2619     ATRACE_CALL();
2620 
2621     sp<CaptureRequest> newRequest = new CaptureRequest;
2622     newRequest->mSettingsList = request;
2623 
2624     camera_metadata_entry_t inputStreams =
2625             newRequest->mSettingsList.begin()->metadata.find(ANDROID_REQUEST_INPUT_STREAMS);
2626     if (inputStreams.count > 0) {
2627         if (mInputStream == NULL ||
2628                 mInputStream->getId() != inputStreams.data.i32[0]) {
2629             CLOGE("Request references unknown input stream %d",
2630                     inputStreams.data.u8[0]);
2631             return NULL;
2632         }
2633 
2634         if (mInputStream->isConfiguring()) {
2635             SET_ERR_L("%s: input stream %d is not configured!",
2636                     __FUNCTION__, mInputStream->getId());
2637             return NULL;
2638         }
2639         // Check if stream prepare is blocking requests.
2640         if (mInputStream->isBlockedByPrepare()) {
2641             CLOGE("Request references an input stream that's being prepared!");
2642             return NULL;
2643         }
2644 
2645         newRequest->mInputStream = mInputStream;
2646         newRequest->mSettingsList.begin()->metadata.erase(ANDROID_REQUEST_INPUT_STREAMS);
2647     }
2648 
2649     camera_metadata_entry_t streams =
2650             newRequest->mSettingsList.begin()->metadata.find(ANDROID_REQUEST_OUTPUT_STREAMS);
2651     if (streams.count == 0) {
2652         CLOGE("Zero output streams specified!");
2653         return NULL;
2654     }
2655 
2656     for (size_t i = 0; i < streams.count; i++) {
2657         sp<Camera3OutputStreamInterface> stream = mOutputStreams.get(streams.data.i32[i]);
2658         if (stream == nullptr) {
2659             CLOGE("Request references unknown stream %d",
2660                     streams.data.i32[i]);
2661             return NULL;
2662         }
2663         // It is illegal to include a deferred consumer output stream into a request
2664         auto iter = surfaceMap.find(streams.data.i32[i]);
2665         if (iter != surfaceMap.end()) {
2666             const std::vector<size_t>& surfaces = iter->second;
2667             for (const auto& surface : surfaces) {
2668                 if (stream->isConsumerConfigurationDeferred(surface)) {
2669                     CLOGE("Stream %d surface %zu hasn't finished configuration yet "
2670                           "due to deferred consumer", stream->getId(), surface);
2671                     return NULL;
2672                 }
2673             }
2674             newRequest->mOutputSurfaces[streams.data.i32[i]] = surfaces;
2675         }
2676 
2677         if (stream->isConfiguring()) {
2678             SET_ERR_L("%s: stream %d is not configured!", __FUNCTION__, stream->getId());
2679             return NULL;
2680         }
2681         // Check if stream prepare is blocking requests.
2682         if (stream->isBlockedByPrepare()) {
2683             CLOGE("Request references an output stream that's being prepared!");
2684             return NULL;
2685         }
2686 
2687         newRequest->mOutputStreams.push(stream);
2688     }
2689     newRequest->mSettingsList.begin()->metadata.erase(ANDROID_REQUEST_OUTPUT_STREAMS);
2690     newRequest->mBatchSize = 1;
2691 
2692     return newRequest;
2693 }
2694 
isOpaqueInputSizeSupported(uint32_t width,uint32_t height)2695 bool Camera3Device::isOpaqueInputSizeSupported(uint32_t width, uint32_t height) {
2696     for (uint32_t i = 0; i < mSupportedOpaqueInputSizes.size(); i++) {
2697         Size size = mSupportedOpaqueInputSizes[i];
2698         if (size.width == width && size.height == height) {
2699             return true;
2700         }
2701     }
2702 
2703     return false;
2704 }
2705 
cancelStreamsConfigurationLocked()2706 void Camera3Device::cancelStreamsConfigurationLocked() {
2707     int res = OK;
2708     if (mInputStream != NULL && mInputStream->isConfiguring()) {
2709         res = mInputStream->cancelConfiguration();
2710         if (res != OK) {
2711             CLOGE("Can't cancel configuring input stream %d: %s (%d)",
2712                     mInputStream->getId(), strerror(-res), res);
2713         }
2714     }
2715 
2716     for (size_t i = 0; i < mOutputStreams.size(); i++) {
2717         sp<Camera3OutputStreamInterface> outputStream = mOutputStreams[i];
2718         if (outputStream->isConfiguring()) {
2719             res = outputStream->cancelConfiguration();
2720             if (res != OK) {
2721                 CLOGE("Can't cancel configuring output stream %d: %s (%d)",
2722                         outputStream->getId(), strerror(-res), res);
2723             }
2724         }
2725     }
2726 
2727     // Return state to that at start of call, so that future configures
2728     // properly clean things up
2729     internalUpdateStatusLocked(STATUS_UNCONFIGURED);
2730     mNeedConfig = true;
2731 
2732     res = mPreparerThread->resume();
2733     if (res != OK) {
2734         ALOGE("%s: Camera %s: Preparer thread failed to resume!", __FUNCTION__, mId.string());
2735     }
2736 }
2737 
reconfigureCamera(const CameraMetadata & sessionParams)2738 bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams) {
2739     ATRACE_CALL();
2740     bool ret = false;
2741 
2742     Mutex::Autolock il(mInterfaceLock);
2743     nsecs_t maxExpectedDuration = getExpectedInFlightDuration();
2744 
2745     Mutex::Autolock l(mLock);
2746     auto rc = internalPauseAndWaitLocked(maxExpectedDuration);
2747     if (rc == NO_ERROR) {
2748         mNeedConfig = true;
2749         rc = configureStreamsLocked(mOperatingMode, sessionParams, /*notifyRequestThread*/ false);
2750         if (rc == NO_ERROR) {
2751             ret = true;
2752             mPauseStateNotify = false;
2753             //Moving to active state while holding 'mLock' is important.
2754             //There could be pending calls to 'create-/deleteStream' which
2755             //will trigger another stream configuration while the already
2756             //present streams end up with outstanding buffers that will
2757             //not get drained.
2758             internalUpdateStatusLocked(STATUS_ACTIVE);
2759         } else if (rc == DEAD_OBJECT) {
2760             // DEAD_OBJECT can be returned if either the consumer surface is
2761             // abandoned, or the HAL has died.
2762             // - If the HAL has died, configureStreamsLocked call will set
2763             // device to error state,
2764             // - If surface is abandoned, we should not set device to error
2765             // state.
2766             ALOGE("Failed to re-configure camera due to abandoned surface");
2767         } else {
2768             SET_ERR_L("Failed to re-configure camera: %d", rc);
2769         }
2770     } else {
2771         ALOGE("%s: Failed to pause streaming: %d", __FUNCTION__, rc);
2772     }
2773 
2774     return ret;
2775 }
2776 
configureStreamsLocked(int operatingMode,const CameraMetadata & sessionParams,bool notifyRequestThread)2777 status_t Camera3Device::configureStreamsLocked(int operatingMode,
2778         const CameraMetadata& sessionParams, bool notifyRequestThread) {
2779     ATRACE_CALL();
2780     status_t res;
2781 
2782     if (mStatus != STATUS_UNCONFIGURED && mStatus != STATUS_CONFIGURED) {
2783         CLOGE("Not idle");
2784         return INVALID_OPERATION;
2785     }
2786 
2787     if (operatingMode < 0) {
2788         CLOGE("Invalid operating mode: %d", operatingMode);
2789         return BAD_VALUE;
2790     }
2791 
2792     bool isConstrainedHighSpeed =
2793             static_cast<int>(StreamConfigurationMode::CONSTRAINED_HIGH_SPEED_MODE) ==
2794             operatingMode;
2795 
2796     if (mOperatingMode != operatingMode) {
2797         mNeedConfig = true;
2798         mIsConstrainedHighSpeedConfiguration = isConstrainedHighSpeed;
2799         mOperatingMode = operatingMode;
2800     }
2801 
2802     if (!mNeedConfig) {
2803         ALOGV("%s: Skipping config, no stream changes", __FUNCTION__);
2804         return OK;
2805     }
2806 
2807     // Workaround for device HALv3.2 or older spec bug - zero streams requires
2808     // adding a dummy stream instead.
2809     // TODO: Bug: 17321404 for fixing the HAL spec and removing this workaround.
2810     if (mOutputStreams.size() == 0) {
2811         addDummyStreamLocked();
2812     } else {
2813         tryRemoveDummyStreamLocked();
2814     }
2815 
2816     // Start configuring the streams
2817     ALOGV("%s: Camera %s: Starting stream configuration", __FUNCTION__, mId.string());
2818 
2819     mPreparerThread->pause();
2820 
2821     camera3_stream_configuration config;
2822     config.operation_mode = mOperatingMode;
2823     config.num_streams = (mInputStream != NULL) + mOutputStreams.size();
2824 
2825     Vector<camera3_stream_t*> streams;
2826     streams.setCapacity(config.num_streams);
2827     std::vector<uint32_t> bufferSizes(config.num_streams, 0);
2828 
2829 
2830     if (mInputStream != NULL) {
2831         camera3_stream_t *inputStream;
2832         inputStream = mInputStream->startConfiguration();
2833         if (inputStream == NULL) {
2834             CLOGE("Can't start input stream configuration");
2835             cancelStreamsConfigurationLocked();
2836             return INVALID_OPERATION;
2837         }
2838         streams.add(inputStream);
2839     }
2840 
2841     for (size_t i = 0; i < mOutputStreams.size(); i++) {
2842 
2843         // Don't configure bidi streams twice, nor add them twice to the list
2844         if (mOutputStreams[i].get() ==
2845             static_cast<Camera3StreamInterface*>(mInputStream.get())) {
2846 
2847             config.num_streams--;
2848             continue;
2849         }
2850 
2851         camera3_stream_t *outputStream;
2852         outputStream = mOutputStreams[i]->startConfiguration();
2853         if (outputStream == NULL) {
2854             CLOGE("Can't start output stream configuration");
2855             cancelStreamsConfigurationLocked();
2856             return INVALID_OPERATION;
2857         }
2858         streams.add(outputStream);
2859 
2860         if (outputStream->format == HAL_PIXEL_FORMAT_BLOB) {
2861             size_t k = i + ((mInputStream != nullptr) ? 1 : 0); // Input stream if present should
2862                                                                 // always occupy the initial entry.
2863             if (outputStream->data_space == HAL_DATASPACE_V0_JFIF) {
2864                 bufferSizes[k] = static_cast<uint32_t>(
2865                         getJpegBufferSize(outputStream->width, outputStream->height));
2866             } else if (outputStream->data_space ==
2867                     static_cast<android_dataspace>(HAL_DATASPACE_JPEG_APP_SEGMENTS)) {
2868                 bufferSizes[k] = outputStream->width * outputStream->height;
2869             } else {
2870                 ALOGW("%s: Blob dataSpace %d not supported",
2871                         __FUNCTION__, outputStream->data_space);
2872             }
2873         }
2874     }
2875 
2876     config.streams = streams.editArray();
2877 
2878     // Do the HAL configuration; will potentially touch stream
2879     // max_buffers, usage, and priv fields, as well as data_space and format
2880     // fields for IMPLEMENTATION_DEFINED formats.
2881 
2882     const camera_metadata_t *sessionBuffer = sessionParams.getAndLock();
2883     res = mInterface->configureStreams(sessionBuffer, &config, bufferSizes);
2884     sessionParams.unlock(sessionBuffer);
2885 
2886     if (res == BAD_VALUE) {
2887         // HAL rejected this set of streams as unsupported, clean up config
2888         // attempt and return to unconfigured state
2889         CLOGE("Set of requested inputs/outputs not supported by HAL");
2890         cancelStreamsConfigurationLocked();
2891         return BAD_VALUE;
2892     } else if (res != OK) {
2893         // Some other kind of error from configure_streams - this is not
2894         // expected
2895         SET_ERR_L("Unable to configure streams with HAL: %s (%d)",
2896                 strerror(-res), res);
2897         return res;
2898     }
2899 
2900     // Finish all stream configuration immediately.
2901     // TODO: Try to relax this later back to lazy completion, which should be
2902     // faster
2903 
2904     if (mInputStream != NULL && mInputStream->isConfiguring()) {
2905         bool streamReConfigured = false;
2906         res = mInputStream->finishConfiguration(&streamReConfigured);
2907         if (res != OK) {
2908             CLOGE("Can't finish configuring input stream %d: %s (%d)",
2909                     mInputStream->getId(), strerror(-res), res);
2910             cancelStreamsConfigurationLocked();
2911             if ((res == NO_INIT || res == DEAD_OBJECT) && mInputStream->isAbandoned()) {
2912                 return DEAD_OBJECT;
2913             }
2914             return BAD_VALUE;
2915         }
2916         if (streamReConfigured) {
2917             mInterface->onStreamReConfigured(mInputStream->getId());
2918         }
2919     }
2920 
2921     for (size_t i = 0; i < mOutputStreams.size(); i++) {
2922         sp<Camera3OutputStreamInterface> outputStream = mOutputStreams[i];
2923         if (outputStream->isConfiguring() && !outputStream->isConsumerConfigurationDeferred()) {
2924             bool streamReConfigured = false;
2925             res = outputStream->finishConfiguration(&streamReConfigured);
2926             if (res != OK) {
2927                 CLOGE("Can't finish configuring output stream %d: %s (%d)",
2928                         outputStream->getId(), strerror(-res), res);
2929                 cancelStreamsConfigurationLocked();
2930                 if ((res == NO_INIT || res == DEAD_OBJECT) && outputStream->isAbandoned()) {
2931                     return DEAD_OBJECT;
2932                 }
2933                 return BAD_VALUE;
2934             }
2935             if (streamReConfigured) {
2936                 mInterface->onStreamReConfigured(outputStream->getId());
2937             }
2938         }
2939     }
2940 
2941     // Request thread needs to know to avoid using repeat-last-settings protocol
2942     // across configure_streams() calls
2943     if (notifyRequestThread) {
2944         mRequestThread->configurationComplete(mIsConstrainedHighSpeedConfiguration, sessionParams);
2945     }
2946 
2947     char value[PROPERTY_VALUE_MAX];
2948     property_get("camera.fifo.disable", value, "0");
2949     int32_t disableFifo = atoi(value);
2950     if (disableFifo != 1) {
2951         // Boost priority of request thread to SCHED_FIFO.
2952         pid_t requestThreadTid = mRequestThread->getTid();
2953         res = requestPriority(getpid(), requestThreadTid,
2954                 kRequestThreadPriority, /*isForApp*/ false, /*asynchronous*/ false);
2955         if (res != OK) {
2956             ALOGW("Can't set realtime priority for request processing thread: %s (%d)",
2957                     strerror(-res), res);
2958         } else {
2959             ALOGD("Set real time priority for request queue thread (tid %d)", requestThreadTid);
2960         }
2961     }
2962 
2963     // Update device state
2964     const camera_metadata_t *newSessionParams = sessionParams.getAndLock();
2965     const camera_metadata_t *currentSessionParams = mSessionParams.getAndLock();
2966     bool updateSessionParams = (newSessionParams != currentSessionParams) ? true : false;
2967     sessionParams.unlock(newSessionParams);
2968     mSessionParams.unlock(currentSessionParams);
2969     if (updateSessionParams)  {
2970         mSessionParams = sessionParams;
2971     }
2972 
2973     mNeedConfig = false;
2974 
2975     internalUpdateStatusLocked((mDummyStreamId == NO_STREAM) ?
2976             STATUS_CONFIGURED : STATUS_UNCONFIGURED);
2977 
2978     ALOGV("%s: Camera %s: Stream configuration complete", __FUNCTION__, mId.string());
2979 
2980     // tear down the deleted streams after configure streams.
2981     mDeletedStreams.clear();
2982 
2983     auto rc = mPreparerThread->resume();
2984     if (rc != OK) {
2985         SET_ERR_L("%s: Camera %s: Preparer thread failed to resume!", __FUNCTION__, mId.string());
2986         return rc;
2987     }
2988 
2989     if (mDummyStreamId == NO_STREAM) {
2990         mRequestBufferSM.onStreamsConfigured();
2991     }
2992 
2993     return OK;
2994 }
2995 
addDummyStreamLocked()2996 status_t Camera3Device::addDummyStreamLocked() {
2997     ATRACE_CALL();
2998     status_t res;
2999 
3000     if (mDummyStreamId != NO_STREAM) {
3001         // Should never be adding a second dummy stream when one is already
3002         // active
3003         SET_ERR_L("%s: Camera %s: A dummy stream already exists!",
3004                 __FUNCTION__, mId.string());
3005         return INVALID_OPERATION;
3006     }
3007 
3008     ALOGV("%s: Camera %s: Adding a dummy stream", __FUNCTION__, mId.string());
3009 
3010     sp<Camera3OutputStreamInterface> dummyStream =
3011             new Camera3DummyStream(mNextStreamId);
3012 
3013     res = mOutputStreams.add(mNextStreamId, dummyStream);
3014     if (res < 0) {
3015         SET_ERR_L("Can't add dummy stream to set: %s (%d)", strerror(-res), res);
3016         return res;
3017     }
3018 
3019     mDummyStreamId = mNextStreamId;
3020     mNextStreamId++;
3021 
3022     return OK;
3023 }
3024 
tryRemoveDummyStreamLocked()3025 status_t Camera3Device::tryRemoveDummyStreamLocked() {
3026     ATRACE_CALL();
3027     status_t res;
3028 
3029     if (mDummyStreamId == NO_STREAM) return OK;
3030     if (mOutputStreams.size() == 1) return OK;
3031 
3032     ALOGV("%s: Camera %s: Removing the dummy stream", __FUNCTION__, mId.string());
3033 
3034     // Ok, have a dummy stream and there's at least one other output stream,
3035     // so remove the dummy
3036 
3037     sp<Camera3StreamInterface> deletedStream = mOutputStreams.get(mDummyStreamId);
3038     if (deletedStream == nullptr) {
3039         SET_ERR_L("Dummy stream %d does not appear to exist", mDummyStreamId);
3040         return INVALID_OPERATION;
3041     }
3042     mOutputStreams.remove(mDummyStreamId);
3043 
3044     // Free up the stream endpoint so that it can be used by some other stream
3045     res = deletedStream->disconnect();
3046     if (res != OK) {
3047         SET_ERR_L("Can't disconnect deleted dummy stream %d", mDummyStreamId);
3048         // fall through since we want to still list the stream as deleted.
3049     }
3050     mDeletedStreams.add(deletedStream);
3051     mDummyStreamId = NO_STREAM;
3052 
3053     return res;
3054 }
3055 
setErrorState(const char * fmt,...)3056 void Camera3Device::setErrorState(const char *fmt, ...) {
3057     ATRACE_CALL();
3058     Mutex::Autolock l(mLock);
3059     va_list args;
3060     va_start(args, fmt);
3061 
3062     setErrorStateLockedV(fmt, args);
3063 
3064     va_end(args);
3065 }
3066 
setErrorStateV(const char * fmt,va_list args)3067 void Camera3Device::setErrorStateV(const char *fmt, va_list args) {
3068     ATRACE_CALL();
3069     Mutex::Autolock l(mLock);
3070     setErrorStateLockedV(fmt, args);
3071 }
3072 
setErrorStateLocked(const char * fmt,...)3073 void Camera3Device::setErrorStateLocked(const char *fmt, ...) {
3074     va_list args;
3075     va_start(args, fmt);
3076 
3077     setErrorStateLockedV(fmt, args);
3078 
3079     va_end(args);
3080 }
3081 
setErrorStateLockedV(const char * fmt,va_list args)3082 void Camera3Device::setErrorStateLockedV(const char *fmt, va_list args) {
3083     // Print out all error messages to log
3084     String8 errorCause = String8::formatV(fmt, args);
3085     ALOGE("Camera %s: %s", mId.string(), errorCause.string());
3086 
3087     // But only do error state transition steps for the first error
3088     if (mStatus == STATUS_ERROR || mStatus == STATUS_UNINITIALIZED) return;
3089 
3090     mErrorCause = errorCause;
3091 
3092     if (mRequestThread != nullptr) {
3093         mRequestThread->setPaused(true);
3094     }
3095     internalUpdateStatusLocked(STATUS_ERROR);
3096 
3097     // Notify upstream about a device error
3098     sp<NotificationListener> listener = mListener.promote();
3099     if (listener != NULL) {
3100         listener->notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE,
3101                 CaptureResultExtras());
3102     }
3103 
3104     // Save stack trace. View by dumping it later.
3105     CameraTraces::saveTrace();
3106     // TODO: consider adding errorCause and client pid/procname
3107 }
3108 
3109 /**
3110  * In-flight request management
3111  */
3112 
registerInFlight(uint32_t frameNumber,int32_t numBuffers,CaptureResultExtras resultExtras,bool hasInput,bool hasAppCallback,nsecs_t maxExpectedDuration,std::set<String8> & physicalCameraIds,bool isStillCapture,bool isZslCapture,const SurfaceMap & outputSurfaces)3113 status_t Camera3Device::registerInFlight(uint32_t frameNumber,
3114         int32_t numBuffers, CaptureResultExtras resultExtras, bool hasInput,
3115         bool hasAppCallback, nsecs_t maxExpectedDuration,
3116         std::set<String8>& physicalCameraIds, bool isStillCapture,
3117         bool isZslCapture, const SurfaceMap& outputSurfaces) {
3118     ATRACE_CALL();
3119     Mutex::Autolock l(mInFlightLock);
3120 
3121     ssize_t res;
3122     res = mInFlightMap.add(frameNumber, InFlightRequest(numBuffers, resultExtras, hasInput,
3123             hasAppCallback, maxExpectedDuration, physicalCameraIds, isStillCapture, isZslCapture,
3124             outputSurfaces));
3125     if (res < 0) return res;
3126 
3127     if (mInFlightMap.size() == 1) {
3128         // Hold a separate dedicated tracker lock to prevent race with disconnect and also
3129         // avoid a deadlock during reprocess requests.
3130         Mutex::Autolock l(mTrackerLock);
3131         if (mStatusTracker != nullptr) {
3132             mStatusTracker->markComponentActive(mInFlightStatusId);
3133         }
3134     }
3135 
3136     mExpectedInflightDuration += maxExpectedDuration;
3137     return OK;
3138 }
3139 
returnOutputBuffers(const camera3_stream_buffer_t * outputBuffers,size_t numBuffers,nsecs_t timestamp,bool timestampIncreasing,const SurfaceMap & outputSurfaces,const CaptureResultExtras & inResultExtras)3140 void Camera3Device::returnOutputBuffers(
3141         const camera3_stream_buffer_t *outputBuffers, size_t numBuffers,
3142         nsecs_t timestamp, bool timestampIncreasing,
3143         const SurfaceMap& outputSurfaces,
3144         const CaptureResultExtras &inResultExtras) {
3145 
3146     for (size_t i = 0; i < numBuffers; i++)
3147     {
3148         if (outputBuffers[i].buffer == nullptr) {
3149             if (!mUseHalBufManager) {
3150                 // With HAL buffer management API, HAL sometimes will have to return buffers that
3151                 // has not got a output buffer handle filled yet. This is though illegal if HAL
3152                 // buffer management API is not being used.
3153                 ALOGE("%s: cannot return a null buffer!", __FUNCTION__);
3154             }
3155             continue;
3156         }
3157 
3158         Camera3StreamInterface *stream = Camera3Stream::cast(outputBuffers[i].stream);
3159         int streamId = stream->getId();
3160         const auto& it = outputSurfaces.find(streamId);
3161         status_t res = OK;
3162         if (it != outputSurfaces.end()) {
3163             res = stream->returnBuffer(
3164                     outputBuffers[i], timestamp, timestampIncreasing, it->second,
3165                     inResultExtras.frameNumber);
3166         } else {
3167             res = stream->returnBuffer(
3168                     outputBuffers[i], timestamp, timestampIncreasing, std::vector<size_t> (),
3169                     inResultExtras.frameNumber);
3170         }
3171 
3172         // Note: stream may be deallocated at this point, if this buffer was
3173         // the last reference to it.
3174         if (res == NO_INIT || res == DEAD_OBJECT) {
3175             ALOGV("Can't return buffer to its stream: %s (%d)", strerror(-res), res);
3176         } else if (res != OK) {
3177             ALOGE("Can't return buffer to its stream: %s (%d)", strerror(-res), res);
3178         }
3179 
3180         // Long processing consumers can cause returnBuffer timeout for shared stream
3181         // If that happens, cancel the buffer and send a buffer error to client
3182         if (it != outputSurfaces.end() && res == TIMED_OUT &&
3183                 outputBuffers[i].status == CAMERA3_BUFFER_STATUS_OK) {
3184             // cancel the buffer
3185             camera3_stream_buffer_t sb = outputBuffers[i];
3186             sb.status = CAMERA3_BUFFER_STATUS_ERROR;
3187             stream->returnBuffer(sb, /*timestamp*/0, timestampIncreasing, std::vector<size_t> (),
3188                     inResultExtras.frameNumber);
3189 
3190             // notify client buffer error
3191             sp<NotificationListener> listener;
3192             {
3193                 Mutex::Autolock l(mOutputLock);
3194                 listener = mListener.promote();
3195             }
3196 
3197             if (listener != nullptr) {
3198                 CaptureResultExtras extras = inResultExtras;
3199                 extras.errorStreamId = streamId;
3200                 listener->notifyError(
3201                         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER,
3202                         extras);
3203             }
3204         }
3205     }
3206 }
3207 
removeInFlightMapEntryLocked(int idx)3208 void Camera3Device::removeInFlightMapEntryLocked(int idx) {
3209     ATRACE_CALL();
3210     nsecs_t duration = mInFlightMap.valueAt(idx).maxExpectedDuration;
3211     mInFlightMap.removeItemsAt(idx, 1);
3212 
3213     // Indicate idle inFlightMap to the status tracker
3214     if (mInFlightMap.size() == 0) {
3215         mRequestBufferSM.onInflightMapEmpty();
3216         // Hold a separate dedicated tracker lock to prevent race with disconnect and also
3217         // avoid a deadlock during reprocess requests.
3218         Mutex::Autolock l(mTrackerLock);
3219         if (mStatusTracker != nullptr) {
3220             mStatusTracker->markComponentIdle(mInFlightStatusId, Fence::NO_FENCE);
3221         }
3222     }
3223     mExpectedInflightDuration -= duration;
3224 }
3225 
removeInFlightRequestIfReadyLocked(int idx)3226 void Camera3Device::removeInFlightRequestIfReadyLocked(int idx) {
3227 
3228     const InFlightRequest &request = mInFlightMap.valueAt(idx);
3229     const uint32_t frameNumber = mInFlightMap.keyAt(idx);
3230 
3231     nsecs_t sensorTimestamp = request.sensorTimestamp;
3232     nsecs_t shutterTimestamp = request.shutterTimestamp;
3233 
3234     // Check if it's okay to remove the request from InFlightMap:
3235     // In the case of a successful request:
3236     //      all input and output buffers, all result metadata, shutter callback
3237     //      arrived.
3238     // In the case of a unsuccessful request:
3239     //      all input and output buffers arrived.
3240     if (request.numBuffersLeft == 0 &&
3241             (request.skipResultMetadata ||
3242             (request.haveResultMetadata && shutterTimestamp != 0))) {
3243         if (request.stillCapture) {
3244             ATRACE_ASYNC_END("still capture", frameNumber);
3245         }
3246 
3247         ATRACE_ASYNC_END("frame capture", frameNumber);
3248 
3249         // Sanity check - if sensor timestamp matches shutter timestamp in the
3250         // case of request having callback.
3251         if (request.hasCallback && request.requestStatus == OK &&
3252                 sensorTimestamp != shutterTimestamp) {
3253             SET_ERR("sensor timestamp (%" PRId64
3254                 ") for frame %d doesn't match shutter timestamp (%" PRId64 ")",
3255                 sensorTimestamp, frameNumber, shutterTimestamp);
3256         }
3257 
3258         // for an unsuccessful request, it may have pending output buffers to
3259         // return.
3260         assert(request.requestStatus != OK ||
3261                request.pendingOutputBuffers.size() == 0);
3262         returnOutputBuffers(request.pendingOutputBuffers.array(),
3263             request.pendingOutputBuffers.size(), 0, /*timestampIncreasing*/true,
3264             request.outputSurfaces, request.resultExtras);
3265 
3266         removeInFlightMapEntryLocked(idx);
3267         ALOGVV("%s: removed frame %d from InFlightMap", __FUNCTION__, frameNumber);
3268      }
3269 
3270     // Sanity check - if we have too many in-flight frames, something has
3271     // likely gone wrong
3272     if (!mIsConstrainedHighSpeedConfiguration && mInFlightMap.size() > kInFlightWarnLimit) {
3273         CLOGE("In-flight list too large: %zu", mInFlightMap.size());
3274     } else if (mIsConstrainedHighSpeedConfiguration && mInFlightMap.size() >
3275             kInFlightWarnLimitHighSpeed) {
3276         CLOGE("In-flight list too large for high speed configuration: %zu",
3277                 mInFlightMap.size());
3278     }
3279 }
3280 
flushInflightRequests()3281 void Camera3Device::flushInflightRequests() {
3282     ATRACE_CALL();
3283     { // First return buffers cached in mInFlightMap
3284         Mutex::Autolock l(mInFlightLock);
3285         for (size_t idx = 0; idx < mInFlightMap.size(); idx++) {
3286             const InFlightRequest &request = mInFlightMap.valueAt(idx);
3287             returnOutputBuffers(request.pendingOutputBuffers.array(),
3288                 request.pendingOutputBuffers.size(), 0,
3289                 /*timestampIncreasing*/true, request.outputSurfaces,
3290                 request.resultExtras);
3291         }
3292         mInFlightMap.clear();
3293         mExpectedInflightDuration = 0;
3294     }
3295 
3296     // Then return all inflight buffers not returned by HAL
3297     std::vector<std::pair<int32_t, int32_t>> inflightKeys;
3298     mInterface->getInflightBufferKeys(&inflightKeys);
3299 
3300     // Inflight buffers for HAL buffer manager
3301     std::vector<uint64_t> inflightRequestBufferKeys;
3302     mInterface->getInflightRequestBufferKeys(&inflightRequestBufferKeys);
3303 
3304     // (streamId, frameNumber, buffer_handle_t*) tuple for all inflight buffers.
3305     // frameNumber will be -1 for buffers from HAL buffer manager
3306     std::vector<std::tuple<int32_t, int32_t, buffer_handle_t*>> inflightBuffers;
3307     inflightBuffers.reserve(inflightKeys.size() + inflightRequestBufferKeys.size());
3308 
3309     for (auto& pair : inflightKeys) {
3310         int32_t frameNumber = pair.first;
3311         int32_t streamId = pair.second;
3312         buffer_handle_t* buffer;
3313         status_t res = mInterface->popInflightBuffer(frameNumber, streamId, &buffer);
3314         if (res != OK) {
3315             ALOGE("%s: Frame %d: No in-flight buffer for stream %d",
3316                     __FUNCTION__, frameNumber, streamId);
3317             continue;
3318         }
3319         inflightBuffers.push_back(std::make_tuple(streamId, frameNumber, buffer));
3320     }
3321 
3322     for (auto& bufferId : inflightRequestBufferKeys) {
3323         int32_t streamId = -1;
3324         buffer_handle_t* buffer = nullptr;
3325         status_t res = mInterface->popInflightRequestBuffer(bufferId, &buffer, &streamId);
3326         if (res != OK) {
3327             ALOGE("%s: cannot find in-flight buffer %" PRIu64, __FUNCTION__, bufferId);
3328             continue;
3329         }
3330         inflightBuffers.push_back(std::make_tuple(streamId, /*frameNumber*/-1, buffer));
3331     }
3332 
3333     int32_t inputStreamId = (mInputStream != nullptr) ? mInputStream->getId() : -1;
3334     for (auto& tuple : inflightBuffers) {
3335         status_t res = OK;
3336         int32_t streamId = std::get<0>(tuple);
3337         int32_t frameNumber = std::get<1>(tuple);
3338         buffer_handle_t* buffer = std::get<2>(tuple);
3339 
3340         camera3_stream_buffer_t streamBuffer;
3341         streamBuffer.buffer = buffer;
3342         streamBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
3343         streamBuffer.acquire_fence = -1;
3344         streamBuffer.release_fence = -1;
3345 
3346         // First check if the buffer belongs to deleted stream
3347         bool streamDeleted = false;
3348         for (auto& stream : mDeletedStreams) {
3349             if (streamId == stream->getId()) {
3350                 streamDeleted = true;
3351                 // Return buffer to deleted stream
3352                 camera3_stream* halStream = stream->asHalStream();
3353                 streamBuffer.stream = halStream;
3354                 switch (halStream->stream_type) {
3355                     case CAMERA3_STREAM_OUTPUT:
3356                         res = stream->returnBuffer(streamBuffer, /*timestamp*/ 0,
3357                                 /*timestampIncreasing*/true, std::vector<size_t> (), frameNumber);
3358                         if (res != OK) {
3359                             ALOGE("%s: Can't return output buffer for frame %d to"
3360                                   " stream %d: %s (%d)",  __FUNCTION__,
3361                                   frameNumber, streamId, strerror(-res), res);
3362                         }
3363                         break;
3364                     case CAMERA3_STREAM_INPUT:
3365                         res = stream->returnInputBuffer(streamBuffer);
3366                         if (res != OK) {
3367                             ALOGE("%s: Can't return input buffer for frame %d to"
3368                                   " stream %d: %s (%d)",  __FUNCTION__,
3369                                   frameNumber, streamId, strerror(-res), res);
3370                         }
3371                         break;
3372                     default: // Bi-direcitonal stream is deprecated
3373                         ALOGE("%s: stream %d has unknown stream type %d",
3374                                 __FUNCTION__, streamId, halStream->stream_type);
3375                         break;
3376                 }
3377                 break;
3378             }
3379         }
3380         if (streamDeleted) {
3381             continue;
3382         }
3383 
3384         // Then check against configured streams
3385         if (streamId == inputStreamId) {
3386             streamBuffer.stream = mInputStream->asHalStream();
3387             res = mInputStream->returnInputBuffer(streamBuffer);
3388             if (res != OK) {
3389                 ALOGE("%s: Can't return input buffer for frame %d to"
3390                       " stream %d: %s (%d)",  __FUNCTION__,
3391                       frameNumber, streamId, strerror(-res), res);
3392             }
3393         } else {
3394             sp<Camera3StreamInterface> stream = mOutputStreams.get(streamId);
3395             if (stream == nullptr) {
3396                 ALOGE("%s: Output stream id %d not found!", __FUNCTION__, streamId);
3397                 continue;
3398             }
3399             streamBuffer.stream = stream->asHalStream();
3400             returnOutputBuffers(&streamBuffer, /*size*/1, /*timestamp*/ 0);
3401         }
3402     }
3403 }
3404 
insertResultLocked(CaptureResult * result,uint32_t frameNumber)3405 void Camera3Device::insertResultLocked(CaptureResult *result,
3406         uint32_t frameNumber) {
3407     if (result == nullptr) return;
3408 
3409     camera_metadata_t *meta = const_cast<camera_metadata_t *>(
3410             result->mMetadata.getAndLock());
3411     set_camera_metadata_vendor_id(meta, mVendorTagId);
3412     result->mMetadata.unlock(meta);
3413 
3414     if (result->mMetadata.update(ANDROID_REQUEST_FRAME_COUNT,
3415             (int32_t*)&frameNumber, 1) != OK) {
3416         SET_ERR("Failed to set frame number %d in metadata", frameNumber);
3417         return;
3418     }
3419 
3420     if (result->mMetadata.update(ANDROID_REQUEST_ID, &result->mResultExtras.requestId, 1) != OK) {
3421         SET_ERR("Failed to set request ID in metadata for frame %d", frameNumber);
3422         return;
3423     }
3424 
3425     // Update vendor tag id for physical metadata
3426     for (auto& physicalMetadata : result->mPhysicalMetadatas) {
3427         camera_metadata_t *pmeta = const_cast<camera_metadata_t *>(
3428                 physicalMetadata.mPhysicalCameraMetadata.getAndLock());
3429         set_camera_metadata_vendor_id(pmeta, mVendorTagId);
3430         physicalMetadata.mPhysicalCameraMetadata.unlock(pmeta);
3431     }
3432 
3433     // Valid result, insert into queue
3434     List<CaptureResult>::iterator queuedResult =
3435             mResultQueue.insert(mResultQueue.end(), CaptureResult(*result));
3436     ALOGVV("%s: result requestId = %" PRId32 ", frameNumber = %" PRId64
3437            ", burstId = %" PRId32, __FUNCTION__,
3438            queuedResult->mResultExtras.requestId,
3439            queuedResult->mResultExtras.frameNumber,
3440            queuedResult->mResultExtras.burstId);
3441 
3442     mResultSignal.signal();
3443 }
3444 
3445 
sendPartialCaptureResult(const camera_metadata_t * partialResult,const CaptureResultExtras & resultExtras,uint32_t frameNumber)3446 void Camera3Device::sendPartialCaptureResult(const camera_metadata_t * partialResult,
3447         const CaptureResultExtras &resultExtras, uint32_t frameNumber) {
3448     ATRACE_CALL();
3449     Mutex::Autolock l(mOutputLock);
3450 
3451     CaptureResult captureResult;
3452     captureResult.mResultExtras = resultExtras;
3453     captureResult.mMetadata = partialResult;
3454 
3455     // Fix up result metadata for monochrome camera.
3456     status_t res = fixupMonochromeTags(mDeviceInfo, captureResult.mMetadata);
3457     if (res != OK) {
3458         SET_ERR("Failed to override result metadata: %s (%d)", strerror(-res), res);
3459         return;
3460     }
3461 
3462     insertResultLocked(&captureResult, frameNumber);
3463 }
3464 
3465 
sendCaptureResult(CameraMetadata & pendingMetadata,CaptureResultExtras & resultExtras,CameraMetadata & collectedPartialResult,uint32_t frameNumber,bool reprocess,bool zslStillCapture,const std::vector<PhysicalCaptureResultInfo> & physicalMetadatas)3466 void Camera3Device::sendCaptureResult(CameraMetadata &pendingMetadata,
3467         CaptureResultExtras &resultExtras,
3468         CameraMetadata &collectedPartialResult,
3469         uint32_t frameNumber,
3470         bool reprocess, bool zslStillCapture,
3471         const std::vector<PhysicalCaptureResultInfo>& physicalMetadatas) {
3472     ATRACE_CALL();
3473     if (pendingMetadata.isEmpty())
3474         return;
3475 
3476     Mutex::Autolock l(mOutputLock);
3477 
3478     // TODO: need to track errors for tighter bounds on expected frame number
3479     if (reprocess) {
3480         if (frameNumber < mNextReprocessResultFrameNumber) {
3481             SET_ERR("Out-of-order reprocess capture result metadata submitted! "
3482                 "(got frame number %d, expecting %d)",
3483                 frameNumber, mNextReprocessResultFrameNumber);
3484             return;
3485         }
3486         mNextReprocessResultFrameNumber = frameNumber + 1;
3487     } else if (zslStillCapture) {
3488         if (frameNumber < mNextZslStillResultFrameNumber) {
3489             SET_ERR("Out-of-order ZSL still capture result metadata submitted! "
3490                 "(got frame number %d, expecting %d)",
3491                 frameNumber, mNextZslStillResultFrameNumber);
3492             return;
3493         }
3494         mNextZslStillResultFrameNumber = frameNumber + 1;
3495     } else {
3496         if (frameNumber < mNextResultFrameNumber) {
3497             SET_ERR("Out-of-order capture result metadata submitted! "
3498                     "(got frame number %d, expecting %d)",
3499                     frameNumber, mNextResultFrameNumber);
3500             return;
3501         }
3502         mNextResultFrameNumber = frameNumber + 1;
3503     }
3504 
3505     CaptureResult captureResult;
3506     captureResult.mResultExtras = resultExtras;
3507     captureResult.mMetadata = pendingMetadata;
3508     captureResult.mPhysicalMetadatas = physicalMetadatas;
3509 
3510     // Append any previous partials to form a complete result
3511     if (mUsePartialResult && !collectedPartialResult.isEmpty()) {
3512         captureResult.mMetadata.append(collectedPartialResult);
3513     }
3514 
3515     captureResult.mMetadata.sort();
3516 
3517     // Check that there's a timestamp in the result metadata
3518     camera_metadata_entry timestamp = captureResult.mMetadata.find(ANDROID_SENSOR_TIMESTAMP);
3519     if (timestamp.count == 0) {
3520         SET_ERR("No timestamp provided by HAL for frame %d!",
3521                 frameNumber);
3522         return;
3523     }
3524     nsecs_t sensorTimestamp = timestamp.data.i64[0];
3525 
3526     for (auto& physicalMetadata : captureResult.mPhysicalMetadatas) {
3527         camera_metadata_entry timestamp =
3528                 physicalMetadata.mPhysicalCameraMetadata.find(ANDROID_SENSOR_TIMESTAMP);
3529         if (timestamp.count == 0) {
3530             SET_ERR("No timestamp provided by HAL for physical camera %s frame %d!",
3531                     String8(physicalMetadata.mPhysicalCameraId).c_str(), frameNumber);
3532             return;
3533         }
3534     }
3535 
3536     // Fix up some result metadata to account for HAL-level distortion correction
3537     status_t res =
3538             mDistortionMappers[mId.c_str()].correctCaptureResult(&captureResult.mMetadata);
3539     if (res != OK) {
3540         SET_ERR("Unable to correct capture result metadata for frame %d: %s (%d)",
3541                 frameNumber, strerror(res), res);
3542         return;
3543     }
3544     for (auto& physicalMetadata : captureResult.mPhysicalMetadatas) {
3545         String8 cameraId8(physicalMetadata.mPhysicalCameraId);
3546         if (mDistortionMappers.find(cameraId8.c_str()) == mDistortionMappers.end()) {
3547             continue;
3548         }
3549         res = mDistortionMappers[cameraId8.c_str()].correctCaptureResult(
3550                 &physicalMetadata.mPhysicalCameraMetadata);
3551         if (res != OK) {
3552             SET_ERR("Unable to correct physical capture result metadata for frame %d: %s (%d)",
3553                     frameNumber, strerror(res), res);
3554             return;
3555         }
3556     }
3557 
3558     // Fix up result metadata for monochrome camera.
3559     res = fixupMonochromeTags(mDeviceInfo, captureResult.mMetadata);
3560     if (res != OK) {
3561         SET_ERR("Failed to override result metadata: %s (%d)", strerror(-res), res);
3562         return;
3563     }
3564     for (auto& physicalMetadata : captureResult.mPhysicalMetadatas) {
3565         String8 cameraId8(physicalMetadata.mPhysicalCameraId);
3566         res = fixupMonochromeTags(mPhysicalDeviceInfoMap.at(cameraId8.c_str()),
3567                 physicalMetadata.mPhysicalCameraMetadata);
3568         if (res != OK) {
3569             SET_ERR("Failed to override result metadata: %s (%d)", strerror(-res), res);
3570             return;
3571         }
3572     }
3573 
3574     std::unordered_map<std::string, CameraMetadata> monitoredPhysicalMetadata;
3575     for (auto& m : physicalMetadatas) {
3576         monitoredPhysicalMetadata.emplace(String8(m.mPhysicalCameraId).string(),
3577                 CameraMetadata(m.mPhysicalCameraMetadata));
3578     }
3579     mTagMonitor.monitorMetadata(TagMonitor::RESULT,
3580             frameNumber, sensorTimestamp, captureResult.mMetadata,
3581             monitoredPhysicalMetadata);
3582 
3583     insertResultLocked(&captureResult, frameNumber);
3584 }
3585 
3586 /**
3587  * Camera HAL device callback methods
3588  */
3589 
processCaptureResult(const camera3_capture_result * result)3590 void Camera3Device::processCaptureResult(const camera3_capture_result *result) {
3591     ATRACE_CALL();
3592 
3593     status_t res;
3594 
3595     uint32_t frameNumber = result->frame_number;
3596     if (result->result == NULL && result->num_output_buffers == 0 &&
3597             result->input_buffer == NULL) {
3598         SET_ERR("No result data provided by HAL for frame %d",
3599                 frameNumber);
3600         return;
3601     }
3602 
3603     if (!mUsePartialResult &&
3604             result->result != NULL &&
3605             result->partial_result != 1) {
3606         SET_ERR("Result is malformed for frame %d: partial_result %u must be 1"
3607                 " if partial result is not supported",
3608                 frameNumber, result->partial_result);
3609         return;
3610     }
3611 
3612     bool isPartialResult = false;
3613     CameraMetadata collectedPartialResult;
3614     bool hasInputBufferInRequest = false;
3615 
3616     // Get shutter timestamp and resultExtras from list of in-flight requests,
3617     // where it was added by the shutter notification for this frame. If the
3618     // shutter timestamp isn't received yet, append the output buffers to the
3619     // in-flight request and they will be returned when the shutter timestamp
3620     // arrives. Update the in-flight status and remove the in-flight entry if
3621     // all result data and shutter timestamp have been received.
3622     nsecs_t shutterTimestamp = 0;
3623 
3624     {
3625         Mutex::Autolock l(mInFlightLock);
3626         ssize_t idx = mInFlightMap.indexOfKey(frameNumber);
3627         if (idx == NAME_NOT_FOUND) {
3628             SET_ERR("Unknown frame number for capture result: %d",
3629                     frameNumber);
3630             return;
3631         }
3632         InFlightRequest &request = mInFlightMap.editValueAt(idx);
3633         ALOGVV("%s: got InFlightRequest requestId = %" PRId32
3634                 ", frameNumber = %" PRId64 ", burstId = %" PRId32
3635                 ", partialResultCount = %d, hasCallback = %d",
3636                 __FUNCTION__, request.resultExtras.requestId,
3637                 request.resultExtras.frameNumber, request.resultExtras.burstId,
3638                 result->partial_result, request.hasCallback);
3639         // Always update the partial count to the latest one if it's not 0
3640         // (buffers only). When framework aggregates adjacent partial results
3641         // into one, the latest partial count will be used.
3642         if (result->partial_result != 0)
3643             request.resultExtras.partialResultCount = result->partial_result;
3644 
3645         // Check if this result carries only partial metadata
3646         if (mUsePartialResult && result->result != NULL) {
3647             if (result->partial_result > mNumPartialResults || result->partial_result < 1) {
3648                 SET_ERR("Result is malformed for frame %d: partial_result %u must be  in"
3649                         " the range of [1, %d] when metadata is included in the result",
3650                         frameNumber, result->partial_result, mNumPartialResults);
3651                 return;
3652             }
3653             isPartialResult = (result->partial_result < mNumPartialResults);
3654             if (isPartialResult && result->num_physcam_metadata) {
3655                 SET_ERR("Result is malformed for frame %d: partial_result not allowed for"
3656                         " physical camera result", frameNumber);
3657                 return;
3658             }
3659             if (isPartialResult) {
3660                 request.collectedPartialResult.append(result->result);
3661             }
3662 
3663             if (isPartialResult && request.hasCallback) {
3664                 // Send partial capture result
3665                 sendPartialCaptureResult(result->result, request.resultExtras,
3666                         frameNumber);
3667             }
3668         }
3669 
3670         shutterTimestamp = request.shutterTimestamp;
3671         hasInputBufferInRequest = request.hasInputBuffer;
3672 
3673         // Did we get the (final) result metadata for this capture?
3674         if (result->result != NULL && !isPartialResult) {
3675             if (request.physicalCameraIds.size() != result->num_physcam_metadata) {
3676                 SET_ERR("Requested physical Camera Ids %d not equal to number of metadata %d",
3677                         request.physicalCameraIds.size(), result->num_physcam_metadata);
3678                 return;
3679             }
3680             if (request.haveResultMetadata) {
3681                 SET_ERR("Called multiple times with metadata for frame %d",
3682                         frameNumber);
3683                 return;
3684             }
3685             for (uint32_t i = 0; i < result->num_physcam_metadata; i++) {
3686                 String8 physicalId(result->physcam_ids[i]);
3687                 std::set<String8>::iterator cameraIdIter =
3688                         request.physicalCameraIds.find(physicalId);
3689                 if (cameraIdIter != request.physicalCameraIds.end()) {
3690                     request.physicalCameraIds.erase(cameraIdIter);
3691                 } else {
3692                     SET_ERR("Total result for frame %d has already returned for camera %s",
3693                             frameNumber, physicalId.c_str());
3694                     return;
3695                 }
3696             }
3697             if (mUsePartialResult &&
3698                     !request.collectedPartialResult.isEmpty()) {
3699                 collectedPartialResult.acquire(
3700                     request.collectedPartialResult);
3701             }
3702             request.haveResultMetadata = true;
3703         }
3704 
3705         uint32_t numBuffersReturned = result->num_output_buffers;
3706         if (result->input_buffer != NULL) {
3707             if (hasInputBufferInRequest) {
3708                 numBuffersReturned += 1;
3709             } else {
3710                 ALOGW("%s: Input buffer should be NULL if there is no input"
3711                         " buffer sent in the request",
3712                         __FUNCTION__);
3713             }
3714         }
3715         request.numBuffersLeft -= numBuffersReturned;
3716         if (request.numBuffersLeft < 0) {
3717             SET_ERR("Too many buffers returned for frame %d",
3718                     frameNumber);
3719             return;
3720         }
3721 
3722         camera_metadata_ro_entry_t entry;
3723         res = find_camera_metadata_ro_entry(result->result,
3724                 ANDROID_SENSOR_TIMESTAMP, &entry);
3725         if (res == OK && entry.count == 1) {
3726             request.sensorTimestamp = entry.data.i64[0];
3727         }
3728 
3729         // If shutter event isn't received yet, append the output buffers to
3730         // the in-flight request. Otherwise, return the output buffers to
3731         // streams.
3732         if (shutterTimestamp == 0) {
3733             request.pendingOutputBuffers.appendArray(result->output_buffers,
3734                 result->num_output_buffers);
3735         } else {
3736             bool timestampIncreasing = !(request.zslCapture || request.hasInputBuffer);
3737             returnOutputBuffers(result->output_buffers,
3738                 result->num_output_buffers, shutterTimestamp, timestampIncreasing,
3739                 request.outputSurfaces, request.resultExtras);
3740         }
3741 
3742         if (result->result != NULL && !isPartialResult) {
3743             for (uint32_t i = 0; i < result->num_physcam_metadata; i++) {
3744                 CameraMetadata physicalMetadata;
3745                 physicalMetadata.append(result->physcam_metadata[i]);
3746                 request.physicalMetadatas.push_back({String16(result->physcam_ids[i]),
3747                         physicalMetadata});
3748             }
3749             if (shutterTimestamp == 0) {
3750                 request.pendingMetadata = result->result;
3751                 request.collectedPartialResult = collectedPartialResult;
3752             } else if (request.hasCallback) {
3753                 CameraMetadata metadata;
3754                 metadata = result->result;
3755                 sendCaptureResult(metadata, request.resultExtras,
3756                     collectedPartialResult, frameNumber,
3757                     hasInputBufferInRequest, request.zslCapture && request.stillCapture,
3758                     request.physicalMetadatas);
3759             }
3760         }
3761 
3762         removeInFlightRequestIfReadyLocked(idx);
3763     } // scope for mInFlightLock
3764 
3765     if (result->input_buffer != NULL) {
3766         if (hasInputBufferInRequest) {
3767             Camera3Stream *stream =
3768                 Camera3Stream::cast(result->input_buffer->stream);
3769             res = stream->returnInputBuffer(*(result->input_buffer));
3770             // Note: stream may be deallocated at this point, if this buffer was the
3771             // last reference to it.
3772             if (res != OK) {
3773                 ALOGE("%s: RequestThread: Can't return input buffer for frame %d to"
3774                       "  its stream:%s (%d)",  __FUNCTION__,
3775                       frameNumber, strerror(-res), res);
3776             }
3777         } else {
3778             ALOGW("%s: Input buffer should be NULL if there is no input"
3779                     " buffer sent in the request, skipping input buffer return.",
3780                     __FUNCTION__);
3781         }
3782     }
3783 }
3784 
notify(const camera3_notify_msg * msg)3785 void Camera3Device::notify(const camera3_notify_msg *msg) {
3786     ATRACE_CALL();
3787     sp<NotificationListener> listener;
3788     {
3789         Mutex::Autolock l(mOutputLock);
3790         listener = mListener.promote();
3791     }
3792 
3793     if (msg == NULL) {
3794         SET_ERR("HAL sent NULL notify message!");
3795         return;
3796     }
3797 
3798     switch (msg->type) {
3799         case CAMERA3_MSG_ERROR: {
3800             notifyError(msg->message.error, listener);
3801             break;
3802         }
3803         case CAMERA3_MSG_SHUTTER: {
3804             notifyShutter(msg->message.shutter, listener);
3805             break;
3806         }
3807         default:
3808             SET_ERR("Unknown notify message from HAL: %d",
3809                     msg->type);
3810     }
3811 }
3812 
notifyError(const camera3_error_msg_t & msg,sp<NotificationListener> listener)3813 void Camera3Device::notifyError(const camera3_error_msg_t &msg,
3814         sp<NotificationListener> listener) {
3815     ATRACE_CALL();
3816     // Map camera HAL error codes to ICameraDeviceCallback error codes
3817     // Index into this with the HAL error code
3818     static const int32_t halErrorMap[CAMERA3_MSG_NUM_ERRORS] = {
3819         // 0 = Unused error code
3820         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR,
3821         // 1 = CAMERA3_MSG_ERROR_DEVICE
3822         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE,
3823         // 2 = CAMERA3_MSG_ERROR_REQUEST
3824         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
3825         // 3 = CAMERA3_MSG_ERROR_RESULT
3826         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT,
3827         // 4 = CAMERA3_MSG_ERROR_BUFFER
3828         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER
3829     };
3830 
3831     int32_t errorCode =
3832             ((msg.error_code >= 0) &&
3833                     (msg.error_code < CAMERA3_MSG_NUM_ERRORS)) ?
3834             halErrorMap[msg.error_code] :
3835             hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_INVALID_ERROR;
3836 
3837     int streamId = 0;
3838     String16 physicalCameraId;
3839     if (msg.error_stream != NULL) {
3840         Camera3Stream *stream =
3841                 Camera3Stream::cast(msg.error_stream);
3842         streamId = stream->getId();
3843         physicalCameraId = String16(stream->physicalCameraId());
3844     }
3845     ALOGV("Camera %s: %s: HAL error, frame %d, stream %d: %d",
3846             mId.string(), __FUNCTION__, msg.frame_number,
3847             streamId, msg.error_code);
3848 
3849     CaptureResultExtras resultExtras;
3850     switch (errorCode) {
3851         case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE:
3852             // SET_ERR calls notifyError
3853             SET_ERR("Camera HAL reported serious device error");
3854             break;
3855         case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST:
3856         case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT:
3857         case hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_BUFFER:
3858             {
3859                 Mutex::Autolock l(mInFlightLock);
3860                 ssize_t idx = mInFlightMap.indexOfKey(msg.frame_number);
3861                 if (idx >= 0) {
3862                     InFlightRequest &r = mInFlightMap.editValueAt(idx);
3863                     r.requestStatus = msg.error_code;
3864                     resultExtras = r.resultExtras;
3865                     bool logicalDeviceResultError = false;
3866                     if (hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_RESULT ==
3867                             errorCode) {
3868                         if (physicalCameraId.size() > 0) {
3869                             String8 cameraId(physicalCameraId);
3870                             if (r.physicalCameraIds.find(cameraId) == r.physicalCameraIds.end()) {
3871                                 ALOGE("%s: Reported result failure for physical camera device: %s "
3872                                         " which is not part of the respective request!",
3873                                         __FUNCTION__, cameraId.string());
3874                                 break;
3875                             }
3876                             resultExtras.errorPhysicalCameraId = physicalCameraId;
3877                         } else {
3878                             logicalDeviceResultError = true;
3879                         }
3880                     }
3881 
3882                     if (logicalDeviceResultError
3883                             ||  hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST ==
3884                             errorCode) {
3885                         r.skipResultMetadata = true;
3886                     }
3887                     if (logicalDeviceResultError) {
3888                         // In case of missing result check whether the buffers
3889                         // returned. If they returned, then remove inflight
3890                         // request.
3891                         // TODO: should we call this for ERROR_CAMERA_REQUEST as well?
3892                         //       otherwise we are depending on HAL to send the buffers back after
3893                         //       calling notifyError. Not sure if that's in the spec.
3894                         removeInFlightRequestIfReadyLocked(idx);
3895                     }
3896                 } else {
3897                     resultExtras.frameNumber = msg.frame_number;
3898                     ALOGE("Camera %s: %s: cannot find in-flight request on "
3899                             "frame %" PRId64 " error", mId.string(), __FUNCTION__,
3900                             resultExtras.frameNumber);
3901                 }
3902             }
3903             resultExtras.errorStreamId = streamId;
3904             if (listener != NULL) {
3905                 listener->notifyError(errorCode, resultExtras);
3906             } else {
3907                 ALOGE("Camera %s: %s: no listener available", mId.string(), __FUNCTION__);
3908             }
3909             break;
3910         default:
3911             // SET_ERR calls notifyError
3912             SET_ERR("Unknown error message from HAL: %d", msg.error_code);
3913             break;
3914     }
3915 }
3916 
notifyShutter(const camera3_shutter_msg_t & msg,sp<NotificationListener> listener)3917 void Camera3Device::notifyShutter(const camera3_shutter_msg_t &msg,
3918         sp<NotificationListener> listener) {
3919     ATRACE_CALL();
3920     ssize_t idx;
3921 
3922     // Set timestamp for the request in the in-flight tracking
3923     // and get the request ID to send upstream
3924     {
3925         Mutex::Autolock l(mInFlightLock);
3926         idx = mInFlightMap.indexOfKey(msg.frame_number);
3927         if (idx >= 0) {
3928             InFlightRequest &r = mInFlightMap.editValueAt(idx);
3929 
3930             // Verify ordering of shutter notifications
3931             {
3932                 Mutex::Autolock l(mOutputLock);
3933                 // TODO: need to track errors for tighter bounds on expected frame number.
3934                 if (r.hasInputBuffer) {
3935                     if (msg.frame_number < mNextReprocessShutterFrameNumber) {
3936                         SET_ERR("Reprocess shutter notification out-of-order. Expected "
3937                                 "notification for frame %d, got frame %d",
3938                                 mNextReprocessShutterFrameNumber, msg.frame_number);
3939                         return;
3940                     }
3941                     mNextReprocessShutterFrameNumber = msg.frame_number + 1;
3942                 } else if (r.zslCapture && r.stillCapture) {
3943                     if (msg.frame_number < mNextZslStillShutterFrameNumber) {
3944                         SET_ERR("ZSL still capture shutter notification out-of-order. Expected "
3945                                 "notification for frame %d, got frame %d",
3946                                 mNextZslStillShutterFrameNumber, msg.frame_number);
3947                         return;
3948                     }
3949                     mNextZslStillShutterFrameNumber = msg.frame_number + 1;
3950                 } else {
3951                     if (msg.frame_number < mNextShutterFrameNumber) {
3952                         SET_ERR("Shutter notification out-of-order. Expected "
3953                                 "notification for frame %d, got frame %d",
3954                                 mNextShutterFrameNumber, msg.frame_number);
3955                         return;
3956                     }
3957                     mNextShutterFrameNumber = msg.frame_number + 1;
3958                 }
3959             }
3960 
3961             r.shutterTimestamp = msg.timestamp;
3962             if (r.hasCallback) {
3963                 ALOGVV("Camera %s: %s: Shutter fired for frame %d (id %d) at %" PRId64,
3964                     mId.string(), __FUNCTION__,
3965                     msg.frame_number, r.resultExtras.requestId, msg.timestamp);
3966                 // Call listener, if any
3967                 if (listener != NULL) {
3968                     listener->notifyShutter(r.resultExtras, msg.timestamp);
3969                 }
3970                 // send pending result and buffers
3971                 sendCaptureResult(r.pendingMetadata, r.resultExtras,
3972                     r.collectedPartialResult, msg.frame_number,
3973                     r.hasInputBuffer, r.zslCapture && r.stillCapture,
3974                     r.physicalMetadatas);
3975             }
3976             bool timestampIncreasing = !(r.zslCapture || r.hasInputBuffer);
3977             returnOutputBuffers(r.pendingOutputBuffers.array(),
3978                     r.pendingOutputBuffers.size(), r.shutterTimestamp, timestampIncreasing,
3979                     r.outputSurfaces, r.resultExtras);
3980             r.pendingOutputBuffers.clear();
3981 
3982             removeInFlightRequestIfReadyLocked(idx);
3983         }
3984     }
3985     if (idx < 0) {
3986         SET_ERR("Shutter notification for non-existent frame number %d",
3987                 msg.frame_number);
3988     }
3989 }
3990 
getLatestRequestLocked()3991 CameraMetadata Camera3Device::getLatestRequestLocked() {
3992     ALOGV("%s", __FUNCTION__);
3993 
3994     CameraMetadata retVal;
3995 
3996     if (mRequestThread != NULL) {
3997         retVal = mRequestThread->getLatestRequest();
3998     }
3999 
4000     return retVal;
4001 }
4002 
4003 
monitorMetadata(TagMonitor::eventSource source,int64_t frameNumber,nsecs_t timestamp,const CameraMetadata & metadata,const std::unordered_map<std::string,CameraMetadata> & physicalMetadata)4004 void Camera3Device::monitorMetadata(TagMonitor::eventSource source,
4005         int64_t frameNumber, nsecs_t timestamp, const CameraMetadata& metadata,
4006         const std::unordered_map<std::string, CameraMetadata>& physicalMetadata) {
4007 
4008     mTagMonitor.monitorMetadata(source, frameNumber, timestamp, metadata,
4009             physicalMetadata);
4010 }
4011 
4012 /**
4013  * HalInterface inner class methods
4014  */
4015 
HalInterface(sp<ICameraDeviceSession> & session,std::shared_ptr<RequestMetadataQueue> queue,bool useHalBufManager)4016 Camera3Device::HalInterface::HalInterface(
4017             sp<ICameraDeviceSession> &session,
4018             std::shared_ptr<RequestMetadataQueue> queue,
4019             bool useHalBufManager) :
4020         mHidlSession(session),
4021         mRequestMetadataQueue(queue),
4022         mUseHalBufManager(useHalBufManager),
4023         mIsReconfigurationQuerySupported(true) {
4024     // Check with hardware service manager if we can downcast these interfaces
4025     // Somewhat expensive, so cache the results at startup
4026     auto castResult_3_5 = device::V3_5::ICameraDeviceSession::castFrom(mHidlSession);
4027     if (castResult_3_5.isOk()) {
4028         mHidlSession_3_5 = castResult_3_5;
4029     }
4030     auto castResult_3_4 = device::V3_4::ICameraDeviceSession::castFrom(mHidlSession);
4031     if (castResult_3_4.isOk()) {
4032         mHidlSession_3_4 = castResult_3_4;
4033     }
4034     auto castResult_3_3 = device::V3_3::ICameraDeviceSession::castFrom(mHidlSession);
4035     if (castResult_3_3.isOk()) {
4036         mHidlSession_3_3 = castResult_3_3;
4037     }
4038 }
4039 
HalInterface()4040 Camera3Device::HalInterface::HalInterface() : mUseHalBufManager(false) {}
4041 
HalInterface(const HalInterface & other)4042 Camera3Device::HalInterface::HalInterface(const HalInterface& other) :
4043         mHidlSession(other.mHidlSession),
4044         mRequestMetadataQueue(other.mRequestMetadataQueue),
4045         mUseHalBufManager(other.mUseHalBufManager) {}
4046 
valid()4047 bool Camera3Device::HalInterface::valid() {
4048     return (mHidlSession != nullptr);
4049 }
4050 
clear()4051 void Camera3Device::HalInterface::clear() {
4052     mHidlSession_3_5.clear();
4053     mHidlSession_3_4.clear();
4054     mHidlSession_3_3.clear();
4055     mHidlSession.clear();
4056 }
4057 
constructDefaultRequestSettings(camera3_request_template_t templateId,camera_metadata_t ** requestTemplate)4058 status_t Camera3Device::HalInterface::constructDefaultRequestSettings(
4059         camera3_request_template_t templateId,
4060         /*out*/ camera_metadata_t **requestTemplate) {
4061     ATRACE_NAME("CameraHal::constructDefaultRequestSettings");
4062     if (!valid()) return INVALID_OPERATION;
4063     status_t res = OK;
4064 
4065     common::V1_0::Status status;
4066 
4067     auto requestCallback = [&status, &requestTemplate]
4068             (common::V1_0::Status s, const device::V3_2::CameraMetadata& request) {
4069             status = s;
4070             if (status == common::V1_0::Status::OK) {
4071                 const camera_metadata *r =
4072                         reinterpret_cast<const camera_metadata_t*>(request.data());
4073                 size_t expectedSize = request.size();
4074                 int ret = validate_camera_metadata_structure(r, &expectedSize);
4075                 if (ret == OK || ret == CAMERA_METADATA_VALIDATION_SHIFTED) {
4076                     *requestTemplate = clone_camera_metadata(r);
4077                     if (*requestTemplate == nullptr) {
4078                         ALOGE("%s: Unable to clone camera metadata received from HAL",
4079                                 __FUNCTION__);
4080                         status = common::V1_0::Status::INTERNAL_ERROR;
4081                     }
4082                 } else {
4083                     ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
4084                     status = common::V1_0::Status::INTERNAL_ERROR;
4085                 }
4086             }
4087         };
4088     hardware::Return<void> err;
4089     RequestTemplate id;
4090     switch (templateId) {
4091         case CAMERA3_TEMPLATE_PREVIEW:
4092             id = RequestTemplate::PREVIEW;
4093             break;
4094         case CAMERA3_TEMPLATE_STILL_CAPTURE:
4095             id = RequestTemplate::STILL_CAPTURE;
4096             break;
4097         case CAMERA3_TEMPLATE_VIDEO_RECORD:
4098             id = RequestTemplate::VIDEO_RECORD;
4099             break;
4100         case CAMERA3_TEMPLATE_VIDEO_SNAPSHOT:
4101             id = RequestTemplate::VIDEO_SNAPSHOT;
4102             break;
4103         case CAMERA3_TEMPLATE_ZERO_SHUTTER_LAG:
4104             id = RequestTemplate::ZERO_SHUTTER_LAG;
4105             break;
4106         case CAMERA3_TEMPLATE_MANUAL:
4107             id = RequestTemplate::MANUAL;
4108             break;
4109         default:
4110             // Unknown template ID, or this HAL is too old to support it
4111             return BAD_VALUE;
4112     }
4113     err = mHidlSession->constructDefaultRequestSettings(id, requestCallback);
4114 
4115     if (!err.isOk()) {
4116         ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
4117         res = DEAD_OBJECT;
4118     } else {
4119         res = CameraProviderManager::mapToStatusT(status);
4120     }
4121 
4122     return res;
4123 }
4124 
isReconfigurationRequired(CameraMetadata & oldSessionParams,CameraMetadata & newSessionParams)4125 bool Camera3Device::HalInterface::isReconfigurationRequired(CameraMetadata& oldSessionParams,
4126         CameraMetadata& newSessionParams) {
4127     // We do reconfiguration by default;
4128     bool ret = true;
4129     if ((mHidlSession_3_5 != nullptr) && mIsReconfigurationQuerySupported) {
4130         android::hardware::hidl_vec<uint8_t> oldParams, newParams;
4131         camera_metadata_t* oldSessioMeta = const_cast<camera_metadata_t*>(
4132                 oldSessionParams.getAndLock());
4133         camera_metadata_t* newSessioMeta = const_cast<camera_metadata_t*>(
4134                 newSessionParams.getAndLock());
4135         oldParams.setToExternal(reinterpret_cast<uint8_t*>(oldSessioMeta),
4136                 get_camera_metadata_size(oldSessioMeta));
4137         newParams.setToExternal(reinterpret_cast<uint8_t*>(newSessioMeta),
4138                 get_camera_metadata_size(newSessioMeta));
4139         hardware::camera::common::V1_0::Status callStatus;
4140         bool required;
4141         auto hidlCb = [&callStatus, &required] (hardware::camera::common::V1_0::Status s,
4142                 bool requiredFlag) {
4143             callStatus = s;
4144             required = requiredFlag;
4145         };
4146         auto err = mHidlSession_3_5->isReconfigurationRequired(oldParams, newParams, hidlCb);
4147         oldSessionParams.unlock(oldSessioMeta);
4148         newSessionParams.unlock(newSessioMeta);
4149         if (err.isOk()) {
4150             switch (callStatus) {
4151                 case hardware::camera::common::V1_0::Status::OK:
4152                     ret = required;
4153                     break;
4154                 case hardware::camera::common::V1_0::Status::METHOD_NOT_SUPPORTED:
4155                     mIsReconfigurationQuerySupported = false;
4156                     ret = true;
4157                     break;
4158                 default:
4159                     ALOGV("%s: Reconfiguration query failed: %d", __FUNCTION__, callStatus);
4160                     ret = true;
4161             }
4162         } else {
4163             ALOGE("%s: Unexpected binder error: %s", __FUNCTION__, err.description().c_str());
4164             ret = true;
4165         }
4166     }
4167 
4168     return ret;
4169 }
4170 
configureStreams(const camera_metadata_t * sessionParams,camera3_stream_configuration * config,const std::vector<uint32_t> & bufferSizes)4171 status_t Camera3Device::HalInterface::configureStreams(const camera_metadata_t *sessionParams,
4172         camera3_stream_configuration *config, const std::vector<uint32_t>& bufferSizes) {
4173     ATRACE_NAME("CameraHal::configureStreams");
4174     if (!valid()) return INVALID_OPERATION;
4175     status_t res = OK;
4176 
4177     // Convert stream config to HIDL
4178     std::set<int> activeStreams;
4179     device::V3_2::StreamConfiguration requestedConfiguration3_2;
4180     device::V3_4::StreamConfiguration requestedConfiguration3_4;
4181     requestedConfiguration3_2.streams.resize(config->num_streams);
4182     requestedConfiguration3_4.streams.resize(config->num_streams);
4183     for (size_t i = 0; i < config->num_streams; i++) {
4184         device::V3_2::Stream &dst3_2 = requestedConfiguration3_2.streams[i];
4185         device::V3_4::Stream &dst3_4 = requestedConfiguration3_4.streams[i];
4186         camera3_stream_t *src = config->streams[i];
4187 
4188         Camera3Stream* cam3stream = Camera3Stream::cast(src);
4189         cam3stream->setBufferFreedListener(this);
4190         int streamId = cam3stream->getId();
4191         StreamType streamType;
4192         switch (src->stream_type) {
4193             case CAMERA3_STREAM_OUTPUT:
4194                 streamType = StreamType::OUTPUT;
4195                 break;
4196             case CAMERA3_STREAM_INPUT:
4197                 streamType = StreamType::INPUT;
4198                 break;
4199             default:
4200                 ALOGE("%s: Stream %d: Unsupported stream type %d",
4201                         __FUNCTION__, streamId, config->streams[i]->stream_type);
4202                 return BAD_VALUE;
4203         }
4204         dst3_2.id = streamId;
4205         dst3_2.streamType = streamType;
4206         dst3_2.width = src->width;
4207         dst3_2.height = src->height;
4208         dst3_2.usage = mapToConsumerUsage(cam3stream->getUsage());
4209         dst3_2.rotation = mapToStreamRotation((camera3_stream_rotation_t) src->rotation);
4210         // For HidlSession version 3.5 or newer, the format and dataSpace sent
4211         // to HAL are original, not the overriden ones.
4212         if (mHidlSession_3_5 != nullptr) {
4213             dst3_2.format = mapToPixelFormat(cam3stream->isFormatOverridden() ?
4214                     cam3stream->getOriginalFormat() : src->format);
4215             dst3_2.dataSpace = mapToHidlDataspace(cam3stream->isDataSpaceOverridden() ?
4216                     cam3stream->getOriginalDataSpace() : src->data_space);
4217         } else {
4218             dst3_2.format = mapToPixelFormat(src->format);
4219             dst3_2.dataSpace = mapToHidlDataspace(src->data_space);
4220         }
4221         dst3_4.v3_2 = dst3_2;
4222         dst3_4.bufferSize = bufferSizes[i];
4223         if (src->physical_camera_id != nullptr) {
4224             dst3_4.physicalCameraId = src->physical_camera_id;
4225         }
4226 
4227         activeStreams.insert(streamId);
4228         // Create Buffer ID map if necessary
4229         if (mBufferIdMaps.count(streamId) == 0) {
4230             mBufferIdMaps.emplace(streamId, BufferIdMap{});
4231         }
4232     }
4233     // remove BufferIdMap for deleted streams
4234     for(auto it = mBufferIdMaps.begin(); it != mBufferIdMaps.end();) {
4235         int streamId = it->first;
4236         bool active = activeStreams.count(streamId) > 0;
4237         if (!active) {
4238             it = mBufferIdMaps.erase(it);
4239         } else {
4240             ++it;
4241         }
4242     }
4243 
4244     StreamConfigurationMode operationMode;
4245     res = mapToStreamConfigurationMode(
4246             (camera3_stream_configuration_mode_t) config->operation_mode,
4247             /*out*/ &operationMode);
4248     if (res != OK) {
4249         return res;
4250     }
4251     requestedConfiguration3_2.operationMode = operationMode;
4252     requestedConfiguration3_4.operationMode = operationMode;
4253     requestedConfiguration3_4.sessionParams.setToExternal(
4254             reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(sessionParams)),
4255             get_camera_metadata_size(sessionParams));
4256 
4257     // Invoke configureStreams
4258     device::V3_3::HalStreamConfiguration finalConfiguration;
4259     device::V3_4::HalStreamConfiguration finalConfiguration3_4;
4260     common::V1_0::Status status;
4261 
4262     auto configStream34Cb = [&status, &finalConfiguration3_4]
4263             (common::V1_0::Status s, const device::V3_4::HalStreamConfiguration& halConfiguration) {
4264                 finalConfiguration3_4 = halConfiguration;
4265                 status = s;
4266             };
4267 
4268     auto postprocConfigStream34 = [&finalConfiguration, &finalConfiguration3_4]
4269             (hardware::Return<void>& err) -> status_t {
4270                 if (!err.isOk()) {
4271                     ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
4272                     return DEAD_OBJECT;
4273                 }
4274                 finalConfiguration.streams.resize(finalConfiguration3_4.streams.size());
4275                 for (size_t i = 0; i < finalConfiguration3_4.streams.size(); i++) {
4276                     finalConfiguration.streams[i] = finalConfiguration3_4.streams[i].v3_3;
4277                 }
4278                 return OK;
4279             };
4280 
4281     // See which version of HAL we have
4282     if (mHidlSession_3_5 != nullptr) {
4283         ALOGV("%s: v3.5 device found", __FUNCTION__);
4284         device::V3_5::StreamConfiguration requestedConfiguration3_5;
4285         requestedConfiguration3_5.v3_4 = requestedConfiguration3_4;
4286         requestedConfiguration3_5.streamConfigCounter = mNextStreamConfigCounter++;
4287         auto err = mHidlSession_3_5->configureStreams_3_5(
4288                 requestedConfiguration3_5, configStream34Cb);
4289         res = postprocConfigStream34(err);
4290         if (res != OK) {
4291             return res;
4292         }
4293     } else if (mHidlSession_3_4 != nullptr) {
4294         // We do; use v3.4 for the call
4295         ALOGV("%s: v3.4 device found", __FUNCTION__);
4296         auto err = mHidlSession_3_4->configureStreams_3_4(
4297                 requestedConfiguration3_4, configStream34Cb);
4298         res = postprocConfigStream34(err);
4299         if (res != OK) {
4300             return res;
4301         }
4302     } else if (mHidlSession_3_3 != nullptr) {
4303         // We do; use v3.3 for the call
4304         ALOGV("%s: v3.3 device found", __FUNCTION__);
4305         auto err = mHidlSession_3_3->configureStreams_3_3(requestedConfiguration3_2,
4306             [&status, &finalConfiguration]
4307             (common::V1_0::Status s, const device::V3_3::HalStreamConfiguration& halConfiguration) {
4308                 finalConfiguration = halConfiguration;
4309                 status = s;
4310             });
4311         if (!err.isOk()) {
4312             ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
4313             return DEAD_OBJECT;
4314         }
4315     } else {
4316         // We don't; use v3.2 call and construct a v3.3 HalStreamConfiguration
4317         ALOGV("%s: v3.2 device found", __FUNCTION__);
4318         HalStreamConfiguration finalConfiguration_3_2;
4319         auto err = mHidlSession->configureStreams(requestedConfiguration3_2,
4320                 [&status, &finalConfiguration_3_2]
4321                 (common::V1_0::Status s, const HalStreamConfiguration& halConfiguration) {
4322                     finalConfiguration_3_2 = halConfiguration;
4323                     status = s;
4324                 });
4325         if (!err.isOk()) {
4326             ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
4327             return DEAD_OBJECT;
4328         }
4329         finalConfiguration.streams.resize(finalConfiguration_3_2.streams.size());
4330         for (size_t i = 0; i < finalConfiguration_3_2.streams.size(); i++) {
4331             finalConfiguration.streams[i].v3_2 = finalConfiguration_3_2.streams[i];
4332             finalConfiguration.streams[i].overrideDataSpace =
4333                     requestedConfiguration3_2.streams[i].dataSpace;
4334         }
4335     }
4336 
4337     if (status != common::V1_0::Status::OK ) {
4338         return CameraProviderManager::mapToStatusT(status);
4339     }
4340 
4341     // And convert output stream configuration from HIDL
4342 
4343     for (size_t i = 0; i < config->num_streams; i++) {
4344         camera3_stream_t *dst = config->streams[i];
4345         int streamId = Camera3Stream::cast(dst)->getId();
4346 
4347         // Start scan at i, with the assumption that the stream order matches
4348         size_t realIdx = i;
4349         bool found = false;
4350         size_t halStreamCount = finalConfiguration.streams.size();
4351         for (size_t idx = 0; idx < halStreamCount; idx++) {
4352             if (finalConfiguration.streams[realIdx].v3_2.id == streamId) {
4353                 found = true;
4354                 break;
4355             }
4356             realIdx = (realIdx >= halStreamCount - 1) ? 0 : realIdx + 1;
4357         }
4358         if (!found) {
4359             ALOGE("%s: Stream %d not found in stream configuration response from HAL",
4360                     __FUNCTION__, streamId);
4361             return INVALID_OPERATION;
4362         }
4363         device::V3_3::HalStream &src = finalConfiguration.streams[realIdx];
4364 
4365         Camera3Stream* dstStream = Camera3Stream::cast(dst);
4366         int overrideFormat = mapToFrameworkFormat(src.v3_2.overrideFormat);
4367         android_dataspace overrideDataSpace = mapToFrameworkDataspace(src.overrideDataSpace);
4368 
4369         if (dstStream->getOriginalFormat() != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
4370             dstStream->setFormatOverride(false);
4371             dstStream->setDataSpaceOverride(false);
4372             if (dst->format != overrideFormat) {
4373                 ALOGE("%s: Stream %d: Format override not allowed for format 0x%x", __FUNCTION__,
4374                         streamId, dst->format);
4375             }
4376             if (dst->data_space != overrideDataSpace) {
4377                 ALOGE("%s: Stream %d: DataSpace override not allowed for format 0x%x", __FUNCTION__,
4378                         streamId, dst->format);
4379             }
4380         } else {
4381             bool needFormatOverride =
4382                     requestedConfiguration3_2.streams[i].format != src.v3_2.overrideFormat;
4383             bool needDataspaceOverride =
4384                     requestedConfiguration3_2.streams[i].dataSpace != src.overrideDataSpace;
4385             // Override allowed with IMPLEMENTATION_DEFINED
4386             dstStream->setFormatOverride(needFormatOverride);
4387             dstStream->setDataSpaceOverride(needDataspaceOverride);
4388             dst->format = overrideFormat;
4389             dst->data_space = overrideDataSpace;
4390         }
4391 
4392         if (dst->stream_type == CAMERA3_STREAM_INPUT) {
4393             if (src.v3_2.producerUsage != 0) {
4394                 ALOGE("%s: Stream %d: INPUT streams must have 0 for producer usage",
4395                         __FUNCTION__, streamId);
4396                 return INVALID_OPERATION;
4397             }
4398             dstStream->setUsage(
4399                     mapConsumerToFrameworkUsage(src.v3_2.consumerUsage));
4400         } else {
4401             // OUTPUT
4402             if (src.v3_2.consumerUsage != 0) {
4403                 ALOGE("%s: Stream %d: OUTPUT streams must have 0 for consumer usage",
4404                         __FUNCTION__, streamId);
4405                 return INVALID_OPERATION;
4406             }
4407             dstStream->setUsage(
4408                     mapProducerToFrameworkUsage(src.v3_2.producerUsage));
4409         }
4410         dst->max_buffers = src.v3_2.maxBuffers;
4411     }
4412 
4413     return res;
4414 }
4415 
wrapAsHidlRequest(camera3_capture_request_t * request,device::V3_2::CaptureRequest * captureRequest,std::vector<native_handle_t * > * handlesCreated,std::vector<std::pair<int32_t,int32_t>> * inflightBuffers)4416 status_t Camera3Device::HalInterface::wrapAsHidlRequest(camera3_capture_request_t* request,
4417         /*out*/device::V3_2::CaptureRequest* captureRequest,
4418         /*out*/std::vector<native_handle_t*>* handlesCreated,
4419         /*out*/std::vector<std::pair<int32_t, int32_t>>* inflightBuffers) {
4420     ATRACE_CALL();
4421     if (captureRequest == nullptr || handlesCreated == nullptr || inflightBuffers == nullptr) {
4422         ALOGE("%s: captureRequest (%p), handlesCreated (%p), and inflightBuffers(%p) "
4423                 "must not be null", __FUNCTION__, captureRequest, handlesCreated, inflightBuffers);
4424         return BAD_VALUE;
4425     }
4426 
4427     captureRequest->frameNumber = request->frame_number;
4428 
4429     captureRequest->fmqSettingsSize = 0;
4430 
4431     {
4432         std::lock_guard<std::mutex> lock(mInflightLock);
4433         if (request->input_buffer != nullptr) {
4434             int32_t streamId = Camera3Stream::cast(request->input_buffer->stream)->getId();
4435             buffer_handle_t buf = *(request->input_buffer->buffer);
4436             auto pair = getBufferId(buf, streamId);
4437             bool isNewBuffer = pair.first;
4438             uint64_t bufferId = pair.second;
4439             captureRequest->inputBuffer.streamId = streamId;
4440             captureRequest->inputBuffer.bufferId = bufferId;
4441             captureRequest->inputBuffer.buffer = (isNewBuffer) ? buf : nullptr;
4442             captureRequest->inputBuffer.status = BufferStatus::OK;
4443             native_handle_t *acquireFence = nullptr;
4444             if (request->input_buffer->acquire_fence != -1) {
4445                 acquireFence = native_handle_create(1,0);
4446                 acquireFence->data[0] = request->input_buffer->acquire_fence;
4447                 handlesCreated->push_back(acquireFence);
4448             }
4449             captureRequest->inputBuffer.acquireFence = acquireFence;
4450             captureRequest->inputBuffer.releaseFence = nullptr;
4451 
4452             pushInflightBufferLocked(captureRequest->frameNumber, streamId,
4453                     request->input_buffer->buffer);
4454             inflightBuffers->push_back(std::make_pair(captureRequest->frameNumber, streamId));
4455         } else {
4456             captureRequest->inputBuffer.streamId = -1;
4457             captureRequest->inputBuffer.bufferId = BUFFER_ID_NO_BUFFER;
4458         }
4459 
4460         captureRequest->outputBuffers.resize(request->num_output_buffers);
4461         for (size_t i = 0; i < request->num_output_buffers; i++) {
4462             const camera3_stream_buffer_t *src = request->output_buffers + i;
4463             StreamBuffer &dst = captureRequest->outputBuffers[i];
4464             int32_t streamId = Camera3Stream::cast(src->stream)->getId();
4465             if (src->buffer != nullptr) {
4466                 buffer_handle_t buf = *(src->buffer);
4467                 auto pair = getBufferId(buf, streamId);
4468                 bool isNewBuffer = pair.first;
4469                 dst.bufferId = pair.second;
4470                 dst.buffer = isNewBuffer ? buf : nullptr;
4471                 native_handle_t *acquireFence = nullptr;
4472                 if (src->acquire_fence != -1) {
4473                     acquireFence = native_handle_create(1,0);
4474                     acquireFence->data[0] = src->acquire_fence;
4475                     handlesCreated->push_back(acquireFence);
4476                 }
4477                 dst.acquireFence = acquireFence;
4478             } else if (mUseHalBufManager) {
4479                 // HAL buffer management path
4480                 dst.bufferId = BUFFER_ID_NO_BUFFER;
4481                 dst.buffer = nullptr;
4482                 dst.acquireFence = nullptr;
4483             } else {
4484                 ALOGE("%s: cannot send a null buffer in capture request!", __FUNCTION__);
4485                 return BAD_VALUE;
4486             }
4487             dst.streamId = streamId;
4488             dst.status = BufferStatus::OK;
4489             dst.releaseFence = nullptr;
4490 
4491             // Output buffers are empty when using HAL buffer manager
4492             if (!mUseHalBufManager) {
4493                 pushInflightBufferLocked(captureRequest->frameNumber, streamId, src->buffer);
4494                 inflightBuffers->push_back(std::make_pair(captureRequest->frameNumber, streamId));
4495             }
4496         }
4497     }
4498     return OK;
4499 }
4500 
cleanupNativeHandles(std::vector<native_handle_t * > * handles,bool closeFd)4501 void Camera3Device::HalInterface::cleanupNativeHandles(
4502         std::vector<native_handle_t*> *handles, bool closeFd) {
4503     if (handles == nullptr) {
4504         return;
4505     }
4506     if (closeFd) {
4507         for (auto& handle : *handles) {
4508             native_handle_close(handle);
4509         }
4510     }
4511     for (auto& handle : *handles) {
4512         native_handle_delete(handle);
4513     }
4514     handles->clear();
4515     return;
4516 }
4517 
processBatchCaptureRequests(std::vector<camera3_capture_request_t * > & requests,uint32_t * numRequestProcessed)4518 status_t Camera3Device::HalInterface::processBatchCaptureRequests(
4519         std::vector<camera3_capture_request_t*>& requests,/*out*/uint32_t* numRequestProcessed) {
4520     ATRACE_NAME("CameraHal::processBatchCaptureRequests");
4521     if (!valid()) return INVALID_OPERATION;
4522 
4523     sp<device::V3_4::ICameraDeviceSession> hidlSession_3_4;
4524     auto castResult_3_4 = device::V3_4::ICameraDeviceSession::castFrom(mHidlSession);
4525     if (castResult_3_4.isOk()) {
4526         hidlSession_3_4 = castResult_3_4;
4527     }
4528 
4529     hardware::hidl_vec<device::V3_2::CaptureRequest> captureRequests;
4530     hardware::hidl_vec<device::V3_4::CaptureRequest> captureRequests_3_4;
4531     size_t batchSize = requests.size();
4532     if (hidlSession_3_4 != nullptr) {
4533         captureRequests_3_4.resize(batchSize);
4534     } else {
4535         captureRequests.resize(batchSize);
4536     }
4537     std::vector<native_handle_t*> handlesCreated;
4538     std::vector<std::pair<int32_t, int32_t>> inflightBuffers;
4539 
4540     status_t res = OK;
4541     for (size_t i = 0; i < batchSize; i++) {
4542         if (hidlSession_3_4 != nullptr) {
4543             res = wrapAsHidlRequest(requests[i], /*out*/&captureRequests_3_4[i].v3_2,
4544                     /*out*/&handlesCreated, /*out*/&inflightBuffers);
4545         } else {
4546             res = wrapAsHidlRequest(requests[i], /*out*/&captureRequests[i],
4547                     /*out*/&handlesCreated, /*out*/&inflightBuffers);
4548         }
4549         if (res != OK) {
4550             popInflightBuffers(inflightBuffers);
4551             cleanupNativeHandles(&handlesCreated);
4552             return res;
4553         }
4554     }
4555 
4556     std::vector<device::V3_2::BufferCache> cachesToRemove;
4557     {
4558         std::lock_guard<std::mutex> lock(mBufferIdMapLock);
4559         for (auto& pair : mFreedBuffers) {
4560             // The stream might have been removed since onBufferFreed
4561             if (mBufferIdMaps.find(pair.first) != mBufferIdMaps.end()) {
4562                 cachesToRemove.push_back({pair.first, pair.second});
4563             }
4564         }
4565         mFreedBuffers.clear();
4566     }
4567 
4568     common::V1_0::Status status = common::V1_0::Status::INTERNAL_ERROR;
4569     *numRequestProcessed = 0;
4570 
4571     // Write metadata to FMQ.
4572     for (size_t i = 0; i < batchSize; i++) {
4573         camera3_capture_request_t* request = requests[i];
4574         device::V3_2::CaptureRequest* captureRequest;
4575         if (hidlSession_3_4 != nullptr) {
4576             captureRequest = &captureRequests_3_4[i].v3_2;
4577         } else {
4578             captureRequest = &captureRequests[i];
4579         }
4580 
4581         if (request->settings != nullptr) {
4582             size_t settingsSize = get_camera_metadata_size(request->settings);
4583             if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write(
4584                     reinterpret_cast<const uint8_t*>(request->settings), settingsSize)) {
4585                 captureRequest->settings.resize(0);
4586                 captureRequest->fmqSettingsSize = settingsSize;
4587             } else {
4588                 if (mRequestMetadataQueue != nullptr) {
4589                     ALOGW("%s: couldn't utilize fmq, fallback to hwbinder", __FUNCTION__);
4590                 }
4591                 captureRequest->settings.setToExternal(
4592                         reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(request->settings)),
4593                         get_camera_metadata_size(request->settings));
4594                 captureRequest->fmqSettingsSize = 0u;
4595             }
4596         } else {
4597             // A null request settings maps to a size-0 CameraMetadata
4598             captureRequest->settings.resize(0);
4599             captureRequest->fmqSettingsSize = 0u;
4600         }
4601 
4602         if (hidlSession_3_4 != nullptr) {
4603             captureRequests_3_4[i].physicalCameraSettings.resize(request->num_physcam_settings);
4604             for (size_t j = 0; j < request->num_physcam_settings; j++) {
4605                 if (request->physcam_settings != nullptr) {
4606                     size_t settingsSize = get_camera_metadata_size(request->physcam_settings[j]);
4607                     if (mRequestMetadataQueue != nullptr && mRequestMetadataQueue->write(
4608                                 reinterpret_cast<const uint8_t*>(request->physcam_settings[j]),
4609                                 settingsSize)) {
4610                         captureRequests_3_4[i].physicalCameraSettings[j].settings.resize(0);
4611                         captureRequests_3_4[i].physicalCameraSettings[j].fmqSettingsSize =
4612                             settingsSize;
4613                     } else {
4614                         if (mRequestMetadataQueue != nullptr) {
4615                             ALOGW("%s: couldn't utilize fmq, fallback to hwbinder", __FUNCTION__);
4616                         }
4617                         captureRequests_3_4[i].physicalCameraSettings[j].settings.setToExternal(
4618                                 reinterpret_cast<uint8_t*>(const_cast<camera_metadata_t*>(
4619                                         request->physcam_settings[j])),
4620                                 get_camera_metadata_size(request->physcam_settings[j]));
4621                         captureRequests_3_4[i].physicalCameraSettings[j].fmqSettingsSize = 0u;
4622                     }
4623                 } else {
4624                     captureRequests_3_4[i].physicalCameraSettings[j].fmqSettingsSize = 0u;
4625                     captureRequests_3_4[i].physicalCameraSettings[j].settings.resize(0);
4626                 }
4627                 captureRequests_3_4[i].physicalCameraSettings[j].physicalCameraId =
4628                     request->physcam_id[j];
4629             }
4630         }
4631     }
4632 
4633     hardware::details::return_status err;
4634     auto resultCallback =
4635         [&status, &numRequestProcessed] (auto s, uint32_t n) {
4636                 status = s;
4637                 *numRequestProcessed = n;
4638         };
4639     if (hidlSession_3_4 != nullptr) {
4640         err = hidlSession_3_4->processCaptureRequest_3_4(captureRequests_3_4, cachesToRemove,
4641                                                          resultCallback);
4642     } else {
4643         err = mHidlSession->processCaptureRequest(captureRequests, cachesToRemove,
4644                                                   resultCallback);
4645     }
4646     if (!err.isOk()) {
4647         ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
4648         status = common::V1_0::Status::CAMERA_DISCONNECTED;
4649     }
4650 
4651     if (status == common::V1_0::Status::OK && *numRequestProcessed != batchSize) {
4652         ALOGE("%s: processCaptureRequest returns OK but processed %d/%zu requests",
4653                 __FUNCTION__, *numRequestProcessed, batchSize);
4654         status = common::V1_0::Status::INTERNAL_ERROR;
4655     }
4656 
4657     res = CameraProviderManager::mapToStatusT(status);
4658     if (res == OK) {
4659         if (mHidlSession->isRemote()) {
4660             // Only close acquire fence FDs when the HIDL transaction succeeds (so the FDs have been
4661             // sent to camera HAL processes)
4662             cleanupNativeHandles(&handlesCreated, /*closeFd*/true);
4663         } else {
4664             // In passthrough mode the FDs are now owned by HAL
4665             cleanupNativeHandles(&handlesCreated);
4666         }
4667     } else {
4668         popInflightBuffers(inflightBuffers);
4669         cleanupNativeHandles(&handlesCreated);
4670     }
4671     return res;
4672 }
4673 
flush()4674 status_t Camera3Device::HalInterface::flush() {
4675     ATRACE_NAME("CameraHal::flush");
4676     if (!valid()) return INVALID_OPERATION;
4677     status_t res = OK;
4678 
4679     auto err = mHidlSession->flush();
4680     if (!err.isOk()) {
4681         ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
4682         res = DEAD_OBJECT;
4683     } else {
4684         res = CameraProviderManager::mapToStatusT(err);
4685     }
4686 
4687     return res;
4688 }
4689 
dump(int)4690 status_t Camera3Device::HalInterface::dump(int /*fd*/) {
4691     ATRACE_NAME("CameraHal::dump");
4692     if (!valid()) return INVALID_OPERATION;
4693 
4694     // Handled by CameraProviderManager::dump
4695 
4696     return OK;
4697 }
4698 
close()4699 status_t Camera3Device::HalInterface::close() {
4700     ATRACE_NAME("CameraHal::close()");
4701     if (!valid()) return INVALID_OPERATION;
4702     status_t res = OK;
4703 
4704     auto err = mHidlSession->close();
4705     // Interface will be dead shortly anyway, so don't log errors
4706     if (!err.isOk()) {
4707         res = DEAD_OBJECT;
4708     }
4709 
4710     return res;
4711 }
4712 
signalPipelineDrain(const std::vector<int> & streamIds)4713 void Camera3Device::HalInterface::signalPipelineDrain(const std::vector<int>& streamIds) {
4714     ATRACE_NAME("CameraHal::signalPipelineDrain");
4715     if (!valid() || mHidlSession_3_5 == nullptr) {
4716         ALOGE("%s called on invalid camera!", __FUNCTION__);
4717         return;
4718     }
4719 
4720     auto err = mHidlSession_3_5->signalStreamFlush(streamIds, mNextStreamConfigCounter - 1);
4721     if (!err.isOk()) {
4722         ALOGE("%s: Transaction error: %s", __FUNCTION__, err.description().c_str());
4723         return;
4724     }
4725 }
4726 
getInflightBufferKeys(std::vector<std::pair<int32_t,int32_t>> * out)4727 void Camera3Device::HalInterface::getInflightBufferKeys(
4728         std::vector<std::pair<int32_t, int32_t>>* out) {
4729     std::lock_guard<std::mutex> lock(mInflightLock);
4730     out->clear();
4731     out->reserve(mInflightBufferMap.size());
4732     for (auto& pair : mInflightBufferMap) {
4733         uint64_t key = pair.first;
4734         int32_t streamId = key & 0xFFFFFFFF;
4735         int32_t frameNumber = (key >> 32) & 0xFFFFFFFF;
4736         out->push_back(std::make_pair(frameNumber, streamId));
4737     }
4738     return;
4739 }
4740 
getInflightRequestBufferKeys(std::vector<uint64_t> * out)4741 void Camera3Device::HalInterface::getInflightRequestBufferKeys(
4742         std::vector<uint64_t>* out) {
4743     std::lock_guard<std::mutex> lock(mRequestedBuffersLock);
4744     out->clear();
4745     out->reserve(mRequestedBuffers.size());
4746     for (auto& pair : mRequestedBuffers) {
4747         out->push_back(pair.first);
4748     }
4749     return;
4750 }
4751 
pushInflightBufferLocked(int32_t frameNumber,int32_t streamId,buffer_handle_t * buffer)4752 status_t Camera3Device::HalInterface::pushInflightBufferLocked(
4753         int32_t frameNumber, int32_t streamId, buffer_handle_t *buffer) {
4754     uint64_t key = static_cast<uint64_t>(frameNumber) << 32 | static_cast<uint64_t>(streamId);
4755     mInflightBufferMap[key] = buffer;
4756     return OK;
4757 }
4758 
popInflightBuffer(int32_t frameNumber,int32_t streamId,buffer_handle_t ** buffer)4759 status_t Camera3Device::HalInterface::popInflightBuffer(
4760         int32_t frameNumber, int32_t streamId,
4761         /*out*/ buffer_handle_t **buffer) {
4762     std::lock_guard<std::mutex> lock(mInflightLock);
4763 
4764     uint64_t key = static_cast<uint64_t>(frameNumber) << 32 | static_cast<uint64_t>(streamId);
4765     auto it = mInflightBufferMap.find(key);
4766     if (it == mInflightBufferMap.end()) return NAME_NOT_FOUND;
4767     if (buffer != nullptr) {
4768         *buffer = it->second;
4769     }
4770     mInflightBufferMap.erase(it);
4771     return OK;
4772 }
4773 
popInflightBuffers(const std::vector<std::pair<int32_t,int32_t>> & buffers)4774 void Camera3Device::HalInterface::popInflightBuffers(
4775         const std::vector<std::pair<int32_t, int32_t>>& buffers) {
4776     for (const auto& pair : buffers) {
4777         int32_t frameNumber = pair.first;
4778         int32_t streamId = pair.second;
4779         popInflightBuffer(frameNumber, streamId, nullptr);
4780     }
4781 }
4782 
pushInflightRequestBuffer(uint64_t bufferId,buffer_handle_t * buf,int32_t streamId)4783 status_t Camera3Device::HalInterface::pushInflightRequestBuffer(
4784         uint64_t bufferId, buffer_handle_t* buf, int32_t streamId) {
4785     std::lock_guard<std::mutex> lock(mRequestedBuffersLock);
4786     auto pair = mRequestedBuffers.insert({bufferId, {streamId, buf}});
4787     if (!pair.second) {
4788         ALOGE("%s: bufId %" PRIu64 " is already inflight!",
4789                 __FUNCTION__, bufferId);
4790         return BAD_VALUE;
4791     }
4792     return OK;
4793 }
4794 
4795 // Find and pop a buffer_handle_t based on bufferId
popInflightRequestBuffer(uint64_t bufferId,buffer_handle_t ** buffer,int32_t * streamId)4796 status_t Camera3Device::HalInterface::popInflightRequestBuffer(
4797         uint64_t bufferId,
4798         /*out*/ buffer_handle_t** buffer,
4799         /*optional out*/ int32_t* streamId) {
4800     if (buffer == nullptr) {
4801         ALOGE("%s: buffer (%p) must not be null", __FUNCTION__, buffer);
4802         return BAD_VALUE;
4803     }
4804     std::lock_guard<std::mutex> lock(mRequestedBuffersLock);
4805     auto it = mRequestedBuffers.find(bufferId);
4806     if (it == mRequestedBuffers.end()) {
4807         ALOGE("%s: bufId %" PRIu64 " is not inflight!",
4808                 __FUNCTION__, bufferId);
4809         return BAD_VALUE;
4810     }
4811     *buffer = it->second.second;
4812     if (streamId != nullptr) {
4813         *streamId = it->second.first;
4814     }
4815     mRequestedBuffers.erase(it);
4816     return OK;
4817 }
4818 
getBufferId(const buffer_handle_t & buf,int streamId)4819 std::pair<bool, uint64_t> Camera3Device::HalInterface::getBufferId(
4820         const buffer_handle_t& buf, int streamId) {
4821     std::lock_guard<std::mutex> lock(mBufferIdMapLock);
4822 
4823     BufferIdMap& bIdMap = mBufferIdMaps.at(streamId);
4824     auto it = bIdMap.find(buf);
4825     if (it == bIdMap.end()) {
4826         bIdMap[buf] = mNextBufferId++;
4827         ALOGV("stream %d now have %zu buffer caches, buf %p",
4828                 streamId, bIdMap.size(), buf);
4829         return std::make_pair(true, mNextBufferId - 1);
4830     } else {
4831         return std::make_pair(false, it->second);
4832     }
4833 }
4834 
onBufferFreed(int streamId,const native_handle_t * handle)4835 void Camera3Device::HalInterface::onBufferFreed(
4836         int streamId, const native_handle_t* handle) {
4837     std::lock_guard<std::mutex> lock(mBufferIdMapLock);
4838     uint64_t bufferId = BUFFER_ID_NO_BUFFER;
4839     auto mapIt = mBufferIdMaps.find(streamId);
4840     if (mapIt == mBufferIdMaps.end()) {
4841         // streamId might be from a deleted stream here
4842         ALOGI("%s: stream %d has been removed",
4843                 __FUNCTION__, streamId);
4844         return;
4845     }
4846     BufferIdMap& bIdMap = mapIt->second;
4847     auto it = bIdMap.find(handle);
4848     if (it == bIdMap.end()) {
4849         ALOGW("%s: cannot find buffer %p in stream %d",
4850                 __FUNCTION__, handle, streamId);
4851         return;
4852     } else {
4853         bufferId = it->second;
4854         bIdMap.erase(it);
4855         ALOGV("%s: stream %d now have %zu buffer caches after removing buf %p",
4856                 __FUNCTION__, streamId, bIdMap.size(), handle);
4857     }
4858     mFreedBuffers.push_back(std::make_pair(streamId, bufferId));
4859 }
4860 
onStreamReConfigured(int streamId)4861 void Camera3Device::HalInterface::onStreamReConfigured(int streamId) {
4862     std::lock_guard<std::mutex> lock(mBufferIdMapLock);
4863     auto mapIt = mBufferIdMaps.find(streamId);
4864     if (mapIt == mBufferIdMaps.end()) {
4865         ALOGE("%s: streamId %d not found!", __FUNCTION__, streamId);
4866         return;
4867     }
4868 
4869     BufferIdMap& bIdMap = mapIt->second;
4870     for (const auto& it : bIdMap) {
4871         uint64_t bufferId = it.second;
4872         mFreedBuffers.push_back(std::make_pair(streamId, bufferId));
4873     }
4874     bIdMap.clear();
4875 }
4876 
4877 /**
4878  * RequestThread inner class methods
4879  */
4880 
RequestThread(wp<Camera3Device> parent,sp<StatusTracker> statusTracker,sp<HalInterface> interface,const Vector<int32_t> & sessionParamKeys,bool useHalBufManager)4881 Camera3Device::RequestThread::RequestThread(wp<Camera3Device> parent,
4882         sp<StatusTracker> statusTracker,
4883         sp<HalInterface> interface, const Vector<int32_t>& sessionParamKeys,
4884         bool useHalBufManager) :
4885         Thread(/*canCallJava*/false),
4886         mParent(parent),
4887         mStatusTracker(statusTracker),
4888         mInterface(interface),
4889         mListener(nullptr),
4890         mId(getId(parent)),
4891         mReconfigured(false),
4892         mDoPause(false),
4893         mPaused(true),
4894         mNotifyPipelineDrain(false),
4895         mFrameNumber(0),
4896         mLatestRequestId(NAME_NOT_FOUND),
4897         mCurrentAfTriggerId(0),
4898         mCurrentPreCaptureTriggerId(0),
4899         mRepeatingLastFrameNumber(
4900             hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES),
4901         mPrepareVideoStream(false),
4902         mConstrainedMode(false),
4903         mRequestLatency(kRequestLatencyBinSize),
4904         mSessionParamKeys(sessionParamKeys),
4905         mLatestSessionParams(sessionParamKeys.size()),
4906         mUseHalBufManager(useHalBufManager) {
4907     mStatusId = statusTracker->addComponent();
4908 }
4909 
~RequestThread()4910 Camera3Device::RequestThread::~RequestThread() {}
4911 
setNotificationListener(wp<NotificationListener> listener)4912 void Camera3Device::RequestThread::setNotificationListener(
4913         wp<NotificationListener> listener) {
4914     ATRACE_CALL();
4915     Mutex::Autolock l(mRequestLock);
4916     mListener = listener;
4917 }
4918 
configurationComplete(bool isConstrainedHighSpeed,const CameraMetadata & sessionParams)4919 void Camera3Device::RequestThread::configurationComplete(bool isConstrainedHighSpeed,
4920         const CameraMetadata& sessionParams) {
4921     ATRACE_CALL();
4922     Mutex::Autolock l(mRequestLock);
4923     mReconfigured = true;
4924     mLatestSessionParams = sessionParams;
4925     // Prepare video stream for high speed recording.
4926     mPrepareVideoStream = isConstrainedHighSpeed;
4927     mConstrainedMode = isConstrainedHighSpeed;
4928 }
4929 
queueRequestList(List<sp<CaptureRequest>> & requests,int64_t * lastFrameNumber)4930 status_t Camera3Device::RequestThread::queueRequestList(
4931         List<sp<CaptureRequest> > &requests,
4932         /*out*/
4933         int64_t *lastFrameNumber) {
4934     ATRACE_CALL();
4935     Mutex::Autolock l(mRequestLock);
4936     for (List<sp<CaptureRequest> >::iterator it = requests.begin(); it != requests.end();
4937             ++it) {
4938         mRequestQueue.push_back(*it);
4939     }
4940 
4941     if (lastFrameNumber != NULL) {
4942         *lastFrameNumber = mFrameNumber + mRequestQueue.size() - 1;
4943         ALOGV("%s: requestId %d, mFrameNumber %" PRId32 ", lastFrameNumber %" PRId64 ".",
4944               __FUNCTION__, (*(requests.begin()))->mResultExtras.requestId, mFrameNumber,
4945               *lastFrameNumber);
4946     }
4947 
4948     unpauseForNewRequests();
4949 
4950     return OK;
4951 }
4952 
4953 
queueTrigger(RequestTrigger trigger[],size_t count)4954 status_t Camera3Device::RequestThread::queueTrigger(
4955         RequestTrigger trigger[],
4956         size_t count) {
4957     ATRACE_CALL();
4958     Mutex::Autolock l(mTriggerMutex);
4959     status_t ret;
4960 
4961     for (size_t i = 0; i < count; ++i) {
4962         ret = queueTriggerLocked(trigger[i]);
4963 
4964         if (ret != OK) {
4965             return ret;
4966         }
4967     }
4968 
4969     return OK;
4970 }
4971 
getId(const wp<Camera3Device> & device)4972 const String8& Camera3Device::RequestThread::getId(const wp<Camera3Device> &device) {
4973     static String8 deadId("<DeadDevice>");
4974     sp<Camera3Device> d = device.promote();
4975     if (d != nullptr) return d->mId;
4976     return deadId;
4977 }
4978 
queueTriggerLocked(RequestTrigger trigger)4979 status_t Camera3Device::RequestThread::queueTriggerLocked(
4980         RequestTrigger trigger) {
4981 
4982     uint32_t tag = trigger.metadataTag;
4983     ssize_t index = mTriggerMap.indexOfKey(tag);
4984 
4985     switch (trigger.getTagType()) {
4986         case TYPE_BYTE:
4987         // fall-through
4988         case TYPE_INT32:
4989             break;
4990         default:
4991             ALOGE("%s: Type not supported: 0x%x", __FUNCTION__,
4992                     trigger.getTagType());
4993             return INVALID_OPERATION;
4994     }
4995 
4996     /**
4997      * Collect only the latest trigger, since we only have 1 field
4998      * in the request settings per trigger tag, and can't send more than 1
4999      * trigger per request.
5000      */
5001     if (index != NAME_NOT_FOUND) {
5002         mTriggerMap.editValueAt(index) = trigger;
5003     } else {
5004         mTriggerMap.add(tag, trigger);
5005     }
5006 
5007     return OK;
5008 }
5009 
setRepeatingRequests(const RequestList & requests,int64_t * lastFrameNumber)5010 status_t Camera3Device::RequestThread::setRepeatingRequests(
5011         const RequestList &requests,
5012         /*out*/
5013         int64_t *lastFrameNumber) {
5014     ATRACE_CALL();
5015     Mutex::Autolock l(mRequestLock);
5016     if (lastFrameNumber != NULL) {
5017         *lastFrameNumber = mRepeatingLastFrameNumber;
5018     }
5019     mRepeatingRequests.clear();
5020     mRepeatingRequests.insert(mRepeatingRequests.begin(),
5021             requests.begin(), requests.end());
5022 
5023     unpauseForNewRequests();
5024 
5025     mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES;
5026     return OK;
5027 }
5028 
isRepeatingRequestLocked(const sp<CaptureRequest> & requestIn)5029 bool Camera3Device::RequestThread::isRepeatingRequestLocked(const sp<CaptureRequest>& requestIn) {
5030     if (mRepeatingRequests.empty()) {
5031         return false;
5032     }
5033     int32_t requestId = requestIn->mResultExtras.requestId;
5034     const RequestList &repeatRequests = mRepeatingRequests;
5035     // All repeating requests are guaranteed to have same id so only check first quest
5036     const sp<CaptureRequest> firstRequest = *repeatRequests.begin();
5037     return (firstRequest->mResultExtras.requestId == requestId);
5038 }
5039 
clearRepeatingRequests(int64_t * lastFrameNumber)5040 status_t Camera3Device::RequestThread::clearRepeatingRequests(/*out*/int64_t *lastFrameNumber) {
5041     ATRACE_CALL();
5042     Mutex::Autolock l(mRequestLock);
5043     return clearRepeatingRequestsLocked(lastFrameNumber);
5044 
5045 }
5046 
clearRepeatingRequestsLocked(int64_t * lastFrameNumber)5047 status_t Camera3Device::RequestThread::clearRepeatingRequestsLocked(/*out*/int64_t *lastFrameNumber) {
5048     mRepeatingRequests.clear();
5049     if (lastFrameNumber != NULL) {
5050         *lastFrameNumber = mRepeatingLastFrameNumber;
5051     }
5052     mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES;
5053     return OK;
5054 }
5055 
clear(int64_t * lastFrameNumber)5056 status_t Camera3Device::RequestThread::clear(
5057         /*out*/int64_t *lastFrameNumber) {
5058     ATRACE_CALL();
5059     Mutex::Autolock l(mRequestLock);
5060     ALOGV("RequestThread::%s:", __FUNCTION__);
5061 
5062     mRepeatingRequests.clear();
5063 
5064     // Send errors for all requests pending in the request queue, including
5065     // pending repeating requests
5066     sp<NotificationListener> listener = mListener.promote();
5067     if (listener != NULL) {
5068         for (RequestList::iterator it = mRequestQueue.begin();
5069                  it != mRequestQueue.end(); ++it) {
5070             // Abort the input buffers for reprocess requests.
5071             if ((*it)->mInputStream != NULL) {
5072                 camera3_stream_buffer_t inputBuffer;
5073                 status_t res = (*it)->mInputStream->getInputBuffer(&inputBuffer,
5074                         /*respectHalLimit*/ false);
5075                 if (res != OK) {
5076                     ALOGW("%s: %d: couldn't get input buffer while clearing the request "
5077                             "list: %s (%d)", __FUNCTION__, __LINE__, strerror(-res), res);
5078                 } else {
5079                     res = (*it)->mInputStream->returnInputBuffer(inputBuffer);
5080                     if (res != OK) {
5081                         ALOGE("%s: %d: couldn't return input buffer while clearing the request "
5082                                 "list: %s (%d)", __FUNCTION__, __LINE__, strerror(-res), res);
5083                     }
5084                 }
5085             }
5086             // Set the frame number this request would have had, if it
5087             // had been submitted; this frame number will not be reused.
5088             // The requestId and burstId fields were set when the request was
5089             // submitted originally (in convertMetadataListToRequestListLocked)
5090             (*it)->mResultExtras.frameNumber = mFrameNumber++;
5091             listener->notifyError(hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
5092                     (*it)->mResultExtras);
5093         }
5094     }
5095     mRequestQueue.clear();
5096 
5097     Mutex::Autolock al(mTriggerMutex);
5098     mTriggerMap.clear();
5099     if (lastFrameNumber != NULL) {
5100         *lastFrameNumber = mRepeatingLastFrameNumber;
5101     }
5102     mRepeatingLastFrameNumber = hardware::camera2::ICameraDeviceUser::NO_IN_FLIGHT_REPEATING_FRAMES;
5103     return OK;
5104 }
5105 
flush()5106 status_t Camera3Device::RequestThread::flush() {
5107     ATRACE_CALL();
5108     Mutex::Autolock l(mFlushLock);
5109 
5110     return mInterface->flush();
5111 }
5112 
setPaused(bool paused)5113 void Camera3Device::RequestThread::setPaused(bool paused) {
5114     ATRACE_CALL();
5115     Mutex::Autolock l(mPauseLock);
5116     mDoPause = paused;
5117     mDoPauseSignal.signal();
5118 }
5119 
waitUntilRequestProcessed(int32_t requestId,nsecs_t timeout)5120 status_t Camera3Device::RequestThread::waitUntilRequestProcessed(
5121         int32_t requestId, nsecs_t timeout) {
5122     ATRACE_CALL();
5123     Mutex::Autolock l(mLatestRequestMutex);
5124     status_t res;
5125     while (mLatestRequestId != requestId) {
5126         nsecs_t startTime = systemTime();
5127 
5128         res = mLatestRequestSignal.waitRelative(mLatestRequestMutex, timeout);
5129         if (res != OK) return res;
5130 
5131         timeout -= (systemTime() - startTime);
5132     }
5133 
5134     return OK;
5135 }
5136 
requestExit()5137 void Camera3Device::RequestThread::requestExit() {
5138     // Call parent to set up shutdown
5139     Thread::requestExit();
5140     // The exit from any possible waits
5141     mDoPauseSignal.signal();
5142     mRequestSignal.signal();
5143 
5144     mRequestLatency.log("ProcessCaptureRequest latency histogram");
5145     mRequestLatency.reset();
5146 }
5147 
checkAndStopRepeatingRequest()5148 void Camera3Device::RequestThread::checkAndStopRepeatingRequest() {
5149     ATRACE_CALL();
5150     bool surfaceAbandoned = false;
5151     int64_t lastFrameNumber = 0;
5152     sp<NotificationListener> listener;
5153     {
5154         Mutex::Autolock l(mRequestLock);
5155         // Check all streams needed by repeating requests are still valid. Otherwise, stop
5156         // repeating requests.
5157         for (const auto& request : mRepeatingRequests) {
5158             for (const auto& s : request->mOutputStreams) {
5159                 if (s->isAbandoned()) {
5160                     surfaceAbandoned = true;
5161                     clearRepeatingRequestsLocked(&lastFrameNumber);
5162                     break;
5163                 }
5164             }
5165             if (surfaceAbandoned) {
5166                 break;
5167             }
5168         }
5169         listener = mListener.promote();
5170     }
5171 
5172     if (listener != NULL && surfaceAbandoned) {
5173         listener->notifyRepeatingRequestError(lastFrameNumber);
5174     }
5175 }
5176 
sendRequestsBatch()5177 bool Camera3Device::RequestThread::sendRequestsBatch() {
5178     ATRACE_CALL();
5179     status_t res;
5180     size_t batchSize = mNextRequests.size();
5181     std::vector<camera3_capture_request_t*> requests(batchSize);
5182     uint32_t numRequestProcessed = 0;
5183     for (size_t i = 0; i < batchSize; i++) {
5184         requests[i] = &mNextRequests.editItemAt(i).halRequest;
5185         ATRACE_ASYNC_BEGIN("frame capture", mNextRequests[i].halRequest.frame_number);
5186     }
5187 
5188     res = mInterface->processBatchCaptureRequests(requests, &numRequestProcessed);
5189 
5190     bool triggerRemoveFailed = false;
5191     NextRequest& triggerFailedRequest = mNextRequests.editItemAt(0);
5192     for (size_t i = 0; i < numRequestProcessed; i++) {
5193         NextRequest& nextRequest = mNextRequests.editItemAt(i);
5194         nextRequest.submitted = true;
5195 
5196         updateNextRequest(nextRequest);
5197 
5198         if (!triggerRemoveFailed) {
5199             // Remove any previously queued triggers (after unlock)
5200             status_t removeTriggerRes = removeTriggers(mPrevRequest);
5201             if (removeTriggerRes != OK) {
5202                 triggerRemoveFailed = true;
5203                 triggerFailedRequest = nextRequest;
5204             }
5205         }
5206     }
5207 
5208     if (triggerRemoveFailed) {
5209         SET_ERR("RequestThread: Unable to remove triggers "
5210               "(capture request %d, HAL device: %s (%d)",
5211               triggerFailedRequest.halRequest.frame_number, strerror(-res), res);
5212         cleanUpFailedRequests(/*sendRequestError*/ false);
5213         return false;
5214     }
5215 
5216     if (res != OK) {
5217         // Should only get a failure here for malformed requests or device-level
5218         // errors, so consider all errors fatal.  Bad metadata failures should
5219         // come through notify.
5220         SET_ERR("RequestThread: Unable to submit capture request %d to HAL device: %s (%d)",
5221                 mNextRequests[numRequestProcessed].halRequest.frame_number,
5222                 strerror(-res), res);
5223         cleanUpFailedRequests(/*sendRequestError*/ false);
5224         return false;
5225     }
5226     return true;
5227 }
5228 
calculateMaxExpectedDuration(const camera_metadata_t * request)5229 nsecs_t Camera3Device::RequestThread::calculateMaxExpectedDuration(const camera_metadata_t *request) {
5230     nsecs_t maxExpectedDuration = kDefaultExpectedDuration;
5231     camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
5232     find_camera_metadata_ro_entry(request,
5233             ANDROID_CONTROL_AE_MODE,
5234             &e);
5235     if (e.count == 0) return maxExpectedDuration;
5236 
5237     switch (e.data.u8[0]) {
5238         case ANDROID_CONTROL_AE_MODE_OFF:
5239             find_camera_metadata_ro_entry(request,
5240                     ANDROID_SENSOR_EXPOSURE_TIME,
5241                     &e);
5242             if (e.count > 0) {
5243                 maxExpectedDuration = e.data.i64[0];
5244             }
5245             find_camera_metadata_ro_entry(request,
5246                     ANDROID_SENSOR_FRAME_DURATION,
5247                     &e);
5248             if (e.count > 0) {
5249                 maxExpectedDuration = std::max(e.data.i64[0], maxExpectedDuration);
5250             }
5251             break;
5252         default:
5253             find_camera_metadata_ro_entry(request,
5254                     ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
5255                     &e);
5256             if (e.count > 1) {
5257                 maxExpectedDuration = 1e9 / e.data.u8[0];
5258             }
5259             break;
5260     }
5261 
5262     return maxExpectedDuration;
5263 }
5264 
skipHFRTargetFPSUpdate(int32_t tag,const camera_metadata_ro_entry_t & newEntry,const camera_metadata_entry_t & currentEntry)5265 bool Camera3Device::RequestThread::skipHFRTargetFPSUpdate(int32_t tag,
5266         const camera_metadata_ro_entry_t& newEntry, const camera_metadata_entry_t& currentEntry) {
5267     if (mConstrainedMode && (ANDROID_CONTROL_AE_TARGET_FPS_RANGE == tag) &&
5268             (newEntry.count == currentEntry.count) && (currentEntry.count == 2) &&
5269             (currentEntry.data.i32[1] == newEntry.data.i32[1])) {
5270         return true;
5271     }
5272 
5273     return false;
5274 }
5275 
updateNextRequest(NextRequest & nextRequest)5276 void Camera3Device::RequestThread::updateNextRequest(NextRequest& nextRequest) {
5277     // Update the latest request sent to HAL
5278     if (nextRequest.halRequest.settings != NULL) { // Don't update if they were unchanged
5279         Mutex::Autolock al(mLatestRequestMutex);
5280 
5281         camera_metadata_t* cloned = clone_camera_metadata(nextRequest.halRequest.settings);
5282         mLatestRequest.acquire(cloned);
5283 
5284         mLatestPhysicalRequest.clear();
5285         for (uint32_t i = 0; i < nextRequest.halRequest.num_physcam_settings; i++) {
5286             cloned = clone_camera_metadata(nextRequest.halRequest.physcam_settings[i]);
5287             mLatestPhysicalRequest.emplace(nextRequest.halRequest.physcam_id[i],
5288                     CameraMetadata(cloned));
5289         }
5290 
5291         sp<Camera3Device> parent = mParent.promote();
5292         if (parent != NULL) {
5293             parent->monitorMetadata(TagMonitor::REQUEST,
5294                     nextRequest.halRequest.frame_number,
5295                     0, mLatestRequest, mLatestPhysicalRequest);
5296         }
5297     }
5298 
5299     if (nextRequest.halRequest.settings != NULL) {
5300         nextRequest.captureRequest->mSettingsList.begin()->metadata.unlock(
5301                 nextRequest.halRequest.settings);
5302     }
5303 
5304     cleanupPhysicalSettings(nextRequest.captureRequest, &nextRequest.halRequest);
5305 }
5306 
updateSessionParameters(const CameraMetadata & settings)5307 bool Camera3Device::RequestThread::updateSessionParameters(const CameraMetadata& settings) {
5308     ATRACE_CALL();
5309     bool updatesDetected = false;
5310 
5311     CameraMetadata updatedParams(mLatestSessionParams);
5312     for (auto tag : mSessionParamKeys) {
5313         camera_metadata_ro_entry entry = settings.find(tag);
5314         camera_metadata_entry lastEntry = updatedParams.find(tag);
5315 
5316         if (entry.count > 0) {
5317             bool isDifferent = false;
5318             if (lastEntry.count > 0) {
5319                 // Have a last value, compare to see if changed
5320                 if (lastEntry.type == entry.type &&
5321                         lastEntry.count == entry.count) {
5322                     // Same type and count, compare values
5323                     size_t bytesPerValue = camera_metadata_type_size[lastEntry.type];
5324                     size_t entryBytes = bytesPerValue * lastEntry.count;
5325                     int cmp = memcmp(entry.data.u8, lastEntry.data.u8, entryBytes);
5326                     if (cmp != 0) {
5327                         isDifferent = true;
5328                     }
5329                 } else {
5330                     // Count or type has changed
5331                     isDifferent = true;
5332                 }
5333             } else {
5334                 // No last entry, so always consider to be different
5335                 isDifferent = true;
5336             }
5337 
5338             if (isDifferent) {
5339                 ALOGV("%s: Session parameter tag id %d changed", __FUNCTION__, tag);
5340                 if (!skipHFRTargetFPSUpdate(tag, entry, lastEntry)) {
5341                     updatesDetected = true;
5342                 }
5343                 updatedParams.update(entry);
5344             }
5345         } else if (lastEntry.count > 0) {
5346             // Value has been removed
5347             ALOGV("%s: Session parameter tag id %d removed", __FUNCTION__, tag);
5348             updatedParams.erase(tag);
5349             updatesDetected = true;
5350         }
5351     }
5352 
5353     bool reconfigureRequired;
5354     if (updatesDetected) {
5355         reconfigureRequired = mInterface->isReconfigurationRequired(mLatestSessionParams,
5356                 updatedParams);
5357         mLatestSessionParams = updatedParams;
5358     } else {
5359         reconfigureRequired = false;
5360     }
5361 
5362     return reconfigureRequired;
5363 }
5364 
threadLoop()5365 bool Camera3Device::RequestThread::threadLoop() {
5366     ATRACE_CALL();
5367     status_t res;
5368 
5369     // Handle paused state.
5370     if (waitIfPaused()) {
5371         return true;
5372     }
5373 
5374     // Wait for the next batch of requests.
5375     waitForNextRequestBatch();
5376     if (mNextRequests.size() == 0) {
5377         return true;
5378     }
5379 
5380     // Get the latest request ID, if any
5381     int latestRequestId;
5382     camera_metadata_entry_t requestIdEntry = mNextRequests[mNextRequests.size() - 1].
5383             captureRequest->mSettingsList.begin()->metadata.find(ANDROID_REQUEST_ID);
5384     if (requestIdEntry.count > 0) {
5385         latestRequestId = requestIdEntry.data.i32[0];
5386     } else {
5387         ALOGW("%s: Did not have android.request.id set in the request.", __FUNCTION__);
5388         latestRequestId = NAME_NOT_FOUND;
5389     }
5390 
5391     // 'mNextRequests' will at this point contain either a set of HFR batched requests
5392     //  or a single request from streaming or burst. In either case the first element
5393     //  should contain the latest camera settings that we need to check for any session
5394     //  parameter updates.
5395     if (updateSessionParameters(mNextRequests[0].captureRequest->mSettingsList.begin()->metadata)) {
5396         res = OK;
5397 
5398         //Input stream buffers are already acquired at this point so an input stream
5399         //will not be able to move to idle state unless we force it.
5400         if (mNextRequests[0].captureRequest->mInputStream != nullptr) {
5401             res = mNextRequests[0].captureRequest->mInputStream->forceToIdle();
5402             if (res != OK) {
5403                 ALOGE("%s: Failed to force idle input stream: %d", __FUNCTION__, res);
5404                 cleanUpFailedRequests(/*sendRequestError*/ false);
5405                 return false;
5406             }
5407         }
5408 
5409         if (res == OK) {
5410             sp<StatusTracker> statusTracker = mStatusTracker.promote();
5411             if (statusTracker != 0) {
5412                 sp<Camera3Device> parent = mParent.promote();
5413                 if (parent != nullptr) {
5414                     parent->pauseStateNotify(true);
5415                 }
5416 
5417                 statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
5418 
5419                 if (parent != nullptr) {
5420                     mReconfigured |= parent->reconfigureCamera(mLatestSessionParams);
5421                 }
5422 
5423                 statusTracker->markComponentActive(mStatusId);
5424                 setPaused(false);
5425             }
5426 
5427             if (mNextRequests[0].captureRequest->mInputStream != nullptr) {
5428                 mNextRequests[0].captureRequest->mInputStream->restoreConfiguredState();
5429                 if (res != OK) {
5430                     ALOGE("%s: Failed to restore configured input stream: %d", __FUNCTION__, res);
5431                     cleanUpFailedRequests(/*sendRequestError*/ false);
5432                     return false;
5433                 }
5434             }
5435         }
5436     }
5437 
5438     // Prepare a batch of HAL requests and output buffers.
5439     res = prepareHalRequests();
5440     if (res == TIMED_OUT) {
5441         // Not a fatal error if getting output buffers time out.
5442         cleanUpFailedRequests(/*sendRequestError*/ true);
5443         // Check if any stream is abandoned.
5444         checkAndStopRepeatingRequest();
5445         return true;
5446     } else if (res != OK) {
5447         cleanUpFailedRequests(/*sendRequestError*/ false);
5448         return false;
5449     }
5450 
5451     // Inform waitUntilRequestProcessed thread of a new request ID
5452     {
5453         Mutex::Autolock al(mLatestRequestMutex);
5454 
5455         mLatestRequestId = latestRequestId;
5456         mLatestRequestSignal.signal();
5457     }
5458 
5459     // Submit a batch of requests to HAL.
5460     // Use flush lock only when submitting multilple requests in a batch.
5461     // TODO: The problem with flush lock is flush() will be blocked by process_capture_request()
5462     // which may take a long time to finish so synchronizing flush() and
5463     // process_capture_request() defeats the purpose of cancelling requests ASAP with flush().
5464     // For now, only synchronize for high speed recording and we should figure something out for
5465     // removing the synchronization.
5466     bool useFlushLock = mNextRequests.size() > 1;
5467 
5468     if (useFlushLock) {
5469         mFlushLock.lock();
5470     }
5471 
5472     ALOGVV("%s: %d: submitting %zu requests in a batch.", __FUNCTION__, __LINE__,
5473             mNextRequests.size());
5474 
5475     sp<Camera3Device> parent = mParent.promote();
5476     if (parent != nullptr) {
5477         parent->mRequestBufferSM.onSubmittingRequest();
5478     }
5479 
5480     bool submitRequestSuccess = false;
5481     nsecs_t tRequestStart = systemTime(SYSTEM_TIME_MONOTONIC);
5482     submitRequestSuccess = sendRequestsBatch();
5483 
5484     nsecs_t tRequestEnd = systemTime(SYSTEM_TIME_MONOTONIC);
5485     mRequestLatency.add(tRequestStart, tRequestEnd);
5486 
5487     if (useFlushLock) {
5488         mFlushLock.unlock();
5489     }
5490 
5491     // Unset as current request
5492     {
5493         Mutex::Autolock l(mRequestLock);
5494         mNextRequests.clear();
5495     }
5496 
5497     return submitRequestSuccess;
5498 }
5499 
prepareHalRequests()5500 status_t Camera3Device::RequestThread::prepareHalRequests() {
5501     ATRACE_CALL();
5502 
5503     bool batchedRequest = mNextRequests[0].captureRequest->mBatchSize > 1;
5504     for (size_t i = 0; i < mNextRequests.size(); i++) {
5505         auto& nextRequest = mNextRequests.editItemAt(i);
5506         sp<CaptureRequest> captureRequest = nextRequest.captureRequest;
5507         camera3_capture_request_t* halRequest = &nextRequest.halRequest;
5508         Vector<camera3_stream_buffer_t>* outputBuffers = &nextRequest.outputBuffers;
5509 
5510         // Prepare a request to HAL
5511         halRequest->frame_number = captureRequest->mResultExtras.frameNumber;
5512 
5513         // Insert any queued triggers (before metadata is locked)
5514         status_t res = insertTriggers(captureRequest);
5515         if (res < 0) {
5516             SET_ERR("RequestThread: Unable to insert triggers "
5517                     "(capture request %d, HAL device: %s (%d)",
5518                     halRequest->frame_number, strerror(-res), res);
5519             return INVALID_OPERATION;
5520         }
5521 
5522         int triggerCount = res;
5523         bool triggersMixedIn = (triggerCount > 0 || mPrevTriggers > 0);
5524         mPrevTriggers = triggerCount;
5525 
5526         // If the request is the same as last, or we had triggers last time
5527         bool newRequest = (mPrevRequest != captureRequest || triggersMixedIn) &&
5528                 // Request settings are all the same within one batch, so only treat the first
5529                 // request in a batch as new
5530                 !(batchedRequest && i > 0);
5531         if (newRequest) {
5532             /**
5533              * HAL workaround:
5534              * Insert a dummy trigger ID if a trigger is set but no trigger ID is
5535              */
5536             res = addDummyTriggerIds(captureRequest);
5537             if (res != OK) {
5538                 SET_ERR("RequestThread: Unable to insert dummy trigger IDs "
5539                         "(capture request %d, HAL device: %s (%d)",
5540                         halRequest->frame_number, strerror(-res), res);
5541                 return INVALID_OPERATION;
5542             }
5543 
5544             {
5545                 // Correct metadata regions for distortion correction if enabled
5546                 sp<Camera3Device> parent = mParent.promote();
5547                 if (parent != nullptr) {
5548                     List<PhysicalCameraSettings>::iterator it;
5549                     for (it = captureRequest->mSettingsList.begin();
5550                             it != captureRequest->mSettingsList.end(); it++) {
5551                         if (parent->mDistortionMappers.find(it->cameraId) ==
5552                                 parent->mDistortionMappers.end()) {
5553                             continue;
5554                         }
5555                         res = parent->mDistortionMappers[it->cameraId].correctCaptureRequest(
5556                             &(it->metadata));
5557                         if (res != OK) {
5558                             SET_ERR("RequestThread: Unable to correct capture requests "
5559                                     "for lens distortion for request %d: %s (%d)",
5560                                     halRequest->frame_number, strerror(-res), res);
5561                             return INVALID_OPERATION;
5562                         }
5563                     }
5564                 }
5565             }
5566 
5567             /**
5568              * The request should be presorted so accesses in HAL
5569              *   are O(logn). Sidenote, sorting a sorted metadata is nop.
5570              */
5571             captureRequest->mSettingsList.begin()->metadata.sort();
5572             halRequest->settings = captureRequest->mSettingsList.begin()->metadata.getAndLock();
5573             mPrevRequest = captureRequest;
5574             ALOGVV("%s: Request settings are NEW", __FUNCTION__);
5575 
5576             IF_ALOGV() {
5577                 camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
5578                 find_camera_metadata_ro_entry(
5579                         halRequest->settings,
5580                         ANDROID_CONTROL_AF_TRIGGER,
5581                         &e
5582                 );
5583                 if (e.count > 0) {
5584                     ALOGV("%s: Request (frame num %d) had AF trigger 0x%x",
5585                           __FUNCTION__,
5586                           halRequest->frame_number,
5587                           e.data.u8[0]);
5588                 }
5589             }
5590         } else {
5591             // leave request.settings NULL to indicate 'reuse latest given'
5592             ALOGVV("%s: Request settings are REUSED",
5593                    __FUNCTION__);
5594         }
5595 
5596         if (captureRequest->mSettingsList.size() > 1) {
5597             halRequest->num_physcam_settings = captureRequest->mSettingsList.size() - 1;
5598             halRequest->physcam_id = new const char* [halRequest->num_physcam_settings];
5599             if (newRequest) {
5600                 halRequest->physcam_settings =
5601                     new const camera_metadata* [halRequest->num_physcam_settings];
5602             } else {
5603                 halRequest->physcam_settings = nullptr;
5604             }
5605             auto it = ++captureRequest->mSettingsList.begin();
5606             size_t i = 0;
5607             for (; it != captureRequest->mSettingsList.end(); it++, i++) {
5608                 halRequest->physcam_id[i] = it->cameraId.c_str();
5609                 if (newRequest) {
5610                     it->metadata.sort();
5611                     halRequest->physcam_settings[i] = it->metadata.getAndLock();
5612                 }
5613             }
5614         }
5615 
5616         uint32_t totalNumBuffers = 0;
5617 
5618         // Fill in buffers
5619         if (captureRequest->mInputStream != NULL) {
5620             halRequest->input_buffer = &captureRequest->mInputBuffer;
5621             totalNumBuffers += 1;
5622         } else {
5623             halRequest->input_buffer = NULL;
5624         }
5625 
5626         outputBuffers->insertAt(camera3_stream_buffer_t(), 0,
5627                 captureRequest->mOutputStreams.size());
5628         halRequest->output_buffers = outputBuffers->array();
5629         std::set<String8> requestedPhysicalCameras;
5630 
5631         sp<Camera3Device> parent = mParent.promote();
5632         if (parent == NULL) {
5633             // Should not happen, and nowhere to send errors to, so just log it
5634             CLOGE("RequestThread: Parent is gone");
5635             return INVALID_OPERATION;
5636         }
5637         nsecs_t waitDuration = kBaseGetBufferWait + parent->getExpectedInFlightDuration();
5638 
5639         SurfaceMap uniqueSurfaceIdMap;
5640         for (size_t j = 0; j < captureRequest->mOutputStreams.size(); j++) {
5641             sp<Camera3OutputStreamInterface> outputStream =
5642                     captureRequest->mOutputStreams.editItemAt(j);
5643             int streamId = outputStream->getId();
5644 
5645             // Prepare video buffers for high speed recording on the first video request.
5646             if (mPrepareVideoStream && outputStream->isVideoStream()) {
5647                 // Only try to prepare video stream on the first video request.
5648                 mPrepareVideoStream = false;
5649 
5650                 res = outputStream->startPrepare(Camera3StreamInterface::ALLOCATE_PIPELINE_MAX,
5651                         false /*blockRequest*/);
5652                 while (res == NOT_ENOUGH_DATA) {
5653                     res = outputStream->prepareNextBuffer();
5654                 }
5655                 if (res != OK) {
5656                     ALOGW("%s: Preparing video buffers for high speed failed: %s (%d)",
5657                         __FUNCTION__, strerror(-res), res);
5658                     outputStream->cancelPrepare();
5659                 }
5660             }
5661 
5662             std::vector<size_t> uniqueSurfaceIds;
5663             res = outputStream->getUniqueSurfaceIds(
5664                     captureRequest->mOutputSurfaces[streamId],
5665                     &uniqueSurfaceIds);
5666             // INVALID_OPERATION is normal output for streams not supporting surfaceIds
5667             if (res != OK && res != INVALID_OPERATION) {
5668                 ALOGE("%s: failed to query stream %d unique surface IDs",
5669                         __FUNCTION__, streamId);
5670                 return res;
5671             }
5672             if (res == OK) {
5673                 uniqueSurfaceIdMap.insert({streamId, std::move(uniqueSurfaceIds)});
5674             }
5675 
5676             if (mUseHalBufManager) {
5677                 if (outputStream->isAbandoned()) {
5678                     ALOGV("%s: stream %d is abandoned, skipping request", __FUNCTION__, streamId);
5679                     return TIMED_OUT;
5680                 }
5681                 // HAL will request buffer through requestStreamBuffer API
5682                 camera3_stream_buffer_t& buffer = outputBuffers->editItemAt(j);
5683                 buffer.stream = outputStream->asHalStream();
5684                 buffer.buffer = nullptr;
5685                 buffer.status = CAMERA3_BUFFER_STATUS_OK;
5686                 buffer.acquire_fence = -1;
5687                 buffer.release_fence = -1;
5688             } else {
5689                 res = outputStream->getBuffer(&outputBuffers->editItemAt(j),
5690                         waitDuration,
5691                         captureRequest->mOutputSurfaces[streamId]);
5692                 if (res != OK) {
5693                     // Can't get output buffer from gralloc queue - this could be due to
5694                     // abandoned queue or other consumer misbehavior, so not a fatal
5695                     // error
5696                     ALOGV("RequestThread: Can't get output buffer, skipping request:"
5697                             " %s (%d)", strerror(-res), res);
5698 
5699                     return TIMED_OUT;
5700                 }
5701             }
5702 
5703             {
5704                 sp<Camera3Device> parent = mParent.promote();
5705                 if (parent != nullptr) {
5706                     const String8& streamCameraId = outputStream->getPhysicalCameraId();
5707                     for (const auto& settings : captureRequest->mSettingsList) {
5708                         if ((streamCameraId.isEmpty() &&
5709                                 parent->getId() == settings.cameraId.c_str()) ||
5710                                 streamCameraId == settings.cameraId.c_str()) {
5711                             outputStream->fireBufferRequestForFrameNumber(
5712                                     captureRequest->mResultExtras.frameNumber,
5713                                     settings.metadata);
5714                         }
5715                     }
5716                 }
5717             }
5718 
5719             String8 physicalCameraId = outputStream->getPhysicalCameraId();
5720 
5721             if (!physicalCameraId.isEmpty()) {
5722                 // Physical stream isn't supported for input request.
5723                 if (halRequest->input_buffer) {
5724                     CLOGE("Physical stream is not supported for input request");
5725                     return INVALID_OPERATION;
5726                 }
5727                 requestedPhysicalCameras.insert(physicalCameraId);
5728             }
5729             halRequest->num_output_buffers++;
5730         }
5731         totalNumBuffers += halRequest->num_output_buffers;
5732 
5733         // Log request in the in-flight queue
5734         // If this request list is for constrained high speed recording (not
5735         // preview), and the current request is not the last one in the batch,
5736         // do not send callback to the app.
5737         bool hasCallback = true;
5738         if (batchedRequest && i != mNextRequests.size()-1) {
5739             hasCallback = false;
5740         }
5741         bool isStillCapture = false;
5742         bool isZslCapture = false;
5743         if (!mNextRequests[0].captureRequest->mSettingsList.begin()->metadata.isEmpty()) {
5744             camera_metadata_ro_entry_t e = camera_metadata_ro_entry_t();
5745             find_camera_metadata_ro_entry(halRequest->settings, ANDROID_CONTROL_CAPTURE_INTENT, &e);
5746             if ((e.count > 0) && (e.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE)) {
5747                 isStillCapture = true;
5748                 ATRACE_ASYNC_BEGIN("still capture", mNextRequests[i].halRequest.frame_number);
5749             }
5750 
5751             find_camera_metadata_ro_entry(halRequest->settings, ANDROID_CONTROL_ENABLE_ZSL, &e);
5752             if ((e.count > 0) && (e.data.u8[0] == ANDROID_CONTROL_ENABLE_ZSL_TRUE)) {
5753                 isZslCapture = true;
5754             }
5755         }
5756         res = parent->registerInFlight(halRequest->frame_number,
5757                 totalNumBuffers, captureRequest->mResultExtras,
5758                 /*hasInput*/halRequest->input_buffer != NULL,
5759                 hasCallback,
5760                 calculateMaxExpectedDuration(halRequest->settings),
5761                 requestedPhysicalCameras, isStillCapture, isZslCapture,
5762                 (mUseHalBufManager) ? uniqueSurfaceIdMap :
5763                                       SurfaceMap{});
5764         ALOGVV("%s: registered in flight requestId = %" PRId32 ", frameNumber = %" PRId64
5765                ", burstId = %" PRId32 ".",
5766                 __FUNCTION__,
5767                 captureRequest->mResultExtras.requestId, captureRequest->mResultExtras.frameNumber,
5768                 captureRequest->mResultExtras.burstId);
5769         if (res != OK) {
5770             SET_ERR("RequestThread: Unable to register new in-flight request:"
5771                     " %s (%d)", strerror(-res), res);
5772             return INVALID_OPERATION;
5773         }
5774     }
5775 
5776     return OK;
5777 }
5778 
getLatestRequest() const5779 CameraMetadata Camera3Device::RequestThread::getLatestRequest() const {
5780     ATRACE_CALL();
5781     Mutex::Autolock al(mLatestRequestMutex);
5782 
5783     ALOGV("RequestThread::%s", __FUNCTION__);
5784 
5785     return mLatestRequest;
5786 }
5787 
isStreamPending(sp<Camera3StreamInterface> & stream)5788 bool Camera3Device::RequestThread::isStreamPending(
5789         sp<Camera3StreamInterface>& stream) {
5790     ATRACE_CALL();
5791     Mutex::Autolock l(mRequestLock);
5792 
5793     for (const auto& nextRequest : mNextRequests) {
5794         if (!nextRequest.submitted) {
5795             for (const auto& s : nextRequest.captureRequest->mOutputStreams) {
5796                 if (stream == s) return true;
5797             }
5798             if (stream == nextRequest.captureRequest->mInputStream) return true;
5799         }
5800     }
5801 
5802     for (const auto& request : mRequestQueue) {
5803         for (const auto& s : request->mOutputStreams) {
5804             if (stream == s) return true;
5805         }
5806         if (stream == request->mInputStream) return true;
5807     }
5808 
5809     for (const auto& request : mRepeatingRequests) {
5810         for (const auto& s : request->mOutputStreams) {
5811             if (stream == s) return true;
5812         }
5813         if (stream == request->mInputStream) return true;
5814     }
5815 
5816     return false;
5817 }
5818 
isOutputSurfacePending(int streamId,size_t surfaceId)5819 bool Camera3Device::RequestThread::isOutputSurfacePending(int streamId, size_t surfaceId) {
5820     ATRACE_CALL();
5821     Mutex::Autolock l(mRequestLock);
5822 
5823     for (const auto& nextRequest : mNextRequests) {
5824         for (const auto& s : nextRequest.captureRequest->mOutputSurfaces) {
5825             if (s.first == streamId) {
5826                 const auto &it = std::find(s.second.begin(), s.second.end(), surfaceId);
5827                 if (it != s.second.end()) {
5828                     return true;
5829                 }
5830             }
5831         }
5832     }
5833 
5834     for (const auto& request : mRequestQueue) {
5835         for (const auto& s : request->mOutputSurfaces) {
5836             if (s.first == streamId) {
5837                 const auto &it = std::find(s.second.begin(), s.second.end(), surfaceId);
5838                 if (it != s.second.end()) {
5839                     return true;
5840                 }
5841             }
5842         }
5843     }
5844 
5845     for (const auto& request : mRepeatingRequests) {
5846         for (const auto& s : request->mOutputSurfaces) {
5847             if (s.first == streamId) {
5848                 const auto &it = std::find(s.second.begin(), s.second.end(), surfaceId);
5849                 if (it != s.second.end()) {
5850                     return true;
5851                 }
5852             }
5853         }
5854     }
5855 
5856     return false;
5857 }
5858 
signalPipelineDrain(const std::vector<int> & streamIds)5859 void Camera3Device::RequestThread::signalPipelineDrain(const std::vector<int>& streamIds) {
5860     if (!mUseHalBufManager) {
5861         ALOGE("%s called for camera device not supporting HAL buffer management", __FUNCTION__);
5862         return;
5863     }
5864 
5865     Mutex::Autolock pl(mPauseLock);
5866     if (mPaused) {
5867         mInterface->signalPipelineDrain(streamIds);
5868         return;
5869     }
5870     // If request thread is still busy, wait until paused then notify HAL
5871     mNotifyPipelineDrain = true;
5872     mStreamIdsToBeDrained = streamIds;
5873 }
5874 
getExpectedInFlightDuration()5875 nsecs_t Camera3Device::getExpectedInFlightDuration() {
5876     ATRACE_CALL();
5877     Mutex::Autolock al(mInFlightLock);
5878     return mExpectedInflightDuration > kMinInflightDuration ?
5879             mExpectedInflightDuration : kMinInflightDuration;
5880 }
5881 
cleanupPhysicalSettings(sp<CaptureRequest> request,camera3_capture_request_t * halRequest)5882 void Camera3Device::RequestThread::cleanupPhysicalSettings(sp<CaptureRequest> request,
5883         camera3_capture_request_t *halRequest) {
5884     if ((request == nullptr) || (halRequest == nullptr)) {
5885         ALOGE("%s: Invalid request!", __FUNCTION__);
5886         return;
5887     }
5888 
5889     if (halRequest->num_physcam_settings > 0) {
5890         if (halRequest->physcam_id != nullptr) {
5891             delete [] halRequest->physcam_id;
5892             halRequest->physcam_id = nullptr;
5893         }
5894         if (halRequest->physcam_settings != nullptr) {
5895             auto it = ++(request->mSettingsList.begin());
5896             size_t i = 0;
5897             for (; it != request->mSettingsList.end(); it++, i++) {
5898                 it->metadata.unlock(halRequest->physcam_settings[i]);
5899             }
5900             delete [] halRequest->physcam_settings;
5901             halRequest->physcam_settings = nullptr;
5902         }
5903     }
5904 }
5905 
cleanUpFailedRequests(bool sendRequestError)5906 void Camera3Device::RequestThread::cleanUpFailedRequests(bool sendRequestError) {
5907     if (mNextRequests.empty()) {
5908         return;
5909     }
5910 
5911     for (auto& nextRequest : mNextRequests) {
5912         // Skip the ones that have been submitted successfully.
5913         if (nextRequest.submitted) {
5914             continue;
5915         }
5916 
5917         sp<CaptureRequest> captureRequest = nextRequest.captureRequest;
5918         camera3_capture_request_t* halRequest = &nextRequest.halRequest;
5919         Vector<camera3_stream_buffer_t>* outputBuffers = &nextRequest.outputBuffers;
5920 
5921         if (halRequest->settings != NULL) {
5922             captureRequest->mSettingsList.begin()->metadata.unlock(halRequest->settings);
5923         }
5924 
5925         cleanupPhysicalSettings(captureRequest, halRequest);
5926 
5927         if (captureRequest->mInputStream != NULL) {
5928             captureRequest->mInputBuffer.status = CAMERA3_BUFFER_STATUS_ERROR;
5929             captureRequest->mInputStream->returnInputBuffer(captureRequest->mInputBuffer);
5930         }
5931 
5932         // No output buffer can be returned when using HAL buffer manager
5933         if (!mUseHalBufManager) {
5934             for (size_t i = 0; i < halRequest->num_output_buffers; i++) {
5935                 //Buffers that failed processing could still have
5936                 //valid acquire fence.
5937                 int acquireFence = (*outputBuffers)[i].acquire_fence;
5938                 if (0 <= acquireFence) {
5939                     close(acquireFence);
5940                     outputBuffers->editItemAt(i).acquire_fence = -1;
5941                 }
5942                 outputBuffers->editItemAt(i).status = CAMERA3_BUFFER_STATUS_ERROR;
5943                 captureRequest->mOutputStreams.editItemAt(i)->returnBuffer((*outputBuffers)[i], 0,
5944                         /*timestampIncreasing*/true, std::vector<size_t> (),
5945                         captureRequest->mResultExtras.frameNumber);
5946             }
5947         }
5948 
5949         if (sendRequestError) {
5950             Mutex::Autolock l(mRequestLock);
5951             sp<NotificationListener> listener = mListener.promote();
5952             if (listener != NULL) {
5953                 listener->notifyError(
5954                         hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
5955                         captureRequest->mResultExtras);
5956             }
5957         }
5958 
5959         // Remove yet-to-be submitted inflight request from inflightMap
5960         {
5961           sp<Camera3Device> parent = mParent.promote();
5962           if (parent != NULL) {
5963               Mutex::Autolock l(parent->mInFlightLock);
5964               ssize_t idx = parent->mInFlightMap.indexOfKey(captureRequest->mResultExtras.frameNumber);
5965               if (idx >= 0) {
5966                   ALOGV("%s: Remove inflight request from queue: frameNumber %" PRId64,
5967                         __FUNCTION__, captureRequest->mResultExtras.frameNumber);
5968                   parent->removeInFlightMapEntryLocked(idx);
5969               }
5970           }
5971         }
5972     }
5973 
5974     Mutex::Autolock l(mRequestLock);
5975     mNextRequests.clear();
5976 }
5977 
waitForNextRequestBatch()5978 void Camera3Device::RequestThread::waitForNextRequestBatch() {
5979     ATRACE_CALL();
5980     // Optimized a bit for the simple steady-state case (single repeating
5981     // request), to avoid putting that request in the queue temporarily.
5982     Mutex::Autolock l(mRequestLock);
5983 
5984     assert(mNextRequests.empty());
5985 
5986     NextRequest nextRequest;
5987     nextRequest.captureRequest = waitForNextRequestLocked();
5988     if (nextRequest.captureRequest == nullptr) {
5989         return;
5990     }
5991 
5992     nextRequest.halRequest = camera3_capture_request_t();
5993     nextRequest.submitted = false;
5994     mNextRequests.add(nextRequest);
5995 
5996     // Wait for additional requests
5997     const size_t batchSize = nextRequest.captureRequest->mBatchSize;
5998 
5999     for (size_t i = 1; i < batchSize; i++) {
6000         NextRequest additionalRequest;
6001         additionalRequest.captureRequest = waitForNextRequestLocked();
6002         if (additionalRequest.captureRequest == nullptr) {
6003             break;
6004         }
6005 
6006         additionalRequest.halRequest = camera3_capture_request_t();
6007         additionalRequest.submitted = false;
6008         mNextRequests.add(additionalRequest);
6009     }
6010 
6011     if (mNextRequests.size() < batchSize) {
6012         ALOGE("RequestThread: only get %zu out of %zu requests. Skipping requests.",
6013                 mNextRequests.size(), batchSize);
6014         cleanUpFailedRequests(/*sendRequestError*/true);
6015     }
6016 
6017     return;
6018 }
6019 
6020 sp<Camera3Device::CaptureRequest>
waitForNextRequestLocked()6021         Camera3Device::RequestThread::waitForNextRequestLocked() {
6022     status_t res;
6023     sp<CaptureRequest> nextRequest;
6024 
6025     while (mRequestQueue.empty()) {
6026         if (!mRepeatingRequests.empty()) {
6027             // Always atomically enqueue all requests in a repeating request
6028             // list. Guarantees a complete in-sequence set of captures to
6029             // application.
6030             const RequestList &requests = mRepeatingRequests;
6031             RequestList::const_iterator firstRequest =
6032                     requests.begin();
6033             nextRequest = *firstRequest;
6034             mRequestQueue.insert(mRequestQueue.end(),
6035                     ++firstRequest,
6036                     requests.end());
6037             // No need to wait any longer
6038 
6039             mRepeatingLastFrameNumber = mFrameNumber + requests.size() - 1;
6040 
6041             break;
6042         }
6043 
6044         res = mRequestSignal.waitRelative(mRequestLock, kRequestTimeout);
6045 
6046         if ((mRequestQueue.empty() && mRepeatingRequests.empty()) ||
6047                 exitPending()) {
6048             Mutex::Autolock pl(mPauseLock);
6049             if (mPaused == false) {
6050                 ALOGV("%s: RequestThread: Going idle", __FUNCTION__);
6051                 mPaused = true;
6052                 if (mNotifyPipelineDrain) {
6053                     mInterface->signalPipelineDrain(mStreamIdsToBeDrained);
6054                     mNotifyPipelineDrain = false;
6055                     mStreamIdsToBeDrained.clear();
6056                 }
6057                 // Let the tracker know
6058                 sp<StatusTracker> statusTracker = mStatusTracker.promote();
6059                 if (statusTracker != 0) {
6060                     statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
6061                 }
6062                 sp<Camera3Device> parent = mParent.promote();
6063                 if (parent != nullptr) {
6064                     parent->mRequestBufferSM.onRequestThreadPaused();
6065                 }
6066             }
6067             // Stop waiting for now and let thread management happen
6068             return NULL;
6069         }
6070     }
6071 
6072     if (nextRequest == NULL) {
6073         // Don't have a repeating request already in hand, so queue
6074         // must have an entry now.
6075         RequestList::iterator firstRequest =
6076                 mRequestQueue.begin();
6077         nextRequest = *firstRequest;
6078         mRequestQueue.erase(firstRequest);
6079         if (mRequestQueue.empty() && !nextRequest->mRepeating) {
6080             sp<NotificationListener> listener = mListener.promote();
6081             if (listener != NULL) {
6082                 listener->notifyRequestQueueEmpty();
6083             }
6084         }
6085     }
6086 
6087     // In case we've been unpaused by setPaused clearing mDoPause, need to
6088     // update internal pause state (capture/setRepeatingRequest unpause
6089     // directly).
6090     Mutex::Autolock pl(mPauseLock);
6091     if (mPaused) {
6092         ALOGV("%s: RequestThread: Unpaused", __FUNCTION__);
6093         sp<StatusTracker> statusTracker = mStatusTracker.promote();
6094         if (statusTracker != 0) {
6095             statusTracker->markComponentActive(mStatusId);
6096         }
6097     }
6098     mPaused = false;
6099 
6100     // Check if we've reconfigured since last time, and reset the preview
6101     // request if so. Can't use 'NULL request == repeat' across configure calls.
6102     if (mReconfigured) {
6103         mPrevRequest.clear();
6104         mReconfigured = false;
6105     }
6106 
6107     if (nextRequest != NULL) {
6108         nextRequest->mResultExtras.frameNumber = mFrameNumber++;
6109         nextRequest->mResultExtras.afTriggerId = mCurrentAfTriggerId;
6110         nextRequest->mResultExtras.precaptureTriggerId = mCurrentPreCaptureTriggerId;
6111 
6112         // Since RequestThread::clear() removes buffers from the input stream,
6113         // get the right buffer here before unlocking mRequestLock
6114         if (nextRequest->mInputStream != NULL) {
6115             res = nextRequest->mInputStream->getInputBuffer(&nextRequest->mInputBuffer);
6116             if (res != OK) {
6117                 // Can't get input buffer from gralloc queue - this could be due to
6118                 // disconnected queue or other producer misbehavior, so not a fatal
6119                 // error
6120                 ALOGE("%s: Can't get input buffer, skipping request:"
6121                         " %s (%d)", __FUNCTION__, strerror(-res), res);
6122 
6123                 sp<NotificationListener> listener = mListener.promote();
6124                 if (listener != NULL) {
6125                     listener->notifyError(
6126                             hardware::camera2::ICameraDeviceCallbacks::ERROR_CAMERA_REQUEST,
6127                             nextRequest->mResultExtras);
6128                 }
6129                 return NULL;
6130             }
6131         }
6132     }
6133 
6134     return nextRequest;
6135 }
6136 
waitIfPaused()6137 bool Camera3Device::RequestThread::waitIfPaused() {
6138     ATRACE_CALL();
6139     status_t res;
6140     Mutex::Autolock l(mPauseLock);
6141     while (mDoPause) {
6142         if (mPaused == false) {
6143             mPaused = true;
6144             ALOGV("%s: RequestThread: Paused", __FUNCTION__);
6145             if (mNotifyPipelineDrain) {
6146                 mInterface->signalPipelineDrain(mStreamIdsToBeDrained);
6147                 mNotifyPipelineDrain = false;
6148                 mStreamIdsToBeDrained.clear();
6149             }
6150             // Let the tracker know
6151             sp<StatusTracker> statusTracker = mStatusTracker.promote();
6152             if (statusTracker != 0) {
6153                 statusTracker->markComponentIdle(mStatusId, Fence::NO_FENCE);
6154             }
6155             sp<Camera3Device> parent = mParent.promote();
6156             if (parent != nullptr) {
6157                 parent->mRequestBufferSM.onRequestThreadPaused();
6158             }
6159         }
6160 
6161         res = mDoPauseSignal.waitRelative(mPauseLock, kRequestTimeout);
6162         if (res == TIMED_OUT || exitPending()) {
6163             return true;
6164         }
6165     }
6166     // We don't set mPaused to false here, because waitForNextRequest needs
6167     // to further manage the paused state in case of starvation.
6168     return false;
6169 }
6170 
unpauseForNewRequests()6171 void Camera3Device::RequestThread::unpauseForNewRequests() {
6172     ATRACE_CALL();
6173     // With work to do, mark thread as unpaused.
6174     // If paused by request (setPaused), don't resume, to avoid
6175     // extra signaling/waiting overhead to waitUntilPaused
6176     mRequestSignal.signal();
6177     Mutex::Autolock p(mPauseLock);
6178     if (!mDoPause) {
6179         ALOGV("%s: RequestThread: Going active", __FUNCTION__);
6180         if (mPaused) {
6181             sp<StatusTracker> statusTracker = mStatusTracker.promote();
6182             if (statusTracker != 0) {
6183                 statusTracker->markComponentActive(mStatusId);
6184             }
6185         }
6186         mPaused = false;
6187     }
6188 }
6189 
setErrorState(const char * fmt,...)6190 void Camera3Device::RequestThread::setErrorState(const char *fmt, ...) {
6191     sp<Camera3Device> parent = mParent.promote();
6192     if (parent != NULL) {
6193         va_list args;
6194         va_start(args, fmt);
6195 
6196         parent->setErrorStateV(fmt, args);
6197 
6198         va_end(args);
6199     }
6200 }
6201 
insertTriggers(const sp<CaptureRequest> & request)6202 status_t Camera3Device::RequestThread::insertTriggers(
6203         const sp<CaptureRequest> &request) {
6204     ATRACE_CALL();
6205     Mutex::Autolock al(mTriggerMutex);
6206 
6207     sp<Camera3Device> parent = mParent.promote();
6208     if (parent == NULL) {
6209         CLOGE("RequestThread: Parent is gone");
6210         return DEAD_OBJECT;
6211     }
6212 
6213     CameraMetadata &metadata = request->mSettingsList.begin()->metadata;
6214     size_t count = mTriggerMap.size();
6215 
6216     for (size_t i = 0; i < count; ++i) {
6217         RequestTrigger trigger = mTriggerMap.valueAt(i);
6218         uint32_t tag = trigger.metadataTag;
6219 
6220         if (tag == ANDROID_CONTROL_AF_TRIGGER_ID || tag == ANDROID_CONTROL_AE_PRECAPTURE_ID) {
6221             bool isAeTrigger = (trigger.metadataTag == ANDROID_CONTROL_AE_PRECAPTURE_ID);
6222             uint32_t triggerId = static_cast<uint32_t>(trigger.entryValue);
6223             if (isAeTrigger) {
6224                 request->mResultExtras.precaptureTriggerId = triggerId;
6225                 mCurrentPreCaptureTriggerId = triggerId;
6226             } else {
6227                 request->mResultExtras.afTriggerId = triggerId;
6228                 mCurrentAfTriggerId = triggerId;
6229             }
6230             continue;
6231         }
6232 
6233         camera_metadata_entry entry = metadata.find(tag);
6234 
6235         if (entry.count > 0) {
6236             /**
6237              * Already has an entry for this trigger in the request.
6238              * Rewrite it with our requested trigger value.
6239              */
6240             RequestTrigger oldTrigger = trigger;
6241 
6242             oldTrigger.entryValue = entry.data.u8[0];
6243 
6244             mTriggerReplacedMap.add(tag, oldTrigger);
6245         } else {
6246             /**
6247              * More typical, no trigger entry, so we just add it
6248              */
6249             mTriggerRemovedMap.add(tag, trigger);
6250         }
6251 
6252         status_t res;
6253 
6254         switch (trigger.getTagType()) {
6255             case TYPE_BYTE: {
6256                 uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
6257                 res = metadata.update(tag,
6258                                       &entryValue,
6259                                       /*count*/1);
6260                 break;
6261             }
6262             case TYPE_INT32:
6263                 res = metadata.update(tag,
6264                                       &trigger.entryValue,
6265                                       /*count*/1);
6266                 break;
6267             default:
6268                 ALOGE("%s: Type not supported: 0x%x",
6269                       __FUNCTION__,
6270                       trigger.getTagType());
6271                 return INVALID_OPERATION;
6272         }
6273 
6274         if (res != OK) {
6275             ALOGE("%s: Failed to update request metadata with trigger tag %s"
6276                   ", value %d", __FUNCTION__, trigger.getTagName(),
6277                   trigger.entryValue);
6278             return res;
6279         }
6280 
6281         ALOGV("%s: Mixed in trigger %s, value %d", __FUNCTION__,
6282               trigger.getTagName(),
6283               trigger.entryValue);
6284     }
6285 
6286     mTriggerMap.clear();
6287 
6288     return count;
6289 }
6290 
removeTriggers(const sp<CaptureRequest> & request)6291 status_t Camera3Device::RequestThread::removeTriggers(
6292         const sp<CaptureRequest> &request) {
6293     ATRACE_CALL();
6294     Mutex::Autolock al(mTriggerMutex);
6295 
6296     CameraMetadata &metadata = request->mSettingsList.begin()->metadata;
6297 
6298     /**
6299      * Replace all old entries with their old values.
6300      */
6301     for (size_t i = 0; i < mTriggerReplacedMap.size(); ++i) {
6302         RequestTrigger trigger = mTriggerReplacedMap.valueAt(i);
6303 
6304         status_t res;
6305 
6306         uint32_t tag = trigger.metadataTag;
6307         switch (trigger.getTagType()) {
6308             case TYPE_BYTE: {
6309                 uint8_t entryValue = static_cast<uint8_t>(trigger.entryValue);
6310                 res = metadata.update(tag,
6311                                       &entryValue,
6312                                       /*count*/1);
6313                 break;
6314             }
6315             case TYPE_INT32:
6316                 res = metadata.update(tag,
6317                                       &trigger.entryValue,
6318                                       /*count*/1);
6319                 break;
6320             default:
6321                 ALOGE("%s: Type not supported: 0x%x",
6322                       __FUNCTION__,
6323                       trigger.getTagType());
6324                 return INVALID_OPERATION;
6325         }
6326 
6327         if (res != OK) {
6328             ALOGE("%s: Failed to restore request metadata with trigger tag %s"
6329                   ", trigger value %d", __FUNCTION__,
6330                   trigger.getTagName(), trigger.entryValue);
6331             return res;
6332         }
6333     }
6334     mTriggerReplacedMap.clear();
6335 
6336     /**
6337      * Remove all new entries.
6338      */
6339     for (size_t i = 0; i < mTriggerRemovedMap.size(); ++i) {
6340         RequestTrigger trigger = mTriggerRemovedMap.valueAt(i);
6341         status_t res = metadata.erase(trigger.metadataTag);
6342 
6343         if (res != OK) {
6344             ALOGE("%s: Failed to erase metadata with trigger tag %s"
6345                   ", trigger value %d", __FUNCTION__,
6346                   trigger.getTagName(), trigger.entryValue);
6347             return res;
6348         }
6349     }
6350     mTriggerRemovedMap.clear();
6351 
6352     return OK;
6353 }
6354 
addDummyTriggerIds(const sp<CaptureRequest> & request)6355 status_t Camera3Device::RequestThread::addDummyTriggerIds(
6356         const sp<CaptureRequest> &request) {
6357     // Trigger ID 0 had special meaning in the HAL2 spec, so avoid it here
6358     static const int32_t dummyTriggerId = 1;
6359     status_t res;
6360 
6361     CameraMetadata &metadata = request->mSettingsList.begin()->metadata;
6362 
6363     // If AF trigger is active, insert a dummy AF trigger ID if none already
6364     // exists
6365     camera_metadata_entry afTrigger = metadata.find(ANDROID_CONTROL_AF_TRIGGER);
6366     camera_metadata_entry afId = metadata.find(ANDROID_CONTROL_AF_TRIGGER_ID);
6367     if (afTrigger.count > 0 &&
6368             afTrigger.data.u8[0] != ANDROID_CONTROL_AF_TRIGGER_IDLE &&
6369             afId.count == 0) {
6370         res = metadata.update(ANDROID_CONTROL_AF_TRIGGER_ID, &dummyTriggerId, 1);
6371         if (res != OK) return res;
6372     }
6373 
6374     // If AE precapture trigger is active, insert a dummy precapture trigger ID
6375     // if none already exists
6376     camera_metadata_entry pcTrigger =
6377             metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER);
6378     camera_metadata_entry pcId = metadata.find(ANDROID_CONTROL_AE_PRECAPTURE_ID);
6379     if (pcTrigger.count > 0 &&
6380             pcTrigger.data.u8[0] != ANDROID_CONTROL_AE_PRECAPTURE_TRIGGER_IDLE &&
6381             pcId.count == 0) {
6382         res = metadata.update(ANDROID_CONTROL_AE_PRECAPTURE_ID,
6383                 &dummyTriggerId, 1);
6384         if (res != OK) return res;
6385     }
6386 
6387     return OK;
6388 }
6389 
6390 /**
6391  * PreparerThread inner class methods
6392  */
6393 
PreparerThread()6394 Camera3Device::PreparerThread::PreparerThread() :
6395         Thread(/*canCallJava*/false), mListener(nullptr),
6396         mActive(false), mCancelNow(false), mCurrentMaxCount(0), mCurrentPrepareComplete(false) {
6397 }
6398 
~PreparerThread()6399 Camera3Device::PreparerThread::~PreparerThread() {
6400     Thread::requestExitAndWait();
6401     if (mCurrentStream != nullptr) {
6402         mCurrentStream->cancelPrepare();
6403         ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId());
6404         mCurrentStream.clear();
6405     }
6406     clear();
6407 }
6408 
prepare(int maxCount,sp<Camera3StreamInterface> & stream)6409 status_t Camera3Device::PreparerThread::prepare(int maxCount, sp<Camera3StreamInterface>& stream) {
6410     ATRACE_CALL();
6411     status_t res;
6412 
6413     Mutex::Autolock l(mLock);
6414     sp<NotificationListener> listener = mListener.promote();
6415 
6416     res = stream->startPrepare(maxCount, true /*blockRequest*/);
6417     if (res == OK) {
6418         // No preparation needed, fire listener right off
6419         ALOGV("%s: Stream %d already prepared", __FUNCTION__, stream->getId());
6420         if (listener != NULL) {
6421             listener->notifyPrepared(stream->getId());
6422         }
6423         return OK;
6424     } else if (res != NOT_ENOUGH_DATA) {
6425         return res;
6426     }
6427 
6428     // Need to prepare, start up thread if necessary
6429     if (!mActive) {
6430         // mRunning will change to false before the thread fully shuts down, so wait to be sure it
6431         // isn't running
6432         Thread::requestExitAndWait();
6433         res = Thread::run("C3PrepThread", PRIORITY_BACKGROUND);
6434         if (res != OK) {
6435             ALOGE("%s: Unable to start preparer stream: %d (%s)", __FUNCTION__, res, strerror(-res));
6436             if (listener != NULL) {
6437                 listener->notifyPrepared(stream->getId());
6438             }
6439             return res;
6440         }
6441         mCancelNow = false;
6442         mActive = true;
6443         ALOGV("%s: Preparer stream started", __FUNCTION__);
6444     }
6445 
6446     // queue up the work
6447     mPendingStreams.emplace(maxCount, stream);
6448     ALOGV("%s: Stream %d queued for preparing", __FUNCTION__, stream->getId());
6449 
6450     return OK;
6451 }
6452 
pause()6453 void Camera3Device::PreparerThread::pause() {
6454     ATRACE_CALL();
6455 
6456     Mutex::Autolock l(mLock);
6457 
6458     std::unordered_map<int, sp<camera3::Camera3StreamInterface> > pendingStreams;
6459     pendingStreams.insert(mPendingStreams.begin(), mPendingStreams.end());
6460     sp<camera3::Camera3StreamInterface> currentStream = mCurrentStream;
6461     int currentMaxCount = mCurrentMaxCount;
6462     mPendingStreams.clear();
6463     mCancelNow = true;
6464     while (mActive) {
6465         auto res = mThreadActiveSignal.waitRelative(mLock, kActiveTimeout);
6466         if (res == TIMED_OUT) {
6467             ALOGE("%s: Timed out waiting on prepare thread!", __FUNCTION__);
6468             return;
6469         } else if (res != OK) {
6470             ALOGE("%s: Encountered an error: %d waiting on prepare thread!", __FUNCTION__, res);
6471             return;
6472         }
6473     }
6474 
6475     //Check whether the prepare thread was able to complete the current
6476     //stream. In case work is still pending emplace it along with the rest
6477     //of the streams in the pending list.
6478     if (currentStream != nullptr) {
6479         if (!mCurrentPrepareComplete) {
6480             pendingStreams.emplace(currentMaxCount, currentStream);
6481         }
6482     }
6483 
6484     mPendingStreams.insert(pendingStreams.begin(), pendingStreams.end());
6485     for (const auto& it : mPendingStreams) {
6486         it.second->cancelPrepare();
6487     }
6488 }
6489 
resume()6490 status_t Camera3Device::PreparerThread::resume() {
6491     ATRACE_CALL();
6492     status_t res;
6493 
6494     Mutex::Autolock l(mLock);
6495     sp<NotificationListener> listener = mListener.promote();
6496 
6497     if (mActive) {
6498         ALOGE("%s: Trying to resume an already active prepare thread!", __FUNCTION__);
6499         return NO_INIT;
6500     }
6501 
6502     auto it = mPendingStreams.begin();
6503     for (; it != mPendingStreams.end();) {
6504         res = it->second->startPrepare(it->first, true /*blockRequest*/);
6505         if (res == OK) {
6506             if (listener != NULL) {
6507                 listener->notifyPrepared(it->second->getId());
6508             }
6509             it = mPendingStreams.erase(it);
6510         } else if (res != NOT_ENOUGH_DATA) {
6511             ALOGE("%s: Unable to start preparer stream: %d (%s)", __FUNCTION__,
6512                     res, strerror(-res));
6513             it = mPendingStreams.erase(it);
6514         } else {
6515             it++;
6516         }
6517     }
6518 
6519     if (mPendingStreams.empty()) {
6520         return OK;
6521     }
6522 
6523     res = Thread::run("C3PrepThread", PRIORITY_BACKGROUND);
6524     if (res != OK) {
6525         ALOGE("%s: Unable to start preparer stream: %d (%s)",
6526                 __FUNCTION__, res, strerror(-res));
6527         return res;
6528     }
6529     mCancelNow = false;
6530     mActive = true;
6531     ALOGV("%s: Preparer stream started", __FUNCTION__);
6532 
6533     return OK;
6534 }
6535 
clear()6536 status_t Camera3Device::PreparerThread::clear() {
6537     ATRACE_CALL();
6538     Mutex::Autolock l(mLock);
6539 
6540     for (const auto& it : mPendingStreams) {
6541         it.second->cancelPrepare();
6542     }
6543     mPendingStreams.clear();
6544     mCancelNow = true;
6545 
6546     return OK;
6547 }
6548 
setNotificationListener(wp<NotificationListener> listener)6549 void Camera3Device::PreparerThread::setNotificationListener(wp<NotificationListener> listener) {
6550     ATRACE_CALL();
6551     Mutex::Autolock l(mLock);
6552     mListener = listener;
6553 }
6554 
threadLoop()6555 bool Camera3Device::PreparerThread::threadLoop() {
6556     status_t res;
6557     {
6558         Mutex::Autolock l(mLock);
6559         if (mCurrentStream == nullptr) {
6560             // End thread if done with work
6561             if (mPendingStreams.empty()) {
6562                 ALOGV("%s: Preparer stream out of work", __FUNCTION__);
6563                 // threadLoop _must not_ re-acquire mLock after it sets mActive to false; would
6564                 // cause deadlock with prepare()'s requestExitAndWait triggered by !mActive.
6565                 mActive = false;
6566                 mThreadActiveSignal.signal();
6567                 return false;
6568             }
6569 
6570             // Get next stream to prepare
6571             auto it = mPendingStreams.begin();
6572             mCurrentStream = it->second;
6573             mCurrentMaxCount = it->first;
6574             mCurrentPrepareComplete = false;
6575             mPendingStreams.erase(it);
6576             ATRACE_ASYNC_BEGIN("stream prepare", mCurrentStream->getId());
6577             ALOGV("%s: Preparing stream %d", __FUNCTION__, mCurrentStream->getId());
6578         } else if (mCancelNow) {
6579             mCurrentStream->cancelPrepare();
6580             ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId());
6581             ALOGV("%s: Cancelling stream %d prepare", __FUNCTION__, mCurrentStream->getId());
6582             mCurrentStream.clear();
6583             mCancelNow = false;
6584             return true;
6585         }
6586     }
6587 
6588     res = mCurrentStream->prepareNextBuffer();
6589     if (res == NOT_ENOUGH_DATA) return true;
6590     if (res != OK) {
6591         // Something bad happened; try to recover by cancelling prepare and
6592         // signalling listener anyway
6593         ALOGE("%s: Stream %d returned error %d (%s) during prepare", __FUNCTION__,
6594                 mCurrentStream->getId(), res, strerror(-res));
6595         mCurrentStream->cancelPrepare();
6596     }
6597 
6598     // This stream has finished, notify listener
6599     Mutex::Autolock l(mLock);
6600     sp<NotificationListener> listener = mListener.promote();
6601     if (listener != NULL) {
6602         ALOGV("%s: Stream %d prepare done, signaling listener", __FUNCTION__,
6603                 mCurrentStream->getId());
6604         listener->notifyPrepared(mCurrentStream->getId());
6605     }
6606 
6607     ATRACE_ASYNC_END("stream prepare", mCurrentStream->getId());
6608     mCurrentStream.clear();
6609     mCurrentPrepareComplete = true;
6610 
6611     return true;
6612 }
6613 
initialize(sp<camera3::StatusTracker> statusTracker)6614 status_t Camera3Device::RequestBufferStateMachine::initialize(
6615         sp<camera3::StatusTracker> statusTracker) {
6616     if (statusTracker == nullptr) {
6617         ALOGE("%s: statusTracker is null", __FUNCTION__);
6618         return BAD_VALUE;
6619     }
6620 
6621     std::lock_guard<std::mutex> lock(mLock);
6622     mStatusTracker = statusTracker;
6623     mRequestBufferStatusId = statusTracker->addComponent();
6624     return OK;
6625 }
6626 
startRequestBuffer()6627 bool Camera3Device::RequestBufferStateMachine::startRequestBuffer() {
6628     std::lock_guard<std::mutex> lock(mLock);
6629     if (mStatus == RB_STATUS_READY || mStatus == RB_STATUS_PENDING_STOP) {
6630         mRequestBufferOngoing = true;
6631         notifyTrackerLocked(/*active*/true);
6632         return true;
6633     }
6634     return false;
6635 }
6636 
endRequestBuffer()6637 void Camera3Device::RequestBufferStateMachine::endRequestBuffer() {
6638     std::lock_guard<std::mutex> lock(mLock);
6639     if (!mRequestBufferOngoing) {
6640         ALOGE("%s called without a successful startRequestBuffer call first!", __FUNCTION__);
6641         return;
6642     }
6643     mRequestBufferOngoing = false;
6644     if (mStatus == RB_STATUS_PENDING_STOP) {
6645         checkSwitchToStopLocked();
6646     }
6647     notifyTrackerLocked(/*active*/false);
6648 }
6649 
onStreamsConfigured()6650 void Camera3Device::RequestBufferStateMachine::onStreamsConfigured() {
6651     std::lock_guard<std::mutex> lock(mLock);
6652     mStatus = RB_STATUS_READY;
6653     return;
6654 }
6655 
onSubmittingRequest()6656 void Camera3Device::RequestBufferStateMachine::onSubmittingRequest() {
6657     std::lock_guard<std::mutex> lock(mLock);
6658     mRequestThreadPaused = false;
6659     // inflight map register actually happens in prepareHalRequest now, but it is close enough
6660     // approximation.
6661     mInflightMapEmpty = false;
6662     if (mStatus == RB_STATUS_STOPPED) {
6663         mStatus = RB_STATUS_READY;
6664     }
6665     return;
6666 }
6667 
onRequestThreadPaused()6668 void Camera3Device::RequestBufferStateMachine::onRequestThreadPaused() {
6669     std::lock_guard<std::mutex> lock(mLock);
6670     mRequestThreadPaused = true;
6671     if (mStatus == RB_STATUS_PENDING_STOP) {
6672         checkSwitchToStopLocked();
6673     }
6674     return;
6675 }
6676 
onInflightMapEmpty()6677 void Camera3Device::RequestBufferStateMachine::onInflightMapEmpty() {
6678     std::lock_guard<std::mutex> lock(mLock);
6679     mInflightMapEmpty = true;
6680     if (mStatus == RB_STATUS_PENDING_STOP) {
6681         checkSwitchToStopLocked();
6682     }
6683     return;
6684 }
6685 
onWaitUntilIdle()6686 void Camera3Device::RequestBufferStateMachine::onWaitUntilIdle() {
6687     std::lock_guard<std::mutex> lock(mLock);
6688     if (!checkSwitchToStopLocked()) {
6689         mStatus = RB_STATUS_PENDING_STOP;
6690     }
6691     return;
6692 }
6693 
notifyTrackerLocked(bool active)6694 void Camera3Device::RequestBufferStateMachine::notifyTrackerLocked(bool active) {
6695     sp<StatusTracker> statusTracker = mStatusTracker.promote();
6696     if (statusTracker != nullptr) {
6697         if (active) {
6698             statusTracker->markComponentActive(mRequestBufferStatusId);
6699         } else {
6700             statusTracker->markComponentIdle(mRequestBufferStatusId, Fence::NO_FENCE);
6701         }
6702     }
6703 }
6704 
checkSwitchToStopLocked()6705 bool Camera3Device::RequestBufferStateMachine::checkSwitchToStopLocked() {
6706     if (mInflightMapEmpty && mRequestThreadPaused && !mRequestBufferOngoing) {
6707         mStatus = RB_STATUS_STOPPED;
6708         return true;
6709     }
6710     return false;
6711 }
6712 
fixupMonochromeTags(const CameraMetadata & deviceInfo,CameraMetadata & resultMetadata)6713 status_t Camera3Device::fixupMonochromeTags(const CameraMetadata& deviceInfo,
6714         CameraMetadata& resultMetadata) {
6715     status_t res = OK;
6716     if (!mNeedFixupMonochromeTags) {
6717         return res;
6718     }
6719 
6720     // Remove tags that are not applicable to monochrome camera.
6721     int32_t tagsToRemove[] = {
6722            ANDROID_SENSOR_GREEN_SPLIT,
6723            ANDROID_SENSOR_NEUTRAL_COLOR_POINT,
6724            ANDROID_COLOR_CORRECTION_MODE,
6725            ANDROID_COLOR_CORRECTION_TRANSFORM,
6726            ANDROID_COLOR_CORRECTION_GAINS,
6727     };
6728     for (auto tag : tagsToRemove) {
6729         res = resultMetadata.erase(tag);
6730         if (res != OK) {
6731             ALOGE("%s: Failed to remove tag %d for monochrome camera", __FUNCTION__, tag);
6732             return res;
6733         }
6734     }
6735 
6736     // ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL
6737     camera_metadata_entry blEntry = resultMetadata.find(ANDROID_SENSOR_DYNAMIC_BLACK_LEVEL);
6738     for (size_t i = 1; i < blEntry.count; i++) {
6739         blEntry.data.f[i] = blEntry.data.f[0];
6740     }
6741 
6742     // ANDROID_SENSOR_NOISE_PROFILE
6743     camera_metadata_entry npEntry = resultMetadata.find(ANDROID_SENSOR_NOISE_PROFILE);
6744     if (npEntry.count > 0 && npEntry.count % 2 == 0) {
6745         double np[] = {npEntry.data.d[0], npEntry.data.d[1]};
6746         res = resultMetadata.update(ANDROID_SENSOR_NOISE_PROFILE, np, 2);
6747         if (res != OK) {
6748              ALOGE("%s: Failed to update SENSOR_NOISE_PROFILE: %s (%d)",
6749                     __FUNCTION__, strerror(-res), res);
6750             return res;
6751         }
6752     }
6753 
6754     // ANDROID_STATISTICS_LENS_SHADING_MAP
6755     camera_metadata_ro_entry lsSizeEntry = deviceInfo.find(ANDROID_LENS_INFO_SHADING_MAP_SIZE);
6756     camera_metadata_entry lsEntry = resultMetadata.find(ANDROID_STATISTICS_LENS_SHADING_MAP);
6757     if (lsSizeEntry.count == 2 && lsEntry.count > 0
6758             && (int32_t)lsEntry.count == 4 * lsSizeEntry.data.i32[0] * lsSizeEntry.data.i32[1]) {
6759         for (int32_t i = 0; i < lsSizeEntry.data.i32[0] * lsSizeEntry.data.i32[1]; i++) {
6760             lsEntry.data.f[4*i+1] = lsEntry.data.f[4*i];
6761             lsEntry.data.f[4*i+2] = lsEntry.data.f[4*i];
6762             lsEntry.data.f[4*i+3] = lsEntry.data.f[4*i];
6763         }
6764     }
6765 
6766     // ANDROID_TONEMAP_CURVE_BLUE
6767     // ANDROID_TONEMAP_CURVE_GREEN
6768     // ANDROID_TONEMAP_CURVE_RED
6769     camera_metadata_entry tcbEntry = resultMetadata.find(ANDROID_TONEMAP_CURVE_BLUE);
6770     camera_metadata_entry tcgEntry = resultMetadata.find(ANDROID_TONEMAP_CURVE_GREEN);
6771     camera_metadata_entry tcrEntry = resultMetadata.find(ANDROID_TONEMAP_CURVE_RED);
6772     if (tcbEntry.count > 0
6773             && tcbEntry.count == tcgEntry.count
6774             && tcbEntry.count == tcrEntry.count) {
6775         for (size_t i = 0; i < tcbEntry.count; i++) {
6776             tcbEntry.data.f[i] = tcrEntry.data.f[i];
6777             tcgEntry.data.f[i] = tcrEntry.data.f[i];
6778         }
6779     }
6780 
6781     return res;
6782 }
6783 
6784 }; // namespace android
6785