Rockchip · AI & Linux Hub

Экран и звук

Rockchip RGA IM2D API: возможности, интерфейсы и примеры

Rockchip RGA IM2D API: возможности, интерфейсы и примеры — V2.2.7.

· ArmSoM Editorial · Rockchip source documentation · 77 мин чтения

Полные технические главы Rockchip RGA IM2D API V2.2.7 (82 китайские и 79 английских страниц). Для применения на ArmSoM проверьте версию RGA в SoC платы, SDK/BSP, совместимость librga/драйвера ядра, ограничения памяти и форматов. Поддержка всех функций на всех платах не заявляется. Единая версия ядра не указана; совместимость драйверов приведена в главе 2. Аппаратная проверка ArmSoM не выполнялась. Производительность — теоретические данные изготовителя, примеры и журналы не являются измерениями ArmSoM.

Сохранены сомнения источника: impyramind/impyramid и imfilp/imflip; imcvtcolorTask описан как смещение; §5.3.12 указывает IM_ALPHA_BLEND_DST, но §3.15 — SRC_OVER. Таблица OSD связывает внутреннее/внешнее управление с EXTERNAL/INTERNAL, предположительно наоборот относительно имён. Написания bule, RK_FORMA_A8, RK1103B, RK1108 требуют проверки по SDK. Правый край аппаратной таблицы обрезан: видимое 3 (by pa… для RGA3 сохранено без догадок.

ArmSoM Docs · Rockchip librga

1. Обзор

RGA (Raster Graphic Acceleration Unit) — независимый аппаратный 2D-ускоритель для рисования точек/линий, масштабирования, поворота, bitBlt и альфа-смешивания.

1.1 Проектные характеристики

Версия Кодовое имя Чип Источник min Источник max Назначение min Назначение max Функции Pixels/Cycle
RGA1 Pagani RK3066 2x2 8192x8192 2x2 2048x2048 Поворот 90/180/270
Отражение X/Y
Обрезка
1/2~8 масштаб
Альфа-смешивание
Цветовой ключ
Заливка цветом
ROP
IOMMU(32bit)
1
RGA1 Jaguar
Plus
RK3188 2x2 8192x8192 2x2 2048x2048 Поворот 90/180/270
Отражение X/Y
Обрезка
1/2~8 масштаб
Альфа-смешивание
Цветовой ключ
Заливка цветом
ROP
IOMMU(32bit)
1
RGA1 Beetles RK2926/2928 2x2 8192x8192 2x2 2048x2048 Поворот 90/180/270
Отражение X/Y
Обрезка
1/2~8 масштаб
Альфа-смешивание
Цветовой ключ
Заливка цветом
ROP
IOMMU(32bit)
1
RGA1 Beetles
Plus
RK3026/3028 2x2 8192x8192 2x2 2048x2048 Поворот 90/180/270
Отражение X/Y
Обрезка
1/2~8 масштаб
Альфа-смешивание
Цветовой ключ
Заливка цветом
ROP
IOMMU(32bit)
1
RGA1_plus Audi RK3128 2x2 8192x8192 2x2 2048x2048 Поворот 90/180/270
Отражение X/Y
Обрезка
1/2~8 масштаб
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
IOMMU(32bit)
1
RGA1_plus Granite Sofia 3gr 2x2 8192x8192 2x2 2048x2048 Поворот 90/180/270
Отражение X/Y
Обрезка
1/2~8 масштаб
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
IOMMU(32bit)
1
RGA2 Lincoln RK3288/3288w 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP
IOMMU(32bit)
2
RGA2 Capricorn RK3190 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP
IOMMU(32bit)
2
RGA2-
Lite0
Maybach RK3368 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/8~8 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP
IOMMU(32bit)
2
RGA2-
Lite0
BMW RK3366 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/8~8 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP
IOMMU(32bit)
2
Версия Кодовое имя Чип Источник min Источник max Назначение min Назначение max Функции Pixels/Cycle
RGA2-
Lite1
Benz RK3228 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/8~8 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
IOMMU(32bit)
2
RGA2-
Lite1
Infiniti RK3228H 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/8~8 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
IOMMU(32bit)
2
RGA2-
Lite1
Gemini RK3326 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/8~8 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
IOMMU(32bit)
2
RGA2-
Lite1
Lion RK1808 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/8~8 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
IOMMU(32bit)
2
RGA2-
Lite2
Libra RK3506 2x2 1280x8192 2x2 1280x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
Размытие Guassion (так в источнике)
alpha-8bit
2
RGA2-
Lite3
Pather RK1103B 2x2 2880x8192 2x2 2880x8192 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное)
уменьшение(билинейное/усреднение)
Заливка цветом
2
RGA2-
Enhance
Mclaren RK3399 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP(недоступно для
RV1108/RV1109/RK3566)
Квантование NN(недоступно для
RK3399/RV1108)
osd (только
RV1106/RV1103/RK3562/RK3528)
мозаика(только
RV1106/RV1103/RK3562/RK3528)
IOMMU(32bit, RK3528/RK3562—
40bit,недоступно для RV1106/1103)
2
RGA2-
Enhance
Mercury RK1108 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP(недоступно для
RV1108/RV1109/RK3566)
Квантование NN(недоступно для
RK3399/RV1108)
osd (только
RV1106/RV1103/RK3562/RK3528)
мозаика(только
RV1106/RV1103/RK3562/RK3528)
IOMMU(32bit, RK3528/RK3562—
40bit,недоступно для RV1106/1103)
2
RGA2-
Enhance
Puma RV1126/RV1109 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP(недоступно для
RV1108/RV1109/RK3566)
Квантование NN(недоступно для
RK3399/RV1108)
osd (только
RV1106/RV1103/RK3562/RK3528)
мозаика(только
RV1106/RV1103/RK3562/RK3528)
IOMMU(32bit, RK3528/RK3562—
40bit,недоступно для RV1106/1103)
2
RGA2-
Enhance
skylarkV2 RK3566/RK3568 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP(недоступно для
RV1108/RV1109/RK3566)
Квантование NN(недоступно для
RK3399/RV1108)
osd (только
RV1106/RV1103/RK3562/RK3528)
мозаика(только
RV1106/RV1103/RK3562/RK3528)
IOMMU(32bit, RK3528/RK3562—
40bit,недоступно для RV1106/1103)
2
RGA2-
Enhance
Orion RK3588 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP(недоступно для
RV1108/RV1109/RK3566)
Квантование NN(недоступно для
RK3399/RV1108)
osd (только
RV1106/RV1103/RK3562/RK3528)
мозаика(только
RV1106/RV1103/RK3562/RK3528)
IOMMU(32bit, RK3528/RK3562—
40bit,недоступно для RV1106/1103)
2
RGA2-
Enhance
Otter RV1106/1103 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP(недоступно для
RV1108/RV1109/RK3566)
Квантование NN(недоступно для
RK3399/RV1108)
osd (только
RV1106/RV1103/RK3562/RK3528)
мозаика(только
RV1106/RV1103/RK3562/RK3528)
IOMMU(32bit, RK3528/RK3562—
40bit,недоступно для RV1106/1103)
2
RGA2-
Enhance
Bull RK3528 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP(недоступно для
RV1108/RV1109/RK3566)
Квантование NN(недоступно для
RK3399/RV1108)
osd (только
RV1106/RV1103/RK3562/RK3528)
мозаика(только
RV1106/RV1103/RK3562/RK3528)
IOMMU(32bit, RK3528/RK3562—
40bit,недоступно для RV1106/1103)
2
RGA2-
Enhance
Snipe RK3562 2x2 8192x8192 2x2 4096x4096 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP(недоступно для
RV1108/RV1109/RK3566)
Квантование NN(недоступно для
RK3399/RV1108)
osd (только
RV1106/RV1103/RK3562/RK3528)
мозаика(только
RV1106/RV1103/RK3562/RK3528)
IOMMU(32bit, RK3528/RK3562—
40bit,недоступно для RV1106/1103)
2
Версия Кодовое имя Чип Источник min Источник max Назначение min Назначение max Функции Pixels/Cycle
RGA2-Pro Heron RK3576 2x2 8192x8192 2x2 8192x8192 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(билинейное/усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP
osd
мозаика(только RK3576)
Карта альфа-битов ARGB5551
rkfbc64x4 вход(только RK3576)
afbc32x8 вход(раздельный режим, только
RK3576)
tile4x4(RV1126B только вход)
IOMMU(40bit)
2
RGA2-Pro Swan RV1126B 2x2 8192x8192 2x2 8192x8192 Поворот 90/180/270
Отражение X/Y
Обрезка
1/16~16 масштаб
увеличение(билинейное/бикубическое)
уменьшение(билинейное/усреднение)
Альфа-смешивание
Цветовой ключ
Заливка цветом
Палитра
ROP
osd
мозаика(только RK3576)
Карта альфа-битов ARGB5551
rkfbc64x4 вход(только RK3576)
afbc32x8 вход(раздельный режим, только
RK3576)
tile4x4(RV1126B только вход)
IOMMU(40bit)
2
RGA3 Orion RK3588 68x2 8176x8176 68x2 8128x8128 Поворот 90/180/270
Отражение X/Y
Обрезка
1/8~8 масштаб
увеличение(бикубическое)
уменьшение(усреднение)
Альфа-смешивание
Цветовой ключ
afbc16x16
IOMMU(40bit)
3 (by pa…; 2 (scale)

Примечание:

1) Число пикселей за такт — теоретическая величина. Реальная производительность зависит от пропускной способности, частоты аппаратуры и других факторов; таблица приведена для справки.

2) Помимо минимального входного разрешения, x, y, width и height фактического прямоугольника операции каждого канала должны быть не меньше 2.

3) Адресуемая память RGA связана с разрядностью IOMMU. Например, RGA с 32-битным IOMMU адресует физическую память только в диапазоне 0–4G.

1.2 Поддерживаемые форматы

Преобразование форматов пикселей: BT.601/BT.709/BT.2020 (BT.2020 только на RGA3). Дизеринг.

Версия Кодовое имя Чип Входной формат Выходной формат
RGA1 Pagani RK3066 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_BPP1
RK_FORMAT_BPP2
RK_FORMAT_BPP4
RK_FORMAT_BPP8
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP (только для
размытия/резкости)
RK_FORMAT_YCrCb_420_SP (только для
размытия/резкости)
RK_FORMAT_YCbCr_422_SP (только для
размытия/резкости)
RK_FORMAT_YCrCb_422_SP (только для
размытия/резкости)
RK_FORMAT_YCbCr_420_P (только для
размытия/резкости)
RK_FORMAT_YCrCb_420_P (только для
размытия/резкости)
RK_FORMAT_YCbCr_422_P (только для
размытия/резкости)
RK_FORMAT_YCrCb_422_P (только для
размытия/резкости)
  Jaguar
Plus
RK3188    
  Beetles RK2926/2928    
  Beetles
Plus
RK3026/3028    
Версия Кодовое имя Чип Входной формат Выходной формат
RGA1_plus Audi RK3128 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_BPP1
RK_FORMAT_BPP2
RK_FORMAT_BPP4
RK_FORMAT_BPP8
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP (только для
обычного Bitblt без alpha)
RK_FORMAT_YCrCb_420_SP (только для
обычного Bitblt без alpha)
RK_FORMAT_YCbCr_422_SP (только для
обычного Bitblt без alpha)
RK_FORMAT_YCrCb_422_SP (только для
обычного Bitblt без alpha)
RK_FORMAT_YCbCr_420_P (только для
обычного Bitblt без alpha)
RK_FORMAT_YCrCb_420_P (только для
обычного Bitblt без alpha)
RK_FORMAT_YCbCr_422_P (только для
обычного Bitblt без alpha)
RK_FORMAT_YCrCb_422_P (только для
обычного Bitblt без alpha)
  Granite Sofia 3gr    
Версия Кодовое имя Чип Входной формат Выходной формат
RGA2 Lincoln RK3288/3288w RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_BPP1 (только для
палитры)
RK_FORMAT_BPP2 (только для
палитры)
RK_FORMAT_BPP4 (только для
палитры)
RK_FORMAT_BPP8 (только для
палитры)
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
  Capricorn RK3190    
Версия Кодовое имя Чип Входной формат Выходной формат
RGA2-Lite0 Maybach RK3368 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_BPP1 (только для
палитры)
RK_FORMAT_BPP2 (только для
палитры)
RK_FORMAT_BPP4 (только для
палитры)
RK_FORMAT_BPP8 (только для
палитры)
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
  BMW RK3366    
Версия Кодовое имя Чип Входной формат Выходной формат
RGA2-Lite1 Benz RK3228 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_RGBA_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B
RK_FORMAT_BPP1 (только для
палитры)
RK_FORMAT_BPP2 (только для
палитры)
RK_FORMAT_BPP4 (только для
палитры)
RK_FORMAT_BPP8 (только для
палитры)
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
  Infiniti RK3228H    
  Gemini RK3326    
  Lion RK1808    
Версия Кодовое имя Чип Входной формат Выходной формат
RGA2-Lite2 Libra RK3506 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_400
RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B
RK_FORMAT_A8
RK_FORMAT_BPP1 (только для
палитры)
RK_FORMAT_BPP2 (только для
палитры)
RK_FORMAT_BPP4 (только для
палитры)
RK_FORMAT_BPP8 (только для
палитры)
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_400
RK_FORMAT_Y4
Версия Кодовое имя Чип Входной формат Выходной формат
RGA2-Lite2 Pather RV1103B RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_400
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_400
Версия Кодовое имя Чип Входной формат Выходной формат
RGA2-
Enhance
Mclaren RK3399 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B
RK_FORMAT_BPP1 (только для
палитры)
RK_FORMAT_BPP2 (только для
палитры)
RK_FORMAT_BPP4 (только для
палитры)
RK_FORMAT_BPP8 (только для
палитры)
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
  Mercury RK1108    
Версия Кодовое имя Чип Входной формат Выходной формат
  Puma RV1126/
RV1109
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_400
RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B
RK_FORMAT_BPP1 (только для
палитры)
RK_FORMAT_BPP2 (только для
палитры)
RK_FORMAT_BPP4 (только для
палитры)
RK_FORMAT_BPP8 (только для
палитры)
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_400
RK_FORMAT_Y4
  skylarkV2 RK3566/RK3568    
  Orion RK3588    
         
  Otter RV1106/1103    
  Bull RK3528    
  Snipe RK3562    
