[FFmpeg-devel] [PATCH] adpcm: Use a hash table to improve chcking for duplicate samples

Michael Niedermayer michaelni
Fri Nov 19 14:37:07 CET 2010


On Fri, Nov 19, 2010 at 09:42:44AM +0200, Martin Storsj? wrote:
> On Fri, 19 Nov 2010, Michael Niedermayer wrote:
> 
> > On Thu, Nov 18, 2010 at 11:19:04PM +0200, Martin Storsj? wrote:
> > > Hi,
> > > 
> > > With the attached patch #1, the runtime for -trellis 8 drops from 158 to 
> > > 21 seconds, for my 30 second sample, see 
> > > http://albin.abo.fi/~mstorsjo/adpcm-graphs3/hash.pdf for details on that, 
> > > compared to the current trunk and compared to the old original code. This 
> > > speeds up things enough to actually be able to run all the way to -trellis 
> > > 15 within reasonable time (running into the issue with ssd wrapping 
> > > around, as I sent a patch for earlier), and one notices that it exhausts 
> > > all testable combinations at around -trellis 10, where the PSNR doesn't 
> > > really increase any longer.
> > > 
> > > As discussed earlier, the skipping when a matching sample is found could 
> > > also be done only if the ssd actually is worse than for that one. 
> > > Curiously enough, it gives slightly worse results (and slows things down 
> > > quite a bit), see 
> > > http://albin.abo.fi/~mstorsjo/adpcm-graphs3/with_without_check.pdf.
> > > 
> > > The second patch gives a slight, 0.1 dB increase in PSNR.
> > [...]
> > > @@ -393,6 +407,7 @@ static void adpcm_compress_trellis(AVCodecContext *avctx, const short *samples,
> > >                          if (ssd > nodes_next[pos]->ssd)\
> > >                              goto next_##NAME;\
> > >                      }\
> > > +                    *h = generation;\
> > >                      u = nodes_next[pos];\
> > >                      if(!u) {\
> > >                          assert(pathn < FREEZE_INTERVAL<<avctx->trellis);\
> > > @@ -442,6 +457,7 @@ static void adpcm_compress_trellis(AVCodecContext *avctx, const short *samples,
> > >          u = nodes;
> > >          nodes = nodes_next;
> > >          nodes_next = u;
> > > +        generation++;
> > >  
> > >          // prevent overflow
> > >          if(nodes[0]->ssd > (1<<18)) {
> > > @@ -463,6 +479,8 @@ static void adpcm_compress_trellis(AVCodecContext *avctx, const short *samples,
> > >              // checking which nodes do so is too slow, so just kill them all.
> > >              // this also slightly improves quality, but I don't know why.
> > >              memset(nodes+1, 0, (frontier-1)*sizeof(TrellisNode*));
> > > +            memset(hash, 0xff, 65536 * sizeof(*hash));
> > > +            generation = 0;
> > 
> > shouldnt this be
> > if(generation==255)
> >         ...
> > ?
> 
> Yes, it could be moved out from the path freezing routine - then also we 
> won't have the dependency between FREEZE_INTERVAL and the hash element 
> size. As in attached then - this gives the same results as the previous 
> version.
> 
> // Martin
>  adpcm.c |   35 +++++++++++++++++++++++++++--------
>  1 file changed, 27 insertions(+), 8 deletions(-)
> 98600a97b4afbcfe6c093ca86ec3d4d490d2b618  0001-adpcm-Use-a-hash-table-to-improve-checking-for-dupli.patch
> From 45b177b1b13409b58573313c8f04f45aa4786d3a Mon Sep 17 00:00:00 2001
> From: Martin Storsjo <martin at martin.st>
> Date: Sun, 14 Nov 2010 12:41:06 +0200
> Subject: [PATCH 1/2] adpcm: Use a hash table to improve checking for duplicate samples
> 
> This lowers the run time from 158 to 21 seconds, for -trellis 8
> with a 30 second sample on my machine.
> 
> This requires 64 KB additional memory.

lgtm


[...]

>  adpcm.c |    3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 3bd5c10e1a6c5753daa71bb0e1d94d43f9bc812d  0002-adpcm-Only-increment-heap_pos-after-finding-a-good-e.patch
> From 1ec0b8bcb7a784e989a9c9975efb1eb3ad209994 Mon Sep 17 00:00:00 2001
> From: Martin Storsjo <martin at martin.st>
> Date: Thu, 18 Nov 2010 22:54:28 +0200
> Subject: [PATCH 2/2] adpcm: Only increment heap_pos after finding a good enough sample
> 
> This increases the PSNR slightly (about 0.1 dB) for trellis sizes
> below 8, and gives equal PSNR for sizes above that.

lgtm

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

The greatest way to live with honor in this world is to be what we pretend
to be. -- Socrates
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20101119/58cb4c8d/attachment.pgp>



More information about the ffmpeg-devel mailing list