XR_ANDROID_face_tracking_data_source
Строка имени
XR_ANDROID_face_tracking_data_source
Тип расширения
Расширение экземпляра
Зарегистрированный добавочный номер
707
Пересмотр
1
Статус ратификации
Не ратифицировано
Зависимости расширений и версий
XR_ANDROID_face_tracking
Дата последнего изменения
2025-12-16
Статус IP
Известных претензий на интеллектуальную собственность нет.
Авторы
Кенни Веркамер, Google
Инлэй Чжан, Google
Нихав Джайн, Google
Спенсер Куин, Google
Обзор
Это расширение позволяет приложениям получать данные отслеживания лиц из нескольких источников.
Источники данных, поддерживаемые запросами
Приложениям следует вызывать функцию xrEnumerateFaceTrackingDataSourcesANDROID , чтобы получить список поддерживаемых источников данных для отслеживания лиц.
Функция xrEnumerateFaceTrackingDataSourcesANDROID определена следующим образом:
XrResult xrEnumerateFaceTrackingDataSourcesANDROID(
XrInstance instance,
XrSystemId systemId,
uint32_t supportedDataSourcesInputCapacity,
uint32_t* supportedDataSourcesOutputCount,
XrFaceTrackingDataSourceANDROID* supportedDataSources);
Описание параметров
-
instance— это дескриптор объекта XrInstance . -
systemId— этоXrSystemId, для которого будут перечислены источники данных отслеживания лиц. -
supportedDataSourcesInputCapacity— это емкость массиваsupportedDataSources, или 0, указывающее на запрос на получение требуемой емкости. -
supportedDataSourcesOutputCount— это количество поддерживаемых источников данных или требуемая емкость в случае, еслиsupportedDataSourcesInputCapacityнедостаточна. -
supportedDataSources— это массив объектов XrFaceTrackingDataSourceANDROID . Он может бытьNULLеслиsupportedDataSourcesInputCapacityравен 0. - Подробное описание получения необходимого размера
supportedDataSourcesсм. в разделе « Параметры размера буфера» .
Приложение может перечислить список источников данных, поддерживаемых системой, вызвав функцию xrEnumerateFaceTrackingDataSourcesANDROID .
Если XrSystemFaceTrackingPropertiesANDROID :: supportsFaceTracking равно XR_TRUE , то среда выполнения также должна возвращать XR_FACE_TRACKING_DATA_SOURCE_IMAGE_ANDROID из xrEnumerateFaceTrackingDataSourcesANDROID .
Если среда выполнения возвращает ноль источников данных, значит, она не поддерживает отслеживание лиц.
Среда выполнения должна возвращать источники данных в порядке от наивысшего качества к наихудшему.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_face_tracking_data_sourceнеобходимо включить перед вызовом функции xrEnumerateFaceTrackingDataSourcesANDROID. -
instanceдолжен быть допустимым дескриптором XrInstance. -
supportedDataSourcesOutputCountдолжен быть указателем на значение типаuint32_t - Если
supportedDataSourcesInputCapacityне равно0,supportedDataSourcesдолжно быть указателем на массив значенийsupportedDataSourcesInputCapacityXrFaceTrackingDataSourceANDROID.
Коды возврата
-
XR_SUCCESS
-
XR_ERROR_FEATURE_UNSUPPORTED -
XR_ERROR_FUNCTION_UNSUPPORTED -
XR_ERROR_HANDLE_INVALID -
XR_ERROR_INSTANCE_LOST -
XR_ERROR_RUNTIME_FAILURE -
XR_ERROR_SYSTEM_INVALID -
XR_ERROR_VALIDATION_FAILURE
Перечисление XrFaceTrackingDataSourceANDROID определяет различные источники данных, которые может поддерживать среда выполнения.
typedef enum XrFaceTrackingDataSourceANDROID {
XR_FACE_TRACKING_DATA_SOURCE_IMAGE_ANDROID = 1,
XR_FACE_TRACKING_DATA_SOURCE_AUDIO_ANDROID = 2,
XR_FACE_TRACKING_DATA_SOURCE_MULTIMODAL_ANDROID = 3,
XR_FACE_TRACKING_DATA_SOURCE_MAX_ENUM_ANDROID = 0x7FFFFFFF
} XrFaceTrackingDataSourceANDROID;
Перечислители имеют следующие значения:
Описание перечисления
XR_FACE_TRACKING_DATA_SOURCE_IMAGE_ANDROID
Указывает, что в данной конфигурации используются данные изображения.
XR_FACE_TRACKING_DATA_SOURCE_AUDIO_ANDROID
Указывает, что в данной конфигурации используются аудиоданные.
XR_FACE_TRACKING_DATA_SOURCE_MULTIMODAL_ANDROID
Указывает, что в данной конфигурации используются данные изображений и аудио.
Настройка источников данных
Структура XrFaceTrackingDataSourceInfoANDROID описывается следующим образом:
typedef struct XrFaceTrackingDataSourceInfoANDROID {
XrStructureType type;
const void* next;
uint32_t requestedDataSourceCount;
const XrFaceTrackingDataSourceANDROID* requestedDataSources;
} XrFaceTrackingDataSourceInfoANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
nextравноNULLили указателю на следующую структуру в цепочке структур. В ядре OpenXR и в этом расширении такие структуры не определены. -
requestedDataSourceCount— это количество источников данных, запрошенных приложением. -
requestedDataSources— это массив значений XrFaceTrackingDataSourceANDROID , указывающий источники данных, запрашиваемые приложением.
Структура XrFaceTrackingDataSourceInfoANDROID описывает источники данных для создания дескриптора XrFaceTrackerANDROID .
Приложение может передать структуру XrFaceTrackingDataSourceInfoANDROID в следующей цепочке структур XrFaceTrackerCreateInfoANDROID для запроса одного или нескольких источников данных для отслеживания лиц при вызове функции xrCreateFaceTrackerANDROID .
Если приложение не передает ни одного источника данных или какой-либо из источников данных не был перечислен функцией xrEnumerateFaceTrackingDataSourcesANDROID , то среда выполнения должна вернуть XR_ERROR_VALIDATION_FAILURE .
Если пользователь не предоставил все необходимые разрешения для всех запрошенных источников данных, среда выполнения должна вернуть XR_ERROR_PERMISSION_INSUFFICIENT .
Необходимые права доступа для каждого источника данных определены следующим образом:
- Для доступа
XR_FACE_TRACKING_DATA_SOURCE_IMAGE_ANDROIDтребуется разрешение android.permission.FACE_TRACKING. - Для доступа к файлу
XR_FACE_TRACKING_DATA_SOURCE_AUDIO_ANDROIDтребуется разрешение android.permission.RECORD_AUDIO. - Для доступа к разрешению
XR_FACE_TRACKING_DATA_SOURCE_MULTIMODAL_ANDROIDтребуются разрешения android.permission.FACE_TRACKING и android.permission.RECORD_AUDIO.
Среда выполнения должна интерпретировать массив XrFaceTrackingDataSourceInfoANDROID : requestedDataSources как массив, от наивысшего до наинизшего приоритета, заданного приложением. Среда выполнения должна генерировать данные отслеживания, используя первый запрошенный источник данных, который все еще соответствует требуемым разрешениям. Если разрешение отзывается в течение срока службы трекера, в результате чего источник данных становится непригодным для использования, среда выполнения должна продолжать попытки использовать следующий по приоритету источник данных. Если ни один из запрошенных источников данных не пригоден для использования, среда выполнения должна установить значение XrFaceStateANDROID :: isValid равным XR_FALSE в вызовах xrGetFaceStateANDROID , а другие поля считаются неопределенными.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_face_tracking_data_sourceнеобходимо включить перед использованием XrFaceTrackingDataSourceInfoANDROID. -
typeдолжен бытьXR_TYPE_FACE_TRACKING_DATA_SOURCE_INFO_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
requestedDataSourcesдолжен быть указателем на массив допустимых значений XrFaceTrackingDataSourceANDROID, равныхrequestedDataSourceCount - Параметр
requestedDataSourceCountдолжен быть больше0
Разрешения
В манифесте Android-приложений должны быть указаны запрашиваемые разрешения. Разрешение android.permission.FACE_TRACKING считается опасным. Разрешение android.permission.RECORD_AUDIO также считается опасным. Приложение должно запрашивать разрешения во время выполнения для использования следующих функций:
(Уровень защиты: опасный)
Структура XrFaceTrackingDataSourceStateANDROID описывается следующим образом:
typedef struct XrFaceTrackingDataSourceStateANDROID {
XrStructureType type;
void* next;
XrFaceTrackingDataSourceANDROID dataSource;
} XrFaceTrackingDataSourceStateANDROID;
Описание участников
-
type— это XrStructureType данной структуры. -
nextравноNULLили указателю на следующую структуру в цепочке структур. В ядре OpenXR и в этом расширении такие структуры не определены. -
dataSource— это объект XrFaceTrackingDataSourceANDROID , используемый для получения данных отслеживания лица.
Приложение может связать структуру XrFaceTrackingDataSourceStateANDROID со структурой XrFaceStateANDROID , переданной в функцию xrGetFaceStateANDROID, для запроса источника данных, использованного для получения данных отслеживания лица для данного вызова.
Допустимое использование (неявное)
- Расширение
XR_ANDROID_face_tracking_data_sourceнеобходимо включить перед использованием XrFaceTrackingDataSourceStateANDROID. -
typeдолжен бытьXR_TYPE_FACE_TRACKING_DATA_SOURCE_STATE_ANDROID -
nextдолжно бытьNULLили допустимым указателем на следующую структуру в цепочке структур. -
dataSourceдолжен быть допустимым значением XrFaceTrackingDataSourceANDROID.
Пример кода для отслеживания лица с использованием источника данных.
XrInstance instance; // previously initialized
XrSystemId systemId; // previously initialized
XrSession session; // previously initialized, e.g. created at app startup.
// The function pointers are previously initialized using xrGetInstanceProcAddr.
PFN_xrCreateFaceTrackerANDROID xrCreateFaceTrackerANDROID; // previously initialized
PFN_xrDestroyFaceTrackerANDROID xrDestroyFaceTrackerANDROID; // previously initialized
PFN_xrGetFaceStateANDROID xrGetFaceStateANDROID; // previously initialized
PFN_xrEnumerateFaceTrackingDataSourcesANDROID xrEnumerateFaceTrackingDataSourcesANDROID; // previously initialized
bool (*requestPermission)(const char* permission);
// Inspect data sources supported by the system.
uint32_t dataSourcesCount = 0;
CHK_XR(xrEnumerateFaceTrackingDataSourcesANDROID(instance, systemId, dataSourcesCount,
&dataSourcesCount, nullptr));
std::vector<XrFaceTrackingDataSourceANDROID> dataSources(dataSourcesCount);
CHK_XR(xrEnumerateFaceTrackingDataSourcesANDROID(instance, systemId, dataSourcesCount,
&dataSourcesCount, dataSources.data()));
if (dataSources.size() == 0) {
// System does not support face tracking at all ...
return;
}
auto requestDataSourcePermissions = [requestPermission](XrFaceTrackingDataSourceANDROID dataSource) {
switch (dataSource) {
case XR_FACE_TRACKING_DATA_SOURCE_IMAGE_ANDROID:
return requestPermission("android.permission.FACE_TRACKING");
case XR_FACE_TRACKING_DATA_SOURCE_AUDIO_ANDROID:
return requestPermission("android.permission.RECORD_AUDIO");
case XR_FACE_TRACKING_DATA_SOURCE_MULTIMODAL_ANDROID:
return requestPermission("android.permission.FACE_TRACKING") &&
requestPermission("android.permission.RECORD_AUDIO");
default:
return false;
}
};
// Request permissions and remove data sources that are not granted.
for (uint32_t i = 0; i < dataSources.size();) {
if (requestDataSourcePermissions(dataSources[i])) {
++i;
continue;
}
dataSources.erase(dataSources.begin() + i);
}
if (dataSources.size() == 0) {
// User denied all permissions, cannot create face tracker.
return;
}
// Create face tracker with requested data sources.
XrFaceTrackerANDROID faceTracker;
XrFaceTrackingDataSourceInfoANDROID
faceTrackerModeInfo{.type = XR_TYPE_FACE_TRACKING_DATA_SOURCE_INFO_ANDROID,
.next = nullptr,
.requestedDataSourceCount = static_cast<uint32_t>(
dataSources.size()),
.requestedDataSources = dataSources.data()};
XrFaceTrackerCreateInfoANDROID
createInfo{.type = XR_TYPE_FACE_TRACKER_CREATE_INFO_ANDROID,
.next = &faceTrackerModeInfo};
CHK_XR(xrCreateFaceTrackerANDROID(session, &createInfo, &faceTracker));
XrFaceTrackingDataSourceStateANDROID dataSourceState{
.type = XR_TYPE_FACE_TRACKING_DATA_SOURCE_STATE_ANDROID,
.next = nullptr};
XrFaceStateANDROID faceState;
float faceExpressionParameters[XR_FACE_PARAMETER_COUNT_ANDROID];
faceState.type = XR_TYPE_FACE_STATE_ANDROID;
faceState.next = &dataSourceState;
faceState.parametersCapacityInput = XR_FACE_PARAMETER_COUNT_ANDROID;
faceState.parameters = faceExpressionParameters;
while (1) {
// ...
// For every frame in the frame loop
// ...
XrFrameState frameState; // previously returned from xrWaitFrame
XrFaceStateGetInfoANDROID faceGetInfo{
.type = XR_TYPE_FACE_STATE_GET_INFO_ANDROID,
.next = nullptr,
.time = frameState.predictedDisplayTime,
};
CHK_XR(xrGetFaceStateANDROID(faceTracker, &faceGetInfo, &faceState));
if (faceState.isValid) {
for (uint32_t i = 0; i < XR_FACE_PARAMETER_COUNT_ANDROID; ++i) {
// parameters[i] contains a weight of specific blend shape
}
// If the system changes data source because of permission changes,
// handle the new data source ...
switch (dataSourceState.dataSource) {
default:
break;
}
}
}
// after usage
CHK_XR(xrDestroyFaceTrackerANDROID(faceTracker));
Проблемы
История версий
Редакция 1, 07.10.2024 (Кенни Веркамер)
- Первоначальное описание расширения