优化拍照代码

serial
BlueMatthew 1 year ago
parent d599f4ed1d
commit e1a9dbc77d

@ -763,16 +763,19 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector<
{ {
if (m_threadClose.joinable()) 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(); 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) 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; 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; mPhotoInfo = photoInfo;
mPath = path; mPath = path;
mOsds = osds; mOsds = osds;
@ -819,7 +822,6 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector<
} }
else else
{ {
JNIEnv* env = NULL; JNIEnv* env = NULL;
bool didAttachThread = false; bool didAttachThread = false;
res = GetJniEnv(m_vm, &env, didAttachThread); res = GetJniEnv(m_vm, &env, didAttachThread);
@ -854,8 +856,7 @@ bool CPhoneDevice::CloseCamera()
void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, unsigned int photoId, bool turnOffOtg) 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)); // std::this_thread::sleep_for(std::chrono::milliseconds(16));
if (camera != NULL) if (camera != NULL)
{ {
@ -863,11 +864,16 @@ void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, unsigned int
delete camera; delete camera;
} }
XYLOG(XYLOG_SEVERITY_DEBUG, "TP: Will Turn Off Power=%u", photoId);
if (turnOffOtg) if (turnOffOtg)
{ {
TurnOffOtg(NULL); TurnOffOtg(NULL);
} }
TurnOffCameraPower(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) void visualize(const char* filename, const ncnn::Mat& m)
@ -1091,10 +1097,11 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat)
bool turnOffOtg = (mPhotoInfo.usbCamera != 0); bool turnOffOtg = (mPhotoInfo.usbCamera != 0);
std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg);
m_threadClose.swap(closeThread); m_threadClose.swap(closeThread);
if (closeThread.joinable()) // closeThread.detach();
/*if (closeThread.joinable())
{ {
closeThread.detach(); closeThread.detach();
} }*/
return res; return res;
} }
@ -1135,7 +1142,8 @@ void CPhoneDevice::onError(const std::string& msg)
bool turnOffOtg = (mPhotoInfo.usbCamera != 0); bool turnOffOtg = (mPhotoInfo.usbCamera != 0);
std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg); std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, mPhotoInfo.photoId, turnOffOtg);
closeThread.detach(); // closeThread.detach();
m_threadClose.swap(closeThread);
} }
std::string CPhoneDevice::GetFileName() const std::string CPhoneDevice::GetFileName() const

