| // SPDX-License-Identifier: GPL-2.0 |
| /* Copyright (C) 2020 Jernej Skrabec <jernej.skrabec@siol.net> */ |
| |
| #include "sun8i-formats.h" |
| #include "sun8i-rotate.h" |
| |
| /* |
| * Formats not included in array: |
| * ROTATE_FORMAT_BGR565 |
| * ROTATE_FORMAT_VYUV |
| */ |
| |
| static const struct rotate_format rotate_formats[] = { |
| { |
| .fourcc = V4L2_PIX_FMT_ARGB32, |
| .hw_format = ROTATE_FORMAT_ARGB32, |
| .planes = 1, |
| .bpp = { 4, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_ABGR32, |
| .hw_format = ROTATE_FORMAT_ABGR32, |
| .planes = 1, |
| .bpp = { 4, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_RGBA32, |
| .hw_format = ROTATE_FORMAT_RGBA32, |
| .planes = 1, |
| .bpp = { 4, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_BGRA32, |
| .hw_format = ROTATE_FORMAT_BGRA32, |
| .planes = 1, |
| .bpp = { 4, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_XRGB32, |
| .hw_format = ROTATE_FORMAT_XRGB32, |
| .planes = 1, |
| .bpp = { 4, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_XBGR32, |
| .hw_format = ROTATE_FORMAT_XBGR32, |
| .planes = 1, |
| .bpp = { 4, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_RGB32, |
| .hw_format = ROTATE_FORMAT_RGBX32, |
| .planes = 1, |
| .bpp = { 4, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_BGR32, |
| .hw_format = ROTATE_FORMAT_BGRX32, |
| .planes = 1, |
| .bpp = { 4, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_RGB24, |
| .hw_format = ROTATE_FORMAT_RGB24, |
| .planes = 1, |
| .bpp = { 3, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_BGR24, |
| .hw_format = ROTATE_FORMAT_BGR24, |
| .planes = 1, |
| .bpp = { 3, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_RGB565, |
| .hw_format = ROTATE_FORMAT_RGB565, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_ARGB444, |
| .hw_format = ROTATE_FORMAT_ARGB4444, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_ABGR444, |
| .hw_format = ROTATE_FORMAT_ABGR4444, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_RGBA444, |
| .hw_format = ROTATE_FORMAT_RGBA4444, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_BGRA444, |
| .hw_format = ROTATE_FORMAT_BGRA4444, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_ARGB555, |
| .hw_format = ROTATE_FORMAT_ARGB1555, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_ABGR555, |
| .hw_format = ROTATE_FORMAT_ABGR1555, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_RGBA555, |
| .hw_format = ROTATE_FORMAT_RGBA5551, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_BGRA555, |
| .hw_format = ROTATE_FORMAT_BGRA5551, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 1, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_OUTPUT |
| }, { |
| .fourcc = V4L2_PIX_FMT_YVYU, |
| .hw_format = ROTATE_FORMAT_YVYU, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 2, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_YUV |
| }, { |
| .fourcc = V4L2_PIX_FMT_UYVY, |
| .hw_format = ROTATE_FORMAT_UYVY, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 2, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_YUV |
| }, { |
| .fourcc = V4L2_PIX_FMT_YUYV, |
| .hw_format = ROTATE_FORMAT_YUYV, |
| .planes = 1, |
| .bpp = { 2, 0, 0 }, |
| .hsub = 2, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_YUV |
| }, { |
| .fourcc = V4L2_PIX_FMT_NV61, |
| .hw_format = ROTATE_FORMAT_NV61, |
| .planes = 2, |
| .bpp = { 1, 2, 0 }, |
| .hsub = 2, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_YUV |
| }, { |
| .fourcc = V4L2_PIX_FMT_NV16, |
| .hw_format = ROTATE_FORMAT_NV16, |
| .planes = 2, |
| .bpp = { 1, 2, 0 }, |
| .hsub = 2, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_YUV |
| }, { |
| .fourcc = V4L2_PIX_FMT_YUV422P, |
| .hw_format = ROTATE_FORMAT_YUV422P, |
| .planes = 3, |
| .bpp = { 1, 1, 1 }, |
| .hsub = 2, |
| .vsub = 1, |
| .flags = ROTATE_FLAG_YUV |
| }, { |
| .fourcc = V4L2_PIX_FMT_NV21, |
| .hw_format = ROTATE_FORMAT_NV21, |
| .planes = 2, |
| .bpp = { 1, 2, 0 }, |
| .hsub = 2, |
| .vsub = 2, |
| .flags = ROTATE_FLAG_YUV |
| }, { |
| .fourcc = V4L2_PIX_FMT_NV12, |
| .hw_format = ROTATE_FORMAT_NV12, |
| .planes = 2, |
| .bpp = { 1, 2, 0 }, |
| .hsub = 2, |
| .vsub = 2, |
| .flags = ROTATE_FLAG_YUV |
| }, { |
| .fourcc = V4L2_PIX_FMT_YUV420, |
| .hw_format = ROTATE_FORMAT_YUV420P, |
| .planes = 3, |
| .bpp = { 1, 1, 1 }, |
| .hsub = 2, |
| .vsub = 2, |
| .flags = ROTATE_FLAG_YUV | ROTATE_FLAG_OUTPUT |
| }, |
| }; |
| |
| const struct rotate_format *rotate_find_format(u32 pixelformat) |
| { |
| unsigned int i; |
| |
| for (i = 0; i < ARRAY_SIZE(rotate_formats); i++) |
| if (rotate_formats[i].fourcc == pixelformat) |
| return &rotate_formats[i]; |
| |
| return NULL; |
| } |
| |
| int rotate_enum_fmt(struct v4l2_fmtdesc *f, bool dst) |
| { |
| int i, index; |
| |
| index = 0; |
| |
| for (i = 0; i < ARRAY_SIZE(rotate_formats); i++) { |
| /* not all formats can be used for capture buffers */ |
| if (dst && !(rotate_formats[i].flags & ROTATE_FLAG_OUTPUT)) |
| continue; |
| |
| if (index == f->index) { |
| f->pixelformat = rotate_formats[i].fourcc; |
| |
| return 0; |
| } |
| |
| index++; |
| } |
| |
| return -EINVAL; |
| } |