Android 9 представила поддержку API для многокамерных устройств через новое логическое устройство камеры, состоящее из двух или более физических устройств камеры, направленных в одном направлении. Логическое устройство камеры представлено как один CameraDevice/CaptureSession для приложения, что позволяет взаимодействовать с интегрированными в HAL многокамерными функциями. Приложения могут опционально получать доступ и управлять базовыми физическими потоками камеры, метаданными и элементами управления.
Рисунок 1. Поддержка нескольких камер
На этой диаграмме разные идентификаторы камер обозначены цветом. Приложение может транслировать необработанные буферы с каждой физической камеры одновременно. Также можно устанавливать отдельные элементы управления и получать отдельные метаданные с разных физических камер.
Примеры и источники
Многокамерные устройства должны рекламироваться с логической возможностью использования нескольких камер .
Клиенты камеры могут запросить идентификатор камеры физических устройств, из которых состоит конкретная логическая камера, вызвав getPhysicalCameraIds()
. Идентификаторы, возвращаемые как часть результата, затем используются для управления физическими устройствами по отдельности через setPhysicalCameraId()
. Результаты таких индивидуальных запросов можно запросить из полного результата, вызвав getPhysicalCameraResults()
.
Отдельные запросы физической камеры могут поддерживать только ограниченное подмножество параметров. Чтобы получить список поддерживаемых параметров, разработчики могут вызвать getAvailablePhysicalCameraRequestKeys()
.
Потоки физических камер поддерживаются только для запросов без повторной обработки и только для монохромных и байеровских датчиков.
Выполнение
Контрольный список поддержки
Чтобы добавить логические многокамерные устройства на стороне HAL:
- Добавьте возможность
ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA
для любого логического устройства камеры, поддерживаемого двумя или более физическими камерами, которые также доступны приложению. - Заполните статическое поле метаданных
ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS
списком идентификаторов физических камер. - Заполните статические метаданные, связанные с глубиной, необходимые для корреляции между пикселями потоков физической камеры:
ANDROID_LENS_POSE_ROTATION
,ANDROID_LENS_POSE_TRANSLATION
,ANDROID_LENS_INTRINSIC_CALIBRATION
,ANDROID_LENS_DISTORTION
,ANDROID_LENS_POSE_REFERENCE
. Задайте для статического поля метаданных
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE
следующее значение:-
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_APPROXIMATE
: Для датчиков в режиме «основной-основной» аппаратная синхронизация затвора/экспозиции отсутствует. -
ANDROID_LOGICAL_MULTI_CAMERA_SENSOR_SYNC_TYPE_CALIBRATED
: Для датчиков в режиме «основной-вторичный» используется аппаратная синхронизация затвора/экспозиции.
-
Заполните
ANDROID_REQUEST_AVAILABLE_PHYSICAL_CAMERA_REQUEST_KEYS
списком поддерживаемых параметров для отдельных физических камер. Список может быть пустым, если логическое устройство не поддерживает индивидуальные запросы.Если поддерживаются отдельные запросы, обработайте и примените отдельные
physicalCameraSettings
, которые могут поступать как часть запросов на захват, и добавьте соответствующие отдельныеphysicalCameraMetadata
.Для устройств Camera HAL версии 3.5 (представлено в Android 10) или выше заполните ключ результата
ANDROID_LOGICAL_MULTI_CAMERA_ACTIVE_PHYSICAL_ID
, используя идентификатор текущей активной физической камеры, поддерживающей логическую камеру.
Для устройств под управлением Android 9 камеры должны поддерживать замену одного логического потока YUV/RAW физическими потоками того же размера (не относится к потокам RAW) и того же формата с двух физических камер. Это не относится к устройствам под управлением Android 10.
Для устройств под управлением Android 10, где версия HAL-устройства камеры составляет 3.5 или выше, устройство камеры должно поддерживать isStreamCombinationSupported
чтобы приложения могли запрашивать, поддерживается ли конкретная комбинация потоков, содержащая физические потоки.
Карта конфигурации потока
Для логической камеры обязательные комбинации потоков для устройства камеры определенного уровня оборудования такие же, как и те, что требуются в CameraDevice.createCaptureSession
. Все потоки в карте конфигурации потоков должны быть логическими потоками.
Для логического устройства камеры, поддерживающего возможности RAW с физическими субкамерами разных размеров, если приложение настраивает логический поток RAW, логическое устройство камеры не должно переключаться на физические субкамеры с разными размерами сенсора. Это гарантирует, что существующие приложения захвата RAW не сломаются.
Чтобы воспользоваться преимуществами оптического зума, реализованного в HAL, путем переключения между физическими дополнительными камерами во время захвата RAW, приложения должны настраивать потоки физических дополнительных камер вместо логического потока RAW.
Гарантированная комбинация потоков
Как логическая камера, так и базовые физические камеры должны гарантировать обязательные комбинации потоков, требуемые для их уровней устройств.
Логическое устройство камеры должно работать так же, как и физическое устройство камеры, исходя из его аппаратного уровня и возможностей. Рекомендуется, чтобы его набор функций был надмножеством функций отдельных физических камер.
На устройствах под управлением Android 9 для каждой гарантированной комбинации потоков логическая камера должна поддерживать:
Замена одного логического потока YUV_420_888 или необработанного потока двумя физическими потоками того же размера и формата, каждый с отдельной физической камеры, при условии, что размер и формат поддерживаются физическими камерами.
Добавление двух потоков raw, по одному с каждой физической камеры, если логическая камера не объявляет о возможности RAW, но базовые физические камеры это делают. Обычно это происходит, когда физические камеры имеют разные размеры сенсора.
Использование физических потоков вместо логического потока того же размера и формата. Это не должно замедлять частоту кадров захвата, когда минимальная длительность кадра физического и логического потоков одинакова.
Соображения производительности и мощности
Производительность:
- Настройка и потоковая передача физических потоков может замедлить скорость захвата логической камеры из-за ограничений ресурсов.
- Применение физических настроек камеры может привести к снижению скорости захвата, если базовые камеры настроены на разную частоту кадров.
Власть:
- Оптимизация энергопотребления HAL продолжает работать в случае по умолчанию.
- Настройка или запрос физических потоков может переопределить внутреннюю оптимизацию энергопотребления HAL и привести к большему энергопотреблению.
Настройка
Вы можете настроить реализацию своего устройства следующими способами.
- Объединенный выход логического устройства камеры полностью зависит от реализации HAL. Решение о том, как объединенные логические потоки выводятся из физических камер, прозрачно для приложения и фреймворка камеры Android.
- Отдельные физические запросы и результаты могут быть опционально поддержаны. Набор доступных параметров в таких запросах также полностью зависит от конкретной реализации HAL.
- Начиная с Android 10, HAL может сократить количество камер, которые могут быть напрямую открыты приложением, решив не рекламировать некоторые или все PHYSICAL_ID в
getCameraIdList
. ВызовgetPhysicalCameraCharacteristics
должен затем возвращать характеристики физической камеры.
Проверка
Логические многокамерные устройства должны проходить CTS камеры, как и любая другая обычная камера. Тестовые случаи, предназначенные для этого типа устройств, можно найти в модуле LogicalCameraDeviceTest
.
Эти три теста ITS предназначены для многокамерных систем и способствуют правильному слиянию изображений:
-
scene1/test_multi_camera_match.py
-
scene4/test_multi_camera_alignment.py
-
sensor_fusion/test_multi_camera_frame_sync.py
Тесты сцены 1 и сцены 4 выполняются с помощью испытательного стенда ITS-in-a-box . Тест test_multi_camera_match
утверждает, что яркость центра изображений совпадает, когда обе камеры включены. Тест test_multi_camera_alignment
утверждает, что интервалы между камерами, ориентация и параметры искажения загружены правильно. Если многокамерная система включает камеру Wide FoV (>90o), требуется версия rev2 ITS box.
Sensor_fusion
— это вторая испытательная установка, которая позволяет выполнять повторяющиеся заданные движения телефона и подтверждает, что временные метки гироскопа и датчика изображения совпадают, а кадры с нескольких камер синхронизированы.
Все коробки доступны через AcuSpec, Inc. ( www.acuspecinc.com , fred@acuspecinc.com) и MYWAY Manufacturing ( www.myway.tw , sales@myway.tw). Кроме того, коробку rev1 ITS можно приобрести через West-Mark ( www.west-mark.com , dgoodman@west-mark.com).
Лучшие практики
Чтобы в полной мере воспользоваться функциями, предоставляемыми многокамерной технологией, и при этом сохранить совместимость с приложениями, следуйте этим рекомендациям при реализации логического многокамерного устройства:
- (Android 10 или выше) Скрыть физические дополнительные камеры из
getCameraIdList
. Это уменьшает количество камер, которые могут быть напрямую открыты приложениями, устраняя необходимость в сложной логике выбора камер для приложений. - (Android 11 или выше) Для логического многокамерного устройства, поддерживающего оптический зум, реализуйте API
ANDROID_CONTROL_ZOOM_RATIO
и используйтеANDROID_SCALER_CROP_REGION
только для кадрирования соотношения сторон.ANDROID_CONTROL_ZOOM_RATIO
позволяет устройству уменьшать масштаб и поддерживать более высокую точность. В этом случае HAL должен настроить систему координатANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
иANDROID_STATISTICS_FACE_LANDMARKS
для обработки поля зрения после зума как активного массива датчика. Дополнительную информацию о том, какANDROID_SCALER_CROP_REGION
работает вместе сANDROID_CONTROL_ZOOM_RATIO
, см.camera3_crop_reprocess#cropping
. - Для многокамерных устройств с физическими камерами, имеющими разные возможности, убедитесь, что устройство объявляет о поддержке определенного значения или диапазона для элемента управления, только если весь диапазон масштабирования поддерживает это значение или диапазон. Например, если логическая камера состоит из сверхширокоугольной, широкоугольной и телефотокамеры, выполните следующие действия:
- Если размеры активных массивов физических камер различаются, HAL камеры должен выполнить сопоставление активных массивов физических камер с активным массивом логической камеры для
ANDROID_SCALER_CROP_REGION
,ANDROID_CONTROL_AE_REGIONS
,ANDROID_CONTROL_AWB_REGIONS
,ANDROID_CONTROL_AF_REGIONS
,ANDROID_STATISTICS_FACE_RECTANGLES
иANDROID_STATISTICS_FACE_LANDMARKS
, чтобы с точки зрения приложения система координат соответствовала размеру активного массива логической камеры. - Если широкоугольная и телеобъективная камеры поддерживают автофокусировку, а сверхширокоугольная камера имеет фиксированный фокус, убедитесь, что логическая камера объявляет о поддержке автофокусировки. HAL должен имитировать конечный автомат автофокусировки для сверхширокоугольной камеры, чтобы при уменьшении масштаба приложения до сверхширокоугольного объектива тот факт, что базовая физическая камера имеет фиксированный фокус, был прозрачен для приложения, а конечные автоматы автофокусировки для поддерживаемых режимов АФ работали так, как и ожидалось.
- Если широкоугольная и телеобъективная камеры поддерживают 4K при 60 кадрах в секунду, а сверхширокоугольная камера поддерживает только 4K при 30 кадрах в секунду или 1080p при 60 кадрах в секунду, но не 4K при 60 кадрах в секунду, убедитесь, что логическая камера не объявляет 4k при 60 кадрах в секунду в поддерживаемых ею конфигурациях потока. Это гарантирует целостность возможностей логической камеры, гарантируя, что приложение не столкнется с проблемой не достижения 4k при 60 кадрах в секунду при значении
ANDROID_CONTROL_ZOOM_RATIO
менее 1.
- Если размеры активных массивов физических камер различаются, HAL камеры должен выполнить сопоставление активных массивов физических камер с активным массивом логической камеры для
- Начиная с Android 10, логическая многокамера не требуется для поддержки потоковых комбинаций, включающих физические потоки. Если HAL поддерживает комбинацию с физическими потоками:
- (Android 11 или выше) Чтобы лучше обрабатывать такие варианты использования, как глубина стерео и отслеживание движения, сделайте поле зрения выходов физического потока настолько большим, насколько это возможно с помощью оборудования. Однако, если физический поток и логический поток исходят из одной и той же физической камеры, ограничения оборудования могут привести к тому, что поле зрения физического потока будет таким же, как и у логического потока.
- Чтобы устранить нехватку памяти, вызванную несколькими физическими потоками, убедитесь, что приложения используют
discardFreeBuffers
для освобождения свободных буферов (буферов, которые освобождены потребителем, но еще не удалены из очереди производителем), если ожидается, что физический поток будет простаивать в течение определенного периода времени. - Если физические потоки с разных физических камер обычно не прикреплены к одному и тому же запросу, убедитесь, что приложения используют
surface group
, чтобы одна очередь буфера использовалась для поддержки двух поверхностей, обращенных к приложению, что снижает потребление памяти.