Версия Кодовое имя Чип Входной формат Выходной формат
RGA2-Pro Heron RK3576 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_444_SP
RK_FORMAT_YCrCb_444_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_400
RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B
RK_FORMA_A8 (только src для
альфа-смешивания)
RK_FORMAT_BPP1 (только для
палитры)
RK_FORMAT_BPP2 (только для
палитры)
RK_FORMAT_BPP4 (только для
палитры)
RK_FORMAT_BPP8 (только для
палитры)
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_444_SP
RK_FORMAT_YCrCb_444_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_400
RK_FORMAT_Y4 (только RK3576)
RK_FORMAT_Y8 (только RK3576)
  Swan RV1126B    
Версия Кодовое имя Чип Входной формат Выходной формат
RGA3 Orion RK3588 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B
RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B

Примечание:

1) RK_FORMAT_YCbCr_400 использует только канал Y формата YUV, обычно для 256 (2^8) уровней серого. При преобразовании RGB/YUV учитывайте настройку цветового пространства. Для полного диапазона из 256 уровней серого задайте full range при преобразовании.

2) RK_FORMAT_Y4 использует только Y-канал YUV с дизерингом до 4 бит, обычно для 16 (2^4) уровней серого. Требования к цветовому пространству такие же, как для RK_FORMAT_YCbCr_400. RK_FORMAT_Y8 аналогичен RK_FORMAT_Y4: действительны лишь 4 старших бита, а 4 младших недействительны.

1.3 Выравнивание форматов изображения

Версия Byte_stride Формат Выравнивание
RGA1
RGA1-Plus
4 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
Нет требований выравнивания width stride.
    RK_FORMAT_RGBA_4444
RK_FORMAT_BGRA_4444
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_RGBA_5551
RK_FORMAT_BGRA_5551
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
width stride: выравнивание по 2.
    RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
width stride: выравнивание по 4.
    RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
width stride: выравнивание по 4; x_offset, y_offset, width, height, height stride: выравнивание по 2.
RGA2
RGA2-Lite0
RGA2-Lite1
RGA2-Lite2
RGA2-Lite3
RGA2-
Enhance
RGA2-Pro
4 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
Нет требований выравнивания width stride.
    RK_FORMAT_RGBA_4444
RK_FORMAT_BGRA_4444
RK_FORMAT_ARGB_4444
RK_FORMAT_ABGR_4444
RK_FORMAT_RGBA_5551
RK_FORMAT_BGRA_5551
RK_FORMAT_ARGB_5551
RK_FORMAT_ABGR_5551
RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
width stride: выравнивание по 2.
    RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
RK_FORMAT_YUYV_420
RK_FORMAT_YVYU_420
RK_FORMAT_UYVY_420
RK_FORMAT_VYUY_420
width stride: выравнивание по 2; x_offset, y_offset, width, height, height stride: выравнивание по 2.
    RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
RK_FORMAT_A8
width stride: выравнивание по 4.
    RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
RK_FORMAT_YCbCr_444_SP
RK_FORMAT_YCrCb_444_SP
RK_FORMAT_YCbCr_420_P
RK_FORMAT_YCrCb_420_P
RK_FORMAT_YCbCr_422_P
RK_FORMAT_YCrCb_422_P
RK_FORMAT_YCbCr_400
RK_FORMAT_Y4
RK_FORMAT_Y8
width stride: выравнивание по 4; x_offset, y_offset, width, height, height stride: выравнивание по 2.
    RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B
width stride: выравнивание по 16; x_offset, y_offset: выравнивание по 64; width, height, height stride: выравнивание по 2.
RGA3 16 RK_FORMAT_RGBA_8888
RK_FORMAT_BGRA_8888
RK_FORMAT_ARGB_8888
RK_FORMAT_ABGR_8888
RK_FORMAT_RGBX_8888
RK_FORMAT_BGRX_8888
RK_FORMAT_XRGB_8888
RK_FORMAT_XBGR_8888
width stride: выравнивание по 4.
    RK_FORMAT_RGB_565
RK_FORMAT_BGR_565
width stride: выравнивание по 8.
    RK_FORMAT_YUYV_422
RK_FORMAT_YVYU_422
RK_FORMAT_UYVY_422
RK_FORMAT_VYUY_422
width stride: выравнивание по 8; x_offset, y_offset, width, height, height stride: выравнивание по 2.
    RK_FORMAT_RGB_888
RK_FORMAT_BGR_888
width stride: выравнивание по 16.
    RK_FORMAT_YCbCr_420_SP
RK_FORMAT_YCrCb_420_SP
RK_FORMAT_YCbCr_422_SP
RK_FORMAT_YCrCb_422_SP
width stride: выравнивание по 16; x_offset, y_offset, width, height, height stride: выравнивание по 2.
    RK_FORMAT_YCbCr_420_SP_10B
RK_FORMAT_YCrCb_420_SP_10B
RK_FORMAT_YCbCr_422_SP_10B
RK_FORMAT_YCrCb_422_SP_10B
width stride: выравнивание по 64; x_offset, y_offset: выравнивание по 4; width, height, height stride: выравнивание по 2.
    FBC mode Помимо указанного выше выравнивания форматов: width stride, height stride: выравнивание по 16.
    TILE8*8 mode Помимо указанного выше выравнивания форматов: width, height: выравнивание по 8; входной канал width stride, height stride: выравнивание по 16.

Примечание:

1) Формула выравнивания: lcm(bpp, byte_stride * 8) / pixel_stride.

2) Если платформа содержит несколько версий аппаратуры, librga применяет наиболее строгие требования выравнивания для использования аппаратных ресурсов.

2. Версии

Библиотека librga.so обновляет номер версии по правилам, отражающим новые функции, совместимость и исправления. Несколько способов запроса версии помогают определить пригодность библиотеки для текущего окружения. Подробные изменения и различия приведены в CHANGLOG.md в корне исходного дерева.

2.1 Версия API librga

2.1.1 Формат версии и правила повышения

2.1.1.1 Формат версии
major.minor.revision_[build]

Пример:

1.0.0_[0]

2.1.1.2 Правила повышения
Название Правило
major Мажорная версия: обратно несовместимые выпуски.
minor Минорная версия: обратно совместимое добавление функциональных API.
revision Ревизия: обратно совместимые дополнения функций или исправления критических ошибок.
build Версия сборки: обратно совместимые исправления ошибок.

2.1.2 Запрос версии

2.1.2.1 Запрос через strings

Пример для 64-битного Android R:

:/# strings vendor/lib64/librga.so |grep rga_api |grep version
rga_api version 1.0.0_[0]
2.1.2.2 Вывод журнала

Версия выводится при первом вызове RGA API каждым процессом.

rockchiprga: rga_api version 1.0.0_[0]
2.1.2.3 Запрос через API

Следующий API запрашивает версию кода, сборки и аппаратуры RGA. Подробности использования приведены в разделе прикладных интерфейсов.

querystring(RGA_VERSION);

Формат строк:

RGA_api version : v1.0.0_[0]
RGA version : RGA_2_Enhance
2.1.2.4 Запрос свойства

Запрос свойства поддерживается только Android и работает после того, как процесс вызвал RGA и свойство было установлено.

:/# getprop |grep rga
[vendor.rga_api.version]: [1.0.0_[0]]

2.2 Версия драйвера

librga обращается к аппаратуре RGA через драйвер. Его версия должна поддерживаться используемой версией librga.

2.2.1 Формат версии и правила повышения

2.2.1.1 Формат версии
<driver_name>: v major.minor.revision

Примеры:

RGA2 Device Driver: v2.1.0
RGA multicore Device Driver: v1.2.23
2.2.1.2 Правила повышения
Название Правило
major Мажорная версия: обратно несовместимые выпуски.
minor Минорная версия: обратно совместимое добавление функциональных API.
revision Ревизия: обратно совместимые дополнения функций или исправления критических ошибок.

2.2.2 Запрос версии

2.2.2.1 Запрос журнала загрузки

После загрузки запросите журнал инициализации RGA следующей командой. Некоторые старые драйверы не выводят версию, поэтому метод применим не ко всем версиям.

dmesg |grep rga

Пример:

[ 2.382393] rga3_core0 fdb60000.rga: Adding to iommu group 2
[ 2.382651] rga: rga3_core0, irq = 33, match scheduler
[ 2.383058] rga: rga3_core0 hardware loaded successfully, hw_version:3.0.76831.
[ 2.383121] rga: rga3_core0 probe successfully
[ 2.383687] rga3_core1 fdb70000.rga: Adding to iommu group 3
[ 2.383917] rga: rga3_core1, irq = 34, match scheduler
[ 2.384313] rga: rga3_core1 hardware loaded successfully, hw_version:3.0.76831.
[ 2.384412] rga: rga3_core1 probe successfully
[ 2.384893] rga: rga2, irq = 35, match scheduler
[ 2.385238] rga: rga2 hardware loaded successfully, hw_version:3.2.63318.
[ 2.385257] rga: rga2 probe successfully
[ 2.385455] rga_iommu: IOMMU binding successfully, default mapping core[0x1]
[ 2.385586] rga: Module initialized. v1.2.23

Здесь v1.2.23 — версия драйвера.

2.2.2.2 Запрос отладочного узла

Версию можно запросить через отладочные узлы драйвера. Отсутствие указанных узлов означает, что текущая версия не поддерживает запрос. Для ядра с обычно включённой опцией CONFIG_ROCKCHIP_RGA_DEBUG_FS:

cat /sys/kernel/debug/rkrga/driver_version

Для ядра с включённой ROCKCHIP_RGA_PROC_FS:

cat /proc/rkrga/driver_version
cat /sys/kernel/debug/rkrga/driver_version
RGA multicore Device Driver: v1.2.23

RGA multicore Device Driver — имя драйвера; v1.2.23 означает версию 1.2.23. Таким образом, работает RGA multicore Device Driver версии 1.2.23 (обычно multi_rga driver).

cat /sys/kernel/debug/rkrga/driver_version
RGA2 Device Driver: v2.1.0

RGA2 Device Driver — имя драйвера; v2.1.0 означает версию 2.1.0. Таким образом, работает RGA2 Device Driver версии 2.1.0 (обычно rga2 driver).

2.3 Соответствие версий

Перед использованием RGA убедитесь в совместимости окружения. Ниже приведены распространённые соответствия версий librga и драйвера.

Версия librga Соответствующий драйвер Поддержка оборудования
Без номера версии Драйвер соответствующего SDK RGA1、RGA2
1.0.0 ~ 1.3.2 RGA Device Driver(kernel - 4.4 и выше)
RGA2 Device Driver(без версии или v2.1.0)
RGA1、RGA2
> 1.4.0 RGA multicore Device Driver(v1.2.0 и выше) RGA2、RGA3
> 1.9.0 RGA Device Driver(kernel-4.4 и выше)
RGA2 Device Driver(без версии и v2.1.0)
RGA multicore Device Driver(v1.2.0 и выше)
RGA1、RGA2、RGA3

3. Интерфейсы приложений

Библиотека RGA — librga.so. Она настраивает структуру буфера struct rga_info для 2D-операций и предоставляет удобные оболочки распространённых функций. Интерфейсы ориентируются на 2D API OpenCV/MATLAB, сокращая время обучения. RGA query возвращает аппаратную версию, максимальные входные/выходные разрешения и форматы для учёта совместимости. Перед обработкой wrapbuffer_T заполняет struct rga_buffer_t сведениями о входном и выходном буферах, включая разрешение и формат. improcess выполняет составные операции по заданным флагам usage. Операции, которые нельзя выполнить за один проход, объединяются в задание RGA и передаются драйверу для последовательного выполнения.

3.1 Обзор

Библиотека предоставляет следующие API. Асинхронный режим поддерживается только реализацией C++.

  • querystring: Запросить версию оборудования и возможности RGA текущего SoC, вернуть строку.
  • imcheckHeader: Проверить различия версий используемого заголовка и librga.
  • importbuffer_T: Импортировать внешнюю память (dma_fd, виртуальный или физический адрес) в драйвер RGA для быстрого аппаратного доступа к физически непрерывной или разрывной памяти.
  • releasebuffer_handle: Удалить ссылки и отображения внешнего буфера в драйвере.
  • wrapbuffer_handle: Быстро упаковать буфер изображения в rga_buffer_t.
  • imbeginJob: Создать задание обработки RGA.
  • imendJob: Отправить и выполнить задание RGA.
  • imcancelJob: Отменить и удалить задание RGA.
  • imcopy: Вызвать RGA для быстрой операции: копирование изображения.
  • imcopyTask: Добавить в задание RGA быструю операцию: копирование изображения.
  • imresize: Вызвать RGA для быстрой операции: масштабирование изображения.
  • imresizeTask: Добавить в задание RGA быструю операцию: масштабирование изображения.
  • impyramind: Вызвать RGA для быстрой операции: обработку пирамиды изображения (написание источника).
  • imcrop: Вызвать RGA для быстрой операции: обрезку изображения.
  • imcropTask: Добавить в задание RGA быструю операцию: обрезку изображения.
  • imtranslate: Вызвать RGA для быстрой операции: смещение изображения.
  • imtranslateTask: Добавить в задание RGA быструю операцию: смещение изображения.
  • imcvtcolor: Вызвать RGA для быстрой операции: преобразование формата.
  • imcvtcolorTask: Добавить в задание RGA быструю операцию: преобразование формата.
  • imrotate: Вызвать RGA для быстрой операции: поворот изображения.
  • imrotateTask: Добавить в задание RGA быструю операцию: поворот изображения.
  • imflip: Вызвать RGA для быстрой операции: зеркальное отражение.
  • imflipTask: Добавить в задание RGA быструю операцию: зеркальное отражение.
  • imblend: Вызвать RGA для быстрой операции: двухканальную композицию.
  • imblendTask: Добавить в задание RGA быструю операцию: двухканальную композицию.
  • imcomposite: Вызвать RGA для быстрой операции: трёхканальную композицию.
  • imcompositeTask: Добавить в задание RGA быструю операцию: трёхканальную композицию.

  • imcolorkey: Вызвать RGA для быстрой операции: обработку цветового ключа.
  • imcolorkeyTask: Добавить в задание RGA быструю операцию: обработку цветового ключа.
  • imosd: Вызвать RGA для быстрой операции: наложение текста OSD.
  • imosdTask: Добавить в задание RGA быструю операцию: наложение текста OSD.
  • imquantize: Вызвать RGA для быстрой операции: предобработку NN (квантование).
  • imquantizeTask: Добавить в задание RGA быструю операцию: предобработку NN (квантование).
  • imrop: Вызвать RGA для быстрой операции: растровые операции.
  • imropTask: Добавить в задание RGA быструю операцию: растровые операции.
  • imfill: Вызвать RGA для быстрой операции: заливку изображения.
  • imfillTask: Добавить в задание RGA быструю операцию: заливку изображения.
  • imfillArray: Вызвать RGA для быстрой операции: множественную заливку.
  • imfillTaskArray: Добавить в задание RGA быструю операцию: множественную заливку.
  • imrectangle: Вызвать RGA для быстрой операции: равномерные прямоугольные рамки.
  • imrectangleTask: Добавить в задание RGA быструю операцию: равномерные прямоугольные рамки.
  • imrectangleArray: Вызвать RGA для быстрой операции: несколько равномерных прямоугольных рамок.
  • imrectangleTaskArray: Добавить в задание RGA быструю операцию: несколько равномерных прямоугольных рамок.
  • immakeBorder: Вызвать RGA для быстрой операции: прямоугольные рамки.
  • immosaic: Вызвать RGA для быстрой операции: мозаичную маскировку.
  • immosaicTask: Добавить в задание RGA быструю операцию: мозаичную маскировку.
  • immosaicArray: Вызвать RGA для быстрой операции: мозаичную маскировку.
  • immosaicTaskArray: Добавить в задание RGA быструю операцию: мозаичную маскировку.
  • improcess: Вызвать RGA для быстрой операции: комбинированную обработку.
  • improcessTask: Добавить в задание RGA быструю операцию: комбинированную обработку.
  • imcheck: Проверить корректность параметров и поддержку оборудования.
  • imsync: Синхронизировать завершение в асинхронном режиме.
  • imconfig: Добавить настройки по умолчанию в контекст текущего потока.

