From 961ce1d7685e5c113367dd2c0945fbd54aa82245 Mon Sep 17 00:00:00 2001 From: Matthew Date: Mon, 14 Oct 2024 13:11:44 +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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 44 +++++++++++++------------- app/src/main/cpp/PhoneDevice.h | 18 +++++------ app/src/main/cpp/camera2/ndkcamera.cpp | 22 +++++++++---- app/src/main/cpp/camera2/ndkcamera.h | 6 ++-- 4 files changed, 50 insertions(+), 40 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 5618d660..d746922d 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -208,29 +208,29 @@ bool CPhoneDevice::CPhoneCamera::on_image(cv::Mat& rgb) return false; } -bool CPhoneDevice::CPhoneCamera::onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, uint32_t ldr, cv::Mat rgb) +bool CPhoneDevice::CPhoneCamera::onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, uint32_t ldr, uint32_t duration, cv::Mat rgb) { if (m_dev != NULL) { - return m_dev->onOneCapture(characteristics, result, ldr, rgb); + return m_dev->onOneCapture(characteristics, result, ldr, duration, rgb); } return false; } -bool CPhoneDevice::CPhoneCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames) +bool CPhoneDevice::CPhoneCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames) { if (m_dev != NULL) { - return m_dev->onBurstCapture(characteristics, results, ldr, frames); + return m_dev->onBurstCapture(characteristics, results, ldr, duration, frames); } return false; } -bool CPhoneDevice::CPhoneCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames) +bool CPhoneDevice::CPhoneCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames) { if (m_dev != NULL) { - return m_dev->onBurstCapture(characteristics, results, ldr, frames); + return m_dev->onBurstCapture(characteristics, results, ldr, duration, frames); } return false; } @@ -256,29 +256,29 @@ CPhoneDevice::CJpegCamera::CJpegCamera(CPhoneDevice* dev, int32_t width, int32_t { } -bool CPhoneDevice::CJpegCamera::onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, uint32_t ldr, cv::Mat rgb) +bool CPhoneDevice::CJpegCamera::onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, uint32_t ldr, uint32_t duration, cv::Mat rgb) { if (m_dev != NULL) { - return m_dev->onOneCapture(characteristics, result, ldr, rgb); + return m_dev->onOneCapture(characteristics, result, ldr, duration, rgb); } return false; } -bool CPhoneDevice::CJpegCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames) +bool CPhoneDevice::CJpegCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames) { if (m_dev != NULL) { - m_dev->onBurstCapture(characteristics, results, ldr, frames); + m_dev->onBurstCapture(characteristics, results, ldr, duration, frames); } return true; } -bool CPhoneDevice::CJpegCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames) +bool CPhoneDevice::CJpegCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames) { if (m_dev != NULL) { - m_dev->onBurstCapture(characteristics, results, ldr, frames); + m_dev->onBurstCapture(characteristics, results, ldr, duration, frames); } return true; } @@ -1586,7 +1586,7 @@ void DrawOutlineText(cv::Ptr ft2, cv::Mat& mat, const std::st bool CPhoneDevice::onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, - uint32_t ldr, cv::Mat rgb) + uint32_t ldr, uint32_t duration, cv::Mat rgb) { time_t takingTime = time(NULL); if (mPhotoInfo.remedy != 0) @@ -1638,7 +1638,7 @@ bool CPhoneDevice::onOneCapture(std::shared_ptr characteristics } CPhoneDevice* pThis = this; - std::thread th([pThis, characteristics, result, photoInfo, osds, path, rgb, facing, sensorOrientation, ldr, takingTime]()mutable + std::thread th([pThis, characteristics, result, photoInfo, osds, path, rgb, facing, sensorOrientation, ldr, duration, takingTime]()mutable { std::string cameraInfo; if (photoInfo.outputDbgInfo != 0) @@ -1656,7 +1656,7 @@ bool CPhoneDevice::onOneCapture(std::shared_ptr characteristics // isnan(captureResult.FocusDistance) ? 0 : captureResult.FocusDistance, (unsigned int)captureResult.afState, (unsigned int)captureResult.aeState, captureResult.awbState, captureResult.sceneMode, GpioControl::getLightAdc(), ldr, captureResult.zoomRatio, - (uint32_t)captureResult.duration, captureResult.frameDuration); + duration, captureResult.frameDuration); cameraInfo = str; } @@ -1716,7 +1716,7 @@ bool CPhoneDevice::onOneCapture(std::shared_ptr characteristics bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, - uint32_t ldr, std::vector >& frames) + uint32_t ldr, uint32_t duration, std::vector >& frames) { time_t takingTime = time(NULL); if (mPhotoInfo.remedy != 0) @@ -1750,7 +1750,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi } CPhoneDevice* pThis = this; - std::thread th([pThis, characteristics, results, photoInfo, osds, path, pByteArrays, ldr, takingTime]()mutable + std::thread th([pThis, characteristics, results, photoInfo, osds, path, pByteArrays, ldr, duration, takingTime]()mutable { cv::Mat rgb; std::string cameraInfo; @@ -1785,13 +1785,13 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi 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", + 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, - (uint32_t)captureResult.duration, captureResult.frameDuration); + duration, captureResult.frameDuration); cameraInfo = str; } } @@ -1943,7 +1943,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, - uint32_t ldr, std::vector >& frames) + uint32_t ldr, uint32_t duration, std::vector >& frames) { time_t takingTime = time(NULL); if (mPhotoInfo.remedy != 0) @@ -2118,7 +2118,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi } CPhoneDevice* pThis = this; - std::thread th([pThis, characteristics, results, photoInfo, osds, path, rgb, rawFiles, facing, sensorOrientation, ldr, takingTime]()mutable + std::thread th([pThis, characteristics, results, photoInfo, osds, path, rgb, rawFiles, facing, sensorOrientation, ldr, duration, takingTime]()mutable { std::string cameraInfo; if (photoInfo.outputDbgInfo != 0) @@ -2138,7 +2138,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi // isnan(captureResult.FocusDistance) ? 0 : captureResult.FocusDistance, (unsigned int)captureResult.afState, (unsigned int)captureResult.aeState, captureResult.awbState, captureResult.sceneMode, GpioControl::getLightAdc(), ldr, captureResult.zoomRatio, - (uint32_t)captureResult.duration, captureResult.frameDuration); + duration, captureResult.frameDuration); cameraInfo = str; } } diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index a5b7a3f4..ee40d011 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -161,9 +161,9 @@ public: virtual bool on_image(cv::Mat& rgb); virtual void on_error(const std::string& msg); virtual void onDisconnected(ACameraDevice* device); - virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames); - virtual bool onOneCapture(std::shared_ptr characteristics, std::shared_ptr results, uint32_t ldr, cv::Mat rgb); - virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames); + virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames); + virtual bool onOneCapture(std::shared_ptr characteristics, std::shared_ptr results, uint32_t ldr, uint32_t duration, cv::Mat rgb); + virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames); protected: CPhoneDevice* m_dev; @@ -176,9 +176,9 @@ public: virtual void onImageAvailable(AImageReader* reader); virtual int32_t getOutputFormat() const; - virtual bool onOneCapture(std::shared_ptr characteristics, std::shared_ptr results, uint32_t ldr, cv::Mat rgb); - virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames); - virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames); + virtual bool onOneCapture(std::shared_ptr characteristics, std::shared_ptr results, uint32_t ldr, uint32_t duration, cv::Mat rgb); + virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames); + virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames); protected: std::string m_path; @@ -278,9 +278,9 @@ protected: std::string QueryCpuTemperature(); bool OnImageReady(cv::Mat& mat); - bool onOneCapture(std::shared_ptr characteristics, std::shared_ptr results, uint32_t ldr, cv::Mat rgb); - bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames); - bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames); + bool onOneCapture(std::shared_ptr characteristics, std::shared_ptr results, uint32_t ldr, uint32_t duration, cv::Mat rgb); + bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames); + bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames); void onError(const std::string& msg); void onDisconnected(ACameraDevice* device); diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 46f6101e..a0c4cf71 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -1290,6 +1290,8 @@ void NdkCamera::onImageAvailable(AImageReader* reader) return; } + unsigned long long ts = GetMicroTimeStamp(); + int32_t format; mstatus = AImage_getFormat(image, &format); @@ -1387,7 +1389,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) if (captureCompleted) { - onOneCapture(mCharacteristics, result, mFinalLdr, mOneFrame); + onOneCapture(mCharacteristics, result, mFinalLdr, ts - m_startTime, mOneFrame); } } else @@ -1444,17 +1446,17 @@ bool NdkCamera::on_image(cv::Mat& rgb) return false; } -bool NdkCamera::onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, uint32_t ldr, cv::Mat rgb) +bool NdkCamera::onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, uint32_t ldr, uint32_t duration, cv::Mat rgb) { return false; } -bool NdkCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames) +bool NdkCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames) { return false; } -bool NdkCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames) +bool NdkCamera::onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames) { return false; } @@ -1806,6 +1808,8 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque ALOGW("Capture Result sequenceId=%d TID=%lld", pCaptureRequest->sessionSequenceId, (long long)tid); #endif + unsigned long long ts = GetMicroTimeStamp(); + ACameraMetadata* pCopy = ACameraMetadata_copy(result); bool captureCompleted = false; size_t expectedTimes = mCaptureRequests.size() - 1; @@ -1820,7 +1824,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque if (captureCompleted) { - onOneCapture(mCharacteristics, captureResult, mFinalLdr, mOneFrame); + onOneCapture(mCharacteristics, captureResult, mFinalLdr, ts - m_startTime, mOneFrame); } } else @@ -1841,6 +1845,8 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque void NdkCamera::FireBurstCapture() { + unsigned long long ts = GetMicroTimeStamp(); + size_t expectedTimes = mCaptureRequests.size() - 1; std::vector > captureResults; uint32_t ldr; @@ -1848,6 +1854,10 @@ void NdkCamera::FireBurstCapture() m_locker.lock(); ldr = mFinalLdr; + if (ldr == 0 && mLdr != ~0) + { + ldr = mLdr; + } captureResults.swap(mCaptureResults); captureFrames.swap(mCaptureFrames); m_locker.unlock(); @@ -1881,7 +1891,7 @@ void NdkCamera::FireBurstCapture() captureFrames.clear(); - onBurstCapture(mCharacteristics, captureResults, ldr, frames); + onBurstCapture(mCharacteristics, captureResults, ldr, ts - m_startTime, frames); #ifdef _DEBUG ALOGD("Frames Size: %u", (uint32_t)frames.size()); diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index b25b20a7..4594d2c9 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -167,9 +167,9 @@ public: virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height); virtual void onDisconnected(ACameraDevice* device); - virtual bool onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, uint32_t ldr, cv::Mat rgb); - virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames); - virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, std::vector >& frames); + virtual bool onOneCapture(std::shared_ptr characteristics, std::shared_ptr result, uint32_t ldr, uint32_t duration, cv::Mat rgb); + virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames); + virtual bool onBurstCapture(std::shared_ptr characteristics, std::vector >& results, uint32_t ldr, uint32_t duration, std::vector >& frames); void onCaptureProgressed(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result); void onCaptureCompleted(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result);