This filter uses RGB mode, for which bicubic is broken. vid.stab still
to this day uses bilinear with packed pixel formats. In order to fix
bilinear, needed to remove extra calls to floor function.
// Load analysis results from property
data->initialized = 2;
// Load analysis results from property
data->initialized = 2;
+ int interp = 2; // default to bilinear
float scale_zoom=1.0;
if ( *width != mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "meta.media.width" ) )
scale_zoom = (float) *width / (float) mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "meta.media.width" );
float scale_zoom=1.0;
if ( *width != mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "meta.media.width" ) )
scale_zoom = (float) *width / (float) mlt_properties_get_int( MLT_FRAME_PROPERTIES( frame ), "meta.media.width" );
interp = 0;
else if ( strcmp( interps, "tiles" ) == 0 || strcmp( interps, "fast_bilinear" ) == 0 )
interp = 1;
interp = 0;
else if ( strcmp( interps, "tiles" ) == 0 || strcmp( interps, "fast_bilinear" ) == 0 )
interp = 1;
- else if ( strcmp( interps, "bilinear" ) == 0 )
- interp = 2;
- else if ( strcmp( interps, "bicubic" ) == 0 )
- interp = 3;
- else if ( strcmp( interps, "bicublin" ) == 0 )
- interp = 4;
data->trans->interpoltype = interp;
data->trans->smoothing = mlt_properties_get_int( MLT_FILTER_PROPERTIES(filter), "smoothing" );
data->trans->interpoltype = interp;
data->trans->smoothing = mlt_properties_get_int( MLT_FILTER_PROPERTIES(filter), "smoothing" );
|-1, 3,-3, 1 | |a3|
*/
static short bicub_kernel(float t, short a0, short a1, short a2, short a3){
|-1, 3,-3, 1 | |a3|
*/
static short bicub_kernel(float t, short a0, short a1, short a2, short a3){
- return (2*a1 + t*((-a0+a2) + t*((2*a0-5*a1+4*a2-a3) + t*(-a0+3*a1-3*a2+a3) )) ) / 2;
+ return (2*a1 + t*((-a0+a2) + t*((2*a0-5*a1+4*a2-a3) + t*(-a0+3*a1-3*a2+a3) )) ) / 2;
}
/** interpolateBiCub: bi-cubic interpolation function using 4x4 pixel, see interpolate */
}
/** interpolateBiCub: bi-cubic interpolation function using 4x4 pixel, see interpolate */
+ zcos_a * y_d1 + c_s_y -t.y;
for (z = 0; z < 3; z++) { // iterate over colors
unsigned char* dest = &D_2[(x + y * td->width_dest)*3+z];
+ zcos_a * y_d1 + c_s_y -t.y;
for (z = 0; z < 3; z++) { // iterate over colors
unsigned char* dest = &D_2[(x + y * td->width_dest)*3+z];
- interpolate(dest, myfloor(x_s), myfloor(y_s), D_1,
+ interpolate(dest, x_s, y_s, D_1,
td->width_src, td->height_src,
td->crop ? 16 : *dest,3,z);
}
td->width_src, td->height_src,
td->crop ? 16 : *dest,3,z);
}