| 34 | static const int64_t kMaxExposureTime = 250000000; |
| 35 | |
| 36 | NDKCamera::NDKCamera() |
| 37 | : cameraMgr_(nullptr), |
| 38 | activeCameraId_(""), |
| 39 | cameraFacing_(ACAMERA_LENS_FACING_BACK), |
| 40 | cameraOrientation_(0), |
| 41 | outputContainer_(nullptr), |
| 42 | captureSessionState_(CaptureSessionState::MAX_STATE), |
| 43 | exposureTime_(static_cast<int64_t>(0)) { |
| 44 | valid_ = false; |
| 45 | requests_.resize(CAPTURE_REQUEST_COUNT); |
| 46 | memset(requests_.data(), 0, requests_.size() * sizeof(requests_[0])); |
| 47 | cameras_.clear(); |
| 48 | cameraMgr_ = ACameraManager_create(); |
| 49 | ASSERT(cameraMgr_, "Failed to create cameraManager"); |
| 50 | |
| 51 | // Pick up a back-facing camera to preview |
| 52 | EnumerateCamera(); |
| 53 | ASSERT(activeCameraId_.size(), "Unknown ActiveCameraIdx"); |
| 54 | |
| 55 | // Create back facing camera device |
| 56 | CALL_MGR(openCamera(cameraMgr_, activeCameraId_.c_str(), GetDeviceListener(), |
| 57 | &cameras_[activeCameraId_].device_)); |
| 58 | |
| 59 | CALL_MGR(registerAvailabilityCallback(cameraMgr_, GetManagerListener())); |
| 60 | |
| 61 | // Initialize camera controls(exposure time and sensitivity), pick |
| 62 | // up value of 2% * range + min as starting value (just a number, no magic) |
| 63 | ACameraMetadata* metadataObj; |
| 64 | CALL_MGR(getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(), |
| 65 | &metadataObj)); |
| 66 | ACameraMetadata_const_entry val = {}; |
| 67 | camera_status_t status = ACameraMetadata_getConstEntry( |
| 68 | metadataObj, ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE, &val); |
| 69 | if (status == ACAMERA_OK) { |
| 70 | exposureRange_.min_ = val.data.i64[0]; |
| 71 | if (exposureRange_.min_ < kMinExposureTime) { |
| 72 | exposureRange_.min_ = kMinExposureTime; |
| 73 | } |
| 74 | exposureRange_.max_ = val.data.i64[1]; |
| 75 | if (exposureRange_.max_ > kMaxExposureTime) { |
| 76 | exposureRange_.max_ = kMaxExposureTime; |
| 77 | } |
| 78 | exposureTime_ = exposureRange_.value(2); |
| 79 | } else { |
| 80 | LOGW("Unsupported ACAMERA_SENSOR_INFO_EXPOSURE_TIME_RANGE"); |
| 81 | exposureRange_.min_ = exposureRange_.max_ = 0l; |
| 82 | exposureTime_ = 0l; |
| 83 | } |
| 84 | status = ACameraMetadata_getConstEntry( |
| 85 | metadataObj, ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE, &val); |
| 86 | |
| 87 | if (status == ACAMERA_OK) { |
| 88 | sensitivityRange_.min_ = val.data.i32[0]; |
| 89 | sensitivityRange_.max_ = val.data.i32[1]; |
| 90 | |
| 91 | sensitivity_ = sensitivityRange_.value(2); |
| 92 | } else { |
| 93 | LOGW("failed for ACAMERA_SENSOR_INFO_SENSITIVITY_RANGE"); |