* (http://liba52.sf.net/).
*****************************************************************************
* Copyright (C) 2001, 2002 VideoLAN
- * $Id: a52tofloat32.c,v 1.9 2002/11/28 23:24:14 massiot Exp $
+ * $Id: a52tofloat32.c,v 1.13 2003/02/20 01:52:45 sigmunau Exp $
*
* Authors: Gildas Bazin <gbazin@netcourrier.com>
* Christophe Massiot <massiot@via.ecp.fr>
a52_state_t * p_liba52; /* liba52 internal structure */
vlc_bool_t b_dynrng; /* see below */
int i_flags; /* liba52 flags, see a52dec/doc/liba52.txt */
+ vlc_bool_t b_dontwarn;
int i_nb_channels; /* number of float32 per sample */
};
"listening room.")
vlc_module_begin();
- add_category_hint( N_("Miscellaneous"), NULL );
- add_bool( "a52-dynrng", 1, NULL, DYNRNG_TEXT, DYNRNG_LONGTEXT );
+ add_category_hint( N_("Miscellaneous"), NULL, VLC_FALSE );
+ add_bool( "a52-dynrng", 1, NULL, DYNRNG_TEXT, DYNRNG_LONGTEXT, VLC_FALSE );
set_description( _("ATSC A/52 aka AC-3 audio decoder module") );
set_capability( "audio filter", 100 );
set_callbacks( Create, Destroy );
}
p_sys->b_dynrng = config_GetInt( p_filter, "a52-dynrng" );
+ p_sys->b_dontwarn = 0;
/* We'll do our own downmixing, thanks. */
p_sys->i_nb_channels = aout_FormatNbChannels( &p_filter->output );
{
p_sys->i_flags = A52_DOLBY;
}
+ else if ( p_filter->input.i_original_channels == AOUT_CHAN_CENTER )
+ {
+ p_sys->i_flags = A52_MONO;
+ }
else if ( p_filter->input.i_original_channels & AOUT_CHAN_DUALMONO )
{
p_sys->i_flags = A52_CHANNEL;
break;
default:
- msg_Err( p_filter, "unknow sample format !" );
+ msg_Err( p_filter, "unknown sample format !" );
free( p_sys );
return -1;
}
}
}
+/*****************************************************************************
+ * Exchange: helper function to exchange left & right channels
+ *****************************************************************************/
+static void Exchange( float * p_out, const float * p_in )
+{
+ int i;
+ const float * p_first = p_in + 256;
+ const float * p_second = p_in;
+
+ for ( i = 0; i < 256; i++ )
+ {
+ *p_out++ = *p_first++;
+ *p_out++ = *p_second++;
+ }
+}
+
/*****************************************************************************
* DoWork: decode an ATSC A/52 frame.
*****************************************************************************/
a52_frame( p_sys->p_liba52, p_in_buf->p_buffer,
&i_flags, &i_sample_level, 0 );
- if ( (i_flags & A52_CHANNEL_MASK) != (p_sys->i_flags & A52_CHANNEL_MASK) )
+ if ( (i_flags & A52_CHANNEL_MASK) != (p_sys->i_flags & A52_CHANNEL_MASK)
+ && !p_sys->b_dontwarn )
{
- msg_Err( p_filter,
- "liba52 couldn't do the requested downmix 0x%x->0x%x",
- p_sys->i_flags & A52_CHANNEL_MASK,
- i_flags & A52_CHANNEL_MASK );
-
- /* We do not know if the output has the same number of channels
- * than the input, so die quietly... */
- memset( p_out_buf->p_buffer, 0, i_bytes_per_block * 6 );
- p_out_buf->i_nb_samples = p_in_buf->i_nb_samples;
- p_out_buf->i_nb_bytes = i_bytes_per_block * 6;
- return;
+ msg_Warn( p_filter,
+ "liba52 couldn't do the requested downmix 0x%x->0x%x",
+ p_sys->i_flags & A52_CHANNEL_MASK,
+ i_flags & A52_CHANNEL_MASK );
+
+ p_sys->b_dontwarn = 1;
}
if( !p_sys->b_dynrng )
Duplicate( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block),
p_samples );
}
+ else if ( p_filter->output.i_original_channels
+ & AOUT_CHAN_REVERSESTEREO )
+ {
+ Exchange( (float *)(p_out_buf->p_buffer + i * i_bytes_per_block),
+ p_samples );
+ }
else
{
/* Interleave the *$£%ù samples. */