From 97e5f060705b87f0465da8b845d0142470639d54 Mon Sep 17 00:00:00 2001 From: Laurent Aimar Date: Sat, 30 Jan 2010 13:49:35 +0100 Subject: [PATCH] Implemented fi32 -> fl32/s16 conversion in format.c. --- modules/audio_filter/converter/format.c | 29 ++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/modules/audio_filter/converter/format.c b/modules/audio_filter/converter/format.c index bc56861ee2..87040a29e7 100644 --- a/modules/audio_filter/converter/format.c +++ b/modules/audio_filter/converter/format.c @@ -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 }, -- 2.39.5