From e1a9dbc77d9da580fcf40b3372d893d3f4825560 Mon Sep 17 00:00:00 2001 From: BlueMatthew Date: Fri, 19 Jan 2024 15:23:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8B=8D=E7=85=A7=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 24 ++++++--- app/src/main/cpp/camera2/ndkcamera.cpp | 74 +++++++++++++------------- 2 files changed, 54 insertions(+), 44 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index fd37cc12..842c1497 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -763,16 +763,19 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< { 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); m_threadClose.join(); + XYLOG(XYLOG_SEVERITY_INFO, "TP: Wait Prev Thread End CH=%u PR=%X PHOTOID=%u", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); } if (mCamera != NULL) { - // delete mCamera; + XYLOG(XYLOG_SEVERITY_INFO, "TP: mCamera ISNOT null CH=%u PR=%X PHOTOID=%u", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); + delete mCamera; mCamera = NULL; } - XYLOG(XYLOG_SEVERITY_INFO, "TAKE_PHOTO: CH=%u PR=%X PHOTOID=%u", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); + XYLOG(XYLOG_SEVERITY_INFO, "TP: CH=%u PR=%X PHOTOID=%u", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); mPhotoInfo = photoInfo; mPath = path; mOsds = osds; @@ -819,7 +822,6 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } else { - JNIEnv* env = NULL; bool didAttachThread = false; res = GetJniEnv(m_vm, &env, didAttachThread); @@ -854,8 +856,7 @@ bool CPhoneDevice::CloseCamera() void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, unsigned int photoId, bool turnOffOtg) { - XYLOG(XYLOG_SEVERITY_DEBUG, "TP: CloseCamera PHOTOID=%u", photoId); - + XYLOG(XYLOG_SEVERITY_DEBUG, "TP: Start CloseCamera PHOTOID=%u", photoId); // std::this_thread::sleep_for(std::chrono::milliseconds(16)); if (camera != NULL) { @@ -863,11 +864,16 @@ void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, unsigned int delete camera; } + XYLOG(XYLOG_SEVERITY_DEBUG, "TP: Will Turn Off Power=%u", photoId); if (turnOffOtg) { TurnOffOtg(NULL); } TurnOffCameraPower(NULL); + XYLOG(XYLOG_SEVERITY_DEBUG, "TP: End Turn Off Power=%u", photoId); + + XYLOG(XYLOG_SEVERITY_DEBUG, "TP: CloseCamera PHOTOID=%u", photoId); + } void visualize(const char* filename, const ncnn::Mat& m) @@ -1091,10 +1097,11 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) bool turnOffOtg = (mPhotoInfo.usbCamera != 0); std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); m_threadClose.swap(closeThread); - if (closeThread.joinable()) + // closeThread.detach(); + /*if (closeThread.joinable()) { closeThread.detach(); - } + }*/ return res; } @@ -1135,7 +1142,8 @@ void CPhoneDevice::onError(const std::string& msg) bool turnOffOtg = (mPhotoInfo.usbCamera != 0); std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); - closeThread.detach(); + // closeThread.detach(); + m_threadClose.swap(closeThread); } std::string CPhoneDevice::GetFileName() const diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 11c4d393..e1723c10 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -153,7 +153,7 @@ int NdkCamera::open(const std::string& cameraId) { // camera_facing = _camera_facing; camera_manager.Create(); - ACameraManager_registerAvailabilityCallback(camera_manager, &camera_manager_cb); + // ACameraManager_registerAvailabilityCallback(camera_manager, &camera_manager_cb); // find camera bool foundIt = false; @@ -164,13 +164,11 @@ int NdkCamera::open(const std::string& cameraId) { ALOGD("Start ACameraManager_getCameraIdList"); { ACameraIdList *camera_id_list = 0; - for (int retry = 0; retry < 2; retry++) + for (int retry = 0; retry < 100; retry++) { status = ACameraManager_getCameraIdList(camera_manager, &camera_id_list); AASSERT(status == ACAMERA_OK, "ACameraManager_getCameraIdList return error, %d", status); - // ACameraManager_getCameraIdList will fire AvailabilityCallback - for (int i = 0; i < camera_id_list->numCameras; ++i) { const char *id = camera_id_list->cameraIds[i]; if (cameraId.compare(id) == 0) { @@ -178,29 +176,18 @@ int NdkCamera::open(const std::string& cameraId) { break; } } - ACameraManager_deleteCameraIdList(camera_id_list); if (foundIt) { break; } - - if (retry == 0) - { - for (int idx = 0; idx < 128; idx++) - { - if (IsCameraAvailable(cameraId)) - { - break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(16)); - } - } + std::this_thread::sleep_for(std::chrono::milliseconds(16)); } ALOGD("End ACameraManager_getCameraIdList"); - if (!foundIt) + // ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb); + if (!foundIt) { return 1; } @@ -390,8 +377,6 @@ int NdkCamera::open(const std::string& cameraId) { ACameraMetadata_free(camera_metadata); } - - // open camera { ACameraDevice_StateCallbacks camera_device_state_callbacks; @@ -470,9 +455,12 @@ int NdkCamera::open(const std::string& cameraId) { uint8_t trig = ACAMERA_CONTROL_AF_TRIGGER_START; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); m_imagesCaptured = (status == ACAMERA_OK) ? ~0 : 0; - // m_imagesCaptured = 0; + } + // TODO: + m_imagesCaptured = 0; + uint8_t awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO; // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AWB_MODE, 1, &awbMode); @@ -522,8 +510,14 @@ int NdkCamera::open(const std::string& cameraId) { camera_capture_session_capture_callbacks.onCaptureSequenceAborted = onCaptureSequenceAborted; camera_capture_session_capture_callbacks.onCaptureBufferLost = 0; - status = ACameraCaptureSession_setRepeatingRequest(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, &captureSequenceId); - // ACameraCaptureSession_capture(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, &captureSequenceId); + if (m_imagesCaptured != 0) + { + status = ACameraCaptureSession_setRepeatingRequest(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, &captureSequenceId); + } + else + { + status = ACameraCaptureSession_capture(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, &captureSequenceId); + } } return status == ACAMERA_OK ? 0 : 1; @@ -531,35 +525,35 @@ int NdkCamera::open(const std::string& cameraId) { void NdkCamera::close() { + XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::try close %s", mCameraId.c_str()); camera_status_t res = ACAMERA_OK; if ((ACameraManager *)camera_manager != NULL) { - res = ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb); + // res = ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb); } if (capture_session) { - res = ACameraCaptureSession_stopRepeating(capture_session); + // res = ACameraCaptureSession_stopRepeating(capture_session); ACameraCaptureSession_close(capture_session); capture_session = 0; } + if (capture_request) + { + res = ACaptureRequest_removeTarget(capture_request, image_reader_target); + ACaptureRequest_free(capture_request); + capture_request = 0; + } + if (image_reader_target) { - if (capture_request) - { - res = ACaptureRequest_removeTarget(capture_request, image_reader_target); - } ACameraOutputTarget_free(image_reader_target); image_reader_target = 0; } - if (capture_request) - { - ACaptureRequest_free(capture_request); - capture_request = 0; - } + if (capture_session_output) { @@ -579,8 +573,9 @@ void NdkCamera::close() if (camera_device) { - XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::try close %s", mCameraId.c_str()); + XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::close device %s, %p", mCameraId.c_str(), camera_device); ACameraDevice_close(camera_device); + XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::closed device %s, %p", mCameraId.c_str(), camera_device); camera_device = 0; } @@ -593,9 +588,14 @@ void NdkCamera::close() if (image_reader != NULL) { AImageReader_setImageListener(image_reader, NULL); + XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::AImageReader_delete %s", mCameraId.c_str()); + AImageReader_delete(image_reader); + XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str()); + image_reader = 0; } + XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::closed %s", mCameraId.c_str()); } void NdkCamera::onImageAvailable(AImageReader* reader) @@ -608,11 +608,13 @@ void NdkCamera::onImageAvailable(AImageReader* reader) if (status != AMEDIA_OK) { // error + XYLOG(XYLOG_SEVERITY_ERROR, "AImageReader_acquireLatestImage error: %d", status); return; } if (m_imagesCaptured == ~0 || m_imagesCaptured >= 1) { + XYLOG(XYLOG_SEVERITY_ERROR, "m_imagesCaptured=%u wait for next image", m_imagesCaptured); // Not Ready Or Taken AImage_delete(image); return; @@ -712,7 +714,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) camera_status_t cs = ACameraCaptureSession_stopRepeating(capture_session); if (cs != ACAMERA_OK) { - int aa = 0; + XYLOG(XYLOG_SEVERITY_ERROR, "ACameraCaptureSession_stopRepeating error=%d", cs); } } }