Ниже приведена поддержка API в различных средах:

Пункт API Поддерживаемые языки Поддерживаемые системы librga RGA2
драйвер
Multi_RGA
драйвер
общий
API
querystring C++/C Android / Linux
/ QNX / RT-
thread
√ / /
  imcheckHeader C++ Android / Linux
/ QNX / RT-
thread
≥1.9.0 / /
  imcheck C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imStrError C++/C Android / Linux
/ QNX / RT-
thread
√ / /
  imsync C++/C Android / Linux ≥1.6.0 × √
  imconfig C++/C Android / Linux ≥1.6.0 × √
API буфера importbuffer_virtualaddr C++/C Android / Linux ≥1.7.2 × √
  importbuffer_physicaladdr C++/C Android / Linux ≥1.7.2 × √
  importbuffer_fd C++/C Android / Linux ≥1.7.2 × √
  releasebuffer_handle C++/C Android / Linux ≥1.7.2 × √
  wrapbuffer_handle C++/C Android / Linux ≥1.7.2 / /
  wrapbuffer_virtualaddr C++/C Android / Linux
/ QNX / RT-
thread
√ / /
  wrapbuffer_physicaladdr C++/C Android / Linux
/ QNX / RT-
thread
√ / /
  wrapbuffer_fd C++/C Android / Linux
/ QNX / RT-
thread
√ / /
Пункт API Поддерживаемые языки Поддерживаемые системы librga RGA2
драйвер
Multi_RGA
драйвер
  imcopy C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imresize C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  impyramind C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imcrop C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imtranslate C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imcvtcolor C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imrotate C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imflip C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imblend C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imcomposite C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imcolorkey C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imosd C++/C Android / Linux
/ QNX / RT-
thread
≥1.8.0 × √
  imquantize C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imrop C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imfill C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
  imfillArray C++/C Android / Linux ≥1.9.0 × √
  imrectangle C++/C Android / Linux ≥1.9.0 × √
Пункт API Поддерживаемые языки Поддерживаемые системы librga RGA2
драйвер
Multi_RGA
драйвер
  imrectangleArray C++/C Android / Linux ≥1.9.0 × √
  immakeBorder C++/C Android / Linux ≥1.9.0 × √
  imмозаика C++/C Android / Linux
/ QNX / RT-
thread
≥1.8.0 × √
  imмозаикаArray C++/C Android / Linux ≥1.9.0 × √
  improcess C++/C Android / Linux
/ QNX / RT-
thread
√ √ √
API обработки
заданий
imbeginJob C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imendJob C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imcancelJob C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imcopyTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imresizeTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imcropTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imtranslateTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imcvtcolorTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imrotateTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imflipTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imblendTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imcompositeTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imcolorkeyTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imosdTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imquantizeTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imropTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imfillTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imfillTaskArray C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imrectangleTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imrectangleTaskArray C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imмозаикаTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imмозаикаTaskArray C++ Android / Linux ≥1.9.0 × ≥1.2.25
  imмозаикаTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
  improcessTask C++ Android / Linux ≥1.9.0 × ≥1.2.25
Пункт API Поддерживаемые языки Поддерживаемые системы librga RGA2
драйвер
Multi_RGA
драйвер
расширенный API importbuffer_GraphicBuffer C++ Android √ / /
  importbuffer_GraphicBuffer_handle C++ Android √ / /
  importbuffer_AHardwareBuffer C++ Android √ / /
  wrapbuffer_GraphicBuffer C++ Android √ / /
  wrapbuffer_handle(GraphicBuffer
handle)
C++ Android √ / /
  wrapbuffer_AHardwareBuffer C++ Android √ / /

Обозначения: √ поддерживается; × не поддерживается; / неприменимо.

3.2 Версия и возможности RGA

3.2.1 querystring

const char* querystring(int name);

Запросить базовую информацию RGA и поддержку разрешений и форматов.

Параметры Описание
name RGA_VENDOR - изготовитель
RGA_VERSION - версия
RGA_MAX_INPUT - максимальное входное разрешение
RGA_MAX_OUTPUT - максимальное выходное разрешение
RGA_BYTE_STRIDE - поддерживаемое выравнивание stride
RGA_SCALE_LIMIT - коэффициенты масштабирования
RGA_INPUT_FORMAT - входные форматы
RGA_OUTPUT_FORMAT - выходные форматы
RGA_EXPECTED - ожидаемая производительность
RGA_ALL - вывести всю информацию

Возвращает строку с характеристиками RGA.

3.3 Проверка версии заголовка

3.3.1 imcheckHeader

IM_API IM_STATUS imcheckHeader(im_api_version_t header_version = RGA_CURRENT_API_HEADER_VERSION);

Проверить различия между версией используемого заголовка и librga.

Параметры Описание
header_version Версия заголовка; обычно используется RGA_CURRENT_API_HEADER_VERSION.

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.4 Предобработка буфера изображения

3.4.1 importbuffer_T

Для внешней памяти, обрабатываемой RGA, importbuffer_T отображает сведения о физических адресах буфера в драйвер и получает соответствующую адресную информацию для последующих стабильных и быстрых вызовов RGA.

Параметры(T) Тип данных Описание
виртуальный адрес void * Виртуальный адрес буфера
физический адрес uint64_t Непрерывный физический адрес буфера
fd int Файловый дескриптор DMA-буфера
GraphicBuffer
handle
buffer_handle_t Дескриптор буфера изображения с адресом, файловым дескриптором, разрешением и форматом
GraphicBuffer GraphicBuffer графический буфер Android
AHardwareBuffer AHardwareBuffer блоки памяти, доступные различным аппаратным компонентам
системы. https://developer.android.com/ndk/reference/group/a-hardware-buffer

Производительность зависит от типа буфера: physical address > fd > virtual address. Обычно рекомендуется fd.

IM_API rga_buffer_handle_t importbuffer_fd(int fd, int size);
IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int size);
IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int size);
Параметр Описание
fd/va/pa [обязательно] внешний буфер
size [обязательно] размер памяти
IM_API rga_buffer_handle_t importbuffer_fd(int fd, int width, int height, int format);
IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, int width, int height, int format);
IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, int width, int height, int format);
Параметр Описание
fd/va/pa [обязательно] внешний буфер
width [обязательно] шаг ширины буфера в пикселях
height [обязательно] шаг высоты буфера в пикселях
format [обязательно] пиксельный формат буфера
IM_API rga_buffer_handle_t importbuffer_fd(int fd, im_handle_param_t *param);
IM_API rga_buffer_handle_t importbuffer_virtualaddr(void *va, im_handle_param_t *param);
IM_API rga_buffer_handle_t importbuffer_physicaladdr(uint64_t pa, im_handle_param_t *param);
Параметр Описание
fd/va/pa [обязательно] внешний буфер
param [обязательно] настроить параметры буфера
IM_API rga_buffer_handle_t importbuffer_GraphicBuffer_handle(buffer_handle_t hnd);
IM_API rga_buffer_handle_t importbuffer_GraphicBuffer(sp<GraphicBuffer> buf);
IM_API rga_buffer_handle_t importbuffer_AHardwareBuffer(AHardwareBuffer *buf);
Параметр Описание
hnd/buf [обязательно] внешний буфер

Возвращает дескриптор памяти rga_buffer_handle_t.

3.4.2 releasebuffer_handle

После завершения работы RGA с внешней памятью вызовите releasebuffer_handle с её handle, чтобы удалить отображение/привязку буфера и освободить соответствующие ресурсы драйвера.

IM_API IM_STATUS releasebuffer_handle(rga_buffer_handle_t handle);

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.4.3 wrapbuffer_handle

Входные и выходные параметры изображений IM2D поддерживают разные типы и описывают память, формат, ширину и высоту. До операции вызовите wrapbuffer_handle для преобразования параметров в единую структуру rga_buffer_t, передаваемую пользовательскому API.

rga_buffer_t wrapbuffer_handle(rga_buffer_handle_t handle,
                               int width,
                               int height,
                               int format,
                               int wstride = width,
                               int hstride = height);
Параметр Описание
handle [обязательно] дескриптор буфера RGA
width [обязательно] ширина обрабатываемого изображения в пикселях
height [обязательно] высота обрабатываемого изображения в пикселях
format [обязательно] пиксельный формат
wtride [необязательно] шаг ширины изображения в пикселях
hstride [необязательно] шаг ширины изображения в пикселях

Возвращает rga_buffer_t с описанием изображения.

3.5 Создание задания обработки

3.5.1 imbeginJob

IM_API im_job_handle_t imbeginJob(uint64_t flags = 0);

Создать задание обработки RGA и вернуть его дескриптор. job_handle используется для добавления/удаления операций и отправки/выполнения задания.

Параметр Описание
flags [необязательно] флаги задания

Возвращает дескриптор задания im_job_handle_t.

3.6 Отправка задания обработки

3.6.1 imendJob

IM_API IM_STATUS imendJob(im_job_handle_t job_handle,
                          int sync_mode = IM_SYNC,
                          int acquire_fence_fd = 0,
                          int *release_fence_fd = NULL);

Отправить и выполнить созданное задание обработки RGA. После завершения его ресурсы автоматически удаляются.

Параметр Описание
job_handle [обязательно] дескриптор задания
sync_mode [необязательно] ожидать завершения операции
acquire_fence_fd [необязательно] в асинхронном режиме запустить задание после ожидания сигнала acquire_fence
release_fence_fd [необязательно] используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.7 Отмена задания обработки

3.7.1 imcancelJob

IM_API IM_STATUS imcancelJob(im_job_handle_t job_handle);

Отменить и удалить созданное задание обработки RGA.

Параметр Описание
job_handle [обязательно] дескриптор задания

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.8 Копирование изображения

3.8.1 imcopy

IM_STATUS imcopy(const rga_buffer_t src,
                 rga_buffer_t dst,
                 int sync = 1,
                 int *release_fence_fd = NULL);

Выполнить однократное быстрое копирование изображения из буфера канала src в буфер канала dst.

Параметр Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.8.2 imcopyTask

IM_API IM_STATUS imcopyTask(im_job_handle_t job_handle,
                            const rga_buffer_t src,
                            rga_buffer_t dst);

Через job_handle добавить операцию копирования изображения в указанное задание. Использование соответствует imcopy.

Параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.9 Масштабирование и пирамиды

3.9.1 imresize

IM_STATUS imresize(const rga_buffer_t src,
                   rga_buffer_t dst,
                   double fx = 0,
                   double fy = 0,
                   int interpolation = INTER_LINEAR,
                   int sync = 1,
                   int *release_fence_fd = NULL);

Задайте целевые размеры через dst либо коэффициенты fx/fy для нужного масштаба. При одновременной настройке dst и fx/fy приоритет имеют размеры, вычисленные по fx/fy.

Настройка interpolation поддерживается только RGA1/RGA1 plus; алгоритм других версий смотрите в соответствующем TRM. При fx/fy размеры форматов с требованиями выравнивания, например YUV, принудительно округляются вниз, что может изменить ожидаемый результат масштабирования.

Параметры Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение; размер dsize (если не ноль) либо вычисленный из src.size(), fx
и fy; тип dst совпадает с src.
fx [необязательно] коэффициент масштаба по горизонтали; при 0 вычисляется как:
fx = (double) dst.width / src.width
fy [необязательно] коэффициент масштаба по вертикали; при 0 вычисляется как:
fy = (double) dst.height / src.height
interpolation [необязательно] метод интерполяции:
INTER_NEAREST - интерполяция ближайшего соседа
INTER_LINEAR - билинейная интерполяция (по умолчанию)
INTER_CUBIC - бикубическая интерполяция окрестности 4x4 пикселя
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.9.2 impyramid

IM_STATUS impyramid (const rga_buffer_t src,
                     rga_buffer_t dst,
                     IM_SCALE direction)

Масштабирование пирамиды: в зависимости от direction изменить ширину и высоту одновременно в 1/2 или 2 раза.

Параметры Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение;
direction [обязательно] режим масштаба
IM_UP_SCALE —— увеличение
IM_DOWN_SCALE —— уменьшение
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.9.3 imresizeTask

IM_API IM_STATUS imresizeTask(im_job_handle_t job_handle,
                              const rga_buffer_t src,
                              rga_buffer_t dst,
                              double fx = 0,
                              double fy = 0,
                              int interpolation = 0);

Через job_handle добавить операцию масштабирования изображения в указанное задание. Использование соответствует imresize.

