优化拍照代码

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())
{
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

@ -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);
}
}
}

Loading…
Cancel
Save