diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2002-01-29 02:57:18 +0300 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2002-01-29 02:57:18 +0300 |
commit | ff7ba85694e9b7344ed673dc88f2af5395d3dcc4 (patch) | |
tree | c2208e5b3b3d88f1d74b1aa91075af1f69d940ae | |
parent | bdd677ac1359df5615ede8813160cbaf373964b5 (diff) |
nearest neighbor / sdl emulation ;) scaling (-sws 4)
Originally committed as revision 4402 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
-rw-r--r-- | postproc/swscale.c | 27 | ||||
-rw-r--r-- | postproc/swscale.h | 1 |
2 files changed, 26 insertions, 2 deletions
diff --git a/postproc/swscale.c b/postproc/swscale.c index 07cacfab01..dc52b2677e 100644 --- a/postproc/swscale.c +++ b/postproc/swscale.c @@ -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; diff --git a/postproc/swscale.h b/postproc/swscale.h index fb47ab8bdb..c00260fe67 100644 --- a/postproc/swscale.h +++ b/postproc/swscale.h @@ -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 |