+/*****************************************************************************
+ * InitThread: initialize data before entering main loop
+ *****************************************************************************/
+static int InitThread( ac3dec_t * p_ac3dec )
+{
+ char *psz_name;
+
+ /*
+ * Choose the best downmix module
+ */
+ p_ac3dec->p_downmix = vlc_object_create( p_ac3dec->p_fifo,
+ sizeof( downmix_t ) );
+ p_ac3dec->p_downmix->psz_object_name = "downmix";
+
+ psz_name = config_GetPsz( p_ac3dec->p_downmix, "ac3-downmix" );
+ p_ac3dec->p_downmix->p_module =
+ module_Need( p_ac3dec->p_downmix, "downmix", psz_name );
+ if( psz_name ) free( psz_name );
+
+ if( p_ac3dec->p_downmix->p_module == NULL )
+ {
+ msg_Err( p_ac3dec->p_fifo, "no suitable downmix module" );
+ vlc_object_destroy( p_ac3dec->p_downmix );
+ return( -1 );
+ }
+
+ /*
+ * Choose the best IMDCT module
+ */
+ p_ac3dec->p_imdct = vlc_object_create( p_ac3dec->p_fifo,
+ sizeof( imdct_t ) );
+
+#define IMDCT p_ac3dec->p_imdct
+ psz_name = config_GetPsz( p_ac3dec->p_fifo, "ac3-imdct" );
+ p_ac3dec->p_imdct->p_module =
+ module_Need( p_ac3dec->p_imdct, "imdct", psz_name );
+ if( psz_name ) free( psz_name );
+
+ if( p_ac3dec->p_imdct->p_module == NULL )
+ {
+ msg_Err( p_ac3dec->p_fifo, "no suitable IMDCT module" );
+ vlc_object_destroy( p_ac3dec->p_imdct );
+ module_Unneed( p_ac3dec->p_downmix, p_ac3dec->p_downmix->p_module );
+ vlc_object_destroy( p_ac3dec->p_downmix );
+ return( -1 );
+ }
+
+ /* Initialize the ac3 decoder structures */
+ p_ac3dec->samples = vlc_memalign( &p_ac3dec->samples_orig,
+ 16, 6 * 256 * sizeof(float) );
+
+ IMDCT->buf = vlc_memalign( &IMDCT->buf_orig,
+ 16, N/4 * sizeof(complex_t) );
+ IMDCT->delay = vlc_memalign( &IMDCT->delay_orig,
+ 16, 6 * 256 * sizeof(float) );
+ IMDCT->delay1 = vlc_memalign( &IMDCT->delay1_orig,
+ 16, 6 * 256 * sizeof(float) );
+ IMDCT->xcos1 = vlc_memalign( &IMDCT->xcos1_orig,
+ 16, N/4 * sizeof(float) );
+ IMDCT->xsin1 = vlc_memalign( &IMDCT->xsin1_orig,
+ 16, N/4 * sizeof(float) );
+ IMDCT->xcos2 = vlc_memalign( &IMDCT->xcos2_orig,
+ 16, N/8 * sizeof(float) );
+ IMDCT->xsin2 = vlc_memalign( &IMDCT->xsin2_orig,
+ 16, N/8 * sizeof(float) );
+ IMDCT->xcos_sin_sse = vlc_memalign( &IMDCT->xcos_sin_sse_orig,
+ 16, 128 * 4 * sizeof(float) );
+ IMDCT->w_1 = vlc_memalign( &IMDCT->w_1_orig,
+ 16, 1 * sizeof(complex_t) );
+ IMDCT->w_2 = vlc_memalign( &IMDCT->w_2_orig,
+ 16, 2 * sizeof(complex_t) );
+ IMDCT->w_4 = vlc_memalign( &IMDCT->w_4_orig,
+ 16, 4 * sizeof(complex_t) );
+ IMDCT->w_8 = vlc_memalign( &IMDCT->w_8_orig,
+ 16, 8 * sizeof(complex_t) );
+ IMDCT->w_16 = vlc_memalign( &IMDCT->w_16_orig,
+ 16, 16 * sizeof(complex_t) );
+ IMDCT->w_32 = vlc_memalign( &IMDCT->w_32_orig,
+ 16, 32 * sizeof(complex_t) );
+ IMDCT->w_64 = vlc_memalign( &IMDCT->w_64_orig,
+ 16, 64 * sizeof(complex_t) );
+#undef IMDCT
+
+ E_( ac3_init )( p_ac3dec );
+
+ /*
+ * Initialize the output properties
+ */
+ p_ac3dec->p_aout_fifo = NULL;
+
+ /*
+ * Bit stream
+ */
+ InitBitstream( &p_ac3dec->bit_stream, p_ac3dec->p_fifo,
+ BitstreamCallback, (void *) p_ac3dec );
+
+ return( 0 );
+}