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

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

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

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

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

Цель 1 Цель 2
Тип Максимальный размер Тип Максимальный размер Примеры использования
ЮВ с1440р Обработка видео или изображений в приложении
ПРИВ с1440р Анализ видоискателя в приложении
JPEG с1440р Нет захвата неподвижного изображения в видоискателе
ЮВ / ПРИВ с720р JPEG с1440р Стандартная фотосъемка
ЮВ / ПРИВ с720р ЮВ / ПРИВ с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 — это логическая камера, поддерживаемая широкой и сверхширокой камерой, каждая из которых использует один ресурс интернет-провайдера.
  • ID камеры 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 , если они не могут поддерживать конфигурацию полного потока для всех камер, работающих одновременно.