bool CaptureNdkCameraPrivate::nearestFpsRangue(const QString &cameraId, const AkFrac &fps, int32_t &min, int32_t &max) const { ACameraMetadata *metaData {nullptr}; if (ACameraManager_getCameraCharacteristics(this->m_manager.data(), cameraId.toStdString().c_str(), &metaData) != ACAMERA_OK) { return false; } ACameraMetadata_const_entry frameRates; if (ACameraMetadata_getConstEntry(metaData, ACAMERA_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, &frameRates) != ACAMERA_OK) { ACameraMetadata_free(metaData); return false; } auto fpsValue = fps.value(); bool ok = false; min = 0; max = 0; for (uint32_t i = 0; i < frameRates.count; i += 2) { auto fpsMin = frameRates.data.i32[i + 0]; auto fpsMax = frameRates.data.i32[i + 1]; if (fpsValue >= qreal(fpsMin) && fpsValue <= qreal(fpsMax)) { min = fpsMin; max = fpsMax; ok = true; break; } } ACameraMetadata_free(metaData); return ok; }
/** * EnumerateCamera() * Loop through cameras on the system, pick up * 1) back facing one if available * 2) otherwise pick the first one reported to us */ void NDKCamera::EnumerateCamera() { ACameraIdList* cameraIds = nullptr; CALL_MGR(getCameraIdList(cameraMgr_, &cameraIds)); for (int i = 0; i < cameraIds->numCameras; ++i) { const char* id = cameraIds->cameraIds[i]; ACameraMetadata* metadataObj; CALL_MGR(getCameraCharacteristics(cameraMgr_, id, &metadataObj)); int32_t count = 0; const uint32_t* tags = nullptr; ACameraMetadata_getAllTags(metadataObj, &count, &tags); for (int tagIdx = 0; tagIdx < count; ++tagIdx) { if (ACAMERA_LENS_FACING == tags[tagIdx]) { ACameraMetadata_const_entry lensInfo = { 0, }; CALL_METADATA(getConstEntry(metadataObj, tags[tagIdx], &lensInfo)); CameraId cam(id); cam.facing_ = static_cast<acamera_metadata_enum_android_lens_facing_t>( lensInfo.data.u8[0]); cam.owner_ = false; cam.device_ = nullptr; cameras_[cam.id_] = cam; if (cam.facing_ == ACAMERA_LENS_FACING_BACK) { activeCameraId_ = cam.id_; } break; } } ACameraMetadata_free(metadataObj); } ASSERT(cameras_.size(), "No Camera Available on the device"); if (activeCameraId_.length() == 0) { // if no back facing camera found, pick up the first one to use... activeCameraId_ = cameras_.begin()->second.id_; } ACameraManager_deleteCameraIdList(cameraIds); }
/** * GetSensorOrientation() * Retrieve current sensor orientation regarding to the phone device * orientation * SensorOrientation is NOT settable. */ bool NDKCamera::GetSensorOrientation(int32_t* facing, int32_t* angle) { if (!cameraMgr_) { return false; } ACameraMetadata* metadataObj; ACameraMetadata_const_entry face, orientation; CALL_MGR(getCameraCharacteristics(cameraMgr_, activeCameraId_.c_str(), &metadataObj)); CALL_METADATA(getConstEntry(metadataObj, ACAMERA_LENS_FACING, &face)); cameraFacing_ = static_cast<int32_t>(face.data.u8[0]); CALL_METADATA( getConstEntry(metadataObj, ACAMERA_SENSOR_ORIENTATION, &orientation)); LOGI("====Current SENSOR_ORIENTATION: %8d", orientation.data.i32[0]); ACameraMetadata_free(metadataObj); cameraOrientation_ = orientation.data.i32[0]; if (facing) *facing = cameraFacing_; if (angle) *angle = cameraOrientation_; return true; }