+
+/**
+ * It parse E-AC3 sync info
+ */
+static int SyncInfoEAC3( const uint8_t *p_buf,
+ unsigned int *pi_channels,
+ unsigned int *pi_channels_conf,
+ unsigned int *pi_sample_rate, int *pi_bit_rate )
+{
+ static const int pi_samplerate[3] = { 48000, 44100, 32000 };
+ bs_t s;
+ int i_frame_size;
+ int i_fscod, i_fscod2;
+ int i_numblkscod;
+ int i_acmod, i_lfeon;
+ int i_bytes;
+
+
+ bs_init( &s, (void*)p_buf, A52_HEADER_SIZE );
+ bs_skip( &s, 16 + /* start code */
+ 2 + /* stream type */
+ 3 ); /* substream id */
+ i_frame_size = bs_read( &s, 11 );
+ if( i_frame_size < 2 )
+ return 0;
+ i_bytes = 2 * ( i_frame_size + 1 );
+
+ i_fscod = bs_read( &s, 2 );
+ if( i_fscod == 0x03 )
+ {
+ i_fscod2 = bs_read( &s, 2 );
+ if( i_fscod2 == 0X03 )
+ return 0;
+ *pi_sample_rate = pi_samplerate[i_fscod2] / 2;
+ i_numblkscod = 6;
+ }
+ else
+ {
+ static const int pi_blocks[4] = { 1, 2, 3, 6 };
+
+ *pi_sample_rate = pi_samplerate[i_fscod];
+ i_numblkscod = pi_blocks[bs_read( &s, 2 )];
+ }
+
+ i_acmod = bs_read( &s, 3 );
+ i_lfeon = bs_read1( &s );
+
+ *pi_channels = p_acmod[i_acmod].i_count + i_lfeon;
+ *pi_channels_conf = p_acmod[i_acmod].i_configuration | ( i_lfeon ? AOUT_CHAN_LFE : 0);
+ *pi_bit_rate = 8 * i_bytes * (*pi_sample_rate) / (i_numblkscod * 256);
+
+ return i_bytes;
+}
+
+static int SyncInfo( const uint8_t *p_buf,
+ unsigned int *pi_channels,
+ unsigned int *pi_channels_conf,
+ unsigned int *pi_sample_rate, int *pi_bit_rate )
+{
+ int bsid;
+
+ /* Check synword */
+ if( p_buf[0] != 0x0b || p_buf[1] != 0x77 )
+ return 0;
+
+ /* Check bsid */
+ bsid = p_buf[5] >> 3;
+ if( bsid > 16 )
+ return 0;
+
+ if( bsid <= 10 )
+ return SyncInfoAC3( p_buf, pi_channels, pi_channels_conf,
+ pi_sample_rate, pi_bit_rate );
+ else
+ return SyncInfoEAC3( p_buf, pi_channels, pi_channels_conf,
+ pi_sample_rate, pi_bit_rate );
+}
+