# include "config.h"
#endif
+#include <math.h>
#include <assert.h>
#include <vlc_common.h>
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 );
#endif
format = VLC_CODEC_FL64;
decode = F64IDecode;
+ bits = 64;
+ break;
case VLC_CODEC_FL64:
+ decode = F64NDecode;
bits = 64;
break;
#ifdef WORDS_BIGENDIAN
#endif
format = VLC_CODEC_FL32;
decode = F32IDecode;
+ bits = 32;
+ break;
case VLC_CODEC_FL32:
+ decode = F32NDecode;
bits = 32;
break;
case VLC_CODEC_U32B:
}
}
+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;
#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;
#else
s.u = GetQWBE( in );
#endif
+ if( unlikely(!isfinite( s.d )) )
+ s.d = 0.;
*(out++) = s.d;
in += 8;
}
}
-static int16_t dat12tos16( uint16_t y )
+static int16_t dat12tos16( uint_fast16_t y )
{
static const uint16_t diff[16] = {
0x0000, 0x0000, 0x0100, 0x0200, 0x0300, 0x0400, 0x0500, 0x0600,
static const uint8_t shift[16] = {
0, 0, 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 0, 0 };
+ assert(y < 0x1000);
+
int d = y >> 8;
return (y - diff[d]) << shift[d];
}