From fbc9b1a53df0e834e3ce0889aba941881437d3bd Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 21 Jul 2024 18:12:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A03A=E6=80=BB=E6=8E=A7=E5=BC=80?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 5 ++-- app/src/main/cpp/camera2/ndkcamera.cpp | 32 +++++++++++++++++++++++++- app/src/main/cpp/camera2/ndkcamera.h | 5 +++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index d0f03c7d..d6f7113a 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1554,7 +1554,7 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) unsigned int extime = (captureResult.exposureTime >= 1000000) ? ((unsigned int)(captureResult.exposureTime / 1000000)) : ((unsigned int)(captureResult.exposureTime / 1000)); strcpy(extimeunit, (captureResult.exposureTime >= 1000000) ? "ms" : "μs"); char str[128] = { 0 }; - snprintf(str, sizeof(str), "AE=%u EXPS=%u%s(%d) ISO=%d AF=%u LDR=%d(%u) AFS=%u AES=%u SCENE=%d AWBS=%u %0.1fx T=%u", captureResult.autoExposure, + snprintf(str, sizeof(str), "AE=%u EXPS=%u%s(%d) ISO=%d AF=%u LDR=%d(%u) AFS=%u AES=%u SCENE=%d AWBS=%u %0.1fx T=%u FD=%lld", captureResult.autoExposure, extime, extimeunit, captureResult.compensation, captureResult.sensitivity, captureResult.autoFocus, @@ -1563,7 +1563,8 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) (unsigned int)captureResult.afState, (unsigned int)captureResult.aeState, captureResult.sceneMode, - captureResult.awbState, captureResult.zoomRatio, (uint32_t)captureResult.duration); + captureResult.awbState, captureResult.zoomRatio, (uint32_t)captureResult.duration, + captureResult.frameDuration); // cv::putText(mat, str, cv::Point(0, mat.rows - 20), cv::FONT_HERSHEY_COMPLEX, fontScale, scalar, thickness1, cv::LINE_AA); int fs = fontSize * 2 / 3; diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index ef748e10..8ca866eb 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -117,6 +117,7 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA m_imagesCaptured = ~0; + maxFrameDuration = 0; afSupported = false; awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO; aeLockAvailable = false; @@ -483,6 +484,12 @@ int NdkCamera::open(const std::string& cameraId) { } } + { + ACameraMetadata_const_entry e = {0}; + status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_SENSOR_INFO_MAX_FRAME_DURATION, &e); + maxFrameDuration = (status == ACAMERA_OK) ? *e.data.i64 : 0; + } + { ACameraMetadata_const_entry val = {0}; status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE, &val); @@ -587,6 +594,9 @@ int NdkCamera::open(const std::string& cameraId) { status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_CONTROL_AE_TARGET_FPS_RANGE,2,fpsRange); } + uint8_t ctrlMode = sceneModeSupported ? ACAMERA_CONTROL_MODE_USE_SCENE_MODE : ACAMERA_CONTROL_MODE_AUTO; + status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_MODE, 1, &ctrlMode); + uint8_t flashMode = ACAMERA_FLASH_MODE_OFF; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_FLASH_MODE, 1, &flashMode); @@ -730,6 +740,10 @@ int NdkCamera::open(const std::string& cameraId) { status = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exposureTime); } + + int64_t frameDuration = maxFrameDuration / 2; + status = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_FRAME_DURATION, 1, &frameDuration); + } // TODO: // m_imagesCaptured = 0; @@ -951,11 +965,19 @@ void NdkCamera::onImageAvailable(AImageReader* reader) // XYLOG(XYLOG_SEVERITY_DEBUG, "m_imagesCaptured=%u wait for next image", m_imagesCaptured); // Not Ready Or Taken AImage_delete(image); + /* if (m_imagesCaptured != ~0) + { + XYLOG(XYLOG_SEVERITY_DEBUG, "Skip Image index=%u", m_imagesCaptured); + m_imagesCaptured++; + } + */ return; } mResult.duration = GetMicroTimeStamp() - m_startTime; + mFinalResult = mResult; + int32_t format; AImage_getFormat(image, &format); @@ -1408,12 +1430,20 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque int64_t exTime = (status == ACAMERA_OK) ? val.data.i64[0] : -1; mResult.exposureTime = exTime; + val = {0}; + status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AF_MODE, &val); + mResult.autoFocus = (status == ACAMERA_OK) ? *(val.data.u8) : 0; + val = { 0 }; status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AE_MODE, &val); uint8_t aeMode = (status == ACAMERA_OK) ? val.data.u8[0] : 0; - // ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity_); mResult.autoExposure = aeMode; + val = { 0 }; + status = ACameraMetadata_getConstEntry(result, ACAMERA_SENSOR_FRAME_DURATION, &val); + int64_t frameDuration = (status == ACAMERA_OK) ? val.data.i64[0] : 0; + mResult.frameDuration = frameDuration; + val = { 0 }; float focusDistance = NAN; if (afSupported && (m_params.autoFocus != 0)) diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 90ce0970..733f577b 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -105,6 +105,7 @@ public: float zoomRatio; uint8_t avgY; uint64_t duration; + int64_t frameDuration; uint8_t awbLockSetted : 1; uint8_t aeLockSetted : 1; @@ -134,7 +135,7 @@ public: const CAPTURE_RESULT& getCaptureResult() const { - return mResult; + return mFinalResult; } bool IsCameraAvailable(const std::string& cameraId); @@ -152,6 +153,7 @@ protected: int32_t mHeight; std::string mCameraId; + int64_t maxFrameDuration; bool sceneModeSupported; bool afSupported; uint8_t awbMode; @@ -174,6 +176,7 @@ protected: unsigned int m_imagesCaptured; CAPTURE_RESULT mResult; + CAPTURE_RESULT mFinalResult; unsigned long long m_startTime; protected: