-rw-r--r-- | Android.mk | 9 | ||||
-rw-r--r--[-rwxr-xr-x] | CameraHal.cpp | 4 | ||||
-rw-r--r--[-rwxr-xr-x] | CameraHal_Module.cpp | 3 | ||||
-rw-r--r--[-rwxr-xr-x] | V4LCameraAdapter/V4LCameraAdapter.cpp | 142 | ||||
-rwxr-xr-x | inc/mjpeg/colorspaces.h | 288 | ||||
-rw-r--r-- | inc/mjpeg/defs.h | 57 | ||||
-rwxr-xr-x | inc/mjpeg/huffman.h | 99 | ||||
-rwxr-xr-x | inc/mjpeg/jutils.h | 149 | ||||
-rwxr-xr-x | mjpeg/colorspaces.c | 2016 | ||||
-rwxr-xr-x | mjpeg/jpegdec.c | 1040 |
10 files changed, 128 insertions, 3679 deletions
diff --git a/mjpeg/colorspaces.c b/mjpeg/colorspaces.c deleted file mode 100755 index 723505c..0000000 --- a/mjpeg/colorspaces.c +++ b/dev/null @@ -1,2016 +0,0 @@ -/*******************************************************************************# -# guvcview http://guvcview.sourceforge.net # -# # -# Paulo Assis <pj.assis@gmail.com> # -# Nobuhiro Iwamatsu <iwamatsu@nigauri.org> # -# # -# 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 # -# # -********************************************************************************/ - -#include <stdlib.h> -#include <stdio.h> -#include <string.h> -#include "colorspaces.h" -#include <stdbool.h> -#define TRUE 1 -#define FALSE 0 -/*------------------------------- Color space conversions --------------------*/ -/* regular yuv (YUYV) to rgb24*/ -void -yuyv2rgb (BYTE *pyuv, BYTE *prgb, int width, int height) -{ - int l=0; - int SizeYUV=height * width * 2; /* 2 bytes per pixel*/ - for(l=0;l<SizeYUV;l=l+4) - { /*iterate every 4 bytes*/ - /* standart: r = y0 + 1.402 (v-128) */ - /* logitech: r = y0 + 1.370705 (v-128) */ - *prgb++=CLIP(pyuv[l] + 1.402 * (pyuv[l+3]-128)); - /* standart: g = y0 - 0.34414 (u-128) - 0.71414 (v-128)*/ - /* logitech: g = y0 - 0.337633 (u-128)- 0.698001 (v-128)*/ - *prgb++=CLIP(pyuv[l] - 0.34414 * (pyuv[l+1]-128) -0.71414*(pyuv[l+3]-128)); - /* standart: b = y0 + 1.772 (u-128) */ - /* logitech: b = y0 + 1.732446 (u-128) */ - *prgb++=CLIP(pyuv[l] + 1.772 *( pyuv[l+1]-128)); - /* standart: r1 =y1 + 1.402 (v-128) */ - /* logitech: r1 = y1 + 1.370705 (v-128) */ - *prgb++=CLIP(pyuv[l+2] + 1.402 * (pyuv[l+3]-128)); - /* standart: g1 = y1 - 0.34414 (u-128) - 0.71414 (v-128)*/ - /* logitech: g1 = y1 - 0.337633 (u-128)- 0.698001 (v-128)*/ - *prgb++=CLIP(pyuv[l+2] - 0.34414 * (pyuv[l+1]-128) -0.71414 * (pyuv[l+3]-128)); - /* standart: b1 = y1 + 1.772 (u-128) */ - /* logitech: b1 = y1 + 1.732446 (u-128) */ - *prgb++=CLIP(pyuv[l+2] + 1.772*(pyuv[l+1]-128)); - } -} - -/* used for rgb video (fourcc="RGB ") */ -/* lines are on correct order */ -void -yuyv2bgr1 (BYTE *pyuv, BYTE *pbgr, int width, int height) -{ - - int l=0; - int SizeYUV=height * width * 2; /* 2 bytes per pixel*/ - for(l=0;l<SizeYUV;l=l+4) - { /*iterate every 4 bytes*/ - /* standart: b = y0 + 1.772 (u-128) */ - /* logitech: b = y0 + 1.732446 (u-128) */ - *pbgr++=CLIP(pyuv[l] + 1.772 *( pyuv[l+1]-128)); - /* standart: g = y0 - 0.34414 (u-128) - 0.71414 (v-128)*/ - /* logitech: g = y0 - 0.337633 (u-128)- 0.698001 (v-128)*/ - *pbgr++=CLIP(pyuv[l] - 0.34414 * (pyuv[l+1]-128) -0.71414*(pyuv[l+3]-128)); - /* standart: r = y0 + 1.402 (v-128) */ - /* logitech: r = y0 + 1.370705 (v-128) */ - *pbgr++=CLIP(pyuv[l] + 1.402 * (pyuv[l+3]-128)); - /* standart: b1 = y1 + 1.772 (u-128) */ - /* logitech: b1 = y1 + 1.732446 (u-128) */ - *pbgr++=CLIP(pyuv[l+2] + 1.772*(pyuv[l+1]-128)); - /* standart: g1 = y1 - 0.34414 (u-128) - 0.71414 (v-128)*/ - /* logitech: g1 = y1 - 0.337633 (u-128)- 0.698001 (v-128)*/ - *pbgr++=CLIP(pyuv[l+2] - 0.34414 * (pyuv[l+1]-128) -0.71414 * (pyuv[l+3]-128)); - /* standart: r1 =y1 + 1.402 (v-128) */ - /* logitech: r1 = y1 + 1.370705 (v-128) */ - *pbgr++=CLIP(pyuv[l+2] + 1.402 * (pyuv[l+3]-128)); - } -} - -/* yuv (YUYV) to bgr with lines upsidedown */ -/* used for bitmap files (DIB24) */ -void -yuyv2bgr (BYTE *pyuv, BYTE *pbgr, int width, int height) -{ - - int l=0; - int k=0; - BYTE *preverse; - int bytesUsed; - int SizeBGR=height * width * 3; /* 3 bytes per pixel*/ - /* BMP byte order is bgr and the lines start from last to first*/ - preverse=pbgr+SizeBGR;/*start at the end and decrement*/ - for(l=0;l<height;l++) - { /*iterate every 1 line*/ - preverse-=width*3;/*put pointer at begin of unprocessed line*/ - bytesUsed=l*width*2; - for (k=0;k<(width*2);k=k+4)/*iterate every 4 bytes in the line*/ - { - /* standart: b = y0 + 1.772 (u-128) */ - /* logitech: b = y0 + 1.732446 (u-128) */ - *preverse++=CLIP(pyuv[k+bytesUsed] + 1.772 *( pyuv[k+1+bytesUsed]-128)); - /* standart: g = y0 - 0.34414 (u-128) - 0.71414 (v-128)*/ - /* logitech: g = y0 - 0.337633 (u-128)- 0.698001 (v-128)*/ - *preverse++=CLIP(pyuv[k+bytesUsed] - 0.34414 * (pyuv[k+1+bytesUsed]-128) - -0.71414*(pyuv[k+3+bytesUsed]-128)); - /* standart: r = y0 + 1.402 (v-128) */ - /* logitech: r = y0 + 1.370705 (v-128) */ - *preverse++=CLIP(pyuv[k+bytesUsed] + 1.402 * (pyuv[k+3+bytesUsed]-128)); - /* standart: b1 = y1 + 1.772 (u-128) */ - /* logitech: b1 = y1 + 1.732446 (u-128) */ - *preverse++=CLIP(pyuv[k+2+bytesUsed] + 1.772*(pyuv[k+1+bytesUsed]-128)); - /* standart: g1 = y1 - 0.34414 (u-128) - 0.71414 (v-128)*/ - /* logitech: g1 = y1 - 0.337633 (u-128)- 0.698001 (v-128)*/ - *preverse++=CLIP(pyuv[k+2+bytesUsed] - 0.34414 * (pyuv[k+1+bytesUsed]-128) - -0.71414 * (pyuv[k+3+bytesUsed]-128)); - /* standart: r1 =y1 + 1.402 (v-128) */ - /* logitech: r1 = y1 + 1.370705 (v-128) */ - *preverse++=CLIP(pyuv[k+2+bytesUsed] + 1.402 * (pyuv[k+3+bytesUsed]-128)); - } - preverse-=width*3;/*get it back at the begin of processed line*/ - } - preverse=NULL; -} - -/* Unpack buffer of (vw bit) data into padded 16bit buffer. */ -static inline void convert_packed_to_16bit(uint8_t *raw, uint16_t *unpacked, int vw, int unpacked_len) -{ - int mask = (1 << vw) - 1; - uint32_t buffer = 0; - int bitsIn = 0; - while (unpacked_len--) { - while (bitsIn < vw) { - buffer = (buffer << 8) | *(raw++); - bitsIn += 8; - } - bitsIn -= vw; - *(unpacked++) = (buffer >> bitsIn) & mask; - } -} - -/*convert y10b (bit-packed array greyscale format) to yuyv (packed) -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing y10b (bit-packed array) data frame -* width: picture width -* height: picture height -*/ -void y10b_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - UINT16 *unpacked_buffer = NULL; - UINT16 *ptmp; - int h = 0; - int w = 0; - - unpacked_buffer = malloc(width * height * sizeof(UINT16)); - convert_packed_to_16bit(tmpbuffer, unpacked_buffer, 10, width * height); - - ptmp = unpacked_buffer; - - for (h = 0; h < height; h++) - { - for (w = 0; w < width; w += 2) - { - /* Y0 */ - *framebuffer++ = (BYTE) ((ptmp[0] & 0x3FF) >> 2); - /* U */ - *framebuffer++ = 0x80; - /* Y1 */ - *framebuffer++ = (BYTE) ((ptmp[1] & 0x3FF) >> 2); - /* V */ - *framebuffer++ = 0x80; - - ptmp += 2; - } - } - - free(unpacked_buffer); -} - -/*convert y16 (grey) to yuyv (packed) -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing y16 (grey) data frame -* width: picture width -* height: picture height -*/ -void y16_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - UINT16 *ptmp= (UINT16 *) tmpbuffer; - - int h=0; - int w=0; - - for(h=0;h<height;h++) - { - for(w=0;w<width;w+=2) - { - /* Y0 */ - *framebuffer++ = (BYTE) ((ptmp[0] & 0xFF00) >> 8); - /* U */ - *framebuffer++ = 0x80; - /* Y1 */ - *framebuffer++ = (BYTE) ((ptmp[1] & 0xFF00) >> 8); - /* V */ - *framebuffer++ = 0x80; - - ptmp += 2; - } - } -} - -/*convert yyuv (packed) to yuyv (packed) -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing yyuv packed data frame -* width: picture width -* height: picture height -*/ -void yyuv_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *ptmp=NULL; - BYTE *pfmb=NULL; - ptmp = tmpbuffer; - pfmb = framebuffer; - - int h=0; - int w=0; - - for(h=0;h<height;h++) - { - for(w=0;w<(width*2);w+=4) - { - /* Y0 */ - pfmb[0] = ptmp[0]; - /* U */ - pfmb[1] = ptmp[2]; - /* Y1 */ - pfmb[2] = ptmp[1]; - /* V */ - pfmb[3] = ptmp[3]; - - ptmp += 4; - pfmb += 4; - } - } -} - - -/*convert uyvy (packed) to yuyv (packed) -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing uyvy packed data frame -* width: picture width -* height: picture height -*/ -void uyvy_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *ptmp = tmpbuffer; - BYTE *pfmb = framebuffer; - int h=0; - int w=0; - - for(h=0;h<height;h++) - { - for(w=0;w<(width*2);w+=4) - { - /* Y0 */ - pfmb[0] = ptmp[1]; - /* U */ - pfmb[1] = ptmp[0]; - /* Y1 */ - pfmb[2] = ptmp[3]; - /* V */ - pfmb[3] = ptmp[2]; - - ptmp += 4; - pfmb += 4; - } - } -} - - -/*convert yvyu (packed) to yuyv (packed) -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing yvyu packed data frame -* width: picture width -* height: picture height -*/ -void yvyu_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *ptmp=NULL; - BYTE *pfmb=NULL; - ptmp = tmpbuffer; - pfmb = framebuffer; - - int h=0; - int w=0; - - for(h=0;h<height;h++) - { - for(w=0;w<(width*2);w+=4) - { - /* Y0 */ - pfmb[0] = ptmp[0]; - /* U */ - pfmb[1] = ptmp[3]; - /* Y1 */ - pfmb[2] = ptmp[2]; - /* V */ - pfmb[3] = ptmp[1]; - - ptmp += 4; - pfmb += 4; - } - } -} - -/*convert yuv 420 planar (yu12) to yuv 422 -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing yuv420 planar data frame -* width: picture width -* height: picture height -*/ -void yuv420_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *py; - BYTE *pu; - BYTE *pv; - - int linesize = width * 2; - int uvlinesize = width / 2; - int offset=0; - int offset1=0; - int offsety=0; - int offsety1=0; - int offsetuv=0; - - py=tmpbuffer; - pu=py+(width*height); - pv=pu+(width*height/4); - - int h=0; - int w=0; - - int wy=0; - int huv=0; - int wuv=0; - - for(h=0;h<height;h+=2) - { - wy=0; - wuv=0; - offset = h * linesize; - offset1 = (h + 1) * linesize; - offsety = h * width; - offsety1 = (h + 1) * width; - offsetuv = huv * uvlinesize; - - for(w=0;w<linesize;w+=4) - { - /*y00*/ - framebuffer[w + offset] = py[wy + offsety]; - /*u0*/ - framebuffer[(w + 1) + offset] = pu[wuv + offsetuv]; - /*y01*/ - framebuffer[(w + 2) + offset] = py[(wy + 1) + offsety]; - /*v0*/ - framebuffer[(w + 3) + offset] = pv[wuv + offsetuv]; - - /*y10*/ - framebuffer[w + offset1] = py[wy + offsety1]; - /*u0*/ - framebuffer[(w + 1) + offset1] = pu[wuv + offsetuv]; - /*y11*/ - framebuffer[(w + 2) + offset1] = py[(wy + 1) + offsety1]; - /*v0*/ - framebuffer[(w + 3) + offset1] = pv[wuv + offsetuv]; - - wuv++; - wy+=2; - } - huv++; - } -} - -/*convert yvu 420 planar (yv12) to yuv 422 -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing yuv420 planar data frame -* width: picture width -* height: picture height -*/ -void yvu420_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *py; - BYTE *pv; - BYTE *pu; - - int linesize = width * 2; - int uvlinesize = width / 2; - int offset=0; - int offset1=0; - int offsety=0; - int offsety1=0; - int offsetuv=0; - - py=tmpbuffer; - pv=py+(width*height); - pu=pv+((width*height)/4); - - int h=0; - int w=0; - - int wy=0; - int huv=0; - int wuv=0; - - for(h=0;h<height;h+=2) - { - wy=0; - wuv=0; - offset = h * linesize; - offset1 = (h + 1) * linesize; - offsety = h * width; - offsety1 = (h + 1) * width; - offsetuv = huv * uvlinesize; - - for(w=0;w<linesize;w+=4) - { - /*y00*/ - framebuffer[w + offset] = py[wy + offsety]; - /*u0*/ - framebuffer[(w + 1) + offset] = pu[wuv + offsetuv]; - /*y01*/ - framebuffer[(w + 2) + offset] = py[(wy + 1) + offsety]; - /*v0*/ - framebuffer[(w + 3) + offset] = pv[wuv + offsetuv]; - - /*y10*/ - framebuffer[w + offset1] = py[wy + offsety1]; - /*u0*/ - framebuffer[(w + 1) + offset1] = pu[wuv + offsetuv]; - /*y11*/ - framebuffer[(w + 2) + offset1] = py[(wy + 1) + offsety1]; - /*v0*/ - framebuffer[(w + 3) + offset1] = pv[wuv + offsetuv]; - - wuv++; - wy+=2; - } - huv++; - } -} - -/*convert yuv 420 planar (uv interleaved) (nv12) to yuv 422 -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing yuv420 (nv12) planar data frame -* width: picture width -* height: picture height -*/ -void nv12_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *py; - BYTE *puv; - - int linesize = width * 2; - int offset=0; - int offset1=0; - int offsety=0; - int offsety1=0; - int offsetuv=0; - - py=tmpbuffer; - puv=py+(width*height); - - int h=0; - int w=0; - - int wy=0; - int huv=0; - int wuv=0; - - for(h=0;h<height;h+=2) - { - wy=0; - wuv=0; - offset = h * linesize; - offset1 = (h+1) * linesize; - offsety = h * width; - offsety1 = (h+1) * width; - offsetuv = huv * width; - for(w=0;w<linesize;w+=4) - { - /*y00*/ - framebuffer[w + offset] = py[wy + offsety]; - /*u0*/ - framebuffer[(w + 1) + offset] = puv[wuv + offsetuv]; - /*y01*/ - framebuffer[(w + 2) + offset] = py[(wy + 1) + offsety]; - /*v0*/ - framebuffer[(w + 3) + offset] = puv[(wuv + 1) + offsetuv]; - - /*y10*/ - framebuffer[w + offset1] = py[wy + offsety1]; - /*u0*/ - framebuffer[(w + 1) + offset1] = puv[wuv + offsetuv]; - /*y11*/ - framebuffer[(w + 2) + offset1] = py[(wy + 1) + offsety1]; - /*v0*/ - framebuffer[(w + 3) + offset1] = puv[(wuv + 1) + offsetuv]; - - wuv+=2; - wy+=2; - } - huv++; - } -} - -/*convert yuv 420 planar (vu interleaved) (nv21) to yuv 422 -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing yuv420 (nv21) planar data frame -* width: picture width -* height: picture height -*/ -void nv21_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *py; - BYTE *puv; - - int linesize = width * 2; - int offset=0; - int offset1=0; - int offsety=0; - int offsety1=0; - int offsetuv=0; - - py=tmpbuffer; - puv=py+(width*height); - - int h=0; - int w=0; - - int wy=0; - int huv=0; - int wuv=0; - - for(h=0;h<height;h+=2) - { - wy=0; - wuv=0; - offset = h * linesize; - offset1 = (h+1) * linesize; - offsety = h * width; - offsety1 = (h+1) * width; - offsetuv = huv * width; - for(w=0;w<linesize;w+=4) - { - /*y00*/ - framebuffer[w + offset] = py[wy + offsety]; - /*u0*/ - framebuffer[(w + 1) + offset] = puv[(wuv + 1) + offsetuv]; - /*y01*/ - framebuffer[(w + 2) + offset] = py[(wy + 1) + offsety]; - /*v0*/ - framebuffer[(w + 3) + offset] = puv[wuv + offsetuv]; - - /*y10*/ - framebuffer[w + offset1] = py[wy + offsety1]; - /*u0*/ - framebuffer[(w + 1) + offset1] = puv[(wuv + 1) + offsetuv]; - /*y11*/ - framebuffer[(w + 2) + offset1] = py[(wy + 1) + offsety1]; - /*v0*/ - framebuffer[(w + 3) + offset1] = puv[wuv + offsetuv]; - - wuv+=2; - wy+=2; - } - huv++; - } -} - -/*convert yuv 422 planar (uv interleaved) (nv16) to yuv 422 -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing yuv422 (nv16) planar data frame -* width: picture width -* height: picture height -*/ -void nv16_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *py; - BYTE *puv; - - int linesize = width * 2; - int offset=0; - int offsety=0; - int offsetuv=0; - - py=tmpbuffer; - puv=py+(width*height); - - int h=0; - int w=0; - - int wy=0; - int huv=0; - int wuv=0; - - for(h=0;h<height;h++) - { - wy=0; - wuv=0; - offset = h * linesize; - offsety = h * width; - offsetuv = huv * width; - for(w=0;w<linesize;w+=4) - { - /*y00*/ - framebuffer[w + offset] = py[wy + offsety]; - /*u0*/ - framebuffer[(w + 1) + offset] = puv[wuv + offsetuv]; - /*y01*/ - framebuffer[(w + 2) + offset] = py[(wy + 1) + offsety]; - /*v0*/ - framebuffer[(w + 3) + offset] = puv[(wuv + 1) + offsetuv]; - - wuv+=2; - wy+=2; - } - huv++; - } -} - -/*convert yuv 422 planar (vu interleaved) (nv61) to yuv 422 -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing yuv422 (nv61) planar data frame -* width: picture width -* height: picture height -*/ -void nv61_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *py; - BYTE *puv; - - int linesize = width * 2; - int offset=0; - int offsety=0; - int offsetuv=0; - - py=tmpbuffer; - puv=py+(width*height); - - int h=0; - int w=0; - - int wy=0; - int huv=0; - int wuv=0; - - for(h=0;h<height;h++) - { - wy=0; - wuv=0; - offset = h * linesize; - offsety = h * width; - offsetuv = huv * width; - for(w=0;w<linesize;w+=4) - { - /*y00*/ - framebuffer[w + offset] = py[wy + offsety]; - /*u0*/ - framebuffer[(w + 1) + offset] = puv[(wuv + 1) + offsetuv]; - /*y01*/ - framebuffer[(w + 2) + offset] = py[(wy + 1) + offsety]; - /*v0*/ - framebuffer[(w + 3) + offset] = puv[wuv + offsetuv]; - - wuv+=2; - wy+=2; - } - huv++; - } -} - -/*convert yuv 411 packed (y41p) to yuv 422 -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing y41p data frame -* width: picture width -* height: picture height -*/ -void y41p_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - int h=0; - int w=0; - int linesize = width * 3 /2; - int offset = 0; - - for(h=0;h<height;h++) - { - offset = linesize * h; - for(w=0;w<linesize;w+=12) - { - *framebuffer++=tmpbuffer[w+1 + offset]; //Y0 - *framebuffer++=tmpbuffer[w + offset]; //U0 - *framebuffer++=tmpbuffer[w+3 + offset]; //Y1 - *framebuffer++=tmpbuffer[w+2 + offset]; //V0 - *framebuffer++=tmpbuffer[w+5 + offset]; //Y2 - *framebuffer++=tmpbuffer[w + offset]; //U0 - *framebuffer++=tmpbuffer[w+7 + offset]; //Y3 - *framebuffer++=tmpbuffer[w+2 + offset]; //V0 - *framebuffer++=tmpbuffer[w+8 + offset]; //Y4 - *framebuffer++=tmpbuffer[w+4 + offset]; //U4 - *framebuffer++=tmpbuffer[w+9 + offset]; //Y5 - *framebuffer++=tmpbuffer[w+6 + offset]; //V4 - *framebuffer++=tmpbuffer[w+10+ offset]; //Y6 - *framebuffer++=tmpbuffer[w+4 + offset]; //U4 - *framebuffer++=tmpbuffer[w+11+ offset]; //Y7 - *framebuffer++=tmpbuffer[w+6 + offset]; //V4 - } - } -} - -/*convert yuv mono (grey) to yuv 422 -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing grey (y only) data frame -* width: picture width -* height: picture height -*/ -void grey_to_yuyv (BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - int h=0; - int w=0; - int offset = 0; - - for(h=0;h<height;h++) - { - offset = width * h; - for(w=0;w<width;w++) - { - *framebuffer++=tmpbuffer[w + offset]; //Y - *framebuffer++=0x80; //U or V - } - } -} - -/*convert SPCA501 (s501) to yuv 422 -* s501 |Y0..width..Y0|U..width/2..U|Y1..width..Y1|V..width/2..V| -* signed values (-128;+127) must be converted to unsigned (0; 255) -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing s501 data frame -* width: picture width -* height: picture height -*/ -void s501_to_yuyv(BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *U, *V, *Y0, *Y1; - BYTE *line2; - int h, w; - - Y0 = tmpbuffer; /*fisrt line*/ - for (h = 0; h < height/2; h++ ) - { - line2 = framebuffer + width * 2; /* next line */ - U = Y0 + width; - Y1 = U + width / 2; - V = Y1 + width; - for (w = width / 2; --w >= 0; ) - { - *framebuffer++ = 0x80 + *Y0++; - *framebuffer++ = 0x80 + *U; - *framebuffer++ = 0x80 + *Y0++; - *framebuffer++ = 0x80 + *V; - - *line2++ = 0x80 + *Y1++; - *line2++ = 0x80 + *U++; - *line2++ = 0x80 + *Y1++; - *line2++ = 0x80 + *V++; - } - Y0 += width * 2; /* next block of lines */ - framebuffer = line2; - } -} - -/*convert SPCA505 (s505) to yuv 422 -* s505 |Y0..width..Y0|Y1..width..Y1|U..width/2..U|V..width/2..V| -* signed values (-128;+127) must be converted to unsigned (0; 255) -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing s501 data frame -* width: picture width -* height: picture height -*/ -void s505_to_yuyv(BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *U, *V, *Y0, *Y1; - BYTE *line2; - int h, w; - - Y0 = tmpbuffer; /*fisrt line*/ - for (h = 0; h < height/2; h++ ) - { - line2 = framebuffer + width * 2; /* next line */ - Y1 = Y0 + width; - U = Y1 + width; - V = U + width/2; - for (w = width / 2; --w >= 0; ) - { - *framebuffer++ = 0x80 + *Y0++; - *framebuffer++ = 0x80 + *U; - *framebuffer++ = 0x80 + *Y0++; - *framebuffer++ = 0x80 + *V; - - *line2++ = 0x80 + *Y1++; - *line2++ = 0x80 + *U++; - *line2++ = 0x80 + *Y1++; - *line2++ = 0x80 + *V++; - } - Y0 += width * 2; /* next block of lines */ - framebuffer = line2; - } -} - -/*convert SPCA508 (s508) to yuv 422 -* s508 |Y0..width..Y0|U..width/2..U|V..width/2..V|Y1..width..Y1| -* signed values (-128;+127) must be converted to unsigned (0; 255) -* args: -* framebuffer: pointer to frame buffer (yuyv) -* tmpbuffer: pointer to temp buffer containing s501 data frame -* width: picture width -* height: picture height -*/ -void s508_to_yuyv(BYTE *framebuffer, BYTE *tmpbuffer, int width, int height) -{ - BYTE *U, *V, *Y0, *Y1; - BYTE *line2; - int h, w; - - Y0 = tmpbuffer; /*fisrt line*/ - for (h = 0; h < height/2; h++ ) - { - line2 = framebuffer + width * 2; /* next line */ - U = Y0 + width; - V = U + width/2; - Y1= V + width/2; - for (w = width / 2; --w >= 0; ) - { - *framebuffer++ = 0x80 + *Y0++; - *framebuffer++ = 0x80 + *U; - *framebuffer++ = 0x80 + *Y0++; - *framebuffer++ = 0x80 + *V; - - *line2++ = 0x80 + *Y1++; - *line2++ = 0x80 + *U++; - *line2++ = 0x80 + *Y1++; - *line2++ = 0x80 + *V++; - } - Y0 += width * 2; /* next block of lines */ - framebuffer = line2; - } -} - -// raw bayer functions -// from libv4l bayer.c, (C) 2008 Hans de Goede <j.w.r.degoede@hhs.nl> -//Note: original bayer_to_bgr24 code from : -// 1394-Based Digital Camera Control Library -// -// Bayer pattern decoding functions -// -// Written by Damien Douxchamps and Frederic Devernay -static void convert_border_bayer_line_to_bgr24( BYTE* bayer, BYTE* adjacent_bayer, - BYTE *bgr, int width, bool start_with_green, bool blue_line) -{ - int t0, t1; - - if (start_with_green) - { - /* First pixel */ - if (blue_line) - { - *bgr++ = bayer[1]; - *bgr++ = bayer[0]; - *bgr++ = adjacent_bayer[0]; - } - else - { - *bgr++ = adjacent_bayer[0]; - *bgr++ = bayer[0]; - *bgr++ = bayer[1]; - } - /* Second pixel */ - t0 = (bayer[0] + bayer[2] + adjacent_bayer[1] + 1) / 3; - t1 = (adjacent_bayer[0] + adjacent_bayer[2] + 1) >> 1; - if (blue_line) - { - *bgr++ = bayer[1]; - *bgr++ = t0; - *bgr++ = t1; - } - else - { - *bgr++ = t1; - *bgr++ = t0; - *bgr++ = bayer[1]; - } - bayer++; - adjacent_bayer++; - width -= 2; - } - else - { - /* First pixel */ - t0 = (bayer[1] + adjacent_bayer[0] + 1) >> 1; - if (blue_line) - { - *bgr++ = bayer[0]; - *bgr++ = t0; - *bgr++ = adjacent_bayer[1]; - } - else - { - *bgr++ = adjacent_bayer[1]; - *bgr++ = t0; - *bgr++ = bayer[0]; - } - width--; - } - - if (blue_line) - { - for ( ; width > 2; width -= 2) - { - t0 = (bayer[0] + bayer[2] + 1) >> 1; - *bgr++ = t0; - *bgr++ = bayer[1]; - *bgr++ = adjacent_bayer[1]; - bayer++; - adjacent_bayer++; - - t0 = (bayer[0] + bayer[2] + adjacent_bayer[1] + 1) / 3; - t1 = (adjacent_bayer[0] + adjacent_bayer[2] + 1) >> 1; - *bgr++ = bayer[1]; - *bgr++ = t0; - *bgr++ = t1; - bayer++; - adjacent_bayer++; - } - } - else - { - for ( ; width > 2; width -= 2) - { - t0 = (bayer[0] + bayer[2] + 1) >> 1; - *bgr++ = adjacent_bayer[1]; - *bgr++ = bayer[1]; - *bgr++ = t0; - bayer++; - adjacent_bayer++; - - t0 = (bayer[0] + bayer[2] + adjacent_bayer[1] + 1) / 3; - t1 = (adjacent_bayer[0] + adjacent_bayer[2] + 1) >> 1; - *bgr++ = t1; - *bgr++ = t0; - *bgr++ = bayer[1]; - bayer++; - adjacent_bayer++; - } - } - - if (width == 2) - { - /* Second to last pixel */ - t0 = (bayer[0] + bayer[2] + 1) >> 1; - if (blue_line) - { - *bgr++ = t0; - *bgr++ = bayer[1]; - *bgr++ = adjacent_bayer[1]; - } - else - { - *bgr++ = adjacent_bayer[1]; - *bgr++ = bayer[1]; - *bgr++ = t0; - } - /* Last pixel */ - t0 = (bayer[1] + adjacent_bayer[2] + 1) >> 1; - if (blue_line) - { - *bgr++ = bayer[2]; - *bgr++ = t0; - *bgr++ = adjacent_bayer[1]; - } - else - { - *bgr++ = adjacent_bayer[1]; - *bgr++ = t0; - *bgr++ = bayer[2]; - } - } - else - { - /* Last pixel */ - if (blue_line) - { - *bgr++ = bayer[0]; - *bgr++ = bayer[1]; - *bgr++ = adjacent_bayer[1]; - } - else - { - *bgr++ = adjacent_bayer[1]; - *bgr++ = bayer[1]; - *bgr++ = bayer[0]; - } - } -} - -/* From libdc1394, which on turn was based on OpenCV's Bayer decoding */ -static void bayer_to_rgbbgr24(BYTE *bayer, - BYTE *bgr, int width, int height, - bool start_with_green, bool blue_line) -{ - /* render the first line */ - convert_border_bayer_line_to_bgr24(bayer, bayer + width, bgr, width, - start_with_green, blue_line); - bgr += width * 3; - - /* reduce height by 2 because of the special case top/bottom line */ - for (height -= 2; height; height--) - { - int t0, t1; - /* (width - 2) because of the border */ - BYTE *bayerEnd = bayer + (width - 2); - - if (start_with_green) - { - /* OpenCV has a bug in the next line, which was - t0 = (bayer[0] + bayer[width * 2] + 1) >> 1; */ - t0 = (bayer[1] + bayer[width * 2 + 1] + 1) >> 1; - /* Write first pixel */ - t1 = (bayer[0] + bayer[width * 2] + bayer[width + 1] + 1) / 3; - if (blue_line) - { - *bgr++ = t0; - *bgr++ = t1; - *bgr++ = bayer[width]; - } - else - { - *bgr++ = bayer[width]; - *bgr++ = t1; - *bgr++ = t0; - } - - /* Write second pixel */ - t1 = (bayer[width] + bayer[width + 2] + 1) >> 1; - if (blue_line) - { - *bgr++ = t0; - *bgr++ = bayer[width + 1]; - *bgr++ = t1; - } - else - { - *bgr++ = t1; - *bgr++ = bayer[width + 1]; - *bgr++ = t0; - } - bayer++; - } - else - { - /* Write first pixel */ - t0 = (bayer[0] + bayer[width * 2] + 1) >> 1; - if (blue_line) - { - *bgr++ = t0; - *bgr++ = bayer[width]; - *bgr++ = bayer[width + 1]; - } - else - { - *bgr++ = bayer[width + 1]; - *bgr++ = bayer[width]; - *bgr++ = t0; - } - } - - if (blue_line) - { - for (; bayer <= bayerEnd - 2; bayer += 2) - { - t0 = (bayer[0] + bayer[2] + bayer[width * 2] + - bayer[width * 2 + 2] + 2) >> 2; - t1 = (bayer[1] + bayer[width] + - bayer[width + 2] + bayer[width * 2 + 1] + - 2) >> 2; - *bgr++ = t0; - *bgr++ = t1; - *bgr++ = bayer[width + 1]; - - t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1; - t1 = (bayer[width + 1] + bayer[width + 3] + - 1) >> 1; - *bgr++ = t0; - *bgr++ = bayer[width + 2]; - *bgr++ = t1; - } - } - else - { - for (; bayer <= bayerEnd - 2; bayer += 2) - { - t0 = (bayer[0] + bayer[2] + bayer[width * 2] + - bayer[width * 2 + 2] + 2) >> 2; - t1 = (bayer[1] + bayer[width] + - bayer[width + 2] + bayer[width * 2 + 1] + - 2) >> 2; - *bgr++ = bayer[width + 1]; - *bgr++ = t1; - *bgr++ = t0; - - t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1; - t1 = (bayer[width + 1] + bayer[width + 3] + - 1) >> 1; - *bgr++ = t1; - *bgr++ = bayer[width + 2]; - *bgr++ = t0; - } - } - - if (bayer < bayerEnd) - { - /* write second to last pixel */ - t0 = (bayer[0] + bayer[2] + bayer[width * 2] + - bayer[width * 2 + 2] + 2) >> 2; - t1 = (bayer[1] + bayer[width] + - bayer[width + 2] + bayer[width * 2 + 1] + - 2) >> 2; - if (blue_line) - { - *bgr++ = t0; - *bgr++ = t1; - *bgr++ = bayer[width + 1]; - } - else - { - *bgr++ = bayer[width + 1]; - *bgr++ = t1; - *bgr++ = t0; - } - /* write last pixel */ - t0 = (bayer[2] + bayer[width * 2 + 2] + 1) >> 1; - if (blue_line) - { - *bgr++ = t0; - *bgr++ = bayer[width + 2]; - *bgr++ = bayer[width + 1]; - } - else - { - *bgr++ = bayer[width + 1]; - *bgr++ = bayer[width + 2]; - *bgr++ = t0; - } - bayer++; - } - else - { - /* write last pixel */ - t0 = (bayer[0] + bayer[width * 2] + 1) >> 1; - t1 = (bayer[1] + bayer[width * 2 + 1] + bayer[width] + 1) / 3; - if (blue_line) - { - *bgr++ = t0; - *bgr++ = t1; - *bgr++ = bayer[width + 1]; - } - else - { - *bgr++ = bayer[width + 1]; - *bgr++ = t1; - *bgr++ = t0; - } - } - - /* skip 2 border pixels */ - bayer += 2; - - blue_line = !blue_line; - start_with_green = !start_with_green; - } - - /* render the last line */ - convert_border_bayer_line_to_bgr24(bayer + width, bayer, bgr, width, - !start_with_green, !blue_line); -} - -/*convert bayer raw data to rgb24 -* args: -* pBay: pointer to buffer containing Raw bayer data data -* pRGB24: pointer to buffer containing rgb24 data -* width: picture width -* height: picture height -* pix_order: bayer pixel order (0=gb/rg 1=gr/bg 2=bg/gr 3=rg/bg) -*/ -void -bayer_to_rgb24(BYTE *pBay, BYTE *pRGB24, int width, int height, int pix_order) -{ - switch (pix_order) - { - //conversion functions are build for bgr, by switching b and r lines we get rgb - case 0: /* gbgbgb... | rgrgrg... (V4L2_PIX_FMT_SGBRG8)*/ - bayer_to_rgbbgr24(pBay, pRGB24, width, height, TRUE, FALSE); - break; - - case 1: /* grgrgr... | bgbgbg... (V4L2_PIX_FMT_SGRBG8)*/ - bayer_to_rgbbgr24(pBay, pRGB24, width, height, TRUE, TRUE); - break; - - case 2: /* bgbgbg... | grgrgr... (V4L2_PIX_FMT_SBGGR8)*/ - bayer_to_rgbbgr24(pBay, pRGB24, width, height, FALSE, FALSE); - break; - - case 3: /* rgrgrg... ! gbgbgb... (V4L2_PIX_FMT_SRGGB8)*/ - bayer_to_rgbbgr24(pBay, pRGB24, width, height, FALSE, TRUE); - break; - - default: /* default is 0*/ - bayer_to_rgbbgr24(pBay, pRGB24, width, height, TRUE, FALSE); - break; - } -} - - -void -rgb2yuyv(BYTE *prgb, BYTE *pyuv, int width, int height) -{ - - int i=0; - for(i=0;i<(width*height*3);i=i+6) - { - /* y */ - *pyuv++ =CLIP(0.299 * (prgb[i] - 128) + 0.587 * (prgb[i+1] - 128) + 0.114 * (prgb[i+2] - 128) + 128); - /* u */ - *pyuv++ =CLIP(((- 0.147 * (prgb[i] - 128) - 0.289 * (prgb[i+1] - 128) + 0.436 * (prgb[i+2] - 128) + 128) + - (- 0.147 * (prgb[i+3] - 128) - 0.289 * (prgb[i+4] - 128) + 0.436 * (prgb[i+5] - 128) + 128))/2); - /* y1 */ - *pyuv++ =CLIP(0.299 * (prgb[i+3] - 128) + 0.587 * (prgb[i+4] - 128) + 0.114 * (prgb[i+5] - 128) + 128); - /* v*/ - *pyuv++ =CLIP(((0.615 * (prgb[i] - 128) - 0.515 * (prgb[i+1] - 128) - 0.100 * (prgb[i+2] - 128) + 128) + - (0.615 * (prgb[i+3] - 128) - 0.515 * (prgb[i+4] - 128) - 0.100 * (prgb[i+5] - 128) + 128))/2); - } -} - -void -bgr2yuyv(BYTE *pbgr, BYTE *pyuv, int width, int height) -{ - - int i=0; - for(i=0;i<(width*height*3);i=i+6) - { - /* y */ - *pyuv++ =CLIP(0.299 * (pbgr[i+2] - 128) + 0.587 * (pbgr[i+1] - 128) + 0.114 * (pbgr[i] - 128) + 128); - /* u */ - *pyuv++ =CLIP(((- 0.147 * (pbgr[i+2] - 128) - 0.289 * (pbgr[i+1] - 128) + 0.436 * (pbgr[i] - 128) + 128) + - (- 0.147 * (pbgr[i+5] - 128) - 0.289 * (pbgr[i+4] - 128) + 0.436 * (pbgr[i+3] - 128) + 128))/2); - /* y1 */ - *pyuv++ =CLIP(0.299 * (pbgr[i+5] - 128) + 0.587 * (pbgr[i+4] - 128) + 0.114 * (pbgr[i+3] - 128) + 128); - /* v*/ - *pyuv++ =CLIP(((0.615 * (pbgr[i+2] - 128) - 0.515 * (pbgr[i+1] - 128) - 0.100 * (pbgr[i] - 128) + 128) + - (0.615 * (pbgr[i+5] - 128) - 0.515 * (pbgr[i+4] - 128) - 0.100 * (pbgr[i+3] - 128) + 128))/2); - } -} - -/*use in utils.c for jpeg decoding 420 planar to 422 -* args: -* out: pointer to data output of idct (macroblocks yyyy u v) -* pic: pointer to picture buffer (yuyv) -* width: picture width -*/ -void yuv420pto422(int * out,unsigned char *pic,int width) -{ - int j, k; - unsigned char *pic0, *pic1; - int *outy, *outu, *outv; - int outy1 = 0; - int outy2 = 8; - - //yyyyuv - pic0 = pic; - pic1 = pic + width; - outy = out; - outu = out + 64 * 4; - outv = out + 64 * 5; - for (j = 0; j < 8; j++) - { - for (k = 0; k < 8; k++) - { - if( k == 4) - { - outy1 += 56; - outy2 += 56; - } - *pic0++ = CLIP(outy[outy1]); //y1 line 1 - *pic0++ = CLIP(128 + *outu); //u line 1-2 - *pic0++ = CLIP(outy[outy1+1]); //y2 line 1 - *pic0++ = CLIP(128 + *outv); //v line 1-2 - *pic1++ = CLIP(outy[outy2]); //y1 line 2 - *pic1++ = CLIP(128 + *outu); //u line 1-2 - *pic1++ = CLIP(outy[outy2+1]); //y2 line 2 - *pic1++ = CLIP(128 + *outv); //v line 1-2 - outy1 +=2; outy2 += 2; outu++; outv++; - } - if(j==3) - { - outy = out + 128; - } - else - { - outy += 16; - } - outy1 = 0; - outy2 = 8; - pic0 += 2 * (width -16); - pic1 += 2 * (width -16); - } -} - -/*use in utils.c for jpeg decoding 422 planar to 422 -* args: -* out: pointer to data output of idct (macroblocks yyyy u v) -* pic: pointer to picture buffer (yuyv) -* width: picture width -*/ -void yuv422pto422(int * out,unsigned char *pic,int width) -{ - int j, k; - unsigned char *pic0, *pic1; - int *outy, *outu, *outv; - int outy1 = 0; - int outy2 = 8; - int outu1 = 0; - int outv1 = 0; - - //yyyyuv - pic0 = pic; - pic1 = pic + width; - outy = out; - outu = out + 64 * 4; - outv = out + 64 * 5; - for (j = 0; j < 4; j++) - { - for (k = 0; k < 8; k++) - { - if( k == 4) - { - outy1 += 56; - outy2 += 56; - } - *pic0++ = CLIP(outy[outy1]); //y1 line 1 - *pic0++ = CLIP(128 + outu[outu1]); //u line 1 - *pic0++ = CLIP(outy[outy1+1]); //y2 line 1 - *pic0++ = CLIP(128 + outv[outv1]); //v line 1 - *pic1++ = CLIP(outy[outy2]); //y1 line 2 - *pic1++ = CLIP(128 + outu[outu1+8]);//u line 2 - *pic1++ = CLIP(outy[outy2+1]); //y2 line 2 - *pic1++ = CLIP(128 + outv[outv1+8]);//v line 2 - outv1 += 1; outu1 += 1; - outy1 +=2; outy2 +=2; - } - outy += 16;outu +=8; outv +=8; - outv1 = 0; outu1=0; - outy1 = 0; - outy2 = 8; - pic0 += 2 * (width -16); - pic1 += 2 * (width -16); - } -} - -void yuv420pto420sp(int * out, addr *pic, int width) -{ - int j, k; - unsigned char *pic0, *pic1, *uv; - int *outy, *outu, *outv; - int *outy1 ; - int *outy2 ; - int *outu1 ; - int *outv1 ; - - pic0 = pic->y; - pic1 = pic->y + width; - uv = pic->v; - outy = out; - outu = out + 64 * 4; - outv = out + 64 * 5; - - for (j = 0; j < 8; j++) - { - outy1 = outy; - outy2 = outy+8; - outv1 = outv; - outu1 = outu; - - { - asm volatile( - "mov r0,#0 \n\t" - "vdup.u32 d30, r0 \n\t" - "mov r0,#255 \n\t" - "vdup.u32 d31, r0 \n\t" - - /*** line1 ***/ - "mov r0, #256 @256=64*4\n\t" - "vld4.32 {d26,d27,d28,d29}, [%[outy1]], r0 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic0]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic0]]! \n\t" - - /*** mb 2 ***/ - "vld4.32 {d26,d27,d28,d29}, [%[outy1]] \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic0]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic0]]! \n\t" - - /*** line2 ***/ - "vld4.32 {d26,d27,d28,d29}, [%[outy2]],r0 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic1]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic1]]! \n\t" - - /*** mb2 ***/ - "vld4.32 {d26,d27,d28,d29}, [%[outy2]] \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic1]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic1]]! \n\t" - - /*** uv ***/ - "mov r0, #16 @16=4*4 \n\t" - "vld4.32 {d22,d24,d26,d28}, [%[outv1]], r0 \n\t" - "vld4.32 {d23,d25,d27,d29}, [%[outu1]], r0 \n\t" - - "mov r0, #128 \n\t" - "vdup.u32 d30, r0 \n\t" - "vqadd.s32 d22, d22, d30 \n\t" - "vqadd.s32 d23, d23, d30 \n\t" - "vqadd.s32 d24, d24, d30 \n\t" - "vqadd.s32 d25, d25, d30 \n\t" - "vqadd.s32 d26, d26, d30 \n\t" - "vqadd.s32 d27, d27, d30 \n\t" - "vqadd.s32 d28, d28, d30 \n\t" - "vqadd.s32 d29, d29, d30 \n\t" - - "mov r0, #0 \n\t" - "vdup.u32 d30, r0 \n\t" - - "vmax.s32 d22, d22, d30 \n\t" - "vmin.s32 d22, d22, d31 \n\t" - "vmax.s32 d24, d24, d30 \n\t" - "vmin.s32 d24, d24, d31 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - - "vmax.s32 d23, d23, d30 \n\t" - "vmin.s32 d23, d23, d31 \n\t" - "vmax.s32 d25, d25, d30 \n\t" - "vmin.s32 d25, d25, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - - "vst4.8 {d22[0],d23[0],d24[0],d25[0]}, [%[uv]]! \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[uv]]! \n\t" - "vst4.8 {d22[4],d23[4],d24[4],d25[4]}, [%[uv]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[uv]]! \n\t" - ////////////////////////////// - - "4:@end \n\t" - : [outy1] "+r" (outy1), [outy2] "+r" (outy2), - [pic0] "+r" (pic0), [pic1] "+r" (pic1), - [outu1] "+r" (outu1), [outv1] "+r" (outv1), - [uv] "+r" (uv) - : [width] "r" (width) - : "cc", "memory", "r0","q11", "q12", "q13","q14","q15" - ); - } - if(j == 3) - outy += 80; - else - outy += 16; - outu +=8; outv +=8; - pic0 += 2 * (width - 8); - pic1 += 2 * (width - 8); - uv += width - 16; - } -} - -void yuv420pto420p(int * out, addr *pic, int width) -{ - int j, k; - unsigned char *pic0, *pic1, *u, *v; - int *outy, *outu, *outv; - int *outy1 ; - int *outy2 ; - int *outu1 ; - int *outv1 ; - - pic0 = pic->y; - pic1 = pic->y + width; - v = pic->v; - u = pic->u; - outy = out; - outu = out + 64 * 4; - outv = out + 64 * 5; - - for (j = 0; j < 8; j++) - { - outy1 = outy; - outy2 = outy+8; - outv1 = outv; - outu1 = outu; - - { - asm volatile( - "mov r0,#0 \n\t" - "vdup.u32 d30, r0 \n\t" - "mov r0,#255 \n\t" - "vdup.u32 d31, r0 \n\t" - - /*** line1 ***/ - "mov r0, #256 @256=64*4\n\t" - "vld4.32 {d26,d27,d28,d29}, [%[outy1]], r0 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic0]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic0]]! \n\t" - - /*** mb 2 ***/ - "vld4.32 {d26,d27,d28,d29}, [%[outy1]] \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic0]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic0]]! \n\t" - - /*** line2 ***/ - "vld4.32 {d26,d27,d28,d29}, [%[outy2]],r0 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic1]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic1]]! \n\t" - - /*** mb2 ***/ - "vld4.32 {d26,d27,d28,d29}, [%[outy2]] \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic1]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic1]]! \n\t" - - /*** uv ***/ - "mov r0, #16 @16=4*4 \n\t" - "vld4.32 {d22,d23,d24,d25}, [%[outv1]], r0 \n\t" - "vld4.32 {d26,d27,d28,d29}, [%[outu1]], r0 \n\t" - - "mov r0, #128 \n\t" - "vdup.u32 d30, r0 \n\t" - "vqadd.s32 d22, d22, d30 \n\t" - "vqadd.s32 d23, d23, d30 \n\t" - "vqadd.s32 d24, d24, d30 \n\t" - "vqadd.s32 d25, d25, d30 \n\t" - "vqadd.s32 d26, d26, d30 \n\t" - "vqadd.s32 d27, d27, d30 \n\t" - "vqadd.s32 d28, d28, d30 \n\t" - "vqadd.s32 d29, d29, d30 \n\t" - - "mov r0, #0 \n\t" - "vdup.u32 d30, r0 \n\t" - - "vmax.s32 d22, d22, d30 \n\t" - "vmin.s32 d22, d22, d31 \n\t" - "vmax.s32 d23, d23, d30 \n\t" - "vmin.s32 d23, d23, d31 \n\t" - "vmax.s32 d24, d24, d30 \n\t" - "vmin.s32 d24, d24, d31 \n\t" - "vmax.s32 d25, d25, d30 \n\t" - "vmin.s32 d25, d25, d31 \n\t" - - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - - "vst4.8 {d22[0],d23[0],d24[0],d25[0]}, [%[v]]! \n\t" - "vst4.8 {d22[4],d23[4],d24[4],d25[4]}, [%[v]]! \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[u]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[u]]! \n\t" - ////////////////////////////// - - "4:@end \n\t" - : [outy1] "+r" (outy1), [outy2] "+r" (outy2), - [pic0] "+r" (pic0), [pic1] "+r" (pic1), - [outu1] "+r" (outu1), [outv1] "+r" (outv1), - [u] "+r" (u), [v] "+r" (v) - : [width] "r" (width) - : "cc", "memory", "r0","q11","q12","q13","q14","q15" - ); - } - if(j == 3) - outy += 80; - else - outy += 16; - outu += 8; outv += 8; - pic0 += 2 * (width - 8); - pic1 += 2 * (width - 8); - u += width / 2 - 8; - v += width / 2 - 8; - } -} - -void yuv422pto420sp(int * out, addr *pic, int width) -{ - int j, k; - unsigned char *pic0, *pic1,*uv; - int *outy, *outu, *outv; - int *outy1 ; - int *outy2 ; - int *outu1 ; - int *outv1 ; - - //yyyyuv - pic0 = pic->y; - pic1 = pic->y + width; - uv = pic->v; - outy = out; - outu = out + 64 * 4; - outv = out + 64 * 5; - - for (j = 0; j < 4; j++) - { - outy1 = outy; - outy2 = outy+8; - outv1 = outv; - outu1 = outu; - - for (k = 0; k < 2; k++) - { - asm volatile( - "mov r0,#0 \n\t" - "vdup.u32 d30, r0 \n\t" - "mov r0,#255 \n\t" - "vdup.u32 d31, r0 \n\t" - - /////////////////////////////line1 - "mov r0, #256 @256=64*4\n\t" - "vld4.32 {d26,d27,d28,d29}, [%[outy1]], r0 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic0]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic0]]! \n\t" - - /////////////////////////////line2 - "vld4.32 {d26,d27,d28,d29}, [%[outy2]],r0 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic1]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic1]]! \n\t" - - //////////////////////////////uv - "mov r0, #16 @16=4*4 \n\t" - "vld4.32 {d22,d24,d26,d28}, [%[outv1]], r0 \n\t" - "vld4.32 {d23,d25,d27,d29}, [%[outu1]], r0 \n\t" - - "mov r0, #128 \n\t" - "vdup.u32 d30, r0 \n\t" - "vqadd.s32 d22, d22, d30 \n\t" - "vqadd.s32 d23, d23, d30 \n\t" - "vqadd.s32 d24, d24, d30 \n\t" - "vqadd.s32 d25, d25, d30 \n\t" - "vqadd.s32 d26, d26, d30 \n\t" - "vqadd.s32 d27, d27, d30 \n\t" - "vqadd.s32 d28, d28, d30 \n\t" - "vqadd.s32 d29, d29, d30 \n\t" - - "mov r0, #0 \n\t" - "vdup.u32 d30, r0 \n\t" - - "vmax.s32 d22, d22, d30 \n\t" - "vmin.s32 d22, d22, d31 \n\t" - "vmax.s32 d24, d24, d30 \n\t" - "vmin.s32 d24, d24, d31 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - - "vmax.s32 d23, d23, d30 \n\t" - "vmin.s32 d23, d23, d31 \n\t" - "vmax.s32 d25, d25, d30 \n\t" - "vmin.s32 d25, d25, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - - "vst4.8 {d22[0],d23[0],d24[0],d25[0]}, [%[uv]]! \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[uv]]! \n\t" - ////////////////////////////// - - "4:@end \n\t" - : [outy1] "+r" (outy1), [outy2] "+r" (outy2), - [pic0] "+r" (pic0), [pic1] "+r" (pic1), - [outu1] "+r" (outu1), [outv1] "+r" (outv1), - [uv] "+r" (uv) - : [width] "r" (width) - : "cc", "memory", "r0","q11","q12","q13","q14","q15" - ); - } - outy += 16;outu +=8; outv +=8; - pic0 += 2 * (width - 8); - pic1 += 2 * (width - 8); - uv += width - 16; - } -} - -void yuv422pto420p(int * out, addr *pic, int width) -{ - int j, k; - unsigned char *pic0, *pic1,*v,*u; - int *outy, *outu, *outv; - int *outy1 ; - int *outy2 ; - int *outu1 ; - int *outv1 ; - - //yyyyuv - pic0 = pic->y; - pic1 = pic->y + width; - v = pic->v; - u = pic->u; - outy = out; - outu = out + 64 * 4; - outv = out + 64 * 5; - for (j = 0; j < 4; j++) - { - outy1 = outy; - outy2 = outy+8; - outv1 = outv; - outu1 = outu; - - for (k = 0; k < 2; k++) - { - asm volatile( - "mov r0,#0 \n\t" - "vdup.u32 d30, r0 \n\t" - "mov r0,#255 \n\t" - "vdup.u32 d31, r0 \n\t" - - /////////////////////////////line1 - "mov r0, #256 @256=64*4\n\t" - "vld4.32 {d26,d27,d28,d29}, [%[outy1]], r0 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic0]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic0]]! \n\t" - - /////////////////////////////line2 - "vld4.32 {d26,d27,d28,d29}, [%[outy2]],r0 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[pic1]]! \n\t" - "vst4.8 {d26[4],d27[4],d28[4],d29[4]}, [%[pic1]]! \n\t" - - //////////////////////////////uv - "mov r0, #16 @16=4*4 \n\t" - "vld4.32 {d22,d23,d24,d25}, [%[outv1]], r0 \n\t" - "vld4.32 {d26,d27,d28,d29}, [%[outu1]], r0 \n\t" - - "mov r0, #128 \n\t" - "vdup.u32 d30, r0 \n\t" - "vqadd.s32 d22, d22, d30 \n\t" - "vqadd.s32 d23, d23, d30 \n\t" - "vqadd.s32 d24, d24, d30 \n\t" - "vqadd.s32 d25, d25, d30 \n\t" - "vqadd.s32 d26, d26, d30 \n\t" - "vqadd.s32 d27, d27, d30 \n\t" - "vqadd.s32 d28, d28, d30 \n\t" - "vqadd.s32 d29, d29, d30 \n\t" - - "mov r0, #0 \n\t" - "vdup.u32 d30, r0 \n\t" - - "vmax.s32 d22, d22, d30 \n\t" - "vmin.s32 d22, d22, d31 \n\t" - "vmax.s32 d24, d24, d30 \n\t" - "vmin.s32 d24, d24, d31 \n\t" - "vmax.s32 d26, d26, d30 \n\t" - "vmin.s32 d26, d26, d31 \n\t" - "vmax.s32 d28, d28, d30 \n\t" - "vmin.s32 d28, d28, d31 \n\t" - - "vmax.s32 d23, d23, d30 \n\t" - "vmin.s32 d23, d23, d31 \n\t" - "vmax.s32 d25, d25, d30 \n\t" - "vmin.s32 d25, d25, d31 \n\t" - "vmax.s32 d27, d27, d30 \n\t" - "vmin.s32 d27, d27, d31 \n\t" - "vmax.s32 d29, d29, d30 \n\t" - "vmin.s32 d29, d29, d31 \n\t" - - "vst4.8 {d22[0],d23[0],d24[0],d25[0]}, [%[v]]! \n\t" - "vst4.8 {d26[0],d27[0],d28[0],d29[0]}, [%[u]]! \n\t" - ////////////////////////////// - "4:@end \n\t" - : [outy1] "+r" (outy1), [outy2] "+r" (outy2), - [pic0] "+r" (pic0), [pic1] "+r" (pic1), - [outu1] "+r" (outu1), [outv1] "+r" (outv1), - [v] "+r" (v),[u] "+r" (u) - : [width] "r" (width) - : "cc", "memory", "r0","q11", "q12", "q13","q14","q15" - ); - } - outy += 16;outu +=8; outv +=8; - pic0 += 2 * (width - 8); - pic1 += 2 * (width - 8); - v += width/2 - 8; - u += width/2 - 8; - } -} - -/*use in utils.c for jpeg decoding 444 planar to 422 -* args: -* out: pointer to data output of idct (macroblocks yyyy u v) -* pic: pointer to picture buffer (yuyv) -* width: picture width -*/ -void yuv444pto422(int * out,unsigned char *pic,int width) -{ - int j, k; - unsigned char *pic0, *pic1; - int *outy, *outu, *outv; - int outy1 = 0; - int outy2 = 8; - int outu1 = 0; - int outv1 = 0; - - //yyyyuv - pic0 = pic; - pic1 = pic + width; - outy = out; - outu = out + 64 * 4; // Ooops where did i invert ?? - outv = out + 64 * 5; - for (j = 0; j < 4; j++) - { - for (k = 0; k < 4; k++) - { - *pic0++ =CLIP( outy[outy1]); //y1 line 1 - *pic0++ =CLIP( 128 + outu[outu1]); //u line 1 - *pic0++ =CLIP( outy[outy1+1]); //y2 line 1 - *pic0++ =CLIP( 128 + outv[outv1]); //v line 1 - *pic1++ =CLIP( outy[outy2]); //y1 line 2 - *pic1++ =CLIP( 128 + outu[outu1+8]);//u line 2 - *pic1++ =CLIP( outy[outy2+1]); //y2 line 2 - *pic1++ =CLIP( 128 + outv[outv1+8]);//v line 2 - outv1 += 2; outu1 += 2; - outy1 +=2; outy2 +=2; - } - outy += 16;outu +=16; outv +=16; - outv1 = 0; outu1=0; - outy1 = 0; - outy2 = 8; - pic0 += 2 * (width -8); - pic1 += 2 * (width -8); - } -} - -/*use in utils.c for jpeg decoding 400 planar to 422 -* args: -* out: pointer to data output of idct (macroblocks yyyy ) -* pic: pointer to picture buffer (yuyv) -* width: picture width -*/ -void yuv400pto422(int * out,unsigned char *pic,int width) -{ - int j, k; - unsigned char *pic0, *pic1; - int *outy ; - int outy1 = 0; - int outy2 = 8; - pic0 = pic; - pic1 = pic + width; - outy = out; - - //yyyy - for (j = 0; j < 4; j++) - { - for (k = 0; k < 4; k++) - { - *pic0++ = CLIP(outy[outy1]); //y1 line 1 - *pic0++ = 128 ; //u - *pic0++ = CLIP(outy[outy1+1]);//y2 line 1 - *pic0++ = 128 ; //v - *pic1++ = CLIP(outy[outy2]); //y1 line 2 - *pic1++ = 128 ; //u - *pic1++ = CLIP(outy[outy2+1]);//y2 line 2 - *pic1++ = 128 ; //v - outy1 +=2; outy2 +=2; - } - outy += 16; - outy1 = 0; - outy2 = 8; - pic0 += 2 * (width -8); - pic1 += 2 * (width -8); - } -} - |