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

DVD

开发平台:

Unix_Linux

  1. /* 
  2.  *    decode.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. #ifdef HAVE_CONFIG_H
  25. #include "config.h"
  26. #endif 
  27. #include <stdlib.h>
  28. #include <stdio.h>
  29. #include <errno.h>
  30. #include <string.h>
  31. #include "ac3.h"
  32. #include "decode.h"
  33. #include "bitstream.h"
  34. #include "imdct.h"
  35. #include "exponent.h"
  36. #include "mantissa.h"
  37. #include "bit_allocate.h"
  38. #include "uncouple.h"
  39. #include "parse.h"
  40. #include "output.h"
  41. #include "crc.h"
  42. #include "rematrix.h"
  43. #include "sys/time.h"
  44. #include "debug.h"
  45. static void decode_find_sync(bitstream_t *bs);
  46. static void decode_print_banner(void);
  47. static stream_coeffs_t stream_coeffs;
  48. static stream_samples_t stream_samples;
  49. static audblk_t audblk;
  50. static bsi_t bsi;
  51. static syncinfo_t syncinfo;
  52. static uint_32 frame_count = 0;
  53. prefs_t global_prefs = {0,0};
  54. int main(int argc,char *argv[])
  55. {
  56. int i;
  57. bitstream_t *bs;
  58. FILE *in_file;
  59. int done_banner = 0;
  60. /* If we get an argument then use it as a filename... otherwise use
  61.  * stdin */
  62. if(argc > 1)
  63. {
  64. in_file = fopen(argv[1],"r");
  65. if(!in_file)
  66. {
  67. fprintf(stderr,"%s - Couldn't open file %sn",strerror(errno),argv[1]);
  68. exit(1);
  69. }
  70. }
  71. else
  72. in_file = stdin;
  73. bs = bitstream_open(in_file);
  74. imdct_init();
  75. decode_sanity_check_init();
  76. output_open();
  77. while(1)
  78. {
  79. decode_find_sync(bs);
  80. parse_syncinfo(&syncinfo,bs);
  81. parse_bsi(&bsi,bs);
  82. if(!done_banner)
  83. {
  84. decode_print_banner();
  85. done_banner = 1;
  86. }
  87. for(i=0; i < 6; i++)
  88. {
  89. /* Extract most of the audblk info from the bitstream
  90.  * (minus the mantissas */
  91. parse_audblk(&bsi,&audblk,bs);
  92. decode_sanity_check();
  93. /* Take the differential exponent data and turn it into
  94.  * absolute exponents */
  95. exponent_unpack(&bsi,&audblk,&stream_coeffs); 
  96. decode_sanity_check();
  97. /* Figure out how many bits per mantissa */
  98. bit_allocate(syncinfo.fscod,&bsi,&audblk);
  99. decode_sanity_check();
  100. /* Extract the mantissas from the data stream */
  101. mantissa_unpack(&bsi,&audblk,bs);
  102. decode_sanity_check();
  103. /* Uncouple the coupling channel if it exists and
  104.  * convert the mantissa and exponents to IEEE floating
  105.  * point format */
  106. uncouple(&bsi,&audblk,&stream_coeffs);
  107. decode_sanity_check();
  108. if(bsi.acmod == 0x2)
  109. rematrix(&audblk,&stream_coeffs);
  110. #if 0
  111. /* Perform dynamic range compensation */
  112. dynamic_range(&bsi,&audblk,&stream_coeffs); 
  113. #endif
  114. /* Convert the frequency data into time samples */
  115. imdct(&bsi,&audblk,&stream_coeffs,&stream_samples);
  116. decode_sanity_check();
  117. /* Send the samples to the output device */
  118. output_play(&bsi,&stream_samples);
  119. }
  120. parse_auxdata(&syncinfo,bs);
  121. if(!crc_validate())
  122. {
  123. dprintf("(crc) CRC check failedn");
  124. }
  125. else
  126. {
  127. dprintf("(crc) CRC check passedn");
  128. }
  129. decode_sanity_check();
  130. if(bitstream_done(bs))
  131. break;
  132. }
  133. printf("End of streamn");
  134. bitstream_close(bs);
  135. output_close();
  136. return 0;
  137. }
  138. static 
  139. void decode_find_sync(bitstream_t *bs)
  140. {
  141. uint_16 sync_word;
  142. uint_32 i = 0;
  143. sync_word = bitstream_get(bs,16);
  144. /* Make sure we sync'ed */
  145. while(1)
  146. {
  147. if(sync_word == 0x0b77)
  148. break;
  149. sync_word = sync_word * 2;
  150. sync_word |= bitstream_get(bs,1);
  151. i++;
  152. }
  153. dprintf("(sync) %ld bits skipped to synchronizen",i);
  154. dprintf("(sync) begin frame %ldn",frame_count);
  155. frame_count++;
  156. bs->total_bits_read = 16;
  157. crc_init();
  158. }
  159. void decode_sanity_check_init(void)
  160. {
  161. syncinfo.magic = DECODE_MAGIC_NUMBER;
  162. bsi.magic = DECODE_MAGIC_NUMBER;
  163. audblk.magic1 = DECODE_MAGIC_NUMBER;
  164. audblk.magic2 = DECODE_MAGIC_NUMBER;
  165. audblk.magic3 = DECODE_MAGIC_NUMBER;
  166. }
  167. void decode_sanity_check(void)
  168. {
  169. int i;
  170. if(syncinfo.magic != DECODE_MAGIC_NUMBER)
  171. fprintf(stderr,"n** Sanity check failed -- syncinfo magic number **");
  172. if(bsi.magic != DECODE_MAGIC_NUMBER)
  173. fprintf(stderr,"n** Sanity check failed -- bsi magic number **");
  174. if(audblk.magic1 != DECODE_MAGIC_NUMBER)
  175. fprintf(stderr,"n** Sanity check failed -- audblk magic number 1 **"); 
  176. if(audblk.magic2 != DECODE_MAGIC_NUMBER)
  177. fprintf(stderr,"n** Sanity check failed -- audblk magic number 2 **"); 
  178. if(audblk.magic3 != DECODE_MAGIC_NUMBER)
  179. fprintf(stderr,"n** Sanity check failed -- audblk magic number 3 **"); 
  180. for(i = 0;i < 5 ; i++)
  181. {
  182. if (audblk.fbw_exp[i][255] !=0 || audblk.fbw_exp[i][254] !=0 || 
  183. audblk.fbw_exp[i][253] !=0)
  184. fprintf(stderr,"n** Sanity check failed -- fbw_exp out of bounds **"); 
  185. if (audblk.fbw_bap[i][255] !=0 || audblk.fbw_bap[i][254] !=0 || 
  186. audblk.fbw_bap[i][253] !=0)
  187. fprintf(stderr,"n** Sanity check failed -- fbw_bap out of bounds **"); 
  188. if (audblk.chmant[i][255] !=0 || audblk.chmant[i][254] !=0 || 
  189. audblk.chmant[i][253] !=0)
  190. fprintf(stderr,"n** Sanity check failed -- chmant out of bounds **"); 
  191. }
  192. if (audblk.cpl_exp[255] !=0 || audblk.cpl_exp[254] !=0 || 
  193. audblk.cpl_exp[253] !=0)
  194. fprintf(stderr,"n** Sanity check failed -- cpl_exp out of bounds **"); 
  195. if (audblk.cpl_bap[255] !=0 || audblk.cpl_bap[254] !=0 || 
  196. audblk.cpl_bap[253] !=0)
  197. fprintf(stderr,"n** Sanity check failed -- cpl_bap out of bounds **"); 
  198. if (audblk.cplmant[255] !=0 || audblk.cplmant[254] !=0 || 
  199. audblk.cplmant[253] !=0)
  200. fprintf(stderr,"n** Sanity check failed -- cpl_mant out of bounds **"); 
  201. if ((audblk.cplinu == 1) && (audblk.cplbegf > (audblk.cplendf+2)))
  202. fprintf(stderr,"n** Sanity check failed -- cpl params inconsistent **"); 
  203. for(i=0; i < bsi.nfchans; i++)
  204. {
  205. if((audblk.chincpl[i] == 0) && (audblk.chbwcod[i] > 60))
  206. fprintf(stderr,"n** Sanity check failed -- chbwcod too big **"); 
  207. }
  208. return;
  209. }
  210. void decode_print_banner(void)
  211. {
  212. printf(PACKAGE"-"VERSION" (C) 1999 Aaron Holtzman (aholtzma@ess.engr.uvic.ca)n");
  213. printf("%d.%d Mode ",bsi.nfchans,bsi.lfeon);
  214. switch (syncinfo.fscod)
  215. {
  216. case 2:
  217. printf("32 KHz   ");
  218. break;
  219. case 1:
  220. printf("44.1 KHz ");
  221. break;
  222. case 0:
  223. printf("48 KHz   ");
  224. break;
  225. default:
  226. printf("Invalid sampling rate ");
  227. break;
  228. }
  229. printf("%4d kbps ",syncinfo.bit_rate);
  230. switch(bsi.bsmod)
  231. {
  232. case 0:
  233. printf("Complete Main Audio Service");
  234. break;
  235. case 1:
  236. printf("Music and Effects Audio Service");
  237. case 2:
  238. printf("Visually Impaired Audio Service");
  239. break;
  240. case 3:
  241. printf("Hearing Impaired Audio Service");
  242. break;
  243. case 4:
  244. printf("Dialogue Audio Service");
  245. break;
  246. case 5:
  247. printf("Commentary Audio Service");
  248. break;
  249. case 6:
  250. printf("Emergency Audio Service");
  251. break;
  252. case 7:
  253. printf("Voice Over Audio Service");
  254. break;
  255. }
  256. printf("n");
  257. }