-/* Tables */
-static const struct
-{
- unsigned int i_count;
- unsigned int i_configuration;
-} p_acmod[8] = {
- { 2, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_DUALMONO }, /* Dual-channel 1+1 */
- { 1, AOUT_CHAN_CENTER }, /* Mono 1/0 */
- { 2, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT }, /* Stereo 2/0 */
- { 3, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER }, /* 3F 3/0 */
- { 3, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_REARCENTER }, /* 2F1R 2/1 */
- { 4, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER |
- AOUT_CHAN_REARCENTER }, /* 3F1R 3/1 */
- { 5, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT |
- AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT }, /* 2F2R 2/2 */
- { 6, AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT | AOUT_CHAN_CENTER |
- AOUT_CHAN_REARLEFT | AOUT_CHAN_REARRIGHT }, /* 3F2R 3/2 */
-};
-
-/**
- * It parse AC3 sync info.
- *
- * This code is borrowed from liba52 by Aaron Holtzman & Michel Lespinasse,
- * since we don't want to oblige S/PDIF people to use liba52 just to get
- * their SyncInfo...
- */
-static int SyncInfoAC3( 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 uint8_t halfrate[12] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3 };
- static const int rate[] = { 32, 40, 48, 56, 64, 80, 96, 112,
- 128, 160, 192, 224, 256, 320, 384, 448,
- 512, 576, 640 };
- static const uint8_t lfeon[8] = { 0x10, 0x10, 0x04, 0x04,
- 0x04, 0x01, 0x04, 0x01 };
- int frmsizecod;
- int bitrate;
- int half;
- int acmod;
-
- /* */
- half = halfrate[p_buf[5] >> 3];
-
- /* acmod, dsurmod and lfeon */
- acmod = p_buf[6] >> 5;
- if ( (p_buf[6] & 0xf8) == 0x50 )
- {
- /* Dolby surround = stereo + Dolby */
- *pi_channels = 2;
- *pi_channels_conf = AOUT_CHAN_LEFT | AOUT_CHAN_RIGHT
- | AOUT_CHAN_DOLBYSTEREO;
- }
- else
- {
- *pi_channels = p_acmod[acmod].i_count;
- *pi_channels_conf = p_acmod[acmod].i_configuration;
- }
-
- if ( p_buf[6] & lfeon[acmod] )
- {
- (*pi_channels)++;
- *pi_channels_conf |= AOUT_CHAN_LFE;
- }
-
- frmsizecod = p_buf[4] & 63;
- if (frmsizecod >= 38)
- return 0;
- bitrate = rate [frmsizecod >> 1];
- *pi_bit_rate = (bitrate * 1000) >> half;
-
- switch (p_buf[4] & 0xc0) {
- case 0:
- *pi_sample_rate = 48000 >> half;
- return 4 * bitrate;
- case 0x40:
- *pi_sample_rate = 44100 >> half;
- return 2 * (320 * bitrate / 147 + (frmsizecod & 1));
- case 0x80:
- *pi_sample_rate = 32000 >> half;
- return 6 * bitrate;
- default:
- return 0;
- }
-}
-
-/**
- * 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 );
-}
-