Параметры Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение; размер dsize (если не ноль) либо вычисленный из src.size(), fx
и fy; тип dst совпадает с src.
fx [необязательно] коэффициент масштаба по горизонтали; при 0 вычисляется как:
fx = (double) dst.width / src.width
fy [необязательно] коэффициент масштаба по вертикали; при 0 вычисляется как:
fy = (double) dst.height / src.height
interpolation [необязательно] метод интерполяции:
INTER_NEAREST - интерполяция ближайшего соседа
INTER_LINEAR - билинейная интерполяция (по умолчанию)
INTER_CUBIC - бикубическая интерполяция окрестности 4x4 пикселя

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.10 Обрезка изображения

3.10.1 imcrop

IM_STATUS imcrop(const rga_buffer_t src,
                 rga_buffer_t dst,
                 im_rect rect,
                 int sync = 1,
                 int *release_fence_fd = NULL);

Обрезать изображение по указанным области и размеру Rect.

Параметр Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение
rect [обязательно] область обрезки
x - координата x верхнего левого угла
y - координата y верхнего левого угла
width - ширина области
height - высота области
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.10.2 imcropTask

IM_API IM_STATUS imcropTask(im_job_handle_t job_handle,
                            const rga_buffer_t src,
                            rga_buffer_t dst,
                            im_rect rect);

Через job_handle добавить операцию обрезки изображения в указанное задание. Использование соответствует imcrop.

Параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение
rect [обязательно] область обрезки
x - координата x верхнего левого угла
y - координата y верхнего левого угла
width - ширина области
height - высота области

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.11 Смещение изображения

3.11.1 imtranslate

IM_STATUS imtranslate(const rga_buffer_t src,
                      rga_buffer_t dst,
                      int x,
                      int y,
                      int sync = 1,
                      int *release_fence_fd = NULL);

Сместить изображение в координаты (x, y). Ширина и высота src и dst должны совпадать; выходящая за границы часть обрезается.

Параметр Описание
src [обязательно]входное изображение
dst [обязательно] выходное изображение
x [обязательно] горизонтальное смещение
y [обязательно] вертикальное смещение
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.11.2 imtranslateTask

IM_API IM_STATUS imtranslateTask(im_job_handle_t job_handle,
                                 const rga_buffer_t src,
                                 rga_buffer_t dst,
                                 int x,
                                 int y);

Через job_handle добавить операцию смещения изображения в указанное задание. Использование соответствует imtranslate.

Параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно]входное изображение
dst [обязательно] выходное изображение
x [обязательно] горизонтальное смещение
y [обязательно] вертикальное смещение

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.12 Преобразование формата

3.12.1 imcvtcolor

IM_STATUS imcvtcolor(rga_buffer_t src,
                     rga_buffer_t dst,
                     int sfmt,
                     int dfmt,
                     int mode = IM_COLOR_SPACE_DEFAULT,
                     int sync = 1,
                     int *release_fence_fd = NULL);

Преобразовать формат. Поддержка зависит от SoC; см. раздел форматов. Форматы задаются через rga_buffer_t либо отдельно через sfmt/dfmt. При преобразовании цветового пространства YUV/RGB параметр mode выбирает пространство; по умолчанию BT.601 limited range.

параметр Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение
sfmt [необязательно] формат исходного изображения
dfmt [необязательно] формат целевого изображения
Mode [необязательно] режим цветового пространства:
IM_YUV_TO_RGB_BT601_LIMIT
IM_YUV_TO_RGB_BT601_FULL
IM_YUV_TO_RGB_BT709_LIMIT
IM_RGB_TO_YUV_BT601_LIMIT
IM_RGB_TO_YUV_BT601_FULL
IM_RGB_TO_YUV_BT709_LIMIT
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.12.2 imcvtcolorTask

IM_API IM_STATUS imcvtcolorTask(im_job_handle_t job_handle,
                                rga_buffer_t src,
                                rga_buffer_t dst,
                                int sfmt,
                                int dfmt,
                                int mode = IM_COLOR_SPACE_DEFAULT);

Через job_handle добавить операцию смещения изображения (формулировка источника) в указанное задание. Использование соответствует imcvtcolor.

параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение
sfmt [необязательно] формат исходного изображения
dfmt [необязательно] формат целевого изображения
Mode [необязательно] режим цветового пространства:
IM_YUV_TO_RGB_BT601_LIMIT
IM_YUV_TO_RGB_BT601_FULL
IM_YUV_TO_RGB_BT709_LIMIT
IM_RGB_TO_YUV_BT601_LIMIT
IM_RGB_TO_YUV_BT601_FULL
IM_RGB_TO_YUV_BT709_LIMIT

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.13 Поворот изображения

3.13.1 imrotate

IM_STATUS imrotate(const rga_buffer_t src,
                   rga_buffer_t dst,
                   int rotation,
                   int sync = 1,
                   int *release_fence_fd = NULL);

Поворот изображений на 90, 180 или 270 градусов.

Параметр Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение
rotation [обязательно] угол поворота:
IM_HAL_TRANSFORM_ROT_90
IM_HAL_TRANSFORM_ROT_180
IM_HAL_TRANSFORM_ROT_270
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.13.2 imrotateTask

IM_API IM_STATUS imrotateTask(im_job_handle_t job_handle,
                              const rga_buffer_t src,
                              rga_buffer_t dst,
                              int rotation);

Через job_handle добавить операцию поворота изображения в указанное задание. Использование соответствует imrotate.

Параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение
rotation [обязательно] угол поворота:
IM_HAL_TRANSFORM_ROT_90
IM_HAL_TRANSFORM_ROT_180
IM_HAL_TRANSFORM_ROT_270

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.14 Зеркальное отражение

3.14.1 imfilp

IM_STATUS imflip (const rga_buffer_t src,
                  rga_buffer_t dst,
                  int mode,
                  int sync = 1,
                  int *release_fence_fd = NULL);

Зеркально отразить изображение по горизонтали или вертикали.

Параметр Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение
mode [обязательно] режим отражения:
IM_HAL_TRANSFORM_FLIP_H_V
IM_HAL_TRANSFORM_FLIP_H
IM_HAL_TRANSFORM_FLIP_V
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.14.2 imflipTask

IM_API IM_STATUS imflipTask(im_job_handle_t job_handle,
                            const rga_buffer_t src,
                            rga_buffer_t dst,
                            int mode);

Через job_handle добавить операцию зеркального отражения в указанное задание. Использование соответствует imflip.

Параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение
mode [обязательно] режим отражения:
IM_HAL_TRANSFORM_FLIP_H_V
IM_HAL_TRANSFORM_FLIP_H
IM_HAL_TRANSFORM_FLIP_V

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.15 Композиция изображения

3.15.1 imblend/imcomposite

IM_STATUS imblend(const rga_buffer_t fg_image,
                  rga_buffer_t bg_image,
                  int mode = IM_ALPHA_BLEND_SRC_OVER,
                  int sync = 1,
                  int *release_fence_fd = NULL);

Двухканальная композиция RGA использует A+B -> B: передний план srcA и фон dst смешиваются по заданной альфа-модели, результат записывается в dst. Без настройки используется src-over.

IM_STATUS imcomposite(const rga_buffer_t fg_image,
                      const rga_buffer_t bg_image,
                      rga_buffer_t output_image,
                      int mode = IM_ALPHA_BLEND_SRC_OVER,
                      int sync = 1,
                      int *release_fence_fd = NULL);

Трёхканальная композиция RGA использует A+B -> C: передний план srcA и фон srcB альфа-смешиваются по выбранной модели, результат записывается в dst. По умолчанию src-over. В обоих режимах mode выбирает модель Porter-Duff. Определения:

  • S: источник/передний план.
  • D: назначение/фон.
  • R: результат.
  • c: компоненты RGB цвета RGBA. В Porter-Duff используются предумноженные цвета: исходный цвет, умноженный на альфа-компонент. Если предумножение не выполнено, примените Xc = Xc * Xa.
  • a: альфа-компонент/прозрачность RGBA.
  • f: коэффициент для цвета или альфа-компонента.

Основные формулы: цвет результата = цвет источника × коэффициент источника + цвет назначения × коэффициент назначения; альфа-компонент рассчитывается аналогично. RGA поддерживает модели:

Rc = Sc * Sf + Dc * Df;
Ra = Sa * Sf + Da * Df;

SRC:
Sf = 1, Df = 0;
[Rc,Ra] = [Sc,Sa];
DST:
Sf = 0, Df = 1;
[Rc,Ra] = [Dc,Da];
SRC_OVER:
Sf = 1, Df = (1 - Sa);
[Rc,Ra] = [ Sc + (1 - Sa) * Dc, Sa + (1 - Sa) * Da ];
DST_OVER:
Sf = (1 - Da), Df = 1;
[Rc,Ra] = [ Sc * (1 - Da) + Dc, Sa * (1 - Da) + Da ] ;

Композиция между изображениями YUV не поддерживается. dst функции imblend и srcB функции imcomposite не могут иметь формат YUV.

Параметр Описание
fg_image [обязательно] изображение переднего плана
bg_image [обязательно] фоновое изображение; при A+B->B также выходное изображение.
output_image [обязательно] выходное изображение.
mode [необязательно] режим смешивания:
IM_ALPHA_BLEND_SRC —— режим SRC
IM_ALPHA_BLEND_DST —— режим DST
IM_ALPHA_BLEND_SRC_OVER —— режим SRC OVER
IM_ALPHA_BLEND_DST_OVER —— режим DST OVER
IM_ALPHA_BLEND_PRE_MUL —— Включить предумножение: объединить флаг через OR с остальными флагами перед присваиванием mode.
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.15.2 imblendTask/imcompositeTask

IM_API IM_STATUS imblendTask(im_job_handle_t job_handle,
                             const rga_buffer_t fg_image,
                             rga_buffer_t bg_image,
                             int mode = IM_ALPHA_BLEND_SRC_OVER);

Через job_handle добавить композицию A+B -> B в задание. Использование соответствует imblend; по умолчанию применяется src-over.

IM_API IM_STATUS imcompositeTask(im_job_handle_t job_handle,
                                 const rga_buffer_t fg_image,
                                 const rga_buffer_t bg_image,
                                 rga_buffer_t output_image,
                                 int mode = IM_ALPHA_BLEND_SRC_OVER);

Через job_handle добавить композицию A+B -> C в задание. Использование соответствует imcomposite; режим по умолчанию src-over. Композиция между изображениями YUV не поддерживается: dst функции imblend и srcB функции imcomposite не могут иметь формат YUV.

Параметр Описание
job_handle [обязательно] дескриптор задания
fg_image [обязательно] изображение переднего плана
bg_image [обязательно] фоновое изображение; при A+B->B также выходное изображение.
output_image [обязательно] выходное изображение.
mode [необязательно] режим смешивания:
IM_ALPHA_BLEND_SRC —— режим SRC
IM_ALPHA_BLEND_DST —— режим DST
IM_ALPHA_BLEND_SRC_OVER —— режим SRC OVER
IM_ALPHA_BLEND_DST_OVER —— режим DST OVER
IM_ALPHA_BLEND_PRE_MUL —— Включить предумножение: объединить флаг через OR с остальными флагами перед присваиванием mode.

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.16 Цветовой ключ

3.16.1 imcolorkey

IM_STATUS imcolorkey(const rga_buffer_t src,
                     rga_buffer_t dst,
                     im_colorkey_range range,
                     int mode = IM_ALPHA_COLORKEY_NORMAL,
                     int sync = 1,
                     int *release_fence_fd = NULL);

Color Key предварительно обрабатывает источник: обнуляет альфа-компонент пикселей, удовлетворяющих условию цветового ключа, заданному непрозрачными значениями цвета, затем смешивает обработанный источник с назначением. Фильтрация применяется только к заданному диапазону цветов src, результат накладывается на dst. IM_ALPHA_COLORKEY_NORMAL обнуляет альфа-компонент внутри диапазона; IM_ALPHA_COLORKEY_INVERTED действует наоборот. По умолчанию используется IM_ALPHA_COLORKEY_NORMAL.

Параметры Диапазон Описание
max 0x0 ~ 0xFFFFFFFF Максимальное значение удаляемого цвета, порядок ABGR
min 0x0 ~ 0xFFFFFFFF Минимальное значение удаляемого цвета, порядок ABGR
параметр Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение
range [обязательно] целевой диапазон цвета
typedef struct im_colorkey_range {
int max;
int min;
} im_colorkey_value;
Mode [обязательно] режим цветового ключа:
IM_ALPHA_COLORKEY_NORMAL
IM_ALPHA_COLORKEY_INVERTED
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.16.2 imcolorkeyTask

IM_API IM_STATUS imcolorkeyTask(im_job_handle_t job_handle,
                                const rga_buffer_t fg_image,
                                rga_buffer_t bg_image,
                                im_colorkey_range range,
                                int mode = IM_ALPHA_COLORKEY_NORMAL);

Через job_handle добавить обработку Color Key в задание. Использование соответствует imcolorkey; режим по умолчанию IM_ALPHA_COLORKEY_NORMAL.

Параметры Диапазон Описание
max 0x0 ~ 0xFFFFFFFF Максимальное значение удаляемого цвета, порядок ABGR
min 0x0 ~ 0xFFFFFFFF Минимальное значение удаляемого цвета, порядок ABGR
параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение
range [обязательно] целевой диапазон цвета
typedef struct im_colorkey_range {
int max;
int min;
} im_colorkey_value;
Mode [обязательно] режим цветового ключа:
IM_ALPHA_COLORKEY_NORMAL
IM_ALPHA_COLORKEY_INVERTED

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.17 Наложение текста OSD

3.17.1 imosd

IM_API IM_STATUS imosd(const rga_buffer_t osd,
                       const rga_buffer_t bg_image,
                       const im_rect osd_rect,
                       im_osd_t *osd_config,
                       int sync = 1,
                       int *release_fence_fd = NULL);

OSD (On-Screen Display) накладывает текст на видеокадры, поддерживает статистику яркости текста и автоматическую инверсию цвета.

параметр Описание
OSD [обязательно] изображение блока OSD
bg_image [обязательно] выходное изображение
osd_rect [обязательно] область изображения для OSD
osd_config [обязательно] настройка функции OSD
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.17.2 imosdTask

IM_API IM_STATUS imosdTask(im_job_handle_t job_handle,
                           const rga_buffer_t osd,
                           const rga_buffer_t bg_image,
                           const im_rect osd_rect,
                           im_osd_t *osd_config);

Через job_handle добавить обработку OSD в указанное задание. Использование соответствует imosd.

