|
|
|
@ -25,11 +25,13 @@
|
|
|
|
|
|
|
|
|
|
static void onAvailabilityCallback(void* context, const char* cameraId)
|
|
|
|
|
{
|
|
|
|
|
((NdkCamera*)context)->onAvailabilityCallback(cameraId);
|
|
|
|
|
ALOGI("CameraStatus::onAvailability CameraId: %s", cameraId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void onUnavailabilityCallback(void* context, const char* cameraId)
|
|
|
|
|
{
|
|
|
|
|
((NdkCamera*)context)->onUnavailabilityCallback(cameraId);
|
|
|
|
|
ALOGI("CameraStatus::onUnavailability CameraId: %s", cameraId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -123,11 +125,9 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA
|
|
|
|
|
nightModeSupported = false;
|
|
|
|
|
nightPortraitModeSupported = false;
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
camera_manager_cb.context = this;
|
|
|
|
|
camera_manager_cb.onCameraAvailable = onAvailabilityCallback;
|
|
|
|
|
camera_manager_cb.onCameraUnavailable = onUnavailabilityCallback;
|
|
|
|
|
#endif
|
|
|
|
|
camera_manager_cb.onCameraAvailable = ::onAvailabilityCallback;
|
|
|
|
|
camera_manager_cb.onCameraUnavailable = ::onUnavailabilityCallback;
|
|
|
|
|
|
|
|
|
|
camera_manager = 0;
|
|
|
|
|
camera_device = 0;
|
|
|
|
@ -144,8 +144,6 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA
|
|
|
|
|
NdkCamera::~NdkCamera()
|
|
|
|
|
{
|
|
|
|
|
close();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
@ -154,221 +152,224 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
|
// camera_facing = _camera_facing;
|
|
|
|
|
|
|
|
|
|
camera_manager = ACameraManager_create();
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
ACameraManager_registerAvailabilityCallback(camera_manager, &camera_manager_cb);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// find front camera
|
|
|
|
|
std::string camera_id;
|
|
|
|
|
// find camera
|
|
|
|
|
bool foundIt = false;
|
|
|
|
|
DisplayDimension disp(mWidth, mHeight);
|
|
|
|
|
DisplayDimension foundRes = disp;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraIdList *camera_id_list = 0;
|
|
|
|
|
ACameraManager_getCameraIdList(camera_manager, &camera_id_list);
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < camera_id_list->numCameras; ++i)
|
|
|
|
|
for (int retry = 0; retry < 2; retry++)
|
|
|
|
|
{
|
|
|
|
|
const char *id = camera_id_list->cameraIds[i];
|
|
|
|
|
if (cameraId.compare(id) != 0) {
|
|
|
|
|
continue;
|
|
|
|
|
ACameraManager_getCameraIdList(camera_manager, &camera_id_list);
|
|
|
|
|
// 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) {
|
|
|
|
|
foundIt = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
ACameraMetadata * camera_metadata = 0;
|
|
|
|
|
ACameraManager_getCameraCharacteristics(camera_manager, id, &camera_metadata);
|
|
|
|
|
|
|
|
|
|
// query faceing
|
|
|
|
|
acamera_metadata_enum_android_lens_facing_t facing = ACAMERA_LENS_FACING_FRONT;
|
|
|
|
|
ACameraManager_deleteCameraIdList(camera_id_list);
|
|
|
|
|
if (foundIt)
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_LENS_FACING, &e);
|
|
|
|
|
facing = (acamera_metadata_enum_android_lens_facing_t) e.data.u8[0];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
camera_facing = facing;
|
|
|
|
|
if (retry == 0)
|
|
|
|
|
{
|
|
|
|
|
for (int idx = 0; idx < 128; idx++)
|
|
|
|
|
{
|
|
|
|
|
if (IsCameraAvailable(cameraId))
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(16));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
camera_id = cameraId;
|
|
|
|
|
camera_id.assign(id, strlen(id));
|
|
|
|
|
if (!foundIt)
|
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// query orientation
|
|
|
|
|
int orientation = 0;
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_SENSOR_ORIENTATION, &e);
|
|
|
|
|
mCameraId = cameraId;
|
|
|
|
|
|
|
|
|
|
orientation = (int) e.data.i32[0];
|
|
|
|
|
}
|
|
|
|
|
ACameraMetadata * camera_metadata = 0;
|
|
|
|
|
ACameraManager_getCameraCharacteristics(camera_manager, cameraId.c_str(), &camera_metadata);
|
|
|
|
|
|
|
|
|
|
camera_orientation = orientation;
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, &e);
|
|
|
|
|
// format of the data: format, width, height, input?, type int32
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, &e);
|
|
|
|
|
// format of the data: format, width, height, input?, type int32
|
|
|
|
|
// DisplayDimension foundRes(4000, 4000);
|
|
|
|
|
// DisplayDimension maxJPG(0, 0);
|
|
|
|
|
|
|
|
|
|
// DisplayDimension foundRes(4000, 4000);
|
|
|
|
|
// DisplayDimension maxJPG(0, 0);
|
|
|
|
|
foundIt = false;
|
|
|
|
|
unsigned long long minRatio = -1;
|
|
|
|
|
DisplayDimension temp;
|
|
|
|
|
unsigned long long pixels = (unsigned long long)mWidth * mHeight;
|
|
|
|
|
|
|
|
|
|
unsigned long long minRatio = -1;
|
|
|
|
|
DisplayDimension temp;
|
|
|
|
|
unsigned long long pixels = (unsigned long long)mWidth * mHeight;
|
|
|
|
|
for (int i = 0; i < e.count; i += 4)
|
|
|
|
|
{
|
|
|
|
|
int32_t input = e.data.i32[i + 3];
|
|
|
|
|
int32_t format = e.data.i32[i + 0];
|
|
|
|
|
if (input) continue;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < e.count; i += 4)
|
|
|
|
|
if (format == AIMAGE_FORMAT_YUV_420_888 || format == AIMAGE_FORMAT_JPEG)
|
|
|
|
|
{
|
|
|
|
|
int32_t input = e.data.i32[i + 3];
|
|
|
|
|
int32_t format = e.data.i32[i + 0];
|
|
|
|
|
if (input) continue;
|
|
|
|
|
|
|
|
|
|
if (format == AIMAGE_FORMAT_YUV_420_888 || format == AIMAGE_FORMAT_JPEG)
|
|
|
|
|
DisplayDimension res(e.data.i32[i + 1], e.data.i32[i + 2]);
|
|
|
|
|
if (!disp.IsSameRatio(res))
|
|
|
|
|
{
|
|
|
|
|
DisplayDimension res(e.data.i32[i + 1], e.data.i32[i + 2]);
|
|
|
|
|
if (!disp.IsSameRatio(res))
|
|
|
|
|
unsigned long long ps = res.width() * res.height();
|
|
|
|
|
unsigned long long ratio = (ps >= pixels) ? (ps - pixels) : (pixels - ps);
|
|
|
|
|
if (ratio < minRatio)
|
|
|
|
|
{
|
|
|
|
|
unsigned long long ps = res.width() * res.height();
|
|
|
|
|
unsigned long long ratio = (ps >= pixels) ? (ps - pixels) : (pixels - ps);
|
|
|
|
|
if (ratio < minRatio)
|
|
|
|
|
{
|
|
|
|
|
temp = res;
|
|
|
|
|
minRatio = ratio;
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
temp = res;
|
|
|
|
|
minRatio = ratio;
|
|
|
|
|
}
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (format == AIMAGE_FORMAT_YUV_420_888 && res > disp)
|
|
|
|
|
{
|
|
|
|
|
foundIt = true;
|
|
|
|
|
foundRes = res;
|
|
|
|
|
}/* else if (format == AIMAGE_FORMAT_JPEG && res > maxJPG) {
|
|
|
|
|
if (format == AIMAGE_FORMAT_YUV_420_888 && res > disp)
|
|
|
|
|
{
|
|
|
|
|
foundIt = true;
|
|
|
|
|
foundRes = res;
|
|
|
|
|
}/* else if (format == AIMAGE_FORMAT_JPEG && res > maxJPG) {
|
|
|
|
|
maxJPG = res;
|
|
|
|
|
}*/
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!foundIt)
|
|
|
|
|
{
|
|
|
|
|
foundRes = temp;
|
|
|
|
|
foundIt = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!foundIt)
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE, &e);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_CONTROL_AF_AVAILABLE_MODES, &e);
|
|
|
|
|
afSupported = (status == ACAMERA_OK) && !(e.count == 0 || (e.count == 1 && e.data.u8[0] == ACAMERA_CONTROL_AF_MODE_OFF));
|
|
|
|
|
foundRes = temp;
|
|
|
|
|
foundIt = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!foundIt)
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_free(camera_metadata);
|
|
|
|
|
ALOGE("Camera RES(%d, %d) Not Found on ID: %s", mWidth, mHeight, cameraId.c_str());
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// query faceing
|
|
|
|
|
acamera_metadata_enum_android_lens_facing_t facing = ACAMERA_LENS_FACING_FRONT;
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_LENS_FACING, &e);
|
|
|
|
|
facing = (acamera_metadata_enum_android_lens_facing_t) e.data.u8[0];
|
|
|
|
|
}
|
|
|
|
|
camera_facing = facing;
|
|
|
|
|
|
|
|
|
|
// query orientation
|
|
|
|
|
int orientation = 0;
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_SENSOR_ORIENTATION, &e);
|
|
|
|
|
orientation = (int) e.data.i32[0];
|
|
|
|
|
}
|
|
|
|
|
camera_orientation = orientation;
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_LENS_INFO_MINIMUM_FOCUS_DISTANCE, &e);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_CONTROL_AF_AVAILABLE_MODES, &e);
|
|
|
|
|
afSupported = (status == ACAMERA_OK) && !(e.count == 0 || (e.count == 1 && e.data.u8[0] == ACAMERA_CONTROL_AF_MODE_OFF));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry val = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE, &val);
|
|
|
|
|
if (status == ACAMERA_OK)
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry val = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE, &val);
|
|
|
|
|
if (status == ACAMERA_OK)
|
|
|
|
|
exposureRange.min_ = val.data.i64[0];
|
|
|
|
|
if (exposureRange.min_ < kMinExposureTime)
|
|
|
|
|
{
|
|
|
|
|
exposureRange.min_ = val.data.i64[0];
|
|
|
|
|
if (exposureRange.min_ < kMinExposureTime)
|
|
|
|
|
{
|
|
|
|
|
exposureRange.min_ = kMinExposureTime;
|
|
|
|
|
}
|
|
|
|
|
exposureRange.max_ = val.data.i64[1];
|
|
|
|
|
if (exposureRange.max_ > kMaxExposureTime)
|
|
|
|
|
{
|
|
|
|
|
exposureRange.max_ = kMaxExposureTime;
|
|
|
|
|
}
|
|
|
|
|
// exposureTime = exposureRange.value(2);
|
|
|
|
|
exposureRange.min_ = kMinExposureTime;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
exposureRange.max_ = val.data.i64[1];
|
|
|
|
|
if (exposureRange.max_ > kMaxExposureTime)
|
|
|
|
|
{
|
|
|
|
|
ALOGW("Unsupported ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE");
|
|
|
|
|
exposureRange.min_ = exposureRange.max_ = 0l;
|
|
|
|
|
// exposureTime_ = 0l;
|
|
|
|
|
exposureRange.max_ = kMaxExposureTime;
|
|
|
|
|
}
|
|
|
|
|
// exposureTime = exposureRange.value(2);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ALOGW("Unsupported ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE");
|
|
|
|
|
exposureRange.min_ = exposureRange.max_ = 0l;
|
|
|
|
|
// exposureTime_ = 0l;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry val = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_CONTROL_AE_COMPENSATION_RANGE, &val);
|
|
|
|
|
if (status == ACAMERA_OK)
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry val = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata, ACAMERA_CONTROL_AE_COMPENSATION_RANGE, &val);
|
|
|
|
|
if (status == ACAMERA_OK)
|
|
|
|
|
{
|
|
|
|
|
aeCompensationRange.min_ = val.data.i32[0];
|
|
|
|
|
aeCompensationRange.max_ = val.data.i32[1];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ALOGW("Unsupported ACAMERA_CONTROL_AE_COMPENSATION_RANGE");
|
|
|
|
|
aeCompensationRange.min_ = aeCompensationRange.max_ = 0l;
|
|
|
|
|
}
|
|
|
|
|
aeCompensationRange.min_ = val.data.i32[0];
|
|
|
|
|
aeCompensationRange.max_ = val.data.i32[1];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ALOGW("Unsupported ACAMERA_CONTROL_AE_COMPENSATION_RANGE");
|
|
|
|
|
aeCompensationRange.min_ = aeCompensationRange.max_ = 0l;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry val = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE, &val);
|
|
|
|
|
if (status == ACAMERA_OK)
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry val = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE, &val);
|
|
|
|
|
if (status == ACAMERA_OK)
|
|
|
|
|
sensitivityRange.min_ = val.data.i32[0];
|
|
|
|
|
sensitivityRange.max_ = val.data.i32[1];
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ALOGW("failed for ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE");
|
|
|
|
|
sensitivityRange.min_ = sensitivityRange.max_ = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_CONTROL_AVAILABLE_SCENE_MODES, &e);
|
|
|
|
|
for (int i = 0; i < e.count; i++)
|
|
|
|
|
{
|
|
|
|
|
if (ACAMERA_CONTROL_SCENE_MODE_HDR == e.data.u8[i])
|
|
|
|
|
{
|
|
|
|
|
sensitivityRange.min_ = val.data.i32[0];
|
|
|
|
|
sensitivityRange.max_ = val.data.i32[1];
|
|
|
|
|
hdrSupported = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else if (ACAMERA_CONTROL_SCENE_MODE_NIGHT == e.data.u8[i])
|
|
|
|
|
{
|
|
|
|
|
ALOGW("failed for ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE");
|
|
|
|
|
sensitivityRange.min_ = sensitivityRange.max_ = 0;
|
|
|
|
|
nightModeSupported = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
ACameraMetadata_const_entry e = {0};
|
|
|
|
|
camera_status_t status = ACameraMetadata_getConstEntry(camera_metadata,ACAMERA_CONTROL_AVAILABLE_SCENE_MODES, &e);
|
|
|
|
|
for (int i = 0; i < e.count; i++)
|
|
|
|
|
else if (ACAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT == e.data.u8[i])
|
|
|
|
|
{
|
|
|
|
|
if (ACAMERA_CONTROL_SCENE_MODE_HDR == e.data.u8[i])
|
|
|
|
|
{
|
|
|
|
|
hdrSupported = true;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
else if (ACAMERA_CONTROL_SCENE_MODE_NIGHT == e.data.u8[i])
|
|
|
|
|
{
|
|
|
|
|
nightModeSupported = true;
|
|
|
|
|
}
|
|
|
|
|
else if (ACAMERA_CONTROL_SCENE_MODE_NIGHT_PORTRAIT == e.data.u8[i])
|
|
|
|
|
{
|
|
|
|
|
nightPortraitModeSupported = true;
|
|
|
|
|
}
|
|
|
|
|
nightPortraitModeSupported = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ACameraMetadata_free(camera_metadata);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ACameraManager_deleteCameraIdList(camera_id_list);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (camera_id.empty() || !foundIt) {
|
|
|
|
|
ALOGE("CameraId %s With RES(%d, %d) Not Found", cameraId.c_str(), mWidth, mHeight);
|
|
|
|
|
return 1;
|
|
|
|
|
ACameraMetadata_free(camera_metadata);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: PATCH!!!!
|
|
|
|
|
if (camera_id == "0")
|
|
|
|
|
{
|
|
|
|
|
// afSupported = true;
|
|
|
|
|
}
|
|
|
|
|
if (camera_id == "1")
|
|
|
|
|
{
|
|
|
|
|
#if 0
|
|
|
|
|
camera_facing = 1;
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
if (camera_id == "2")
|
|
|
|
|
{
|
|
|
|
|
// camera_orientation += 180;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mCameraId = camera_id;
|
|
|
|
|
|
|
|
|
|
camera_status_t res = ACAMERA_OK;
|
|
|
|
|
// setup imagereader and its surface
|
|
|
|
|
{
|
|
|
|
@ -394,7 +395,7 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
|
camera_device_state_callbacks.onDisconnected = onDisconnected;
|
|
|
|
|
camera_device_state_callbacks.onError = onError;
|
|
|
|
|
|
|
|
|
|
res = ACameraManager_openCamera(camera_manager, camera_id.c_str(), &camera_device_state_callbacks, &camera_device);
|
|
|
|
|
res = ACameraManager_openCamera(camera_manager, cameraId.c_str(), &camera_device_state_callbacks, &camera_device);
|
|
|
|
|
if (res != ACAMERA_OK)
|
|
|
|
|
{
|
|
|
|
|
ALOGE("Failed to open camera res=%d", res);
|
|
|
|
@ -402,7 +403,7 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ALOGI("CameraStatus::Open %s %d", camera_id.c_str(), camera_orientation);
|
|
|
|
|
ALOGI("CameraStatus::Open %s %d", cameraId.c_str(), camera_orientation);
|
|
|
|
|
|
|
|
|
|
// std::this_thread::sleep_for(std::chrono::milliseconds(128));
|
|
|
|
|
// capture request
|
|
|
|
@ -573,9 +574,7 @@ void NdkCamera::close()
|
|
|
|
|
|
|
|
|
|
if (camera_manager)
|
|
|
|
|
{
|
|
|
|
|
#ifdef _DEBUG
|
|
|
|
|
ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb);
|
|
|
|
|
#endif
|
|
|
|
|
ACameraManager_delete(camera_manager);
|
|
|
|
|
camera_manager = 0;
|
|
|
|
|
}
|
|
|
|
@ -846,3 +845,29 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque
|
|
|
|
|
|
|
|
|
|
// __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onCaptureCompleted %p %p %p", session, request, result);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NdkCamera::onAvailabilityCallback(const char* cameraId)
|
|
|
|
|
{
|
|
|
|
|
std::string s(cameraId);
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
m_availableCameras.insert(s);
|
|
|
|
|
m_locker.unlock();
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
void NdkCamera::onUnavailabilityCallback(const char* cameraId)
|
|
|
|
|
{
|
|
|
|
|
std::string s(cameraId);
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
m_availableCameras.erase(s);
|
|
|
|
|
m_locker.unlock();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool NdkCamera::IsCameraAvailable(const std::string& cameraId)
|
|
|
|
|
{
|
|
|
|
|
bool existed = false;
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
existed = (m_availableCameras.find(cameraId) != m_availableCameras.cend());
|
|
|
|
|
m_locker.unlock();
|
|
|
|
|
|
|
|
|
|
return existed;
|
|
|
|
|
}
|
|
|
|
|