Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Mark Harris
Opus
Commits
15edb78b
Commit
15edb78b
authored
Dec 09, 2013
by
Jean-Marc Valin
Browse files
Making NaN detection more robust to -ffast-math.
parent
4fda6b01
Changes
4
Hide whitespace changes
Inline
Side-by-side
celt/arch.h
View file @
15edb78b
...
...
@@ -137,6 +137,22 @@ typedef float celt_sig;
typedef
float
celt_norm
;
typedef
float
celt_ener
;
#ifdef FLOAT_APPROX
/* This code should reliably detect NaN/inf even when -ffast-math is used.
Assumes IEEE 754 format. */
static
inline
int
celt_isnan
(
float
x
)
{
union
{
float
f
;
opus_uint32
i
;}
in
;
in
.
f
=
x
;
return
((
in
.
i
>>
23
)
&
0xFF
)
==
0xFF
&&
(
in
.
i
&
0x007FFFFF
)
!=
0
;
}
#else
#ifdef __FAST_MATH__
#error Cannot build libopus with -ffast-math unless FLOAT_APPROX is defined. This could result in crashes on extreme (e.g. NaN) input
#endif
#define celt_isnan(x) ((x)!=(x))
#endif
#define Q15ONE 1.0f
#define NORM_SCALING 1.f
...
...
src/mlp.c
View file @
15edb78b
...
...
@@ -75,6 +75,11 @@ static OPUS_INLINE float tansig_approx(float x)
return
1
;
if
(
!
(
x
>-
8
))
return
-
1
;
#ifndef FIXED_POINT
/* Another check in case of -ffast-math */
if
(
celt_isnan
(
x
))
return
0
;
#endif
if
(
x
<
0
)
{
x
=-
x
;
...
...
src/mlp_data.c
View file @
15edb78b
/* The contents of this file was automatically generated by mlp_train.c
It contains multi-layer perceptron (MLP) weights. */
#ifdef HAVE_CONFIG_H
#include
"config.h"
#endif
#include
"mlp.h"
/* RMS error was 0.138320, seed was 1361535663 */
...
...
src/opus_encoder.c
View file @
15edb78b
...
...
@@ -1452,7 +1452,7 @@ opus_int32 opus_encode_native(OpusEncoder *st, const opus_val16 *pcm, int frame_
sum
=
celt_inner_prod
(
&
pcm_buf
[
total_buffer
*
st
->
channels
],
&
pcm_buf
[
total_buffer
*
st
->
channels
],
frame_size
*
st
->
channels
);
/* This should filter out both NaNs and ridiculous signals that could
cause NaNs further down. */
if
(
!
(
sum
<
1e9
))
if
(
!
(
sum
<
1e9
)
||
celt_isnan
(
sum
)
)
OPUS_CLEAR
(
&
pcm_buf
[
total_buffer
*
st
->
channels
],
frame_size
*
st
->
channels
);
}
#endif
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment