[vlc-devel] [PATCH] [codec/flac] Fix 24bit flac support
David Flynn
davidf+nntp at woaf.net
Sun Aug 24 03:33:43 CEST 2008
- Enable signaling of 24bit fourcc
- Fix interleaving:
- 24bit audio is output by flac in 32bit words.
- VLC treats 24bit auido as 24bit words.
Signed-off-by: David Flynn <davidf at woaf.net>
---
modules/codec/flac.c | 31 +++++++++++++++++++++++++++++++
1 files changed, 31 insertions(+), 0 deletions(-)
diff --git a/modules/codec/flac.c b/modules/codec/flac.c
index 65e798e..0180ade 100644
--- a/modules/codec/flac.c
+++ b/modules/codec/flac.c
@@ -161,6 +161,8 @@ static void DecoderErrorCallback( const FLAC__StreamDecoder *decoder,
static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
int i_nb_channels, int i_samples );
+static void Interleave24( int8_t *p_out, const int32_t * const *pp_in,
+ int i_nb_channels, int i_samples );
static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
int i_nb_channels, int i_samples );
@@ -630,6 +632,10 @@ DecoderWriteCallback( const FLAC__StreamDecoder *decoder,
Interleave16( (int16_t *)p_sys->p_aout_buffer->p_buffer, buffer,
frame->header.channels, frame->header.blocksize );
break;
+ case 24:
+ Interleave24( (int8_t *)p_sys->p_aout_buffer->p_buffer, buffer,
+ frame->header.channels, frame->header.blocksize );
+ break;
default:
Interleave32( (int32_t *)p_sys->p_aout_buffer->p_buffer, buffer,
frame->header.channels, frame->header.blocksize );
@@ -664,6 +670,9 @@ static void DecoderMetadataCallback( const FLAC__StreamDecoder *decoder,
case 16:
p_dec->fmt_out.i_codec = AOUT_FMT_S16_NE;
break;
+ case 24:
+ p_dec->fmt_out.i_codec = AOUT_FMT_S24_NE;
+ break;
default:
msg_Dbg( p_dec, "strange bit/sample value: %d",
metadata->data.stream_info.bits_per_sample );
@@ -739,6 +748,28 @@ static void Interleave32( int32_t *p_out, const int32_t * const *pp_in,
}
}
}
+
+static void Interleave24( int8_t *p_out, const int32_t * const *pp_in,
+ int i_nb_channels, int i_samples )
+{
+ int i, j;
+ for ( j = 0; j < i_samples; j++ )
+ {
+ for ( i = 0; i < i_nb_channels; i++ )
+ {
+#ifdef WORDS_BIGENDIAN
+ p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i][j] >> 16) & 0xff;
+ p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i][j] >> 8 ) & 0xff;
+ p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i][j] >> 0 ) & 0xff;
+#else
+ p_out[3*(j * i_nb_channels + i)+2] = (pp_in[i][j] >> 16) & 0xff;
+ p_out[3*(j * i_nb_channels + i)+1] = (pp_in[i][j] >> 8 ) & 0xff;
+ p_out[3*(j * i_nb_channels + i)+0] = (pp_in[i][j] >> 0 ) & 0xff;
+#endif
+ }
+ }
+}
+
static void Interleave16( int16_t *p_out, const int32_t * const *pp_in,
int i_nb_channels, int i_samples )
{
--
1.5.6
More information about the vlc-devel
mailing list