]> git.sesse.net Git - vlc/commitdiff
Implemented fi32 -> fl32/s16 conversion in format.c.
authorLaurent Aimar <fenrir@videolan.org>
Sat, 30 Jan 2010 12:49:35 +0000 (13:49 +0100)
committerLaurent Aimar <fenrir@videolan.org>
Sat, 30 Jan 2010 13:03:14 +0000 (14:03 +0100)
modules/audio_filter/converter/format.c

index bc56861ee266e6206d45996a74c5fabc46dc191f..87040a29e77ba5cccca232eeeea1ed2fecd25194 100644 (file)
@@ -356,7 +356,32 @@ static block_t *S32toFl32(filter_t *filter, block_t *b)
         *dst++ = (float)(*src++) / 2147483648.0;
     return b;
 }
-
+static block_t *Fi32toFl32(filter_t *filter, block_t *b)
+{
+    VLC_UNUSED(filter);
+    vlc_fixed_t *src = (vlc_fixed_t *)b->p_buffer;
+    float       *dst = (float *)src;
+    for (int i = b->i_buffer / 4; i--;)
+        *dst++ = *src++ / (float)FIXED32_ONE;
+    return b;
+}
+static block_t *Fi32toS16(filter_t *filter, block_t *b)
+{
+    VLC_UNUSED(filter);
+    vlc_fixed_t *src = (vlc_fixed_t *)b->p_buffer;
+    int16_t     *dst = (int16_t *)src;
+    for (int i = b->i_buffer / 4; i--;) {
+        const vlc_fixed_t v = *src++;
+        if (v >= FIXED32_ONE)
+            *dst++ = INT16_MAX;
+        else if (v <= -FIXED32_ONE)
+            *dst++ = INT16_MIN;
+        else
+            *dst++ = v >> (32 - FIXED32_FRACBITS);
+    }
+    b->i_buffer /= 2;
+    return b;
+}
 
 /* */
 static void X8toX16(block_t *bdst, const block_t *bsrc)
@@ -473,6 +498,8 @@ static const struct {
     vlc_fourcc_t dst;
     cvt_direct_t convert;
 } cvt_directs[] = {
+    { VLC_CODEC_FI32, VLC_CODEC_FL32,   Fi32toFl32 },
+    { VLC_CODEC_FI32, VLC_CODEC_S16N,   Fi32toS16 },
     { VLC_CODEC_S32N, VLC_CODEC_FL32,   S32toFl32 },
 
     { VLC_CODEC_S24N, VLC_CODEC_S16N,   S24toS16 },