view postproc/swscale.h @ 4279:4301c4adbcf7

reported working at 1600x1200 too, pciconfig stuff fixed, you can enable it with #define MGA_PCICONFIG_MEMDETECT
author alex
date Sun, 20 Jan 2002 13:11:23 +0000
parents 9199d15cb4e0
children 1f8ceb12284d
line wrap: on
line source


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