changeset 4554:16fdb694cf13

swScale internally uses yuv2rgb now if possible
author michael
date Wed, 06 Feb 2002 20:52:14 +0000
parents bab3aac84143
children 44fed00fce13
files libvo/vo_vesa.c libvo/vo_x11.c postproc/swscale.c postproc/swscale.h postproc/swscale_template.c
diffstat 5 files changed, 54 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libvo/vo_vesa.c	Wed Feb 06 20:30:34 2002 +0000
+++ b/libvo/vo_vesa.c	Wed Feb 06 20:52:14 2002 +0000
@@ -262,7 +262,7 @@
     dstStride[1]=
     dstStride[2]=dstStride[0]>>1;
     if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE();
-    (*swScale)(sws,image,stride,y,h,dst,dstStride);
+    sws->swScale(sws,image,stride,y,h,dst,dstStride);
     flip_trigger = 1;
     return 0;
 }
@@ -371,7 +371,7 @@
 	else
 	    srcStride[0] = srcW*2;
 	if(HAS_DGA()) dst[0] += y_offset*SCREEN_LINE_SIZE(PIXEL_SIZE())+x_offset*PIXEL_SIZE();
-	(*swScale)(sws,src,srcStride,0,srcH,dst,dstStride);
+	sws->swScale(sws,src,srcStride,0,srcH,dst,dstStride);
 	flip_trigger=1;
     }
     else if(!HAS_DGA()) __vbeCopyData(src[0]);
--- a/libvo/vo_x11.c	Wed Feb 06 20:30:34 2002 +0000
+++ b/libvo/vo_x11.c	Wed Feb 06 20:52:14 2002 +0000
@@ -501,7 +501,7 @@
   dst[1]=
   dst[2]=NULL;
 
-  swScale(swsContext,src,stride,y,h,dst, dstStride);
+  swsContext->swScale(swsContext,src,stride,y,h,dst, dstStride);
 } else {
  uint8_t *dst=ImageData + ( image_width * y + x ) * ( bpp/8 );
  if(image_format==IMGFMT_YV12)
--- a/postproc/swscale.c	Wed Feb 06 20:30:34 2002 +0000
+++ b/postproc/swscale.c	Wed Feb 06 20:52:14 2002 +0000
@@ -34,6 +34,7 @@
 #include "swscale.h"
 #include "../cpudetect.h"
 #include "../libvo/img_format.h"
+#include "rgb2rgb.h"
 #undef MOVNTQ
 #undef PAVGB
 
@@ -69,6 +70,7 @@
 			|| (x)==IMGFMT_Y800)
 #define isSupportedOut(x) ((x)==IMGFMT_YV12 || (x)==IMGFMT_I420 \
 			|| (x)==IMGFMT_BGR32|| (x)==IMGFMT_BGR24|| (x)==IMGFMT_BGR16|| (x)==IMGFMT_BGR15)
+#define isBGR(x)       ((x)==IMGFMT_BGR32|| (x)==IMGFMT_BGR24|| (x)==IMGFMT_BGR16|| (x)==IMGFMT_BGR15)
 
 #define RGB2YUV_SHIFT 16
 #define BY ((int)( 0.098*(1<<RGB2YUV_SHIFT)+0.5))
@@ -92,7 +94,6 @@
 
 TODO
 more intelligent missalignment avoidance for the horizontal scaler
-change the distance of the u & v buffer
 write special vertical cubic upscale version
 Optimize C code (yv12 / minmax)
 add support for packed pixel yuv input & output
@@ -100,6 +101,7 @@
 optimize bgr24 & bgr32
 add BGR4 output support
 write special BGR->BGR scaler
+deglobalize yuv2rgb*.c
 */
 
 #define ABS(a) ((a) > 0 ? (a) : (-(a)))
@@ -1107,12 +1109,22 @@
 #endif //!RUNTIME_CPUDETECT
 }
 
