Выходные потоки
Подсистема камеры работает исключительно с конвейером на основе 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 реализует стабилизацию видео, он должен скорректировать результирующую область обрезки, чтобы описать область, фактически включенную в вывод после применения стабилизации видео. Как правило, приложение, использующее камеру, должно иметь возможность определять поле зрения, которое оно получает, на основе области обрезки, размеров датчика изображения и фокусного расстояния объектива.
Поскольку область обрезки применяется ко всем потокам, которые могут иметь другие пропорции, чем область обрезки, точная область датчика, используемая для каждого потока, может быть меньше, чем область обрезки. В частности, каждый поток должен поддерживать квадратные пиксели и их соотношение сторон путем минимальной дополнительной обрезки определенной области обрезки. Если соотношение сторон потока больше, чем область обрезки, поток следует дополнительно обрезать по вертикали, а если соотношение сторон потока уже, чем область обрезки, поток следует дополнительно обрезать по горизонтали.
Во всех случаях культура ручья должна располагаться по центру в пределах области полной культуры, и каждый поток обрезается либо горизонтально, либо вертикально относительно области полной культуры, но никогда одновременно.
Например, если определены два потока, поток 640 x 480 (соотношение сторон 4:3) и поток 1280 x 720 (соотношение сторон 16:9), ниже показаны ожидаемые области вывода для каждого потока для нескольких выборочных областей обрезки на гипотетическом 3 Датчик MP (матрица 2000 x 1500 пикселей).
Область обрезки: (500, 375, 1000, 750) (соотношение сторон 4:3)
640 x 480 потоковое кадрирование: (500, 375, 1000, 750) (равно области кадрирования)
1280 x 720 потоковое кадрирование: (500, 469, 1000, 562)
Область обрезки: (500, 375, 1333, 750) (соотношение сторон 16:9)
Обрезка потока 640x480: (666, 375, 1000, 750)
1280x720 потоковое кадрирование: (500, 375, 1333, 750) (равно области кадрирования)
Область кадрирования: (500, 375, 750, 750) (соотношение сторон 1:1)
Обрезка потока 640x480: (500, 469, 750, 562)
Обрезка потока 1280x720: (500, 543, 750, 414)
И последний пример, поток с квадратным соотношением сторон 1024x1024 вместо потока 480p:
Область обрезки: (500, 375, 1000, 750) (соотношение сторон 4:3)
1024x1024 кадрирование потока: (625, 375, 750, 750)
1280 x 720 потоковое кадрирование: (500, 469, 1000, 562)
Переработка
Дополнительная поддержка файлов необработанных изображений обеспечивается за счет поддержки повторной обработки данных 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)
Коэффициент масштабирования: 2,0; 1/4 исходного поля зрения
Область обрезки: (0, 187, 2000, 1125) (соотношение сторон 16:9)
640 x 480 потоковое кадрирование: (250, 187, 1500, 1125) (столбы)
1280x720 потоковое кадрирование: (0, 187, 2000, 1125) (равно области кадрирования)
Коэффициент масштабирования: 0,5; 4-кратное увеличение исходного поля зрения (переключение с широкого объектива на сверхширокий объектив)
Область обрезки: (250, 0, 1500, 1500) (соотношение сторон 1:1)
640 x 480 потоковое кадрирование: (250, 187, 1500, 1125) (почтовый ящик)
1280 x 720 потоковое кадрирование: (250, 328, 1500, 844) (почтовый ящик)
Как видно из приведенных выше графиков, система координат области обрезки изменяется на эффективное поле зрения после масштабирования и представлена прямоугольником со следующими размерами: ( 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
.