параметр Описание
job_handle [обязательно] дескриптор задания
OSD [обязательно] изображение блока OSD
dst [обязательно] выходное изображение
osd_rect [обязательно] область изображения для OSD
osd_config [обязательно] настройка функции OSD

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.18 Предобработка NN (квантование)

3.18.1 imquantize

IM_STATUS imquantize(const rga_buffer_t src,
                     rga_buffer_t dst,
                     rga_nn_t nn_info,
                     int sync = 1,
                     int *release_fence_fd = NULL);

Сейчас поддерживается только на RV1126 / RV1109. Предобработка NN позволяет отдельно задавать offset и scale для каждого из трёх каналов RGB. Формула:

dst = 【(src + offset) * scale 】

Диапазоны параметров:

Параметры Диапазон Описание
scale 0 ~ 3.99 10 бит: старшие 2 бита — целая часть, младшие 8 — дробная.
offset -255 ~ 255 9 бит: старший бит — знак, младшие кодируют смещение 0–255.
параметр Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение
nn_info [обязательно] rga_nn_t отдельно задаёт offset и масштаб каждого канала RGB
typedef struct rga_nn {
int nn_flag;
int масштаб_r;
int масштаб_g;
int масштаб_b;
int offset_r;
int offset_g;
int offset_b;
} rga_nn_t;
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.18.2 imquantizeTask

IM_API IM_STATUS imquantizeTask(im_job_handle_t job_handle,
                                const rga_buffer_t src,
                                rga_buffer_t dst,
                                im_nn_t nn_info);

Через job_handle добавить квантование изображения в указанное задание. Использование соответствует imquantize.

параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение
nn_info [обязательно] rga_nn_t отдельно задаёт offset и масштаб каждого канала RGB
typedef struct rga_nn {
int nn_flag;
int масштаб_r;
int масштаб_g;
int масштаб_b;
int offset_r;
int offset_g;
int offset_b;
} rga_nn_t;

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.19 Растровые операции (ROP)

3.19.1 imrop

IM_STATUS imrop(const rga_buffer_t src,
                rga_buffer_t dst,
                int rop_code,
                int sync = 1,
                int *release_fence_fd = NULL);

Выполнить операцию ROP над двумя изображениями.

параметр Описание
src [обязательно] входное изображение
dst [обязательно] выходное изображение
rop_code [обязательно] режим кода ROP
IM_ROP_AND : dst = dst AND src;
IM_ROP_OR : dst = dst OR src
IM_ROP_NOT_DST : dst = NOT dst
IM_ROP_NOT_SRC : dst = NOT src
IM_ROP_XOR : dst = dst XOR src
IM_ROP_NOT_XOR : dst = NOT (dst XOR src)
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.19.2 imropTask

IM_API IM_STATUS imropTask(im_job_handle_t job_handle,
                           const rga_buffer_t src,
                           rga_buffer_t dst,
                           int rop_code);

Через job_handle добавить обработку изображения ROP в указанное задание. Использование соответствует imrop.

параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение
dst [обязательно] выходное изображение
rop_code [обязательно] режим кода ROP
IM_ROP_AND : dst = dst AND src;
IM_ROP_OR : dst = dst OR src
IM_ROP_NOT_DST : dst = NOT dst
IM_ROP_NOT_SRC : dst = NOT src
IM_ROP_XOR : dst = dst XOR src
IM_ROP_NOT_XOR : dst = NOT (dst XOR src)

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20 Заливка цветом и рисование рамок

3.20.1 imfill

IM_STATUS imfill(rga_buffer_t dst,
                 im_rect rect,
                 int color,
                 int sync = 1,
                 int *release_fence_fd = NULL);

Залить указанную область rect цветом. Параметр color задаёт RGBA: от старших битов к младшим A, B, G, R; например, красный: color = 0x000000ff. Ширина и высота rect должны быть не меньше 2.

Параметр Описание
dst [обязательно] целевое изображение
rect [обязательно] область для заливки заданным цветом
ширина и высота rect должны быть не меньше 2
color [обязательно] цвет заливки
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20.2 imfillArray

IM_API IM_STATUS imfillArray(rga_buffer_t dst,
                             im_rect *rect_array,
                             int array_size,
                             uint32_t color,
                             int sync = 1,
                             int *release_fence_fd = NULL);

Поочерёдно залить несколько областей изображения цветом. Параметр color задаёт RGBA: от старших битов к младшим A, B, G, R; например, красный: color = 0x000000ff. Ширина и высота rect должны быть не меньше 2.

Параметр Описание
dst [обязательно] целевое изображение
rect_array [обязательно] array_ptr областей для заливки заданным цветом
ширина и высота rect должны быть не меньше 2
array_size [обязательно] размер массивов областей.
color [обязательно] цвет заливки
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20.3 imfillTask

IM_API IM_STATUS imfillTask(im_job_handle_t job_handle,
                            rga_buffer_t dst,
                            im_rect rect,
                            uint32_t color);

Через job_handle добавить заливку изображения в задание. Использование соответствует imfill. Ширина и высота rect должны быть не меньше 2.

Параметр Описание
job_handle [обязательно] дескриптор задания
dst [обязательно] целевое изображение
rect [обязательно] область для заливки заданным цветом
ширина и высота rect должны быть не меньше 2
color [обязательно] цвет заливки

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20.4 imfillTaskArray

IM_API IM_STATUS imfillTaskArray(im_job_handle_t job_handle,
                                 rga_buffer_t dst,
                                 im_rect *rect_array,
                                 int array_size,
                                 uint32_t color);

Через job_handle добавить заливку нескольких областей цветом в задание. Использование соответствует imfillArray. Ширина и высота rect должны быть не меньше 2.

Параметр Описание
job_handle [обязательно] дескриптор задания
dst [обязательно] целевое изображение
rect_array [обязательно] array_ptr областей для заливки заданным цветом
ширина и высота rect должны быть не меньше 2
array_size [обязательно] размер массивов областей.
color [обязательно] цвет заливки

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20.5 imrectangle

IM_API IM_STATUS imrectangle(rga_buffer_t dst,
                             im_rect rect,
                             uint32_t color,
                             int thickness,
                             int sync = 1,
                             int *release_fence_fd = NULL);

Нарисовать цветом color рамку толщины thickness вокруг rect, задающего внешнюю границу. При отрицательном thickness прямоугольник заливается целиком. Параметр color задаёт RGBA: от старших битов к младшим A, B, G, R; например, красный: color = 0x000000ff. Ширина и высота rect должны быть не меньше 2.

Параметр Описание
dst [обязательно] целевое изображение
rect [обязательно] область для заливки заданным цветом
ширина и высота rect должны быть не меньше 2
color [обязательно] цвет заливки
thickness [обязательно] Толщина линий прямоугольника.
Отрицательные значения, например -1, означают рисование заполненного прямоугольника.
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20.6 imrectangleArray

IM_API IM_STATUS imrectangleArray(rga_buffer_t dst,
                                  im_rect *rect_array,
                                  int array_size,
                                  uint32_t color,
                                  int thickness,
                                  int sync = 1,
                                  int *release_fence_fd = NULL);

Поочерёдно нарисовать цветом color рамки толщины thickness вокруг нескольких областей rect, задающих внешние границы. При отрицательном thickness прямоугольники заливаются целиком. Параметр color задаёт RGBA: от старших битов к младшим A, B, G, R; например, красный: color = 0x000000ff. Ширина и высота rect должны быть не меньше 2.

Параметр Описание
dst [обязательно] целевое изображение
rect_array [обязательно] array_ptr областей для заливки заданным цветом
ширина и высота rect должны быть не меньше 2
array_size [обязательно] размер массивов областей.
color [обязательно] цвет заливки
thickness [обязательно] Толщина линий прямоугольника.
Отрицательные значения, например -1, означают рисование заполненного прямоугольника.
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20.7 imrectangleTask

IM_API IM_STATUS imrectangleTask(im_job_handle_t job_handle,
                                 rga_buffer_t dst,
                                 im_rect rect,
                                 uint32_t color,
                                 int thickness);

Через job_handle добавить рисование прямоугольных рамок в задание. Использование соответствует imrectangle. Ширина и высота rect должны быть не меньше 2.

Параметр Описание
job_handle [обязательно] дескриптор задания
dst [обязательно] целевое изображение
rect [обязательно] область для заливки заданным цветом
ширина и высота rect должны быть не меньше 2
color [обязательно] цвет заливки
thickness [обязательно] Толщина линий прямоугольника.
Отрицательные значения, например -1, означают рисование заполненного прямоугольника.

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20.8 imrectangleTaskArray

IM_API IM_STATUS imrectangleTaskArray(im_job_handle_t job_handle,
                                      rga_buffer_t dst,
                                      im_rect *rect_array,
                                      int array_size,
                                      uint32_t color,
                                      int thickness);

Через job_handle добавить рисование нескольких прямоугольных рамок в задание. Использование соответствует imrectangleArray. Ширина и высота rect должны быть не меньше 2.

Параметр Описание
job_handle [обязательно] дескриптор задания
dst [обязательно] целевое изображение
rect_array [обязательно] array_ptr областей для заливки заданным цветом
ширина и высота rect должны быть не меньше 2
array_size [обязательно] размер массивов областей.
color [обязательно] цвет заливки
thickness [обязательно] Толщина линий прямоугольника.
Отрицательные значения, например -1, означают рисование заполненного прямоугольника.

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.20.9 immakeBorder

IM_API IM_STATUS immakeBorder(rga_buffer_t src,
                              rga_buffer_t dst,
                              int top,
                              int bottom,
                              int left,
                              int right,
                              int border_type,
                              int value = 0,
                              int sync = 1,
                              int acquir_fence_fd = -1,
                              int *release_fence_fd = NULL);

Добавить к входному изображению рамку размером top/bottom/left/right пикселей и записать результат в целевой буфер. Каждое значение top/bottom/left/right должно быть не меньше 2.

Параметр Описание
src [обязательно] входное исходное изображение
dst [обязательно] выходное целевое изображение
top [обязательно] число пикселей сверху
bottom [обязательно] число пикселей снизу
left [обязательно] число пикселей слева
right [обязательно] число пикселей справа
border_type [обязательно] тип рамки
IM_BORDER_CONSTANT // iiiiii abcdefgh iiiiiii с заданным значением ‘i’
IM_BORDER_REFLECT //fedcba abcdefgh hgfedcb
IM_BORDER_WRAP //cdefgh abcdefgh abcdefg
value [необязательно] значение пикселя заливки рамки
sync [необязательно] ожидать завершения операции
acquire_fence_fd [обязательно] в асинхронном режиме запустить задание после ожидания сигнала acquire_fence
release_fence_fd [обязательно] используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.21 Мозаика изображения

3.21.1 immosaic

IM_API IM_STATUS immosaic(const rga_buffer_t image,
                          im_rect rect,
                          int mosaic_mode,
                          int sync = 1,
                          int *release_fence_fd = NULL);

Применить мозаичную маскировку к указанной области изображения.

Параметр Описание
image [обязательно] целевое изображение
rect [обязательно] область для мозаики
мозаика_mode [обязательно] режим мозаики
IM_MOSAIC_8
IM_MOSAIC_16
IM_MOSAIC_32
IM_MOSAIC_64
IM_MOSAIC_128
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.21.2 immosaicArray

IM_API IM_STATUS immosaicArray(const rga_buffer_t image,
                               im_rect *rect_array,
                               int array_size,
                               int mosaic_mode,
                               int sync = 1,
                               int *release_fence_fd = NULL);

Поочерёдно применить мозаичную маскировку к нескольким областям изображения.

Параметр Описание
image [обязательно] целевое изображение
rect_array [обязательно] array_ptr областей для мозаики
array_size [обязательно] размер массивов областей.
мозаика_mode [обязательно] режим мозаики
IM_MOSAIC_8
IM_MOSAIC_16
IM_MOSAIC_32
IM_MOSAIC_64
IM_MOSAIC_128
sync [необязательно] ожидать завершения операции
release_fence_fd [необязательно]используется асинхронно как параметр imsync()

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.21.3 immosaicTask

IM_API IM_STATUS immosaicTask(im_job_handle_t job_handle,
                              const rga_buffer_t image,
                              im_rect rect,
                              int mosaic_mode);

Через job_handle добавить мозаичную маскировку в указанное задание. Использование соответствует immosaic.

Параметр Описание
job_handle [обязательно] дескриптор задания
image [обязательно] целевое изображение
rect [обязательно] область для мозаики
мозаика_mode [обязательно] режим мозаики
IM_MOSAIC_8
IM_MOSAIC_16
IM_MOSAIC_32
IM_MOSAIC_64
IM_MOSAIC_128

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.21.4 immosaicTaskArray

IM_API IM_STATUS immosaicTaskArray(im_job_handle_t job_handle,
                                   const rga_buffer_t image,
                                   im_rect *rect_array,
                                   int array_size,
                                   int mosaic_mode);

Через job_handle добавить мозаичную маскировку нескольких областей изображения в указанное задание. Использование соответствует immosaicArray.

Параметр Описание
job_handle [обязательно] дескриптор задания
image [обязательно] целевое изображение
rect_array [обязательно] array_ptr областей для мозаики
array_size [обязательно] размер массивов областей.
мозаика_mode [обязательно] режим мозаики
IM_MOSAIC_8
IM_MOSAIC_16
IM_MOSAIC_32
IM_MOSAIC_64
IM_MOSAIC_128

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.22 Обработка изображения

3.22.1 improcess

IM_STATUS improcess(rga_buffer_t src,
                    rga_buffer_t dst,
                    rga_buffer_t pat,
                    im_rect srect,
                    im_rect drect,
                    im_rect prect,
                    int acquire_fence_fd,
                    int *release_fence_fd,
                    im_opt_t *opt,
                    int usage);

Функция комбинированных операций RGA. Остальные API построены на её основе; improcess поддерживает более сложные комбинации. Операции задаются через usage со следующим определением:

