From 5aa79e7f5439919c5569bbfe4423b10ca00e33b1 Mon Sep 17 00:00:00 2001 From: BlueMatthew Date: Fri, 5 Jan 2024 23:04:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=BE=E4=B8=80=E4=B8=AA=E6=9C=80=E6=8E=A5?= =?UTF-8?q?=E8=BF=91=E7=9A=84=E5=88=86=E8=BE=A8=E7=8E=87=E6=8B=8D=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 记录照片的参数 --- app/src/main/cpp/camera2/ndkcamera.cpp | 39 ++++++++++++++++++++++++-- app/src/main/cpp/camera2/ndkcamera.h | 16 ++++++++--- 2 files changed, 49 insertions(+), 6 deletions(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 29eb6d3a..160ae03d 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -184,6 +184,10 @@ int NdkCamera::open(const std::string& cameraId) { // DisplayDimension foundRes(4000, 4000); // DisplayDimension maxJPG(0, 0); + unsigned long long minRatio = -1; + DisplayDimension temp; + unsigned long long pixels = (unsigned long long)mWidth * mHeight; + for (int i = 0; i < e.count; i += 4) { int32_t input = e.data.i32[i + 3]; @@ -193,7 +197,17 @@ int NdkCamera::open(const std::string& cameraId) { if (format == AIMAGE_FORMAT_YUV_420_888 || format == AIMAGE_FORMAT_JPEG) { DisplayDimension res(e.data.i32[i + 1], e.data.i32[i + 2]); - if (!disp.IsSameRatio(res)) continue; + if (!disp.IsSameRatio(res)) + { + unsigned long long ps = res.width() * res.height(); + unsigned long long ratio = (ps >= pixels) ? (ps - pixels) : (pixels - ps); + if (ratio < minRatio) + { + temp = res; + minRatio = ratio; + } + continue; + } if (format == AIMAGE_FORMAT_YUV_420_888 && res > disp) { @@ -204,6 +218,12 @@ int NdkCamera::open(const std::string& cameraId) { }*/ } } + + if (!foundIt) + { + foundRes = temp; + foundIt = true; + } } { @@ -723,15 +743,21 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque } } + if (m_imagesCaptured != 0) + { + return; + } + val = { 0 }; status = ACameraMetadata_getConstEntry(result, ACAMERA_SENSOR_EXPOSURE_TIME, &val); int64_t exTime = (status == ACAMERA_OK) ? val.data.i64[0] : -1; + mResult.exposureTime = exTime; 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 }; float focusDistance = NAN; @@ -743,6 +769,15 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque focusDistance = *val.data.f; } } + mResult.FocusDistance = focusDistance; + + val = {0}; + status = ACameraMetadata_getConstEntry(result, ACAMERA_SENSOR_SENSITIVITY, &val); + mResult.sensitibity = *(val.data.i32); + + val = {0}; + status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_SCENE_MODE, &val); + mResult.hdrMode = (*(val.data.u8) == ACAMERA_CONTROL_SCENE_MODE_HDR) ? 1 : 0; ALOGD("onCaptureCompleted EXPOSURE_TIME=%lld, FocusDis=%f camera id=%s, AE=%s AF_STATE=%u", exTime, focusDistance, mCameraId.c_str(), ((aeMode == 1) ? "ON" : "OFF"), afState); diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 1bf20ca6..99344315 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -50,11 +50,13 @@ public: struct CAPTURE_RESULT { - unsigned char autoFocus; - unsigned char autoExposure; - unsigned long exposureTime; + uint8_t autoFocus; + uint8_t autoExposure; + int64_t exposureTime; float FocusDistance; - unsigned int sensitibity; + int32_t sensitibity; + uint8_t hdrMode; + }; NdkCamera(int32_t width, int32_t height, const CAMERA_PARAMS& params); @@ -71,6 +73,12 @@ public: void onCaptureCompleted(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result); + const CAPTURE_RESULT& getCaptureResult() const + { + return mResult; + } + + public: CAMERA_PARAMS m_params; int camera_facing;