diff postproc/swscale.c @ 4558:aac57ef92bab

rgb32 & rgb24 input support squished a endianness bug in the 15/16bgr output
author michael
date Wed, 06 Feb 2002 22:55:57 +0000
parents 44fed00fce13
children 835d4fce67d5
line wrap: on
line diff
--- a/postproc/swscale.c	Wed Feb 06 22:55:47 2002 +0000
+++ b/postproc/swscale.c	Wed Feb 06 22:55:57 2002 +0000
@@ -17,9 +17,14 @@
 */
 
 /*
-  supported Input formats: YV12, I420, IYUV, YUY2, BGR32, BGR24, Y8, Y800
+  supported Input formats: YV12, I420, IYUV, YUY2, BGR32, BGR24, RGB32, RGB24, Y8, Y800
   supported output formats: YV12, I420, IYUV, BGR15, BGR16, BGR24, BGR32 (grayscale soon too)
   BGR15/16 support dithering
+  
+  unscaled special converters
+  YV12/I420/IYUV -> BGR15/BGR16/BGR24/BGR32
+  YV12/I420/IYUV -> YV12/I420/IYUV
+  YUY2/BGR15/BGR16/BGR24/BGR32/RGB24/RGB32 -> same format
 */
 
 #include <inttypes.h>
@@ -33,6 +38,7 @@
 #endif
 #include "swscale.h"
 #include "../cpudetect.h"
+#include "../bswap.h"
 #include "../libvo/img_format.h"
 #include "rgb2rgb.h"
 #undef MOVNTQ
@@ -63,10 +69,11 @@
 #define isYUV(x)       ((x)==IMGFMT_YUY2 || isPlanarYUV(x))
 #define isHalfChrV(x)  ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420)
 #define isHalfChrH(x)  ((x)==IMGFMT_YUY2 || (x)==IMGFMT_YV12 || (x)==IMGFMT_I420)
-#define isPacked(x)    ((x)==IMGFMT_YUY2 || (x)==IMGFMT_BGR32|| (x)==IMGFMT_BGR24)
+#define isPacked(x)    ((x)==IMGFMT_YUY2 || ((x)&IMGFMT_BGR_MASK)==IMGFMT_BGR || ((x)&IMGFMT_RGB_MASK)==IMGFMT_RGB)
 #define isGray(x)      ((x)==IMGFMT_Y800)
 #define isSupportedIn(x)  ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420 || (x)==IMGFMT_YUY2 \
 			|| (x)==IMGFMT_BGR32|| (x)==IMGFMT_BGR24\
+			|| (x)==IMGFMT_RGB32|| (x)==IMGFMT_RGB24\
 			|| (x)==IMGFMT_Y800)
 #define isSupportedOut(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420 \
 			|| (x)==IMGFMT_BGR32|| (x)==IMGFMT_BGR24|| (x)==IMGFMT_BGR16|| (x)==IMGFMT_BGR15)
@@ -1066,12 +1073,12 @@
     for(i=0; i<768; i++)
     {
 	int v= clip_table[i];
-	clip_table16b[i]= v>>3;
-	clip_table16g[i]= (v<<3)&0x07E0;
-	clip_table16r[i]= (v<<8)&0xF800;
-	clip_table15b[i]= v>>3;
-	clip_table15g[i]= (v<<2)&0x03E0;
-	clip_table15r[i]= (v<<7)&0x7C00;
+	clip_table16b[i]= le2me_16( v>>3);
+	clip_table16g[i]= le2me_16((v<<3)&0x07E0);
+	clip_table16r[i]= le2me_16((v<<8)&0xF800);
+	clip_table15b[i]= le2me_16( v>>3);
+	clip_table15g[i]= le2me_16((v<<2)&0x03E0);
+	clip_table15r[i]= le2me_16((v<<7)&0x7C00);
     }
 
 cpuCaps= gCpuCaps;
@@ -1173,14 +1180,12 @@
 			int i;
 			uint8_t *srcPtr= src[0];
 			uint8_t *dstPtr= dst[0] + dstStride[0]*srcSliceY;
-			int length;
-			
-			if(c->srcFormat==IMGFMT_YUY2) 		length= c->srcW*2;
-			else if(c->srcFormat==IMGFMT_BGR15) 	length= c->srcW*2;
-			else if(c->srcFormat==IMGFMT_BGR16) 	length= c->srcW*2;
-			else if(c->srcFormat==IMGFMT_BGR24) 	length= c->srcW*3;
-			else if(c->srcFormat==IMGFMT_BGR32) 	length= c->srcW*4;
-			else return; /* that shouldnt happen */
+			int length=0;
+
+			/* universal length finder */
+			while(length+c->srcW <= dstStride[0] 
+			   && length+c->srcW <= srcStride[0]) length+= c->srcW;
+			ASSERT(length!=0);
 
 			for(i=0; i<srcSliceH; i++)
 			{
@@ -1198,7 +1203,7 @@
 			int length= plane==0 ? c->srcW  : ((c->srcW+1)>>1);
 			int y=      plane==0 ? srcSliceY: ((srcSliceY+1)>>1);
 			int height= plane==0 ? srcSliceH: ((srcSliceH+1)>>1);
-printf("%d %d %d %d %d %d\n", plane, length, y, height, dstStride[plane], srcStride[plane] );
+
 			if(dstStride[plane]==srcStride[plane])
 				memcpy(dst[plane] + dstStride[plane]*y, src[plane], height*dstStride[plane]);
 			else