typedef struct {
mlt_filter parent;
int initialized;
+ int* lanc_kernels;
es_ctx *es;
vc *pos_i;
vc *pos_h;
int i;
for (i = 0; i < h; i ++)
- self->pos_y[i] = interp( self->pos_h, length, pos + (i - h / 2.0) * shutter_angle / (h * 360.0) );
- rs_resample( self->rs, *image, self->pos_y );
+ self->pos_y[i] = interp( self->lanc_kernels,self->pos_h, length, pos + (i - h / 2.0) * shutter_angle / (h * 360.0) );
+ rs_resample( self->lanc_kernels,self->rs, *image, self->pos_y );
}
}
mlt_service_unlock( MLT_FILTER_SERVICE( filter ) );
if ( self->pos_h ) free( self->pos_h );
if ( self->pos_y ) free( self->pos_y );
if ( self->rs ) rs_free( self->rs );
- free_lanc_kernels();
+ if ( self->lanc_kernels) free_lanc_kernels(self->lanc_kernels);
free( self );
parent->close = NULL;
parent->child = NULL;
parent->process = filter_process;
self->parent = parent;
mlt_properties_set( MLT_FILTER_PROPERTIES(parent), "shutterangle", "0" ); // 0 - 180 , default 0
- prepare_lanc_kernels();
+ self->lanc_kernels=prepare_lanc_kernels();
return parent;
}
return NULL;
rs_ctx *rs = (rs_ctx *)malloc(sizeof(rs_ctx));
rs->tf = (unsigned char *)malloc(nc * nr * 3 * sizeof(unsigned char));
-
+
rs->nc = nc;
rs->nr = nr;
return rs;
}
-void rs_resample(rs_ctx *rs, unsigned char *f, vc *p) {
+void rs_resample(int* lanc_kernels,rs_ctx *rs, unsigned char *f, vc *p) {
int i, x, y, c;
int yp = y * rs->nc;
int xd = floor(p[y].x);
- int *lk = select_lanc_kernel(p[y].x);
+ int *lk = select_lanc_kernel(lanc_kernels,p[y].x);
for (x = 0; x < rs->nc; x ++) {
int pd = (yp + x) * 3;
int a[3];
-
+
for (c = 0; c < 3; c ++)
a[c] = 0;
for (i = -3; i < 5; i ++) {
-
+
int ps = (yp + clamp(x + xd + i, 0, rs->nc - 1)) * 3;
for (c = 0; c < 3; c ++)
a[c] += f[ps + c] * lk[i + 3];
}
-
+
for (c = 0; c < 3; c ++)
rs->tf[pd + c] = clamp(a[c] / 1024, 0, 255);
}
int yp = y * rs->nc;
int yd = floor(p[y].y);
- int *lk = select_lanc_kernel(p[y].y);
+ int *lk = select_lanc_kernel(lanc_kernels,p[y].y);
for (x = 0; x < rs->nc; x ++) {
int pd = (yp + x) * 3;
int a[3];
-
+
for (c = 0; c < 3; c ++)
a[c] = 0;
-
+
for (i = -3; i < 5; i ++) {
-
+
int ps = (clamp(y + yd + i, 0, rs->nr - 1) * rs->nc + x) * 3;
for (c = 0; c < 3; c ++)
rs_ctx *rs_init(int, int);
-void rs_resample(rs_ctx *, unsigned char *, vc *);
+void rs_resample(int*,rs_ctx *, unsigned char *, vc *);
void rs_free(rs_ctx *);
#include "utils.h"
-int *lanc_kernels = NULL;
-
float lanc(float x, float r) {
float t = x * M_PI;
if (x <= -r || x >= r)
return 0.0;
-
+
return r * sin(t) * sin(t / r) / (t * t);
}
cw += ck[i] = hann(i, d - 1);
for (i = 0; i < l; i ++) {
-
+
vc a = vc_zero();
for (j = i - r; j <= i + r; j ++) {
vo[i] = vc_div(a, cw);
}
-
+
free(ck);
}
vo[i] = vc_sub(vi[i], vo[i]);
}
-void prepare_lanc_kernels() {
+int* prepare_lanc_kernels() {
int i, j;
- lanc_kernels = (int *)malloc(256 * 8 * sizeof(int));
+ int* lanc_kernels = (int *)malloc(256 * 8 * sizeof(int));
for (i = 0; i < 256; i ++)
for (j = -3; j < 5; j ++)
lanc_kernels[i * 8 + j + 3] = lanc(j - i / 256.0, 4) * 1024.0;
+ return lanc_kernels;
}
-int *select_lanc_kernel(float x) {
+int *select_lanc_kernel(int* lanc_kernels,float x) {
return lanc_kernels + (int)((x - floor(x)) * 256.0) * 8;
}
-void free_lanc_kernels() {
+void free_lanc_kernels(int *lanc_kernels) {
free(lanc_kernels);
}
-vc interp(vc *vi, int l, float x) {
+vc interp(int* lanc_kernels, vc *vi, int l, float x) {
vc a = vc_zero();
int xd = floor(x);
- int *lk = select_lanc_kernel(x);
+ int *lk = select_lanc_kernel(lanc_kernels,x);
int i;
for (i = -3; i < 5; i ++) {
-
+
int ic = clamp(xd + i, 0, l - 1);
vc_mul_acc(&a, vi[ic], lk[i + 3]);
#define FALSE 0
#endif
-int *lanc_kernels;
float lanc(float, float);
float hann(float, float);
void lopass(vc *, vc *, int, int);
void hipass(vc *, vc *, int, int);
-void prepare_lanc_kernels();
-int *select_lanc_kernel(float);
-void free_lanc_kernels();
+int* prepare_lanc_kernels();
+int *select_lanc_kernel(int*,float);
+void free_lanc_kernels(int*);
-vc interp(vc *, int, float);
+vc interp(int*,vc *, int, float);
#endif