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

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

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

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

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

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

Устройства с возможностью 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 — это логическая камера, поддерживаемая широкой и сверхширокоугольной камерой, каждая из которых использует один ресурс интернет-провайдера.
  • Camera ID 1 — это камера, которая использует один ресурс интернет-провайдера.

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

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