Выходные потоки
Подсистема камеры работает исключительно на конвейере ANativeWindow для всех разрешений и форматов вывода. Несколько потоков могут быть настроены одновременно для отправки одного кадра нескольким целевым устройствам, таким как графический процессор, видеокодер, RenderScript или видимые приложению буферы (RAW Bayer, обработанные буферы YUV или буферы, закодированные в JPEG).
В целях оптимизации эти выходные потоки должны быть настроены заранее, и одновременно может существовать лишь ограниченное их количество. Это позволяет заранее выделять буферы памяти и настраивать аппаратное обеспечение камеры, чтобы при отправке запросов с указанием нескольких или различных выходных конвейеров не возникало задержек или задержек при выполнении запроса.
Дополнительную информацию о гарантированных комбинациях выходного потока, которые зависят от поддерживаемого уровня оборудования, см. createCaptureSession()
.
Обрезка
Обрезка всего массива пикселей (для цифрового зума и других случаев, когда желательно уменьшить поле зрения) задаётся параметром ANDROID_SCALER_CROP_REGION. Этот параметр задаётся отдельно для каждого запроса и может изменяться отдельно, что критически важно для реализации плавного цифрового зума.
Область определяется как прямоугольник (x, y, ширина, высота), где (x, y) описывает верхний левый угол прямоугольника. Прямоугольник определяется в системе координат массива активных пикселей сенсора, где (0, 0) — верхний левый пиксель массива активных пикселей. Следовательно, ширина и высота не могут превышать размеры, указанные в статическом поле ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY. Минимально допустимые ширина и высота сообщаются HAL через статическое поле ANDROID_SCALER_MAX_DIGITAL_ZOOM, которое описывает максимально поддерживаемый коэффициент масштабирования. Таким образом, минимальная ширина и высота области кадрирования составляют:
{width, height} = { floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[0] / ANDROID_SCALER_MAX_DIGITAL_ZOOM), floor(ANDROID_SENSOR_ACTIVE_PIXEL_ARRAY[1] / ANDROID_SCALER_MAX_DIGITAL_ZOOM) }
Если область кадрирования должна соответствовать определённым требованиям (например, она должна начинаться с чётных координат и её ширина/высота должны быть чётными), HAL должен выполнить необходимое округление и записать окончательную область кадрирования, используемую в метаданных выходного результата. Аналогично, если HAL реализует стабилизацию видео, он должен скорректировать область кадрирования результата, чтобы описать область, фактически включённую в выходной файл после применения стабилизации видео. В общем случае, приложение, использующее камеру, должно иметь возможность определять поле зрения, которое оно получает, на основе области кадрирования, размеров матрицы и фокусного расстояния объектива.
Поскольку область кадрирования применяется ко всем потокам, соотношение сторон которых может отличаться от соотношения сторон области кадрирования, точная область сенсора, используемая для каждого потока, может быть меньше, чем область кадрирования. В частности, каждый поток должен сохранять квадратные пикселы и соотношение сторон, минимально обрезая заданную область кадрирования. Если соотношение сторон потока шире области кадрирования, поток должен быть дополнительно обрезан по вертикали, а если соотношение сторон потока уже области кадрирования, поток должен быть дополнительно обрезан по горизонтали.
Во всех случаях ручей должен быть центрирован внутри полной посевной области, и каждый ручей должен быть срезан только либо горизонтально, либо вертикально относительно полной посевной области, но никогда и то и другое одновременно.
Например, если определены два потока, поток 640x480 (соотношение сторон 4:3) и поток 1280x720 (соотношение сторон 16:9), ниже показаны ожидаемые выходные области для каждого потока для нескольких выборочных областей кадрирования на гипотетическом датчике с разрешением 3 МП (матрица 2000 x 1500 пикселей).
Область кадрирования: (500, 375, 1000, 750) (соотношение сторон 4:3)
640x480 потоковое кадрирование: (500, 375, 1000, 750) (равно области кадрирования)
Обрезка потока 1280x720: (500, 469, 1000, 562)

Рисунок 1. Соотношение сторон 4:3
Область кадрирования: (500, 375, 1333, 750) (соотношение сторон 16:9)
Обрезка потока 640x480: (666, 375, 1000, 750)
Обрезка потока 1280x720: (500, 375, 1333, 750) (равно области обрезки)

Рисунок 2. Соотношение сторон 16:9
Область кадрирования: (500, 375, 750, 750) (соотношение сторон 1:1)
Обрезка потока 640x480: (500, 469, 750, 562)
Обрезка потока 1280x720: (500, 543, 750, 414)

Рисунок 3. Соотношение сторон 1:1
И последний пример — поток с соотношением сторон 1024x1024 вместо потока 480p:
Область кадрирования: (500, 375, 1000, 750) (соотношение сторон 4:3)
Обрезка потока 1024x1024: (625, 375, 750, 750)
Обрезка потока 1280x720: (500, 469, 1000, 562)

Рисунок 4. Соотношение сторон 4:3, квадрат
Переработка
Дополнительная поддержка файлов RAW-изображений обеспечивается за счёт повторной обработки данных RAW Bayer. Эта поддержка позволяет конвейеру камеры обрабатывать ранее захваченный RAW-буфер и метаданные (целый кадр, записанный ранее) для создания нового отрендеренного выходного файла YUV или JPEG.
Увеличить
Для устройств под управлением Android 11 и выше приложение может использовать зум камеры (цифровой и оптический) с помощью настройки ANDROID_CONTROL_ZOOM_RATIO
.
Коэффициент масштабирования определяется как коэффициент с плавающей запятой. Вместо использования ANDROID_SCALER_CROP_REGION
для кадрирования и масштабирования приложение может использовать ANDROID_CONTROL_ZOOM_RATIO
для управления уровнем масштабирования и ANDROID_SCALER_CROP_REGION
для горизонтального и вертикального кадрирования, чтобы добиться соотношения сторон, отличающегося от соотношения сторон, используемого нативным сенсором камеры.
Многокамерная система может содержать несколько объективов с разными фокусными расстояниями, и пользователь может использовать оптический зум, переключаясь между ними. Использование ANDROID_CONTROL_ZOOM_RATIO
имеет преимущества в следующих сценариях:
- Масштабирование с широкоугольного объектива на телеобъектив: коэффициент с плавающей запятой обеспечивает лучшую точность по сравнению с целочисленными значениями
ANDROID_SCALER_CROP_REGION
. - Уменьшение масштаба с широкого объектива до сверхширокого:
ANDROID_CONTROL_ZOOM_RATIO
поддерживает уменьшение масштаба (<1.0f), тогда какANDROID_SCALER_CROP_REGION
— нет.
Коэффициент масштабирования: 2,0; 1/4 исходного поля зрения
Область кадрирования: (0, 0, 2000, 1500) (соотношение сторон 4:3)
Обрезка потока 640x480: (0, 0, 2000, 1500) (равно области обрезки)
Обрезка потока 1280x720: (0, 187, 2000, 1125)

Рисунок 5. Масштаб 2.0, соотношение сторон 4:3
Коэффициент масштабирования: 2,0; 1/4 исходного поля зрения
Область кадрирования: (0, 187, 2000, 1125) (соотношение сторон 16:9)
640x480 поток кадрирования: (250, 187, 1500, 1125) (pillarboxed)
Обрезка потока 1280x720: (0, 187, 2000, 1125) (равно области обрезки)

Рисунок 6. Увеличение 2.0, соотношение сторон 16:9
Коэффициент масштабирования: 0,5; 4-кратное увеличение исходного поля зрения (переключение с широкоугольного объектива на сверхширокоугольный)
Область кадрирования: (250, 0, 1500, 1500) (соотношение сторон 1:1)
640x480 потоковое кадрирование: (250, 187, 1500, 1125) (в формате почтового ящика)
Обрезка потока 1280x720: (250, 328, 1500, 844) (в формате почтового ящика)

Рисунок 7. Масштаб 0,5, соотношение сторон 1:1
Как видно из графиков выше, система координат области кадрирования изменяется в соответствии с эффективным полем зрения после масштабирования и представлена прямоугольником со следующими размерами: ( 0
, 0
, activeArrayWith
, activeArrayHeight
). То же самое относится к областям AE/AWB/AF и лицам. Это изменение системы координат не применяется к съёмке RAW и связанным с ней метаданным, таким как intrinsicCalibration
и lensShadingMap
.
Используя тот же гипотетический пример, что и выше, и предполагая, что выходной поток № 1 (640x480) — это поток видоискателя, можно добиться 2,0-кратного увеличения одним из двух способов:
-
zoomRatio = 2.0
,scaler.cropRegion = (0, 0, 2000, 1500)
-
zoomRatio = 1.0
(по умолчанию),scaler.cropRegion = (500, 375, 1000, 750)
Чтобы приложение установило область android.control.aeRegions
в соответствии с верхней левой четвертью поля зрения видоискателя, установите android.control.aeRegions
значение (0, 0, 1000, 750)
и android.control.zoomRatio
— 2.0
. В качестве альтернативы, приложение может установить android.control.aeRegions
эквивалентную область (500, 375, 1000, 750)
при android.control.zoomRatio
— 1.0
.