1 #include <unistd.h> /* getpid() */
3 #include <stdio.h> /* "intf_msg.h" */
4 #include <stdlib.h> /* malloc(), free() */
5 #include <sys/soundcard.h> /* "audio_output.h" */
7 #include <sys/uio.h> /* "input.h" */
12 #include "vlc_thread.h"
13 #include "debug.h" /* "input_netlist.h" */
15 #include "intf_msg.h" /* intf_DbgMsg(), intf_ErrMsg() */
17 #include "input.h" /* pes_packet_t */
18 #include "input_netlist.h" /* input_NetlistFreePES() */
19 #include "decoder_fifo.h" /* DECODER_FIFO_(ISEMPTY|START|INCSTART)() */
21 #include "audio_output.h"
23 #include "ac3_decoder.h"
24 #include "ac3_exponent.h"
26 static const s16 exps_1[128] = { -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3 };
28 static const s16 exps_2[128] = { -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2, -2, -2, -1, -1, -1, -1, -1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, -2, -2, -2 };
30 static const s16 exps_3[128] = { -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0, 1, 2, -2, -1, 0 };
33 static const s16 exps_1[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5 };
34 static const s16 exps_2[128] = { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 0, 0, 0 };
35 static const s16 exps_3[128] = { 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2 };
38 static __inline__ void exp_unpack_ch( u16 type, u16 expstr, u16 ngrps, u16 initial_exp, u16 exps[], u16 * dest )
43 s16 exp_1,exp_2,exp_3;
46 if ( expstr == EXP_REUSE )
51 /* Handle the initial absolute exponent */
52 exp_acc = initial_exp;
55 /* In the case of a fbw channel then the initial absolute values is
57 if ( type != UNPACK_CPL )
62 /* Loop through the groups and fill the dest array appropriately */
66 for ( i = 0; i < ngrps; i++ )
71 fprintf( stderr, "ac3dec debug: invalid exponent\n" );
74 exp_acc += (exps_1[exps[i]] /*- 2*/);
79 exp_acc += (exps_2[exps[i]] /*- 2*/);
84 exp_acc += (exps_3[exps[i]] /*- 2*/);
93 for ( i = 0; i < ngrps; i++ )
98 fprintf( stderr, "ac3dec debug: invalid exponent\n" );
101 exp_acc += (exps_1[exps[i]] /*- 2*/);
104 exp_acc += (exps_2[exps[i]] /*- 2*/);
107 exp_acc += (exps_3[exps[i]] /*- 2*/);
114 for ( i = 0; i < ngrps; i++ )
119 fprintf( stderr, "ac3dec debug: invalid exponent\n" );
122 exp_acc += (exps_1[exps[i]] /*- 2*/);
124 exp_acc += (exps_2[exps[i]] /*- 2*/);
126 exp_acc += (exps_3[exps[i]] /*- 2*/);
132 fprintf( stderr, "ac3dec debug: expstr == %i <maxx@via.ecp.fr>\n", expstr );
136 for ( i = 0; i < ngrps; i++ )
141 //FIXME set an error flag and mute the frame
142 fprintf( stderr, "!! Invalid exponent !!\n" );
148 exp_1 = exps[i] / 25;
149 exp_2 = (exps[i] - (exp_1 * 25)) / 5;
150 exp_3 = exps[i] - (exp_1 * 25) - (exp_2 * 5) ;
156 exp_acc += (exps_1[exps[i]] - 2);
161 exp_acc += (exps_2[exps[i]] - 2);
166 exp_acc += (exps_3[exps[i]] - 2);
174 exp_acc += (exps_1[exps[i]] - 2);
177 exp_acc += (exps_2[exps[i]] - 2);
180 exp_acc += (exps_3[exps[i]] - 2);
186 exp_acc += (exps_1[exps[i]] - 2);
188 exp_acc += (exps_2[exps[i]] - 2);
190 exp_acc += (exps_3[exps[i]] - 2);
198 void exponent_unpack( ac3dec_thread_t * p_ac3dec )
202 for ( i = 0; i < p_ac3dec->bsi.nfchans; i++ )
204 exp_unpack_ch( UNPACK_FBW, p_ac3dec->audblk.chexpstr[i], p_ac3dec->audblk.nchgrps[i], p_ac3dec->audblk.exps[i][0], &p_ac3dec->audblk.exps[i][1], p_ac3dec->audblk.fbw_exp[i] );
207 if ( p_ac3dec->audblk.cplinu )
209 exp_unpack_ch( UNPACK_CPL, p_ac3dec->audblk.cplexpstr, p_ac3dec->audblk.ncplgrps, p_ac3dec->audblk.cplabsexp << 1, p_ac3dec->audblk.cplexps, &p_ac3dec->audblk.cpl_exp[p_ac3dec->audblk.cplstrtmant] );
212 if ( p_ac3dec->bsi.lfeon )
214 exp_unpack_ch( UNPACK_LFE, p_ac3dec->audblk.lfeexpstr, 2, p_ac3dec->audblk.lfeexps[0], &p_ac3dec->audblk.lfeexps[1], p_ac3dec->audblk.lfe_exp );