1 /*****************************************************************************
2 * ac3_parse.c: ac3 parsing procedures
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
6 * Authors: Michel Kaempf <maxx@via.ecp.fr>
7 * Aaron Holtzman <aholtzma@engr.uvic.ca>
8 * Renaud Dartus <reno@videolan.org>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
23 *****************************************************************************/
33 #include "stream_control.h"
34 #include "input_ext-dec.h"
36 #include "audio_output.h"
39 #include "ac3_decoder.h"
40 #include "ac3_decoder_thread.h"
42 #include "ac3_internal.h"
43 #include "ac3_bit_stream.h"
46 static const u16 nfchans[] = { 2, 1, 2, 3, 3, 4, 4, 5 };
54 static const struct frmsize_s frmsizecod_tbl[] =
56 { 32 ,{64 ,69 ,96 } },
57 { 32 ,{64 ,70 ,96 } },
58 { 40 ,{80 ,87 ,120 } },
59 { 40 ,{80 ,88 ,120 } },
60 { 48 ,{96 ,104 ,144 } },
61 { 48 ,{96 ,105 ,144 } },
62 { 56 ,{112 ,121 ,168 } },
63 { 56 ,{112 ,122 ,168 } },
64 { 64 ,{128 ,139 ,192 } },
65 { 64 ,{128 ,140 ,192 } },
66 { 80 ,{160 ,174 ,240 } },
67 { 80 ,{160 ,175 ,240 } },
68 { 96 ,{192 ,208 ,288 } },
69 { 96 ,{192 ,209 ,288 } },
70 { 112 ,{224 ,243 ,336 } },
71 { 112 ,{224 ,244 ,336 } },
72 { 128 ,{256 ,278 ,384 } },
73 { 128 ,{256 ,279 ,384 } },
74 { 160 ,{320 ,348 ,480 } },
75 { 160 ,{320 ,349 ,480 } },
76 { 192 ,{384 ,417 ,576 } },
77 { 192 ,{384 ,418 ,576 } },
78 { 224 ,{448 ,487 ,672 } },
79 { 224 ,{448 ,488 ,672 } },
80 { 256 ,{512 ,557 ,768 } },
81 { 256 ,{512 ,558 ,768 } },
82 { 320 ,{640 ,696 ,960 } },
83 { 320 ,{640 ,697 ,960 } },
84 { 384 ,{768 ,835 ,1152 } },
85 { 384 ,{768 ,836 ,1152 } },
86 { 448 ,{896 ,975 ,1344 } },
87 { 448 ,{896 ,976 ,1344 } },
88 { 512 ,{1024 ,1114 ,1536 } },
89 { 512 ,{1024 ,1115 ,1536 } },
90 { 576 ,{1152 ,1253 ,1728 } },
91 { 576 ,{1152 ,1254 ,1728 } },
92 { 640 ,{1280 ,1393 ,1920 } },
93 { 640 ,{1280 ,1394 ,1920 } }};
95 static const int fscod_tbl[] = {48000, 44100, 32000};
97 /* Some internal functions */
98 void parse_bsi_stats (ac3dec_t * p_ac3dec);
99 void parse_audblk_stats (ac3dec_t * p_ac3dec);
101 /* Parse a syncinfo structure */
102 int ac3_sync_frame (ac3dec_t * p_ac3dec, ac3_sync_info_t * p_sync_info)
106 p_ac3dec->bit_stream.total_bits_read = 0;
107 p_ac3dec->bit_stream.i_available = 0;
109 /* sync word - should be 0x0b77 */
110 if( (buf = bitstream_get(&(p_ac3dec->bit_stream),16)) != 0x0b77)
115 /* Get crc1 - we don't actually use this data though */
116 bitstream_get(&(p_ac3dec->bit_stream),16);
118 /* Get the sampling rate */
119 p_ac3dec->syncinfo.fscod = bitstream_get(&(p_ac3dec->bit_stream),2);
121 if (p_ac3dec->syncinfo.fscod >= 3)
126 /* Get the frame size code */
127 p_ac3dec->syncinfo.frmsizecod = bitstream_get(&(p_ac3dec->bit_stream),6);
129 if (p_ac3dec->syncinfo.frmsizecod >= 38)
134 p_sync_info->bit_rate = frmsizecod_tbl[p_ac3dec->syncinfo.frmsizecod].bit_rate;
136 p_ac3dec->syncinfo.frame_size = frmsizecod_tbl[p_ac3dec->syncinfo.frmsizecod].frm_size[p_ac3dec->syncinfo.fscod];
137 p_sync_info->frame_size = 2 * p_ac3dec->syncinfo.frame_size;
139 p_sync_info->sample_rate = fscod_tbl[p_ac3dec->syncinfo.fscod];
145 * This routine fills a bsi struct from the AC3 stream
147 int parse_bsi (ac3dec_t * p_ac3dec)
149 /* Check the AC-3 version number */
150 p_ac3dec->bsi.bsid = bitstream_get(&(p_ac3dec->bit_stream),5);
152 if (p_ac3dec->bsi.bsid > 8)
157 /* Get the audio service provided by the stream */
158 p_ac3dec->bsi.bsmod = bitstream_get(&(p_ac3dec->bit_stream),3);
160 /* Get the audio coding mode (ie how many channels)*/
161 p_ac3dec->bsi.acmod = bitstream_get(&(p_ac3dec->bit_stream),3);
162 /* Predecode the number of full bandwidth channels as we use this
164 p_ac3dec->bsi.nfchans = nfchans[p_ac3dec->bsi.acmod];
166 /* If it is in use, get the centre channel mix level */
167 if ((p_ac3dec->bsi.acmod & 0x1) && (p_ac3dec->bsi.acmod != 0x1))
169 p_ac3dec->bsi.cmixlev = bitstream_get(&(p_ac3dec->bit_stream),2);
172 /* If it is in use, get the surround channel mix level */
173 if (p_ac3dec->bsi.acmod & 0x4)
175 p_ac3dec->bsi.surmixlev = bitstream_get(&(p_ac3dec->bit_stream),2);
178 /* Get the dolby surround mode if in 2/0 mode */
179 if (p_ac3dec->bsi.acmod == 0x2)
181 p_ac3dec->bsi.dsurmod = bitstream_get(&(p_ac3dec->bit_stream),2);
184 /* Is the low frequency effects channel on? */
185 p_ac3dec->bsi.lfeon = bitstream_get(&(p_ac3dec->bit_stream),1);
187 /* Get the dialogue normalization level */
188 p_ac3dec->bsi.dialnorm = bitstream_get(&(p_ac3dec->bit_stream),5);
190 /* Does compression gain exist? */
191 if ((p_ac3dec->bsi.compre = bitstream_get(&(p_ac3dec->bit_stream),1)))
193 /* Get compression gain */
194 p_ac3dec->bsi.compr = bitstream_get(&(p_ac3dec->bit_stream),8);
197 /* Does language code exist? */
198 if ((p_ac3dec->bsi.langcode = bitstream_get(&(p_ac3dec->bit_stream),1)))
200 /* Get langauge code */
201 p_ac3dec->bsi.langcod = bitstream_get(&(p_ac3dec->bit_stream),8);
204 /* Does audio production info exist? */
205 if ((p_ac3dec->bsi.audprodie = bitstream_get(&(p_ac3dec->bit_stream),1)))
208 p_ac3dec->bsi.mixlevel = bitstream_get(&(p_ac3dec->bit_stream),5);
211 p_ac3dec->bsi.roomtyp = bitstream_get(&(p_ac3dec->bit_stream),2);
214 /* If we're in dual mono mode then get some extra info */
215 if (p_ac3dec->bsi.acmod == 0)
217 /* Get the dialogue normalization level two */
218 p_ac3dec->bsi.dialnorm2 = bitstream_get(&(p_ac3dec->bit_stream),5);
220 /* Does compression gain two exist? */
221 if ((p_ac3dec->bsi.compr2e = bitstream_get(&(p_ac3dec->bit_stream),1)))
223 /* Get compression gain two */
224 p_ac3dec->bsi.compr2 = bitstream_get(&(p_ac3dec->bit_stream),8);
227 /* Does language code two exist? */
228 if ((p_ac3dec->bsi.langcod2e = bitstream_get(&(p_ac3dec->bit_stream),1)))
230 /* Get langauge code two */
231 p_ac3dec->bsi.langcod2 = bitstream_get(&(p_ac3dec->bit_stream),8);
234 /* Does audio production info two exist? */
235 if ((p_ac3dec->bsi.audprodi2e = bitstream_get(&(p_ac3dec->bit_stream),1)))
237 /* Get mix level two */
238 p_ac3dec->bsi.mixlevel2 = bitstream_get(&(p_ac3dec->bit_stream),5);
240 /* Get room type two */
241 p_ac3dec->bsi.roomtyp2 = bitstream_get(&(p_ac3dec->bit_stream),2);
245 /* Get the copyright bit */
246 p_ac3dec->bsi.copyrightb = bitstream_get(&(p_ac3dec->bit_stream),1);
248 /* Get the original bit */
249 p_ac3dec->bsi.origbs = bitstream_get(&(p_ac3dec->bit_stream),1);
251 /* Does timecode one exist? */
252 if ((p_ac3dec->bsi.timecod1e = bitstream_get(&(p_ac3dec->bit_stream),1)))
254 p_ac3dec->bsi.timecod1 = bitstream_get(&(p_ac3dec->bit_stream),14);
257 /* Does timecode two exist? */
258 if ((p_ac3dec->bsi.timecod2e = bitstream_get(&(p_ac3dec->bit_stream),1)))
260 p_ac3dec->bsi.timecod2 = bitstream_get(&(p_ac3dec->bit_stream),14);
263 /* Does addition info exist? */
264 if ((p_ac3dec->bsi.addbsie = bitstream_get(&(p_ac3dec->bit_stream),1)))
268 /* Get how much info is there */
269 p_ac3dec->bsi.addbsil = bitstream_get(&(p_ac3dec->bit_stream),6);
271 /* Get the additional info */
272 for (i=0;i<(p_ac3dec->bsi.addbsil + 1);i++)
274 p_ac3dec->bsi.addbsi[i] = bitstream_get(&(p_ac3dec->bit_stream),8);
279 parse_bsi_stats (p_ac3dec);
285 /* More pain inducing parsing */
286 int parse_audblk (ac3dec_t * p_ac3dec, int blknum)
290 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
292 /* Is this channel an interleaved 256 + 256 block ? */
293 p_ac3dec->audblk.blksw[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
296 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
298 /* Should we dither this channel? */
299 p_ac3dec->audblk.dithflag[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
302 /* Does dynamic range control exist? */
303 if ((p_ac3dec->audblk.dynrnge = bitstream_get(&(p_ac3dec->bit_stream),1)))
305 /* Get dynamic range info */
306 p_ac3dec->audblk.dynrng = bitstream_get(&(p_ac3dec->bit_stream),8);
309 /* If we're in dual mono mode then get the second channel DR info */
310 if (p_ac3dec->bsi.acmod == 0)
312 /* Does dynamic range control two exist? */
313 if ((p_ac3dec->audblk.dynrng2e = bitstream_get(&(p_ac3dec->bit_stream),1)))
315 /* Get dynamic range info */
316 p_ac3dec->audblk.dynrng2 = bitstream_get(&(p_ac3dec->bit_stream),8);
320 /* Does coupling strategy exist? */
321 p_ac3dec->audblk.cplstre = bitstream_get(&(p_ac3dec->bit_stream),1);
323 if ((!blknum) && (!p_ac3dec->audblk.cplstre))
328 if (p_ac3dec->audblk.cplstre)
330 /* Is coupling turned on? */
331 if ((p_ac3dec->audblk.cplinu = bitstream_get(&(p_ac3dec->bit_stream),1)))
333 int nb_coupled_channels;
335 nb_coupled_channels = 0;
336 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
338 p_ac3dec->audblk.chincpl[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
339 if (p_ac3dec->audblk.chincpl[i])
341 nb_coupled_channels++;
344 if (nb_coupled_channels < 2)
349 if (p_ac3dec->bsi.acmod == 0x2)
351 p_ac3dec->audblk.phsflginu = bitstream_get(&(p_ac3dec->bit_stream),1);
353 p_ac3dec->audblk.cplbegf = bitstream_get(&(p_ac3dec->bit_stream),4);
354 p_ac3dec->audblk.cplendf = bitstream_get(&(p_ac3dec->bit_stream),4);
356 if (p_ac3dec->audblk.cplbegf > p_ac3dec->audblk.cplendf + 2)
361 p_ac3dec->audblk.ncplsubnd = (p_ac3dec->audblk.cplendf + 2) - p_ac3dec->audblk.cplbegf + 1;
363 /* Calculate the start and end bins of the coupling channel */
364 p_ac3dec->audblk.cplstrtmant = (p_ac3dec->audblk.cplbegf * 12) + 37 ;
365 p_ac3dec->audblk.cplendmant = ((p_ac3dec->audblk.cplendf + 3) * 12) + 37;
367 /* The number of combined subbands is ncplsubnd minus each combined
369 p_ac3dec->audblk.ncplbnd = p_ac3dec->audblk.ncplsubnd;
371 for (i=1; i< p_ac3dec->audblk.ncplsubnd; i++)
373 p_ac3dec->audblk.cplbndstrc[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
374 p_ac3dec->audblk.ncplbnd -= p_ac3dec->audblk.cplbndstrc[i];
379 if (p_ac3dec->audblk.cplinu)
381 /* Loop through all the channels and get their coupling co-ords */
382 for (i=0; i < p_ac3dec->bsi.nfchans;i++)
384 if (!p_ac3dec->audblk.chincpl[i])
389 /* Is there new coupling co-ordinate info? */
390 p_ac3dec->audblk.cplcoe[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
392 if ((!blknum) && (!p_ac3dec->audblk.cplcoe[i]))
397 if (p_ac3dec->audblk.cplcoe[i])
399 p_ac3dec->audblk.mstrcplco[i] = bitstream_get(&(p_ac3dec->bit_stream),2);
400 for (j=0;j < p_ac3dec->audblk.ncplbnd; j++)
402 p_ac3dec->audblk.cplcoexp[i][j] = bitstream_get(&(p_ac3dec->bit_stream),4);
403 p_ac3dec->audblk.cplcomant[i][j] = bitstream_get(&(p_ac3dec->bit_stream),4);
408 /* If we're in dual mono mode, there's going to be some phase info */
409 if ((p_ac3dec->bsi.acmod == 0x2) && p_ac3dec->audblk.phsflginu &&
410 (p_ac3dec->audblk.cplcoe[0] || p_ac3dec->audblk.cplcoe[1]))
412 for (j=0; j < p_ac3dec->audblk.ncplbnd; j++)
414 p_ac3dec->audblk.phsflg[j] = bitstream_get(&(p_ac3dec->bit_stream),1);
420 /* If we're in dual mono mode, there may be a rematrix strategy */
421 if (p_ac3dec->bsi.acmod == 0x2)
423 p_ac3dec->audblk.rematstr = bitstream_get(&(p_ac3dec->bit_stream),1);
425 if ((!blknum) && (!p_ac3dec->audblk.rematstr))
430 if (p_ac3dec->audblk.rematstr)
432 if (p_ac3dec->audblk.cplinu == 0)
434 for (i = 0; i < 4; i++)
436 p_ac3dec->audblk.rematflg[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
439 if ((p_ac3dec->audblk.cplbegf > 2) && p_ac3dec->audblk.cplinu)
441 for (i = 0; i < 4; i++)
443 p_ac3dec->audblk.rematflg[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
446 if ((p_ac3dec->audblk.cplbegf <= 2) && p_ac3dec->audblk.cplinu)
448 for (i = 0; i < 3; i++)
450 p_ac3dec->audblk.rematflg[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
453 if ((p_ac3dec->audblk.cplbegf == 0) && p_ac3dec->audblk.cplinu)
455 for (i = 0; i < 2; i++)
457 p_ac3dec->audblk.rematflg[i] = bitstream_get(&(p_ac3dec->bit_stream),1);
463 if (p_ac3dec->audblk.cplinu)
465 /* Get the coupling channel exponent strategy */
466 p_ac3dec->audblk.cplexpstr = bitstream_get(&(p_ac3dec->bit_stream),2);
468 if ((!blknum) && (p_ac3dec->audblk.cplexpstr == EXP_REUSE))
473 if (p_ac3dec->audblk.cplexpstr==0)
475 p_ac3dec->audblk.ncplgrps = 0;
479 p_ac3dec->audblk.ncplgrps = (p_ac3dec->audblk.cplendmant - p_ac3dec->audblk.cplstrtmant) /
480 (3 << (p_ac3dec->audblk.cplexpstr-1));
485 for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
487 p_ac3dec->audblk.chexpstr[i] = bitstream_get(&(p_ac3dec->bit_stream),2);
489 if ((!blknum) && (p_ac3dec->audblk.chexpstr[i] == EXP_REUSE))
495 /* Get the exponent strategy for lfe channel */
496 if (p_ac3dec->bsi.lfeon)
498 p_ac3dec->audblk.lfeexpstr = bitstream_get(&(p_ac3dec->bit_stream),1);
500 if ((!blknum) && (p_ac3dec->audblk.lfeexpstr == EXP_REUSE))
506 /* Determine the bandwidths of all the fbw channels */
507 for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
511 if (p_ac3dec->audblk.chexpstr[i] != EXP_REUSE)
513 if (p_ac3dec->audblk.cplinu && p_ac3dec->audblk.chincpl[i])
515 p_ac3dec->audblk.endmant[i] = p_ac3dec->audblk.cplstrtmant;
519 p_ac3dec->audblk.chbwcod[i] = bitstream_get(&(p_ac3dec->bit_stream),6);
521 if (p_ac3dec->audblk.chbwcod[i] > 60)
526 p_ac3dec->audblk.endmant[i] = ((p_ac3dec->audblk.chbwcod[i] + 12) * 3) + 37;
529 /* Calculate the number of exponent groups to fetch */
530 grp_size = 3 * (1 << (p_ac3dec->audblk.chexpstr[i] - 1));
531 p_ac3dec->audblk.nchgrps[i] = (p_ac3dec->audblk.endmant[i] - 1 + (grp_size - 3)) / grp_size;
535 /* Get the coupling exponents if they exist */
536 if (p_ac3dec->audblk.cplinu && (p_ac3dec->audblk.cplexpstr != EXP_REUSE))
538 p_ac3dec->audblk.cplabsexp = bitstream_get(&(p_ac3dec->bit_stream),4);
539 for (i=0; i< p_ac3dec->audblk.ncplgrps;i++)
541 p_ac3dec->audblk.cplexps[i] = bitstream_get(&(p_ac3dec->bit_stream),7);
543 if (p_ac3dec->audblk.cplexps[i] >= 125)
550 /* Get the fwb channel exponents */
551 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
553 if (p_ac3dec->audblk.chexpstr[i] != EXP_REUSE)
555 p_ac3dec->audblk.exps[i][0] = bitstream_get(&(p_ac3dec->bit_stream),4);
556 for (j=1; j<=p_ac3dec->audblk.nchgrps[i];j++)
558 p_ac3dec->audblk.exps[i][j] = bitstream_get(&(p_ac3dec->bit_stream),7);
559 if (p_ac3dec->audblk.exps[i][j] >= 125)
564 p_ac3dec->audblk.gainrng[i] = bitstream_get(&(p_ac3dec->bit_stream),2);
568 /* Get the lfe channel exponents */
569 if (p_ac3dec->bsi.lfeon && (p_ac3dec->audblk.lfeexpstr != EXP_REUSE))
571 p_ac3dec->audblk.lfeexps[0] = bitstream_get(&(p_ac3dec->bit_stream),4);
572 p_ac3dec->audblk.lfeexps[1] = bitstream_get(&(p_ac3dec->bit_stream),7);
573 if (p_ac3dec->audblk.lfeexps[1] >= 125)
577 p_ac3dec->audblk.lfeexps[2] = bitstream_get(&(p_ac3dec->bit_stream),7);
578 if (p_ac3dec->audblk.lfeexps[2] >= 125)
584 /* Get the parametric bit allocation parameters */
585 p_ac3dec->audblk.baie = bitstream_get(&(p_ac3dec->bit_stream),1);
587 if ((!blknum) && (!p_ac3dec->audblk.baie))
592 if (p_ac3dec->audblk.baie)
594 p_ac3dec->audblk.sdcycod = bitstream_get(&(p_ac3dec->bit_stream),2);
595 p_ac3dec->audblk.fdcycod = bitstream_get(&(p_ac3dec->bit_stream),2);
596 p_ac3dec->audblk.sgaincod = bitstream_get(&(p_ac3dec->bit_stream),2);
597 p_ac3dec->audblk.dbpbcod = bitstream_get(&(p_ac3dec->bit_stream),2);
598 p_ac3dec->audblk.floorcod = bitstream_get(&(p_ac3dec->bit_stream),3);
601 /* Get the SNR off set info if it exists */
602 p_ac3dec->audblk.snroffste = bitstream_get(&(p_ac3dec->bit_stream),1);
603 if ((!blknum) && (!p_ac3dec->audblk.snroffste))
608 if (p_ac3dec->audblk.snroffste)
610 p_ac3dec->audblk.csnroffst = bitstream_get(&(p_ac3dec->bit_stream),6);
612 if (p_ac3dec->audblk.cplinu)
614 p_ac3dec->audblk.cplfsnroffst = bitstream_get(&(p_ac3dec->bit_stream),4);
615 p_ac3dec->audblk.cplfgaincod = bitstream_get(&(p_ac3dec->bit_stream),3);
618 for (i = 0;i < p_ac3dec->bsi.nfchans; i++)
620 p_ac3dec->audblk.fsnroffst[i] = bitstream_get(&(p_ac3dec->bit_stream),4);
621 p_ac3dec->audblk.fgaincod[i] = bitstream_get(&(p_ac3dec->bit_stream),3);
623 if (p_ac3dec->bsi.lfeon)
625 p_ac3dec->audblk.lfefsnroffst = bitstream_get(&(p_ac3dec->bit_stream),4);
626 p_ac3dec->audblk.lfefgaincod = bitstream_get(&(p_ac3dec->bit_stream),3);
630 /* Get coupling leakage info if it exists */
631 if (p_ac3dec->audblk.cplinu)
633 p_ac3dec->audblk.cplleake = bitstream_get(&(p_ac3dec->bit_stream),1);
634 if ((!blknum) && (!p_ac3dec->audblk.cplleake))
639 if (p_ac3dec->audblk.cplleake)
641 p_ac3dec->audblk.cplfleak = bitstream_get(&(p_ac3dec->bit_stream),3);
642 p_ac3dec->audblk.cplsleak = bitstream_get(&(p_ac3dec->bit_stream),3);
646 /* Get the delta bit alloaction info */
647 p_ac3dec->audblk.deltbaie = bitstream_get(&(p_ac3dec->bit_stream),1);
649 if (p_ac3dec->audblk.deltbaie)
651 if (p_ac3dec->audblk.cplinu)
653 p_ac3dec->audblk.cpldeltbae = bitstream_get(&(p_ac3dec->bit_stream),2);
654 if (p_ac3dec->audblk.cpldeltbae == 3)
660 for (i = 0;i < p_ac3dec->bsi.nfchans; i++)
662 p_ac3dec->audblk.deltbae[i] = bitstream_get(&(p_ac3dec->bit_stream),2);
663 if (p_ac3dec->audblk.deltbae[i] == 3)
669 if (p_ac3dec->audblk.cplinu && (p_ac3dec->audblk.cpldeltbae == DELTA_BIT_NEW))
671 p_ac3dec->audblk.cpldeltnseg = bitstream_get(&(p_ac3dec->bit_stream),3);
672 for (i = 0;i < p_ac3dec->audblk.cpldeltnseg + 1; i++)
674 p_ac3dec->audblk.cpldeltoffst[i] = bitstream_get(&(p_ac3dec->bit_stream),5);
675 p_ac3dec->audblk.cpldeltlen[i] = bitstream_get(&(p_ac3dec->bit_stream),4);
676 p_ac3dec->audblk.cpldeltba[i] = bitstream_get(&(p_ac3dec->bit_stream),3);
680 for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
682 if (p_ac3dec->audblk.deltbae[i] == DELTA_BIT_NEW)
684 p_ac3dec->audblk.deltnseg[i] = bitstream_get(&(p_ac3dec->bit_stream),3);
685 // if (p_ac3dec->audblk.deltnseg[i] >= 8)
686 // fprintf (stderr, "parse debug: p_ac3dec->audblk.deltnseg[%i] == %i\n", i, p_ac3dec->audblk.deltnseg[i]);
687 for (j = 0; j < p_ac3dec->audblk.deltnseg[i] + 1; j++)
689 p_ac3dec->audblk.deltoffst[i][j] = bitstream_get(&(p_ac3dec->bit_stream),5);
690 p_ac3dec->audblk.deltlen[i][j] = bitstream_get(&(p_ac3dec->bit_stream),4);
691 p_ac3dec->audblk.deltba[i][j] = bitstream_get(&(p_ac3dec->bit_stream),3);
697 /* Check to see if there's any dummy info to get */
698 p_ac3dec->audblk.skiple = bitstream_get(&(p_ac3dec->bit_stream),1);
700 if (p_ac3dec->audblk.skiple)
702 p_ac3dec->audblk.skipl = bitstream_get(&(p_ac3dec->bit_stream),9);
704 for (i = 0; i < p_ac3dec->audblk.skipl ; i++)
706 bitstream_get(&(p_ac3dec->bit_stream),8);
711 // parse_audblk_stats(p_ac3dec);
717 void parse_auxdata (ac3dec_t * p_ac3dec)
722 skip_length = (p_ac3dec->syncinfo.frame_size * 16) - p_ac3dec->bit_stream.total_bits_read - 17 - 1;
724 for (i = 0; i < skip_length; i++)
726 bitstream_get(&(p_ac3dec->bit_stream),1);
729 /* get the auxdata exists bit */
730 bitstream_get(&(p_ac3dec->bit_stream),1);
732 /* Skip the CRC reserved bit */
733 bitstream_get(&(p_ac3dec->bit_stream),1);
736 bitstream_get(&(p_ac3dec->bit_stream),16);
739 void parse_bsi_stats (ac3dec_t * p_ac3dec) /*Some stats */
746 static const char *service_ids[8] =
752 static const struct mixlev_s cmixlev_tbl[4] =
754 {0.707, "(-3.0 dB)"}, {0.595, "(-4.5 dB)"},
755 {0.500, "(-6.0 dB)"}, {1.0, "Invalid"}
757 static const struct mixlev_s smixlev_tbl[4] =
759 {0.707, "(-3.0 dB)"}, {0.500, "(-6.0 dB)"},
760 { 0.0, "off "}, { 1.0, "Invalid"}
768 /* if ((p_ac3dec->bsi.acmod & 0x1) && (p_ac3dec->bsi.acmod != 0x1))
769 printf("CentreMixLevel %s ",cmixlev_tbl[p_ac3dec->bsi.cmixlev].desc);
770 if (p_ac3dec->bsi.acmod & 0x4)
771 printf("SurMixLevel %s",smixlev_tbl[p_ac3dec->bsi.cmixlev].desc);
773 intf_Msg ( "(ac3dec_parsebsi) %s %d.%d Mode",
774 service_ids[p_ac3dec->bsi.bsmod],
775 p_ac3dec->bsi.nfchans,p_ac3dec->bsi.lfeon);
783 void parse_audblk_stats (ac3dec_t * p_ac3dec)
785 char *exp_strat_tbl[4] = {"R ","D15 ","D25 ","D45 "};
788 intf_ErrMsg ("(ac3dec_parseaudblk) ");
789 intf_ErrMsg ("%s ",p_ac3dec->audblk.cplinu ? "cpl on" : "cpl off");
790 intf_ErrMsg ("%s ",p_ac3dec->audblk.baie? "bai" : " ");
791 intf_ErrMsg ("%s ",p_ac3dec->audblk.snroffste? "snroffst" : " ");
792 intf_ErrMsg ("%s ",p_ac3dec->audblk.deltbaie? "deltba" : " ");
793 intf_ErrMsg ("%s ",p_ac3dec->audblk.phsflginu? "phsflg" : " ");
794 intf_ErrMsg ("(%s %s %s %s %s) ",exp_strat_tbl[p_ac3dec->audblk.chexpstr[0]],
795 exp_strat_tbl[p_ac3dec->audblk.chexpstr[1]],exp_strat_tbl[p_ac3dec->audblk.chexpstr[2]],
796 exp_strat_tbl[p_ac3dec->audblk.chexpstr[3]],exp_strat_tbl[p_ac3dec->audblk.chexpstr[4]]);
798 for(i=0;i<p_ac3dec->bsi.nfchans;i++)
799 intf_ErrMsg ("%1d",p_ac3dec->audblk.blksw[i]);