From 71f0852f1f7d36ad8ae8a7e55a9d1b51d6ebc30b Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 1 Mar 2025 11:57:36 +0800 Subject: [PATCH] =?UTF-8?q?=E9=81=BF=E5=85=8D=E4=B8=A4=E6=AC=A1=E8=B0=83?= =?UTF-8?q?=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 34 ++++++++++++++++++++++---- app/src/main/cpp/camera2/ndkcamera.h | 1 + 2 files changed, 30 insertions(+), 5 deletions(-) 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;