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" */
6 #include <sys/uio.h> /* "input.h" */
11 #include "vlc_thread.h"
12 #include "debug.h" /* "input_netlist.h" */
14 #include "intf_msg.h" /* intf_DbgMsg(), intf_ErrMsg() */
16 #include "input.h" /* pes_packet_t */
17 #include "input_netlist.h" /* input_NetlistFreePES() */
18 #include "decoder_fifo.h" /* DECODER_FIFO_(ISEMPTY|START|INCSTART)() */
20 #include "audio_output.h"
22 #include "ac3_decoder.h"
23 #include "ac3_exponent.h"
25 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 };
26 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 };
27 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 };
29 static __inline__ void exp_unpack_ch( u16 type, u16 expstr, u16 ngrps, u16 initial_exp, u16 exps[], u16 * dest )
34 s16 exp_1,exp_2,exp_3;
37 if(expstr == EXP_REUSE)
40 /* Handle the initial absolute exponent */
41 exp_acc = initial_exp;
44 /* In the case of a fbw channel then the initial absolute values is
46 if(type != UNPACK_CPL)
49 /* Loop through the groups and fill the dest array appropriately */
50 for ( i = 0; i < ngrps; i++ )
55 //FIXME set an error flag and mute the frame
56 printf( "\n!! Invalid exponent !!\n" );
63 exp_2 = (exps[i] - (exp_1 * 25)) / 5;
64 exp_3 = exps[i] - (exp_1 * 25) - (exp_2 * 5) ;
70 exp_acc += (exps_1[exps[i]] - 2);
75 exp_acc += (exps_2[exps[i]] - 2);
80 exp_acc += (exps_3[exps[i]] - 2);
88 exp_acc += (exps_1[exps[i]] - 2);
91 exp_acc += (exps_2[exps[i]] - 2);
94 exp_acc += (exps_3[exps[i]] - 2);
100 exp_acc += (exps_1[exps[i]] - 2);
102 exp_acc += (exps_2[exps[i]] - 2);
104 exp_acc += (exps_3[exps[i]] - 2);
111 void exponent_unpack( ac3dec_thread_t * p_ac3dec )
115 for(i=0; i< p_ac3dec->bsi.nfchans; i++)
116 exp_unpack_ch(UNPACK_FBW, p_ac3dec->audblk.chexpstr[i], p_ac3dec->audblk.nchgrps[i], p_ac3dec->audblk.exps[i][0],
117 &p_ac3dec->audblk.exps[i][1], p_ac3dec->audblk.fbw_exp[i]);
119 if(p_ac3dec->audblk.cplinu)
120 exp_unpack_ch(UNPACK_CPL, p_ac3dec->audblk.cplexpstr, p_ac3dec->audblk.ncplgrps, p_ac3dec->audblk.cplabsexp << 1,
121 p_ac3dec->audblk.cplexps, &p_ac3dec->audblk.cpl_exp[p_ac3dec->audblk.cplstrtmant]);
123 if(p_ac3dec->bsi.lfeon)
124 exp_unpack_ch(UNPACK_LFE, p_ac3dec->audblk.lfeexpstr, 2, p_ac3dec->audblk.lfeexps[0],
125 &p_ac3dec->audblk.lfeexps[1], p_ac3dec->audblk.lfe_exp);