@ -153,7 +153,7 @@ int NdkCamera::open(const std::string& cameraId) {
// camera_facing = _camera_facing; // camera_facing = _camera_facing;
camera_manager.Create(); camera_manager.Create();
ACameraManager_registerAvailabilityCallback(camera_manager, &camera_manager_cb); // ACameraManager_registerAvailabilityCallback(camera_manager, &camera_manager_cb);
// find camera // find camera
bool foundIt = false; bool foundIt = false;
@ -164,13 +164,11 @@ int NdkCamera::open(const std::string& cameraId) {
ALOGD("Start ACameraManager_getCameraIdList"); ALOGD("Start ACameraManager_getCameraIdList");
{ {
ACameraIdList *camera_id_list = 0; 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); status = ACameraManager_getCameraIdList(camera_manager, &camera_id_list);
AASSERT(status == ACAMERA_OK, "ACameraManager_getCameraIdList return error, %d", status); 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) { for (int i = 0; i < camera_id_list->numCameras; ++i) {
const char *id = camera_id_list->cameraIds[i]; const char *id = camera_id_list->cameraIds[i];
if (cameraId.compare(id) == 0) { if (cameraId.compare(id) == 0) {
@ -178,29 +176,18 @@ int NdkCamera::open(const std::string& cameraId) {
break; break;
} }
} }
ACameraManager_deleteCameraIdList(camera_id_list); ACameraManager_deleteCameraIdList(camera_id_list);
if (foundIt) if (foundIt)
{ {
break; break;
} }
std::this_thread::sleep_for(std::chrono::milliseconds(16));
if (retry == 0)
{
for (int idx = 0; idx < 128; idx++)
{
if (IsCameraAvailable(cameraId))
{
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(16));
}
}
} }
ALOGD("End ACameraManager_getCameraIdList"); ALOGD("End ACameraManager_getCameraIdList");
if (!foundIt) // ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb);
if (!foundIt)
{ {
return 1; return 1;
} }
@ -390,8 +377,6 @@ int NdkCamera::open(const std::string& cameraId) {
ACameraMetadata_free(camera_metadata); ACameraMetadata_free(camera_metadata);
} }
// open camera // open camera
{ {
ACameraDevice_StateCallbacks camera_device_state_callbacks; 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; uint8_t trig = ACAMERA_CONTROL_AF_TRIGGER_START;
status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig);
m_imagesCaptured = (status == ACAMERA_OK) ? ~0 : 0; m_imagesCaptured = (status == ACAMERA_OK) ? ~0 : 0;
// m_imagesCaptured = 0;
} }
// TODO:
m_imagesCaptured = 0;
uint8_t awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO; uint8_t awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO;
// res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AWB_MODE, 1, &awbMode); // 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.onCaptureSequenceAborted = onCaptureSequenceAborted;
camera_capture_session_capture_callbacks.onCaptureBufferLost = 0; camera_capture_session_capture_callbacks.onCaptureBufferLost = 0;
status = ACameraCaptureSession_setRepeatingRequest(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, &captureSequenceId); if (m_imagesCaptured != 0)
// ACameraCaptureSession_capture(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, &captureSequenceId); {
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; return status == ACAMERA_OK ? 0 : 1;
@ -531,35 +525,35 @@ int NdkCamera::open(const std::string& cameraId) {
void NdkCamera::close() void NdkCamera::close()
{ {
XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::try close %s", mCameraId.c_str());
camera_status_t res = ACAMERA_OK; camera_status_t res = ACAMERA_OK;
if ((ACameraManager *)camera_manager != NULL) if ((ACameraManager *)camera_manager != NULL)
{ {
res = ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb); // res = ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb);
} }
if (capture_session) if (capture_session)
{ {
res = ACameraCaptureSession_stopRepeating(capture_session); // res = ACameraCaptureSession_stopRepeating(capture_session);
ACameraCaptureSession_close(capture_session); ACameraCaptureSession_close(capture_session);
capture_session = 0; 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 (image_reader_target)
{ {
if (capture_request)
{
res = ACaptureRequest_removeTarget(capture_request, image_reader_target);
}
ACameraOutputTarget_free(image_reader_target); ACameraOutputTarget_free(image_reader_target);
image_reader_target = 0; image_reader_target = 0;
} }
if (capture_request)
{
ACaptureRequest_free(capture_request);
capture_request = 0;
}
if (capture_session_output) if (capture_session_output)
{ {
@ -579,8 +573,9 @@ void NdkCamera::close()
if (camera_device) 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); ACameraDevice_close(camera_device);
XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::closed device %s, %p", mCameraId.c_str(), camera_device);
camera_device = 0; camera_device = 0;
} }
@ -593,9 +588,14 @@ void NdkCamera::close()
if (image_reader != NULL) if (image_reader != NULL)
{ {
AImageReader_setImageListener(image_reader, NULL); AImageReader_setImageListener(image_reader, NULL);
XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::AImageReader_delete %s", mCameraId.c_str());
AImageReader_delete(image_reader); AImageReader_delete(image_reader);
XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str());
image_reader = 0; image_reader = 0;
} }
XYLOG(XYLOG_SEVERITY_INFO, "CameraStatus::closed %s", mCameraId.c_str());
} }
void NdkCamera::onImageAvailable(AImageReader* reader) void NdkCamera::onImageAvailable(AImageReader* reader)
@ -608,11 +608,13 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
if (status != AMEDIA_OK) if (status != AMEDIA_OK)
{ {
// error // error
XYLOG(XYLOG_SEVERITY_ERROR, "AImageReader_acquireLatestImage error: %d", status);
return; return;
} }
if (m_imagesCaptured == ~0 || m_imagesCaptured >= 1) if (m_imagesCaptured == ~0 || m_imagesCaptured >= 1)
{ {
XYLOG(XYLOG_SEVERITY_ERROR, "m_imagesCaptured=%u wait for next image", m_imagesCaptured);
// Not Ready Or Taken // Not Ready Or Taken
AImage_delete(image); AImage_delete(image);
return; return;
@ -712,7 +714,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
camera_status_t cs = ACameraCaptureSession_stopRepeating(capture_session); camera_status_t cs = ACameraCaptureSession_stopRepeating(capture_session);
if (cs != ACAMERA_OK) if (cs != ACAMERA_OK)
{ {
int aa = 0; XYLOG(XYLOG_SEVERITY_ERROR, "ACameraCaptureSession_stopRepeating error=%d", cs);
} }
} }
} }

Loading…
Cancel
Save