CaptureNdkCameraPrivate::CaptureNdkCameraPrivate(CaptureNdkCamera *self): self(self) { this->m_manager = CameraManagerPtr(ACameraManager_create(), [] (ACameraManager *manager) { ACameraManager_delete(manager); }); }
NDKCamera::NDKCamera() : cameraMgr_(nullptr), activeCameraId_(""), outputContainer_(nullptr), captureSessionState_(CaptureSessionState::MAX_STATE), cameraFacing_(ACAMERA_LENS_FACING_BACK), cameraOrientation_(0), exposureTime_(static_cast<int64_t>(0)) { valid_ = false; requests_.resize(CAPTURE_REQUEST_COUNT); memset(requests_.data(), 0, requests_.size() * sizeof(requests_[0])); cameras_.clear(); cameraMgr_ = ACameraManager_create(); ASSERT(cameraMgr_, "Failed to create cameraManager"); // Pick up a back-facing camera to preview EnumerateCamera(); ASSERT(activeCameraId_.size(), "Unknown ActiveCameraIdx"); // Create back facing camera device CALL_MGR(openCamera(cameraMgr_, activeCameraId_.c_str(), GetDeviceListener(), &cameras_[activeCameraId_].device_)); CALL_MGR(registerAvailabilityCallback(cameraMgr_, GetManagerListener())); // Initialize camera controls(exposure time and sensitivity), pick // up value of 2% * range + min as starting value (just a number, no magic) ACameraMetadata* metadataObj; CALL_MGR(getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(), &metadataObj)); ACameraMetadata_const_entry val = { 0, }; camera_status_t status = ACameraMetadata_getConstEntry( metadataObj, ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE, &val); if (status == ACAMERA_OK) { 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); } else { LOGW("Unsupported ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE"); exposureRange_.min_ = exposureRange_.max_ = 0l; exposureTime_ = 0l; } status = ACameraMetadata_getConstEntry( metadataObj, ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE, &val); if (status == ACAMERA_OK){ sensitivityRange_.min_ = val.data.i32[0]; sensitivityRange_.max_ = val.data.i32[1]; sensitivity_ = sensitivityRange_.value(2); } else { LOGW("failed for ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE"); sensitivityRange_.min_ = sensitivityRange_.max_ = 0; sensitivity_ = 0; } valid_ = true; }