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

DVD

开发平台:

Unix_Linux

  1. /* 
  2.  *  bitstream.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. #include <stdlib.h>
  24. #include <stdio.h>
  25. #include "ac3.h"
  26. #include "decode.h"
  27. #include "crc.h"
  28. #include "bitstream.h"
  29. //My vego-matic endian swapping routine
  30. #define SWAP_ENDIAN32(x)  ((((uint_8*)&x)[0] << 24) |  
  31.                          (((uint_8*)&x)[1] << 16) |  
  32.                          (((uint_8*)&x)[2] << 8) |   
  33.                          ((uint_8*)&x)[3])           
  34. static void bitstream_load(bitstream_t *bs);
  35. /* Fetches 1-32 bits from the file opened in bitstream_open */
  36. uint_32
  37. bitstream_get(bitstream_t *bs,uint_32 num_bits)
  38. {
  39. uint_32 result;
  40. uint_32 bits_read;
  41. uint_32 bits_to_go;
  42. if(num_bits == 0)
  43. return 0;
  44. bits_read = num_bits > bs->bits_left ? bs->bits_left : num_bits; 
  45. result = bs->current_word  >> (32 - bits_read);
  46. bs->current_word <<= bits_read;
  47. bs->bits_left -= bits_read;
  48. if(bs->bits_left == 0)
  49. bitstream_load(bs);
  50. if (bits_read < num_bits)
  51. {
  52. bits_to_go = num_bits - bits_read;
  53. result <<= bits_to_go;
  54. result |= bs->current_word  >> (32 - bits_to_go);
  55. bs->current_word <<= bits_to_go;
  56. bs->bits_left -= bits_to_go;
  57. }
  58. bs->total_bits_read += num_bits;
  59. crc_process(result,num_bits);
  60. return result;
  61. }
  62. static void
  63. bitstream_load(bitstream_t *bs)
  64. {
  65. int bytes_read;
  66. bytes_read = fread(&bs->current_word,1,4,bs->file);
  67. bs->current_word = SWAP_ENDIAN32(bs->current_word);
  68. bs->bits_left = bytes_read * 8;
  69. //FIXME finishing up the stream isn't done too gracefully
  70. if (bytes_read < 4)
  71. bs->done = 1;
  72. }
  73. /* Opens a bitstream for use in bitstream_get */
  74. bitstream_t*
  75. bitstream_open(FILE *file)
  76. {
  77. bitstream_t *bs;
  78. if(!file)
  79. return 0;
  80. bs = malloc(sizeof(bitstream_t));
  81. if(!bs)
  82. return 0;
  83. bs->done = 0;
  84. /* Read in the first 32 bit word and initialize the structure */
  85. bs->file = file;
  86. bitstream_load(bs);
  87. return bs;
  88. }
  89. int bitstream_done(bitstream_t *bs)
  90. {
  91. return (bs->done);
  92. }
  93. void 
  94. bitstream_close(bitstream_t *bs)
  95. {
  96. if(bs->file)
  97. fclose(bs->file);
  98. free(bs);
  99. }