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

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 .

Проверка

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

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

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

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

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

Проблема

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

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

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

Если это так, то передняя камера (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 если они не могут поддерживать полную конфигурацию потока для всех камер, работающих одновременно.