В 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– для датчиков в режиме main-main, без аппаратной синхронизации затвора/экспозиции.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 и более поздних версиях уровень абстрагирования от оборудования может уменьшить количество камер, которые приложение может открыть напрямую, не передавая некоторые или все значения PHYSICAL_ID в
getCameraIdList. ВызовgetPhysicalCameraCharacteristicsдолжен возвращать характеристики физической камеры.
Проверка
Логические многокамерные устройства должны проходить тестирование CTS для камеры, как и обычные камеры.
Тестовые сценарии для этого типа устройств можно найти в модуле LogicalCameraDeviceTest.
Эти три теста ITS предназначены для многокамерных систем и помогают правильно объединять изображения:
scene1/test_multi_camera_match.pyscene4/test_multi_camera_alignment.pysensor_fusion/test_multi_camera_frame_sync.py
Тесты сцен 1 и 4 выполняются с помощью тестовой установки ITS-in-a-box. Тест test_multi_camera_match проверяет, совпадает ли яркость центра изображений, когда обе камеры включены. Тест test_multi_camera_alignment проверяет, правильно ли загружены расстояния между камерами, их ориентация и параметры искажения. Если в многокамерной системе есть камера с широким углом обзора (>90°), требуется версия 2 коробки ITS.
Sensor_fusion – это второй испытательный стенд, который позволяет многократно выполнять заданные движения телефона и проверять, совпадают ли временные метки гироскопа и датчика изображения и синхронизированы ли кадры с нескольких камер.
Все эти устройства можно приобрести у AcuSpec, Inc. (www.acuspecinc.com, fred@acuspecinc.com) и MYWAY Manufacturing (www.myway.tw, sales@myway.tw). Кроме того, устройство ITS rev1 можно приобрести у компании 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позволяет уменьшать масштаб и повышать точность. В этом случае уровень абстрагирования должен скорректировать систему координат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, чтобы одна очередь буферов использовалась для поддержки двух поверхностей, доступных приложению, что позволяет снизить потребление памяти.