summaryrefslogtreecommitdiffstats
path: root/postproc/swscale.h
blob: 8c6c0543d3b4d49ce1082f46e899a557cb7c4d85 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

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