123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- /***************************************************************************
- * 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;
- }
- }
- }
|