diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index b2542b87..1f0fa55c 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 mResult = { 0 }; mLdr = ~0; + mFinalLdr = 0; } NdkCamera::~NdkCamera() @@ -1206,7 +1207,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) } else { - uint32_t burstCaptures = m_params.burstCaptures; + uint32_t burstCaptures = getBurstCaptures(); if (burstCaptures == 0) { burstCaptures = 1; @@ -1219,7 +1220,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) // https://stackoverflow.com/questions/67063562 if (mstatus != AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE) { - if (mCaptureFrames.size() < m_params.burstCaptures) + if (mCaptureFrames.size() < burstCaptures) { XYLOG(XYLOG_SEVERITY_ERROR, "AImageReader_acquireNextImage error: %d", mstatus); } @@ -1324,7 +1325,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) if (captureCompleted) { - onOneCapture(mCharacteristics, result, mLdr, mOneFrame); + onOneCapture(mCharacteristics, result, mFinalLdr, mOneFrame); } } else @@ -1337,7 +1338,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) // https://stackoverflow.com/questions/67063562 if (mstatus != AMEDIA_IMGREADER_NO_BUFFER_AVAILABLE) { - if (mCaptureFrames.size() < m_params.burstCaptures) + if (mCaptureFrames.size() < burstCaptures) { XYLOG(XYLOG_SEVERITY_ERROR, "AImageReader_acquireNextImage error: %d", mstatus); } @@ -1676,6 +1677,9 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque XYLOG(XYLOG_SEVERITY_INFO, "Ready for Capture AFS=%u AES=%u AWBS=%u Time=%u", (unsigned int)afState, (unsigned int)aeState, (unsigned int)awbState, (unsigned int)(ts - m_startTime)); + // Must update mFinalLdr As getBurstCaptures getOutputFormat depends mFinalLdr + mFinalLdr = mLdr; + uint32_t burstCaptures = getBurstCaptures(); if (burstCaptures == 0) { @@ -1742,7 +1746,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque if (captureCompleted) { - onOneCapture(mCharacteristics, captureResult, mLdr, mOneFrame); + onOneCapture(mCharacteristics, captureResult, mFinalLdr, mOneFrame); } } else @@ -1769,7 +1773,7 @@ void NdkCamera::FireBurstCapture() std::vector > captureFrames; m_locker.lock(); - ldr = mLdr; + ldr = mFinalLdr; captureResults.swap(mCaptureResults); captureFrames.swap(mCaptureFrames); m_locker.unlock(); @@ -1894,12 +1898,13 @@ bool NdkCamera::IsCameraAvailable(const std::string& cameraId) int32_t NdkCamera::getOutputFormat() const { - return m_params.burstRawCapture ? AIMAGE_FORMAT_RAW16 : AIMAGE_FORMAT_YUV_420_888; + return (m_params.burstRawCapture == 0) ? AIMAGE_FORMAT_YUV_420_888 : ((m_params.burstRawCapture != 1 || mFinalLdr <= 50) ? AIMAGE_FORMAT_RAW16 : AIMAGE_FORMAT_YUV_420_888); + // return m_params.burstRawCapture ? AIMAGE_FORMAT_RAW16 : AIMAGE_FORMAT_YUV_420_888; } int32_t NdkCamera::getBurstCaptures() const { - return m_params.burstRawCapture ? m_params.burstCaptures : 1; + return (m_params.burstRawCapture == 0) ? 1 : ((m_params.burstRawCapture != 1 || mFinalLdr <= 50) ? m_params.burstCaptures : 1); } void NdkCamera::CreateSession(ANativeWindow* previewWindow, diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index a09b5ee6..cdbeabb3 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -81,8 +81,8 @@ public: unsigned int orientation:3; unsigned int zoom : 1; unsigned int wait3ALocked : 3; - unsigned int burstRawCapture : 1; - unsigned int reserved : 18; + unsigned int burstRawCapture : 2; + unsigned int reserved : 16; int64_t exposureTime; unsigned int sensitivity; int compensation; @@ -183,7 +183,7 @@ public: uint32_t GetLdr() const { - return mLdr; + return mFinalLdr; } bool IsCameraAvailable(const std::string& cameraId); @@ -255,6 +255,7 @@ protected: std::shared_ptr mPreviewResults; std::vector > mCaptureResults; uint32_t mLdr; + uint32_t mFinalLdr; std::vector > mCaptureFrames; cv::Mat mOneFrame;