From 1c8372d5a2a818b674fbbd2320f6e61391e8c04f Mon Sep 17 00:00:00 2001 From: Matthew Date: Fri, 18 Apr 2025 10:03:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B0=83=E8=AF=95=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 159 +++++++++++++------------------ app/src/main/cpp/PhoneDevice.h | 2 + 2 files changed, 70 insertions(+), 91 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 231ad50b..71294fd1 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -2713,76 +2713,62 @@ bool CPhoneDevice::onOneCapture(std::shared_ptr characteristics CPhoneDevice* pThis = this; std::thread th([pThis, characteristics, result, photoInfo, osds, path, rgb, facing, sensorOrientation, ldr, duration, takingTime]() - { - std::string cameraInfo; - if (photoInfo.outputDbgInfo != 0) - { - NdkCamera::CAPTURE_RESULT captureResult = { 0 }; - NdkCamera::EnumCameraResult(result.get(), captureResult); - - char extimeunit[4] = { 0 }; - 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 AF=%u EXPS=%u%s(%d) ISO=%d AFS=%u AES=%u AWBS=%u SCENE=%d LDR=%d(%u) %0.1fx T=%u FD=%lld", - captureResult.autoExposure, captureResult.autoFocus, - extime, extimeunit, captureResult.compensation, captureResult.sensitivity, - // isnan(captureResult.FocusDistance) ? 0 : captureResult.FocusDistance, - (unsigned int)captureResult.afState, (unsigned int)captureResult.aeState, captureResult.awbState, - captureResult.sceneMode, GpioControl::getLightAdc(), ldr, captureResult.zoomRatio, - duration, captureResult.frameDuration); - cameraInfo = str; - } + { + std::string cameraInfo; + if (photoInfo.outputDbgInfo != 0) + { + cameraInfo = BuildCaptureResultInfo(result.get(), ldr, duration, false); + } #ifdef OUTPUT_DBG_INFO #if 0 - bool shouldRetry = false; - if (ldr != ~0) - { - if (ldr < MIN_LIGHT_Y) - { - if (photoInfo.retries < (DEFAULT_TAKE_PHOTO_RETRIES - 1)) - { - shouldRetry = true; - char presetBuf[16] = {0}; - snprintf(presetBuf, sizeof(presetBuf), "%02X", photoInfo.retries); - // replaceAll(fullPath, ".jpg", std::string("-") + std::to_string(photoInfo.retries) + ".jpg"); - replaceAll(fullPath, "_FF_", std::string("_") + presetBuf + std::string("_")); - XYLOG(XYLOG_SEVERITY_ERROR, "Photo is TOO dark or light(LDR=%u), will RETRY it", - (uint32_t) captureResult.avgY); +bool shouldRetry = false; +if (ldr != ~0) +{ + if (ldr < MIN_LIGHT_Y) + { + if (photoInfo.retries < (DEFAULT_TAKE_PHOTO_RETRIES - 1)) + { + shouldRetry = true; + char presetBuf[16] = {0}; + snprintf(presetBuf, sizeof(presetBuf), "%02X", photoInfo.retries); + // replaceAll(fullPath, ".jpg", std::string("-") + std::to_string(photoInfo.retries) + ".jpg"); + replaceAll(fullPath, "_FF_", std::string("_") + presetBuf + std::string("_")); + XYLOG(XYLOG_SEVERITY_ERROR, "Photo is TOO dark or light(LDR=%u), will RETRY it", + (uint32_t) captureResult.avgY); - // photoInfo.usingRawFormat = 1; - } - } - else if (ldr > MAX_LIGHT_Y) - { - if (photoInfo.retries < (DEFAULT_TAKE_PHOTO_RETRIES - 1)) - { - shouldRetry = true; - char presetBuf[16] = {0}; - snprintf(presetBuf, sizeof(presetBuf), "%02X", photoInfo.retries); - // replaceAll(fullPath, ".jpg", std::string("-") + std::to_string(photoInfo.retries) + ".jpg"); - replaceAll(fullPath, "_FF_", std::string("_") + presetBuf + std::string("_")); - XYLOG(XYLOG_SEVERITY_ERROR, "Photo is TOO dark or light(LDR=%u), will RETRY it", - (uint32_t) captureResult.avgY); - } + // photoInfo.usingRawFormat = 1; + } + } + else if (ldr > MAX_LIGHT_Y) + { + if (photoInfo.retries < (DEFAULT_TAKE_PHOTO_RETRIES - 1)) + { + shouldRetry = true; + char presetBuf[16] = {0}; + snprintf(presetBuf, sizeof(presetBuf), "%02X", photoInfo.retries); + // replaceAll(fullPath, ".jpg", std::string("-") + std::to_string(photoInfo.retries) + ".jpg"); + replaceAll(fullPath, "_FF_", std::string("_") + presetBuf + std::string("_")); + XYLOG(XYLOG_SEVERITY_ERROR, "Photo is TOO dark or light(LDR=%u), will RETRY it", + (uint32_t) captureResult.avgY); + } - photoInfo.compensation = -2 * ((int16_t) ((uint16_t) captureResult.avgY)); - } - } + photoInfo.compensation = -2 * ((int16_t) ((uint16_t) captureResult.avgY)); + } +} #endif // 0 #endif // OUTPUT_DBG_INFO - // Notify to take next photo - XYLOG(XYLOG_SEVERITY_INFO, "TP: Notofy to Take Next CUR Info: CH=%u PR=%u PHOTOID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.preset, (uint32_t)photoInfo.photoId); - pThis->TakePhotoCb(1, photoInfo, "", takingTime); + // Notify to take next photo + XYLOG(XYLOG_SEVERITY_INFO, "TP: Notofy to Take Next CUR Info: CH=%u PR=%u PHOTOID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.preset, (uint32_t)photoInfo.photoId); + pThis->TakePhotoCb(1, photoInfo, "", takingTime); - bool res = pThis->PostProcessPhoto(photoInfo, osds, path, cameraInfo, rgb); - if (res) - { - // TakePhotoCb(2, photoInfo, path, takingTime); - } - }); + bool res = pThis->PostProcessPhoto(photoInfo, osds, path, cameraInfo, rgb); + if (res) + { + // TakePhotoCb(2, photoInfo, path, takingTime); + } + }); th.detach(); @@ -2858,21 +2844,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi { if (!results.empty()) { - NdkCamera::CAPTURE_RESULT captureResult = { 0 }; - NdkCamera::EnumCameraResult(results[0].get(), captureResult); - - char extimeunit[4] = { 0 }; - 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 AF=%u EXPS=%u%s(%d) ISO=%d AFS=%u AES=%u AWBS=%u SCENE=%d LDR=%d(%u) %0.1fx T=%u FD=%lld BURST", - captureResult.autoExposure, captureResult.autoFocus, - extime, extimeunit, captureResult.compensation, captureResult.sensitivity, - // isnan(captureResult.FocusDistance) ? 0 : captureResult.FocusDistance, - (unsigned int)captureResult.afState, (unsigned int)captureResult.aeState, captureResult.awbState, - captureResult.sceneMode, GpioControl::getLightAdc(), ldr, captureResult.zoomRatio, - duration, captureResult.frameDuration); - cameraInfo = str; + cameraInfo = BuildCaptureResultInfo(results[0].get(), ldr, duration, true); } } @@ -3176,6 +3148,25 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi return true; } +std::string CPhoneDevice::BuildCaptureResultInfo(ACameraMetadata* result, uint32_t ldr, uint32_t duration, bool burst) +{ + NdkCamera::CAPTURE_RESULT captureResult = { 0 }; + NdkCamera::EnumCameraResult(result, captureResult); + + char extimeunit[4] = { 0 }; + unsigned int extime = (captureResult.exposureTime >= 1000000) ? ((unsigned int)(captureResult.exposureTime / 1000000)) : ((captureResult.exposureTime >= 1000) ? ((unsigned int)(captureResult.exposureTime / 1000)) : captureResult.exposureTime); + strcpy(extimeunit, (captureResult.exposureTime >= 1000000) ? "ms" : ((captureResult.exposureTime > 1000) ? "μs" : "ns")); + char str[128] = { 0 }; + snprintf(str, sizeof(str), "AE=%u AF=%u EXPS=%u%s(%d) ISO=%d AFS=%u AES=%u AWBS=%u SCENE=%d LDR=%d(%u) %0.1fx T=%u FD=%lld %s", + captureResult.autoExposure, captureResult.autoFocus, + extime, extimeunit, captureResult.compensation, captureResult.sensitivity, + // isnan(captureResult.FocusDistance) ? 0 : captureResult.FocusDistance, + (unsigned int)captureResult.afState, (unsigned int)captureResult.aeState, captureResult.awbState, + captureResult.sceneMode, GpioControl::getLightAdc(), ldr, captureResult.zoomRatio, + duration, captureResult.frameDuration, burst ? "BURST" : ""); + return std::string(str); +} + bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames) @@ -3365,21 +3356,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi { if (!results.empty()) { - NdkCamera::CAPTURE_RESULT captureResult = { 0 }; - NdkCamera::EnumCameraResult(results[0].get(), captureResult); - - char extimeunit[4] = { 0 }; - 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 AF=%u EXPS=%u%s(%d) ISO=%d AFS=%u AES=%u AWBS=%u SCENE=%d LDR=%d(%u) %0.1fx T=%u FD=%lld", - captureResult.autoExposure, captureResult.autoFocus, - extime, extimeunit, captureResult.compensation, captureResult.sensitivity, - // isnan(captureResult.FocusDistance) ? 0 : captureResult.FocusDistance, - (unsigned int)captureResult.afState, (unsigned int)captureResult.aeState, captureResult.awbState, - captureResult.sceneMode, GpioControl::getLightAdc(), ldr, captureResult.zoomRatio, - duration, captureResult.frameDuration); - cameraInfo = str; + cameraInfo = BuildCaptureResultInfo(results[0].get(), ldr, duration, false); } } diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index b76fc0c1..8b10faf3 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -363,6 +363,8 @@ protected: void ConvertDngToPng(const std::string& dngPath, const std::string& pngPath); void SetStaticIp(); + static std::string BuildCaptureResultInfo(ACameraMetadata* result, uint32_t ldr, uint32_t duration, bool burst); + protected: mutable std::mutex m_devLocker;