Поддержка нескольких камер

В Android 9 реализована поддержка API для многокамерных устройств посредством нового логического устройства камеры, состоящего из двух или более физических камер, направленных в одну сторону. Логическое устройство камеры предоставляется приложению как единый объект CameraDevice/CaptureSession, что позволяет взаимодействовать с интегрированными в HAL функциями многокамерной съемки. Приложения могут также получать доступ к потокам, метаданным и элементам управления физической камеры и управлять ими.

Поддержка нескольких камер

Рисунок 1. Поддержка нескольких камер

На этой диаграмме идентификаторы различных камер обозначены цветами. Приложение может транслировать необработанные буферы с каждой физической камеры одновременно. Также можно настроить отдельные элементы управления и получать отдельные метаданные с разных физических камер.

Примеры и источники

Многокамерные устройства должны рекламироваться с логической возможностью использования нескольких камер .

Клиенты камеры могут запросить идентификаторы физических устройств, из которых состоит конкретная логическая камера, вызвав метод getPhysicalCameraIds() . Идентификаторы, возвращаемые в качестве части результата, затем используются для управления физическими устройствами по отдельности с помощью setPhysicalCameraId() . Результаты таких индивидуальных запросов можно запросить из общего результата, вызвав getPhysicalCameraResults() .

Отдельные запросы к физическим камерам могут поддерживать лишь ограниченное подмножество параметров. Чтобы получить список поддерживаемых параметров, разработчики могут вызвать getAvailablePhysicalCameraRequestKeys() .

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

Выполнение

Контрольный список поддержки

Чтобы добавить логические многокамерные устройства на стороне HAL:

Для устройств под управлением 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 предназначены для многокамерных систем и позволяют обеспечить правильное слияние изображений:

Тесты сцены 1 и сцены 4 проводятся с использованием тестового стенда ITS-in-a-box . Тест test_multi_camera_match проверяет, что яркость в центре изображений совпадает при включении обеих камер. Тест test_multi_camera_alignment проверяет, что параметры расстояния между камерами, их ориентации и искажения загружены корректно. Если многокамерная система включает камеру с широким полем обзора (>90o), требуется версия ITS-box rev2.

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.
  • Начиная с Android 10, логическая многокамерная камера не требуется для поддержки комбинаций потоков, включающих физические потоки. Если HAL поддерживает комбинацию с физическими потоками:
    • (Android 11 и выше) Для более эффективной обработки таких сценариев, как глубина стерео и отслеживание движения, сделайте поле зрения выходных физических потоков максимально широким, насколько это возможно для оборудования. Однако, если физический и логический потоки исходят с одной и той же физической камеры, аппаратные ограничения могут привести к тому, что поле зрения физического потока будет совпадать с полем зрения логического потока.
    • Чтобы устранить нехватку памяти, вызванную несколькими физическими потоками, убедитесь, что приложения используют discardFreeBuffers для освобождения свободных буферов (буферов, которые освобождены потребителем, но еще не удалены из очереди производителем), если ожидается, что физический поток будет простаивать в течение определенного периода времени.
    • Если физические потоки с разных физических камер обычно не прикреплены к одному и тому же запросу, убедитесь, что приложения используют surface group , чтобы одна очередь буферов использовалась для резервного копирования двух поверхностей, обращенных к приложению, что снижает потребление памяти.