From f70d1f90eac909270676008497c9581521725525 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 9 May 2024 17:49:52 +0800 Subject: [PATCH 01/23] =?UTF-8?q?=E5=A2=9E=E5=8A=A0%?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index cd423bae..8fd64279 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1221,7 +1221,7 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) it->label, item.name.c_str(), it->x, it->y, it->w, it->h, pt.x, pt.y, textSize.width, textSize.height); ALOGI(buf); #endif - ft2->putText(mat, item.name + std::to_string((int)(it->prob * 100.0)), pt, fontSize, textColor, thickness, cv::LINE_AA, false, true); + ft2->putText(mat, item.name + std::to_string((int)(it->prob * 100.0)) + "%", pt, fontSize, textColor, thickness, cv::LINE_AA, false, true); } ++it; } From e5443c6040e704417cb4062d7823abee0e831405 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 9 May 2024 18:58:45 +0800 Subject: [PATCH 02/23] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=90=8D=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 6 +++--- app/src/main/cpp/camera2/ndkcamera.cpp | 4 ++-- app/src/main/cpp/camera2/ndkcamera.h | 2 +- .../main/java/com/xypower/mpapp/ChannelActivity.java | 6 ++++-- app/src/main/res/layout/activity_channel.xml | 10 ++++++++++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 8fd64279..5dc5b482 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -931,19 +931,19 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< params.autoExposure = mPhotoInfo.autoExposure; params.focusTimeout = mPhotoInfo.focusTimeout * 1000; params.exposureTime = mPhotoInfo.exposureTime; - params.sensibility = mPhotoInfo.sensibility; + params.sensitivity = mPhotoInfo.sensitivity; params.compensation = mPhotoInfo.compensation; params.orientation = mPhotoInfo.orientation; params.zoom = mPhotoInfo.zoom; params.zoomRatio = mPhotoInfo.zoomRatio; - if (photoInfo.channel == 2 || photoInfo.channel == 3) + if (photoInfo.ldrEnabled) { if (GpioControl::getLightAdc() > 1400) { params.autoExposure = 0; params.exposureTime = 1200; - params.sensibility = 1200; + params.sensitivity = 1200; } } diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index ca0ff101..6259a7bd 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -534,9 +534,9 @@ int NdkCamera::open(const std::string& cameraId) { uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_OFF; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_MODE, 1, &aeMode); - if (m_params.sensibility > 0) + if (m_params.sensitivity > 0) { - int32_t sensitivity = m_params.sensibility; + int32_t sensitivity = m_params.sensitivity; status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity); } if (m_params.exposureTime > 0) diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 246287b7..0c943cda 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -77,7 +77,7 @@ public: unsigned int zoom; unsigned int reserved : 7; unsigned int exposureTime; // ms - unsigned int sensibility; + unsigned int sensitivity; int compensation; float zoomRatio; }; diff --git a/app/src/main/java/com/xypower/mpapp/ChannelActivity.java b/app/src/main/java/com/xypower/mpapp/ChannelActivity.java index 91f19f46..9fb165ca 100644 --- a/app/src/main/java/com/xypower/mpapp/ChannelActivity.java +++ b/app/src/main/java/com/xypower/mpapp/ChannelActivity.java @@ -150,6 +150,7 @@ public class ChannelActivity extends AppCompatActivity { binding.btnUsbCamera.setChecked(jsonObject.optInt("usbCamera", 0) == 1); binding.btnAutoExplosure.setChecked(jsonObject.optInt("autoExposure", 1) == 1); binding.btnAutoFocus.setChecked(jsonObject.optInt("autoFocus", 1) == 1); + binding.ldrEnabled.setChecked(jsonObject.optInt("ldrEnabled", 0) == 1); // binding.btnHdrMode.setChecked(jsonObject.optInt("hdrMode", 0) == 1); // binding.btnNightMode.setChecked(jsonObject.optInt("nightMode", 0) == 1); int sceneMode = jsonObject.optInt("sceneMode", 0); @@ -162,7 +163,7 @@ public class ChannelActivity extends AppCompatActivity { } } binding.exposuretime.setText(Integer.toString(jsonObject.optInt("exposureTime", 0))); - binding.sensitivity.setText(Integer.toString(jsonObject.optInt("sensibility", 0))); + binding.sensitivity.setText(Integer.toString(jsonObject.optInt("sensitivity", 0))); binding.btnZoom.setChecked(jsonObject.optInt("zoom", 0) == 1); if (jsonObject.has("compensation")) { binding.compensation.setText(Integer.toString(jsonObject.optInt("compensation", 0))); @@ -254,6 +255,7 @@ public class ChannelActivity extends AppCompatActivity { jsonObject.put("usbCamera", binding.btnUsbCamera.isChecked() ? 1 : 0); jsonObject.put("autoExposure", binding.btnAutoExplosure.isChecked() ? 1 : 0); jsonObject.put("autoFocus", binding.btnAutoFocus.isChecked() ? 1 : 0); + jsonObject.put("ldrEnabled", binding.ldrEnabled.isChecked() ? 1 : 0); // jsonObject.put("hdrMode", binding.btnHdrMode.isChecked() ? 1 : 0); // jsonObject.put("nightMode", binding.btnNightMode.isChecked() ? 1 : 0); int sceneMode = 0; @@ -262,7 +264,7 @@ public class ChannelActivity extends AppCompatActivity { sceneMode = Integer.parseInt(sceneModeText); jsonObject.put("sceneMode", sceneMode); jsonObject.put("exposureTime", Integer.parseInt(binding.exposuretime.getText().toString())); - jsonObject.put("sensibility", Integer.parseInt(binding.sensitivity.getText().toString())); + jsonObject.put("sensitivity", Integer.parseInt(binding.sensitivity.getText().toString())); jsonObject.put("zoom", binding.btnZoom.isChecked() ? 1 : 0); jsonObject.put("orientation", binding.orientations.getSelectedItemPosition()); jsonObject.put("recognization", binding.recognization.getSelectedItemPosition()); diff --git a/app/src/main/res/layout/activity_channel.xml b/app/src/main/res/layout/activity_channel.xml index 07f79765..45f4db33 100644 --- a/app/src/main/res/layout/activity_channel.xml +++ b/app/src/main/res/layout/activity_channel.xml @@ -267,6 +267,16 @@ app:layout_constraintTop_toTopOf="@+id/textViewCompensation" app:layout_constraintBottom_toBottomOf="@+id/textViewCompensation" /> + + + USB Camera 短视频时长(秒) 曝光补偿 + 光敏控制 Hello blank fragment Record From 9d399cd8e08460cb5ac820af59c0c775f077b2bb Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 11 May 2024 10:47:11 +0800 Subject: [PATCH 03/23] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Y=E5=88=86=E9=87=8F?= =?UTF-8?q?=E7=9A=84=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 4 ++-- app/src/main/cpp/camera2/ndkcamera.cpp | 8 ++++++++ app/src/main/cpp/camera2/ndkcamera.h | 1 + 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 5dc5b482..62072b95 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1237,12 +1237,12 @@ 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" : "ns"); char str[128] = { 0 }; - snprintf(str, sizeof(str), "AE=%u EXPS=%u%s(%d) ISO=%d AF=%u LDR=%d AFS=%u AES=%u SCENE=%d AWB=%u %0.1fx", 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 AWB=%u %0.1fx", captureResult.autoExposure, extime, extimeunit, captureResult.compensation, captureResult.sensitibity, captureResult.autoFocus, // isnan(captureResult.FocusDistance) ? 0 : captureResult.FocusDistance, - GpioControl::getLightAdc(), + GpioControl::getLightAdc(), (unsigned int)captureResult.avgY, (unsigned int)captureResult.afState, (unsigned int)captureResult.aeState, captureResult.sceneMode, diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 6259a7bd..b4c4993e 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -16,6 +16,7 @@ #include #include +#include #include #include #include @@ -738,6 +739,13 @@ void NdkCamera::onImageAvailable(AImageReader* reader) AImage_getPlaneData(image, 1, &u_data, &u_len); AImage_getPlaneData(image, 2, &v_data, &v_len); +#if __cplusplus >= 201703L + uint64_t avgy = std::reduce(y_data, y_data + y_len, 0) / y_len; +#else + uint64_t avgy = std::accumulate(y_data, y_data + y_len, 0) / y_len; +#endif + mResult.avgY = avgy; + if (u_data == v_data + 1 && v_data == y_data + width * height && y_pixelStride == 1 && u_pixelStride == 2 && v_pixelStride == 2 && y_rowStride == width && u_rowStride == width && v_rowStride == width) { // already nv21 :) diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 0c943cda..10533858 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -95,6 +95,7 @@ public: int32_t compensation; uint8_t sceneMode; float zoomRatio; + uint8_t avgY; }; NdkCamera(int32_t width, int32_t height, const CAMERA_PARAMS& params); From 0702e39c262fc42b52c509d5ba5021a86316c179 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 11 May 2024 11:12:28 +0800 Subject: [PATCH 04/23] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 62072b95..4d0dfcd3 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -904,6 +904,11 @@ IDevice::timer_uid_t CPhoneDevice::RegisterHeartbeat(unsigned int timerType, uns bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector& osds, const std::string& path) { + if (photoInfo.width == 0 || photoInfo.height == 0) + { + XYLOG(XYLOG_SEVERITY_ERROR, "TP: Invalid Size: (%u-%u) PHOTOID=%u", (unsigned int)photoInfo.width, (unsigned int)photoInfo.height, photoInfo.photoId); + return false; + } if (m_threadClose.joinable()) { XYLOG(XYLOG_SEVERITY_INFO, "TP: Wait Prev Thread CH=%u PR=%X PHOTOID=%u", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); From ce82f64e6e14da6f3cfe69cf1ce55c2f1b62f0af Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 11 May 2024 11:12:41 +0800 Subject: [PATCH 05/23] =?UTF-8?q?=E8=AE=A1=E7=AE=97Y=E5=88=86=E9=87=8F?= =?UTF-8?q?=E5=B9=B3=E5=9D=87=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index b4c4993e..e9c0d7f1 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -740,11 +740,11 @@ void NdkCamera::onImageAvailable(AImageReader* reader) AImage_getPlaneData(image, 2, &v_data, &v_len); #if __cplusplus >= 201703L - uint64_t avgy = std::reduce(y_data, y_data + y_len, 0) / y_len; + uint64_t avgy = std::reduce(y_data, y_data + y_len, 0); #else - uint64_t avgy = std::accumulate(y_data, y_data + y_len, 0) / y_len; + uint64_t avgy = std::accumulate(y_data, y_data + y_len, 0); #endif - mResult.avgY = avgy; + mResult.avgY = avgy / y_len; if (u_data == v_data + 1 && v_data == y_data + width * height && y_pixelStride == 1 && u_pixelStride == 2 && v_pixelStride == 2 && y_rowStride == width && u_rowStride == width && v_rowStride == width) { From 29c244bccd0fdcc596806f48225edba29c68ef1e Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 11 May 2024 13:16:08 +0800 Subject: [PATCH 06/23] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BF=9D=E6=B4=BB?= =?UTF-8?q?=E6=A3=80=E6=B5=8B=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xypower/mpmaster/MpMasterService.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java index e6dc516c..8b805106 100644 --- a/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java +++ b/mpmaster/src/main/java/com/xypower/mpmaster/MpMasterService.java @@ -350,12 +350,14 @@ public class MpMasterService extends Service { return; } - File mpappDb = new File(appPath + "data/App.db"); - long modifiedTimeOfDb = 0; - if (mpappDb.exists()) { - modifiedTimeOfDb = mpappDb.lastModified(); - } - if ((ts - modifiedTimeOfDb) > mTimeOfMpAppAlive) { + File mpappHb = new File(appPath + "data/alive/hb"); + long modifiedTimeOfHb = getFileModificationTime(appPath + "data/alive/hb"); + long modifiedTimeOfPhoto = getFileModificationTime(appPath + "data/alive/taking"); + long modifiedTimeOfUpload = getFileModificationTime(appPath + "data/alive/upload"); + + if (((ts - modifiedTimeOfHb) > mTimeOfMpAppAlive) || + ((ts - modifiedTimeOfPhoto) > mTimeOfMpAppAlive * 4) || + ((ts - modifiedTimeOfUpload) > mTimeOfMpAppAlive * 4)) { // greater than 30m logger.warning("Start MpAPP as it is NOT running"); MicroPhotoContext.restartMpApp(context); @@ -366,6 +368,16 @@ public class MpMasterService extends Service { } } + long getFileModificationTime(String path) { + File file = new File(path); + long mt = 0; + if (file.exists()) { + mt = file.lastModified(); + } + + return mt; + } + public String getMpAppVersion() { if (TextUtils.isEmpty(mMpAppVersion)) { PackageManager packageManager = getPackageManager(); From 8662d89d428cdca454f95276fb5dc9804f7c9e5e Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 11 May 2024 13:17:48 +0800 Subject: [PATCH 07/23] Update MpMaster version to 1.0.34 --- mpmaster/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mpmaster/build.gradle b/mpmaster/build.gradle index 348364fc..779aee5e 100644 --- a/mpmaster/build.gradle +++ b/mpmaster/build.gradle @@ -4,7 +4,7 @@ plugins { def AppMajorVersion = 1 def AppMinorVersion = 0 -def AppBuildNumber = 33 +def AppBuildNumber = 34 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From 90189fb068c5b2698fa243ac5e67cb06f7707c67 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 11 May 2024 13:18:57 +0800 Subject: [PATCH 08/23] Update version to 1.0.134 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 9ac42bd3..a5add932 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 0 -def AppBuildNumber = 133 +def AppBuildNumber = 134 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From 44cf3ba3c48c1466a9972a8198b03e064ca5817d Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 11 May 2024 18:26:13 +0800 Subject: [PATCH 09/23] =?UTF-8?q?=E8=BE=93=E5=87=BAAI=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 4d0dfcd3..b6e21b00 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1220,11 +1220,11 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) pt.x = it->x + it->w - textSize.width; } -#ifdef _DEBUG +#ifdef OUTPUT_CAMERA_DBG_INFO char buf[128]; - snprintf(buf, sizeof(buf), "Draw Label: %d=%s (%f,%f)-(%f,%f) Text:(%d,%d)-(%d,%d)", + snprintf(buf, sizeof(buf), "AI: %d=%s (%f,%f)-(%f,%f) Text:(%d,%d)-(%d,%d)", it->label, item.name.c_str(), it->x, it->y, it->w, it->h, pt.x, pt.y, textSize.width, textSize.height); - ALOGI(buf); + XYLOG(XYLOG_SEVERITY_DEBUG, buf); #endif ft2->putText(mat, item.name + std::to_string((int)(it->prob * 100.0)) + "%", pt, fontSize, textColor, thickness, cv::LINE_AA, false, true); } From cda743341626cbdc31783d20de316e0569f3ccab Mon Sep 17 00:00:00 2001 From: Matthew Date: Sat, 11 May 2024 18:26:24 +0800 Subject: [PATCH 10/23] Update version to 1.0.135 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index a5add932..bcafab7f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 0 -def AppBuildNumber = 134 +def AppBuildNumber = 135 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From 4cc84c2b5a89c5b7c80769a7761999e12d0124f8 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 00:25:55 +0800 Subject: [PATCH 11/23] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=9B=9D=E5=85=89?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F=E5=92=8C=E5=AF=B9=E7=84=A6=E5=8C=BA=E5=9F=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 140 +++++++++++++++++++++++-- app/src/main/cpp/camera2/ndkcamera.h | 4 + 2 files changed, 137 insertions(+), 7 deletions(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index e9c0d7f1..236fd4c8 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -123,6 +123,13 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA sceneModeSupported = false; + activeArraySize[0] = 0; + activeArraySize[1] = 0; + + maxRegions[0] = 0; + maxRegions[1] = 0; + maxRegions[2] = 0; + camera_manager_cb.context = this; camera_manager_cb.onCameraAvailable = ::onAvailabilityCallback; camera_manager_cb.onCameraUnavailable = ::onUnavailabilityCallback; @@ -137,6 +144,8 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA capture_session = 0; captureSequenceId = 0; + lightDetected = false; + mResult = { 0 }; } @@ -394,6 +403,27 @@ int NdkCamera::open(const std::string& cameraId) { } } + { + ACameraMetadata_const_entry val = {0}; + status = ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_SENSOR_INFO_ACTIVE_ARRAY_SIZE, &val); + if (status == ACAMERA_OK) + { + activeArraySize[0] = val.data.i32[2]; + activeArraySize[1] = val.data.i32[3]; + } + } + + { + ACameraMetadata_const_entry val = {0}; + status = ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_CONTROL_MAX_REGIONS, &val); + if (status == ACAMERA_OK) + { + maxRegions[0] = val.data.i32[0]; + maxRegions[1] = val.data.i32[1]; + maxRegions[2] = val.data.i32[2]; + } + } + { ACameraMetadata_const_entry e = {0}; status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_CONTROL_AVAILABLE_SCENE_MODES, &e); @@ -456,7 +486,7 @@ int NdkCamera::open(const std::string& cameraId) { : TEMPLATE_STILL_CAPTURE; status = ACameraDevice_createCaptureRequest(camera_device, templateId, &capture_request); - int32_t fpsRange[2] = {1,1}; + int32_t fpsRange[2] = {1,10}; status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_CONTROL_AE_TARGET_FPS_RANGE,2,fpsRange); } @@ -468,6 +498,24 @@ int NdkCamera::open(const std::string& cameraId) { if (!m_params.zoom) { + if (maxRegions[2] > 0) + { + int32_t centerX = activeArraySize[0] >> 1; + int32_t centerY = activeArraySize[1] >> 1; + + int32_t sizeX = activeArraySize[0] >> 4; + int32_t sizeY = activeArraySize[1] >> 4; + + int32_t afRegions[] = {centerX - sizeX, centerY - sizeY, centerX + sizeX, centerY + sizeY, 1000}; + status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_CONTROL_AF_REGIONS, 5, afRegions); + if (status == ACAMERA_OK) + { + // m_imagesCaptured = ~0; +#ifdef _DEBUG + int aa = 0; +#endif + } + } uint8_t trig = ACAMERA_CONTROL_AF_TRIGGER_CANCEL; // status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); @@ -520,6 +568,19 @@ int NdkCamera::open(const std::string& cameraId) { } } + if (maxRegions[0] > 0) + { + int32_t aeRegions[] = {0, 0, activeArraySize[0] - 1, activeArraySize[1] - 1, 1000}; + status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_CONTROL_AE_REGIONS, 5, aeRegions); + if (status == ACAMERA_OK) + { + // m_imagesCaptured = ~0; +#ifdef _DEBUG + int aa = 0; +#endif + } + } + uint8_t aePrecatureTrigger = ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER_START; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_PRECAPTURE_TRIGGER, 1, &aePrecatureTrigger); if (status == ACAMERA_OK) @@ -552,6 +613,14 @@ int NdkCamera::open(const std::string& cameraId) { uint8_t awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AWB_MODE, 1, &awbMode); +#if 0 + uint8_t antiBandingMode = ACAMERA_CONTROL_AE_ANTIBANDING_MODE_60HZ; + status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_ANTIBANDING_MODE, 1, &antiBandingMode); + + uint8_t flicker = ACAMERA_STATISTICS_SCENE_FLICKER_60HZ; + status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_STATISTICS_SCENE_FLICKER, 1, &flicker); +#endif + status = ACameraOutputTarget_create(image_reader_surface, &image_reader_target); status = ACaptureRequest_addTarget(capture_request, image_reader_target); } @@ -688,15 +757,55 @@ void NdkCamera::onImageAvailable(AImageReader* reader) ALOGD("onImageAvailable %p", reader); AImage* image = 0; - media_status_t status = AImageReader_acquireLatestImage(reader, &image); + media_status_t mstatus = AImageReader_acquireLatestImage(reader, &image); - if (status != AMEDIA_OK) + if (mstatus != AMEDIA_OK) { // error - XYLOG(XYLOG_SEVERITY_ERROR, "AImageReader_acquireLatestImage error: %d", status); + XYLOG(XYLOG_SEVERITY_ERROR, "AImageReader_acquireLatestImage error: %d", mstatus); return; } + uint8_t* y_data = 0; + int y_len = 0; +#if 0 + if (!lightDetected) + { + AImage_getPlaneData(image, 0, &y_data, &y_len); + + lightDetected = true; + +#if __cplusplus >= 201703L + uint64_t avgY = std::reduce(y_data, y_data + y_len, 0); +#else + uint64_t avgY = std::accumulate(y_data, y_data + y_len, 0); +#endif + avgY = avgY / (uint64_t)y_len; + mResult.avgY = avgY; +#if 1 + if (avgY < 50) + { + if (m_params.autoExposure) + { + uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_OFF; + camera_status_t status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_MODE, 1, &aeMode); + + int32_t sensitivity = (avgY < 5) ? 2000 : (mResult.sensitibity * 60.0 / avgY); + status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity); + + int64_t exposureTime = (avgY < 5) ? 200 * 1000000 : (mResult.exposureTime * 120.0 / avgY); + status = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exposureTime); + + XYLOG(XYLOG_SEVERITY_WARNING, "YUV Light: %u EXPO:%lld => %lld ISO: %u => %u", (uint32_t)avgY, + mResult.exposureTime, exposureTime, mResult.sensitibity, sensitivity); + } + AImage_delete(image); + return; + } +#endif + } +#endif + if (m_imagesCaptured == ~0 || m_imagesCaptured >= 1) { // XYLOG(XYLOG_SEVERITY_DEBUG, "m_imagesCaptured=%u wait for next image", m_imagesCaptured); @@ -729,22 +838,27 @@ void NdkCamera::onImageAvailable(AImageReader* reader) AImage_getPlaneRowStride(image, 1, &u_rowStride); AImage_getPlaneRowStride(image, 2, &v_rowStride); - uint8_t* y_data = 0; + // uint8_t* y_data = 0; uint8_t* u_data = 0; uint8_t* v_data = 0; - int y_len = 0; + // int y_len = 0; int u_len = 0; int v_len = 0; - AImage_getPlaneData(image, 0, &y_data, &y_len); + if (y_data == 0) + { + AImage_getPlaneData(image, 0, &y_data, &y_len); + } AImage_getPlaneData(image, 1, &u_data, &u_len); AImage_getPlaneData(image, 2, &v_data, &v_len); +#if 0 #if __cplusplus >= 201703L uint64_t avgy = std::reduce(y_data, y_data + y_len, 0); #else uint64_t avgy = std::accumulate(y_data, y_data + y_len, 0); #endif mResult.avgY = avgy / y_len; +#endif if (u_data == v_data + 1 && v_data == y_data + width * height && y_pixelStride == 1 && u_pixelStride == 2 && v_pixelStride == 2 && y_rowStride == width && u_rowStride == width && v_rowStride == width) { @@ -974,6 +1088,18 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AE_STATE, &val); mResult.aeState = (status == ACAMERA_OK) ? *(val.data.u8) : ACAMERA_CONTROL_AE_STATE_INACTIVE; + if (!lightDetected) + { + 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_SENSOR_SENSITIVITY, &val); + mResult.sensitibity = *(val.data.i32); + } + if (afSupported && (m_params.autoFocus != 0)) { val = { 0 }; diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 10533858..e9a343c9 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -143,12 +143,16 @@ protected: bool aeLockAvailable; bool awbLockAvailable; + bool lightDetected; + // int64_t exposureTime_; RangeValue exposureRange; // int32_t sensitivity_; RangeValue sensitivityRange; RangeValue aeCompensationRange; ACameraMetadata_rational aeCompensationStep; + int32_t activeArraySize[2]; + int32_t maxRegions[3]; unsigned int m_imagesCaptured; From fa7dbfbd50239388daa604c4589153904bd1056d Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 00:26:15 +0800 Subject: [PATCH 12/23] =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=BC=96=E8=AF=91=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/MicroPhoto.cpp | 4 +++- app/src/main/cpp/PhoneDevice.cpp | 3 +++ app/src/main/cpp/PhoneDevice.h | 5 +++++ app/src/main/java/com/xypower/mpapp/MicroPhotoService.java | 4 ++-- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/app/src/main/cpp/MicroPhoto.cpp b/app/src/main/cpp/MicroPhoto.cpp index 5a307ab8..6145f523 100644 --- a/app/src/main/cpp/MicroPhoto.cpp +++ b/app/src/main/cpp/MicroPhoto.cpp @@ -273,7 +273,8 @@ Java_com_xypower_mpapp_MicroPhotoService_init( JNIEnv* env, jobject pThis, jstring appPath, jstring ip, jint port, jstring cmdid, jint protocol, - jint networkProtocol, jint encryptData, jlong netHandle, jint signalLevel, jint versionCode, jstring simcard) { + jint networkProtocol, jint encryptData, jlong netHandle, jint signalLevel, + jint versionCode, jlong buildTime, jstring simcard) { /* google_breakpad::MinidumpDescriptor descriptor("."); @@ -315,6 +316,7 @@ Java_com_xypower_mpapp_MicroPhotoService_init( CPhoneDevice* device = new CPhoneDevice(vm, pThis, appPathStr, NETID_UNSET, versionCode); device->SetListener(pTerminal); device->UpdateSignalLevel(signalLevel); + device->SetBuildTime(buildTime / 1000); device->UpdateSimcard(simcardStr); pTerminal->InitServerInfo(appPathStr, cmdidStr, ipStr, port, udpOrTcp, encryptData); diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index b6e21b00..6e7f0fe3 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -175,6 +175,7 @@ CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPa m_signalLevel = 0; m_signalLevelUpdateTime = time(NULL); + mBuildTime = 0; RegisterHandlerForSignal(SIGUSR2); @@ -367,6 +368,8 @@ bool CPhoneDevice::QuerySystemProperties(std::map& pro version += std::to_string((mVersionCode % 100000) / 1000); version += "."; version += std::to_string(mVersionCode % 1000); + + version += " " + FormatLocalTime(mBuildTime); it->second = version; } else if (it->first == PROP_PROD_DATE) diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index e05a10f2..49515801 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -202,6 +202,10 @@ public: void UpdatePosition(double lon, double lat, double radius, time_t ts); bool OnVideoReady(bool result, const char* path, unsigned int photoId); void UpdateSignalLevel(int signalLevel); + void SetBuildTime(time_t buildTime) + { + mBuildTime = buildTime; + } void UpdateSimcard(const std::string& simcard); protected: @@ -282,6 +286,7 @@ protected: const CFG_RECOGNIZATION* m_pRecognizationCfg; unsigned int mNetId; unsigned int mVersionCode; + time_t mBuildTime; atomic_ulong m_timerUidFeed; atomic_ulong m_wakelockIdFeed; diff --git a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java index 4ba53444..1d8d6304 100644 --- a/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java +++ b/app/src/main/java/com/xypower/mpapp/MicroPhotoService.java @@ -675,7 +675,7 @@ public class MicroPhotoService extends Service { simcard = ""; } - service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, encryptData, 0, service.getSignalLevel(), versionCode, simcard); + service.mNativeHandle = init(appPath, server, port, cmdid, protocol, networkProtocol, encryptData, 0, service.getSignalLevel(), versionCode, BuildConfig.BUILD_TIMESTAMP, simcard); if (service.mNativeHandle != 0) { isRunning = true; @@ -1127,7 +1127,7 @@ CellSignalStrengthGsm cellSignalStrengthGsm = cellInfoGsm.getCellSignalStrength( cellSignalStrengthGsm.getDbm(); */ - protected native long init(String appPath, String ip, int port, String cmdid, int protocol, int networkProtocl, int encryptData, long netHandle, int signalLevel, int versionCode, String simcard); + protected native long init(String appPath, String ip, int port, String cmdid, int protocol, int networkProtocl, int encryptData, long netHandle, int signalLevel, int versionCode, long buildTime, String simcard); protected native long getHeartbeatDuration(long handler); protected native long[] getPhotoTimeData(long handler, long startTime); protected native long[] getPhotoTimeData2(long handler); From 5ade763373edd0844b2a72a07d60b999c6c321b9 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 00:27:36 +0800 Subject: [PATCH 13/23] Update version to 1.0.136 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index bcafab7f..8e36f04c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 0 -def AppBuildNumber = 135 +def AppBuildNumber = 136 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From 91a67feddebfc14bdd34636ed03049ca89ceda4a Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 10:31:01 +0800 Subject: [PATCH 14/23] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 236fd4c8..9a0b4711 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -491,10 +491,7 @@ int NdkCamera::open(const std::string& cameraId) { } if (afSupported && m_params.autoFocus) { - // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_VIDEO; - uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_PICTURE; - // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_AUTO; - status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_MODE, 1, &afMode); + if (!m_params.zoom) { @@ -516,6 +513,12 @@ int NdkCamera::open(const std::string& cameraId) { #endif } } + + // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_VIDEO; + uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_PICTURE; + // 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; // status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); From d13afaa7feff73b36869f7f8071be6f3549a0e35 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 16:54:47 +0800 Subject: [PATCH 15/23] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9F=AD=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mpapp/v2/Camera2VideoActivity.java | 290 +++++++++++++++--- .../gpuv/egl/filter/GlOverlayFilter.java | 4 +- .../gpuv/egl/filter/GlWatermarkFilter.java | 5 + 3 files changed, 251 insertions(+), 48 deletions(-) diff --git a/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java b/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java index 62f192de..bdbd0c83 100644 --- a/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java +++ b/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java @@ -8,7 +8,9 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Insets; import android.graphics.Paint; +import android.graphics.Point; import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import android.net.Uri; import android.opengl.GLException; @@ -47,7 +49,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.nio.IntBuffer; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Date; +import java.util.List; public class Camera2VideoActivity extends AppCompatActivity { @@ -79,7 +83,9 @@ public class Camera2VideoActivity extends AppCompatActivity { private int mOSDMargin = 0; private Paint mPaint; private Paint mPaintStroker; + private Paint mEmptyPaint; private Bitmap mBitmap; + private Bitmap mBitmapTime; GlWatermarkFilter mOSDFilter = null; private SimpleDateFormat mDateFormater; @@ -91,6 +97,16 @@ public class Camera2VideoActivity extends AppCompatActivity { private int mTimeMask = 0; private int mStatusBarHeight = -1; + private static class OSD_ITEM + { + String text; + int mask; + Point origin; + Rect previousRect; + } + + private List mOSDItems = new ArrayList<>(); + private final static int TIME_MASK_LT_TS = 1; private final static int TIME_MASK_LT_DT = 2; private final static int TIME_MASK_LT_ML = 4; @@ -119,8 +135,8 @@ public class Camera2VideoActivity extends AppCompatActivity { ms = 0; } - updateOSD(ts); - + // updateOSD(ts); + initOSD(ts); mHandler.postDelayed(this, 1000 - ms); } }; @@ -160,19 +176,14 @@ public class Camera2VideoActivity extends AppCompatActivity { }); } - public static int px2dip(Context context, float pxValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (pxValue / scale + 0.5f); } - public int getStatusBarHeight(Context context) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - - - WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); WindowMetrics windowMetrics = wm.getCurrentWindowMetrics(); WindowInsets windowInsets = windowMetrics.getWindowInsets(); @@ -187,7 +198,6 @@ public class Camera2VideoActivity extends AppCompatActivity { return statusBarHeight; } - protected void onCreateActivity() { // @@ -300,7 +310,7 @@ public class Camera2VideoActivity extends AppCompatActivity { releaseCamera(); } - private void updateOSD(long ts) { + private void initOSD(long ts) { if (mStatusBarHeight == -1) { mStatusBarHeight = getStatusBarHeight(this); @@ -310,64 +320,248 @@ public class Camera2VideoActivity extends AppCompatActivity { int bmWidth = mBitmap.getWidth(); int bmHeight = mBitmap.getHeight(); int margin = mOSDMargin; + int x = 0; + int y = 0; // mOSDFilter. Canvas canvas = new Canvas(mBitmap); + Rect textBounds = new Rect(); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); if (!TextUtils.isEmpty(mOSDLeftTop)) { - String osd = ((mTimeMask | TIME_MASK_LT) == 0) ? mOSDLeftTop : updateOSDTime(mOSDLeftTop, ts); - // mPaint.setTextAlign(Paint.Align.LEFT); - int x = margin; - int y = margin + statusHeight; - canvas.drawText(osd, x, y, mPaint); - canvas.drawText(osd, x, y, mPaintStroker); + String[] items = mOSDLeftTop.split("\n"); + Point origin = new Point(margin, margin + statusHeight); + + for (String item : items) { + + int mask = 0; + if (item.indexOf(TIME_MICRO_TS) != 0) { + mask |= TIME_MASK_LT_TS; + } + if (item.indexOf(TIME_MICRO_DT) != 0) { + mask |= TIME_MASK_LT_DT; + } + + OSD_ITEM osdItem = new OSD_ITEM(); + osdItem.text = item; + osdItem.mask = mask; + osdItem.origin = new Point(origin); + + if (mask == 0) { + canvas.drawText(item, origin.x, origin.y, mPaint); + canvas.drawText(item, origin.x, origin.y, mPaintStroker); + + mPaintStroker.getTextBounds(item, 0, item.length(), textBounds); + } else { + String newText = updateOSDTime(item, ts); + + Log.d("OSD", "INIT OSD x=" + origin.x + " y=" + origin.y); + canvas.drawText(newText, origin.x, origin.y, mPaint); + canvas.drawText(newText, origin.x, origin.y, mPaintStroker); + + mPaintStroker.getTextBounds(newText, 0, item.length(), textBounds); + } + + osdItem.previousRect = new Rect(origin.x, origin.y, origin.x + textBounds.width(), origin.y + textBounds.height()); + + mOSDItems.add(osdItem); + origin.y += (textBounds.height() * 5) >> 2; + } } if (!TextUtils.isEmpty(mOSDLeftBottom)) { - String osd = ((mTimeMask | TIME_MASK_LB) == 0) ? mOSDLeftBottom : updateOSDTime(mOSDLeftBottom, ts); - // mPaint.setTextAlign(Paint.Align.LEFT); - Rect textBounds = new Rect(); - mPaint.getTextBounds(osd, 0, osd.length(), textBounds); - float y = bmHeight - margin - textBounds.height(); - canvas.drawText(osd, margin, y, mPaint); - canvas.drawText(osd, margin, y, mPaintStroker); + + String[] items = mOSDLeftBottom.split("\n"); + Point origin = new Point(margin, bmHeight - margin); + + for(int idx = items.length-1; idx >= 0; idx--) { + + int mask = 0; + String item = items[idx]; + if (item.indexOf(TIME_MICRO_TS) != 0) { + mask |= TIME_MASK_LB_TS; + } + if (item.indexOf(TIME_MICRO_DT) != 0) { + mask |= TIME_MASK_LB_DT; + } + + OSD_ITEM osdItem = new OSD_ITEM(); + osdItem.text = item; + osdItem.mask = mask; + osdItem.origin = new Point(origin); + if (mask == 0) { + mPaintStroker.getTextBounds(item, 0, item.length(), textBounds); + y = origin.y - textBounds.height(); + + canvas.drawText(item, origin.x, y, mPaint); + canvas.drawText(item, origin.x, y, mPaintStroker); + } else { + String newText = updateOSDTime(item, ts); + + mPaintStroker.getTextBounds(newText, 0, newText.length(), textBounds); + y = origin.y - textBounds.height(); + + canvas.drawText(newText, origin.x, y, mPaint); + canvas.drawText(newText, origin.x, y, mPaintStroker); + } + + osdItem.previousRect = new Rect(origin.x, y, origin.x + textBounds.width(), y + textBounds.height()); + mOSDItems.add(osdItem); + origin.y -= (textBounds.height() * 5) >> 2; + } } if (!TextUtils.isEmpty(mOSDRightTop)) { - String osd = ((mTimeMask | TIME_MASK_RT) == 0) ? mOSDRightTop : updateOSDTime(mOSDRightTop, ts); - // mPaint.setTextAlign(Paint.Align.RIGHT); - Rect textBounds = new Rect(); - mPaint.getTextBounds(osd, 0, osd.length(), textBounds); - float x = bmWidth - margin - textBounds.width(); - int y = margin + statusHeight; - canvas.drawText(osd, x, y, mPaint); - canvas.drawText(osd, x, y, mPaintStroker); + + String[] items = mOSDRightTop.split("\n"); + Point origin = new Point(bmWidth - margin, margin + statusHeight); + + for (String item : items) { + + int mask = 0; + if (item.indexOf(TIME_MICRO_TS) != 0) { + mask |= TIME_MASK_RT_TS; + } + if (item.indexOf(TIME_MICRO_DT) != 0) { + mask |= TIME_MASK_RT_DT; + } + + OSD_ITEM osdItem = new OSD_ITEM(); + osdItem.text = item; + osdItem.origin = new Point(origin); + osdItem.mask = mask; + + if (mask == 0) { + mPaintStroker.getTextBounds(item, 0, item.length(), textBounds); + + canvas.drawText(item, origin.x - textBounds.width(), origin.y, mPaint); + canvas.drawText(item, origin.x - textBounds.width(), origin.y, mPaintStroker); + } else { + + String newText = updateOSDTime(item, ts); + mPaintStroker.getTextBounds(newText, 0, item.length(), textBounds); + + canvas.drawText(newText, origin.x - textBounds.width(), origin.y, mPaint); + canvas.drawText(newText, origin.x - textBounds.width(), origin.y, mPaintStroker); + } + osdItem.previousRect = new Rect(origin.x - textBounds.width(), origin.y, origin.x, origin.y + textBounds.height()); + mOSDItems.add(osdItem); + + origin.y += (textBounds.height() * 5) >> 2; + } } if (!TextUtils.isEmpty(mOSDRightBottom)) { - String osd = ((mTimeMask | TIME_MASK_RB) == 0) ? mOSDRightBottom : updateOSDTime(mOSDRightBottom, ts); - // mPaint.setTextAlign(Paint.Align.RIGHT); - Rect textBounds = new Rect(); - mPaint.getTextBounds(osd, 0, osd.length(), textBounds); - float x = bmWidth - margin - textBounds.width(); - float y = bmHeight - margin - textBounds.height(); - canvas.drawText(osd, x, y, mPaint); - canvas.drawText(osd, x, y, mPaintStroker); + + String[] items = mOSDRightBottom.split("\n"); + Point origin = new Point(bmWidth - margin, bmHeight - margin); + + for(int idx = items.length-1; idx >= 0; idx--) { + + int mask = 0; + String item = items[idx]; + if (item.indexOf(TIME_MICRO_TS) != 0) { + mask |= TIME_MASK_RB_TS; + } + if (item.indexOf(TIME_MICRO_DT) != 0) { + mask |= TIME_MASK_RB_DT; + } + + OSD_ITEM osdItem = new OSD_ITEM(); + osdItem.text = item; + osdItem.origin = new Point(origin); + osdItem.mask = mask; + if (mask == 0) { + mPaintStroker.getTextBounds(item, 0, item.length(), textBounds); + + canvas.drawText(item, origin.x - textBounds.width(), origin.y - textBounds.height(), mPaint); + canvas.drawText(item, origin.x - textBounds.width(), origin.y - textBounds.height(), mPaintStroker); + } else { + String newText = updateOSDTime(item, ts); + mPaintStroker.getTextBounds(newText, 0, item.length(), textBounds); + + canvas.drawText(newText, origin.x - textBounds.width(), origin.y - textBounds.height(), mPaint); + canvas.drawText(newText, origin.x - textBounds.width(), origin.y - textBounds.height(), mPaintStroker); + } + + osdItem.previousRect = new Rect(origin.x - textBounds.width(), origin.y - textBounds.height(), origin.x, origin.y); + mOSDItems.add(osdItem); + + origin.y -= (textBounds.height() * 5) >> 2; + } } } + } + private void updateOSD(long ts) { - /* - SurfaceHolder surfaceHolder = sampleGLView.getHolder(); - Canvas surfaceCanvas = surfaceHolder.lockCanvas(); - if (surfaceCanvas != null) { - surfaceCanvas.drawBitmap(mBitmap, 0, 0, null); - surfaceHolder.unlockCanvasAndPost(surfaceCanvas); + if (mStatusBarHeight == -1) { + mStatusBarHeight = getStatusBarHeight(this); } + int statusHeight = mStatusBarHeight; + synchronized (mBitmap) { + int bmWidth = mBitmap.getWidth(); + int bmHeight = mBitmap.getHeight(); + int margin = mOSDMargin; - */ + Canvas canvas = new Canvas(mBitmap); + boolean aa = canvas.isHardwareAccelerated(); + Rect textBounds = new Rect(); + + // mBitmap.eraseColor(Color.argb(0, 0, 0, 0)); + // bitmap.eraseColor(Color.argb(0, 0, 0, 0)); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); + + for (OSD_ITEM osdItem : mOSDItems) { + String text = updateOSDTime(osdItem.text, ts); + + int x = osdItem.previousRect.left; + int y = osdItem.previousRect.top; + + if ((osdItem.mask & TIME_MASK_LT) != 0) { + // canvas.drawRect(osdItem.previousRect, mEmptyPaint); + mPaintStroker.getTextBounds(text, 0, text.length(), textBounds); + + Log.d("OSD", "UPD OSD x=" + x + " y=" + y); + canvas.drawText(text, x, y, mPaint); + canvas.drawText(text, x, y, mPaintStroker); + osdItem.previousRect.set(x, y, x + textBounds.width(), y + textBounds.height()); + + } else if ((osdItem.mask & TIME_MASK_LB) != 0) { + // canvas.drawRect(osdItem.previousRect, mEmptyPaint); + mPaintStroker.getTextBounds(text, 0, text.length(), textBounds); + + y = osdItem.origin.y - textBounds.height(); + canvas.drawText(text, x, y, mPaint); + canvas.drawText(text, x, y, mPaintStroker); + osdItem.previousRect.set(x, y, x + textBounds.width(), y + textBounds.height()); + + } else if ((osdItem.mask & TIME_MASK_RT) != 0) { + // canvas.drawRect(osdItem.previousRect, mEmptyPaint); + mPaintStroker.getTextBounds(text, 0, text.length(), textBounds); + + x = osdItem.origin.x - textBounds.width(); + canvas.drawText(text, x, osdItem.origin.y, mPaint); + canvas.drawText(text, x, osdItem.origin.y, mPaintStroker); + osdItem.previousRect.set(x, osdItem.origin.y, x + textBounds.width(), osdItem.origin.y + textBounds.height()); + + } else if ((osdItem.mask & TIME_MASK_RB) != 0) { + // canvas.drawRect(osdItem.previousRect, mEmptyPaint); + mPaintStroker.getTextBounds(text, 0, text.length(), textBounds); + + x = osdItem.origin.x - textBounds.width(); + y = osdItem.origin.y - textBounds.height(); + canvas.drawText(text, x, y, mPaint); + canvas.drawText(text, x, y, mPaintStroker); + osdItem.previousRect.set(x, y, x + textBounds.width(), y + textBounds.height()); + } else { + canvas.drawText(text, x, y, mPaint); + canvas.drawText(text, x, y, mPaintStroker); + } + } + } } private String updateOSDTime(String osd, long ts) { @@ -404,7 +598,6 @@ public class Camera2VideoActivity extends AppCompatActivity { } } - private void setUpCameraView() { runOnUiThread(() -> { @@ -422,6 +615,9 @@ public class Camera2VideoActivity extends AppCompatActivity { mPaintStroker.setTextSize(fontSize); mPaintStroker.setStrokeWidth(1); + mEmptyPaint = new Paint(); + mEmptyPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); + mBitmap = Bitmap.createBitmap(mVideoWidth, mVideoHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(mBitmap); @@ -480,7 +676,7 @@ public class Camera2VideoActivity extends AppCompatActivity { if (mTimeMask != 0) { long ts = System.currentTimeMillis(); long ms = ts % 1000; - updateOSD(ts - ms); + initOSD(ts - ms); mHandler.postDelayed(mTimerRunnable, 1000 - ms); } diff --git a/gpuv/src/main/java/com/xypower/gpuv/egl/filter/GlOverlayFilter.java b/gpuv/src/main/java/com/xypower/gpuv/egl/filter/GlOverlayFilter.java index f3ca899f..617432f8 100644 --- a/gpuv/src/main/java/com/xypower/gpuv/egl/filter/GlOverlayFilter.java +++ b/gpuv/src/main/java/com/xypower/gpuv/egl/filter/GlOverlayFilter.java @@ -3,6 +3,7 @@ package com.xypower.gpuv.egl.filter; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.PorterDuff; import android.opengl.GLES20; import android.opengl.GLUtils; import android.util.Size; @@ -46,6 +47,7 @@ public abstract class GlOverlayFilter extends GlFilter { private void createBitmap() { releaseBitmap(bitmap); bitmap = Bitmap.createBitmap(inputResolution.getWidth(), inputResolution.getHeight(), Bitmap.Config.ARGB_8888); + bitmap.eraseColor(Color.argb(0, 0, 0, 0)); } @Override @@ -71,7 +73,7 @@ public abstract class GlOverlayFilter extends GlFilter { createBitmap(); } - bitmap.eraseColor(Color.argb(0, 0, 0, 0)); + // bitmap.eraseColor(Color.argb(0, 0, 0, 0)); Canvas bitmapCanvas = new Canvas(bitmap); bitmapCanvas.scale(1, -1, bitmapCanvas.getWidth() / 2, bitmapCanvas.getHeight() / 2); drawCanvas(bitmapCanvas); diff --git a/gpuv/src/main/java/com/xypower/gpuv/egl/filter/GlWatermarkFilter.java b/gpuv/src/main/java/com/xypower/gpuv/egl/filter/GlWatermarkFilter.java index 26aeeb18..6a265971 100644 --- a/gpuv/src/main/java/com/xypower/gpuv/egl/filter/GlWatermarkFilter.java +++ b/gpuv/src/main/java/com/xypower/gpuv/egl/filter/GlWatermarkFilter.java @@ -2,7 +2,10 @@ package com.xypower.gpuv.egl.filter; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.PorterDuff; import android.graphics.Rect; +import android.util.Log; public class GlWatermarkFilter extends GlOverlayFilter { @@ -22,6 +25,8 @@ public class GlWatermarkFilter extends GlOverlayFilter { @Override protected void drawCanvas(Canvas canvas) { synchronized (bitmap) { + Log.d("OSD", "drawCanvas"); + canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); canvas.drawBitmap(bitmap, null, canvas.getClipBounds(), null); } From aa598d5f6679ee2a205a6a1ae767ca582535facf Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 16:59:03 +0800 Subject: [PATCH 16/23] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=97=A0=E7=94=A8?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java b/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java index bdbd0c83..1e6c52c6 100644 --- a/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java +++ b/app/src/main/java/com/xypower/mpapp/v2/Camera2VideoActivity.java @@ -83,9 +83,7 @@ public class Camera2VideoActivity extends AppCompatActivity { private int mOSDMargin = 0; private Paint mPaint; private Paint mPaintStroker; - private Paint mEmptyPaint; private Bitmap mBitmap; - private Bitmap mBitmapTime; GlWatermarkFilter mOSDFilter = null; private SimpleDateFormat mDateFormater; @@ -615,9 +613,6 @@ public class Camera2VideoActivity extends AppCompatActivity { mPaintStroker.setTextSize(fontSize); mPaintStroker.setStrokeWidth(1); - mEmptyPaint = new Paint(); - mEmptyPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); - mBitmap = Bitmap.createBitmap(mVideoWidth, mVideoHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(mBitmap); From 33683b22c6c3f0cfb802ee4a28ae41077e1a2593 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 21:31:33 +0800 Subject: [PATCH 17/23] =?UTF-8?q?=E5=A6=82=E6=9E=9C=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E4=BA=AE=E5=BA=A6=E5=80=BC=E4=BD=8E=E4=BA=8E25=EF=BC=8C?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=9B=9D=E5=85=89=E6=97=B6=E9=97=B4=E5=92=8C?= =?UTF-8?q?ISO=E5=90=8E=E9=87=8D=E6=96=B0=E6=8B=8D=E4=B8=80=E5=BC=A0?= =?UTF-8?q?=E4=BD=9C=E4=B8=BA=E5=AF=B9=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 35 ++++++++++++++++++++++++++ app/src/main/cpp/camera2/ndkcamera.cpp | 13 ++++------ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 6e7f0fe3..785ebd20 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1241,6 +1241,41 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) cv::Scalar scalarRed(0, 0, 255); // red NdkCamera::CAPTURE_RESULT captureResult = mCamera->getCaptureResult(); + + if (captureResult.avgY < 25 && mPhotoInfo.autoExposure != 0) + { + // Take another photo + CPhoneDevice* pThis = this; + std::string path = mPath; + IDevice::PHOTO_INFO photoInfo = mPhotoInfo; + std::vector osds = mOsds; + + photoInfo.photoId += 1; + photoInfo.autoExposure = 0; + if (captureResult.avgY == 0) + { + photoInfo.exposureTime = 400; + photoInfo.sensitivity = 2000; + } + else + { + photoInfo.exposureTime = captureResult.exposureTime / 100000 * 120 / captureResult.avgY; + photoInfo.sensitivity = photoInfo.sensitivity * 60 / captureResult.avgY; + if (photoInfo.sensitivity > 2000) + { + photoInfo.sensitivity = 2000; + } + } + + std::thread t([=] + { + std::this_thread::sleep_for(std::chrono::milliseconds(5000)); + pThis->TakePhoto(photoInfo, osds, path); + }); + + t.detach(); + } + 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" : "ns"); diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 9a0b4711..32d69899 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -847,20 +847,17 @@ void NdkCamera::onImageAvailable(AImageReader* reader) // int y_len = 0; int u_len = 0; int v_len = 0; - if (y_data == 0) - { - AImage_getPlaneData(image, 0, &y_data, &y_len); - } + AImage_getPlaneData(image, 0, &y_data, &y_len); AImage_getPlaneData(image, 1, &u_data, &u_len); AImage_getPlaneData(image, 2, &v_data, &v_len); -#if 0 +#if 1 #if __cplusplus >= 201703L - uint64_t avgy = std::reduce(y_data, y_data + y_len, 0); + uint64_t avgY = std::reduce(y_data, y_data + y_len, 0); #else - uint64_t avgy = std::accumulate(y_data, y_data + y_len, 0); + uint64_t avgY = std::accumulate(y_data, y_data + y_len, 0); #endif - mResult.avgY = avgy / y_len; + mResult.avgY = avgY / y_len; #endif if (u_data == v_data + 1 && v_data == y_data + width * height && y_pixelStride == 1 && u_pixelStride == 2 && v_pixelStride == 2 && y_rowStride == width && u_rowStride == width && v_rowStride == width) From 1b6c153e0457d79cf4911f098ef3537bc55c208a Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 22:26:54 +0800 Subject: [PATCH 18/23] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8D=95=E4=BD=8D?= =?UTF-8?q?=E8=BD=AC=E6=8D=A2bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 785ebd20..154bdb52 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1259,7 +1259,7 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) } else { - photoInfo.exposureTime = captureResult.exposureTime / 100000 * 120 / captureResult.avgY; + photoInfo.exposureTime = captureResult.exposureTime / 1000000 * 120 / captureResult.avgY; photoInfo.sensitivity = photoInfo.sensitivity * 60 / captureResult.avgY; if (photoInfo.sensitivity > 2000) { From bf5383fa10b31c0f47881319ffc29957752bed95 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 22:35:18 +0800 Subject: [PATCH 19/23] Update version to 1.0.137 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 8e36f04c..0607d891 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 0 -def AppBuildNumber = 136 +def AppBuildNumber = 137 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From 6742e6dcc0c697242af693467ec1ff57e0991130 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 23:14:23 +0800 Subject: [PATCH 20/23] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 8 ++++---- app/src/main/cpp/camera2/ndkcamera.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 32d69899..afa8ef08 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -793,14 +793,14 @@ void NdkCamera::onImageAvailable(AImageReader* reader) uint8_t aeMode = ACAMERA_CONTROL_AE_MODE_OFF; camera_status_t status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AE_MODE, 1, &aeMode); - int32_t sensitivity = (avgY < 5) ? 2000 : (mResult.sensitibity * 60.0 / avgY); + int32_t sensitivity = (avgY < 5) ? 2000 : (mResult.sensitivity * 60.0 / avgY); status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity); int64_t exposureTime = (avgY < 5) ? 200 * 1000000 : (mResult.exposureTime * 120.0 / avgY); status = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exposureTime); XYLOG(XYLOG_SEVERITY_WARNING, "YUV Light: %u EXPO:%lld => %lld ISO: %u => %u", (uint32_t)avgY, - mResult.exposureTime, exposureTime, mResult.sensitibity, sensitivity); + mResult.exposureTime, exposureTime, mResult.sensitivity, sensitivity); } AImage_delete(image); return; @@ -1097,7 +1097,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque val = {0}; status = ACameraMetadata_getConstEntry(result, ACAMERA_SENSOR_SENSITIVITY, &val); - mResult.sensitibity = *(val.data.i32); + mResult.sensitivity = *(val.data.i32); } if (afSupported && (m_params.autoFocus != 0)) @@ -1218,7 +1218,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque val = {0}; status = ACameraMetadata_getConstEntry(result, ACAMERA_SENSOR_SENSITIVITY, &val); - mResult.sensitibity = *(val.data.i32); + mResult.sensitivity = *(val.data.i32); val = {0}; status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_SCENE_MODE, &val); diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index e9a343c9..d4c0e3ce 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -91,7 +91,7 @@ public: uint8_t awbState; int64_t exposureTime; float FocusDistance; - int32_t sensitibity; + int32_t sensitivity; int32_t compensation; uint8_t sceneMode; float zoomRatio; From 285bae89647acf016b6160f1b8723e588f1159b2 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 23:14:41 +0800 Subject: [PATCH 21/23] =?UTF-8?q?=E4=BA=AE=E5=BA=A6=E4=BD=8E=E4=BA=8E6?= =?UTF-8?q?=E7=9A=84=E8=B0=83=E6=95=B4=E7=B3=BB=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 154bdb52..fc535106 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1254,16 +1254,33 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) photoInfo.autoExposure = 0; if (captureResult.avgY == 0) { - photoInfo.exposureTime = 400; - photoInfo.sensitivity = 2000; + photoInfo.exposureTime = 600; + photoInfo.sensitivity = 2500; + } + else if (captureResult.avgY <= 6) + { + photoInfo.exposureTime = captureResult.exposureTime / 1000000 * 150 / captureResult.avgY; + photoInfo.sensitivity = photoInfo.sensitivity * 80 / captureResult.avgY; + if (photoInfo.sensitivity < captureResult.sensitivity) + { + photoInfo.sensitivity = captureResult.sensitivity; + } + else if (photoInfo.sensitivity > 3000) + { + photoInfo.sensitivity = 3000; + } } else { photoInfo.exposureTime = captureResult.exposureTime / 1000000 * 120 / captureResult.avgY; photoInfo.sensitivity = photoInfo.sensitivity * 60 / captureResult.avgY; - if (photoInfo.sensitivity > 2000) + if (photoInfo.sensitivity < captureResult.sensitivity) + { + photoInfo.sensitivity = captureResult.sensitivity; + } + else if (photoInfo.sensitivity > 3000) { - photoInfo.sensitivity = 2000; + photoInfo.sensitivity = 3000; } } @@ -1282,7 +1299,7 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) 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 AWB=%u %0.1fx", captureResult.autoExposure, extime, extimeunit, captureResult.compensation, - captureResult.sensitibity, + captureResult.sensitivity, captureResult.autoFocus, // isnan(captureResult.FocusDistance) ? 0 : captureResult.FocusDistance, GpioControl::getLightAdc(), (unsigned int)captureResult.avgY, From ba10d4a134deb96cfab71e88310e82bd531fa812 Mon Sep 17 00:00:00 2001 From: Matthew Date: Sun, 12 May 2024 23:15:19 +0800 Subject: [PATCH 22/23] Update version to 1.0.138 --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index 0607d891..c25a65a1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,7 +5,7 @@ plugins { // 10,00,000 major-minor-build def AppMajorVersion = 1 def AppMinorVersion = 0 -def AppBuildNumber = 137 +def AppBuildNumber = 138 def AppVersionName = AppMajorVersion + "." + AppMinorVersion + "." + AppBuildNumber def AppVersionCode = AppMajorVersion * 100000 + AppMinorVersion * 1000 + AppBuildNumber From 16af06d4fd2f42d3f5d79a2323757389768ce5ce Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 13 May 2024 11:08:13 +0800 Subject: [PATCH 23/23] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E7=9A=84=E7=BC=96=E8=AF=91=E6=97=B6=E9=97=B4=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index fc535106..21e349a8 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -368,8 +368,9 @@ bool CPhoneDevice::QuerySystemProperties(std::map& pro version += std::to_string((mVersionCode % 100000) / 1000); version += "."; version += std::to_string(mVersionCode % 1000); - +#if 0 version += " " + FormatLocalTime(mBuildTime); +#endif it->second = version; } else if (it->first == PROP_PROD_DATE)