[FFmpeg-devel] [PATCH] Common ACELP routines (2/3) - filters

Vladimir Voroshilov voroshil
Fri Apr 25 07:42:11 CEST 2008


On Fri, Apr 25, 2008 at 10:18 AM, Vladimir Voroshilov
<voroshil at gmail.com> wrote:
>
> Michael Niedermayer wrote:
>  > On Fri, Apr 25, 2008 at 08:22:15AM +0700, Vladimir Voroshilov wrote:
>  > > On Fri, Apr 25, 2008 at 1:17 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
>  > > > On Fri, Apr 25, 2008 at 12:07:15AM +0700, Vladimir Voroshilov wrote:
>  > > >  > On Thu, Apr 24, 2008 at 10:13 AM, Michael Niedermayer <michaelni at gmx.at> wrote:
>  > > >  [...]
>  > > >
>  > > >
>  > > > > >  > > > +        filter_data[10+n] = out[n] = sum;
>  > > >  > >  > >
>  > > >  > >  > > This duplicated storeage is unacceptable.
>  > > >  > >  >
>  > > >  > >  > First for all assigned to filter data values will be used in loop later.
>  > > >  > >  > Thus filter_data can not be eliminated.
>  > > >  > >  > I can't use "out" instead of it due to necessary 10 items
>  > > >  > >  > with data from previous subframe at top).
>  > > >  > >  > Extending out with 10 items at top will require another temporary buffer
>  > > >  > >  > one memcpy somewhere later (because i will not be able to use output buffer
>  > > >  > >  > directly).
>  > > >  > >
>  > > >  > >  The double write is definitly useless after the first 10 iterations as
>  > > >  > >  after that you can just work in the out buffer.
>  > > >  > >
>  > > >  > >  foobar_filter(filter_data+10, 10);
>  > > >  > >  memcpy(out, filter_data+10, 10);
>  > > >  > >  foobar_filter(out+10, N-10);
>  > > >  > >
>  > > >  > >  should work fine and will for large N (dunno how large it is, so maybe
>  > > >  > >  this isnt worth it ...) be faster. Also it allows filter_data to be smaller.
>  > > >  >
>  > > >  > ... and code will look like :(
>  > > >  >
>  > > >  > if(foobar_filter(filter_data+10, 10)!=OVERFLOW)
>  > > >  > {
>  > > >  >   memcpy(out, filter_data+10, 10);
>  > > >  >   if(foobar_filter(out+10, N-10)==OVERFLOW)
>  > > >  >   {
>  > > >  >      for(i=0;i<len;i++) out>>=2;
>  > > >  >      foobar_filter(filter_data+10, 10);
>  > > >  >      memcpy(out, filter_data+10, 10);
>  > > >  >      foobar_filter(out+10, N-10);
>  > > >  >   }
>  > > >  > }
>  > > >  > else
>  > > >  > {
>  > > >  >      for(i=0;i<len;i++) out>>=2;
>  > > >  >      foobar_filter(filter_data+10, 10);
>  > > >  >      memcpy(out, filter_data+10, 10);
>  > > >  >      foobar_filter(out+10, N-10);
>  > > >  > }
>  > > >
>  > > >  for(;;){
>  > > >     overflow= foobar_filter(filter_data+10, 10);
>  > > >
>  > > >     memcpy(out, filter_data+10, 10);
>  > > >     overflow|= foobar_filter(out+10, N-10);
>  > > >     if(!overflow)
>  > > >         break;
>  > > >
>  > > >     for(i=0;i<len;i++) out>>=2;
>  > > >  }
>  > >
>  > > This will change filter_data even if overflow occuried.
>  > > Which cause wrong synthesis result on second iteration.
>  > > Current code on overflow case just downscales
>  > > excitation signal (without touching filter data).
>  >
>  > well its a matter of adding if(!overflow)
>
>
> I'm afraid you misunderstand me.

Please, don't take this mail in mind.
Looks like i'm wrong again.
I'll recheck all things again and give you results.

-- 
Regards,
Vladimir Voroshilov mailto:voroshil at gmail.com
JID: voroshil at gmail.com, voroshil at jabber.ru
ICQ: 95587719




More information about the ffmpeg-devel mailing list