Loading camera/CaptureResult.cpp +6 −0 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,9 @@ status_t CaptureResultExtras::readFromParcel(const android::Parcel *parcel) { } } errorPhysicalCameraId = cameraId; errorPhysicalCameraId = cameraId; } } parcel->readInt64(&lastCompletedRegularFrameNumber); parcel->readInt64(&lastCompletedReprocessFrameNumber); parcel->readInt64(&lastCompletedZslFrameNumber); return OK; return OK; } } Loading Loading @@ -76,6 +79,9 @@ status_t CaptureResultExtras::writeToParcel(android::Parcel *parcel) const { } else { } else { parcel->writeBool(false); parcel->writeBool(false); } } parcel->writeInt64(lastCompletedRegularFrameNumber); parcel->writeInt64(lastCompletedReprocessFrameNumber); parcel->writeInt64(lastCompletedZslFrameNumber); return OK; return OK; } } Loading camera/include/camera/CaptureResult.h +32 −1 Original line number Original line Diff line number Diff line Loading @@ -76,6 +76,34 @@ struct CaptureResultExtras : public android::Parcelable { */ */ String16 errorPhysicalCameraId; String16 errorPhysicalCameraId; // The last completed frame numbers shouldn't be checked in onResultReceived() and notifyError() // because the output buffers could be arriving after onResultReceived() and // notifyError(). Given this constraint, we check it for each // onCaptureStarted, and if there is no further onCaptureStarted(), // check for onDeviceIdle() to clear out all pending frame numbers. /** * The latest regular request frameNumber for which all buffers and capture result have been * returned or notified as an BUFFER_ERROR/RESULT_ERROR/REQUEST_ERROR. -1 if * none has completed. */ int64_t lastCompletedRegularFrameNumber; /** * The latest reprocess request frameNumber for which all buffers and capture result have been * returned or notified as an BUFFER_ERROR/RESULT_ERROR/REQUEST_ERROR. -1 if * none has completed. */ int64_t lastCompletedReprocessFrameNumber; /** * The latest Zsl request frameNumber for which all buffers and capture result have been * returned or notified as an BUFFER_ERROR/RESULT_ERROR/REQUEST_ERROR. -1 if * none has completed. */ int64_t lastCompletedZslFrameNumber; /** /** * Constructor initializes object as invalid by setting requestId to be -1. * Constructor initializes object as invalid by setting requestId to be -1. */ */ Loading @@ -87,7 +115,10 @@ struct CaptureResultExtras : public android::Parcelable { frameNumber(0), frameNumber(0), partialResultCount(0), partialResultCount(0), errorStreamId(-1), errorStreamId(-1), errorPhysicalCameraId() { errorPhysicalCameraId(), lastCompletedRegularFrameNumber(-1), lastCompletedReprocessFrameNumber(-1), lastCompletedZslFrameNumber(-1) { } } /** /** Loading camera/ndk/impl/ACameraDevice.cpp +82 −35 Original line number Original line Diff line number Diff line Loading @@ -1336,19 +1336,19 @@ CameraDevice::checkRepeatingSequenceCompleteLocked( void void CameraDevice::checkAndFireSequenceCompleteLocked() { CameraDevice::checkAndFireSequenceCompleteLocked() { int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber(); int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber(); //std::map<int, int64_t> mSequenceLastFrameNumberMap; auto it = mSequenceLastFrameNumberMap.begin(); auto it = mSequenceLastFrameNumberMap.begin(); while (it != mSequenceLastFrameNumberMap.end()) { while (it != mSequenceLastFrameNumberMap.end()) { int sequenceId = it->first; int sequenceId = it->first; int64_t lastFrameNumber = it->second; int64_t lastFrameNumber = it->second.lastFrameNumber; bool seqCompleted = false; bool hasCallback = true; bool hasCallback = true; if (mRemote == nullptr) { if (mRemote == nullptr) { ALOGW("Camera %s closed while checking sequence complete", getId()); ALOGW("Camera %s closed while checking sequence complete", getId()); return; return; } } ALOGV("%s: seq %d's last frame number %" PRId64 ", completed %" PRId64, __FUNCTION__, sequenceId, lastFrameNumber, completedFrameNumber); if (!it->second.isSequenceCompleted) { // Check if there is callback for this sequence // Check if there is callback for this sequence // This should not happen because we always register callback (with nullptr inside) // This should not happen because we always register callback (with nullptr inside) if (mSequenceCallbackMap.count(sequenceId) == 0) { if (mSequenceCallbackMap.count(sequenceId) == 0) { Loading @@ -1357,16 +1357,14 @@ CameraDevice::checkAndFireSequenceCompleteLocked() { } } if (lastFrameNumber <= completedFrameNumber) { if (lastFrameNumber <= completedFrameNumber) { ALOGV("seq %d reached last frame %" PRId64 ", completed %" PRId64, ALOGV("Mark sequenceId %d as sequence completed", sequenceId); sequenceId, lastFrameNumber, completedFrameNumber); it->second.isSequenceCompleted = true; seqCompleted = true; } } if (seqCompleted && hasCallback) { if (it->second.isSequenceCompleted && hasCallback) { // remove callback holder from callback map auto cbIt = mSequenceCallbackMap.find(sequenceId); auto cbIt = mSequenceCallbackMap.find(sequenceId); CallbackHolder cbh = cbIt->second; CallbackHolder cbh = cbIt->second; mSequenceCallbackMap.erase(cbIt); // send seq complete callback // send seq complete callback sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler); sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler); msg->setPointer(kContextKey, cbh.mContext); msg->setPointer(kContextKey, cbh.mContext); Loading @@ -1382,10 +1380,53 @@ CameraDevice::checkAndFireSequenceCompleteLocked() { cbh.mSession.clear(); cbh.mSession.clear(); postSessionMsgAndCleanup(msg); postSessionMsgAndCleanup(msg); } } } // No need to track sequence complete if there is no callback registered if (it->second.isSequenceCompleted && it->second.isInflightCompleted) { if (seqCompleted || !hasCallback) { if (mSequenceCallbackMap.find(sequenceId) != mSequenceCallbackMap.end()) { mSequenceCallbackMap.erase(sequenceId); } it = mSequenceLastFrameNumberMap.erase(it); it = mSequenceLastFrameNumberMap.erase(it); ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId); } else { ++it; } } } void CameraDevice::removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber) { auto it = mSequenceLastFrameNumberMap.begin(); while (it != mSequenceLastFrameNumberMap.end()) { int sequenceId = it->first; int64_t lastFrameNumber = it->second.lastFrameNumber; if (mRemote == nullptr) { ALOGW("Camera %s closed while checking sequence complete", getId()); return; } ALOGV("%s: seq %d's last frame number %" PRId64 ", completed inflight frame number %" PRId64, __FUNCTION__, sequenceId, lastFrameNumber, lastCompletedRegularFrameNumber); if (lastFrameNumber <= lastCompletedRegularFrameNumber) { if (it->second.isSequenceCompleted) { // Check if there is callback for this sequence // This should not happen because we always register callback (with nullptr inside) if (mSequenceCallbackMap.count(sequenceId) == 0) { ALOGW("No callback found for sequenceId %d", sequenceId); } else { mSequenceCallbackMap.erase(sequenceId); } it = mSequenceLastFrameNumberMap.erase(it); ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId); } else { ALOGV("Mark sequenceId %d as inflight completed", sequenceId); it->second.isInflightCompleted = true; ++it; } } else { } else { ++it; ++it; } } Loading Loading @@ -1480,6 +1521,9 @@ CameraDevice::ServiceCallback::onDeviceIdle() { return ret; return ret; } } dev->removeCompletedCallbackHolderLocked( std::numeric_limits<int64_t>::max()/*lastCompletedRegularFrameNumber*/); if (dev->mIdle) { if (dev->mIdle) { // Already in idle state. Possibly other thread did waitUntilIdle // Already in idle state. Possibly other thread did waitUntilIdle return ret; return ret; Loading Loading @@ -1522,6 +1566,9 @@ CameraDevice::ServiceCallback::onCaptureStarted( return ret; return ret; } } dev->removeCompletedCallbackHolderLocked( resultExtras.lastCompletedRegularFrameNumber); int sequenceId = resultExtras.requestId; int sequenceId = resultExtras.requestId; int32_t burstId = resultExtras.burstId; int32_t burstId = resultExtras.burstId; Loading camera/ndk/impl/ACameraDevice.h +10 −2 Original line number Original line Diff line number Diff line Loading @@ -267,8 +267,15 @@ class CameraDevice final : public RefBase { static const int REQUEST_ID_NONE = -1; static const int REQUEST_ID_NONE = -1; int mRepeatingSequenceId = REQUEST_ID_NONE; int mRepeatingSequenceId = REQUEST_ID_NONE; // sequence id -> last frame number map // sequence id -> last frame number holder map std::map<int, int64_t> mSequenceLastFrameNumberMap; struct RequestLastFrameNumberHolder { int64_t lastFrameNumber; bool isSequenceCompleted = false; bool isInflightCompleted = false; RequestLastFrameNumberHolder(int64_t lastFN) : lastFrameNumber(lastFN) {} }; std::map<int, RequestLastFrameNumberHolder> mSequenceLastFrameNumberMap; struct CallbackHolder { struct CallbackHolder { CallbackHolder(sp<ACameraCaptureSession> session, CallbackHolder(sp<ACameraCaptureSession> session, Loading Loading @@ -338,6 +345,7 @@ class CameraDevice final : public RefBase { void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber); void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber); void checkAndFireSequenceCompleteLocked(); void checkAndFireSequenceCompleteLocked(); void removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber); // Misc variables // Misc variables int32_t mShadingMapSize[2]; // const after constructor int32_t mShadingMapSize[2]; // const after constructor Loading services/camera/libcameraservice/device3/Camera3Device.cpp +19 −13 Original line number Original line Diff line number Diff line Loading @@ -756,9 +756,10 @@ status_t Camera3Device::dump(int fd, const Vector<String16> &args) { for (size_t i = 0; i < mInFlightMap.size(); i++) { for (size_t i = 0; i < mInFlightMap.size(); i++) { InFlightRequest r = mInFlightMap.valueAt(i); InFlightRequest r = mInFlightMap.valueAt(i); lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata" lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata" " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i), " arrived: %s, buffers left: %d, buffers returned with STATUS_ERROR: %d, " " buffers notified with error: %d\n", mInFlightMap.keyAt(i), r.shutterTimestamp, r.haveResultMetadata ? "true" : "false", r.shutterTimestamp, r.haveResultMetadata ? "true" : "false", r.numBuffersLeft); r.numBuffersLeft, r.numErrorBuffersReturned, r.numErrorBuffersNotified); } } } } write(fd, lines.string(), lines.size()); write(fd, lines.string(), lines.size()); Loading Loading @@ -1043,8 +1044,9 @@ hardware::Return<void> Camera3Device::processCaptureResult_3_4( } } CaptureOutputStates states { CaptureOutputStates states { mId, mId, mInFlightLock, mInFlightMap, mInFlightLock, mLastCompletedRegularFrameNumber, mOutputLock, mResultQueue, mResultSignal, mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber, mInFlightMap, mOutputLock, mResultQueue, mResultSignal, mNextShutterFrameNumber, mNextShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextResultFrameNumber, mNextResultFrameNumber, Loading Loading @@ -1100,8 +1102,9 @@ hardware::Return<void> Camera3Device::processCaptureResult( CaptureOutputStates states { CaptureOutputStates states { mId, mId, mInFlightLock, mInFlightMap, mInFlightLock, mLastCompletedRegularFrameNumber, mOutputLock, mResultQueue, mResultSignal, mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber, mInFlightMap, mOutputLock, mResultQueue, mResultSignal, mNextShutterFrameNumber, mNextShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextResultFrameNumber, mNextResultFrameNumber, Loading Loading @@ -1139,8 +1142,9 @@ hardware::Return<void> Camera3Device::notify( CaptureOutputStates states { CaptureOutputStates states { mId, mId, mInFlightLock, mInFlightMap, mInFlightLock, mLastCompletedRegularFrameNumber, mOutputLock, mResultQueue, mResultSignal, mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber, mInFlightMap, mOutputLock, mResultQueue, mResultSignal, mNextShutterFrameNumber, mNextShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextResultFrameNumber, mNextResultFrameNumber, Loading Loading @@ -5901,11 +5905,13 @@ status_t Camera3Device::switchToOffline( // though technically no other thread should be talking to Camera3Device at this point // though technically no other thread should be talking to Camera3Device at this point Camera3OfflineStates offlineStates( Camera3OfflineStates offlineStates( mTagMonitor, mVendorTagId, mUseHalBufManager, mNeedFixupMonochromeTags, mTagMonitor, mVendorTagId, mUseHalBufManager, mNeedFixupMonochromeTags, mUsePartialResult, mNumPartialResults, mNextResultFrameNumber, mUsePartialResult, mNumPartialResults, mLastCompletedRegularFrameNumber, mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber, mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber, mNextShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextResultFrameNumber, mNextReprocessResultFrameNumber, mNextZslStillShutterFrameNumber, mDeviceInfo, mPhysicalDeviceInfoMap, mNextZslStillResultFrameNumber, mNextShutterFrameNumber, mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers); mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mDeviceInfo, mPhysicalDeviceInfoMap, mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers); *session = new Camera3OfflineSession(mId, inputStream, offlineStreamSet, *session = new Camera3OfflineSession(mId, inputStream, offlineStreamSet, std::move(bufferRecords), offlineReqs, offlineStates, offlineSession); std::move(bufferRecords), offlineReqs, offlineStates, offlineSession); Loading Loading
camera/CaptureResult.cpp +6 −0 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,9 @@ status_t CaptureResultExtras::readFromParcel(const android::Parcel *parcel) { } } errorPhysicalCameraId = cameraId; errorPhysicalCameraId = cameraId; } } parcel->readInt64(&lastCompletedRegularFrameNumber); parcel->readInt64(&lastCompletedReprocessFrameNumber); parcel->readInt64(&lastCompletedZslFrameNumber); return OK; return OK; } } Loading Loading @@ -76,6 +79,9 @@ status_t CaptureResultExtras::writeToParcel(android::Parcel *parcel) const { } else { } else { parcel->writeBool(false); parcel->writeBool(false); } } parcel->writeInt64(lastCompletedRegularFrameNumber); parcel->writeInt64(lastCompletedReprocessFrameNumber); parcel->writeInt64(lastCompletedZslFrameNumber); return OK; return OK; } } Loading
camera/include/camera/CaptureResult.h +32 −1 Original line number Original line Diff line number Diff line Loading @@ -76,6 +76,34 @@ struct CaptureResultExtras : public android::Parcelable { */ */ String16 errorPhysicalCameraId; String16 errorPhysicalCameraId; // The last completed frame numbers shouldn't be checked in onResultReceived() and notifyError() // because the output buffers could be arriving after onResultReceived() and // notifyError(). Given this constraint, we check it for each // onCaptureStarted, and if there is no further onCaptureStarted(), // check for onDeviceIdle() to clear out all pending frame numbers. /** * The latest regular request frameNumber for which all buffers and capture result have been * returned or notified as an BUFFER_ERROR/RESULT_ERROR/REQUEST_ERROR. -1 if * none has completed. */ int64_t lastCompletedRegularFrameNumber; /** * The latest reprocess request frameNumber for which all buffers and capture result have been * returned or notified as an BUFFER_ERROR/RESULT_ERROR/REQUEST_ERROR. -1 if * none has completed. */ int64_t lastCompletedReprocessFrameNumber; /** * The latest Zsl request frameNumber for which all buffers and capture result have been * returned or notified as an BUFFER_ERROR/RESULT_ERROR/REQUEST_ERROR. -1 if * none has completed. */ int64_t lastCompletedZslFrameNumber; /** /** * Constructor initializes object as invalid by setting requestId to be -1. * Constructor initializes object as invalid by setting requestId to be -1. */ */ Loading @@ -87,7 +115,10 @@ struct CaptureResultExtras : public android::Parcelable { frameNumber(0), frameNumber(0), partialResultCount(0), partialResultCount(0), errorStreamId(-1), errorStreamId(-1), errorPhysicalCameraId() { errorPhysicalCameraId(), lastCompletedRegularFrameNumber(-1), lastCompletedReprocessFrameNumber(-1), lastCompletedZslFrameNumber(-1) { } } /** /** Loading
camera/ndk/impl/ACameraDevice.cpp +82 −35 Original line number Original line Diff line number Diff line Loading @@ -1336,19 +1336,19 @@ CameraDevice::checkRepeatingSequenceCompleteLocked( void void CameraDevice::checkAndFireSequenceCompleteLocked() { CameraDevice::checkAndFireSequenceCompleteLocked() { int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber(); int64_t completedFrameNumber = mFrameNumberTracker.getCompletedFrameNumber(); //std::map<int, int64_t> mSequenceLastFrameNumberMap; auto it = mSequenceLastFrameNumberMap.begin(); auto it = mSequenceLastFrameNumberMap.begin(); while (it != mSequenceLastFrameNumberMap.end()) { while (it != mSequenceLastFrameNumberMap.end()) { int sequenceId = it->first; int sequenceId = it->first; int64_t lastFrameNumber = it->second; int64_t lastFrameNumber = it->second.lastFrameNumber; bool seqCompleted = false; bool hasCallback = true; bool hasCallback = true; if (mRemote == nullptr) { if (mRemote == nullptr) { ALOGW("Camera %s closed while checking sequence complete", getId()); ALOGW("Camera %s closed while checking sequence complete", getId()); return; return; } } ALOGV("%s: seq %d's last frame number %" PRId64 ", completed %" PRId64, __FUNCTION__, sequenceId, lastFrameNumber, completedFrameNumber); if (!it->second.isSequenceCompleted) { // Check if there is callback for this sequence // Check if there is callback for this sequence // This should not happen because we always register callback (with nullptr inside) // This should not happen because we always register callback (with nullptr inside) if (mSequenceCallbackMap.count(sequenceId) == 0) { if (mSequenceCallbackMap.count(sequenceId) == 0) { Loading @@ -1357,16 +1357,14 @@ CameraDevice::checkAndFireSequenceCompleteLocked() { } } if (lastFrameNumber <= completedFrameNumber) { if (lastFrameNumber <= completedFrameNumber) { ALOGV("seq %d reached last frame %" PRId64 ", completed %" PRId64, ALOGV("Mark sequenceId %d as sequence completed", sequenceId); sequenceId, lastFrameNumber, completedFrameNumber); it->second.isSequenceCompleted = true; seqCompleted = true; } } if (seqCompleted && hasCallback) { if (it->second.isSequenceCompleted && hasCallback) { // remove callback holder from callback map auto cbIt = mSequenceCallbackMap.find(sequenceId); auto cbIt = mSequenceCallbackMap.find(sequenceId); CallbackHolder cbh = cbIt->second; CallbackHolder cbh = cbIt->second; mSequenceCallbackMap.erase(cbIt); // send seq complete callback // send seq complete callback sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler); sp<AMessage> msg = new AMessage(kWhatCaptureSeqEnd, mHandler); msg->setPointer(kContextKey, cbh.mContext); msg->setPointer(kContextKey, cbh.mContext); Loading @@ -1382,10 +1380,53 @@ CameraDevice::checkAndFireSequenceCompleteLocked() { cbh.mSession.clear(); cbh.mSession.clear(); postSessionMsgAndCleanup(msg); postSessionMsgAndCleanup(msg); } } } // No need to track sequence complete if there is no callback registered if (it->second.isSequenceCompleted && it->second.isInflightCompleted) { if (seqCompleted || !hasCallback) { if (mSequenceCallbackMap.find(sequenceId) != mSequenceCallbackMap.end()) { mSequenceCallbackMap.erase(sequenceId); } it = mSequenceLastFrameNumberMap.erase(it); it = mSequenceLastFrameNumberMap.erase(it); ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId); } else { ++it; } } } void CameraDevice::removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber) { auto it = mSequenceLastFrameNumberMap.begin(); while (it != mSequenceLastFrameNumberMap.end()) { int sequenceId = it->first; int64_t lastFrameNumber = it->second.lastFrameNumber; if (mRemote == nullptr) { ALOGW("Camera %s closed while checking sequence complete", getId()); return; } ALOGV("%s: seq %d's last frame number %" PRId64 ", completed inflight frame number %" PRId64, __FUNCTION__, sequenceId, lastFrameNumber, lastCompletedRegularFrameNumber); if (lastFrameNumber <= lastCompletedRegularFrameNumber) { if (it->second.isSequenceCompleted) { // Check if there is callback for this sequence // This should not happen because we always register callback (with nullptr inside) if (mSequenceCallbackMap.count(sequenceId) == 0) { ALOGW("No callback found for sequenceId %d", sequenceId); } else { mSequenceCallbackMap.erase(sequenceId); } it = mSequenceLastFrameNumberMap.erase(it); ALOGV("%s: Remove holder for sequenceId %d", __FUNCTION__, sequenceId); } else { ALOGV("Mark sequenceId %d as inflight completed", sequenceId); it->second.isInflightCompleted = true; ++it; } } else { } else { ++it; ++it; } } Loading Loading @@ -1480,6 +1521,9 @@ CameraDevice::ServiceCallback::onDeviceIdle() { return ret; return ret; } } dev->removeCompletedCallbackHolderLocked( std::numeric_limits<int64_t>::max()/*lastCompletedRegularFrameNumber*/); if (dev->mIdle) { if (dev->mIdle) { // Already in idle state. Possibly other thread did waitUntilIdle // Already in idle state. Possibly other thread did waitUntilIdle return ret; return ret; Loading Loading @@ -1522,6 +1566,9 @@ CameraDevice::ServiceCallback::onCaptureStarted( return ret; return ret; } } dev->removeCompletedCallbackHolderLocked( resultExtras.lastCompletedRegularFrameNumber); int sequenceId = resultExtras.requestId; int sequenceId = resultExtras.requestId; int32_t burstId = resultExtras.burstId; int32_t burstId = resultExtras.burstId; Loading
camera/ndk/impl/ACameraDevice.h +10 −2 Original line number Original line Diff line number Diff line Loading @@ -267,8 +267,15 @@ class CameraDevice final : public RefBase { static const int REQUEST_ID_NONE = -1; static const int REQUEST_ID_NONE = -1; int mRepeatingSequenceId = REQUEST_ID_NONE; int mRepeatingSequenceId = REQUEST_ID_NONE; // sequence id -> last frame number map // sequence id -> last frame number holder map std::map<int, int64_t> mSequenceLastFrameNumberMap; struct RequestLastFrameNumberHolder { int64_t lastFrameNumber; bool isSequenceCompleted = false; bool isInflightCompleted = false; RequestLastFrameNumberHolder(int64_t lastFN) : lastFrameNumber(lastFN) {} }; std::map<int, RequestLastFrameNumberHolder> mSequenceLastFrameNumberMap; struct CallbackHolder { struct CallbackHolder { CallbackHolder(sp<ACameraCaptureSession> session, CallbackHolder(sp<ACameraCaptureSession> session, Loading Loading @@ -338,6 +345,7 @@ class CameraDevice final : public RefBase { void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber); void checkRepeatingSequenceCompleteLocked(const int sequenceId, const int64_t lastFrameNumber); void checkAndFireSequenceCompleteLocked(); void checkAndFireSequenceCompleteLocked(); void removeCompletedCallbackHolderLocked(int64_t lastCompletedRegularFrameNumber); // Misc variables // Misc variables int32_t mShadingMapSize[2]; // const after constructor int32_t mShadingMapSize[2]; // const after constructor Loading
services/camera/libcameraservice/device3/Camera3Device.cpp +19 −13 Original line number Original line Diff line number Diff line Loading @@ -756,9 +756,10 @@ status_t Camera3Device::dump(int fd, const Vector<String16> &args) { for (size_t i = 0; i < mInFlightMap.size(); i++) { for (size_t i = 0; i < mInFlightMap.size(); i++) { InFlightRequest r = mInFlightMap.valueAt(i); InFlightRequest r = mInFlightMap.valueAt(i); lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata" lines.appendFormat(" Frame %d | Timestamp: %" PRId64 ", metadata" " arrived: %s, buffers left: %d\n", mInFlightMap.keyAt(i), " arrived: %s, buffers left: %d, buffers returned with STATUS_ERROR: %d, " " buffers notified with error: %d\n", mInFlightMap.keyAt(i), r.shutterTimestamp, r.haveResultMetadata ? "true" : "false", r.shutterTimestamp, r.haveResultMetadata ? "true" : "false", r.numBuffersLeft); r.numBuffersLeft, r.numErrorBuffersReturned, r.numErrorBuffersNotified); } } } } write(fd, lines.string(), lines.size()); write(fd, lines.string(), lines.size()); Loading Loading @@ -1043,8 +1044,9 @@ hardware::Return<void> Camera3Device::processCaptureResult_3_4( } } CaptureOutputStates states { CaptureOutputStates states { mId, mId, mInFlightLock, mInFlightMap, mInFlightLock, mLastCompletedRegularFrameNumber, mOutputLock, mResultQueue, mResultSignal, mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber, mInFlightMap, mOutputLock, mResultQueue, mResultSignal, mNextShutterFrameNumber, mNextShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextResultFrameNumber, mNextResultFrameNumber, Loading Loading @@ -1100,8 +1102,9 @@ hardware::Return<void> Camera3Device::processCaptureResult( CaptureOutputStates states { CaptureOutputStates states { mId, mId, mInFlightLock, mInFlightMap, mInFlightLock, mLastCompletedRegularFrameNumber, mOutputLock, mResultQueue, mResultSignal, mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber, mInFlightMap, mOutputLock, mResultQueue, mResultSignal, mNextShutterFrameNumber, mNextShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextResultFrameNumber, mNextResultFrameNumber, Loading Loading @@ -1139,8 +1142,9 @@ hardware::Return<void> Camera3Device::notify( CaptureOutputStates states { CaptureOutputStates states { mId, mId, mInFlightLock, mInFlightMap, mInFlightLock, mLastCompletedRegularFrameNumber, mOutputLock, mResultQueue, mResultSignal, mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber, mInFlightMap, mOutputLock, mResultQueue, mResultSignal, mNextShutterFrameNumber, mNextShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mNextResultFrameNumber, mNextResultFrameNumber, Loading Loading @@ -5901,11 +5905,13 @@ status_t Camera3Device::switchToOffline( // though technically no other thread should be talking to Camera3Device at this point // though technically no other thread should be talking to Camera3Device at this point Camera3OfflineStates offlineStates( Camera3OfflineStates offlineStates( mTagMonitor, mVendorTagId, mUseHalBufManager, mNeedFixupMonochromeTags, mTagMonitor, mVendorTagId, mUseHalBufManager, mNeedFixupMonochromeTags, mUsePartialResult, mNumPartialResults, mNextResultFrameNumber, mUsePartialResult, mNumPartialResults, mLastCompletedRegularFrameNumber, mNextReprocessResultFrameNumber, mNextZslStillResultFrameNumber, mLastCompletedReprocessFrameNumber, mLastCompletedZslFrameNumber, mNextShutterFrameNumber, mNextReprocessShutterFrameNumber, mNextResultFrameNumber, mNextReprocessResultFrameNumber, mNextZslStillShutterFrameNumber, mDeviceInfo, mPhysicalDeviceInfoMap, mNextZslStillResultFrameNumber, mNextShutterFrameNumber, mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers); mNextReprocessShutterFrameNumber, mNextZslStillShutterFrameNumber, mDeviceInfo, mPhysicalDeviceInfoMap, mDistortionMappers, mZoomRatioMappers, mRotateAndCropMappers); *session = new Camera3OfflineSession(mId, inputStream, offlineStreamSet, *session = new Camera3OfflineSession(mId, inputStream, offlineStreamSet, std::move(bufferRecords), offlineReqs, offlineStates, offlineSession); std::move(bufferRecords), offlineReqs, offlineStates, offlineSession); Loading