nearest neighbor / sdl emulation ;) scaling (-sws 4)
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 28 Jan 2002 23:57:18 +0000 (23:57 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 28 Jan 2002 23:57:18 +0000 (23:57 +0000)
Originally committed as revision 4402 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc

postproc/swscale.c
postproc/swscale.h

index 07cacfa..dc52b26 100644 (file)
@@ -69,10 +69,13 @@ Special versions: fast Y 1:1 scaling (no interpolation in y direction)
 
 TODO
 more intelligent missalignment avoidance for the horizontal scaler
-dither in C
 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
+add support for Y8 input & output
+add BGR4 output support
+add BGR32 / BGR24 input support
 */
 
 #define ABS(a) ((a) > 0 ? (a) : (-(a)))
@@ -600,6 +603,7 @@ void SwScale_YV12slice(unsigned char* src[], int srcStride[], int srcSliceY ,
                case 1: flags|= SWS_BILINEAR; break;
                case 2: flags|= SWS_BICUBIC; break;
                case 3: flags|= SWS_X; break;
+               case 4: flags|= SWS_POINT; break;
                default:flags|= SWS_BILINEAR; break;
        }
 
@@ -639,6 +643,23 @@ static inline void initFilter(int16_t **outFilter, int16_t **filterPos, int *out
                }
 
        }
+       else if(flags&SWS_POINT) // lame looking point sampling mode
+       {
+               int i;
+               int xDstInSrc;
+               filterSize= 1;
+               filter= (double*)memalign(8, dstW*sizeof(double)*filterSize);
+               
+               xDstInSrc= xInc/2 - 0x8000;
+               for(i=0; i<dstW; i++)
+               {
+                       int xx= (xDstInSrc>>16) - (filterSize>>1) + 1;
+
+                       (*filterPos)[i]= xx;
+                       filter[i]= 1.0;
+                       xDstInSrc+= xInc;
+               }
+       }
        else if(xInc <= (1<<16) || (flags&SWS_FAST_BILINEAR)) // upscale
        {
                int i;
@@ -1203,6 +1224,8 @@ SwsContext *getSwsContext(int srcW, int srcH, int srcFormat, int dstW, int dstH,
                        fprintf(stderr, "\nSwScaler: BILINEAR scaler ");
                else if(flags&SWS_BICUBIC)
                        fprintf(stderr, "\nSwScaler: BICUBIC scaler ");
+               else if(flags&SWS_POINT)
+                       fprintf(stderr, "\nSwScaler: POINT scaler ");
                else
                        fprintf(stderr, "\nSwScaler: ehh flags invalid?! ");
 
@@ -1430,7 +1453,7 @@ static SwsVector *diffVec(SwsVector *a, SwsVector *b){
 static SwsVector *getShiftedVec(SwsVector *a, int shift){
        int length= a->length + ABS(shift)*2;
        double *coeff= memalign(sizeof(double), length*sizeof(double));
-       int i, j;
+       int i;
        SwsVector *vec= malloc(sizeof(SwsVector));
 
        vec->coeff= coeff;
index fb47ab8..c00260f 100644 (file)
@@ -21,6 +21,7 @@
 #define SWS_BILINEAR 2
 #define SWS_BICUBIC  4
 #define SWS_X        8
+#define SWS_POINT    0x10
 #define SWS_FULL_UV_IPOL 0x100
 #define SWS_PRINT_INFO 0x1000