|
|
|
@ -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,28 +176,17 @@ 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));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ALOGD("End ACameraManager_getCameraIdList");
|
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
|
|
|
|
|
if (m_imagesCaptured != 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);
|
|
|
|
|
}
|
|
|
|
|
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 (image_reader_target)
|
|
|
|
|
{
|
|
|
|
|
if (capture_request)
|
|
|
|
|
{
|
|
|
|
|
res = ACaptureRequest_removeTarget(capture_request, image_reader_target);
|
|
|
|
|
ACaptureRequest_free(capture_request);
|
|
|
|
|
capture_request = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|