[FFmpeg-devel] [PATCH] WMA Voice decoder

Reimar Döffinger Reimar.Doeffinger
Thu Jan 21 20:45:30 CET 2010


On Thu, Jan 21, 2010 at 02:06:56PM -0500, Ronald S. Bultje wrote:
> Hi,
> 
> On Thu, Jan 21, 2010 at 1:52 PM, Reimar D?ffinger
> <Reimar.Doeffinger at gmx.de> wrote:
> > I suspect that he means that FAST_DIV should be overkill for this
> > usage.
> 
> OK, I'll expand it properly then.
> 
> > Well, if you copy-pasted correctly, yes
> > FAST_DIV(x, 9) / 9
> > instead of
> > FAST_DIV(x, 9) * 9
> 
> Oops, right. Well, c/p error, numbers still differ.
> 
>     int z, y, x = block_num * 1877 + frame_cntr;
>     if (x >= 0xFFFF) x -= 0xFFFF; ///< max value of x is 8*1877+0xFFFE=0x13AA6,
>                                   ///< so this is effectively a modulo (%)
>     y = (x - 9 * (int)((477218589ULL * x) >> 32)) * 5 + 6; ///< (x % 9) * 5 + 6

Doxy-style makes no sense for code comments, only for declarations.

>     z = (uint16_t) (x * 49995 / y);
>     return z % (1000 - block_size);
> 
> That'll be it? (The int cast makes sure gcc doesn't do anything stupid
> like keeping it as a 64-bit number after the >> 32, does that make
> sense?)

That's going to be silly slow, you should use
y = x - 9 * MULH(477218589, x); // y = x % 9
(you could here add a "assert(y == x % 9);" to make sure there's no bug
while testing it).
y = y * 5 + 6;
Apart from that it should be identical.



More information about the ffmpeg-devel mailing list