1 /*****************************************************************************
2 * ac3_parse.c: ac3 parsing procedures
3 *****************************************************************************
4 * Copyright (C) 1999, 2000, 2001 VideoLAN
5 * $Id: ac3_parse.c,v 1.1 2001/11/13 12:09:17 henri Exp $
7 * Authors: Michel Kaempf <maxx@via.ecp.fr>
8 * Aaron Holtzman <aholtzma@engr.uvic.ca>
9 * Renaud Dartus <reno@videolan.org>
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or
14 * (at your option) any later version.
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA.
24 *****************************************************************************/
26 /*****************************************************************************
28 *****************************************************************************/
31 #include <string.h> /* memset() */
40 #include "audio_output.h"
42 #include "modules_export.h"
44 #include "stream_control.h"
45 #include "input_ext-dec.h"
48 #include "ac3_imdct.h"
49 #include "ac3_downmix.h"
50 #include "ac3_decoder.h"
51 #include "ac3_adec.h" /* ac3dec_thread_t */
53 #include "ac3_internal.h" /* EXP_REUSE */
56 static const u16 nfchans[] = { 2, 1, 2, 3, 3, 4, 4, 5 };
64 static const struct frmsize_s frmsizecod_tbl[] =
66 { 32 ,{64 ,69 ,96 } },
67 { 32 ,{64 ,70 ,96 } },
68 { 40 ,{80 ,87 ,120 } },
69 { 40 ,{80 ,88 ,120 } },
70 { 48 ,{96 ,104 ,144 } },
71 { 48 ,{96 ,105 ,144 } },
72 { 56 ,{112 ,121 ,168 } },
73 { 56 ,{112 ,122 ,168 } },
74 { 64 ,{128 ,139 ,192 } },
75 { 64 ,{128 ,140 ,192 } },
76 { 80 ,{160 ,174 ,240 } },
77 { 80 ,{160 ,175 ,240 } },
78 { 96 ,{192 ,208 ,288 } },
79 { 96 ,{192 ,209 ,288 } },
80 { 112 ,{224 ,243 ,336 } },
81 { 112 ,{224 ,244 ,336 } },
82 { 128 ,{256 ,278 ,384 } },
83 { 128 ,{256 ,279 ,384 } },
84 { 160 ,{320 ,348 ,480 } },
85 { 160 ,{320 ,349 ,480 } },
86 { 192 ,{384 ,417 ,576 } },
87 { 192 ,{384 ,418 ,576 } },
88 { 224 ,{448 ,487 ,672 } },
89 { 224 ,{448 ,488 ,672 } },
90 { 256 ,{512 ,557 ,768 } },
91 { 256 ,{512 ,558 ,768 } },
92 { 320 ,{640 ,696 ,960 } },
93 { 320 ,{640 ,697 ,960 } },
94 { 384 ,{768 ,835 ,1152 } },
95 { 384 ,{768 ,836 ,1152 } },
96 { 448 ,{896 ,975 ,1344 } },
97 { 448 ,{896 ,976 ,1344 } },
98 { 512 ,{1024 ,1114 ,1536 } },
99 { 512 ,{1024 ,1115 ,1536 } },
100 { 576 ,{1152 ,1253 ,1728 } },
101 { 576 ,{1152 ,1254 ,1728 } },
102 { 640 ,{1280 ,1393 ,1920 } },
103 { 640 ,{1280 ,1394 ,1920 } }};
105 static const int fscod_tbl[] = {48000, 44100, 32000};
107 /* Some internal functions */
109 static void parse_bsi_stats (ac3dec_t * p_ac3dec);
110 static void parse_audblk_stats (ac3dec_t * p_ac3dec);
113 /* Parse a syncinfo structure */
114 int ac3_sync_frame (ac3dec_t * p_ac3dec, ac3_sync_info_t * p_sync_info)
116 ac3dec_thread_t * p_ac3dec_t = (ac3dec_thread_t *) p_ac3dec->bit_stream.p_callback_arg;
118 p_ac3dec->total_bits_read = 0;
119 p_ac3dec->i_available = 0;
121 /* sync word - should be 0x0b77 */
122 RealignBits(&p_ac3dec->bit_stream);
123 while( (ShowBits (&p_ac3dec->bit_stream,16)) != 0x0b77 &&
124 (!p_ac3dec_t->p_fifo->b_die) && (!p_ac3dec_t->p_fifo->b_error))
126 RemoveBits (&p_ac3dec->bit_stream,8);
127 p_ac3dec->total_bits_read += 8;
129 RemoveBits (&p_ac3dec->bit_stream,16);
130 p_ac3dec->total_bits_read += 16;
133 /* Get crc1 - we don't actually use this data though */
134 GetBits (&p_ac3dec->bit_stream,16);
136 /* Get the sampling rate */
137 p_ac3dec->syncinfo.fscod = GetBits (&p_ac3dec->bit_stream,2);
139 if (p_ac3dec->syncinfo.fscod >= 3)
141 p_ac3dec->total_bits_read += 34;
145 /* Get the frame size code */
146 p_ac3dec->syncinfo.frmsizecod = GetBits (&p_ac3dec->bit_stream,6);
147 p_ac3dec->total_bits_read += 40;
149 if (p_ac3dec->syncinfo.frmsizecod >= 38)
154 p_sync_info->bit_rate = frmsizecod_tbl[p_ac3dec->syncinfo.frmsizecod].bit_rate;
156 p_ac3dec->syncinfo.frame_size = frmsizecod_tbl[p_ac3dec->syncinfo.frmsizecod].frm_size[p_ac3dec->syncinfo.fscod];
157 p_sync_info->frame_size = 2 * p_ac3dec->syncinfo.frame_size;
159 p_sync_info->sample_rate = fscod_tbl[p_ac3dec->syncinfo.fscod];
165 * This routine fills a bsi struct from the AC3 stream
167 int parse_bsi (ac3dec_t * p_ac3dec)
169 /* Check the AC-3 version number */
170 p_ac3dec->bsi.bsid = GetBits (&p_ac3dec->bit_stream,5);
172 if (p_ac3dec->bsi.bsid > 8)
177 /* Get the audio service provided by the stream */
178 p_ac3dec->bsi.bsmod = GetBits (&p_ac3dec->bit_stream,3);
180 /* Get the audio coding mode (ie how many channels)*/
181 p_ac3dec->bsi.acmod = GetBits (&p_ac3dec->bit_stream,3);
183 /* Predecode the number of full bandwidth channels as we use this
185 p_ac3dec->bsi.nfchans = nfchans[p_ac3dec->bsi.acmod];
187 /* If it is in use, get the centre channel mix level */
188 if ((p_ac3dec->bsi.acmod & 0x1) && (p_ac3dec->bsi.acmod != 0x1))
190 p_ac3dec->bsi.cmixlev = GetBits (&p_ac3dec->bit_stream,2);
191 p_ac3dec->total_bits_read += 2;
194 /* If it is in use, get the surround channel mix level */
195 if (p_ac3dec->bsi.acmod & 0x4)
197 p_ac3dec->bsi.surmixlev = GetBits (&p_ac3dec->bit_stream,2);
198 p_ac3dec->total_bits_read += 2;
201 /* Get the dolby surround mode if in 2/0 mode */
202 if (p_ac3dec->bsi.acmod == 0x2)
204 p_ac3dec->bsi.dsurmod = GetBits (&p_ac3dec->bit_stream,2);
205 p_ac3dec->total_bits_read += 2;
208 /* Is the low frequency effects channel on? */
209 p_ac3dec->bsi.lfeon = GetBits (&p_ac3dec->bit_stream,1);
211 /* Get the dialogue normalization level */
212 p_ac3dec->bsi.dialnorm = GetBits (&p_ac3dec->bit_stream,5);
214 /* Does compression gain exist? */
215 if ((p_ac3dec->bsi.compre = GetBits (&p_ac3dec->bit_stream,1)))
217 /* Get compression gain */
218 p_ac3dec->bsi.compr = GetBits (&p_ac3dec->bit_stream,8);
219 p_ac3dec->total_bits_read += 8;
222 /* Does language code exist? */
223 if ((p_ac3dec->bsi.langcode = GetBits (&p_ac3dec->bit_stream,1)))
225 /* Get langauge code */
226 p_ac3dec->bsi.langcod = GetBits (&p_ac3dec->bit_stream,8);
227 p_ac3dec->total_bits_read += 8;
230 /* Does audio production info exist? */
231 if ((p_ac3dec->bsi.audprodie = GetBits (&p_ac3dec->bit_stream,1)))
234 p_ac3dec->bsi.mixlevel = GetBits (&p_ac3dec->bit_stream,5);
237 p_ac3dec->bsi.roomtyp = GetBits (&p_ac3dec->bit_stream,2);
238 p_ac3dec->total_bits_read += 7;
241 /* If we're in dual mono mode then get some extra info */
242 if (p_ac3dec->bsi.acmod == 0)
244 /* Get the dialogue normalization level two */
245 p_ac3dec->bsi.dialnorm2 = GetBits (&p_ac3dec->bit_stream,5);
247 /* Does compression gain two exist? */
248 if ((p_ac3dec->bsi.compr2e = GetBits (&p_ac3dec->bit_stream,1)))
250 /* Get compression gain two */
251 p_ac3dec->bsi.compr2 = GetBits (&p_ac3dec->bit_stream,8);
252 p_ac3dec->total_bits_read += 8;
255 /* Does language code two exist? */
256 if ((p_ac3dec->bsi.langcod2e = GetBits (&p_ac3dec->bit_stream,1)))
258 /* Get langauge code two */
259 p_ac3dec->bsi.langcod2 = GetBits (&p_ac3dec->bit_stream,8);
260 p_ac3dec->total_bits_read += 8;
263 /* Does audio production info two exist? */
264 if ((p_ac3dec->bsi.audprodi2e = GetBits (&p_ac3dec->bit_stream,1)))
266 /* Get mix level two */
267 p_ac3dec->bsi.mixlevel2 = GetBits (&p_ac3dec->bit_stream,5);
269 /* Get room type two */
270 p_ac3dec->bsi.roomtyp2 = GetBits (&p_ac3dec->bit_stream,2);
271 p_ac3dec->total_bits_read += 7;
273 p_ac3dec->total_bits_read += 8;
276 /* Get the copyright bit */
277 p_ac3dec->bsi.copyrightb = GetBits (&p_ac3dec->bit_stream,1);
279 /* Get the original bit */
280 p_ac3dec->bsi.origbs = GetBits (&p_ac3dec->bit_stream,1);
282 /* Does timecode one exist? */
283 if ((p_ac3dec->bsi.timecod1e = GetBits (&p_ac3dec->bit_stream,1)))
285 p_ac3dec->bsi.timecod1 = GetBits (&p_ac3dec->bit_stream,14);
286 p_ac3dec->total_bits_read += 14;
289 /* Does timecode two exist? */
290 if ((p_ac3dec->bsi.timecod2e = GetBits (&p_ac3dec->bit_stream,1)))
292 p_ac3dec->bsi.timecod2 = GetBits (&p_ac3dec->bit_stream,14);
293 p_ac3dec->total_bits_read += 14;
296 /* Does addition info exist? */
297 if ((p_ac3dec->bsi.addbsie = GetBits (&p_ac3dec->bit_stream,1)))
301 /* Get how much info is there */
302 p_ac3dec->bsi.addbsil = GetBits (&p_ac3dec->bit_stream,6);
304 /* Get the additional info */
305 for (i=0;i<(p_ac3dec->bsi.addbsil + 1);i++)
307 p_ac3dec->bsi.addbsi[i] = GetBits (&p_ac3dec->bit_stream,8);
309 p_ac3dec->total_bits_read += 6 + 8 * (p_ac3dec->bsi.addbsil + 1);
311 p_ac3dec->total_bits_read += 25;
314 parse_bsi_stats (p_ac3dec);
320 /* More pain inducing parsing */
321 int parse_audblk (ac3dec_t * p_ac3dec, int blknum)
325 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
327 /* Is this channel an interleaved 256 + 256 block ? */
328 p_ac3dec->audblk.blksw[i] = GetBits (&p_ac3dec->bit_stream,1);
331 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
333 /* Should we dither this channel? */
334 p_ac3dec->audblk.dithflag[i] = GetBits (&p_ac3dec->bit_stream,1);
337 /* Does dynamic range control exist? */
338 if ((p_ac3dec->audblk.dynrnge = GetBits (&p_ac3dec->bit_stream,1)))
340 /* Get dynamic range info */
341 p_ac3dec->audblk.dynrng = GetBits (&p_ac3dec->bit_stream,8);
342 p_ac3dec->total_bits_read += 8;
345 /* If we're in dual mono mode then get the second channel DR info */
346 if (p_ac3dec->bsi.acmod == 0)
348 /* Does dynamic range control two exist? */
349 if ((p_ac3dec->audblk.dynrng2e = GetBits (&p_ac3dec->bit_stream,1)))
351 /* Get dynamic range info */
352 p_ac3dec->audblk.dynrng2 = GetBits (&p_ac3dec->bit_stream,8);
353 p_ac3dec->total_bits_read += 8;
355 p_ac3dec->total_bits_read += 1;
358 /* Does coupling strategy exist? */
359 p_ac3dec->audblk.cplstre = GetBits (&p_ac3dec->bit_stream,1);
360 p_ac3dec->total_bits_read += 2 + 2 * p_ac3dec->bsi.nfchans;
362 if ((!blknum) && (!p_ac3dec->audblk.cplstre))
367 if (p_ac3dec->audblk.cplstre)
369 /* Is coupling turned on? */
370 if ((p_ac3dec->audblk.cplinu = GetBits (&p_ac3dec->bit_stream,1)))
372 int nb_coupled_channels;
374 nb_coupled_channels = 0;
375 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
377 p_ac3dec->audblk.chincpl[i] = GetBits (&p_ac3dec->bit_stream,1);
378 if (p_ac3dec->audblk.chincpl[i])
380 nb_coupled_channels++;
383 p_ac3dec->total_bits_read += p_ac3dec->bsi.nfchans;
385 if (nb_coupled_channels < 2)
390 if (p_ac3dec->bsi.acmod == 0x2)
392 p_ac3dec->audblk.phsflginu = GetBits (&p_ac3dec->bit_stream,1);
393 p_ac3dec->total_bits_read += 1;
395 p_ac3dec->audblk.cplbegf = GetBits (&p_ac3dec->bit_stream,4);
396 p_ac3dec->audblk.cplendf = GetBits (&p_ac3dec->bit_stream,4);
397 p_ac3dec->total_bits_read += 8;
399 if (p_ac3dec->audblk.cplbegf > p_ac3dec->audblk.cplendf + 2)
404 p_ac3dec->audblk.ncplsubnd = (p_ac3dec->audblk.cplendf + 2) - p_ac3dec->audblk.cplbegf + 1;
406 /* Calculate the start and end bins of the coupling channel */
407 p_ac3dec->audblk.cplstrtmant = (p_ac3dec->audblk.cplbegf * 12) + 37 ;
408 p_ac3dec->audblk.cplendmant = ((p_ac3dec->audblk.cplendf + 3) * 12) + 37;
410 /* The number of combined subbands is ncplsubnd minus each combined
412 p_ac3dec->audblk.ncplbnd = p_ac3dec->audblk.ncplsubnd;
414 for (i=1; i< p_ac3dec->audblk.ncplsubnd; i++)
416 p_ac3dec->audblk.cplbndstrc[i] = GetBits (&p_ac3dec->bit_stream,1);
417 p_ac3dec->audblk.ncplbnd -= p_ac3dec->audblk.cplbndstrc[i];
419 p_ac3dec->total_bits_read += p_ac3dec->audblk.ncplsubnd - 1;
421 p_ac3dec->total_bits_read += 1;
424 if (p_ac3dec->audblk.cplinu)
426 /* Loop through all the channels and get their coupling co-ords */
427 for (i=0; i < p_ac3dec->bsi.nfchans;i++)
429 if (!p_ac3dec->audblk.chincpl[i])
434 /* Is there new coupling co-ordinate info? */
435 p_ac3dec->audblk.cplcoe[i] = GetBits (&p_ac3dec->bit_stream,1);
437 if ((!blknum) && (!p_ac3dec->audblk.cplcoe[i]))
442 if (p_ac3dec->audblk.cplcoe[i])
444 p_ac3dec->audblk.mstrcplco[i] = GetBits (&p_ac3dec->bit_stream,2);
445 p_ac3dec->total_bits_read += 2;
446 for (j=0;j < p_ac3dec->audblk.ncplbnd; j++)
448 p_ac3dec->audblk.cplcoexp[i][j] = GetBits (&p_ac3dec->bit_stream,4);
449 p_ac3dec->audblk.cplcomant[i][j] = GetBits (&p_ac3dec->bit_stream,4);
451 p_ac3dec->total_bits_read += 8 * p_ac3dec->audblk.ncplbnd;
454 p_ac3dec->total_bits_read += p_ac3dec->bsi.nfchans;
456 /* If we're in dual mono mode, there's going to be some phase info */
457 if ((p_ac3dec->bsi.acmod == 0x2) && p_ac3dec->audblk.phsflginu &&
458 (p_ac3dec->audblk.cplcoe[0] || p_ac3dec->audblk.cplcoe[1]))
460 for (j=0; j < p_ac3dec->audblk.ncplbnd; j++)
462 p_ac3dec->audblk.phsflg[j] = GetBits (&p_ac3dec->bit_stream,1);
464 p_ac3dec->total_bits_read += p_ac3dec->audblk.ncplbnd;
469 /* If we're in dual mono mode, there may be a rematrix strategy */
470 if (p_ac3dec->bsi.acmod == 0x2)
472 p_ac3dec->audblk.rematstr = GetBits (&p_ac3dec->bit_stream,1);
473 p_ac3dec->total_bits_read += 1;
475 if ((!blknum) && (!p_ac3dec->audblk.rematstr))
480 if (p_ac3dec->audblk.rematstr)
482 if (p_ac3dec->audblk.cplinu == 0)
484 for (i = 0; i < 4; i++)
486 p_ac3dec->audblk.rematflg[i] = GetBits (&p_ac3dec->bit_stream,1);
488 p_ac3dec->total_bits_read += 4;
490 if ((p_ac3dec->audblk.cplbegf > 2) && p_ac3dec->audblk.cplinu)
492 for (i = 0; i < 4; i++)
494 p_ac3dec->audblk.rematflg[i] = GetBits (&p_ac3dec->bit_stream,1);
496 p_ac3dec->total_bits_read += 4;
498 if ((p_ac3dec->audblk.cplbegf <= 2) && p_ac3dec->audblk.cplinu)
500 for (i = 0; i < 3; i++)
502 p_ac3dec->audblk.rematflg[i] = GetBits (&p_ac3dec->bit_stream,1);
504 p_ac3dec->total_bits_read += 3;
506 if ((p_ac3dec->audblk.cplbegf == 0) && p_ac3dec->audblk.cplinu)
508 for (i = 0; i < 2; i++)
510 p_ac3dec->audblk.rematflg[i] = GetBits (&p_ac3dec->bit_stream,1);
512 p_ac3dec->total_bits_read += 2;
517 if (p_ac3dec->audblk.cplinu)
519 /* Get the coupling channel exponent strategy */
520 p_ac3dec->audblk.cplexpstr = GetBits (&p_ac3dec->bit_stream,2);
521 p_ac3dec->total_bits_read += 2;
523 if ((!blknum) && (p_ac3dec->audblk.cplexpstr == EXP_REUSE))
528 if (p_ac3dec->audblk.cplexpstr==0)
530 p_ac3dec->audblk.ncplgrps = 0;
534 p_ac3dec->audblk.ncplgrps = (p_ac3dec->audblk.cplendmant - p_ac3dec->audblk.cplstrtmant) /
535 (3 << (p_ac3dec->audblk.cplexpstr-1));
540 for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
542 p_ac3dec->audblk.chexpstr[i] = GetBits (&p_ac3dec->bit_stream,2);
543 p_ac3dec->total_bits_read += 2;
545 if ((!blknum) && (p_ac3dec->audblk.chexpstr[i] == EXP_REUSE))
551 /* Get the exponent strategy for lfe channel */
552 if (p_ac3dec->bsi.lfeon)
554 p_ac3dec->audblk.lfeexpstr = GetBits (&p_ac3dec->bit_stream,1);
555 p_ac3dec->total_bits_read += 1;
557 if ((!blknum) && (p_ac3dec->audblk.lfeexpstr == EXP_REUSE))
563 /* Determine the bandwidths of all the fbw channels */
564 for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
568 if (p_ac3dec->audblk.chexpstr[i] != EXP_REUSE)
570 if (p_ac3dec->audblk.cplinu && p_ac3dec->audblk.chincpl[i])
572 p_ac3dec->audblk.endmant[i] = p_ac3dec->audblk.cplstrtmant;
576 p_ac3dec->audblk.chbwcod[i] = GetBits (&p_ac3dec->bit_stream,6);
577 p_ac3dec->total_bits_read += 6;
579 if (p_ac3dec->audblk.chbwcod[i] > 60)
584 p_ac3dec->audblk.endmant[i] = ((p_ac3dec->audblk.chbwcod[i] + 12) * 3) + 37;
587 /* Calculate the number of exponent groups to fetch */
588 grp_size = 3 * (1 << (p_ac3dec->audblk.chexpstr[i] - 1));
589 p_ac3dec->audblk.nchgrps[i] = (p_ac3dec->audblk.endmant[i] - 1 + (grp_size - 3)) / grp_size;
593 /* Get the coupling exponents if they exist */
594 if (p_ac3dec->audblk.cplinu && (p_ac3dec->audblk.cplexpstr != EXP_REUSE))
596 p_ac3dec->audblk.cplabsexp = GetBits (&p_ac3dec->bit_stream,4);
597 p_ac3dec->total_bits_read += 4;
598 for (i=0; i< p_ac3dec->audblk.ncplgrps;i++)
600 p_ac3dec->audblk.cplexps[i] = GetBits (&p_ac3dec->bit_stream,7);
601 p_ac3dec->total_bits_read += 7;
603 if (p_ac3dec->audblk.cplexps[i] >= 125)
610 /* Get the fwb channel exponents */
611 for (i=0; i < p_ac3dec->bsi.nfchans; i++)
613 if (p_ac3dec->audblk.chexpstr[i] != EXP_REUSE)
615 p_ac3dec->audblk.exps[i][0] = GetBits (&p_ac3dec->bit_stream,4);
616 p_ac3dec->total_bits_read += 4;
617 for (j=1; j<=p_ac3dec->audblk.nchgrps[i];j++)
619 p_ac3dec->audblk.exps[i][j] = GetBits (&p_ac3dec->bit_stream,7);
620 p_ac3dec->total_bits_read += 7;
621 if (p_ac3dec->audblk.exps[i][j] >= 125)
626 p_ac3dec->audblk.gainrng[i] = GetBits (&p_ac3dec->bit_stream,2);
627 p_ac3dec->total_bits_read += 2;
631 /* Get the lfe channel exponents */
632 if (p_ac3dec->bsi.lfeon && (p_ac3dec->audblk.lfeexpstr != EXP_REUSE))
634 p_ac3dec->audblk.lfeexps[0] = GetBits (&p_ac3dec->bit_stream,4);
635 p_ac3dec->audblk.lfeexps[1] = GetBits (&p_ac3dec->bit_stream,7);
636 p_ac3dec->total_bits_read += 11;
637 if (p_ac3dec->audblk.lfeexps[1] >= 125)
641 p_ac3dec->audblk.lfeexps[2] = GetBits (&p_ac3dec->bit_stream,7);
642 p_ac3dec->total_bits_read += 7;
643 if (p_ac3dec->audblk.lfeexps[2] >= 125)
649 /* Get the parametric bit allocation parameters */
650 p_ac3dec->audblk.baie = GetBits (&p_ac3dec->bit_stream,1);
651 p_ac3dec->total_bits_read += 1;
653 if ((!blknum) && (!p_ac3dec->audblk.baie))
658 if (p_ac3dec->audblk.baie)
660 p_ac3dec->audblk.sdcycod = GetBits (&p_ac3dec->bit_stream,2);
661 p_ac3dec->audblk.fdcycod = GetBits (&p_ac3dec->bit_stream,2);
662 p_ac3dec->audblk.sgaincod = GetBits (&p_ac3dec->bit_stream,2);
663 p_ac3dec->audblk.dbpbcod = GetBits (&p_ac3dec->bit_stream,2);
664 p_ac3dec->audblk.floorcod = GetBits (&p_ac3dec->bit_stream,3);
665 p_ac3dec->total_bits_read += 11;
668 /* Get the SNR off set info if it exists */
669 p_ac3dec->audblk.snroffste = GetBits (&p_ac3dec->bit_stream,1);
670 if ((!blknum) && (!p_ac3dec->audblk.snroffste))
675 if (p_ac3dec->audblk.snroffste)
677 p_ac3dec->audblk.csnroffst = GetBits (&p_ac3dec->bit_stream,6);
678 p_ac3dec->total_bits_read += 6;
680 if (p_ac3dec->audblk.cplinu)
682 p_ac3dec->audblk.cplfsnroffst = GetBits (&p_ac3dec->bit_stream,4);
683 p_ac3dec->audblk.cplfgaincod = GetBits (&p_ac3dec->bit_stream,3);
684 p_ac3dec->total_bits_read += 7;
687 for (i = 0;i < p_ac3dec->bsi.nfchans; i++)
689 p_ac3dec->audblk.fsnroffst[i] = GetBits (&p_ac3dec->bit_stream,4);
690 p_ac3dec->audblk.fgaincod[i] = GetBits (&p_ac3dec->bit_stream,3);
692 p_ac3dec->total_bits_read += 7 * p_ac3dec->bsi.nfchans;
693 if (p_ac3dec->bsi.lfeon)
695 p_ac3dec->audblk.lfefsnroffst = GetBits (&p_ac3dec->bit_stream,4);
696 p_ac3dec->audblk.lfefgaincod = GetBits (&p_ac3dec->bit_stream,3);
697 p_ac3dec->total_bits_read += 7;
701 /* Get coupling leakage info if it exists */
702 if (p_ac3dec->audblk.cplinu)
704 p_ac3dec->audblk.cplleake = GetBits (&p_ac3dec->bit_stream,1);
705 p_ac3dec->total_bits_read += 1;
706 if ((!blknum) && (!p_ac3dec->audblk.cplleake))
711 if (p_ac3dec->audblk.cplleake)
713 p_ac3dec->audblk.cplfleak = GetBits (&p_ac3dec->bit_stream,3);
714 p_ac3dec->audblk.cplsleak = GetBits (&p_ac3dec->bit_stream,3);
715 p_ac3dec->total_bits_read += 6;
719 /* Get the delta bit alloaction info */
720 p_ac3dec->audblk.deltbaie = GetBits (&p_ac3dec->bit_stream,1);
721 p_ac3dec->total_bits_read += 1;
723 if (p_ac3dec->audblk.deltbaie)
725 if (p_ac3dec->audblk.cplinu)
727 p_ac3dec->audblk.cpldeltbae = GetBits (&p_ac3dec->bit_stream,2);
728 p_ac3dec->total_bits_read += 2;
729 if (p_ac3dec->audblk.cpldeltbae == 3)
735 for (i = 0;i < p_ac3dec->bsi.nfchans; i++)
737 p_ac3dec->audblk.deltbae[i] = GetBits (&p_ac3dec->bit_stream,2);
738 p_ac3dec->total_bits_read += 2;
739 if (p_ac3dec->audblk.deltbae[i] == 3)
745 if (p_ac3dec->audblk.cplinu && (p_ac3dec->audblk.cpldeltbae == DELTA_BIT_NEW))
747 p_ac3dec->audblk.cpldeltnseg = GetBits (&p_ac3dec->bit_stream,3);
748 for (i = 0;i < p_ac3dec->audblk.cpldeltnseg + 1; i++)
750 p_ac3dec->audblk.cpldeltoffst[i] = GetBits (&p_ac3dec->bit_stream,5);
751 p_ac3dec->audblk.cpldeltlen[i] = GetBits (&p_ac3dec->bit_stream,4);
752 p_ac3dec->audblk.cpldeltba[i] = GetBits (&p_ac3dec->bit_stream,3);
754 p_ac3dec->total_bits_read += 12 * (p_ac3dec->audblk.cpldeltnseg + 1) + 3;
757 for (i = 0; i < p_ac3dec->bsi.nfchans; i++)
759 if (p_ac3dec->audblk.deltbae[i] == DELTA_BIT_NEW)
761 p_ac3dec->audblk.deltnseg[i] = GetBits (&p_ac3dec->bit_stream,3);
762 // if (p_ac3dec->audblk.deltnseg[i] >= 8)
763 // fprintf (stderr, "parse debug: p_ac3dec->audblk.deltnseg[%i] == %i\n", i, p_ac3dec->audblk.deltnseg[i]);
764 for (j = 0; j < p_ac3dec->audblk.deltnseg[i] + 1; j++)
766 p_ac3dec->audblk.deltoffst[i][j] = GetBits (&p_ac3dec->bit_stream,5);
767 p_ac3dec->audblk.deltlen[i][j] = GetBits (&p_ac3dec->bit_stream,4);
768 p_ac3dec->audblk.deltba[i][j] = GetBits (&p_ac3dec->bit_stream,3);
770 p_ac3dec->total_bits_read += 12 * (p_ac3dec->audblk.deltnseg[i] + 1) + 3;
775 /* Check to see if there's any dummy info to get */
776 p_ac3dec->audblk.skiple = GetBits (&p_ac3dec->bit_stream,1);
777 p_ac3dec->total_bits_read += 1;
779 if (p_ac3dec->audblk.skiple)
781 p_ac3dec->audblk.skipl = GetBits (&p_ac3dec->bit_stream,9);
783 for (i = 0; i < p_ac3dec->audblk.skipl ; i++)
785 GetBits (&p_ac3dec->bit_stream,8);
787 p_ac3dec->total_bits_read += 8 * p_ac3dec->audblk.skipl + 9;
791 parse_audblk_stats(p_ac3dec);
797 void parse_auxdata (ac3dec_t * p_ac3dec)
802 skip_length = (p_ac3dec->syncinfo.frame_size * 16) - p_ac3dec->total_bits_read - 17 - 1;
804 for (i = 0; i < skip_length; i++)
806 RemoveBits (&p_ac3dec->bit_stream,1);
809 /* get the auxdata exists bit */
810 RemoveBits (&p_ac3dec->bit_stream,1);
812 /* Skip the CRC reserved bit */
813 RemoveBits (&p_ac3dec->bit_stream,1);
816 RemoveBits (&p_ac3dec->bit_stream,16);
820 static void parse_bsi_stats (ac3dec_t * p_ac3dec) /* Some stats */
827 static const char *service_ids[8] =
833 static const struct mixlev_s cmixlev_tbl[4] =
835 {0.707, "(-3.0 dB)"}, {0.595, "(-4.5 dB)"},
836 {0.500, "(-6.0 dB)"}, {1.0, "Invalid"}
838 static const struct mixlev_s smixlev_tbl[4] =
840 {0.707, "(-3.0 dB)"}, {0.500, "(-6.0 dB)"},
841 { 0.0, "off "}, { 1.0, "Invalid"}
849 /* if ((p_ac3dec->bsi.acmod & 0x1) && (p_ac3dec->bsi.acmod != 0x1))
850 printf("CentreMixLevel %s ",cmixlev_tbl[p_ac3dec->bsi.cmixlev].desc);
851 if (p_ac3dec->bsi.acmod & 0x4)
852 printf("SurMixLevel %s",smixlev_tbl[p_ac3dec->bsi.cmixlev].desc);
854 intf_Msg ( "(ac3dec_parsebsi) %s %d.%d Mode",
855 service_ids[p_ac3dec->bsi.bsmod],
856 p_ac3dec->bsi.nfchans,p_ac3dec->bsi.lfeon);
864 static void parse_audblk_stats (ac3dec_t * p_ac3dec)
866 char *exp_strat_tbl[4] = {"R ","D15 ","D25 ","D45 "};
869 intf_ErrMsg ("(ac3dec_parseaudblk) ");
870 intf_ErrMsg ("%s ",p_ac3dec->audblk.cplinu ? "cpl on" : "cpl off");
871 intf_ErrMsg ("%s ",p_ac3dec->audblk.baie? "bai" : " ");
872 intf_ErrMsg ("%s ",p_ac3dec->audblk.snroffste? "snroffst" : " ");
873 intf_ErrMsg ("%s ",p_ac3dec->audblk.deltbaie? "deltba" : " ");
874 intf_ErrMsg ("%s ",p_ac3dec->audblk.phsflginu? "phsflg" : " ");
875 intf_ErrMsg ("(%s %s %s %s %s) ",exp_strat_tbl[p_ac3dec->audblk.chexpstr[0]],
876 exp_strat_tbl[p_ac3dec->audblk.chexpstr[1]],exp_strat_tbl[p_ac3dec->audblk.chexpstr[2]],
877 exp_strat_tbl[p_ac3dec->audblk.chexpstr[3]],exp_strat_tbl[p_ac3dec->audblk.chexpstr[4]]);
879 for(i=0;i<p_ac3dec->bsi.nfchans;i++)
880 intf_ErrMsg ("%1d",p_ac3dec->audblk.blksw[i]);