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