增加拍照错误处理

TempBranch
Matthew 7 months ago
parent 7978dd32a7
commit 539b701460

@ -1456,6 +1456,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector<
} }
else 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); 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; delete mCamera;
mCamera = NULL; mCamera = NULL;
@ -1466,6 +1467,12 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector<
{ {
TurnOffOtg(NULL); 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) else if (mPhotoInfo.usingSysCamera == 1)
@ -1872,9 +1879,31 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr<ACameraMetadata> characteristi
XYLOG(XYLOG_SEVERITY_ERROR, "Start HDR CH=%u IMGID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.photoId); XYLOG(XYLOG_SEVERITY_ERROR, "Start HDR CH=%u IMGID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.photoId);
std::vector<std::vector<uint8_t> > localFrames; std::vector<std::vector<uint8_t> > localFrames;
localFrames.swap(pByteArrays.get()->byteArrays); localFrames.swap(pByteArrays.get()->byteArrays);
#ifdef _DEBUG
std::vector<uint8_t>& 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); doHdrPlus(localFrames, rgb);
cv::cvtColor(rgb.clone(), rgb, cv::COLOR_RGB2BGR);
localFrames.clear(); localFrames.clear();
#ifdef _DEBUG
std::vector<int> 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); 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<ACameraMetadata> characteristi
XYLOG(XYLOG_SEVERITY_ERROR, "Finish rotation CH=%u IMGID=%u", (uint32_t)photoInfo.channel, (uint32_t)photoInfo.photoId); 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 else
{ {

@ -170,6 +170,7 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA
awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO; awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO;
aeLockAvailable = false; aeLockAvailable = false;
awbLockAvailable = false; awbLockAvailable = false;
m_fatalError = false;
sceneModeSupported = 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); status = ACameraManager_openCamera(camera_manager, cameraId.c_str(), &camera_device_state_callbacks, &camera_device);
if (status != ACAMERA_OK) 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); XYLOG(XYLOG_SEVERITY_ERROR, "Failed to open camera %s res=%d", cameraId.c_str(), status);
return 1; return 1;
} }
@ -1160,6 +1165,21 @@ void NdkCamera::close()
XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::try close %s", mCameraId.c_str()); XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::try close %s", mCameraId.c_str());
camera_status_t res = ACAMERA_OK; 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(); mCaptureFrames.clear();
if ((ACameraManager *)camera_manager != NULL) if ((ACameraManager *)camera_manager != NULL)
@ -1211,7 +1231,7 @@ void NdkCamera::close()
if (mPreviewImageReader != NULL) if (mPreviewImageReader != NULL)
{ {
// AImageReader_setImageListener(image_reader, NULL); AImageReader_setImageListener(mPreviewImageReader, NULL);
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str()); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str());
AImageReader_delete(mPreviewImageReader); AImageReader_delete(mPreviewImageReader);
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str()); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str());
@ -1233,7 +1253,7 @@ void NdkCamera::close()
if (mImageReader != NULL) if (mImageReader != NULL)
{ {
// AImageReader_setImageListener(image_reader, NULL); AImageReader_setImageListener(mImageReader, NULL);
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str()); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str());
AImageReader_delete(mImageReader); AImageReader_delete(mImageReader);
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str()); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str());
@ -1255,7 +1275,7 @@ void NdkCamera::close()
if (mImageReader2 != NULL) if (mImageReader2 != NULL)
{ {
// AImageReader_setImageListener(image_reader, NULL); AImageReader_setImageListener(mImageReader2, NULL);
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str()); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str());
AImageReader_delete(mImageReader2); AImageReader_delete(mImageReader2);
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str()); //XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str());
@ -1327,7 +1347,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
return; return;
} }
// if (mLdr == ~0) if (!mCaptureTriggered)
{ {
uint8_t* y_data = 0; uint8_t* y_data = 0;
int y_len = 0; int y_len = 0;

@ -186,6 +186,11 @@ public:
return mFinalLdr; return mFinalLdr;
} }
bool HasFatalError() const
{
return m_fatalError;
}
bool IsCameraAvailable(const std::string& cameraId); bool IsCameraAvailable(const std::string& cameraId);
static bool convertAImageToNv21(AImage* image, uint8_t** nv21, int32_t& width, int32_t& height); static bool convertAImageToNv21(AImage* image, uint8_t** nv21, int32_t& width, int32_t& height);
@ -211,6 +216,7 @@ protected:
uint8_t awbMode; uint8_t awbMode;
bool aeLockAvailable; bool aeLockAvailable;
bool awbLockAvailable; bool awbLockAvailable;
bool m_fatalError;
uint64_t numberOfPrecaptures; uint64_t numberOfPrecaptures;
unsigned long long m_precaptureStartTime; unsigned long long m_precaptureStartTime;

Loading…
Cancel
Save