В 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, а базовые физические камеры это делают. Обычно это происходит, когда физические камеры имеют разные размеры сенсоров.
Использование физических потоков вместо логического потока того же размера и формата. Это не должно снижать частоту кадров захвата, когда минимальная продолжительность кадров физического и логического потоков одинакова.
Соображения по производительности и мощности
Производительность:
- Настройка и потоковая передача физических потоков может снизить скорость захвата логической камеры из-за нехватки ресурсов.
- Применение настроек физической камеры может снизить скорость захвата, если базовые камеры настроены на разную частоту кадров.
Сила:
- Оптимизация энергопотребления 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
утверждает, что расстояние между камерами, ориентация и параметры искажения загружены правильно. Если многокамерная система включает камеру с широким полем обзора (>90°), требуется версия rev2 блока ITS.
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 или более поздней версии) Для логического устройства с несколькими камерами, поддерживающего оптический зум,
ANDROID_CONTROL_ZOOM_RATIO
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
, чтобы одна буферная очередь использовалась для поддержки двух поверхностей, обращенных к приложению, что снижает потребление памяти.