From 88386ce7b1851e3d5d2c2e93a0fffe45a3742a4e Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Tue, 31 Aug 2004 12:02:12 +0000 Subject: [PATCH] * modules/stream_out/transcode.c, modules/audio_filter/format.c: fixed a bunch of stupid mistakes. --- modules/audio_filter/format.c | 46 ++++++++++++++++++++++++++-------- modules/stream_out/transcode.c | 29 +++++++++++++++++---- 2 files changed, 60 insertions(+), 15 deletions(-) diff --git a/modules/audio_filter/format.c b/modules/audio_filter/format.c index 6032d46fc1..2df76b8a81 100644 --- a/modules/audio_filter/format.c +++ b/modules/audio_filter/format.c @@ -40,6 +40,7 @@ static int Open ( vlc_object_t * ); static block_t *Float32toS16( filter_t *, block_t * ); static block_t *Float32toU16( filter_t *, block_t * ); static block_t *S16toFloat32( filter_t *, block_t * ); +static block_t *S16Invert ( filter_t *, block_t * ); /***************************************************************************** * Module descriptor @@ -62,16 +63,23 @@ static int Open( vlc_object_t *p_this ) { p_filter->pf_audio_filter = Float32toS16; } - else if ( p_filter->fmt_in.i_codec == VLC_FOURCC('f','l','3','2') && - p_filter->fmt_out.i_codec == AUDIO_FMT_U16_NE ) + else if( p_filter->fmt_in.i_codec == VLC_FOURCC('f','l','3','2') && + p_filter->fmt_out.i_codec == AUDIO_FMT_U16_NE ) { p_filter->pf_audio_filter = Float32toU16; } - else if ( p_filter->fmt_in.i_codec == AUDIO_FMT_S16_NE && - p_filter->fmt_out.i_codec == VLC_FOURCC('f','l','3','2') ) + else if( p_filter->fmt_in.i_codec == AUDIO_FMT_S16_NE && + p_filter->fmt_out.i_codec == VLC_FOURCC('f','l','3','2') ) { p_filter->pf_audio_filter = S16toFloat32; } + else if( ( p_filter->fmt_in.i_codec == VLC_FOURCC('s','1','6','l') && + p_filter->fmt_out.i_codec == VLC_FOURCC('s','1','6','b') ) || + ( p_filter->fmt_in.i_codec == VLC_FOURCC('s','1','6','b') && + p_filter->fmt_out.i_codec == VLC_FOURCC('s','1','6','l') ) ) + { + p_filter->pf_audio_filter = S16Invert; + } else return VLC_EGENERIC; msg_Dbg( p_this, "%4.4s->%4.4s, bits per sample: %i", @@ -91,7 +99,7 @@ static block_t *Float32toS16( filter_t *p_filter, block_t *p_block ) float *p_in = (float *)p_block->p_buffer; int16_t *p_out = (int16_t *)p_in; - for( i = p_block->i_buffer/ p_filter->fmt_in.audio.i_bitspersample; i-- ; ) + for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) { #if 0 /* Slow version. */ @@ -119,7 +127,7 @@ static block_t *Float32toU16( filter_t *p_filter, block_t *p_block ) float *p_in = (float *)p_block->p_buffer; uint16_t *p_out = (uint16_t *)p_in; - for( i = p_block->i_buffer/ p_filter->fmt_in.audio.i_bitspersample; i-- ; ) + for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) { if ( *p_in >= 1.0 ) *p_out = 65535; else if ( *p_in < -1.0 ) *p_out = 0; @@ -146,10 +154,10 @@ static block_t *S16toFloat32( filter_t *p_filter, block_t *p_block ) return NULL; } - p_in = (int16_t *)(p_block->p_buffer + p_block->i_buffer) - 1; - p_out = (float *)(p_block_out->p_buffer + p_block_out->i_buffer) - 1; + p_in = (int16_t *)p_block->p_buffer; + p_out = (float *)p_block_out->p_buffer; - for( i = p_block->i_buffer/ p_filter->fmt_in.audio.i_bitspersample; i-- ; ) + for( i = p_block->i_buffer*8/p_filter->fmt_in.audio.i_bitspersample; i--; ) { #if 0 /* Slow version */ @@ -163,7 +171,7 @@ static block_t *S16toFloat32( filter_t *p_filter, block_t *p_block ) *p_out = u.f - 384.0; #endif - p_in--; p_out--; + p_in++; p_out++; } p_block_out->i_samples = p_block->i_samples; @@ -172,5 +180,23 @@ static block_t *S16toFloat32( filter_t *p_filter, block_t *p_block ) p_block_out->i_length = p_block->i_length; p_block_out->i_rate = p_block->i_rate; + p_block->pf_release( p_block ); return p_block_out; } + +static block_t *S16Invert( filter_t *p_filter, block_t *p_block ) +{ + int i; + uint8_t *p_in = (uint8_t *)p_block->p_buffer; + uint8_t tmp; + + for( i = 0; i < p_block->i_buffer / 2; i++ ) + { + tmp = p_in[0]; + p_in[0] = p_in[1]; + p_in[1] = tmp; + p_in += 2; + } + + return p_block; +} diff --git a/modules/stream_out/transcode.c b/modules/stream_out/transcode.c index 3832f8ac0a..7dc365678c 100644 --- a/modules/stream_out/transcode.c +++ b/modules/stream_out/transcode.c @@ -818,17 +818,30 @@ int audio_BitsPerSample( vlc_fourcc_t i_format ) { case VLC_FOURCC('u','8',' ',' '): case VLC_FOURCC('s','8',' ',' '): - return 1; + return 8; case VLC_FOURCC('u','1','6','l'): case VLC_FOURCC('s','1','6','l'): case VLC_FOURCC('u','1','6','b'): case VLC_FOURCC('s','1','6','b'): - return 2; + return 16; + case VLC_FOURCC('u','2','4','l'): + case VLC_FOURCC('s','2','4','l'): + case VLC_FOURCC('u','2','4','b'): + case VLC_FOURCC('s','2','4','b'): + return 24; + + case VLC_FOURCC('u','3','2','l'): + case VLC_FOURCC('s','3','2','l'): + case VLC_FOURCC('u','3','2','b'): + case VLC_FOURCC('s','3','2','b'): case VLC_FOURCC('f','l','3','2'): case VLC_FOURCC('f','i','3','2'): - return 4; + return 32; + + case VLC_FOURCC('f','l','6','4'): + return 64; } return 0; @@ -892,7 +905,8 @@ static int transcode_audio_new( sout_stream_t *p_stream, id->p_encoder->fmt_out.audio.i_physical_channels; id->p_encoder->fmt_in.audio.i_channels = id->p_encoder->fmt_out.audio.i_channels; - id->p_encoder->fmt_in.audio.i_bitspersample = 16; + id->p_encoder->fmt_in.audio.i_bitspersample = + audio_BitsPerSample( id->p_encoder->fmt_in.i_codec ); id->p_encoder->p_cfg = p_stream->p_sys->p_audio_cfg; @@ -906,6 +920,8 @@ static int transcode_audio_new( sout_stream_t *p_stream, return VLC_EGENERIC; } id->p_encoder->fmt_in.audio.i_format = id->p_encoder->fmt_in.i_codec; + id->p_encoder->fmt_in.audio.i_bitspersample = + audio_BitsPerSample( id->p_encoder->fmt_in.i_codec ); /* Check if we need a filter for chroma conversion or resizing */ if( id->p_decoder->fmt_out.i_codec != @@ -934,6 +950,9 @@ static int transcode_audio_new( sout_stream_t *p_stream, return VLC_EGENERIC; } + id->pp_filter[0]->fmt_out.audio.i_bitspersample = + audio_BitsPerSample( id->pp_filter[0]->fmt_out.i_codec ); + /* Try a 2 stage conversion */ if( id->pp_filter[0]->fmt_out.i_codec != id->p_encoder->fmt_in.i_codec ) @@ -1067,7 +1086,7 @@ static aout_buffer_t *audio_new_buffer( decoder_t *p_dec, int i_samples ) if( p_dec->fmt_out.audio.i_bitspersample ) { - i_size = i_samples * p_dec->fmt_out.audio.i_bitspersample * + i_size = i_samples * p_dec->fmt_out.audio.i_bitspersample / 8 * p_dec->fmt_out.audio.i_channels; } else if( p_dec->fmt_out.audio.i_bytes_per_frame &&