From e6280af46b5f0f024c8b22da3ac0287bc464e418 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 21 Jul 2024 14:38:37 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AD=89=E5=BE=85=E9=94=81=E5=AE=9A=E5=88=86?= =?UTF-8?q?=E5=BC=80=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 24 +++++++++++++++++------- app/src/main/cpp/camera2/ndkcamera.h | 8 ++++---- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index b462ab83..ef748e10 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -125,6 +125,7 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA sceneModeSupported = false; numberOfPrecaptures = 0; + m_precaptureStartTime = 0; activeArraySize[0] = 0; activeArraySize[1] = 0; @@ -623,11 +624,11 @@ int NdkCamera::open(const std::string& cameraId) { // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_AUTO; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_MODE, 1, &afMode); - uint8_t trig = ACAMERA_CONTROL_AF_TRIGGER_CANCEL; + // uint8_t trig = ACAMERA_CONTROL_AF_TRIGGER_CANCEL; // status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); - trig = ACAMERA_CONTROL_AF_TRIGGER_START; - status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); + // trig = ACAMERA_CONTROL_AF_TRIGGER_START; + // status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); } if (status == ACAMERA_OK) { @@ -704,6 +705,7 @@ int NdkCamera::open(const std::string& cameraId) { uint8_t aePrecatureTrigger = ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER_START; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER, 1, &aePrecatureTrigger); XYLOG(XYLOG_SEVERITY_DEBUG, "Trigger PRECAPTURE status=%d", (int)status); + m_precaptureStartTime = m_startTime; if (status == ACAMERA_OK) { m_imagesCaptured = ~0; @@ -806,6 +808,8 @@ int NdkCamera::open(const std::string& cameraId) { } m_startTime = GetMicroTimeStamp(); + + m_precaptureStartTime = m_startTime; } return status == ACAMERA_OK ? 0 : 1; @@ -1242,6 +1246,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AWB_MODE, &val); mResult.awbMode = (status == ACAMERA_OK) ? *(val.data.u8) : ACAMERA_CONTROL_AWB_MODE_OFF; + unsigned long long ts = GetMicroTimeStamp(); XYLOG(XYLOG_SEVERITY_DEBUG, "3ASTATE: AES=%u AWBS=%u AFS=%u", (uint32_t)mResult.aeState, (uint32_t)mResult.awbState, (uint32_t)mResult.afState); if (m_params.autoExposure != 0) @@ -1249,7 +1254,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque if (mResult.aeState == ACAMERA_CONTROL_AE_STATE_SEARCHING) { numberOfPrecaptures ++; - if (numberOfPrecaptures > 50) + if (numberOfPrecaptures > 8 && ((ts - m_precaptureStartTime) > 2000)) { uint8_t aePrecatureTrigger = ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER_CANCEL; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER, 1, &aePrecatureTrigger); @@ -1259,11 +1264,13 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque XYLOG(XYLOG_SEVERITY_WARNING, "Retrigger PRECAPTURE status=%d AES=%u", (int)status, (unsigned int)mResult.aeState); numberOfPrecaptures = 0; + m_precaptureStartTime = ts; } } else { numberOfPrecaptures = 0; + m_precaptureStartTime = ts; } if (mResult.aeState == ACAMERA_CONTROL_AE_STATE_PRECAPTURE) { @@ -1273,6 +1280,9 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque aePrecatureTrigger = ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER_START; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER, 1, &aePrecatureTrigger); XYLOG(XYLOG_SEVERITY_DEBUG, "Trigger PRECAPTURE status=%d AES=%u", (int)status, (unsigned int)mResult.aeState); + + numberOfPrecaptures = 0; + m_precaptureStartTime = ts; } } @@ -1297,7 +1307,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque if (m_imagesCaptured == ~0) { - unsigned long long ts = GetMicroTimeStamp(); + if (ts - m_startTime >= m_params.focusTimeout * 2) { XYLOG(XYLOG_SEVERITY_WARNING, "Prepare Capture Timeout for 3A And will Capture AFS=%u AES=%u AWBS=%u Time=%u", @@ -1308,7 +1318,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque { if (awbMode == ACAMERA_CONTROL_AWB_MODE_AUTO) { - if (awbLockAvailable && m_params.wait3ALocked) + if (awbLockAvailable && (m_params.wait3ALocked & WAIT_AWB_LOCKED)) { if (mResult.awbState != ACAMERA_CONTROL_AWB_STATE_LOCKED) { @@ -1334,7 +1344,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque if (m_params.autoExposure != 0) { - if (aeLockAvailable && m_params.wait3ALocked) + if (aeLockAvailable && (m_params.wait3ALocked & WAIT_AE_LOCKED)) { if (mResult.aeState != ACAMERA_CONTROL_AE_STATE_LOCKED) { diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 40841ea4..b4657e0a 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -73,17 +73,16 @@ public: unsigned int autoFocus : 1; unsigned int autoExposure : 1; unsigned int orientation:3; - unsigned int focusTimeout : 14; // milli-seconds 65535 / 4 unsigned int zoom : 1; - unsigned int wait3ALocked : 1; - unsigned int reserved : 6; + unsigned int wait3ALocked : 3; + unsigned int reserved : 18; int64_t exposureTime; unsigned int sensitivity; int compensation; float zoomRatio; uint8_t requestTemplate; uint8_t awbMode; - + unsigned short focusTimeout; // milli-seconds 65535 }; struct CAPTURE_RESULT @@ -156,6 +155,7 @@ protected: bool awbLockAvailable; uint64_t numberOfPrecaptures; + unsigned long long m_precaptureStartTime; bool lightDetected; // int64_t exposureTime_;