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. #ifdef DO_NIST
  83.         inputstream->read_frame(3);
  84. #endif
  85. /* Get crc1 - we don't actually use this data though */
  86. bitstream_get(bs,16);
  87. /* Get the sampling rate */
  88. syncinfo->fscod  = bitstream_get(bs,2);
  89. /* Get the frame size code */
  90. syncinfo->frmsizecod = bitstream_get(bs,6);
  91. syncinfo->bit_rate = frmsizecod_tbl[syncinfo->frmsizecod].bit_rate;
  92. syncinfo->frame_size = frmsizecod_tbl[syncinfo->frmsizecod].frm_size[syncinfo->fscod];
  93. #ifdef DO_NIST
  94.         inputstream->read_frame(syncinfo->frame_size*2-5);
  95. #endif
  96. stats_printf_syncinfo(syncinfo);
  97. }
  98. /*
  99.  * This routine fills a bsi struct from the AC3 stream
  100.  */
  101. void
  102. parse_bsi(bsi_t *bsi,bitstream_t *bs)
  103. {
  104. uint_32 i;
  105. /* Check the AC-3 version number */
  106. bsi->bsid = bitstream_get(bs,5);
  107. /* Get the audio service provided by the steram */
  108. bsi->bsmod = bitstream_get(bs,3);
  109. /* Get the audio coding mode (ie how many channels)*/
  110. bsi->acmod = bitstream_get(bs,3);
  111. /* Predecode the number of full bandwidth channels as we use this
  112.  * number a lot */
  113. bsi->nfchans = nfchans[bsi->acmod];
  114. /* If it is in use, get the centre channel mix level */
  115. if ((bsi->acmod & 0x1) && (bsi->acmod != 0x1))
  116. bsi->cmixlev = bitstream_get(bs,2);
  117. /* If it is in use, get the surround channel mix level */
  118. if (bsi->acmod & 0x4)
  119. bsi->surmixlev = bitstream_get(bs,2);
  120. /* Get the dolby surround mode if in 2/0 mode */
  121. if(bsi->acmod == 0x2)
  122. bsi->dsurmod= bitstream_get(bs,2);
  123. /* Is the low frequency effects channel on? */
  124. bsi->lfeon = bitstream_get(bs,1);
  125. /* Get the dialogue normalization level */
  126. bsi->dialnorm = bitstream_get(bs,5);
  127. /* Does compression gain exist? */
  128. bsi->compre = bitstream_get(bs,1);
  129. if (bsi->compre)
  130. {
  131. /* Get compression gain */
  132. bsi->compr = bitstream_get(bs,8);
  133. }
  134. /* Does language code exist? */
  135. bsi->langcode = bitstream_get(bs,1);
  136. if (bsi->langcode)
  137. {
  138. /* Get langauge code */
  139. bsi->langcod = bitstream_get(bs,8);
  140. }
  141. /* Does audio production info exist? */
  142. bsi->audprodie = bitstream_get(bs,1);
  143. if (bsi->audprodie)
  144. {
  145. /* Get mix level */
  146. bsi->mixlevel = bitstream_get(bs,5);
  147. /* Get room type */
  148. bsi->roomtyp = bitstream_get(bs,2);
  149. }
  150. /* If we're in dual mono mode then get some extra info */
  151. if (bsi->acmod ==0)
  152. {
  153. /* Get the dialogue normalization level two */
  154. bsi->dialnorm2 = bitstream_get(bs,5);
  155. /* Does compression gain two exist? */
  156. bsi->compr2e = bitstream_get(bs,1);
  157. if (bsi->compr2e)
  158. {
  159. /* Get compression gain two */
  160. bsi->compr2 = bitstream_get(bs,8);
  161. }
  162. /* Does language code two exist? */
  163. bsi->langcod2e = bitstream_get(bs,1);
  164. if (bsi->langcod2e)
  165. {
  166. /* Get langauge code two */
  167. bsi->langcod2 = bitstream_get(bs,8);
  168. }
  169. /* Does audio production info two exist? */
  170. bsi->audprodi2e = bitstream_get(bs,1);
  171. if (bsi->audprodi2e)
  172. {
  173. /* Get mix level two */
  174. bsi->mixlevel2 = bitstream_get(bs,5);
  175. /* Get room type two */
  176. bsi->roomtyp2 = bitstream_get(bs,2);
  177. }
  178. }
  179. /* Get the copyright bit */
  180. bsi->copyrightb = bitstream_get(bs,1);
  181. /* Get the original bit */
  182. bsi->origbs = bitstream_get(bs,1);
  183. /* Does timecode one exist? */
  184. bsi->timecod1e = bitstream_get(bs,1);
  185. if(bsi->timecod1e)
  186. bsi->timecod1 = bitstream_get(bs,14);
  187. /* Does timecode two exist? */
  188. bsi->timecod2e = bitstream_get(bs,1);
  189. if(bsi->timecod2e)
  190. bsi->timecod2 = bitstream_get(bs,14);
  191. /* Does addition info exist? */
  192. bsi->addbsie = bitstream_get(bs,1);
  193. if(bsi->addbsie)
  194. {
  195. /* Get how much info is there */
  196. bsi->addbsil = bitstream_get(bs,6);
  197. /* Get the additional info */
  198. for(i=0;i<(bsi->addbsil + 1);i++)
  199. bsi->addbsi[i] = bitstream_get(bs,8);
  200. }
  201. stats_printf_bsi(bsi);
  202. }
  203. /* More pain inducing parsing */
  204. void
  205. parse_audblk(bsi_t *bsi,audblk_t *audblk,bitstream_t *bs)
  206. {
  207. int i,j;
  208. for (i=0;i < bsi->nfchans; i++)
  209. {
  210. /* Is this channel an interleaved 256 + 256 block ? */
  211. audblk->blksw[i] = bitstream_get(bs,1);
  212. }
  213. for (i=0;i < bsi->nfchans; i++)
  214. {
  215. /* Should we dither this channel? */
  216. audblk->dithflag[i] = bitstream_get(bs,1);
  217. }
  218. /* Does dynamic range control exist? */
  219. audblk->dynrnge = bitstream_get(bs,1);
  220. if (audblk->dynrnge)
  221. {
  222. /* Get dynamic range info */
  223. audblk->dynrng = bitstream_get(bs,8);
  224. }
  225. /* If we're in dual mono mode then get the second channel DR info */
  226. if (bsi->acmod == 0)
  227. {
  228. /* Does dynamic range control two exist? */
  229. audblk->dynrng2e = bitstream_get(bs,1);
  230. if (audblk->dynrng2e)
  231. {
  232. /* Get dynamic range info */
  233. audblk->dynrng2 = bitstream_get(bs,8);
  234. }
  235. }
  236. /* Does coupling strategy exist? */
  237. audblk->cplstre = bitstream_get(bs,1);
  238. if (audblk->cplstre)
  239. {
  240. /* Is coupling turned on? */
  241. audblk->cplinu = bitstream_get(bs,1);
  242. if(audblk->cplinu)
  243. {
  244. for(i=0;i < bsi->nfchans; i++)
  245. audblk->chincpl[i] = bitstream_get(bs,1);
  246. if(bsi->acmod == 0x2)
  247. audblk->phsflginu = bitstream_get(bs,1);
  248. audblk->cplbegf = bitstream_get(bs,4);
  249. audblk->cplendf = bitstream_get(bs,4);
  250. audblk->ncplsubnd = (audblk->cplendf + 2) - audblk->cplbegf + 1;
  251. /* Calculate the start and end bins of the coupling channel */
  252. audblk->cplstrtmant = (audblk->cplbegf * 12) + 37 ; 
  253. audblk->cplendmant =  ((audblk->cplendf + 3) * 12) + 37;
  254. /* The number of combined subbands is ncplsubnd minus each combined
  255.  * band */
  256. audblk->ncplbnd = audblk->ncplsubnd; 
  257. for(i=1; i< audblk->ncplsubnd; i++)
  258. {
  259. audblk->cplbndstrc[i] = bitstream_get(bs,1);
  260. audblk->ncplbnd -= audblk->cplbndstrc[i];
  261. }
  262. }
  263. }
  264. if(audblk->cplinu)
  265. {
  266. /* Loop through all the channels and get their coupling co-ords */
  267. for(i=0;i < bsi->nfchans;i++)
  268. {
  269. if(!audblk->chincpl[i])
  270. continue;
  271. /* Is there new coupling co-ordinate info? */
  272. audblk->cplcoe[i] = bitstream_get(bs,1);
  273. if(audblk->cplcoe[i])
  274. {
  275. audblk->mstrcplco[i] = bitstream_get(bs,2); 
  276. for(j=0;j < audblk->ncplbnd; j++)
  277. {
  278. audblk->cplcoexp[i][j] = bitstream_get(bs,4); 
  279. audblk->cplcomant[i][j] = bitstream_get(bs,4); 
  280. }
  281. }
  282. }
  283. /* If we're in dual mono mode, there's going to be some phase info */
  284. if( (bsi->acmod == 0x2) && audblk->phsflginu && 
  285. (audblk->cplcoe[0] || audblk->cplcoe[1]))
  286. {
  287. for(j=0;j < audblk->ncplbnd; j++)
  288. audblk->phsflg[j] = bitstream_get(bs,1); 
  289. }
  290. }
  291. /* If we're in dual mono mode, there may be a rematrix strategy */
  292. if(bsi->acmod == 0x2)
  293. {
  294. audblk->rematstr = bitstream_get(bs,1);
  295. if(audblk->rematstr)
  296. {
  297. if (audblk->cplinu == 0) 
  298. for(i = 0; i < 4; i++) 
  299. audblk->rematflg[i] = bitstream_get(bs,1);
  300. }
  301. if((audblk->cplbegf > 2) && audblk->cplinu) 
  302. {
  303. for(i = 0; i < 4; i++) 
  304. audblk->rematflg[i] = bitstream_get(bs,1);
  305. }
  306. if((audblk->cplbegf <= 2) && audblk->cplinu) 
  307. for(i = 0; i < 3; i++) 
  308. audblk->rematflg[i] = bitstream_get(bs,1);
  309. if((audblk->cplbegf == 0) && audblk->cplinu) 
  310. for(i = 0; i < 2; i++) 
  311. audblk->rematflg[i] = bitstream_get(bs,1);
  312. }
  313. }
  314. if (audblk->cplinu)
  315. {
  316. /* Get the coupling channel exponent strategy */
  317. audblk->cplexpstr = bitstream_get(bs,2);
  318. audblk->ncplgrps = (audblk->cplendmant - audblk->cplstrtmant) / 
  319. (3 << (audblk->cplexpstr-1));
  320. }
  321. for(i = 0; i < bsi->nfchans; i++)
  322. audblk->chexpstr[i] = bitstream_get(bs,2);
  323. /* Get the exponent strategy for lfe channel */
  324. if(bsi->lfeon) 
  325. audblk->lfeexpstr = bitstream_get(bs,1);
  326. /* Determine the bandwidths of all the fbw channels */
  327. for(i = 0; i < bsi->nfchans; i++) 
  328. uint_16 grp_size;
  329. if(audblk->chexpstr[i] != EXP_REUSE) 
  330. if (audblk->cplinu && audblk->chincpl[i]) 
  331. {
  332. audblk->endmant[i] = audblk->cplstrtmant;
  333. }
  334. else
  335. {
  336. audblk->chbwcod[i] = bitstream_get(bs,6); 
  337. audblk->endmant[i] = ((audblk->chbwcod[i] + 12) * 3) + 37;
  338. }
  339. /* Calculate the number of exponent groups to fetch */
  340. grp_size =  3 * (1 << (audblk->chexpstr[i] - 1));
  341. audblk->nchgrps[i] = (audblk->endmant[i] - 1 + (grp_size - 3)) / grp_size;
  342. }
  343. }
  344. /* Get the coupling exponents if they exist */
  345. if(audblk->cplinu && (audblk->cplexpstr != EXP_REUSE))
  346. {
  347. audblk->cplabsexp = bitstream_get(bs,4);
  348. for(i=0;i< audblk->ncplgrps;i++)
  349. audblk->cplexps[i] = bitstream_get(bs,7);
  350. }
  351. /* Get the fwb channel exponents */
  352. for(i=0;i < bsi->nfchans; i++)
  353. {
  354. if(audblk->chexpstr[i] != EXP_REUSE)
  355. {
  356. audblk->exps[i][0] = bitstream_get(bs,4);
  357. for(j=1;j<=audblk->nchgrps[i];j++)
  358. audblk->exps[i][j] = bitstream_get(bs,7);
  359. audblk->gainrng[i] = bitstream_get(bs,2);
  360. }
  361. }
  362. /* Get the lfe channel exponents */
  363. if(bsi->lfeon && (audblk->lfeexpstr != EXP_REUSE))
  364. {
  365. audblk->lfeexps[0] = bitstream_get(bs,4);
  366. audblk->lfeexps[1] = bitstream_get(bs,7);
  367. audblk->lfeexps[2] = bitstream_get(bs,7);
  368. }
  369. /* Get the parametric bit allocation parameters */
  370. audblk->baie = bitstream_get(bs,1);
  371. if(audblk->baie)
  372. {
  373. audblk->sdcycod = bitstream_get(bs,2);
  374. audblk->fdcycod = bitstream_get(bs,2);
  375. audblk->sgaincod = bitstream_get(bs,2);
  376. audblk->dbpbcod = bitstream_get(bs,2);
  377. audblk->floorcod = bitstream_get(bs,3);
  378. }
  379. /* Get the SNR off set info if it exists */
  380. audblk->snroffste = bitstream_get(bs,1);
  381. if(audblk->snroffste)
  382. {
  383. audblk->csnroffst = bitstream_get(bs,6);
  384. if(audblk->cplinu)
  385. {
  386. audblk->cplfsnroffst = bitstream_get(bs,4);
  387. audblk->cplfgaincod = bitstream_get(bs,3);
  388. }
  389. for(i = 0;i < bsi->nfchans; i++)
  390. {
  391. audblk->fsnroffst[i] = bitstream_get(bs,4);
  392. audblk->fgaincod[i] = bitstream_get(bs,3);
  393. }
  394. if(bsi->lfeon)
  395. {
  396. audblk->lfefsnroffst = bitstream_get(bs,4);
  397. audblk->lfefgaincod = bitstream_get(bs,3);
  398. }
  399. }
  400. /* Get coupling leakage info if it exists */
  401. if(audblk->cplinu)
  402. {
  403. audblk->cplleake = bitstream_get(bs,1);
  404. if(audblk->cplleake)
  405. {
  406. audblk->cplfleak = bitstream_get(bs,3);
  407. audblk->cplsleak = bitstream_get(bs,3);
  408. }
  409. }
  410. /* Get the delta bit alloaction info */
  411. audblk->deltbaie = bitstream_get(bs,1);
  412. if(audblk->deltbaie)
  413. {
  414. if(audblk->cplinu)
  415. audblk->cpldeltbae = bitstream_get(bs,2);
  416. for(i = 0;i < bsi->nfchans; i++)
  417. audblk->deltbae[i] = bitstream_get(bs,2);
  418. if (audblk->cplinu && (audblk->cpldeltbae == DELTA_BIT_NEW))
  419. {
  420. audblk->cpldeltnseg = bitstream_get(bs,3);
  421. for(i = 0;i < audblk->cpldeltnseg + 1; i++)
  422. {
  423. audblk->cpldeltoffst[i] = bitstream_get(bs,5);
  424. audblk->cpldeltlen[i] = bitstream_get(bs,4);
  425. audblk->cpldeltba[i] = bitstream_get(bs,3);
  426. }
  427. }
  428. for(i = 0;i < bsi->nfchans; i++)
  429. {
  430. if (audblk->deltbae[i] == DELTA_BIT_NEW)
  431. {
  432. audblk->deltnseg[i] = bitstream_get(bs,3);
  433. for(j = 0; j < audblk->deltnseg[i] + 1; j++)
  434. {
  435. audblk->deltoffst[i][j] = bitstream_get(bs,5);
  436. audblk->deltlen[i][j] = bitstream_get(bs,4);
  437. audblk->deltba[i][j] = bitstream_get(bs,3);
  438. }
  439. }
  440. }
  441. }
  442. /* Check to see if there's any dummy info to get */
  443. if((audblk->skiple =  bitstream_get(bs,1)))
  444. {
  445. uint_16 skip_data;
  446. audblk->skipl = bitstream_get(bs,9);
  447. //XXX remove
  448. //fprintf(stderr,"(parse) skipping %d bytesn",audblk->skipl);
  449. for(i = 0; i < audblk->skipl ; i++)
  450. {
  451. skip_data = bitstream_get(bs,8);
  452. //XXX remove
  453. //fprintf(stderr,"skipped data %2xn",skip_data);
  454. //if(skip_data != 0)
  455. //{
  456. //dprintf("(parse) Invalid skipped data %2xn",skip_data);
  457. //exit(1);
  458. //}
  459. }
  460. }
  461. stats_printf_audblk(audblk);
  462. }
  463. void
  464. parse_auxdata(syncinfo_t *syncinfo,bitstream_t *bs)
  465. {
  466. int i;
  467. int skip_length;
  468. uint_16 crc;
  469. uint_16 auxdatae;
  470. skip_length = (syncinfo->frame_size * 16)  - bs->total_bits_read - 17 - 1;
  471. //XXX remove
  472. //dprintf("(auxdata) skipping %d auxbitsn",skip_length);
  473. for(i=0; i <  skip_length; i++)
  474. //printf("Skipped bit %in",(uint_16)bitstream_get(bs,1));
  475. bitstream_get(bs,1);
  476. //get the auxdata exists bit
  477. auxdatae = bitstream_get(bs,1);
  478. //XXX remove
  479. //dprintf("auxdatae = %in",auxdatae);
  480. //Skip the CRC reserved bit
  481. bitstream_get(bs,1);
  482. //Get the crc
  483. crc = bitstream_get(bs,16);
  484. }