+/* Warper functions for yuv2bgr */
+static void planarYuvToBgr(SwsContext *c, uint8_t* src[], int srcStride[], int srcSliceY,
+             int srcSliceH, uint8_t* dst[], int dstStride[]){
+
+	if(c->srcFormat==IMGFMT_YV12)
+		yuv2rgb( dst[0],src[0],src[1],src[2],c->srcW,c->srcH,dstStride[0],srcStride[0],srcStride[1] );
+	else /* I420 & IYUV */
+		yuv2rgb( dst[0],src[0],src[2],src[1],c->srcW,c->srcH,dstStride[0],srcStride[0],srcStride[1] );
+}
 
 SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags,
                          SwsFilter *srcFilter, SwsFilter *dstFilter){
 
 	SwsContext *c;
 	int i;
+	int usesFilter;
 	SwsFilter dummyFilter= {NULL, NULL, NULL, NULL};
 
 #ifdef ARCH_X86
@@ -1162,6 +1174,33 @@
 	c->dstFormat= dstFormat;
 	c->srcFormat= srcFormat;
 
+	usesFilter=0;
+	if(dstFilter->lumV!=NULL && dstFilter->lumV->length>1) usesFilter=1;
+	if(dstFilter->lumH!=NULL && dstFilter->lumH->length>1) usesFilter=1;
+	if(dstFilter->chrV!=NULL && dstFilter->chrV->length>1) usesFilter=1;
+	if(dstFilter->chrH!=NULL && dstFilter->chrH->length>1) usesFilter=1;
+	if(srcFilter->lumV!=NULL && srcFilter->lumV->length>1) usesFilter=1;
+	if(srcFilter->lumH!=NULL && srcFilter->lumH->length>1) usesFilter=1;
+	if(srcFilter->chrV!=NULL && srcFilter->chrV->length>1) usesFilter=1;
+	if(srcFilter->chrH!=NULL && srcFilter->chrH->length>1) usesFilter=1;
+	
+	/* special Cases */
+	if(srcW==dstW && srcH==dstH && !usesFilter)
+	{
+		/* yuv2bgr */
+		if(isPlanarYUV(srcFormat) && isBGR(dstFormat))
+		{
+			// FIXME multiple yuv2rgb converters wont work that way cuz that thing is full of globals&statics
+			yuv2rgb_init( dstFormat&0xFF /* =bpp */, MODE_BGR);
+			c->swScale= planarYuvToBgr;
+			
+			if(flags&SWS_PRINT_INFO)
+				printf("SwScaler: using unscaled %s -> %s special converter\n", 
+					vo_format_name(srcFormat), vo_format_name(dstFormat));
+			return c;
+		}
+	}
+
 	if(cpuCaps.hasMMX2)
 	{
 		c->canMMX2BeUsed= (dstW >=srcW && (dstW&31)==0 && (srcW&15)==0) ? 1 : 0;
@@ -1403,7 +1442,8 @@
 		printf("SwScaler:Chr srcW=%d srcH=%d dstW=%d dstH=%d xInc=%d yInc=%d\n",
 			c->chrSrcW, c->chrSrcH, c->chrDstW, c->chrDstH, c->chrXInc, c->chrYInc);
 	}
-	
+
+	c->swScale= swScale;
 	return c;
 }
 
--- a/postproc/swscale.h	Wed Feb 06 20:30:34 2002 +0000
+++ b/postproc/swscale.h	Wed Feb 06 20:52:14 2002 +0000
@@ -37,7 +37,7 @@
 #define SWS_MAX_REDUCE_CUTOFF 0.002
 
 /* this struct should be aligned on at least 32-byte boundary */
-typedef struct{
+typedef struct SwsContext{
 	int srcW, srcH, dstW, dstH;
 	int chrSrcW, chrSrcH, chrDstW, chrDstH;
 	int lumXInc, chrXInc;
@@ -78,6 +78,9 @@
 	int chrBufIndex;
 	int dstY;
 	int flags;
+
+	void (*swScale)(struct SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
+             int srcSliceH, uint8_t* dst[], int dstStride[]);
 } SwsContext;
 //FIXME check init (where 0)
 
@@ -116,9 +119,6 @@
 SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags,
 			 SwsFilter *srcFilter, SwsFilter *dstFilter);
 
-extern void (*swScale)(SwsContext *context, uint8_t* src[], int srcStride[], int srcSliceY,
-             int srcSliceH, uint8_t* dst[], int dstStride[]);
-
 SwsVector *getGaussianVec(double variance, double quality);
 SwsVector *getConstVec(double c, int length);
 SwsVector *getIdentityVec(void);
--- a/postproc/swscale_template.c	Wed Feb 06 20:30:34 2002 +0000
+++ b/postproc/swscale_template.c	Wed Feb 06 20:52:14 2002 +0000
@@ -2192,7 +2192,7 @@
 	uint8_t *src[3];
 	uint8_t *dst[3];
 	
-	if((c->srcFormat == IMGFMT_IYUV) || (c->srcFormat == IMGFMT_I420)){
+	if(c->srcFormat == IMGFMT_I420){
 		src[0]= srcParam[0];
 		src[1]= srcParam[2];
 		src[2]= srcParam[1];
@@ -2225,7 +2225,7 @@
 		srcStride[2]= 0;
 	}
 
-	if((c->dstFormat == IMGFMT_IYUV) || (c->dstFormat == IMGFMT_I420)){
+	if(c->dstFormat == IMGFMT_I420){
 		dst[0]= dstParam[0];
 		dst[1]= dstParam[2];
 		dst[2]= dstParam[1];
@@ -2235,7 +2235,9 @@
 		dst[1]= dstParam[1];
 		dst[2]= dstParam[2];
 	}
-	
+
+//printf("sws Strides:%d %d %d -> %d %d %d\n", srcStride[0],srcStride[1],srcStride[2],
+//dstStride[0],dstStride[1],dstStride[2]);
 
 	if(dstStride[0]%8 !=0 || dstStride[1]%8 !=0 || dstStride[2]%8 !=0)
 	{