ffmpeg/postproc/swscale.h
Michael Niedermayer 28bf81c90d removed global vars so that multiple swscalers can be used
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
2002-01-20 05:30:23 +00:00

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);