28bf81c90d
experimental upscaling mode (-sws 3) general convolution filters support (unfinished) bugfix for bicubic upscaling assertion checking if defined MP_DEBUG checking of the input/output size instead of segfault if its very large Originally committed as revision 4277 to svn://svn.mplayerhq.hu/mplayer/trunk/postproc
91 lines
2.8 KiB
C
91 lines
2.8 KiB
C
|
|
/* values for the flags, the stuff on the command line is different */
|
|
#define SWS_FAST_BILINEAR 1
|
|
#define SWS_BILINEAR 2
|
|
#define SWS_BICUBIC 4
|
|
#define SWS_X 8
|
|
#define SWS_FULL_UV_IPOL 0x100
|
|
#define SWS_PRINT_INFO 0x1000
|
|
|
|
#define SWS_MAX_SIZE 2000
|
|
|
|
/* this struct should be aligned on at least 32-byte boundary */
|
|
typedef struct{
|
|
int srcW, srcH, dstW, dstH;
|
|
int chrDstW, chrDstH;
|
|
int lumXInc, chrXInc;
|
|
int lumYInc, chrYInc;
|
|
int dstFormat, srcFormat;
|
|
int16_t __attribute__((aligned(8))) *lumPixBuf[SWS_MAX_SIZE];
|
|
int16_t __attribute__((aligned(8))) *chrPixBuf[SWS_MAX_SIZE];
|
|
int16_t __attribute__((aligned(8))) hLumFilter[SWS_MAX_SIZE*5];
|
|
int16_t __attribute__((aligned(8))) hLumFilterPos[SWS_MAX_SIZE];
|
|
int16_t __attribute__((aligned(8))) hChrFilter[SWS_MAX_SIZE*5];
|
|
int16_t __attribute__((aligned(8))) hChrFilterPos[SWS_MAX_SIZE];
|
|
int16_t __attribute__((aligned(8))) vLumFilter[SWS_MAX_SIZE*5];
|
|
int16_t __attribute__((aligned(8))) vLumFilterPos[SWS_MAX_SIZE];
|
|
int16_t __attribute__((aligned(8))) vChrFilter[SWS_MAX_SIZE*5];
|
|
int16_t __attribute__((aligned(8))) vChrFilterPos[SWS_MAX_SIZE];
|
|
|
|
// Contain simply the values from v(Lum|Chr)Filter just nicely packed for mmx
|
|
int16_t __attribute__((aligned(8))) lumMmxFilter[SWS_MAX_SIZE*20];
|
|
int16_t __attribute__((aligned(8))) chrMmxFilter[SWS_MAX_SIZE*20];
|
|
|
|
int hLumFilterSize;
|
|
int hChrFilterSize;
|
|
int vLumFilterSize;
|
|
int vChrFilterSize;
|
|
int vLumBufSize;
|
|
int vChrBufSize;
|
|
|
|
uint8_t __attribute__((aligned(32))) funnyYCode[10000];
|
|
uint8_t __attribute__((aligned(32))) funnyUVCode[10000];
|
|
|
|
int canMMX2BeUsed;
|
|
|
|
int lastInLumBuf;
|
|
int lastInChrBuf;
|
|
int lumBufIndex;
|
|
int chrBufIndex;
|
|
int dstY;
|
|
int flags;
|
|
} SwsContext;
|
|
//FIXME check init (where 0)
|
|
|
|
typedef struct {
|
|
double *lumH;
|
|
double *lumV;
|
|
double *chrH;
|
|
double *chrV;
|
|
int length;
|
|
} SwsFilter;
|
|
|
|
|
|
// *** bilinear scaling and yuv->rgb & yuv->yuv conversion of yv12 slices:
|
|
// *** Note: it's called multiple times while decoding a frame, first time y==0
|
|
// dstbpp == 12 -> yv12 output
|
|
// will use sws_flags
|
|
void SwScale_YV12slice(unsigned char* src[],int srcStride[], int srcSliceY,
|
|
int srcSliceH, uint8_t* dst[], int dstStride, int dstbpp,
|
|
int srcW, int srcH, int dstW, int dstH);
|
|
|
|
// Obsolete, will be removed soon
|
|
void SwScale_Init();
|
|
|
|
|
|
|
|
void freeSwsContext(SwsContext swsContext);
|
|
|
|
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[]);
|
|
|
|
double *getGaussian(double variance, double quality);
|
|
|
|
void normalize(double *coeff, int length, double height);
|
|
|
|
double *conv(double *a, int aLength, double *b, int bLength);
|
|
|