parse.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:14k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /* 
  2.  *    parse.c
  3.  *
  4.  * Copyright (C) Aaron Holtzman - May 1999
  5.  *
  6.  *  This file is part of ac3dec, a free Dolby AC-3 stream decoder.
  7.  *
  8.  *  ac3dec is free software; you can redistribute it and/or modify
  9.  *  it under the terms of the GNU General Public License as published by
  10.  *  the Free Software Foundation; either version 2, or (at your option)
  11.  *  any later version.
  12.  *   
  13.  *  ac3dec is distributed in the hope that it will be useful,
  14.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  *  GNU General Public License for more details.
  17.  *   
  18.  *  You should have received a copy of the GNU General Public License
  19.  *  along with GNU Make; see the file COPYING.  If not, write to
  20.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  21.  *
  22.  *
  23.  */
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include "ac3.h"
  27. #include "decode.h"
  28. #include "bitstream.h"
  29. #include "stats.h"
  30. #include "debug.h"
  31. #include "parse.h"
  32. /* Misc LUT */
  33. static uint_16 nfchans[] = {2,1,2,3,3,4,4,5};
  34. struct frmsize_s
  35. {
  36. uint_16 bit_rate;
  37. uint_16 frm_size[3];
  38. };
  39. struct frmsize_s frmsizecod_tbl[] = {
  40.       { 32  ,{64   ,69   ,96   } },
  41.       { 32  ,{64   ,70   ,96   } },
  42.       { 40  ,{80   ,87   ,120  } },
  43.       { 40  ,{80   ,88   ,120  } },
  44.       { 48  ,{96   ,104  ,144  } },
  45.       { 48  ,{96   ,105  ,144  } },
  46.       { 56  ,{112  ,121  ,168  } },
  47.       { 56  ,{112  ,122  ,168  } },
  48.       { 64  ,{128  ,139  ,192  } },
  49.       { 64  ,{128  ,140  ,192  } },
  50.       { 80  ,{160  ,174  ,240  } },
  51.       { 80  ,{160  ,175  ,240  } },
  52.       { 96  ,{192  ,208  ,288  } },
  53.       { 96  ,{192  ,209  ,288  } },
  54.       { 112 ,{224  ,243  ,336  } },
  55.       { 112 ,{224  ,244  ,336  } },
  56.       { 128 ,{256  ,278  ,384  } },
  57.       { 128 ,{256  ,279  ,384  } },
  58.       { 160 ,{320  ,348  ,480  } },
  59.       { 160 ,{320  ,349  ,480  } },
  60.       { 192 ,{384  ,417  ,576  } },
  61.       { 192 ,{384  ,418  ,576  } },
  62.       { 224 ,{448  ,487  ,672  } },
  63.       { 224 ,{448  ,488  ,672  } },
  64.       { 256 ,{512  ,557  ,768  } },
  65.       { 256 ,{512  ,558  ,768  } },
  66.       { 320 ,{640  ,696  ,960  } },
  67.       { 320 ,{640  ,697  ,960  } },
  68.       { 384 ,{768  ,835  ,1152 } },
  69.       { 384 ,{768  ,836  ,1152 } },
  70.       { 448 ,{896  ,975  ,1344 } },
  71.       { 448 ,{896  ,976  ,1344 } },
  72.       { 512 ,{1024 ,1114 ,1536 } },
  73.       { 512 ,{1024 ,1115 ,1536 } },
  74.       { 576 ,{1152 ,1253 ,1728 } },
  75.       { 576 ,{1152 ,1254 ,1728 } },
  76.       { 640 ,{1280 ,1393 ,1920 } },
  77.       { 640 ,{1280 ,1394 ,1920 } }};
  78. /* Parse a syncinfo structure, minus the sync word */
  79. void
  80. parse_syncinfo(syncinfo_t *syncinfo,bitstream_t *bs)
  81. {
  82. /* Get crc1 - we don't actually use this data though */
  83. bitstream_get(bs,16);
  84. /* Get the sampling rate */
  85. syncinfo->fscod  = bitstream_get(bs,2);
  86. /* Get the frame size code */
  87. syncinfo->frmsizecod = bitstream_get(bs,6);
  88. syncinfo->bit_rate = frmsizecod_tbl[syncinfo->frmsizecod].bit_rate;
  89. syncinfo->frame_size = frmsizecod_tbl[syncinfo->frmsizecod].frm_size[syncinfo->fscod];
  90. stats_printf_syncinfo(syncinfo);
  91. }
  92. /*
  93.  * This routine fills a bsi struct from the AC3 stream
  94.  */
  95. void
  96. parse_bsi(bsi_t *bsi,bitstream_t *bs)
  97. {
  98. uint_32 i;
  99. /* Check the AC-3 version number */
  100. bsi->bsid = bitstream_get(bs,5);
  101. /* Get the audio service provided by the steram */
  102. bsi->bsmod = bitstream_get(bs,3);
  103. /* Get the audio coding mode (ie how many channels)*/
  104. bsi->acmod = bitstream_get(bs,3);
  105. /* Predecode the number of full bandwidth channels as we use this
  106.  * number a lot */
  107. bsi->nfchans = nfchans[bsi->acmod];
  108. /* If it is in use, get the centre channel mix level */
  109. if ((bsi->acmod & 0x1) && (bsi->acmod != 0x1))
  110. bsi->cmixlev = bitstream_get(bs,2);
  111. /* If it is in use, get the surround channel mix level */
  112. if (bsi->acmod & 0x4)
  113. bsi->surmixlev = bitstream_get(bs,2);
  114. /* Get the dolby surround mode if in 2/0 mode */
  115. if(bsi->acmod == 0x2)
  116. bsi->dsurmod= bitstream_get(bs,2);
  117. /* Is the low frequency effects channel on? */
  118. bsi->lfeon = bitstream_get(bs,1);
  119. /* Get the dialogue normalization level */
  120. bsi->dialnorm = bitstream_get(bs,5);
  121. /* Does compression gain exist? */
  122. bsi->compre = bitstream_get(bs,1);
  123. if (bsi->compre)
  124. {
  125. /* Get compression gain */
  126. bsi->compr = bitstream_get(bs,8);
  127. }
  128. /* Does language code exist? */
  129. bsi->langcode = bitstream_get(bs,1);
  130. if (bsi->langcode)
  131. {
  132. /* Get langauge code */
  133. bsi->langcod = bitstream_get(bs,8);
  134. }
  135. /* Does audio production info exist? */
  136. bsi->audprodie = bitstream_get(bs,1);
  137. if (bsi->audprodie)
  138. {
  139. /* Get mix level */
  140. bsi->mixlevel = bitstream_get(bs,5);
  141. /* Get room type */
  142. bsi->roomtyp = bitstream_get(bs,2);
  143. }
  144. /* If we're in dual mono mode then get some extra info */
  145. if (bsi->acmod ==0)
  146. {
  147. /* Get the dialogue normalization level two */
  148. bsi->dialnorm2 = bitstream_get(bs,5);
  149. /* Does compression gain two exist? */
  150. bsi->compr2e = bitstream_get(bs,1);
  151. if (bsi->compr2e)
  152. {
  153. /* Get compression gain two */
  154. bsi->compr2 = bitstream_get(bs,8);
  155. }
  156. /* Does language code two exist? */
  157. bsi->langcod2e = bitstream_get(bs,1);
  158. if (bsi->langcod2e)
  159. {
  160. /* Get langauge code two */
  161. bsi->langcod2 = bitstream_get(bs,8);
  162. }
  163. /* Does audio production info two exist? */
  164. bsi->audprodi2e = bitstream_get(bs,1);
  165. if (bsi->audprodi2e)
  166. {
  167. /* Get mix level two */
  168. bsi->mixlevel2 = bitstream_get(bs,5);
  169. /* Get room type two */
  170. bsi->roomtyp2 = bitstream_get(bs,2);
  171. }
  172. }
  173. /* Get the copyright bit */
  174. bsi->copyrightb = bitstream_get(bs,1);
  175. /* Get the original bit */
  176. bsi->origbs = bitstream_get(bs,1);
  177. /* Does timecode one exist? */
  178. bsi->timecod1e = bitstream_get(bs,1);
  179. if(bsi->timecod1e)
  180. bsi->timecod1 = bitstream_get(bs,14);
  181. /* Does timecode two exist? */
  182. bsi->timecod2e = bitstream_get(bs,1);
  183. if(bsi->timecod2e)
  184. bsi->timecod2 = bitstream_get(bs,14);
  185. /* Does addition info exist? */
  186. bsi->addbsie = bitstream_get(bs,1);
  187. if(bsi->addbsie)
  188. {
  189. /* Get how much info is there */
  190. bsi->addbsil = bitstream_get(bs,6);
  191. /* Get the additional info */
  192. for(i=0;i<(bsi->addbsil + 1);i++)
  193. bsi->addbsi[i] = bitstream_get(bs,8);
  194. }
  195. stats_printf_bsi(bsi);
  196. }
  197. /* More pain inducing parsing */
  198. void
  199. parse_audblk(bsi_t *bsi,audblk_t *audblk,bitstream_t *bs)
  200. {
  201. int i,j;
  202. for (i=0;i < bsi->nfchans; i++)
  203. {
  204. /* Is this channel an interleaved 256 + 256 block ? */
  205. audblk->blksw[i] = bitstream_get(bs,1);
  206. }
  207. for (i=0;i < bsi->nfchans; i++)
  208. {
  209. /* Should we dither this channel? */
  210. audblk->dithflag[i] = bitstream_get(bs,1);
  211. }
  212. /* Does dynamic range control exist? */
  213. audblk->dynrnge = bitstream_get(bs,1);
  214. if (audblk->dynrnge)
  215. {
  216. /* Get dynamic range info */
  217. audblk->dynrng = bitstream_get(bs,8);
  218. }
  219. /* If we're in dual mono mode then get the second channel DR info */
  220. if (bsi->acmod == 0)
  221. {
  222. /* Does dynamic range control two exist? */
  223. audblk->dynrng2e = bitstream_get(bs,1);
  224. if (audblk->dynrng2e)
  225. {
  226. /* Get dynamic range info */
  227. audblk->dynrng2 = bitstream_get(bs,8);
  228. }
  229. }
  230. /* Does coupling strategy exist? */
  231. audblk->cplstre = bitstream_get(bs,1);
  232. if (audblk->cplstre)
  233. {
  234. /* Is coupling turned on? */
  235. audblk->cplinu = bitstream_get(bs,1);
  236. if(audblk->cplinu)
  237. {
  238. for(i=0;i < bsi->nfchans; i++)
  239. audblk->chincpl[i] = bitstream_get(bs,1);
  240. if(bsi->acmod == 0x2)
  241. audblk->phsflginu = bitstream_get(bs,1);
  242. audblk->cplbegf = bitstream_get(bs,4);
  243. audblk->cplendf = bitstream_get(bs,4);
  244. audblk->ncplsubnd = (audblk->cplendf + 2) - audblk->cplbegf + 1;
  245. /* Calculate the start and end bins of the coupling channel */
  246. audblk->cplstrtmant = (audblk->cplbegf * 12) + 37 ; 
  247. audblk->cplendmant =  ((audblk->cplendf + 3) * 12) + 37;
  248. /* The number of combined subbands is ncplsubnd minus each combined
  249.  * band */
  250. audblk->ncplbnd = audblk->ncplsubnd; 
  251. for(i=1; i< audblk->ncplsubnd; i++)
  252. {
  253. audblk->cplbndstrc[i] = bitstream_get(bs,1);
  254. audblk->ncplbnd -= audblk->cplbndstrc[i];
  255. }
  256. }
  257. }
  258. if(audblk->cplinu)
  259. {
  260. /* Loop through all the channels and get their coupling co-ords */
  261. for(i=0;i < bsi->nfchans;i++)
  262. {
  263. if(!audblk->chincpl[i])
  264. continue;
  265. /* Is there new coupling co-ordinate info? */
  266. audblk->cplcoe[i] = bitstream_get(bs,1);
  267. if(audblk->cplcoe[i])
  268. {
  269. audblk->mstrcplco[i] = bitstream_get(bs,2); 
  270. for(j=0;j < audblk->ncplbnd; j++)
  271. {
  272. audblk->cplcoexp[i][j] = bitstream_get(bs,4); 
  273. audblk->cplcomant[i][j] = bitstream_get(bs,4); 
  274. }
  275. }
  276. }
  277. /* If we're in dual mono mode, there's going to be some phase info */
  278. if( (bsi->acmod == 0x2) && audblk->phsflginu && 
  279. (audblk->cplcoe[0] || audblk->cplcoe[1]))
  280. {
  281. for(j=0;j < audblk->ncplbnd; j++)
  282. audblk->phsflg[j] = bitstream_get(bs,1); 
  283. }
  284. }
  285. /* If we're in dual mono mode, there may be a rematrix strategy */
  286. if(bsi->acmod == 0x2)
  287. {
  288. audblk->rematstr = bitstream_get(bs,1);
  289. if(audblk->rematstr)
  290. {
  291. if (audblk->cplinu == 0) 
  292. for(i = 0; i < 4; i++) 
  293. audblk->rematflg[i] = bitstream_get(bs,1);
  294. }
  295. if((audblk->cplbegf > 2) && audblk->cplinu) 
  296. {
  297. for(i = 0; i < 4; i++) 
  298. audblk->rematflg[i] = bitstream_get(bs,1);
  299. }
  300. if((audblk->cplbegf <= 2) && audblk->cplinu) 
  301. for(i = 0; i < 3; i++) 
  302. audblk->rematflg[i] = bitstream_get(bs,1);
  303. if((audblk->cplbegf == 0) && audblk->cplinu) 
  304. for(i = 0; i < 2; i++) 
  305. audblk->rematflg[i] = bitstream_get(bs,1);
  306. }
  307. }
  308. if (audblk->cplinu)
  309. {
  310. /* Get the coupling channel exponent strategy */
  311. audblk->cplexpstr = bitstream_get(bs,2);
  312. audblk->ncplgrps = (audblk->cplendmant - audblk->cplstrtmant) / 
  313. (3 << (audblk->cplexpstr-1));
  314. }
  315. for(i = 0; i < bsi->nfchans; i++)
  316. audblk->chexpstr[i] = bitstream_get(bs,2);
  317. /* Get the exponent strategy for lfe channel */
  318. if(bsi->lfeon) 
  319. audblk->lfeexpstr = bitstream_get(bs,1);
  320. /* Determine the bandwidths of all the fbw channels */
  321. for(i = 0; i < bsi->nfchans; i++) 
  322. uint_16 grp_size;
  323. if(audblk->chexpstr[i] != EXP_REUSE) 
  324. if (audblk->cplinu && audblk->chincpl[i]) 
  325. {
  326. audblk->endmant[i] = audblk->cplstrtmant;
  327. }
  328. else
  329. {
  330. audblk->chbwcod[i] = bitstream_get(bs,6); 
  331. audblk->endmant[i] = ((audblk->chbwcod[i] + 12) * 3) + 37;
  332. }
  333. /* Calculate the number of exponent groups to fetch */
  334. grp_size =  3 * (1 << (audblk->chexpstr[i] - 1));
  335. audblk->nchgrps[i] = (audblk->endmant[i] - 1 + (grp_size - 3)) / grp_size;
  336. }
  337. }
  338. /* Get the coupling exponents if they exist */
  339. if(audblk->cplinu && (audblk->cplexpstr != EXP_REUSE))
  340. {
  341. audblk->cplabsexp = bitstream_get(bs,4);
  342. for(i=0;i< audblk->ncplgrps;i++)
  343. audblk->cplexps[i] = bitstream_get(bs,7);
  344. }
  345. /* Get the fwb channel exponents */
  346. for(i=0;i < bsi->nfchans; i++)
  347. {
  348. if(audblk->chexpstr[i] != EXP_REUSE)
  349. {
  350. audblk->exps[i][0] = bitstream_get(bs,4);
  351. for(j=1;j<=audblk->nchgrps[i];j++)
  352. audblk->exps[i][j] = bitstream_get(bs,7);
  353. audblk->gainrng[i] = bitstream_get(bs,2);
  354. }
  355. }
  356. /* Get the lfe channel exponents */
  357. if(bsi->lfeon && (audblk->lfeexpstr != EXP_REUSE))
  358. {
  359. audblk->lfeexps[0] = bitstream_get(bs,4);
  360. audblk->lfeexps[1] = bitstream_get(bs,7);
  361. audblk->lfeexps[2] = bitstream_get(bs,7);
  362. }
  363. /* Get the parametric bit allocation parameters */
  364. audblk->baie = bitstream_get(bs,1);
  365. if(audblk->baie)
  366. {
  367. audblk->sdcycod = bitstream_get(bs,2);
  368. audblk->fdcycod = bitstream_get(bs,2);
  369. audblk->sgaincod = bitstream_get(bs,2);
  370. audblk->dbpbcod = bitstream_get(bs,2);
  371. audblk->floorcod = bitstream_get(bs,3);
  372. }
  373. /* Get the SNR off set info if it exists */
  374. audblk->snroffste = bitstream_get(bs,1);
  375. if(audblk->snroffste)
  376. {
  377. audblk->csnroffst = bitstream_get(bs,6);
  378. if(audblk->cplinu)
  379. {
  380. audblk->cplfsnroffst = bitstream_get(bs,4);
  381. audblk->cplfgaincod = bitstream_get(bs,3);
  382. }
  383. for(i = 0;i < bsi->nfchans; i++)
  384. {
  385. audblk->fsnroffst[i] = bitstream_get(bs,4);
  386. audblk->fgaincod[i] = bitstream_get(bs,3);
  387. }
  388. if(bsi->lfeon)
  389. {
  390. audblk->lfefsnroffst = bitstream_get(bs,4);
  391. audblk->lfefgaincod = bitstream_get(bs,3);
  392. }
  393. }
  394. /* Get coupling leakage info if it exists */
  395. if(audblk->cplinu)
  396. {
  397. audblk->cplleake = bitstream_get(bs,1);
  398. if(audblk->cplleake)
  399. {
  400. audblk->cplfleak = bitstream_get(bs,3);
  401. audblk->cplsleak = bitstream_get(bs,3);
  402. }
  403. }
  404. /* Get the delta bit alloaction info */
  405. audblk->deltbaie = bitstream_get(bs,1);
  406. if(audblk->deltbaie)
  407. {
  408. if(audblk->cplinu)
  409. audblk->cpldeltbae = bitstream_get(bs,2);
  410. for(i = 0;i < bsi->nfchans; i++)
  411. audblk->deltbae[i] = bitstream_get(bs,2);
  412. if (audblk->cplinu && (audblk->cpldeltbae == DELTA_BIT_NEW))
  413. {
  414. audblk->cpldeltnseg = bitstream_get(bs,3);
  415. for(i = 0;i < audblk->cpldeltnseg + 1; i++)
  416. {
  417. audblk->cpldeltoffst[i] = bitstream_get(bs,5);
  418. audblk->cpldeltlen[i] = bitstream_get(bs,4);
  419. audblk->cpldeltba[i] = bitstream_get(bs,3);
  420. }
  421. }
  422. for(i = 0;i < bsi->nfchans; i++)
  423. {
  424. if (audblk->deltbae[i] == DELTA_BIT_NEW)
  425. {
  426. audblk->deltnseg[i] = bitstream_get(bs,3);
  427. for(j = 0; j < audblk->deltnseg[i] + 1; j++)
  428. {
  429. audblk->deltoffst[i][j] = bitstream_get(bs,5);
  430. audblk->deltlen[i][j] = bitstream_get(bs,4);
  431. audblk->deltba[i][j] = bitstream_get(bs,3);
  432. }
  433. }
  434. }
  435. }
  436. /* Check to see if there's any dummy info to get */
  437. if((audblk->skiple =  bitstream_get(bs,1)))
  438. {
  439. uint_16 skip_data;
  440. audblk->skipl = bitstream_get(bs,9);
  441. //XXX remove
  442. //fprintf(stderr,"(parse) skipping %d bytesn",audblk->skipl);
  443. for(i = 0; i < audblk->skipl ; i++)
  444. {
  445. skip_data = bitstream_get(bs,8);
  446. //XXX remove
  447. //fprintf(stderr,"skipped data %2xn",skip_data);
  448. //if(skip_data != 0)
  449. //{
  450. //dprintf("(parse) Invalid skipped data %2xn",skip_data);
  451. //exit(1);
  452. //}
  453. }
  454. }
  455. stats_printf_audblk(audblk);
  456. }
  457. void
  458. parse_auxdata(syncinfo_t *syncinfo,bitstream_t *bs)
  459. {
  460. int i;
  461. int skip_length;
  462. uint_16 crc;
  463. uint_16 auxdatae;
  464. skip_length = (syncinfo->frame_size * 16)  - bs->total_bits_read - 17 - 1;
  465. //XXX remove
  466. //dprintf("(auxdata) skipping %d auxbitsn",skip_length);
  467. for(i=0; i <  skip_length; i++)
  468. //printf("Skipped bit %in",(uint_16)bitstream_get(bs,1));
  469. bitstream_get(bs,1);
  470. //get the auxdata exists bit
  471. auxdatae = bitstream_get(bs,1);
  472. //XXX remove
  473. //dprintf("auxdatae = %in",auxdatae);
  474. //Skip the CRC reserved bit
  475. bitstream_get(bs,1);
  476. //Get the crc
  477. crc = bitstream_get(bs,16);
  478. }