[FFmpeg-devel] [PATCH] aacsbr_fixed: prevent sbr gain from being zero

Michael Niedermayer michael at niedermayer.cc
Fri Nov 25 02:12:44 EET 2016


On Fri, Nov 25, 2016 at 12:31:28AM +0100, Andreas Cadhalpun wrote:
> On 24.11.2016 18:29, Michael Niedermayer wrote:
> > On Thu, Nov 24, 2016 at 01:15:54AM +0100, Andreas Cadhalpun wrote:
> >> On 23.11.2016 03:22, Michael Niedermayer wrote:
> >>> On Sun, Nov 13, 2016 at 09:29:11PM +0100, Andreas Cadhalpun wrote:
> >>>> It causes division by zero crashes.
> >>>>
> >>>> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
> >>>> ---
> >>>>  libavcodec/aacsbr_fixed.c | 4 ++++
> >>>>  1 file changed, 4 insertions(+)
> >>>>
> >>>> diff --git a/libavcodec/aacsbr_fixed.c b/libavcodec/aacsbr_fixed.c
> >>>> index b26314a..d2a7027 100644
> >>>> --- a/libavcodec/aacsbr_fixed.c
> >>>> +++ b/libavcodec/aacsbr_fixed.c
> >>>> @@ -429,6 +429,10 @@ static void sbr_gain_calc(AACContext *ac, SpectralBandReplication *sbr,
> >>>>                                                  av_add_sf(FLOAT_1, sbr->e_curr[e][m]),
> >>>>                                                  av_add_sf(FLOAT_1, sbr->q_mapped[e][m]))));
> >>>>                  }
> >>>> +                if (sbr->gain[e][m].mant == 0) {
> >>>> +                    sbr->gain[e][m] = FLOAT_1;
> >>>> +                    sbr->gain[e][m].exp = MIN_EXP;
> >>>> +                }
> >>>
> >>> Why is this not not needed for the float code ?
> >>
> >> Because float can represent smaller absolute values than normalized SoftFloat.
> >>
> >>> is there a shortcomming in the SoftFloat code ?
> >>
> >> In a way, because the SoftFloat gets normalized, e.g.:
> >>  * float: 2.16840434e-19 * 2.77555756e-17 / 10337.5293 = 5.82201677e-40
> >>  * SoftFloat: av_div_sf(av_mul_sf({mant = 536870912, exp = -61}, {mant = 536870912, exp = -54}),
> >>                         {mant = 677439305, exp = 14}) = {mant = 850858499, exp = -130} = FLOAT_0
> > 
> > hmm
> > does increasing the limits for SoftFloats exponent solve this ?
> 
> Yes, patch is attached.
> 
> > If that works and doesnt break anything it would be good to have
> > SoftFloat cover the range float has
> 
> I'm not entirely sure about not breaking anything. For example the output of
> the softfloat test changes, but for some reason that test is not enabled anyway.
> 
> Best regards,
> Andreas

>  softfloat.h |    2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 17b9929a3b2f3b064cc1f96c7ed48dfe377f191a  0001-softfloat-decrease-MIN_EXP-to-cover-full-float-range.patch
> From e28c5828a62c583152834f661f9a15b572b07eee Mon Sep 17 00:00:00 2001
> From: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
> Date: Fri, 25 Nov 2016 00:26:51 +0100
> Subject: [PATCH] softfloat: decrease MIN_EXP to cover full float range
> 
> floats are not necessarily normalized, so a normalized softfloat needs
> MIN_EXP lowered by 23 to cover that range.
> 
> Signed-off-by: Andreas Cadhalpun <Andreas.Cadhalpun at googlemail.com>
> ---
>  libavutil/softfloat.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

LGTM

thx

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

Rewriting code that is poorly written but fully understood is good.
Rewriting code that one doesnt understand is a sign that one is less smart
then the original author, trying to rewrite it will not make it better.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20161125/866eeddb/attachment.sig>


More information about the ffmpeg-devel mailing list