Revision: 9976 http://pure-data.svn.sourceforge.net/pure-data/?rev=9976&view=rev Author: sevyves Date: 2008-06-08 04:55:43 -0700 (Sun, 08 Jun 2008)
Log Message: ----------- Patch to support more conversion
Modified Paths: -------------- branches/pd-extended/v0-40/externals/pdp/include/pdp_llconv.h branches/pd-extended/v0-40/externals/pdp/system/image/pdp_llconv.c
Modified: branches/pd-extended/v0-40/externals/pdp/include/pdp_llconv.h =================================================================== --- branches/pd-extended/v0-40/externals/pdp/include/pdp_llconv.h 2008-06-08 11:49:52 UTC (rev 9975) +++ branches/pd-extended/v0-40/externals/pdp/include/pdp_llconv.h 2008-06-08 11:55:43 UTC (rev 9976) @@ -53,6 +53,7 @@ RIF_YUV__P411_U8, RIF_YVU__P411_S16, RIF_YVU__P444_S16, + RIF_UYVY_P____U8, RIF_YUYV_P____U8, RIF_RGB__P____U8, RIF_RGBA_P____U8,
Modified: branches/pd-extended/v0-40/externals/pdp/system/image/pdp_llconv.c =================================================================== --- branches/pd-extended/v0-40/externals/pdp/system/image/pdp_llconv.c 2008-06-08 11:49:52 UTC (rev 9975) +++ branches/pd-extended/v0-40/externals/pdp/system/image/pdp_llconv.c 2008-06-08 11:55:43 UTC (rev 9976) @@ -509,6 +509,66 @@
}
+ + +/* convert yuvu packed 8 bit unsigned to yv12 planar 16bit signed */ +/* search for bithacks */ +static void llconv_uyvy_packed_u8s16(unsigned char* ucsource, short int *sidest, unsigned int w, unsigned int h) +{ + unsigned int i, j; + unsigned int *source = (unsigned int *)ucsource; + + unsigned int *dest = (unsigned int *)sidest; + unsigned int uoffset = (w*h)>>1; + unsigned int voffset = (w*h + ((w*h) >> 2)) >> 1; + + for(j=0; j < (h*w)>>1; j +=(w)){ + for(i=0; i< (w>>1); i+=2){ + unsigned int y,u,v; + unsigned int v00, v01, v10, v11; + v00 = source[i+j]; + v01 = source[i+j+1]; + v10 = source[i+j+(w>>1)]; + v11 = source[i+j+(w>>1)+1]; + + // save luma + dest[i+j] = ((v00 & 0xff00ff00)>>1); + v11 = source[i+j+(w>>1)+1]; + + // save luma + dest[i+j] = ((v00 & 0xff00ff00)>>1); + dest[i+j+1] = ((v01 & 0xff00ff00)>>1); + dest[i+j+(w>>1)] = ((v10 & 0xff00ff00)>>1); + dest[i+j+(w>>1)+1] = ((v11 & 0xff00ff00)>>1); + + // compute chroma + + + v00 = (v00 & 0x00ff00ff) << 7; + v01 = (v01 & 0x00ff00ff) << 7; + v10 = (v10 & 0x00ff00ff) << 7; + v11 = (v11 & 0x00ff00ff) << 7; + + // average 2 scan lines + v00 += v10; + v01 += v11; + + // combine TWO VALUES IN ONE WORD (32bits) + v = (v01 << 16) | (v00 & 0x0000ffff); + u = (v01 & 0xffff0000) | (v00 >> 16); + + // flip sign bits for u,v FOR PDP FORMAT + u ^= 0x80008000; + v ^= 0x80008000; + + // save chroma + dest[uoffset + (i>>1) + (j>>2)] = u; + dest[voffset + (i>>1) + (j>>2)] = v; + } + } + +} + #define CONVERT(x,y) ((x) + ((y)<<16))
void pdp_llconv(void *src, int stype, void *dst, int dtype, int w, int h) @@ -530,6 +590,10 @@ llconv_yuyv_packed_u8s16((unsigned char*)src, (short int *)dst, w, h); break;
+ case CONVERT( RIF_UYVY_P____U8, RIF_YVU__P411_S16 ): + llconv_uyvy_packed_u8s16((unsigned char*)src, (short int *)dst, w, h); + break; + case CONVERT( RIF_RGB__P____U8, RIF_YVU__P411_U8 ): llconv_rgb2yvu_planar8sub((unsigned char*) src, (unsigned char*) dst, w, h); break;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.