[FFmpeg-devel] [Issue 664] [PATCH] Fix AAC PNS Scaling

Michael Niedermayer michaelni
Tue Oct 7 22:27:25 CEST 2008


On Tue, Oct 07, 2008 at 03:23:50PM -0400, Alex Converse wrote:
> On Tue, Oct 7, 2008 at 1:01 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
> > On Mon, Oct 06, 2008 at 11:30:56PM -0400, Alex Converse wrote:
> >> On Mon, Oct 6, 2008 at 10:20 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
> >> > On Mon, Oct 06, 2008 at 09:52:51PM -0400, Alex Converse wrote:
> >> >> On Mon, Oct 6, 2008 at 9:39 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
> >> >> > On Mon, Oct 06, 2008 at 08:52:06PM -0400, Alex Converse wrote:
> >> >> >> On Mon, Oct 6, 2008 at 8:22 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
> >> >> >> > On Mon, Oct 06, 2008 at 03:46:55PM -0400, Alex Converse wrote:
> >> >> >> >> On Tue, Sep 30, 2008 at 11:25 PM, Alex Converse <alex.converse at gmail.com> wrote:
> >> >> >> >> > Hi,
> >> >> >> >> >
> >> >> >> >> > The attached patch should fix AAC PNS scaling [Issue 664]. It will not
> >> >> >> >> > fix PNS conformance.
> >> >> >> >>
> >> >> >> >> Here's a sightly updated patch (sqrtf instead of sqrt). The current
> >> >> >> >> method of PNS will never conform because sample energy simpl doesn't
> >> >> >> >> converge to it's mean fast enough. The spec explicitly states that PNS
> >> >> >> >> should be normalized per band. Not doing it that way causes PNS-1
> >> >> >> >> conformance to fail for 45 bands.
> >> >> >> >
> >> >> >> > elaborate, what part of the spec says what?
> >> >> >>
> >> >> >> 14496-3:2005/4.6.13.3 p184 (636 of the PDF)
> >> >> >>
> >> >> >> > what is PNS-1 conformance ?
> >> >> >>
> >> >> >> 14496-4:2004/6.6.1.2.2.4 p94 (102 PDF)
> >> >> >> 14496-5/conf_pns folder
> >> >> >
> >> >> > do you happen to have URLs for these?
> >> >> >
> >> >> >
> >> >> >>
> >> >> >> > the part that feels a little odd is normalizing random data on arbitrary
> >> >> >> > and artificial bands, this simply makes things non random.
> >> >> >> > This would be most extreemly vissibly with really short bands of 1 or 2
> >> >> >> > coeffs ...
> >> >> >> > another way to see the issue is to take 100 coeffs and split them into
> >> >> >> > 10 bands, if you now normalize litterally these 10 bands then the 100
> >> >> >> > coeffs will no longer be random at all, they will be significantly
> >> >> >> > correlated. This may be inaudible, it may or may not sound better and
> >> >> >> > may or may not be what the spec wants but still it feels somewhat wrong
> >> >> >> > to me ...
> >> >> >> >
> >> >> >>
> >> >> >> Ralph Sperschneider from FhG/MPEG spelled it all out:
> >> >> >> http://lists.mpegif.org/pipermail/mp4-tech/2003-June/002358.html
> >> >> >>
> >> >> >> I'm not saying it's a smart way to design a CODEC but it's what MPEG picked.
> >> >> >
> >> >> > yes, so i guess the most sensible solution would be to precalculate
> >> >> > a second of noise normalized to the band sizes and randomly pick from
> >> >> > these.
> >> >> >
> >> >>
> >> >> That sounds messy and overly complex. What's wrong with doing it the
> >> >> way MPEG tells us to?
> >> >
> >> > that is what mpeg tells us to do, they do not mandate any specific way
> >> > to calculate random values. And i do not like doing sqrt() per band ...
> >> >
> >>
> >> One sqrtf() per band isn't that intense. To stick with the current
> >> approach we still need to do a sqrt on the band size. We could even
> >> use one of those fast 1/sqrt algorithms.
> >
> > we do not need to do a sqrt() on the band size, not in the current
> > approuch and not with the other variant. A small LUT will do fine
> > considering the small number of band sizes. And even that is not
> > needed in all cases ...
> >
> 
> I'm attaching a version that is functionally correct that does do 1
> sqrtf per band (aka up to 120 per frame).
> 
> I'm using the Carmack-Lomont 1/sqrtf based on the following benchmark:
> 
> With math.h sqrtf
> alex at Barcelona:~/Projects/ffmpeg/14496-4$ ../ffmpeg/ffmpeg -i
> mpeg4audio-conformance/compressedMp4/al18_48.mp4 -f null -
> FFmpeg version SVN-r15584, Copyright (c) 2000-2008 Fabrice Bellard, et al.
>   configuration: --enable-gpl
>   libavutil     49.11. 0 / 49.11. 0
>   libavcodec    52. 0. 0 / 52. 0. 0
>   libavformat   52.22. 1 / 52.22. 1
>   libavdevice   52. 1. 0 / 52. 1. 0
>   built on Oct  7 2008 14:26:51, gcc: 4.3.2
> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from
> 'mpeg4audio-conformance/compressedMp4/al18_48.mp4':
>   Duration: 00:01:00.01, start: 0.000000, bitrate: 67 kb/s
>     Stream #0.0(und): Audio: aac, 48000 Hz, mono, s16
> Output #0, null, to 'pipe:':
>     Stream #0.0(und): Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s
> Stream mapping:
>   Stream #0.0 -> #0.0
> Press [q] to stop encoding
> 253170 dezicycles in sqrtf, 1 runs, 0 skips
> 245160 dezicycles in sqrtf, 2 runs, 0 skips
> 240997 dezicycles in sqrtf, 4 runs, 0 skips
> 238050 dezicycles in sqrtf, 8 runs, 0 skips
> 236553 dezicycles in sqrtf, 16 runs, 0 skips
> 235676 dezicycles in sqrtf, 32 runs, 0 skips
> 234884 dezicycles in sqrtf, 64 runs, 0 skips
> 234129 dezicycles in sqrtf, 128 runs, 0 skips
> 234115 dezicycles in sqrtf, 256 runs, 0 skips
> 234366 dezicycles in sqrtf, 512 runs, 0 skips
> 233892 dezicycles in sqrtf, 1024 runs, 0 skips
> 233624 dezicycles in sqrtf, 2047 runs, 1 skips
> size=      -0kB time=59.99 bitrate=  -0.0kbits/s
> video:0kB audio:5624kB global headers:0kB muxing overhead -100.000382%
> 
> With Carmack-Lomont
> alex at Barcelona:~/Projects/ffmpeg/14496-4$ ../ffmpeg/ffmpeg -i
> mpeg4audio-conformance/compressedMp4/al18_48.mp4 -f null -
> FFmpeg version SVN-r15584, Copyright (c) 2000-2008 Fabrice Bellard, et al.
>   configuration: --enable-gpl
>   libavutil     49.11. 0 / 49.11. 0
>   libavcodec    52. 0. 0 / 52. 0. 0
>   libavformat   52.22. 1 / 52.22. 1
>   libavdevice   52. 1. 0 / 52. 1. 0
>   built on Oct  7 2008 14:26:51, gcc: 4.3.2
> Input #0, mov,mp4,m4a,3gp,3g2,mj2, from
> 'mpeg4audio-conformance/compressedMp4/al18_48.mp4':
>   Duration: 00:01:00.01, start: 0.000000, bitrate: 67 kb/s
>     Stream #0.0(und): Audio: aac, 48000 Hz, mono, s16
> Output #0, null, to 'pipe:':
>     Stream #0.0(und): Audio: pcm_s16le, 48000 Hz, mono, s16, 768 kb/s
> Stream mapping:
>   Stream #0.0 -> #0.0
> Press [q] to stop encoding
> 197190 dezicycles in sqrtf, 1 runs, 0 skips
> 190665 dezicycles in sqrtf, 2 runs, 0 skips
> 187807 dezicycles in sqrtf, 4 runs, 0 skips
> 185737 dezicycles in sqrtf, 8 runs, 0 skips
> 184651 dezicycles in sqrtf, 16 runs, 0 skips
> 184255 dezicycles in sqrtf, 32 runs, 0 skips
> 183868 dezicycles in sqrtf, 64 runs, 0 skips
> 183976 dezicycles in sqrtf, 128 runs, 0 skips
> 183913 dezicycles in sqrtf, 256 runs, 0 skips
> 184199 dezicycles in sqrtf, 511 runs, 1 skips
> 184037 dezicycles in sqrtf, 1023 runs, 1 skips
> 183925 dezicycles in sqrtf, 2047 runs, 1 skips
> size=      -0kB time=59.99 bitrate=  -0.0kbits/s
> video:0kB audio:5624kB global headers:0kB muxing overhead -100.000382%
> 
> Intel(R) Core(TM)2 CPU 6600  @ 2.40GHz

please try ff_sqrt() as well


[...]
> @@ -671,6 +671,17 @@
>      }
>  }
>  
> +/** Fast Carmack-Lomont 1/sqrtf(), see Lomont 2003 */
> +static float inv_sqrtf(float x) {
> +    union { float f; int i; } pun;
> +    float xhalf = 0.5f*x;
> +    pun.f = x;
> +    pun.i = 0x5f3759df - (pun.i>>1);
> +    x = pun.f;
> +    x = x*(1.5f-xhalf*x*x);
> +    return x;
> +}
> +
>  /**
>   * Decode spectral data; reference: table 4.50.
>   * Dequantize and scale spectral data; reference: 4.6.3.3.

that stuff is not portable, it contains assumtations about endianness
and sizes of int and float.


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Complexity theory is the science of finding the exact solution to an
approximation. Benchmarking OTOH is finding an approximation of the exact
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20081007/774fe561/attachment.pgp>



More information about the ffmpeg-devel mailing list