38 static inline unsigned int LowPassMul(
unsigned int PrevMul,
unsigned int CurrMul,
int *Coef)
41 int dMul= PrevMul-CurrMul;
42 unsigned int d=((dMul+0x10007FF)>>12);
43 return CurrMul + Coef[d];
47 unsigned char *FrameDest,
48 unsigned short *FrameAnt,
49 int W,
int H,
int sStride,
int dStride,
53 unsigned int PixelDst;
55 for (Y = 0; Y <
H; Y++) {
56 for (X = 0; X <
W; X++) {
57 PixelDst =
LowPassMul(FrameAnt[X]<<8, FrameSrc[X]<<16, Temporal);
58 FrameAnt[X] = ((PixelDst+0x1000007F)>>8);
59 FrameDest[X]= ((PixelDst+0x10007FFF)>>16);
68 unsigned char *FrameDest,
69 unsigned int *LineAnt,
70 int W,
int H,
int sStride,
int dStride,
71 int *Horizontal,
int *Vertical)
74 long sLineOffs = 0, dLineOffs = 0;
75 unsigned int PixelAnt;
76 unsigned int PixelDst;
79 PixelDst = LineAnt[0] = PixelAnt = Frame[0]<<16;
80 FrameDest[0]= ((PixelDst+0x10007FFF)>>16);
83 for (X = 1; X <
W; X++) {
84 PixelDst = LineAnt[X] =
LowPassMul(PixelAnt, Frame[X]<<16, Horizontal);
85 FrameDest[X]= ((PixelDst+0x10007FFF)>>16);
88 for (Y = 1; Y <
H; Y++) {
89 unsigned int PixelAnt;
90 sLineOffs += sStride, dLineOffs += dStride;
92 PixelAnt = Frame[sLineOffs]<<16;
93 PixelDst = LineAnt[0] =
LowPassMul(LineAnt[0], PixelAnt, Vertical);
94 FrameDest[dLineOffs]= ((PixelDst+0x10007FFF)>>16);
96 for (X = 1; X <
W; X++) {
97 unsigned int PixelDst;
99 PixelAnt =
LowPassMul(PixelAnt, Frame[sLineOffs+X]<<16, Horizontal);
100 PixelDst = LineAnt[X] =
LowPassMul(LineAnt[X], PixelAnt, Vertical);
101 FrameDest[dLineOffs+X]= ((PixelDst+0x10007FFF)>>16);
107 unsigned char *FrameDest,
108 unsigned int *LineAnt,
109 unsigned short **FrameAntPtr,
110 int W,
int H,
int sStride,
int dStride,
111 int *Horizontal,
int *Vertical,
int *Temporal)
114 long sLineOffs = 0, dLineOffs = 0;
115 unsigned int PixelAnt;
116 unsigned int PixelDst;
117 unsigned short* FrameAnt=(*FrameAntPtr);
120 (*FrameAntPtr) = FrameAnt =
av_malloc(W*H*
sizeof(
unsigned short));
121 for (Y = 0; Y <
H; Y++) {
122 unsigned short* dst=&FrameAnt[Y*
W];
123 unsigned char* src=Frame+Y*sStride;
124 for (X = 0; X <
W; X++) dst[X]=src[X]<<8;
128 if (!Horizontal[0] && !Vertical[0]) {
130 W, H, sStride, dStride, Temporal);
135 W, H, sStride, dStride, Horizontal, Vertical);
140 LineAnt[0] = PixelAnt = Frame[0]<<16;
141 PixelDst =
LowPassMul(FrameAnt[0]<<8, PixelAnt, Temporal);
142 FrameAnt[0] = ((PixelDst+0x1000007F)>>8);
143 FrameDest[0]= ((PixelDst+0x10007FFF)>>16);
147 for (X = 1; X <
W; X++) {
148 LineAnt[X] = PixelAnt =
LowPassMul(PixelAnt, Frame[X]<<16, Horizontal);
149 PixelDst =
LowPassMul(FrameAnt[X]<<8, PixelAnt, Temporal);
150 FrameAnt[X] = ((PixelDst+0x1000007F)>>8);
151 FrameDest[X]= ((PixelDst+0x10007FFF)>>16);
154 for (Y = 1; Y <
H; Y++) {
155 unsigned int PixelAnt;
156 unsigned short* LinePrev=&FrameAnt[Y*
W];
157 sLineOffs += sStride, dLineOffs += dStride;
159 PixelAnt = Frame[sLineOffs]<<16;
160 LineAnt[0] =
LowPassMul(LineAnt[0], PixelAnt, Vertical);
161 PixelDst =
LowPassMul(LinePrev[0]<<8, LineAnt[0], Temporal);
162 LinePrev[0] = ((PixelDst+0x1000007F)>>8);
163 FrameDest[dLineOffs]= ((PixelDst+0x10007FFF)>>16);
165 for (X = 1; X <
W; X++) {
166 unsigned int PixelDst;
168 PixelAnt =
LowPassMul(PixelAnt, Frame[sLineOffs+X]<<16, Horizontal);
169 LineAnt[X] =
LowPassMul(LineAnt[X], PixelAnt, Vertical);
170 PixelDst =
LowPassMul(LinePrev[X]<<8, LineAnt[X], Temporal);
171 LinePrev[X] = ((PixelDst+0x1000007F)>>8);
172 FrameDest[dLineOffs+X]= ((PixelDst+0x10007FFF)>>16);
180 double Gamma, Simil, C;
182 Gamma = log(0.25) / log(1.0 - Dist25/255.0 - 0.00001);
184 for (i = -255*16; i <= 255*16; i++) {
185 Simil = 1.0 -
FFABS(i) / (16*255.0);
186 C = pow(Simil, Gamma) * 65536.0 * i / 16.0;
187 Ct[16*256+i] =
lrint(C);
193 #define PARAM1_DEFAULT 4.0
194 #define PARAM2_DEFAULT 3.0
195 #define PARAM3_DEFAULT 6.0
200 double LumSpac, LumTmp, ChromSpac, ChromTmp;
201 double Param1, Param2, Param3, Param4;
206 ChromTmp = LumTmp * ChromSpac / LumSpac;
209 switch (sscanf(args,
"%lf:%lf:%lf:%lf",
210 &Param1, &Param2, &Param3, &Param4)) {
215 ChromTmp = LumTmp * ChromSpac / LumSpac;
221 ChromTmp = LumTmp * ChromSpac / LumSpac;
227 ChromTmp = LumTmp * ChromSpac / LumSpac;
239 LumSpac, ChromSpac, LumTmp, ChromTmp);
240 if (LumSpac < 0 || ChromSpac < 0 || isnan(ChromTmp)) {
242 "Invalid negative value for luma or chroma spatial strength, "
243 "or resulting value for chroma temporal strength is nan.\n");