274 lines · c
1// SPDX-License-Identifier: GPL-2.02/* Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net> */3 4#include "sun8i-formats.h"5#include "sun8i-rotate.h"6 7/*8 * Formats not included in array:9 * ROTATE_FORMAT_BGR56510 * ROTATE_FORMAT_VYUV11 */12 13static const struct rotate_format rotate_formats[] = {14 {15 .fourcc = V4L2_PIX_FMT_ARGB32,16 .hw_format = ROTATE_FORMAT_ARGB32,17 .planes = 1,18 .bpp = { 4, 0, 0 },19 .hsub = 1,20 .vsub = 1,21 .flags = ROTATE_FLAG_OUTPUT22 }, {23 .fourcc = V4L2_PIX_FMT_ABGR32,24 .hw_format = ROTATE_FORMAT_ABGR32,25 .planes = 1,26 .bpp = { 4, 0, 0 },27 .hsub = 1,28 .vsub = 1,29 .flags = ROTATE_FLAG_OUTPUT30 }, {31 .fourcc = V4L2_PIX_FMT_RGBA32,32 .hw_format = ROTATE_FORMAT_RGBA32,33 .planes = 1,34 .bpp = { 4, 0, 0 },35 .hsub = 1,36 .vsub = 1,37 .flags = ROTATE_FLAG_OUTPUT38 }, {39 .fourcc = V4L2_PIX_FMT_BGRA32,40 .hw_format = ROTATE_FORMAT_BGRA32,41 .planes = 1,42 .bpp = { 4, 0, 0 },43 .hsub = 1,44 .vsub = 1,45 .flags = ROTATE_FLAG_OUTPUT46 }, {47 .fourcc = V4L2_PIX_FMT_XRGB32,48 .hw_format = ROTATE_FORMAT_XRGB32,49 .planes = 1,50 .bpp = { 4, 0, 0 },51 .hsub = 1,52 .vsub = 1,53 .flags = ROTATE_FLAG_OUTPUT54 }, {55 .fourcc = V4L2_PIX_FMT_XBGR32,56 .hw_format = ROTATE_FORMAT_XBGR32,57 .planes = 1,58 .bpp = { 4, 0, 0 },59 .hsub = 1,60 .vsub = 1,61 .flags = ROTATE_FLAG_OUTPUT62 }, {63 .fourcc = V4L2_PIX_FMT_RGB32,64 .hw_format = ROTATE_FORMAT_RGBX32,65 .planes = 1,66 .bpp = { 4, 0, 0 },67 .hsub = 1,68 .vsub = 1,69 .flags = ROTATE_FLAG_OUTPUT70 }, {71 .fourcc = V4L2_PIX_FMT_BGR32,72 .hw_format = ROTATE_FORMAT_BGRX32,73 .planes = 1,74 .bpp = { 4, 0, 0 },75 .hsub = 1,76 .vsub = 1,77 .flags = ROTATE_FLAG_OUTPUT78 }, {79 .fourcc = V4L2_PIX_FMT_RGB24,80 .hw_format = ROTATE_FORMAT_RGB24,81 .planes = 1,82 .bpp = { 3, 0, 0 },83 .hsub = 1,84 .vsub = 1,85 .flags = ROTATE_FLAG_OUTPUT86 }, {87 .fourcc = V4L2_PIX_FMT_BGR24,88 .hw_format = ROTATE_FORMAT_BGR24,89 .planes = 1,90 .bpp = { 3, 0, 0 },91 .hsub = 1,92 .vsub = 1,93 .flags = ROTATE_FLAG_OUTPUT94 }, {95 .fourcc = V4L2_PIX_FMT_RGB565,96 .hw_format = ROTATE_FORMAT_RGB565,97 .planes = 1,98 .bpp = { 2, 0, 0 },99 .hsub = 1,100 .vsub = 1,101 .flags = ROTATE_FLAG_OUTPUT102 }, {103 .fourcc = V4L2_PIX_FMT_ARGB444,104 .hw_format = ROTATE_FORMAT_ARGB4444,105 .planes = 1,106 .bpp = { 2, 0, 0 },107 .hsub = 1,108 .vsub = 1,109 .flags = ROTATE_FLAG_OUTPUT110 }, {111 .fourcc = V4L2_PIX_FMT_ABGR444,112 .hw_format = ROTATE_FORMAT_ABGR4444,113 .planes = 1,114 .bpp = { 2, 0, 0 },115 .hsub = 1,116 .vsub = 1,117 .flags = ROTATE_FLAG_OUTPUT118 }, {119 .fourcc = V4L2_PIX_FMT_RGBA444,120 .hw_format = ROTATE_FORMAT_RGBA4444,121 .planes = 1,122 .bpp = { 2, 0, 0 },123 .hsub = 1,124 .vsub = 1,125 .flags = ROTATE_FLAG_OUTPUT126 }, {127 .fourcc = V4L2_PIX_FMT_BGRA444,128 .hw_format = ROTATE_FORMAT_BGRA4444,129 .planes = 1,130 .bpp = { 2, 0, 0 },131 .hsub = 1,132 .vsub = 1,133 .flags = ROTATE_FLAG_OUTPUT134 }, {135 .fourcc = V4L2_PIX_FMT_ARGB555,136 .hw_format = ROTATE_FORMAT_ARGB1555,137 .planes = 1,138 .bpp = { 2, 0, 0 },139 .hsub = 1,140 .vsub = 1,141 .flags = ROTATE_FLAG_OUTPUT142 }, {143 .fourcc = V4L2_PIX_FMT_ABGR555,144 .hw_format = ROTATE_FORMAT_ABGR1555,145 .planes = 1,146 .bpp = { 2, 0, 0 },147 .hsub = 1,148 .vsub = 1,149 .flags = ROTATE_FLAG_OUTPUT150 }, {151 .fourcc = V4L2_PIX_FMT_RGBA555,152 .hw_format = ROTATE_FORMAT_RGBA5551,153 .planes = 1,154 .bpp = { 2, 0, 0 },155 .hsub = 1,156 .vsub = 1,157 .flags = ROTATE_FLAG_OUTPUT158 }, {159 .fourcc = V4L2_PIX_FMT_BGRA555,160 .hw_format = ROTATE_FORMAT_BGRA5551,161 .planes = 1,162 .bpp = { 2, 0, 0 },163 .hsub = 1,164 .vsub = 1,165 .flags = ROTATE_FLAG_OUTPUT166 }, {167 .fourcc = V4L2_PIX_FMT_YVYU,168 .hw_format = ROTATE_FORMAT_YVYU,169 .planes = 1,170 .bpp = { 2, 0, 0 },171 .hsub = 2,172 .vsub = 1,173 .flags = ROTATE_FLAG_YUV174 }, {175 .fourcc = V4L2_PIX_FMT_UYVY,176 .hw_format = ROTATE_FORMAT_UYVY,177 .planes = 1,178 .bpp = { 2, 0, 0 },179 .hsub = 2,180 .vsub = 1,181 .flags = ROTATE_FLAG_YUV182 }, {183 .fourcc = V4L2_PIX_FMT_YUYV,184 .hw_format = ROTATE_FORMAT_YUYV,185 .planes = 1,186 .bpp = { 2, 0, 0 },187 .hsub = 2,188 .vsub = 1,189 .flags = ROTATE_FLAG_YUV190 }, {191 .fourcc = V4L2_PIX_FMT_NV61,192 .hw_format = ROTATE_FORMAT_NV61,193 .planes = 2,194 .bpp = { 1, 2, 0 },195 .hsub = 2,196 .vsub = 1,197 .flags = ROTATE_FLAG_YUV198 }, {199 .fourcc = V4L2_PIX_FMT_NV16,200 .hw_format = ROTATE_FORMAT_NV16,201 .planes = 2,202 .bpp = { 1, 2, 0 },203 .hsub = 2,204 .vsub = 1,205 .flags = ROTATE_FLAG_YUV206 }, {207 .fourcc = V4L2_PIX_FMT_YUV422P,208 .hw_format = ROTATE_FORMAT_YUV422P,209 .planes = 3,210 .bpp = { 1, 1, 1 },211 .hsub = 2,212 .vsub = 1,213 .flags = ROTATE_FLAG_YUV214 }, {215 .fourcc = V4L2_PIX_FMT_NV21,216 .hw_format = ROTATE_FORMAT_NV21,217 .planes = 2,218 .bpp = { 1, 2, 0 },219 .hsub = 2,220 .vsub = 2,221 .flags = ROTATE_FLAG_YUV222 }, {223 .fourcc = V4L2_PIX_FMT_NV12,224 .hw_format = ROTATE_FORMAT_NV12,225 .planes = 2,226 .bpp = { 1, 2, 0 },227 .hsub = 2,228 .vsub = 2,229 .flags = ROTATE_FLAG_YUV230 }, {231 .fourcc = V4L2_PIX_FMT_YUV420,232 .hw_format = ROTATE_FORMAT_YUV420P,233 .planes = 3,234 .bpp = { 1, 1, 1 },235 .hsub = 2,236 .vsub = 2,237 .flags = ROTATE_FLAG_YUV | ROTATE_FLAG_OUTPUT238 },239};240 241const struct rotate_format *rotate_find_format(u32 pixelformat)242{243 unsigned int i;244 245 for (i = 0; i < ARRAY_SIZE(rotate_formats); i++)246 if (rotate_formats[i].fourcc == pixelformat)247 return &rotate_formats[i];248 249 return NULL;250}251 252int rotate_enum_fmt(struct v4l2_fmtdesc *f, bool dst)253{254 int i, index;255 256 index = 0;257 258 for (i = 0; i < ARRAY_SIZE(rotate_formats); i++) {259 /* not all formats can be used for capture buffers */260 if (dst && !(rotate_formats[i].flags & ROTATE_FLAG_OUTPUT))261 continue;262 263 if (index == f->index) {264 f->pixelformat = rotate_formats[i].fourcc;265 266 return 0;267 }268 269 index++;270 }271 272 return -EINVAL;273}274