typedef enum {
    /* Rotation */
    IM_HAL_TRANSFORM_ROT_90     = 1 << 0,
    IM_HAL_TRANSFORM_ROT_180    = 1 << 1,
    IM_HAL_TRANSFORM_ROT_270    = 1 << 2,
    IM_HAL_TRANSFORM_FLIP_H     = 1 << 3,
    IM_HAL_TRANSFORM_FLIP_V     = 1 << 4,
    IM_HAL_TRANSFORM_FLIP_H_V   = 1 << 5,
    IM_HAL_TRANSFORM_MASK       = 0x3f,
    /*
     * Blend
     * Additional blend usage, can be used with both source and target configs.
     * If none of the below is set, the default "SRC over DST" is applied.
     */
    IM_ALPHA_BLEND_SRC_OVER     = 1 << 6,     /* Default, Porter-Duff "SRC over DST" */
    IM_ALPHA_BLEND_SRC          = 1 << 7,     /* Porter-Duff "SRC" */
    IM_ALPHA_BLEND_DST          = 1 << 8,     /* Porter-Duff "DST" */
    IM_ALPHA_BLEND_SRC_IN       = 1 << 9,     /* Porter-Duff "SRC in DST" */
    IM_ALPHA_BLEND_DST_IN       = 1 << 10,    /* Porter-Duff "DST in SRC" */
    IM_ALPHA_BLEND_SRC_OUT      = 1 << 11,    /* Porter-Duff "SRC out DST" */
    IM_ALPHA_BLEND_DST_OUT      = 1 << 12,    /* Porter-Duff "DST out SRC" */
    IM_ALPHA_BLEND_DST_OVER     = 1 << 13,    /* Porter-Duff "DST over SRC" */
    IM_ALPHA_BLEND_SRC_ATOP     = 1 << 14,    /* Porter-Duff "SRC ATOP" */
    IM_ALPHA_BLEND_DST_ATOP     = 1 << 15,    /* Porter-Duff "DST ATOP" */
    IM_ALPHA_BLEND_XOR          = 1 << 16,    /* Xor */
    IM_ALPHA_BLEND_MASK         = 0x1ffc0,

    IM_ALPHA_COLORKEY_NORMAL    = 1 << 17,
    IM_ALPHA_COLORKEY_INVERTED  = 1 << 18,
    IM_ALPHA_COLORKEY_MASK      = 0x60000,

    IM_SYNC                     = 1 << 19,
    IM_ASYNC                    = 1 << 26,
    IM_CROP                     = 1 << 20,    /* Unused */
    IM_COLOR_FILL               = 1 << 21,
    IM_COLOR_PALETTE            = 1 << 22,
    IM_NN_QUANTIZE              = 1 << 23,
    IM_ROP                      = 1 << 24,
    IM_ALPHA_BLEND_PRE_MUL      = 1 << 25,
} IM_USAGE;
Параметр Описание
src [обязательно] входное изображение A
dst [обязательно] выходное изображение
pat [обязательно] входное изображение B
srect [обязательно] область обрезки src
drect [обязательно] область обрезки dst
prect [обязательно] область обрезки pat
acquire_fence_fd [обязательно] в асинхронном режиме запустить задание после ожидания сигнала acquire_fence
release_fence_fd [обязательно] используется асинхронно как параметр imsync()
opt [обязательно] параметры операции
typedef struct im_opt {
int color;
im_colorkey_range colorkey_range;
im_nn_t nn;
int rop_code;
int priority;
int core;
} im_opt_t;
usage [обязательно] режим операции изображения

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.22.2 improcessTask

IM_API IM_STATUS improcessTask(im_job_handle_t job_handle,
                               rga_buffer_t src,
                               rga_buffer_t dst,
                               rga_buffer_t pat,
                               im_rect srect,
                               im_rect drect,
                               im_rect prect,
                               im_opt_t *opt_ptr,
                               int usage);

Через job_handle добавить комбинированную обработку изображения в указанное задание. Использование соответствует improcess.

Параметр Описание
job_handle [обязательно] дескриптор задания
src [обязательно] входное изображение A
dst [обязательно] выходное изображение
pat [обязательно] входное изображение B
srect [обязательно] область обрезки src
drect [обязательно] область обрезки dst
prect [обязательно] область обрезки pat
acquire_fence_fd [обязательно] в асинхронном режиме запустить задание после ожидания сигнала acquire_fence
release_fence_fd [обязательно] используется асинхронно как параметр imsync()
opt [обязательно] параметры операции
typedef struct im_opt {
int color;
im_colorkey_range colorkey_range;
im_nn_t nn;
int rop_code;
int priority;
int core;
} im_opt_t;
usage [обязательно] режим операции изображения

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.23 Проверка параметров

3.23.1 imcheck

IM_API IM_STATUS imcheck(const rga_buffer_t src, const rga_buffer_t dst,
                         const im_rect src_rect, const im_rect dst_rect,
                         const int mode_usage);
IM_API IM_STATUS imcheck_composite(const rga_buffer_t src, const rga_buffer_t dst, const rga_buffer_t pat,
                                   const im_rect src_rect, const im_rect dst_rect, const im_rect pat_rect,
                                   const int mode_usage);

После настройки параметров задания RGA этот интерфейс проверяет их корректность и поддержку текущим оборудованием.

Рекомендуется использовать интерфейс только при разработке и отладке, чтобы повторные проверки не снижали производительность.

Параметр Описание
src [обязательно] входное изображение A
dst [обязательно] выходное изображение
pat [необязательно] входное изображение B
srect [обязательно] область обрезки src
drect [обязательно] область обрезки dst
prect [необязательно] область обрезки pat
usage [необязательно] режим операции изображения

При успехе возвращает IM_STATUS_NOERROR, иначе отрицательный код ошибки.

3.24 Синхронизация

3.24.1 imsync

IM_STATUS imsync(int fence_fd);

В асинхронном режиме передайте возвращённый release_fence_fd этому интерфейсу для ожидания завершения. Значение sync = 0 в других API включает асинхронный вызов, аналогичный OpenGL glFlush; последующий вызов imsync даёт эффект glFinish.

Параметр Описание
fence_fd [обязательно] fence_fd для ожидания

При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

3.25 Настройка контекста потока

3.25.1 imconfig

IM_STATUS  imconfig(IM_CONFIG_NAME name, uint64_t value);

Настройте контекст текущего потока с помощью различных имён конфигурации. Контекст задаёт значения потока по умолчанию и имеет меньший приоритет, чем аргументы интерфейса. Если параметр не задан при вызове, используется значение контекста; иначе действует аргумент текущего вызова.

параметр Описание
name [обязательно] имя настройки контекста:
IM_CONFIG_SCHEDULER_CORE —— выбрать ядро обработки задания
IM_CONFIG_PRIORITY —— приоритет задания
IM_CHECK_CONFIG —— включение проверки
value [обязательно] значение настройки
IM_CONFIG_SCHEDULER_CORE :
IM_SCHEDULER_RGA3_CORE0
IM_SCHEDULER_RGA3_CORE1
IM_SCHEDULER_RGA2_CORE0
IM_SCHEDULER_RGA3_DEFAULT
IM_SCHEDULER_RGA2_DEFAULT
IM_CONFIG_PRIORITY:
0 ~ 6
IM_CHECK_CONFIG:
TRUE
FALSE

priority и core имеют очень высокие полномочия. Неправильное использование может вызвать сбой или взаимоблокировку системы. Рекомендуется применять их только при разработке и отладке, а не в продуктах. При успехе возвращает IM_STATUS_SUCCESS, иначе отрицательный код ошибки.

4. Структуры данных

В этой главе подробно описаны структуры данных интерфейсов приложений.

4.1 Обзор

Структура данных Описание
rga_buffer_t Информация о буфере изображения
im_rect Фактическая область обработки изображения
im_opt_t Параметры операций изображения
im_job_handle_t Дескриптор задания RGA
rga_buffer_handle_t Дескриптор буфера изображения драйвера RGA
im_handle_param_t Свойства импортируемого буфера изображения
im_context_t Контекст текущего потока по умолчанию
im_nn_t Параметры предобработки NN
im_colorkey_range Диапазон цветового ключа

4.2 Подробные описания

4.2.1 rga_buffer_t

Информация о буфере изображения одного канала.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct {
    void* vir_addr;                     /* virtual address */
    void* phy_addr;                     /* physical address */
    int fd;                             /* shared fd */
    rga_buffer_handle_t handle;         /* buffer handle */

    int width;                          /* width */
    int height;                         /* height */
    int wstride;                        /* wstride */
    int hstride;                        /* hstride */
    int format;                         /* format */

    int color_space_mode;               /* color_space_mode */
    int global_alpha;                   /* global_alpha */
    int rd_mode;
} rga_buffer_t;
Поле Описание
vir_addr Виртуальный адрес буфера.
phy_addr Непрерывный физический адрес буфера.
fd Файловый дескриптор DMA-буфера.
handle Дескриптор памяти буфера, импортированного в RGA.
width Ширина фактической области операции в пикселях.
height Высота фактической области операции в пикселях.
wstride Шаг ширины изображения в пикселях.
hstride Шаг высоты изображения в пикселях.
format Формат изображения.
color_space_mode Цветовое пространство.
global_alpha Глобальный альфа-компонент.
rd_mode Режим чтения текущего канала.

Примечания: выберите только одно из vir_addr, phy_addr, fd, handle для описания буфера. При присваивании нескольких полей выбирается одно по приоритету: handle > phy_addr > fd > vir_addr.

4.2.2 im_rect

Фактическая область операции одного канала.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct {
    int x;        /* upper-left x */
    int y;        /* upper-left y */
    int width;    /* width */
    int height;   /* height */
} im_rect;
Поле Описание
x Начальная координата x фактической области операции в пикселях.
y Начальная координата y фактической области операции в пикселях.
width Ширина фактической области операции в пикселях.
height Высота фактической области операции в пикселях.

Область операции не должна выходить за размеры изображения: (x + width) <= wstride и (y + height) <= hstride.

4.2.3 im_opt_t

Параметры обработки изображения текущего задания.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct im_opt {
    im_api_version_t version DEFAULT_INITIALIZER(RGA_CURRENT_API_HEADER_VERSION);
    int color;                          /* color, used by color fill */
    im_colorkey_range colorkey_range;   /* range value of color key */
    im_nn_t nn;
    int rop_code;
    int priority;
    int core;
    int mosaic_mode;
    im_osd_t osd_config;
    im_intr_config_t intr_config;
    char reserve[128];
} im_opt_t;
Поле Описание
version Текущая версия заголовка
color Цвет заливки изображения.
colorkey_range Настройка диапазона цветового ключа.
nn Предобработка NN (квантование).
rop_code Настройка кода операции ROP.
priority Приоритет текущего задания.
core Аппаратное ядро текущего задания.
мозаика_mode Режим мозаики.
osd_config Настройка инверсии/статистики наложения текста OSD.
intr_config Режим раннего прерывания.
reserve Зарезервировано.

priority и core имеют очень высокие полномочия. Неправильное использование может вызвать сбой или взаимоблокировку системы. Рекомендуется применять их только при разработке и отладке, а не в продуктах.

4.2.4 im_job_handle_t

Дескриптор задания RGA, идентифицирующий настраиваемое задание.

Путь: im2d_api/im2d_type.h. Определение:

typedef uint32_t im_job_handle_t;

При ошибке настройки освободите текущий дескриптор задания через imcancelJob, чтобы избежать утечки памяти.

4.2.5 rga_buffer_handle_t

Дескриптор буфера изображения драйвера RGA.

Путь: im2d_api/im2d_type.h. Определение:

typedef int rga_buffer_handle_t;

После использования памяти освободите её через releasebuffer_handle, чтобы избежать утечки.

4.2.6 im_handle_param_t

Параметры описания импортируемого буфера изображения.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct im_handle_param {
    uint32_t width;
    uint32_t height;
    uint32_t format;
} im_handle_param_t;
Поле Описание
width_stride Горизонтальный шаг импортируемого буфера в пикселях.
height_stride Вертикальный шаг импортируемого буфера в пикселях.
format Формат импортируемого буфера.

Структура описывает размер выделенной памяти буфера. Если фактически выделено меньше указанного размера, importbuffer_T завершится ошибкой.

4.2.7 im_nn_t

Параметры предобработки NN (квантования).

Путь: im2d_api/im2d_type.h. Определение:

typedef struct im_nn {
    int scale_r;                /* scaling factor on R channal */
    int scale_g;                /* scaling factor on G channal */
    int scale_b;                /* scaling factor on B channal */
    int offset_r;               /* offset on R channal */
    int offset_g;               /* offset on G channal */
    int offset_b;               /* offset on B channal */
} im_nn_t;
Поле Описание
scale_r Коэффициент масштаба красного канала.
scale_g Коэффициент масштаба зелёного канала.
scale_b Коэффициент масштаба синего канала.
offset_r Смещение красного канала.
offset_g Смещение зелёного канала.
offset_b Смещение синего канала.

Примечания: нет.

4.2.8 im_colorkey_range

Диапазон цветового ключа.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct {
    int max;                    /* The Maximum value of the color key */
    int min;                    /* The minimum value of the color key */
} im_colorkey_range;
Поле Описание
max Максимум цветового ключа.
min Минимум цветового ключа.

Примечания: нет.

4.2.9 im_osd_block_t

Настройка описания текстового блока OSD.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct im_osd_block {
    int width_mode;                 // normal or different
                                    //   IM_OSD_BLOCK_MODE_NORMAL
                                    //   IM_OSD_BLOCK_MODE_DIFFERENT
    union {
        int width;                  // normal_mode block width
        int width_index;            // different_mode block width index in RAM
    };

    int block_count;                // block count

    int background_config;          // background config is bright or dark
                                    //   IM_OSD_BACKGROUND_DEFAULT_BRIGHT
                                    //   IM_OSD_BACKGROUND_DEFAULT_DARK

    int direction;                  // osd block direction
                                    //   IM_OSD_MODE_HORIZONTAL
                                    //   IM_OSD_MODE_VERTICAL

    int color_mode;                 // using src1 color or config color
                                    //   IM_OSD_COLOR_PIXEL
                                    //   IM_OSD_COLOR_EXTERNAL
    im_color_t normal_color;        // config color: normal
    im_color_t invert_color;        // config color: invert
} im_osd_block_t;
Поле Описание
width_mode Режим ширины блоков:
Одинаковая: IM_OSD_BLOCK_MODE_NORMAL.
Разная: IM_OSD_BLOCK_MODE_DIFFERENT.
width/width_index width: в режиме одинаковой ширины задаёт ширину блока OSD текущего задания.
width_index: в режиме разной ширины задаёт индекс используемой таблицы ширин во внутренней RAM.
block_count Число текстовых блоков
background_config Яркость фона текста:
Чёрный текст на белом: IM_OSD_BACKGROUND_DEFAULT_BRIGHT.
Белый на чёрном: IM_OSD_BACKGROUND_DEFAULT_DARK.
direction Направление OSD:
Вертикальное: IM_OSD_MODE_VERTICAL.
Горизонтальное: IM_OSD_MODE_HORIZONTAL.
color_mode Цвет блока OSD:
Цвет пикселя: IM_OSD_COLOR_PIXEL.
Внешний цвет: IM_OSD_COLOR_EXTERNAL.
normal_color Внешне заданный цвет текстового блока в обычном состоянии без инверсии.
invert_color Внешне заданный цвет текстового блока при инверсии.

