cf9c62a4f1
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)
133 lines
4.9 KiB
C
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;
|
|
}
|
|
}
|
|
}
|