274 lines
5.5 KiB
C
274 lines
5.5 KiB
C
// 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;
|
|
}
|