[FFmpeg-devel] [PATCH] WMA Voice decoder

Vitor Sessak vitor1001
Wed Feb 3 04:24:49 CET 2010


Ronald S. Bultje wrote:
> Hi,
> 
> On Sat, Jan 30, 2010 at 8:06 PM, Vitor Sessak <vitor1001 at gmail.com> wrote:
>> Ronald S. Bultje wrote:
>>> +    if (frame_desc->acb_type == 1) {
>>> +        for (n = 0; n < size; n++) {
>>> +            int pitch_sh8 = (s->last_pitch_val << 8) +
>>> +                ((s->pitch_diff_sh16 * (block_idx * size + n)) >> 8);
>>> +            int pitch = (pitch_sh8 + 0x6F) >> 8;
>>> +            idx = (((pitch << 8) - pitch_sh8) * 8 + 0x80) >> 8;
>>> +            //FIXME don't call this with len=1
>>> +            ff_acelp_interpolatef(&excitation[n], &excitation[n - pitch],
>>> +                                  ff_wmavoice_ipol1_coeffs, 17,
>>> +                                  (idx >= 0) | (abs(idx) << 1), 9, 1);
>> I think you can at least call this with len=s->pitch_diff_sh16 or something
>> like that (since pitch_sh8 seems to change only after a certain fixed number
>> of iterations). Also it will not stay in the way for SIMD optimizations.
> 
> How about this?
> 
>         int len;
>         for (n = 0; n < size; n += len) {
>             int next_idx_sh16;
>             int abs_idx    = block_idx * size + n;
>             int pitch_sh16 = (s->last_pitch_val << 16) +
>                              s->pitch_diff_sh16 * abs_idx;
>             int pitch      = (pitch_sh16 + 0x6FFF) >> 16;
>             int idx_sh16   = ((pitch << 16) - pitch_sh16) * 8 + 0x8000;
>             idx            = idx_sh16 >> 16;
>             if (s->pitch_diff_sh16) {
>                 if (s->pitch_diff_sh16 > 0) {
>                     next_idx_sh16 = (idx_sh16) &~ 0xFFFF;
>                 } else
>                     next_idx_sh16 = (idx_sh16 + 0x10000) &~ 0xFFFF;

If you could get rid of a few of the shifts, readability would certainly 
improve.

>                 len = av_clip((idx_sh16 - next_idx_sh16) /
> s->pitch_diff_sh16 / 8,
>                               1, size - n);
>             } else
>                 len = size;
> 
>             ff_acelp_interpolatef(&excitation[n], &excitation[n - pitch],
>                                   wmavoice_ipol1_coeffs, 17,
>                                   (idx >= 0) + abs(idx) * 2, 9, len);
>         }
> 
> Little bit ugly, but this is my first try which actually works.
> Sometimes len is one too small, not sure why, so then
> ff_acelp_interpolatef() is called twice with the same value, once with
> len = one too short and once with len=1. That shouldn't be too bad. If
> someone has good ideas on how to de-uglify this (or just outright
> rejects it), let me know. Otherwise, it'll be part of the next patch.

IMO it looks much better than previous version. What is the typical 
value of len? I hope that if the calculation of pitch_* above gets 
simplified, we can see a better way of doing it.

-Vitor



More information about the ffmpeg-devel mailing list