Files
fml13v01-buildroot/package/starfive/v4l2_test/yuv.c
T
mason.huo cf9c62a4f1 package: Move v4l2test to starfive package
1.Create starfive package, and move v4l2test into it.
2.Sync the latest v4l2test package from JH7100.

Signed-off-by: mason.huo <mason.huo@starfivetech.com>

(cherry-pick commit 87583e4004ba7ceefa317d939ea8004f38eb9570 from jh7110-mm-devel branch)
2022-06-10 10:49:06 +08:00

133 lines
4.9 KiB
C

/***************************************************************************
* Copyright (C) 2012 by Tobias Müller *
* Tobias_Mueller@twam.info *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
/**
Convert from YUV420 format to YUV444.
\param width width of image
\param height height of image
\param src source
\param dst destination
*/
void YUV420toYUV444(int width, int height, unsigned char* src, unsigned char* dst) {
int line, column;
unsigned char *py, *pu, *pv;
unsigned char *tmp = dst;
// In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr.
// Each Y goes to one of the pixels, and the Cb and Cr belong to both pixels.
unsigned char *base_py = src;
unsigned char *base_pu = src+(height*width);
unsigned char *base_pv = src+(height*width)+(height*width)/4;
for (line = 0; line < height; ++line) {
for (column = 0; column < width; ++column) {
py = base_py+(line*width)+column;
pu = base_pu+(line/2*width/2)+column/2;
pv = base_pv+(line/2*width/2)+column/2;
*tmp++ = *py;
*tmp++ = *pu;
*tmp++ = *pv;
}
}
}
void YUV420NV21toYUV444(int width, int height, unsigned char* src, unsigned char* dst,
int is_nv21)
{
int line, column;
unsigned char *py, *pu, *pv;
unsigned char *tmp = dst;
// In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr.
// Each Y goes to one of the pixels, and the Cb and Cr belong to both pixels.
unsigned char *base_py = src;
unsigned char *base_pu = src+(height*width);
unsigned char *base_pv = src+(height*width);
for (line = 0; line < height; ++line) {
for (column = 0; column < width; ++column) {
py = base_py + (line * width) + column;
if (is_nv21) {
pu = base_pu + ((line / 2 * width / 2) + column / 2) * 2 + 1;
pv = base_pv + ((line / 2 * width / 2) + column / 2) * 2;
} else {
pu = base_pu + ((line / 2 * width / 2) + column / 2) * 2;
pv = base_pv + ((line / 2 * width / 2) + column / 2) * 2 + 1;
}
*tmp++ = *py;
*tmp++ = *pu;
*tmp++ = *pv;
}
}
}
void YUV422toYUV444(int width, int height, unsigned char* src, unsigned char* dst) {
int line, column;
unsigned char *py, *pu, *pv;
unsigned char *tmp = dst;
// In this format each four bytes is two pixels. Each four bytes is two Y's, a Cb and a Cr.
// Each Y goes to one of the pixels, and the Cb and Cr belong to both pixels.
unsigned char *base_py = src;
//unsigned char *base_pu = src+(height*width);
//unsigned char *base_pv = src+(height*width)+(height*width)/2;
for (line = 0; line < height; ++line) {
for (column = 0; column < width; ++column) {
py = base_py+((line*width)+column)*2;
pu = base_py+((line*width)+column)*2 + 1;
pv = base_py+((line*width)+column)*2 + 1;
*tmp++ = *py;
*tmp++ = *pu;
*tmp++ = *pv;
}
}
}
void RGB565toRGB888(int width, int height, unsigned char* src, unsigned char* dst)
{
unsigned short *pix = (unsigned short *)src;
unsigned int i;
for (i = 0 ; i < width * height; i++)
{
*dst++ = (*(pix+i) & 0b1111100000000000) >> 8;
*dst++ = (*(pix+i) & 0b11111100000) >> 3 ;
*dst++ = (*(pix+i) & 0b11111) << 3;
}
}
void RAW12toRAW16(int width, int height, unsigned char* src, unsigned char* dst)
{
unsigned char *p_src = src;
unsigned short *p_dst = (unsigned short *)dst;
unsigned int i, j;
for (i = 0 ; i < height; i++) {
p_src = src + (((width * 12 / 8 + 8 * 16 - 1) / (8 * 16)) * 128) * i;
for (j = 0 ; j < width * 12 / 8; j += 3) {
*p_dst++ = ((*(p_src + j)) | ((*(p_src + j + 1) & 0xF) << 8)) << 4;
*p_dst++ = ((*(p_src + j + 2) << 4) | ((*(p_src + j + 1)) >> 4)) << 4;
}
}
}