Примечания: нет.

4.2.10 im_osd_invert_factor_t

Настройка формулы инверсии цвета OSD.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct im_osd_invert_factor {
    uint8_t alpha_max;
    uint8_t alpha_min;
    uint8_t yg_max;
    uint8_t yg_min;
    uint8_t crb_max;
    uint8_t crb_min;
} im_osd_invert_factor_t;

Формула: MAX(channel_min_factor, channel_max_factor - channel_value). Примечания: нет.

4.2.11 im_osd_invert_t

Настройка инверсии цвета OSD.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct im_osd_invert {
    int invert_channel;         // invert channel config:
                                //   IM_OSD_INVERT_CHANNEL_NONE
                                //   IM_OSD_INVERT_CHANNEL_Y_G
                                //   IM_OSD_INVERT_CHANNEL_C_RB
                                //   IM_OSD_INVERT_CHANNEL_ALPHA
                                //   IM_OSD_INVERT_CHANNEL_COLOR
                                //   IM_OSD_INVERT_CHANNEL_BOTH
    int flags_mode;             // use external or inertnal RAM invert flags
                                //   IM_OSD_FLAGS_EXTERNAL
                                //   IM_OSD_FLAGS_INTERNAL
    int flags_index;            // flags index when using internal RAM invert flags

    uint64_t invert_flags;      // external invert flags
    uint64_t current_flags;     // current flags

    int invert_mode;            // invert use swap or factor
                                //   IM_OSD_INVERT_USE_FACTOR
                                //   IM_OSD_INVERT_USE_SWAP
    im_osd_invert_factor_t factor;

    int threash;
} im_osd_invert_t;
Поле Описание
invert_channel Каналы инверсии:
По умолчанию нет: IM_OSD_INVERT_CHANNEL_NONE.
Y/G: IM_OSD_INVERT_CHANNEL_Y_G.
C(UV)/RB: IM_OSD_INVERT_CHANNEL_C_RB.
Alpha: IM_OSD_INVERT_CHANNEL_ALPHA.
Цвет: IM_OSD_INVERT_CHANNEL_COLOR, то есть (IM_OSD_INVERT_CHANNEL_Y_G | IM_OSD_INVERT_CHANNEL_C_RB).
Все: IM_OSD_INVERT_CHANNEL_BOTH, то есть (IM_OSD_INVERT_CHANNEL_COLOR | IM_OSD_INVERT_CHANNEL_ALPHA).
flags_mode Режим управления инверсией (назначения источника):
Внутреннее: IM_OSD_FLAGS_EXTERNAL, флаги собраны во внутренней RAM.
Внешнее: IM_OSD_FLAGS_INTERNAL, управление извне.
flags_index Индекс используемой таблицы флагов управления инверсией во внутренней RAM.
invert_flags Внешняя 64-битная таблица управления инверсией.
current_flags 64-битная таблица инверсии, собранная текущим заданием; читать после его завершения.
invert_mode Режим инверсии:
Собственная формула: IM_OSD_INVERT_USE_FACTOR.
Стандартная: IM_OSD_INVERT_USE_SWAP; поменять U и V для YUV либо R и B для RGB.
factor Формула инверсии цвета.
threash Порог инверсии.

Примечания: нет.

4.2.12 im_osd_bpp2_t

Настройка отображения формата OSD BPP2 в RGB.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct im_osd_bpp2 {
    uint8_t  ac_swap;       // ac swap flag
                            // 0: CA
                            // 1: AC
    uint8_t  endian_swap;   // rgba2bpp endian swap
                            // 0: Big endian
                            // 1: Little endian
    im_color_t color0;
    im_color_t color1;
} im_osd_bpp2_t;
Поле Описание
ac_swap Режим расположения AC.
endian_swap Настройка порядка байтов.
color0 Цвет отображения при color = 0.
color1 Цвет отображения при color = 1.

Примечания: нет.

4.2.13 im_osd_t

Настройка функции OSD.

Путь: im2d_api/im2d_type.h. Определение:

typedef struct im_osd {

  int osd_mode;                 // osd mode: statistics or auto_invert
  im_osd_block_t block_parm;    // osd block info config
  im_osd_invert_t invert_config;
  im_osd_bpp2_t bpp2_info;
} im_osd_t;
Поле Описание
osd_mode Режим OSD:
Статистика: IM_OSD_MODE_STATISTICS.
Инверсия: IM_OSD_MODE_AUTO_INVERT.
block_parm Параметры блока OSD.
invert_config Настройка инверсии цвета.
bpp2_info Настройка формата bpp2-rgb.

Примечания: нет.

5. Тесты и отладка

Запуск демонстрационной программы и разбор её исходного кода помогают быстрее освоить описанные интерфейсы.

5.1 Тестовые файлы

Заранее подготовьте двоичные входные/выходные файлы теста. Готовые исходные изображения RGBA8888 находятся в /sample/sample_file. На Android поместите их в /data/, на Linux в /usr/data. Правила имён:

in%dw%d-h%d-%s.bin
out%dw%d-h%d-%s.bin

⽰例:
1280×720 RGBA8888的输⼊图像: in0w1280-h720-rgba8888.bin
1280×720 RGBA8888的输出图像: out0w1280-h720-rgba8888.bin

Значения параметров: входные файлы используют in, выходные out. Первый %d — индекс, обычно 0, различающий файлы одинакового формата и размеров. Второй %d — ширина, обычно виртуальная; третий — высота, обычно виртуальная. Четвёртый %s — имя формата. Ниже приведены распространённые предустановленные форматы; строки остальных форматов см. в rgaUtils.cpp.

format(Android) format(Linux) name
HAL_PIXEL_FORMAT_RGB_565 RK_FORMAT_RGB_565 “rgb565”
HAL_PIXEL_FORMAT_RGB_888 RK_FORMAT_RGB_888 “rgb888”
HAL_PIXEL_FORMAT_RGBA_8888 RK_FORMAT_RGBA_8888 “rgba8888”
HAL_PIXEL_FORMAT_RGBX_8888 RK_FORMAT_RGBX_8888 “rgbx8888”
HAL_PIXEL_FORMAT_BGRA_8888 RK_FORMAT_BGRA_8888 “bgra8888”
HAL_PIXEL_FORMAT_YCrCb_420_SP RK_FORMAT_YCrCb_420_SP “crcb420sp”
HAL_PIXEL_FORMAT_YCrCb_NV12 RK_FORMAT_YCbCr_420_SP “nv12”
HAL_PIXEL_FORMAT_YCrCb_NV12_VIDEO / “nv12”
HAL_PIXEL_FORMAT_YCrCb_NV12_10 RK_FORMAT_YCbCr_420_SP_10B “nv12_10”

Вход по умолчанию — 1280x720 RGBA8888. Подготовьте in0w1280-h720-rgba8888.bin в /data или /usr/data. Для композиции дополнительно нужен in1w1280-h720-rgba8888.bin в том же каталоге.

5.2 Отладка

После запуска demo выводит следующий журнал (пример копирования). Журнал Android:

# rgaImDemo --copy

librga:RGA_GET_VERSION:3.02,3.020000                    //RGA版本
ctx=0x7ba35c1520,ctx->rgaFd=3                           //RGA上下⽂
Start selecting mode
im2d copy ..                                            //RGA运⾏模式
GraphicBuffer check ok
GraphicBuffer check ok
lock buffer ok
open file ok                                            //src⽂件的状态,如果/data/⽬录下没有对应⽂件这⾥会报错
unlock buffer ok
lock buffer ok
unlock buffer ok
copying .... successfully                               //标志运⾏成功
open /data/out0w1280-h720-rgba8888.bin and write ok     //输出⽂件名以及⽬录

Журнал Linux:

# rgaImDemo --copy

librga:RGA_GET_VERSION:3.02,3.020000                    //RGA版本
ctx=0x2b070,ctx->rgaFd=3                                //RGA上下⽂
Rga built version:version:1.00
Start selecting mode
im2d copy ..                                            //RGA运⾏模式
open file                                               //src⽂件的状态,如果/usr/data/⽬录下没有对应⽂件这⾥会报错
copying .... Run successfully                           //标志运⾏成功
open /usr/data/out0w1280-h720-rgba8888.bin and write ok //输出⽂件名以及⽬录

Для подробного журнала RGA на Android включите вывод конфигурации свойством vendor.rga.log (sys.rga.log на Android 8 и более ранних версиях):

setprop vendor.rga.log 1        打开RGA log打印
logcat -s librga                开启并过滤log打印
setprop vendor.rga.log 0        关闭RGA log打印

На Linux установите __DEBUG в 1 в core/NormalRgaContext.h и пересоберите.

#ifdef LINUX

-#define __DEBUG 0
+#define __DEBUG 1

Ниже приведены типичные журналы. Их можно загрузить в RedMine для анализа соответствующими инженерами RK. Журнал Android:

D librga  : <<<<-------- print rgaLog -------->>>>
D librga  : src->hnd = 0x0 , dst->hnd = 0x0
D librga  : srcFd = 11 , phyAddr = 0x0 , virAddr = 0x0
D librga  : dstFd = 15 , phyAddr = 0x0 , virAddr = 0x0
D librga  : srcBuf = 0x0 , dstBuf = 0x0
D librga  : blend = 0 , perpixelAlpha = 1
D librga  : scaleMode = 0 , stretch = 0;
D librga  : rgaVersion = 3.020000  , ditherEn =0
D librga  : srcMmuFlag = 1 , dstMmuFlag = 1 , rotateMode = 0
D librga  : <<<<-------- rgaReg -------->>>>
D librga  : render_mode=0 rotate_mode=0
D librga  : src:[b,0,e1000],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0
D librga  : dst:[f,0,e1000],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0
D librga  : pat:[0,0,0],x-y[0,0],w-h[0,0],vw-vh[0,0],f=0
D librga  : ROP:[0,0,0],LUT[0]
D librga  : color:[0,0,0,0,0]
D librga  : MMU:[1,0,80000521]
D librga  : mode[0,0,0,0]

Журнал Linux:

render_mode=0 rotate_mode=0
src:[0,a681a008,a68fb008],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0
dst:[0,a6495008,a6576008],x-y[0,0],w-h[1280,720],vw-vh[1280,720],f=0
pat:[0,0,0],x-y[0,0],w-h[0,0],vw-vh[0,0],f=0
ROP:[0,0,0],LUT[0]
color:[0,0,0,0,0]
MMU:[1,0,80000521]
mode[0,0,0,0,0]
gr_color_x [0, 0, 0]
gr_color_x [0, 0, 0]

5.3 Тесты

Тесты находятся в sample/im2d_api_demo дерева исходников librga. Настройки demo можно менять по необходимости; первый запуск рекомендуется выполнять со стандартными настройками. Сборка зависит от платформы: Android поддерживает команду mm, а Linux создаёт тестовый исполняемый файл в том же каталоге при сборке librga.so через CMake. Перенесите файл на устройство через adb, разрешите исполнение, запустите и изучите журнал. Проверьте соответствие выходного файла ожиданиям.

5.3.1 Выделение буферов изображения

Demo предоставляет буферы Graphicbuffer и AHardwareBuffer для композиции RGA; выбор задаётся макросом USE_AHARDWAREBUFFER.

⽬录:librga/samples/im2d_api_demo/Android.mk
(line +15)

ifeq (1,$(strip $(shell expr $(PLATFORM_SDK_VERSION) \> 25)))
/*USE_AHARDWAREBUFFER为1则使⽤AHardwareBuffer,为0使⽤Graphicbuffer*/
LOCAL_CFLAGS += -DUSE_AHARDWAREBUFFER=1
endif
5.3.1.1 Graphicbuffer

Три основные функции инициализируют Graphicbuffer, заполняют/очищают буфер и заполняют rga_buffer_t.

/*传⼊src/dst的宽、⾼、图像格式,初始化Graphicbuffer*/
src_buf = GraphicBuffer_Init(SRC_WIDTH, SRC_HEIGHT, SRC_FORMAT);
dst_buf = GraphicBuffer_Init(DST_WIDTH, DST_HEIGHT, DST_FORMAT);

/*通过枚举值FILL_BUFF/EMPTY_BUFF,执⾏填充/清空Graphicbuffer*/
GraphicBuffer_Fill(src_buf, FILL_BUFF, 0);
if(MODE == MODE_BLEND)
    GraphicBuffer_Fill(dst_buf, FILL_BUFF, 1);
else
    GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1);

/*填充rga_buffer_t结构体:src、dst*/
src = wrapbuffer_GraphicBuffer(src_buf);
dst = wrapbuffer_GraphicBuffer(dst_buf);
5.3.1.2 AHardwareBuffer

Три основные функции инициализируют AHardwareBuffer, заполняют/очищают буфер и заполняют rga_buffer_t.

/*传⼊src/dst的宽、⾼、图像格式,初始化AHardwareBuffer*/
AHardwareBuffer_Init(SRC_WIDTH, SRC_HEIGHT, SRC_FORMAT, &src_buf);
AHardwareBuffer_Init(DST_WIDTH, DST_HEIGHT, DST_FORMAT, &dst_buf);

/*通过枚举值FILL_BUFF/EMPTY_BUFF,执⾏填充/清空AHardwareBuffer*/
AHardwareBuffer_Fill(&src_buf, FILL_BUFF, 0);
if(MODE == MODE_BLEND)
    AHardwareBuffer_Fill(&dst_buf, FILL_BUFF, 1);
else
    AHardwareBuffer_Fill(&dst_buf, EMPTY_BUFF, 1);

/*填充rga_buffer_t结构体:src、dst*/
src = wrapbuffer_AHardwareBuffer(src_buf);
dst = wrapbuffer_AHardwareBuffer(dst_buf);

5.3.2 Просмотр справки

Следующая команда выводит справку теста.

rgaImDemo -h
rgaImDemo --help
rgaImDemo

