diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index a9e92dbf..a5d250f0 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -164,6 +164,7 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA mHeight = height; mCaptureTriggered = false; + mCaptureDispatched = false; maxFrameDuration = 0; afSupported = false; @@ -1479,15 +1480,21 @@ void NdkCamera::onImageAvailable(AImageReader* reader) std::shared_ptr result; bool captureCompleted = false; + bool captureDispatchable = false; m_locker.lock(); if (!mCaptureResults.empty()) { captureCompleted = true; result = mCaptureResults[0]; } + if (captureCompleted && !mCaptureDispatched) + { + mCaptureDispatched = true; + captureDispatchable = true; + } m_locker.unlock(); - if (captureCompleted) + if (captureCompleted && captureDispatchable) { onOneCapture(mCharacteristics, result, mFinalLdr, ts - m_startTime, mOneFrame); } @@ -1519,17 +1526,23 @@ void NdkCamera::onImageAvailable(AImageReader* reader) } bool captureCompleted = false; + bool captureDispatchable = false; + size_t expectedTimes = mCaptureRequests.size() - 1; m_locker.lock(); captureCompleted = mCaptureResults.size() >= expectedTimes && mCaptureFrames.size() >= expectedTimes; + if (captureCompleted && !mCaptureDispatched) + { + mCaptureDispatched = true; + captureDispatchable = true; + } m_locker.unlock(); - if (captureCompleted) + if (captureCompleted && captureDispatchable) { FireBurstCapture(); } } - } } @@ -1914,6 +1927,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque ACameraMetadata* pCopy = ACameraMetadata_copy(result); bool captureCompleted = false; + bool captureDispatchable = false; size_t expectedTimes = mCaptureRequests.size() - 1; std::shared_ptr captureResult(pCopy, ACameraMetadata_free); @@ -1922,9 +1936,14 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque m_locker.lock(); mCaptureResults.push_back(captureResult); captureCompleted = !mOneFrame.empty(); + if (captureCompleted && !mCaptureDispatched) + { + mCaptureDispatched = true; + captureDispatchable = true; + } m_locker.unlock(); - if (captureCompleted) + if (captureCompleted && captureDispatchable) { onOneCapture(mCharacteristics, captureResult, mFinalLdr, ts - m_startTime, mOneFrame); } @@ -1934,9 +1953,14 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque m_locker.lock(); mCaptureResults.push_back(captureResult); captureCompleted = mCaptureFrames.size() >= expectedTimes && mCaptureResults.size() >= expectedTimes; + if (captureCompleted && !mCaptureDispatched) + { + mCaptureDispatched = true; + captureDispatchable = true; + } m_locker.unlock(); - if (captureCompleted) + if (captureCompleted && captureDispatchable) { FireBurstCapture(); } diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index e0844307..71ccfae5 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -232,6 +232,7 @@ protected: int32_t maxRegions[3]; bool mCaptureTriggered; + bool mCaptureDispatched; CAPTURE_RESULT mResult; unsigned long long m_startTime;