From 539b701460184ecaf4fbb7eca010d4405263f0f3 Mon Sep 17 00:00:00 2001 From: Matthew Date: Wed, 13 Nov 2024 15:10:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8B=8D=E7=85=A7=E9=94=99?= =?UTF-8?q?=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/PhoneDevice.cpp | 31 +++++++++++++++++++++++++- app/src/main/cpp/camera2/ndkcamera.cpp | 28 +++++++++++++++++++---- app/src/main/cpp/camera2/ndkcamera.h | 6 +++++ 3 files changed, 60 insertions(+), 5 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index ac9c0e35..e3d8e0fa 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1456,6 +1456,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< } else { + bool hasFatalError = mCamera->HasFatalError(); XYLOG(XYLOG_SEVERITY_DEBUG, "TP: Failed to OpenCamera CH=%u PR=%X PHOTOID=%u", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); delete mCamera; mCamera = NULL; @@ -1466,6 +1467,12 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector< { TurnOffOtg(NULL); } + + if (hasFatalError) + { + XYLOG(XYLOG_SEVERITY_DEBUG, "TP: Fatal Error Happened, will RestartAPP in 60s CH=%u PR=%X PHOTOID=%u", (unsigned int)photoInfo.channel, (unsigned int)photoInfo.preset, photoInfo.photoId); + RestartApp(REBOOT_TYPE_APP, 60000, "FatalErrorOnCamera"); + } } } else if (mPhotoInfo.usingSysCamera == 1) @@ -1872,9 +1879,31 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi XYLOG(XYLOG_SEVERITY_ERROR, "Start HDR CH=%u IMGID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.photoId); std::vector > localFrames; localFrames.swap(pByteArrays.get()->byteArrays); +#ifdef _DEBUG + std::vector& firstFrame = localFrames[0]; + writeFile("/sdcard/com.xypower.mpapp/tmp/dngs/1.dng", &firstFrame[0], firstFrame.size()); + writeFile("/sdcard/com.xypower.mpapp/tmp/dngs/2.dng", &localFrames[1][0], localFrames[1].size()); + writeFile("/sdcard/com.xypower.mpapp/tmp/dngs/3.dng", &localFrames[2][0], localFrames[2].size()); + writeFile("/sdcard/com.xypower.mpapp/tmp/dngs/4.dng", &localFrames[3][0], localFrames[3].size()); + + // readFile("/sdcard/com.xypower.mpapp/tmp/dngs/001.dng", localFrames[0]); + // readFile("/sdcard/com.xypower.mpapp/tmp/dngs/002.dng", localFrames[1]); + // readFile("/sdcard/com.xypower.mpapp/tmp/dngs/003.dng", localFrames[2]); + // readFile("/sdcard/com.xypower.mpapp/tmp/dngs/004.dng", localFrames[3]); + +#endif doHdrPlus(localFrames, rgb); + cv::cvtColor(rgb.clone(), rgb, cv::COLOR_RGB2BGR); + localFrames.clear(); +#ifdef _DEBUG + std::vector params; + params.push_back(cv::IMWRITE_JPEG_QUALITY); + params.push_back(95); + cv::imwrite("/sdcard/com.xypower.mpapp/tmp/1.jpg", rgb, params); +#endif + XYLOG(XYLOG_SEVERITY_ERROR, "Finish HDR CH=%u IMGID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.photoId); { @@ -1917,7 +1946,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi XYLOG(XYLOG_SEVERITY_ERROR, "Finish rotation CH=%u IMGID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.photoId); } - cv::cvtColor(rgb, rgb, cv::COLOR_RGB2BGR); + // cv::cvtColor(rgb, rgb, cv::COLOR_RGB2BGR); } else { diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 680c2692..5386fe90 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -170,6 +170,7 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO; aeLockAvailable = false; awbLockAvailable = false; + m_fatalError = false; sceneModeSupported = false; @@ -654,6 +655,10 @@ int NdkCamera::open(const std::string& cameraId) { status = ACameraManager_openCamera(camera_manager, cameraId.c_str(), &camera_device_state_callbacks, &camera_device); if (status != ACAMERA_OK) { + if (status == ACAMERA_ERROR_MAX_CAMERA_IN_USE) + { + m_fatalError = true; + } XYLOG(XYLOG_SEVERITY_ERROR, "Failed to open camera %s res=%d", cameraId.c_str(), status); return 1; } @@ -1160,6 +1165,21 @@ void NdkCamera::close() XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::try close %s", mCameraId.c_str()); camera_status_t res = ACAMERA_OK; + /* + if (mPreviewImageReader != NULL) + { + AImageReader_setImageListener(mPreviewImageReader, NULL); + } + if (mImageReader != NULL) + { + AImageReader_setImageListener(mImageReader, NULL); + } + if (mImageReader2 != NULL) + { + AImageReader_setImageListener(mImageReader2, NULL); + } + */ + mCaptureFrames.clear(); if ((ACameraManager *)camera_manager != NULL) @@ -1211,7 +1231,7 @@ void NdkCamera::close() if (mPreviewImageReader != NULL) { - // AImageReader_setImageListener(image_reader, NULL); + AImageReader_setImageListener(mPreviewImageReader, NULL); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str()); AImageReader_delete(mPreviewImageReader); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str()); @@ -1233,7 +1253,7 @@ void NdkCamera::close() if (mImageReader != NULL) { - // AImageReader_setImageListener(image_reader, NULL); + AImageReader_setImageListener(mImageReader, NULL); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str()); AImageReader_delete(mImageReader); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str()); @@ -1255,7 +1275,7 @@ void NdkCamera::close() if (mImageReader2 != NULL) { - // AImageReader_setImageListener(image_reader, NULL); + AImageReader_setImageListener(mImageReader2, NULL); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str()); AImageReader_delete(mImageReader2); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str()); @@ -1327,7 +1347,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) return; } - // if (mLdr == ~0) + if (!mCaptureTriggered) { uint8_t* y_data = 0; int y_len = 0; diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 4594d2c9..6c17096c 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -186,6 +186,11 @@ public: return mFinalLdr; } + bool HasFatalError() const + { + return m_fatalError; + } + bool IsCameraAvailable(const std::string& cameraId); static bool convertAImageToNv21(AImage* image, uint8_t** nv21, int32_t& width, int32_t& height); @@ -211,6 +216,7 @@ protected: uint8_t awbMode; bool aeLockAvailable; bool awbLockAvailable; + bool m_fatalError; uint64_t numberOfPrecaptures; unsigned long long m_precaptureStartTime;