После успешного выполнения используйте demo согласно выведенной справке:

rk3399_Android10:/ # rgaImDemo
librga:RGA_GET_VERSION:3.02,3.020000
ctx=0x7864d7c520,ctx->rgaFd=3

=============================================================================================
   usage: rgaImDemo [--help/-h] [--while/-w=(time)] [--querystring/--querystring=<options>]
                    [--copy] [--resize=<up/down>] [--crop] [--rotate=90/180/270]
                    [--flip=H/V] [--translate] [--blend] [--cvtcolor]
                    [--fill=blue/green/red]
         --help/-h     Call help
         --while/w     Set the loop mode. Users can set the number of cycles by themselves.
         --querystring You can print the version or support information corresponding to the current version
of RGA according to the options.
                       If there is no input options, all versions and support information of the current
version of RGA will be printed.
                       <options>:
                       vendor           Print vendor information.
                       version          Print RGA version, and librga/im2d_api version.
                       maxinput         Print max input resolution.
                       maxoutput        Print max output resolution.
                       scalelimit       Print scale limit.
                       inputformat      Print supported input formats.
                       outputformat     Print supported output formats.
                       expected         Print expected performance.
                       all              Print all information.
         --copy        Copy the image by RGA.The default is 720p to 720p.
         --resize      resize the image by RGA.You can choose to up(720p->1080p) or down(720p->480p).
         --crop        Crop the image by RGA.By default, a picture of 300*300 size is cropped from (100,100).
         --rotate      Rotate the image by RGA.You can choose to rotate 90/180/270 degrees.

         --flip        Flip the image by RGA.You can choice of horizontal flip or vertical flip.
         --translate   Translate the image by RGA.Default translation (300,300).
         --blend       Blend the image by RGA.Default, Porter-Duff 'SRC over DST'.
         --cvtcolor    Modify the image format and color space by RGA.The default is RGBA8888 to NV12.
         --fill        Fill the image by RGA to blue, green, red, when you set the option to the corresponding
color.
=============================================================================================

Весь разбор аргументов находится в /librga/demo/im2d_api_demo/args.cpp.

5.3.3 Циклический запуск demo

Следующая команда повторяет запуск demo. Команда цикла должна предшествовать всем аргументам. Число повторений имеет тип int; интервал по умолчанию 200ms.

rgaImDemo -w6 --copy
rgaImDemo --while=6 --copy

5.3.4 Запрос версии и возможностей RGA

Следующая команда запрашивает версию и поддерживаемые возможности:

rgaImDemo --querystring
rgaImDemo --querystring=<options>

Команда принимает options; без них используется =all. Доступные варианты:

options:
    =vendor             打印⼚商信息
    =version            打印版本信息
    =maxinput           打印⽀持的最⼤输⼊分辨率
    =maxoutput          打印⽀持的最⼤输出分辨率
    =scalelimit         打印⽀持的缩放倍数
    =inputformat        打印⽀持的输⼊格式
    =outputformat       打印⽀持的输出格式
    =expected           打印预期性能
    =all                打印所有信息
5.3.4.1 Разбор кода

Аргументы main() определяют выводимую информацию.

/*将main()传参转化为QUERYSTRING_INFO枚举值*/
IM_INFO = (QUERYSTRING_INFO)parm_data[MODE_QUERYSTRING];
/*打印querystring()返回的字符串,即所需要的信息*/
printf("\n%s\n", querystring(IM_INFO));

5.3.5 Масштабирование изображения

Следующая команда тестирует масштабирование изображения.

rgaImDemo --resize=up
rgaImDemo --resize=down

Функция требует указать вариант. Доступные варианты:

options:
    =up                 图像分辨率放⼤⾄1920x1080
    =down               图像分辨率缩⼩⾄720x480
5.3.5.1 Разбор кода

Аргумент up/down функции main() выбирает увеличение или уменьшение. Повторно инициализируйте и очистите буфер для выбранного случая, заполните rga_buffer_t и передайте итоговые дескрипторы изображений src и dst в imresize().

switch(parm_data[MODE_RESIZE])
{
    /*放⼤图像*/
    case IM_UP_SCALE :
        /*重新初始化Graphicbuffer为分辨率1920x1080对应⼤⼩*/
        dst_buf = GraphicBuffer_Init(1920, 1080, DST_FORMAT);
        /*清空buffer*/
        GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1);
        /*重新填充存储dst数据的rga_buffer_t结构体*/
        dst = wrapbuffer_GraphicBuffer(dst_buf);
        break;

    case IM_DOWN_SCALE :
        /*重新初始化Graphicbuffer为分辨率1920x1080对应⼤⼩*/
        dst_buf = GraphicBuffer_Init(720, 480, DST_FORMAT);
        /*清空buffer*/
        GraphicBuffer_Fill(dst_buf, EMPTY_BUFF, 1);
        /*重新填充存储dst数据的rga_buffer_t结构体*/
        dst = wrapbuffer_GraphicBuffer(dst_buf);
        break;
}
/*将rga_buffer_t格式的结构体src、dst传⼊imresize()*/
STATUS = imresize(src, dst);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("resizing .... %s\n", imStrError(STATUS));

5.3.6 Обрезка изображения

Следующая команда тестирует обрезку изображения.

rgaImDemo --crop

Вариантов нет. По умолчанию обрезается область LT(100,100), RT(400,100), LB(100,400), RB(400,400).

5.3.6.1 Разбор кода

Задайте размеры обрезки в im_rect, описывающем прямоугольник src, затем передайте структуры rga_buffer_t с src и dst в imcrop().

/*这⾥通过x、y确定裁剪顶点的坐标,width、height确定裁剪区域⼤⼩*/
src_rect.x      = 100;
src_rect.y      = 100;
src_rect.width  = 300;
src_rect.height = 300;

/*将im_rect格式的结构体src_rect与rga_buffer_t格式的结构体src、dst传⼊imcrop()*/
STATUS = imcrop(src, dst, src_rect);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("cropping .... %s\n", imStrError(STATUS));

5.3.7 Поворот изображения

Следующая команда тестирует поворот изображения.

rgaImDemo --rotate=90
rgaImDemo --rotate=180
rgaImDemo --rotate=270

Функция требует указать вариант. Доступные варианты:

options:
    =90                 图像旋转90° ,输出图像分辨率宽⾼交换
    =180                图像旋转180°,输出图像分辨率不变
    =270                图像旋转270°,输出图像分辨率宽⾼交换
5.3.7.1 Разбор кода

Аргумент main() 90/180/270 задаёт угол поворота. Преобразуйте его в значение перечисления IM_USAGE и передайте вместе со структурами rga_buffer_t для src и dst в imrotate().

/*将main()传参转化为IM_USAGE枚举值*/
ROTATE = (IM_USAGE)parm_data[MODE_ROTATE];

/*将标识旋转⻆度的IM_USAGE枚举值与rga_buffer_t格式的结构体src、dst⼀同传⼊imrotate()*/
STATUS = imrotate(src, dst, ROTATE);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("rotating .... %s\n", imStrError(STATUS));

5.3.8 Зеркальное отражение

Следующая команда тестирует зеркальное отражение.

rgaImDemo --flip=H
rgaImDemo --flip=V

Функция требует указать вариант. Доступные варианты:

options:
    =H                  图像⽔平镜像翻转
    =V                  图像垂直镜像翻转
5.3.8.1 Разбор кода

Аргумент main() H/V выбирает направление отражения. Преобразуйте его в IM_USAGE и передайте вместе со структурами rga_buffer_t для src и dst в imflip().

/*将main()传参转化为IM_USAGE枚举值*/
FLIP = (IM_USAGE)parm_data[MODE_FLIP];

/*将标识镜像反转⽅向的IM_USAGE枚举值与rga_buffer_t格式的结构体src、dst⼀同传⼊imflip()*/
STATUS = imflip(src, dst, FLIP);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("flipping .... %s\n", imStrError(STATUS));

5.3.9 Заливка цветом

Следующая команда тестирует заливку цветом.

rgaImDemo --fill=blue
rgaImDemo --fill=green
rgaImDemo --fill=red

Требуется вариант. Область заливки по умолчанию: LT(100,100), RT(400,100), LB(100,400), RB(400,400). Доступные варианты:

options:
    =blue               图像颜⾊填充为蓝⾊
    =green              图像颜⾊填充为绿⾊
    =red                图像颜⾊填充为红⾊
5.3.9.1 Разбор кода

Аргумент main() (bule/green/red — написание источника) выбирает цвет заливки. Задайте размеры в im_rect для dst, преобразуйте аргумент в шестнадцатеричное значение цвета и передайте его со структурой rga_buffer_t для dst в imfill().

/*将main()传参转化为对应颜⾊的16进制数*/
COLOR = parm_data[MODE_FILL];

/*这⾥通过x、y确定裁剪顶点的坐标,width、height确定填充颜⾊区域⼤⼩*/
dst_rect.x      = 100;
dst_rect.y      = 100;
dst_rect.width  = 300;
dst_rect.height = 300;

/*将im_rect格式的结构体dst_rect、对应颜⾊的16进制数与rga_buffer_t格式的结构体src、dst⼀同传⼊imfill()*/
STATUS = imfill(dst, dst_rect, COLOR);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("filling .... %s\n", imStrError(STATUS));

5.3.10 Смещение изображения

Следующая команда тестирует смещение изображения.

rgaImDemo --translate

Вариантов нет. По умолчанию верхняя левая вершина смещается в (300,300): на 300 пикселей вправо и на 300 вниз.

5.3.10.1 Разбор кода

Задайте смещения в im_rect для прямоугольника src и передайте структуры rga_buffer_t для src и dst в imtranslate().

/*这⾥通过x、y确定平移后图像的顶点的坐标*/
src_rect.x = 300;
src_rect.y = 300;

/*将im_rect格式的结构体src_rect与rga_buffer_t格式的结构体src、dst⼀同传⼊imtranslate()*/
STATUS = imtranslate(src, dst, src_rect.x, src_rect.y);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("translating .... %s\n", imStrError(STATUS));

5.3.11 Копирование изображения

Следующая команда тестирует копирование изображения.

rgaImDemo --copy

Вариантов нет. По умолчанию копируется изображение 1280x720 RGBA8888.

5.3.11.1 Разбор кода

Передайте структуры rga_buffer_t с данными src и dst в imcopy().

/*rga_buffer_t格式的结构体src、dst传⼊imcopy()*/
STATUS = imcopy(src, dst);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("copying .... %s\n", imStrError(STATUS));

5.3.12 Композиция изображения

Следующая команда тестирует композицию изображения.

rgaImDemo --blend

Вариантов нет. Источник указывает режим композиции по умолчанию IM_ALPHA_BLEND_DST.

5.3.12.1 Разбор кода

Передайте структуры rga_buffer_t с данными src и dst в imblend().

/*rga_buffer_t格式的结构体src、dst传⼊imblend()*/
STATUS = imblend(src, dst);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("blending .... %s\n", imStrError(STATUS));

5.3.13 Преобразование формата

Следующая команда тестирует преобразование формата изображения.

rgaImDemo --cvtcolor

Вариантов нет. По умолчанию изображение 1280x720 преобразуется из RGBA8888 в NV12.

5.3.13.1 Разбор кода

Задайте требуемые форматы в полях format структур rga_buffer_t и передайте структуры изображений src и dst в imcvtcolor().

/*将转换前后的格式赋值给对应的rga_buffer_t结构体的成员变量format*/
src.format = HAL_PIXEL_FORMAT_RGBA_8888;
dst.format = HAL_PIXEL_FORMAT_YCrCb_NV12;

/*将需要转换的格式与rga_buffer_t格式的结构体src、dst⼀同传⼊imcvtcolor()*/
STATUS = imcvtcolor(src, dst, src.format, dst.format);
/*根据返回的IM_STATUS枚举值打印运⾏状态*/
printf("cvtcolor .... %s\n", imStrError(STATUS));

Сопоставление источников: английский оригинал также V2.2.7

Ниже сохранены отличающиеся определения английского оригинала для прослеживаемости, а не для смешивания с предыдущим кодом. Проверьте реальные заголовки SDK, librga и драйвер. В английском оригинале отсутствуют пять структур OSD китайских §§4.2.9–4.2.13 и расширенные поля im_opt_t; выше они включены полностью.

§3.20.1 imfill: английский — buf, color по умолчанию 0x00000000, без release_fence_fd; китайский — dst, обязательный color и дополнительный release_fence_fd.

IM_STATUS imfill(rga_buffer_t buf,
                 im_rect rect,
                 int color = 0x00000000,
                 int sync = 1);

§4.2.3 im_opt_t: сокращённая английская структура не содержит китайские поля version, mosaic_mode, osd_config, intr_config, reserve.

typedef struct im_opt {
    int color;                          /* color, used by color fill */
    im_colorkey_range colorkey_range;   /* range value of color key */
    im_nn_t nn;
    int rop_code;

    int priority;
    int core;
} im_opt_t;

§4.2.6 im_handle_param_t: английский использует rga_memory_parm и width_stride/height_stride; китайский — im_handle_param и width/height. Английская таблица также описывает width_stride/height_stride. Не предполагайте одинаковый ABI.

typedef struct rga_memory_parm im_handle_param_t;

struct rga_memory_parm {
    uint32_t width_stride;
    uint32_t height_stride;
    uint32_t format;
};

§3.8.1 imcopy: в английском оригинале лишняя закрывающая скобка после sync = 1. Ниже сохранён оригинал как сомнительное место; выше использована китайская сигнатура.

IM_STATUS imcopy(const rga_buffer_t src,
                 rga_buffer_t dst,
                 int sync = 1),
                 int *release_fence_fd = NULL);

§3.15.1 imblend: английские srcA/dst соответствуют китайским fg_image/bg_image; различаются имена.

IM_STATUS imblend(const rga_buffer_t srcA,
                  rga_buffer_t dst,
                  int mode = IM_ALPHA_BLEND_SRC_OVER,
                  int sync = 1,
                  int *release_fence_fd = NULL);

§3.15.1 imcomposite: английские srcA/srcB/dst соответствуют китайским fg_image/bg_image/output_image.

IM_STATUS imcomposite(const rga_buffer_t srcA,
                      const rga_buffer_t srcB,
                      rga_buffer_t dst,
                      int mode = IM_ALPHA_BLEND_SRC_OVER,
                      int sync = 1,
                      int *release_fence_fd = NULL);

Другие статьи по теме → · Учебные маршруты →