[vlc-commits] araw: filter out non-finite floating point samples
Rémi Denis-Courmont
git at videolan.org
Fri May 16 14:56:16 CEST 2014
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Fri May 16 19:42:26 2014 +0800| [cd8fd58633eaeabf59d674939c9784c46506cd5b] | committer: Rémi Denis-Courmont
araw: filter out non-finite floating point samples
The input is not neessarily trusted. Better safe than sorry.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cd8fd58633eaeabf59d674939c9784c46506cd5b
---
modules/codec/Makefile.am | 1 +
modules/codec/araw.c | 41 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 42 insertions(+)
diff --git a/modules/codec/Makefile.am b/modules/codec/Makefile.am
index 218bc3c..a90ecca 100644
--- a/modules/codec/Makefile.am
+++ b/modules/codec/Makefile.am
@@ -24,6 +24,7 @@ libaes3_plugin_la_SOURCES = codec/aes3.c
codec_LTLIBRARIES += libaes3_plugin.la
libaraw_plugin_la_SOURCES = codec/araw.c
+libaraw_plugin_la_LIBADD = $(LIBM)
codec_LTLIBRARIES += libaraw_plugin.la
libdts_plugin_la_SOURCES = codec/dts.c codec/dts_header.c codec/dts_header.h
diff --git a/modules/codec/araw.c b/modules/codec/araw.c
index 0ec77d8..a4b0f11 100644
--- a/modules/codec/araw.c
+++ b/modules/codec/araw.c
@@ -28,6 +28,7 @@
# include "config.h"
#endif
+#include <math.h>
#include <assert.h>
#include <vlc_common.h>
@@ -96,7 +97,9 @@ static void S24L32Decode( void *, const uint8_t *, unsigned );
static void U32BDecode( void *, const uint8_t *, unsigned );
static void U32LDecode( void *, const uint8_t *, unsigned );
static void S32IDecode( void *, const uint8_t *, unsigned );
+static void F32NDecode( void *, const uint8_t *, unsigned );
static void F32IDecode( void *, const uint8_t *, unsigned );
+static void F64NDecode( void *, const uint8_t *, unsigned );
static void F64IDecode( void *, const uint8_t *, unsigned );
static void DAT12Decode( void *, const uint8_t *, unsigned );
@@ -139,7 +142,10 @@ static int DecoderOpen( vlc_object_t *p_this )
#endif
format = VLC_CODEC_FL64;
decode = F64IDecode;
+ bits = 64;
+ break;
case VLC_CODEC_FL64:
+ decode = F64NDecode;
bits = 64;
break;
#ifdef WORDS_BIGENDIAN
@@ -149,7 +155,10 @@ static int DecoderOpen( vlc_object_t *p_this )
#endif
format = VLC_CODEC_FL32;
decode = F32IDecode;
+ bits = 32;
+ break;
case VLC_CODEC_FL32:
+ decode = F32NDecode;
bits = 32;
break;
case VLC_CODEC_U32B:
@@ -506,6 +515,20 @@ static void S32IDecode( void *outp, const uint8_t *in, unsigned samples )
}
}
+static void F32NDecode( void *outp, const uint8_t *in, unsigned samples )
+{
+ float *out = outp;
+
+ for( size_t i = 0; i < samples; i++ )
+ {
+ memcpy( out, in, sizeof(float) );
+ if( unlikely(!isfinite(*out)) )
+ *out = 0.f;
+ out++;
+ in += sizeof(float);
+ }
+}
+
static void F32IDecode( void *outp, const uint8_t *in, unsigned samples )
{
float *out = outp;
@@ -519,11 +542,27 @@ static void F32IDecode( void *outp, const uint8_t *in, unsigned samples )
#else
s.u = GetDWBE( in );
#endif
+ if( unlikely(!isfinite(s.f)) )
+ s.f = 0.f;
*(out++) = s.f;
in += 4;
}
}
+static void F64NDecode( void *outp, const uint8_t *in, unsigned samples )
+{
+ double *out = outp;
+
+ for( size_t i = 0; i < samples; i++ )
+ {
+ memcpy( out, in, sizeof(double) );
+ if( unlikely(!isfinite( *out )) )
+ *out = 0.;
+ out++;
+ in += sizeof(double);
+ }
+}
+
static void F64IDecode( void *outp, const uint8_t *in, unsigned samples )
{
double *out = outp;
@@ -537,6 +576,8 @@ static void F64IDecode( void *outp, const uint8_t *in, unsigned samples )
#else
s.u = GetQWBE( in );
#endif
+ if( unlikely(!isfinite( s.d )) )
+ s.d = 0.;
*(out++) = s.d;
in += 8;
}
More information about the vlc-commits
mailing list