Выходные потоки
Подсистема камеры работает исключительно на конвейере на основе ANativeWindow для всех разрешений и форматов вывода. Несколько потоков могут быть настроены одновременно для отправки одного кадра на множество целей, таких как GPU, видеокодер, 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
.