bitstream.h
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:14k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /**********************************************************************
  2. MPEG-4 Audio VM
  3. Bit stream module
  4. This software module was originally developed by
  5. Heiko Purnhagen (University of Hannover / ACTS-MoMuSys)
  6. and edited by
  7. Ralph Sperschneider (Fraunhofer IIS)
  8. Thomas Schaefer (Fraunhofer IIS)
  9. in the course of development of the MPEG-2 NBC/MPEG-4 Audio standard
  10. ISO/IEC 13818-7, 14496-1,2 and 3. This software module is an
  11. implementation of a part of one or more MPEG-2 NBC/MPEG-4 Audio tools
  12. as specified by the MPEG-2 NBC/MPEG-4 Audio standard. ISO/IEC gives
  13. users of the MPEG-2 NBC/MPEG-4 Audio standards free license to this
  14. software module or modifications thereof for use in hardware or
  15. software products claiming conformance to the MPEG-2 NBC/ MPEG-4 Audio
  16. standards. Those intending to use this software module in hardware or
  17. software products are advised that this use may infringe existing
  18. patents. The original developer of this software module and his/her
  19. company, the subsequent editors and their companies, and ISO/IEC have
  20. no liability for use of this software module or modifications thereof
  21. in an implementation. Copyright is not released for non MPEG-2
  22. NBC/MPEG-4 Audio conforming products. The original developer retains
  23. full right to use the code for his/her own purpose, assign or donate
  24. the code to a third party and to inhibit third party from using the
  25. code for non MPEG-2 NBC/MPEG-4 Audio conforming products. This
  26. copyright notice must be included in all copies or derivative works.
  27. Copyright (c) 1996, 1997, 1998.
  28. Header file: bitstream.h
  29. $Id: bitstream.h,v 1.3 2002/07/08 15:04:42 mvillari Exp $
  30. Required modules:
  31. common.o common module
  32. Authors:
  33. HP    Heiko Purnhagen, Uni Hannover <purnhage@tnt.uni-hannover.de>
  34. BT    Bodo Teichmann, FhG/IIS <tmn@iis.fhg.de>
  35. Changes:
  36. 04-jun-96   HP    added buffers, ASCII-header and BsGetBufferAhead()
  37. 07-jun-96   HP    use CommonWarning(), CommonExit()
  38. 10-jun-96   HP    ...
  39. 13-jun-96   HP    changed BsGetBit(), BsPutBit(), BsGetBuffer(),
  40.                   BsGetBufferAhead(), BsPutBuffer()
  41. 26-aug-96   HP    CVS
  42. 23-oct-96   HP    free for BsOpenFileRead() info string
  43. 15-nov-96   HP    changed int to long where required
  44.                   added BsGetBitChar(), BsGetBitShort(), BsGetBitInt()
  45.                   improved file header handling
  46. 23-dec-96   HP    renamed mode to write in BsBitStream
  47. 10-jan-97   HP    added BsGetBitAhead(), BsGetSkip()
  48. 19-feb-97   HP    made internal data structures invisible
  49. 04-apr-97   BT/HP added BsGetBufferAppend()
  50. 07-max-97   BT    added BsGetBitBack()
  51. 14-mrz-98   sfr   added CreateEpInfo(), BsReadInfoFile(), BsGetBitEP()
  52. 20-jan-99   HP    due to the nature of some of the modifications merged
  53.                   into this code, I disclaim any responsibility for this
  54.                   code and/or its readability -- sorry ...
  55. 21-jan-99   HP    trying to clean up a bit ...
  56. 22-jan-99   HP    added "-" stdin/stdout support
  57.                   variable file buffer size for streaming
  58. 12-feb-99   BT/HP updated ...
  59. 19-apr-99   HP    cleaning up some header files again :-(
  60. **********************************************************************/
  61. /**********************************************************************
  62. Bit data is stored LSB-justified and transmitted MSB first.
  63. Example: 5 bit stored in unsigned long
  64.  ("1st" is the first bit transmitted, "x" indicates unused bit)
  65.   x  ...  x  1st 2nd 3rd 4th 5th
  66.  MSB      LSB
  67. Headerless bit stream files contain N*8 bits, where N is the file size in
  68. bytes. The last byte is padded with 0s if necessary.
  69. Example: bit stream file containing 13 bits (file size: 2 bytes)
  70.  1st 2nd 3rd 4th 5th 6th 7th 8th   9th 10th 11th 12th 13th 0 0 0
  71.  MSB ....... 1st byte ...... LSB   MSB ...... 2nd byte ...... LSB
  72. A bit stream file can have an optional ASCII header consisting of a
  73. magic string (e.g. ".mp4") followed by 'n' and an (optional) info string.
  74. The info string might also contain 'n'. The ASCII header is
  75. terminated by ''. If no magic string is specified when opening a
  76. bit stream file, a file without ASCII-header is read/written.
  77. Format of a bit stream file:
  78. [ <magic string> [<info string> ''] ] <bit stream>
  79.   <string> refers to string without terminal ''
  80.   <bit stream> refers to data bytes as described above for headerless files
  81. **********************************************************************/
  82. #ifndef _bitstream_h_
  83. #define _bitstream_h_
  84. /* ---------- declarations ---------- */
  85. #include "bitstreamHandle.h"
  86. /* ---------- functions ---------- */
  87. #ifdef __cplusplus
  88. extern "C" {
  89. #endif
  90. #define FREE(x) { if (x != NULL) free(x); x=NULL;  }
  91. /* BsInit() */
  92. /* Init bit stream module. */
  93. void BsInit (
  94.   long maxReadAhead, /* in: max num bits to be read ahead */
  95. /*     (determines file buffer size) */
  96. /*     (0 = default) */
  97.   int debugLevel, /* in: debug level */
  98. /*     0=off  1=basic  2=medium  3=full */
  99.   int aacEOF); /* in: AAC eof detection (default = 0) */
  100. /* BsOpenFileRead() */
  101. /* Open bit stream file for reading. */
  102. BsBitStream *BsOpenFileRead (
  103.   char *fileName, /* in: file name */
  104. /*     "-": stdin */
  105.   char *magic, /* in: expected magic string */
  106. /*     or NULL (no ASCII header in file) */
  107.   char **info); /* out: info string */
  108. /*      or NULL (no info string in file) */
  109. /* returns: */
  110. /*  bit stream (handle) */
  111. /*  or NULL if error */
  112. /* BsOpenFileWrite() */
  113. /* Open bit stream file for writing. */
  114. BsBitStream *BsOpenFileWrite (
  115.   char *fileName, /* in: file name */
  116. /*     "-": stdout */
  117.   char *magic, /* in: magic string */
  118. /*     or NULL (no ASCII header) */
  119.   char *info); /* in: info string */
  120. /*     or NULL (no info string) */
  121. /* returns: */
  122. /*  bit stream (handle) */
  123. /*  or NULL if error */
  124. /* BsOpenBufferRead() */
  125. /* Open bit stream buffer for reading. */
  126. BsBitStream *BsOpenBufferRead (
  127.   BsBitBuffer *buffer); /* in: bit buffer */
  128. /* returns: */
  129. /*  bit stream (handle) */
  130. /* BsOpenBufferWrite() */
  131. /* Open bit stream buffer for writing. */
  132. /* (Buffer is cleared first - previous data in buffer is lost !!!) */
  133. BsBitStream *BsOpenBufferWrite (
  134.   BsBitBuffer *buffer); /* in: bit buffer */
  135. /* returns: */
  136. /*  bit stream (handle) */
  137. /* BsCurrentBit() */
  138. /* Get number of bits read/written from/to stream. */
  139. long BsCurrentBit (
  140.   BsBitStream *stream); /* in: bit stream */
  141. /* returns: */
  142. /*  number of bits read/written */
  143. /* BsEof() */
  144. /* Test if end of bit stream file occurs within the next numBit bits. */
  145. int BsEof (
  146.   BsBitStream *stream, /* in: bit stream */
  147.   long numBit); /* in: number of bits ahead scanned for EOF */
  148. /* returns: */
  149. /*  0=not EOF  1=EOF */
  150. /* BsCloseRemove() */
  151. /* Close bit stream. */
  152. int BsCloseRemove (
  153.   BsBitStream *stream, /* in: bit stream */
  154.   int remove); /* in: if opened with BsOpenBufferRead(): */
  155. /*       0 = keep buffer unchanged */
  156. /*       1 = remove bits read from buffer */
  157. /* returns: */
  158. /*  0=OK  1=error */
  159. /* BsClose() */
  160. /* Close bit stream. */
  161. int BsClose (
  162.   BsBitStream *stream); /* in: bit stream */
  163. /* returns: */
  164. /*  0=OK  1=error */
  165. /* BsGetBit() */
  166. /* Read bits from bit stream. */
  167. /* (Current position in bit stream is advanced !!!) */
  168. int BsGetBit (
  169.   BsBitStream *stream, /* in: bit stream */
  170.   unsigned long *data, /* out: bits read */
  171. /*      (may be NULL if numBit==0) */
  172.   int numBit); /* in: num bits to read */
  173. /*     [0..32] */
  174. /* returns: */
  175. /*  0=OK  1=error */
  176. /* this function is mainly for debugging purpose, */
  177. /* you can call it from the debugger */
  178. long int BsGetBitBack (
  179.   BsBitStream *stream, /* in: bit stream */
  180.   int numBit); /* in: num bits to read */
  181. /*     [0..32] */
  182. /* returns: */
  183. /*  if numBit is positive
  184.       return the last numBits bit from stream
  185.     else
  186.       return the next -numBits from stream 
  187.     stream->currentBit is always unchanged */
  188. /* BsGetBitChar() */
  189. /* Read bits from bit stream (char). */
  190. /* (Current position in bit stream is advanced !!!) */
  191. int BsGetBitChar (
  192.   BsBitStream *stream, /* in: bit stream */
  193.   unsigned char *data, /* out: bits read */
  194. /*      (may be NULL if numBit==0) */
  195.   int numBit); /* in: num bits to read */
  196. /*     [0..8] */
  197. /* returns: */
  198. /*  0=OK  1=error */
  199. /* BsGetBitShort() */
  200. /* Read bits from bit stream (short). */
  201. /* (Current position in bit stream is advanced !!!) */
  202. int BsGetBitShort (
  203.   BsBitStream *stream, /* in: bit stream */
  204.   unsigned short *data, /* out: bits read */
  205. /*      (may be NULL if numBit==0) */
  206.   int numBit); /* in: num bits to read */
  207. /*     [0..16] */
  208. /* returns: */
  209. /*  0=OK  1=error */
  210. /* BsGetBitInt() */
  211. /* Read bits from bit stream (int). */
  212. /* (Current position in bit stream is advanced !!!) */
  213. int BsGetBitInt (
  214.   BsBitStream *stream, /* in: bit stream */
  215.   unsigned int *data, /* out: bits read */
  216. /*      (may be NULL if numBit==0) */
  217.   int numBit); /* in: num bits to read */
  218. /*     [0..16] */
  219. /* returns: */
  220. /*  0=OK  1=error */
  221. /* BsGetBitAhead() */
  222. /* Read bits from bit stream. */
  223. /* (Current position in bit stream is NOT advanced !!!) */
  224. int BsGetBitAhead (
  225.   BsBitStream *stream, /* in: bit stream */
  226.   unsigned long *data, /* out: bits read */
  227. /*      (may be NULL if numBit==0) */
  228.   int numBit); /* in: num bits to read */
  229. /*     [0..32] */
  230. /* returns: */
  231. /*  0=OK  1=error */
  232. /* BsGetBitAheadChar() */
  233. /* Read bits from bit stream (char). */
  234. /* (Current position in bit stream is NOT advanced !!!) */
  235. int BsGetBitAheadChar (
  236.   BsBitStream *stream, /* in: bit stream */
  237.   unsigned char *data, /* out: bits read */
  238. /*      (may be NULL if numBit==0) */
  239.   int numBit); /* in: num bits to read */
  240. /*     [0..8] */
  241. /* returns: */
  242. /*  0=OK  1=error */
  243. /* BsGetBitAheadShort() */
  244. /* Read bits from bit stream (short). */
  245. /* (Current position in bit stream is NOT advanced !!!) */
  246. int BsGetBitAheadShort (
  247.   BsBitStream *stream, /* in: bit stream */
  248.   unsigned short *data, /* out: bits read */
  249. /*      (may be NULL if numBit==0) */
  250.   int numBit); /* in: num bits to read */
  251. /*     [0..16] */
  252. /* returns: */
  253. /*  0=OK  1=error */
  254. /* BsGetBitAheadInt() */
  255. /* Read bits from bit stream (int). */
  256. /* (Current position in bit stream is NOT advanced !!!) */
  257. int BsGetBitAheadInt (
  258.   BsBitStream *stream, /* in: bit stream */
  259.   unsigned int *data, /* out: bits read */
  260. /*      (may be NULL if numBit==0) */
  261.   int numBit); /* in: num bits to read */
  262. /*     [0..16] */
  263. /* returns: */
  264. /*  0=OK  1=error */
  265. /* BsGetBuffer() */
  266. /* Read bits from bit stream to buffer. */
  267. /* (Current position in bit stream is advanced !!!) */
  268. /* (Buffer is cleared first - previous data in buffer is lost !!!) */
  269. int BsGetBuffer (
  270.   BsBitStream *stream, /* in: bit stream */
  271.   BsBitBuffer *buffer, /* out: buffer read */
  272. /*      (may be NULL if numBit==0) */
  273.   long numBit); /* in: num bits to read */
  274. /* returns: */
  275. /*  0=OK  1=error */
  276. /* BsGetBufferAppend() */
  277. /* append bits from bit stream to buffer. */
  278. /* (Current position in bit stream is advanced !!!) */
  279. int BsGetBufferAppend (
  280.   BsBitStream *stream, /* in: bit stream */
  281.   BsBitBuffer *buffer, /* out: buffer read */
  282. /*      (may be NULL if numBit==0) */
  283.   int append, /* in: if != 0: append bits to buffer */
  284. /*              (don't clear buffer) */
  285.   long numBit); /* in: num bits to read */
  286. /* returns: */
  287. /*  0=OK  1=error */
  288. /* BsGetBufferAhead() */
  289. /* Read bits ahead of current position from bit stream to buffer. */
  290. /* (Current position in bit stream is NOT advanced !!!) */
  291. /* (Buffer is cleared first - previous data in buffer is lost !!!) */
  292. int BsGetBufferAhead (
  293.   BsBitStream *stream, /* in: bit stream */
  294.   BsBitBuffer *buffer, /* out: buffer read */
  295. /*      (may be NULL if numBit==0) */
  296.   long numBit); /* in: num bits to read */
  297. /* returns: */
  298. /*  0=OK  1=error */
  299. /* BsGetSkip() */
  300. /* Skip bits in bit stream (read). */
  301. /* (Current position in bit stream is advanced !!!) */
  302. int BsGetSkip (
  303.   BsBitStream *stream, /* in: bit stream */
  304.   long numBit); /* in: num bits to skip */
  305. /* returns: */
  306. /*  0=OK  1=error */
  307. /* BsPutBit() */
  308. /* Write bits to bit stream. */
  309. int BsPutBit (
  310.   BsBitStream *stream, /* in: bit stream */
  311.   unsigned long data, /* in: bits to write */
  312.   int numBit); /* in: num bits to write */
  313. /*     [0..32] */
  314. /* returns: */
  315. /*  0=OK  1=error */
  316. /* BsPutBuffer() */
  317. /* Write bits from buffer to bit stream. */
  318. int BsPutBuffer (
  319.   BsBitStream *stream, /* in: bit stream */
  320.   BsBitBuffer *buffer); /* in: buffer to write */
  321. /* returns: */
  322. /*  0=OK  1=error */
  323. /* BsAllocBuffer() */
  324. /* Allocate bit buffer. */
  325. BsBitBuffer *BsAllocBuffer (
  326.   long numBit); /* in: buffer size in bits */
  327. /* returns: */
  328. /*  bit buffer (handle) */
  329. /* BsFreeBuffer() */
  330. /* Free bit buffer. */
  331. void BsFreeBuffer (
  332.   BsBitBuffer *buffer); /* in: bit buffer */
  333. /* BsBufferNumBit() */
  334. /* Get number of bits in buffer. */
  335. long BsBufferNumBit (
  336.   BsBitBuffer *buffer); /* in: bit buffer */
  337. /* returns: */
  338. /*  number of bits in buffer */
  339. /* BsClearBuffer() */
  340. /* Clear bit buffer (set numBit to 0). */
  341. void BsClearBuffer (
  342.   BsBitBuffer *buffer); /* in: bit buffer */
  343. #ifdef __cplusplus
  344. }
  345. #endif
  346. #endif /* _bitstream_h_ */
  347. /* end of bitstream.h */