From 091dfc86f0627c9cdcbe82b250b1b2f4ee94bfea Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 9 Oct 2024 01:21:10 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=87=AA=E5=8A=A8=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 96 +++++++++++++++++++++++--- app/src/main/cpp/camera2/ndkcamera.h | 7 ++ 2 files changed, 92 insertions(+), 11 deletions(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 1f0fa55c..90413217 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -155,6 +155,11 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA mOutputTarget = NULL; mSessionOutput = NULL; + mImageReader2 = NULL; + mImageWindow2 = NULL; + mOutputTarget2 = NULL; + mSessionOutput2 = NULL; + camera_device = 0; capture_session_output_container = 0; @@ -165,6 +170,12 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA mResult = { 0 }; mLdr = ~0; mFinalLdr = 0; + mFinalBurstCaptures = m_params.burstCaptures; + if (mFinalBurstCaptures == 0) + { + mFinalBurstCaptures = 1; + } + mFinalOutputFormat = (m_params.burstRawCapture == 0) ? AIMAGE_FORMAT_YUV_420_888 : AIMAGE_FORMAT_RAW16; } NdkCamera::~NdkCamera() @@ -618,6 +629,25 @@ int NdkCamera::open(const std::string& cameraId) { status = ACaptureSessionOutputContainer_add(capture_session_output_container, mSessionOutput); + if (m_params.burstRawCapture == 1) // Auto + { + mstatus = AImageReader_new(foundRes.org_width(), foundRes.org_height(), AIMAGE_FORMAT_YUV_420_888, burstCaptures, &mImageReader2); + if (mstatus == AMEDIA_OK) + { + AImageReader_ImageListener listener; + listener.context = this; + listener.onImageAvailable = ::onImageAvailable; + mstatus = AImageReader_setImageListener(mImageReader2, &listener); + mstatus = AImageReader_getWindow(mImageReader2, &mImageWindow2); + ANativeWindow_acquire(mImageWindow2); + } + status = ACameraOutputTarget_create(mImageWindow2, &mOutputTarget2); + + status = ACaptureSessionOutput_create(mImageWindow2, &mSessionOutput2); + status = ACaptureSessionOutputContainer_add(capture_session_output_container, mSessionOutput2); + } + + CaptureRequest *request = CreateRequest(true); mCaptureRequests.push_back(request); #if 0 @@ -852,11 +882,12 @@ NdkCamera::CaptureRequest* NdkCamera::CreateRequest(bool isPreviewRequest) CaptureRequest *request = new CaptureRequest(); std::memset(request, 0, sizeof(CaptureRequest)); + bool autoSwitchToOneFrame = (m_params.burstRawCapture == 1) && (mFinalOutputFormat == AIMAGE_FORMAT_YUV_420_888); request->pThis = this; - request->imageReader = isPreviewRequest ? mPreviewImageReader : mImageReader; - request->imageWindow = isPreviewRequest ? mPreviewImageWindow : mImageWindow; - request->imageTarget = isPreviewRequest ? mPreviewOutputTarget : mOutputTarget; - request->sessionOutput = isPreviewRequest ? mPreviewSessionOutput : mSessionOutput; + request->imageReader = isPreviewRequest ? mPreviewImageReader : (autoSwitchToOneFrame ? mImageReader2 : mImageReader); + request->imageWindow = isPreviewRequest ? mPreviewImageWindow : (autoSwitchToOneFrame ? mImageWindow2 : mImageWindow); + request->imageTarget = isPreviewRequest ? mPreviewOutputTarget : (autoSwitchToOneFrame ? mOutputTarget2 : mOutputTarget); + request->sessionOutput = isPreviewRequest ? mPreviewSessionOutput : (autoSwitchToOneFrame ? mSessionOutput2 : mSessionOutput); request->templateId = isPreviewRequest ? TEMPLATE_PREVIEW : (ACameraDevice_request_template)m_params.requestTemplate; // mCaptureRequests.push_back(request); @@ -1130,6 +1161,28 @@ void NdkCamera::close() mImageReader = 0; } + if (mOutputTarget2 != NULL) + { + ACameraOutputTarget_free(mOutputTarget2); + mOutputTarget2 = 0; + } + + if (mImageWindow2 != NULL) + { + ANativeWindow_release(mImageWindow2); + mImageWindow2 = 0; + } + + if (mImageReader2 != NULL) + { + // AImageReader_setImageListener(image_reader, NULL); + //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str()); + AImageReader_delete(mImageReader2); + //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str()); + + mImageReader2 = 0; + } + if (mPreviewSessionOutput != NULL) { if (capture_session_output_container) @@ -1149,6 +1202,15 @@ void NdkCamera::close() ACaptureSessionOutput_free(mSessionOutput); mSessionOutput = 0; } + if (mSessionOutput2 != NULL) + { + if (capture_session_output_container) + { + ACaptureSessionOutputContainer_remove(capture_session_output_container, mSessionOutput2); + } + ACaptureSessionOutput_free(mSessionOutput2); + mSessionOutput2 = 0; + } if (capture_session_output_container) { @@ -1198,7 +1260,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) #endif avgY = avgY / (uint64_t)y_len; m_locker.lock(); - mLdr = avgY; + mLdr = (uint8_t)avgY; m_locker.unlock(); } @@ -1674,11 +1736,23 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque if (readyForCapture/* && mCaptureRequests.size() > 1*/) { - 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; + if (mLdr != ~0) + { + mFinalLdr = mLdr; + } + + XYLOG(XYLOG_SEVERITY_INFO, "Ready for Capture AFS=%u AES=%u AWBS=%u LDR=%u Time=%u", + (unsigned int)afState, (unsigned int)aeState, (unsigned int)awbState, mFinalLdr, (unsigned int)(ts - m_startTime)); + if (m_params.burstRawCapture == 1) + { + if (mFinalLdr > 50) + { + XYLOG(XYLOG_SEVERITY_WARNING, "Switch to OneFrame Capture(YUV) As LDR=%u", mFinalLdr); + mFinalOutputFormat = AIMAGE_FORMAT_YUV_420_888; + mFinalBurstCaptures = 1; + } + } uint32_t burstCaptures = getBurstCaptures(); if (burstCaptures == 0) @@ -1898,13 +1972,13 @@ bool NdkCamera::IsCameraAvailable(const std::string& cameraId) int32_t NdkCamera::getOutputFormat() const { - 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 mFinalOutputFormat; // return m_params.burstRawCapture ? AIMAGE_FORMAT_RAW16 : AIMAGE_FORMAT_YUV_420_888; } int32_t NdkCamera::getBurstCaptures() const { - return (m_params.burstRawCapture == 0) ? 1 : ((m_params.burstRawCapture != 1 || mFinalLdr <= 50) ? m_params.burstCaptures : 1); + return mFinalBurstCaptures; } void NdkCamera::CreateSession(ANativeWindow* previewWindow, diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index cdbeabb3..b25b20a7 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -249,6 +249,11 @@ protected: ACameraOutputTarget* mOutputTarget; ACaptureSessionOutput* mSessionOutput; + AImageReader* mImageReader2; + ANativeWindow* mImageWindow2; + ACameraOutputTarget* mOutputTarget2; + ACaptureSessionOutput* mSessionOutput2; + std::shared_ptr mCharacteristics; std::vector mCaptureRequests; @@ -256,6 +261,8 @@ protected: std::vector > mCaptureResults; uint32_t mLdr; uint32_t mFinalLdr; + uint32_t mFinalBurstCaptures; + int32_t mFinalOutputFormat; std::vector > mCaptureFrames; cv::Mat mOneFrame;