[FFmpeg-devel] [WIP] rotate filter(s)
Stefano Sabatini
stefano.sabatini-lala
Tue Oct 5 21:38:06 CEST 2010
On date Tuesday 2010-10-05 14:36:19 +0200, Michael Niedermayer encoded:
> On Mon, Oct 04, 2010 at 10:27:29PM +0200, Stefano Sabatini wrote:
[...]
> > +/**
> > + * Interpolate the color in src at position x and y using bilinear
> > + * interpolation.
> > + *
> > + * @param dst_color put here the destination color
> > + */
> > +static uint8_t *ipol(uint8_t *dst_color,
> > + const uint8_t *src, const int src_linesize, int x, int y,
> > + int max_x, int max_y)
> > +{
> > + int int_x = x>>16;
> > + int int_y = y>>16;
> > + int frac_x = x&0xFFFF;
> > + int frac_y = y&0xFFFF;
> > + int i;
> > +
> > + for (i = 0; i < 3; i++) {
> > + int s00 = src[3 * int_x + i + src_linesize * int_y];
> > + int s01 = src[3 * FFMIN(int_x+1,max_x) + i + src_linesize * int_y];
> > + int s10 = src[3 * int_x + i + src_linesize * FFMIN(int_y+1, max_y)];
> > + int s11 = src[3 * FFMIN(int_x+1,max_x) + i + src_linesize * FFMIN(int_y+1, max_y)];
> > + int s0 = (((1<<16) - frac_x)*s00 + frac_x*s01)>>8;
> > + int s1 = (((1<<16) - frac_x)*s10 + frac_x*s11)>>8;
> > +
> > + dst_color[i] = (((1<<16) - frac_y)*s0 + frac_y*s1)>>24;
> > + }
>
> the >>8 can be avoided by adjusting perecission sanely
> the FFMIN doesnt belong in the loop
I can do:
int s0 = ((1<<16) - frac_x)*s00 + frac_x*s01;
int s1 = ((1<<16) - frac_x)*s10 + frac_x*s11;
dst_color[i] = (((int64_t)(1<<16) - frac_y)*s0 + (int64_t)frac_y*s1)>>32;
Is this what you suggest?
Stupid question: what's this supposed to make us gain? (I suppose may
be in term of precision, speed-wise I suppose this is slower...).
Regards.
--
FFmpeg = Friendly and Fantastic Martial Peaceful Elfic Glue
More information about the ffmpeg-devel
mailing list