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;