From 85a3e5e67d74b05c6cae8b2164646081d0b8ec66 Mon Sep 17 00:00:00 2001 From: Matthew Date: Thu, 18 Apr 2024 12:00:47 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0camera=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E4=B8=AD=E6=96=AD=E7=9A=84=E9=94=99=E8=AF=AF=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/CMakeLists.txt | 2 +- app/src/main/cpp/PhoneDevice.cpp | 27 ++++++++++++++++++++++++++ app/src/main/cpp/PhoneDevice.h | 2 ++ app/src/main/cpp/camera2/ndkcamera.cpp | 8 +++++++- app/src/main/cpp/camera2/ndkcamera.h | 1 + 5 files changed, 38 insertions(+), 2 deletions(-) diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index fde135db..ebd77468 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -31,7 +31,7 @@ add_definitions(-DSQLITE_THREADSAFE=1) add_definitions(-DHAVE_STRING_H) # for memcpy in md5.c # add_definitions(-DUSING_NRSEC) -add_definitions(-DUSING_DOWSE) +# add_definitions(-DUSING_DOWSE) # set(OpenCV_DIR D:/Workspace/deps/OpenCV-android-sdk/sdk/native/jni/) set(OPENCV_EXTRA_MODULES_PATH D:/Workspace/Github/opencv_contrib/modules) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 7a3ea884..de6d7ad2 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -153,6 +153,14 @@ void CPhoneDevice::CPhoneCamera::on_error(const std::string& msg) } } +void CPhoneDevice::CPhoneCamera::onDisconnected(ACameraDevice* device) +{ + if (m_dev != NULL) + { + m_dev->onDisconnected(device); + } +} + CPhoneDevice::CPhoneDevice(JavaVM* vm, jobject service, const std::string& appPath, unsigned int netId, unsigned int versionCode) : mCameraPowerCount(0), mOtgCount(0), mVersionCode(versionCode) { mCamera = NULL; @@ -1324,6 +1332,25 @@ void CPhoneDevice::onError(const std::string& msg) m_threadClose.swap(closeThread); } +void CPhoneDevice::onDisconnected(ACameraDevice* device) +{ + if (mCamera == NULL) + { + return; + } + XYLOG(XYLOG_SEVERITY_ERROR, "Failed to Take Photo (IMGID=%u) as for Disconnection", mPhotoInfo.photoId); + + CPhoneCamera* pCamera = mCamera; + mCamera = NULL; + + TakePhotoCb(false, mPhotoInfo, mPath, 0); + + bool turnOffOtg = (mPhotoInfo.usbCamera != 0); + std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); + // closeThread.detach(); + m_threadClose.swap(closeThread); +} + std::string CPhoneDevice::GetFileName() const { return mPath; diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index bcd53c6a..8e32b09c 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -159,6 +159,7 @@ public: virtual ~CPhoneCamera(); virtual bool on_image(cv::Mat& rgb); virtual void on_error(const std::string& msg); + virtual void onDisconnected(ACameraDevice* device); protected: CPhoneDevice* m_dev; @@ -235,6 +236,7 @@ protected: bool OnImageReady(cv::Mat& mat); void onError(const std::string& msg); + void onDisconnected(ACameraDevice* device); void CloseCamera2(CPhoneCamera* camera, unsigned int photoId, bool turnOffOtg); diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 348a45e5..006324c0 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -41,6 +41,7 @@ static void onUnavailabilityCallback(void* context, const char* cameraId) static void onDisconnected(void* context, ACameraDevice* device) { + ((NdkCamera*)context)->onDisconnected(device); XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::onDisconnected CameraId: %s", ACameraDevice_getId(device)); } @@ -376,7 +377,7 @@ int NdkCamera::open(const std::string& cameraId) { { ACameraDevice_StateCallbacks camera_device_state_callbacks; camera_device_state_callbacks.context = this; - camera_device_state_callbacks.onDisconnected = onDisconnected; + camera_device_state_callbacks.onDisconnected = ::onDisconnected; camera_device_state_callbacks.onError = onError; status = ACameraManager_openCamera(camera_manager, cameraId.c_str(), &camera_device_state_callbacks, &camera_device); @@ -710,6 +711,11 @@ void NdkCamera::on_error(const std::string& msg) { } +void NdkCamera::onDisconnected(ACameraDevice* device) +{ + +} + bool NdkCamera::on_image(cv::Mat& rgb) { return false; diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 2aa03702..c52cb327 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -106,6 +106,7 @@ public: virtual bool on_image(cv::Mat& rgb); virtual void on_error(const std::string& msg); virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height); + virtual void onDisconnected(ACameraDevice* device); void onCaptureProgressed(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result); void onCaptureCompleted(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result);