Одновременная потоковая передача с камеры

Android позволяет устройствам поддерживать одновременную потоковую передачу с камер. Например, это позволяет устройству одновременно использовать как переднюю, так и заднюю камеры. Начиная с Android 11, API Camera2 включает следующие методы, которые приложения могут вызывать для определения того, поддерживают ли камеры одновременную потоковую передачу, а также поддерживаемые конфигурации потоков.

  • getConcurrentCameraIds : получает набор комбинаций идентификаторов подключенных в данный момент камер, которые поддерживают одновременную настройку сеансов камер.
  • isConcurrentSessionConfigurationSupported : проверяет, можно ли одновременно настроить предоставленный набор устройств камеры и соответствующие им конфигурации сеанса.

Набор обязательных комбинаций потоков, которые должны поддерживаться во время одновременной потоковой передачи, включен в характеристики камеры устройства в свойстве SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS .

Каждое устройство камеры, объявленное через getConcurrentStreamingCameraIds() должно поддерживать следующие гарантированные конфигурации для одновременных потоков.

Цель 1 Цель 2
Тип Максимальный размер Тип Максимальный размер Примеры вариантов использования
ЮВ s1440p Обработка видео и изображений в приложении
ПРИВ s1440p Анализ видоискателя в приложении
JPEG s1440p Нет возможности захвата неподвижного изображения с помощью видоискателя
ЮВ / ПРИВ s720p JPEG s1440p Стандартное неподвижное изображение
ЮВ / ПРИВ s720p ЮВ / ПРИВ s1440p Видео в приложении или обработка с предварительным просмотром

Устройства с возможностью MONOCHROME ( CameraCharacteristics#REQUEST_AVAILABLE_CAPABILITIES включает CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME ), поддерживающие Y8, должны поддерживать замену потоков YUV на Y8 во всех гарантированных комбинациях потоков.

s720p относится к 720p (1280 x 720) или максимальному поддерживаемому разрешению для конкретного формата, возвращаемому StreamConfigurationMap.getOutputSizes() . s1440p относится к 1440p (1920 x 1440) или максимальному поддерживаемому разрешению для конкретного формата, возвращаемому StreamConfigurationMap.getOutputSizes() . Устройства, возможности которых не включают ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE , должны поддерживать по крайней мере один поток Y16, Dataspace::DEPTH с разрешением sVGA, во время параллельной работы, где sVGA — меньшее из двух следующих разрешений:

  • максимальное выходное разрешение для данного формата
  • 640 х 480

Выполнение

Чтобы разрешить приложениям опрашивать устройство, чтобы определить, поддерживают ли его камеры одновременную потоковую передачу, реализуйте интерфейс HAL ICameraProvider@2.6 , который включает следующие методы:

Для эталонной реализации интерфейса HAL ICameraProvider@2.6 см. библиотеку HAL эмулируемой камеры по адресу EmulatedCameraProviderHWLImpl.cpp .

Проверка

Чтобы проверить, что ваша реализация этой функции работает так, как задумано, используйте тест ConcurrentCameraTest.java CTS. Также протестируйте с помощью приложения, которое открывает несколько камер и управляет ими одновременно.

Проблемы распределения ресурсов

Если HAL камеры рекламируют поддержку одновременной работы устройств камеры, они могут столкнуться с проблемами распределения ресурсов, особенно в случае, когда на телефоне достаточно ресурсов процессора сигнала изображения (ISP) для потоковой передачи как передней, так и задней (или других) камер одновременно, но не на полную мощность. В этом случае HAL камеры должен выделить ограниченные аппаратные ресурсы для каждого устройства камеры.

Пример сценария

Следующий сценарий демонстрирует эту проблему.

Проблема

Устройство имеет следующую конфигурацию:

  • Идентификатор камеры 0 — это логическая камера, поддерживаемая широкоугольной и сверхширокоугольной камерами, каждая из которых занимает один ресурс интернет-провайдера.
  • Идентификатор камеры 1 — это камера, которая использует один ресурс интернет-провайдера.

Устройство (телефон) имеет двух ISP. Если открыт идентификатор камеры 0 и настроен сеанс, возможно, что HAL камеры резервирует двух ISP, ожидая использования как сверхширокой, так и широкой камеры.

В этом случае фронтальная камера (ID 1 ) не сможет настроить потоки, поскольку оба интернет-провайдера заняты.

Решение

Чтобы решить эту проблему, фреймворк может открыть оба идентификатора камеры 0 и 1 перед настройкой сеансов, чтобы предоставить подсказку HAL камеры о том, как выделять ресурсы (потому что теперь он ожидает одновременную работу камер). Однако это может привести к ограниченным возможностям, например, зум может не справиться с полным диапазоном зума (потому что переключение физических идентификаторов камер может быть проблематичным).

Чтобы реализовать это решение, внесите следующие обновления в provider@2.6::ICameraProvider::getConcurrentCameraStreamingCameraIds .

  • Укажите, что для одновременной работы камер фреймворк камеры должен открывать устройства камеры ( @3.2::ICameraDevice::open ) перед настройкой любых сеансов на устройствах камеры. Это позволяет поставщикам камер соответствующим образом распределять ресурсы.

  • Чтобы решить проблему невозможности обработки полного диапазона масштабирования, убедитесь, что приложения камеры при одновременном использовании камер гарантированно используют настройку управления ZOOM_RATIO только между 1x и MAX_DIGITAL_ZOOM вместо полного ZOOM_RATIO_RANGE (это предотвращает внутреннее переключение физических камер, что потенциально требует большего количества интернет-провайдеров).

Проблема с testDualCameraPreview

При выполнении указанных выше обновлений может возникнуть проблема с поведением, разрешенным тестом MultiViewTest.java#testDualCameraPreview .

Тест testDualCameraPreview не настраивает сессии только после открытия всех камер. Он следует этой последовательности:

for each camera  in cameraDevices :
  device = openCamera(camera)
     createCaptureSession(device);

Однако он допускает сбои открытия камеры с ERROR_MAX_CAMERAS_IN_USE [1] . Сторонние приложения могут зависеть от этого поведения.

Поскольку HAL камеры не будет знать полный набор идентификаторов камер, открытых для параллельной работы, до настройки сеансов, ему может быть сложно выделить аппаратные ресурсы (при условии, что за них есть конкуренция).

Чтобы решить эту проблему, сохраняя обратную совместимость в дополнение к поддержке одновременной потоковой передачи, HAL-камеры должны завершать вызовы openCamera с ERROR_MAX_CAMERAS_IN_USE если они не могут поддерживать полную конфигурацию потока для всех камер, работающих одновременно.