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

流媒体/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. Source file: bitstream.c
  29. $Id: bitstream.c,v 1.3 2002/07/08 15:04:15 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. 06-jun-96   HP    added buffers, ASCII-header and BsGetBufferAhead()
  37. 07-jun-96   HP    use CommonWarning(), CommonExit()
  38. 11-jun-96   HP    ...
  39. 13-jun-96   HP    changed BsGetBit(), BsPutBit(), BsGetBuffer(),
  40.                   BsGetBufferAhead(), BsPutBuffer()
  41. 14-jun-96   HP    fixed bug in BsOpenFileRead(), read header
  42. 18-jun-96   HP    fixed bug in BsGetBuffer()
  43. 26-aug-96   HP    CVS
  44. 23-oct-96   HP    free for BsOpenFileRead() info string
  45. 07-nov-96   HP    fixed BsBitStream info bug
  46. 15-nov-96   HP    changed int to long where required
  47.                   added BsGetBitChar(), BsGetBitShort(), BsGetBitInt()
  48.                   improved file header handling
  49. 04-dec-96   HP    fixed bug in BsGetBitXxx() for numBit==0
  50. 23-dec-96   HP    renamed mode to write in BsBitStream
  51. 10-jan-97   HP    added BsGetBitAhead(), BsGetSkip()
  52. 17-jan-97   HP    fixed read file buffer bug
  53. 30-jan-97   HP    minor bug fix in read bitstream file magic string
  54. 19-feb-97   HP    made internal data structures invisible
  55. 04-apr-97   BT/HP added BsGetBufferAppend()
  56. 07-max-97   BT    added BsGetBitBack()
  57. 14-mrz-98   sfr   added CreateEpInfo(), BsReadInfoFile(), BsGetBitEP(),
  58.                         BsGetBitEP()
  59. 20-jan-99   HP    due to the nature of some of the modifications merged
  60.                   into this code, I disclaim any responsibility for this
  61.                   code and/or its readability -- sorry ...
  62. 21-jan-99   HP    trying to clean up a bit ...
  63. 22-jan-99   HP    added "-" stdin/stdout support
  64.                   variable file buffer size for streaming
  65. 05-feb-99   HP    added fflush() after fwrite()
  66. 12-feb-99   BT/HP updated ...
  67. 19-apr-99   HP    cleaning up some header files again :-(
  68. **********************************************************************/
  69. #include <stdio.h>
  70. #include <stdlib.h>
  71. #include <string.h>
  72. #include "bitstream.h" /* bit stream module */
  73. #include "common_m4a.h" /* common module */
  74. #include "buffersHandle.h"      /* undesired, but ... */
  75. /* ---------- declarations ---------- */
  76. #include "bitstreamStruct.h"    /* structs */
  77. #define MIN_FILE_BUF_SIZE 1024 /* min num bytes in file buffer */
  78. #define HEADER_BUF_SIZE   2048 /* max size of ASCII header */
  79. #define COMMENT_LENGTH   1024 /* max nr of comment characters */
  80. /* in predefinition file */
  81. #ifndef min
  82. #define min(a,b) ((a) < (b) ? (a) : (b))
  83. #endif
  84. #ifndef max
  85. #define max(a,b) ((a) > (b) ? (a) : (b))
  86. #endif
  87. #define BYTE_NUMBIT 8 /* bits in byte (char) */
  88. #define LONG_NUMBIT 32 /* bits in unsigned long */
  89. #define bit2byte(a) (((a)+BYTE_NUMBIT-1)/BYTE_NUMBIT)
  90. #define byte2bit(a) ((a)*BYTE_NUMBIT)
  91. /* ---------- declarations (structures) ---------- */
  92. /* ---------- variables ---------- */
  93. static int  BSdebugLevel  = 0; /* debug level */
  94. static int  BSaacEOF   = 0;
  95. static long BSbufSizeByte = MIN_FILE_BUF_SIZE; /* num bytes file buf */
  96. static long BSstreamId   = 0; /* stream id counter */
  97. /* ---------- internal functions ---------- */
  98. /* BsReadFile() */
  99. /* Read one buffer from file. */
  100. static int BsReadFile (
  101.   BsBitStream *stream) /* in: stream */
  102. /* returns: 0=OK  1=error */
  103. {
  104.   long numByte;
  105.   long numByteRead;
  106.   long curBuf;
  107.   if (BSdebugLevel >= 3)
  108.     printf("BsReadFile: id=%ld  streamNumByte=%ld  curBit=%ldn",
  109.    stream->streamId,stream->numByte,stream->currentBit);
  110.   if (feof(stream->file))
  111.     return 0;
  112.   numByte = bit2byte(stream->buffer[0]->size);
  113.   if (stream->numByte % numByte != 0) {
  114.     CommonWarning("BsReadFile: bit stream buffer error");
  115.     return 1;
  116.   }
  117.   curBuf = (stream->numByte / numByte) % 2;
  118.   numByteRead = fread(stream->buffer[curBuf]->data,sizeof(char),numByte,
  119.       stream->file);
  120.   if (ferror(stream->file)) {
  121.     CommonWarning("BsReadFile: error reading bit stream file");
  122.     return 1;
  123.   }
  124.   stream->numByte += numByteRead;
  125.   if (BSdebugLevel >= 3)
  126.     printf("BsReadFile: numByte=%ld  numByteRead=%ldn",numByte,numByteRead);
  127.   return 0;
  128. }
  129. /* BsWriteFile() */
  130. /* Write one buffer to file. */
  131. static int BsWriteFile (
  132.   BsBitStream *stream) /* in: stream */
  133. /* returns: 0=OK  1=error */
  134. {
  135.   long numByte;
  136.   long numByteWritten;
  137.   if (BSdebugLevel >= 3)
  138.     printf("BsWriteFile: id=%ld  streamNumByte=%ld  curBit=%ldn",
  139.    stream->streamId,stream->numByte,stream->currentBit);
  140.   if (stream->numByte % bit2byte(stream->buffer[0]->size) != 0) {
  141.     CommonWarning("BsWriteFile: bit stream buffer error");
  142.     return 1;
  143.   }
  144.   numByte = bit2byte(stream->currentBit) - stream->numByte;
  145.   numByteWritten = fwrite(stream->buffer[0]->data,sizeof(char),numByte,
  146.   stream->file);
  147.   fflush(stream->file);
  148.   if (numByteWritten != numByte || ferror(stream->file)) {
  149.     CommonWarning("BsWriteFile: error writing bit stream file");
  150.     return 1;
  151.   }
  152.   stream->numByte += numByteWritten;
  153.   if (BSdebugLevel >= 3)
  154.     printf("BsWriteFile: numByteWritten=%ldn",numByteWritten);
  155.   return 0;
  156. }
  157. /* BsReadAhead() */
  158. /* If possible, ensure that the next numBit bits are available */
  159. /* in read file buffer. */
  160. static int BsReadAhead (
  161.   BsBitStream *stream, /* in: bit stream */
  162.   long numBit) /* in: number of bits */
  163. /* returns: 0=OK  1=error */
  164. {
  165.   if (stream->write==1 || stream->file==NULL)
  166.     return 0;
  167.   if (bit2byte(stream->currentBit+numBit) > stream->numByte)
  168.     if (BsReadFile(stream)) {
  169.       CommonWarning("BsReadAhead: error reading bit stream file");
  170.       return 1;
  171.     }
  172.   return 0;
  173. }
  174. /* BsCheckRead() */
  175. /* Check if numBit bits could be read from stream. */
  176. static int BsCheckRead (
  177.   BsBitStream *stream, /* in: bit stream */
  178.   long numBit) /* in: number of bits */
  179. /* returns: */
  180. /*  0=numBit bits could be read */
  181. /*    (or write mode) */
  182. /*  1=numBit bits could not be read */
  183. {
  184.   if (stream->write == 1)
  185.     return 0; /* write mode */
  186.   else
  187.     if (stream->file == NULL)
  188.       return (stream->currentBit+numBit > stream->buffer[0]->numBit) ? 1 : 0;
  189.     else
  190.       return (bit2byte(stream->currentBit+numBit) > stream->numByte) ? 1 : 0;
  191. }
  192. /* BsReadByte() */
  193. /* Read byte from stream. */
  194. static int BsReadByte (
  195.   BsBitStream *stream, /* in: stream */
  196.   unsigned long *data, /* out: data (max 8 bit, right justified) */
  197.   int numBit) /* in: num bits [1..8] */
  198. /* returns: num bits read or 0 if error */
  199. {
  200.   long numUsed;
  201.   long idx;
  202.   long buf;
  203.   if (stream->file!=NULL && stream->currentBit==stream->numByte*BYTE_NUMBIT)
  204.     if (BsReadFile(stream)) {
  205.       if ( ! BSaacEOF || BSdebugLevel > 0 )
  206.         CommonWarning("BsReadByte: error reading bit stream file");
  207.       return 0;
  208.     }
  209.   if (BsCheckRead(stream,numBit)) {
  210.     if ( ! BSaacEOF || BSdebugLevel > 0  )
  211.       CommonWarning("BsReadByte: not enough bits left in stream");
  212.     return 0;
  213.   }
  214.   idx = (stream->currentBit / BYTE_NUMBIT) % bit2byte(stream->buffer[0]->size);
  215.   buf = (stream->currentBit / BYTE_NUMBIT /
  216.  bit2byte(stream->buffer[0]->size)) % 2;
  217.   numUsed = stream->currentBit % BYTE_NUMBIT;
  218.   *data = (stream->buffer[buf]->data[idx] >> (BYTE_NUMBIT-numUsed-numBit)) &
  219.     ((1<<numBit)-1);
  220.   stream->currentBit += numBit;
  221.   return numBit;
  222. }
  223. /* BsWriteByte() */
  224. /* Write byte to stream. */
  225. static int BsWriteByte (
  226.   BsBitStream *stream, /* in: stream */
  227.   unsigned long data, /* in: data (max 8 bit, right justified) */
  228.   int numBit) /* in: num bits [1..8] */
  229. /* returns: 0=OK  1=error */
  230. {
  231.   long numUsed,idx;
  232.   if (stream->file == NULL &&
  233.       stream->buffer[0]->numBit+numBit > stream->buffer[0]->size) {
  234.     CommonWarning("BsWriteByte: not enough bits left in buffer");
  235.     return 1;
  236.   }
  237.   idx = (stream->currentBit / BYTE_NUMBIT) % bit2byte(stream->buffer[0]->size);
  238.   numUsed = stream->currentBit % BYTE_NUMBIT;
  239.   if (numUsed == 0)
  240.     stream->buffer[0]->data[idx] = 0;
  241.   stream->buffer[0]->data[idx] |= (data & ((1<<numBit)-1)) <<
  242.     (BYTE_NUMBIT-numUsed-numBit);
  243.   stream->currentBit += numBit;
  244.   if (stream->file==NULL)
  245.     stream->buffer[0]->numBit = stream->currentBit;
  246.   if (stream->file!=NULL && stream->currentBit%stream->buffer[0]->size==0)
  247.     if (BsWriteFile(stream)) {
  248.       CommonWarning("BsWriteByte: error writing bit stream file");
  249.       return 1;
  250.     }
  251.   return 0;
  252. }
  253. /* ---------- functions ---------- */
  254. /* BsInit() */
  255. /* Init bit stream module. */
  256. void BsInit (
  257.   long maxReadAhead, /* in: max num bits to be read ahead */
  258. /*     (determines file buffer size) */
  259. /*     (0 = default) */
  260.   int debugLevel, /* in: debug level */
  261. /*     0=off  1=basic  2=medium  3=full */
  262.   int aacEOF) /* in: AAC eof detection (default = 0) */
  263. {
  264.   if (maxReadAhead)
  265.     BSbufSizeByte = max(4,bit2byte(maxReadAhead));
  266.   else
  267.     BSbufSizeByte = MIN_FILE_BUF_SIZE;
  268.   BSdebugLevel = debugLevel;
  269.   BSaacEOF = aacEOF;
  270.   if (BSdebugLevel >= 1 )
  271.     printf("BsInit: debugLevel=%d  aacEOF=%d  bufSizeByte=%ldn",
  272.    BSdebugLevel,BSaacEOF,BSbufSizeByte);
  273. }
  274. /* BsOpenFileRead() */
  275. /* Open bit stream file for reading. */
  276. BsBitStream *BsOpenFileRead (
  277.   char *fileName, /* in: file name */
  278. /*     "-": stdin */
  279.   char *magic, /* in: magic string */
  280. /*     or NULL (no ASCII header in file) */
  281.   char **info) /* out: info string */
  282. /*      or NULL (no info string in file) */
  283. /* returns: */
  284. /*  bit stream (handle) */
  285. /*  or NULL if error */
  286. {
  287.   BsBitStream *stream;
  288.   char header[HEADER_BUF_SIZE];
  289.   int tmp = 0;
  290.   long i,len;
  291.   if (BSdebugLevel >= 1) {
  292.     printf("BsOpenFileRead: fileName="%s"  id=%ld  bufSize=%ld  ",
  293.    fileName,BSstreamId,byte2bit(BSbufSizeByte));
  294.     if (magic != NULL)
  295.       printf("magic="%s"n",magic);
  296.     else
  297.       printf("no headern");
  298.   }
  299.   if ((stream=(BsBitStream*)malloc(sizeof(BsBitStream))) == NULL)
  300.     CommonExit(1,"BsOpenFileRead: memory allocation error (stream)");
  301.   stream->buffer[0]=BsAllocBuffer(byte2bit(BSbufSizeByte));
  302.   stream->buffer[1]=BsAllocBuffer(byte2bit(BSbufSizeByte));
  303.   stream->write = 0;
  304.   stream->streamId = BSstreamId++;
  305.   stream->info = NULL;
  306.  
  307.   if (strcmp(fileName,"-"))
  308.     stream->file = fopen(fileName,"rb");
  309.   else
  310.     stream->file = stdin;
  311.   if (stream->file == NULL) {
  312.     CommonWarning("BsOpenFileRead: error opening bit stream file %s",
  313.   fileName);
  314.     BsFreeBuffer(stream->buffer[0]);
  315.     BsFreeBuffer(stream->buffer[1]);
  316.    FREE(stream);
  317.     return NULL;
  318.   }
  319.   if (magic != NULL) {
  320.     /* read ASCII header */
  321.     /* read magic string */
  322.     len = strlen(magic);
  323.     if (len >= HEADER_BUF_SIZE) {
  324.       CommonWarning("BsOpenFileRead: magic string too long");
  325.       BsClose(stream);
  326.       return NULL;
  327.     }
  328.     for (i=0; i<len; i++)
  329.       header[i] = tmp = fgetc(stream->file);
  330.     if (tmp == EOF) { /* EOF requires int (not char) */
  331.       CommonWarning("BsOpenFileRead: "
  332.     "error reading bit stream file (header)");
  333.       BsClose(stream);
  334.       return NULL;
  335.     }
  336.     header[i] = '';
  337.     if (strcmp(header,magic) != 0) {
  338.       CommonWarning("BsOpenFileRead: magic string error "
  339.     "(found "%s", need "%s")",header,magic);
  340.       BsClose(stream);
  341.       return NULL;
  342.     }
  343.     
  344.     if (info != NULL) {
  345.       /* read info string */
  346.       i = 0;
  347.       while ((header[i]=tmp=fgetc(stream->file)) != '') {
  348. if (tmp == EOF) { /* EOF requires int (not char) */
  349.   CommonWarning("BsOpenFileRead: "
  350. "error reading bit stream file (header)");
  351.   BsClose(stream);
  352.   return NULL;
  353. }
  354. i++;
  355. if (i >= HEADER_BUF_SIZE) {
  356.   CommonWarning("BsOpenFileRead: info string too long");
  357.   BsClose(stream);
  358.   return NULL;
  359. }
  360.       }
  361.       if (BSdebugLevel >= 1)
  362. printf("BsOpenFileRead: info="%s"n",header);
  363.       if ((stream->info=(char*)malloc((strlen(header)+1)*sizeof(char)))
  364.   == NULL)
  365. CommonExit(1,"BsOpenFileRead: memory allocation error (info)");
  366.       strcpy(stream->info,header);
  367.       *info = stream->info;
  368.     }
  369.   }
  370.   /* init buffer */
  371.   stream->currentBit = 0;
  372.   stream->numByte = 0;
  373.   return stream;
  374. }
  375. /* BsOpenFileWrite() */
  376. /* Open bit stream file for writing. */
  377. BsBitStream *BsOpenFileWrite (
  378.   char *fileName, /* in: file name */
  379. /*     "-": stdout */
  380.   char *magic, /* in: magic string */
  381. /*     or NULL (no ASCII header) */
  382.   char *info) /* in: info string */
  383. /*     or NULL (no info string) */
  384. /* returns: */
  385. /*  bit stream (handle) */
  386. /*  or NULL if error */
  387. {
  388.   BsBitStream *stream;
  389.   if (BSdebugLevel >= 1) {
  390.     printf("BsOpenFileWrite: fileName="%s"  id=%ld  bufSize=%ld  ",
  391.    fileName,BSstreamId,byte2bit(BSbufSizeByte));
  392.     if (magic != NULL) {
  393.       printf("magic="%s"n",magic);
  394.       if (info != NULL)
  395. printf("BsOpenFileWrite: info="%s"n",info);
  396.       else
  397. printf("BsOpenFileWrite: no infon");
  398.     }
  399.     else
  400.       printf("no headern");
  401.   }
  402.   if ((stream=(BsBitStream*)malloc(sizeof(BsBitStream))) == NULL)
  403.     CommonExit(1,"BsOpenFileWrite: memory allocation error (stream)");
  404.   stream->buffer[0]=BsAllocBuffer(byte2bit(BSbufSizeByte));
  405.   stream->write = 1;
  406.   stream->streamId = BSstreamId++;
  407.   stream->info = NULL;
  408.   if (strcmp(fileName,"-"))
  409.     stream->file = fopen(fileName,"wb");
  410.   else
  411.     stream->file = stdout;
  412.   if (stream->file == NULL) {
  413.     CommonWarning("BsOpenFileWrite: error opening bit stream file %s",
  414.   fileName);
  415.     BsFreeBuffer(stream->buffer[0]);
  416.    FREE(stream);
  417.     return NULL;
  418.   }
  419.   if (magic!=NULL) {
  420.     /* write ASCII header */
  421.     /* write magic string */
  422.     if (fputs(magic,stream->file) == EOF) {
  423.       CommonWarning("BsOpenFileWrite: error writing bit stream file (header)");
  424.       BsClose(stream);
  425.       return NULL;
  426.     }
  427.     if (info!=NULL) {
  428.       /* write info string */
  429.       if (fputs(info,stream->file) == EOF) {
  430. CommonWarning("BsOpenFileWrite: "
  431.       "error writing bit stream file (header)");
  432. BsClose(stream);
  433. return NULL;
  434.       }
  435.       if (fputc('',stream->file) == EOF) {
  436. CommonWarning("BsOpenFileWrite: "
  437.       "error writing bit stream file (header)");
  438. BsClose(stream);
  439. return NULL;
  440.       }
  441.     }
  442.   }
  443.   stream->currentBit = 0;
  444.   stream->numByte = 0;
  445.   return stream;
  446. }
  447. /* BsOpenBufferRead() */
  448. /* Open bit stream buffer for reading. */
  449. BsBitStream *BsOpenBufferRead (
  450.   BsBitBuffer *buffer) /* in: bit buffer */
  451. /* returns: */
  452. /*  bit stream (handle) */
  453. {
  454.   BsBitStream *stream;
  455.   if (BSdebugLevel >= 2)
  456.     printf("BsOpenBufferRead: id=%ld  bufNumBit=%ld  bufSize=%ld  "
  457.    "bufAddr=0x%lxn",
  458.    BSstreamId,buffer->numBit,buffer->size,(unsigned long)buffer);
  459.   if ((stream=(BsBitStream*)malloc(sizeof(BsBitStream))) == NULL)
  460.     CommonExit(1,"BsOpenBufferRead: memory allocation error");
  461.   stream->file = NULL;
  462.   stream->write = 0;
  463.   stream->streamId = BSstreamId++;
  464.   stream->info = NULL;
  465.   stream->buffer[0] = buffer;
  466.   stream->currentBit = 0;
  467.   
  468.   return stream;
  469. }
  470. /* BsOpenBufferWrite() */
  471. /* Open bit stream buffer for writing. */
  472. /* (Buffer is cleared first - previous data in buffer is lost !!!) */
  473. BsBitStream *BsOpenBufferWrite (
  474.   BsBitBuffer *buffer) /* in: bit buffer */
  475. /* returns: */
  476. /*  bit stream (handle) */
  477. {
  478.   BsBitStream *stream;
  479.   if (BSdebugLevel >= 2)
  480.     printf("BsOpenBufferWrite: id=%ld  bufNumBit=%ld  bufSize=%ld  "
  481.    "bufAddr=0x%lxn",
  482.    BSstreamId,buffer->numBit,buffer->size,(unsigned long)buffer);
  483.   if ((stream=(BsBitStream*)malloc(sizeof(BsBitStream))) == NULL)
  484.     CommonExit(1,"BsOpenBufferWrite: memory allocation error");
  485.   stream->file = NULL;
  486.   stream->write = 1;
  487.   stream->streamId = BSstreamId++;
  488.   stream->info = NULL;
  489.   stream->buffer[0] = buffer;
  490.   BsClearBuffer(buffer);
  491.   stream->currentBit = 0;
  492.   
  493.   return stream;
  494. }
  495. /* BsCurrentBit() */
  496. /* Get number of bits read/written from/to stream. */
  497. long BsCurrentBit (
  498.   BsBitStream *stream) /* in: bit stream */
  499. /* returns: */
  500. /*  number of bits read/written */
  501. {
  502.   return stream->currentBit;
  503. }
  504. /* BsEof() */
  505. /* Test if end of bit stream file occurs within the next numBit bits. */
  506. int BsEof (
  507.   BsBitStream *stream, /* in: bit stream */
  508.   long numBit) /* in: number of bits ahead scanned for EOF */
  509. /* returns: */
  510. /*  0=not EOF  1=EOF */
  511. {
  512.   int eof;
  513.   if (BSdebugLevel >= 2)
  514.     printf("BsEof: %s  id=%ld  curBit=%ld  numBit=%ldn",
  515.    (stream->file!=NULL)?"file":"buffer",
  516.    stream->streamId,stream->currentBit,numBit);
  517.   if (stream->file != NULL && numBit > stream->buffer[0]->size)
  518.     CommonExit(1,"BsEof: "
  519.        "number of bits to look ahead too high (%ld)",numBit);
  520.   if (BsReadAhead(stream,numBit+1)) {
  521.     CommonWarning("BsEof: error reading bit stream");
  522.     eof = 0;
  523.   }
  524.   else
  525.     eof = BsCheckRead(stream,numBit+1);
  526.   if (BSdebugLevel >= 2)
  527.     printf("BsEof: eof=%dn",eof);
  528.   return eof;
  529. }
  530. static void BsRemoveBufferOffset (BsBitBuffer *buffer, long startPosBit)
  531. {
  532.   int           bitsToCopy;
  533.   BsBitStream*  offset_stream;
  534.   BsBitBuffer*  helpBuffer;
  535.   /* open bit stream buffer for reading */
  536.   offset_stream = BsOpenBufferRead(buffer);
  537.   /* create help buffer */
  538.   helpBuffer = BsAllocBuffer(buffer->size);
  539.   
  540.   /* read bits from bit stream to help buffer */
  541.   offset_stream->currentBit =  startPosBit;
  542.   bitsToCopy = buffer->numBit - startPosBit;
  543.   if (BsGetBuffer(offset_stream, helpBuffer, bitsToCopy))
  544.     CommonExit(1, "BsRemoveBufferOffset: error reading bit stream");
  545.   /* close bit stream (no remove) */
  546.   BsCloseRemove(offset_stream, 0);
  547.   /* memcpy the offset free data from help buffer to buffer */
  548.   memcpy(buffer->data, helpBuffer->data, bit2byte(buffer->size));
  549.   /*FREE help buffer */
  550.   BsFreeBuffer(helpBuffer);
  551.   buffer->numBit = bitsToCopy;
  552. }
  553. /* BsCloseRemove() */
  554. /* Close bit stream. */
  555. int BsCloseRemove (
  556.   BsBitStream *stream, /* in: bit stream */
  557.   int remove) /* in: if opened with BsOpenBufferRead(): */
  558. /*       0 = keep buffer unchanged */
  559. /*       1 = remove bits read from buffer */
  560. /* returns: */
  561. /*  0=OK  1=error */
  562. {
  563.   int returnFlag = 0;
  564.   int tmp,i;
  565.   long startPosBit;
  566.   if ((stream->file != NULL) && (BSdebugLevel >= 1) )
  567.     printf("BsClose: %s  %s  id=%ld  curBit=%ldn",
  568.    (stream->write)?"write":"read",
  569.    (stream->file!=NULL)?"file":"buffer",
  570.    stream->streamId,stream->currentBit);
  571.   if (stream->file != NULL) {
  572.     if (stream->write == 1)
  573.       /* flush buffer to file */
  574.       if (BsWriteFile(stream)) {
  575. CommonWarning("BsClose: error writing bit stream");
  576. returnFlag = 1;
  577.       }
  578.     BsFreeBuffer(stream->buffer[0]);
  579.     if (stream->write == 0)
  580.       BsFreeBuffer(stream->buffer[1]);
  581.     
  582.     if (stream->file!=stdin && stream->file!=stdout)
  583.       if (fclose(stream->file)) {
  584. CommonWarning("BsClose: error closing bit stream file");
  585. returnFlag = 1;
  586.       }
  587.   }
  588.   else if (stream->write == 0 && remove){    
  589.     /* remove all completely read bytes from buffer */
  590.     tmp = stream->currentBit/8;
  591.     for (i=0; i<((stream->buffer[0]->size+7)>>3)-tmp; i++)
  592.       stream->buffer[0]->data[i] = stream->buffer[0]->data[i+tmp];
  593.     startPosBit = stream->currentBit - tmp*8;
  594.     if ((startPosBit>7) || (startPosBit<0)){
  595.       CommonExit(1,"BsClose: Error removing bit in buffer");        
  596.     }
  597.     stream->buffer[0]->numBit -= tmp*8;      
  598.     /* better located here ???   HP/BT 990520 */
  599.     if (stream->buffer[0]->numBit <= startPosBit) {
  600.       stream->buffer[0]->numBit=0;
  601.       startPosBit=0;
  602.     }
  603.     /* remove remaining read bits from buffer          */
  604.     /* usually we do not have remaining bits in buffer 
  605.      reply: that not really true, eg. HVXC frames are not byte aligned, thereofore you have remaining bits after every second frame, 
  606.     BT*/
  607.     if (startPosBit != 0)
  608.       {
  609.       /* printf("Remove buffer offset: %lin", startPosBit); */
  610.       BsRemoveBufferOffset(stream->buffer[0], startPosBit);
  611.       if ((stream->currentBit - startPosBit) < 0)
  612.         CommonExit(1,"BsClose: Error decreasing currentBit");
  613.       else
  614.         stream->currentBit -= startPosBit;
  615.       }
  616.   }
  617.   if (stream->info != NULL)
  618.    FREE(stream->info);
  619.  FREE(stream);
  620.   return returnFlag;
  621. }
  622. /* BsClose() */
  623. /* Close bit stream. */
  624. int BsClose (
  625.   BsBitStream *stream) /* in: bit stream */
  626. /* returns: */
  627. /*  0=OK  1=error */
  628. {
  629.  return BsCloseRemove(stream,0);
  630. }
  631. /* BsGetBit() */
  632. /* Read bits from bit stream. */
  633. /* (Current position in bit stream is advanced !!!) */
  634. int BsGetBit (
  635.   BsBitStream *stream, /* in: bit stream */
  636.   unsigned long *data, /* out: bits read */
  637. /*      (may be NULL if numBit==0) */
  638.   int numBit) /* in: num bits to read */
  639. /*     [0..32] */
  640. /* returns: */
  641. /*  0=OK  1=error */
  642. {
  643.   int num;
  644.   int maxNum;
  645.   int curNum;
  646.   unsigned long bits;
  647.   if (BSdebugLevel >= 3)
  648.     printf("BsGetBit: %s  id=%ld  numBit=%d  curBit=%ldn",
  649.    (stream->file!=NULL)?"file":"buffer",
  650.    stream->streamId,numBit,stream->currentBit);
  651.   if (stream->write != 0)
  652.     CommonExit(1,"BsGetBit: stream not in read mode");
  653.   if (numBit<0 || numBit>LONG_NUMBIT)
  654.     CommonExit(1,"BsGetBit: number of bits out of range (%d)",numBit);
  655.   if (data != NULL)
  656.     *data = 0;
  657.   if (numBit == 0)
  658.     return 0;
  659.   /* read bits in packets according to buffer byte boundaries */
  660.   num = 0;
  661.   maxNum = BYTE_NUMBIT - stream->currentBit % BYTE_NUMBIT;
  662.   while (num < numBit) {
  663.     curNum = min(numBit-num,maxNum);
  664.     if (BsReadByte(stream,&bits,curNum) != curNum) {
  665.       if ( ! BSaacEOF || BSdebugLevel > 0  ) 
  666.         CommonWarning("BsGetBit: error reading bit stream");
  667.       if ( BSaacEOF  ) {        
  668.         return -1;/* end of stream */
  669.       } else {
  670.         return 1; 
  671.       }
  672.     }
  673.     *data |= bits<<(numBit-num-curNum);
  674.     num += curNum;
  675.     maxNum = BYTE_NUMBIT;
  676.   }
  677.   if (BSdebugLevel >= 3)
  678.     printf("BsGetBit: data=0x%lxn",*data);
  679.   return 0;
  680. }
  681. /* this function is mainly for debugging purpose, */
  682. /* you can call it from the debugger */
  683. long int BsGetBitBack (
  684.   BsBitStream *stream, /* in: bit stream */
  685.   int numBit) /* in: num bits to read */
  686. /*     [0..32] */
  687. /* returns: */
  688. /*  if numBit is positive
  689.       return the last numBits bit from stream
  690.     else
  691.       return the next -numBits from stream 
  692.     stream->currentBit is always unchanged */
  693. {
  694.   int num;
  695.   int maxNum;
  696.   int curNum;
  697.   unsigned long bits;
  698.   long int data;
  699.   int rewind = 0;
  700.   if (BSdebugLevel >= 3)
  701.     printf("BsGetBitBack: %s  id=%ld  numBit=%d  curBit=%ldn",
  702.    (stream->file!=NULL)?"file":"buffer",
  703.    stream->streamId,numBit,stream->currentBit);
  704.   /*   if (stream->write != 0) */
  705.   /*  CommonWarning("BsGetBitBack: stream not in read mode"); */
  706.   if (numBit<-32 || numBit>LONG_NUMBIT)
  707.     CommonExit(1,"BsGetBitBack: number of bits out of range (%d)",numBit);
  708.   data = 0;
  709.   if (numBit == 0)
  710.     return 0;
  711.   if (numBit > 0)
  712.     stream->currentBit-=numBit;
  713.   else {
  714.     rewind = 1;
  715.     numBit = -numBit;
  716.   }
  717.     
  718.   if (stream->currentBit<0){
  719.     stream->currentBit+=numBit;
  720.     CommonWarning("BsGetBitBack: stream enough bits in stream ");
  721.     return 0;
  722.   }
  723.   /* read bits in packets according to buffer byte boundaries */
  724.   num = 0;
  725.   maxNum = BYTE_NUMBIT - stream->currentBit % BYTE_NUMBIT;
  726.   while (num < numBit) {
  727.     curNum = min(numBit-num,maxNum);
  728.     if (BsReadByte(stream,&bits,curNum) != curNum) {
  729.       CommonWarning("BsGetBitBack: error reading bit stream");
  730.       return 0;
  731.     }
  732.     data |= bits<<(numBit-num-curNum);
  733.     num += curNum;
  734.     maxNum = BYTE_NUMBIT;
  735.   }
  736.   if (rewind) /* rewind */
  737.     stream->currentBit-=numBit;
  738.   if (BSdebugLevel >= 3)
  739.     printf("BsGetBitBack: data=0x%lxn",data);
  740.   return data;
  741. }
  742. /* BsGetBitChar() */
  743. /* Read bits from bit stream (char). */
  744. /* (Current position in bit stream is advanced !!!) */
  745. int BsGetBitChar (
  746.   BsBitStream *stream, /* in: bit stream */
  747.   unsigned char *data, /* out: bits read */
  748. /*      (may be NULL if numBit==0) */
  749.   int numBit) /* in: num bits to read */
  750. /*     [0..8] */
  751. /* returns: */
  752. /*  0=OK  1=error */
  753. {
  754.   unsigned long ultmp;
  755.   int result;
  756.   if (numBit > 8)
  757.     CommonExit(1,"BsGetBitChar: number of bits out of range (%d)",numBit);
  758.   if (data != NULL)
  759.     *data = 0;
  760.   if (numBit == 0)
  761.     return 0;
  762.   result = BsGetBit(stream,&ultmp,numBit);
  763.   *data = ultmp;
  764.   return result;
  765. }
  766. /* BsGetBitShort() */
  767. /* Read bits from bit stream (short). */
  768. /* (Current position in bit stream is advanced !!!) */
  769. int BsGetBitShort (
  770.   BsBitStream *stream, /* in: bit stream */
  771.   unsigned short *data, /* out: bits read */
  772. /*      (may be NULL if numBit==0) */
  773.   int numBit) /* in: num bits to read */
  774. /*     [0..16] */
  775. /* returns: */
  776. /*  0=OK  1=error */
  777. {
  778.   unsigned long ultmp;
  779.   int result;
  780.   if (numBit > 16)
  781.     CommonExit(1,"BsGetBitShort: number of bits out of range (%d)",numBit);
  782.   if (data != NULL)
  783.     *data = 0;
  784.   if (numBit == 0)
  785.     return 0;
  786.   result = BsGetBit(stream,&ultmp,numBit);
  787.   *data = ultmp;
  788.   return result;
  789. }
  790. /* BsGetBitInt() */
  791. /* Read bits from bit stream (int). */
  792. /* (Current position in bit stream is advanced !!!) */
  793. int BsGetBitInt (
  794.   BsBitStream *stream, /* in: bit stream */
  795.   unsigned int *data, /* out: bits read */
  796. /*      (may be NULL if numBit==0) */
  797.   int numBit) /* in: num bits to read */
  798. /*     [0..16] */
  799. /* returns: */
  800. /*  0=OK  1=error */
  801. {
  802.   unsigned long ultmp;
  803.   int result;
  804.   if (numBit > 16)
  805.     CommonExit(1,"BsGetBitInt: number of bits out of range (%d)",numBit);
  806.   if (data != NULL)
  807.     *data = 0;
  808.   if (numBit == 0)
  809.     return 0;
  810.   result = BsGetBit(stream,&ultmp,numBit);
  811.   *data = ultmp;
  812.   return result;
  813. }
  814. /* BsGetBitAhead() */
  815. /* Read bits from bit stream. */
  816. /* (Current position in bit stream is NOT advanced !!!) */
  817. int BsGetBitAhead (
  818.   BsBitStream *stream, /* in: bit stream */
  819.   unsigned long *data, /* out: bits read */
  820. /*      (may be NULL if numBit==0) */
  821.   int numBit) /* in: num bits to read */
  822. /*     [0..32] */
  823. /* returns: */
  824. /*  0=OK  1=error */
  825. {
  826.   long oldCurrentBit;
  827.   int  result;
  828.   if (BSdebugLevel >= 3)
  829.     printf("BsGetBitAhead: %s  id=%ld  numBit=%dn",
  830.    (stream->file!=NULL)?"file":"buffer",stream->streamId,numBit);
  831.   oldCurrentBit = stream->currentBit;
  832.   result = BsGetBit(stream,data,numBit);
  833.   stream->currentBit = oldCurrentBit;
  834.   if (result)
  835.     CommonWarning("BsGetBitAhead: error reading bit stream");
  836.   return result;
  837. }
  838. /* BsGetBitAheadChar() */
  839. /* Read bits from bit stream (char). */
  840. /* (Current position in bit stream is NOT advanced !!!) */
  841. int BsGetBitAheadChar (
  842.   BsBitStream *stream, /* in: bit stream */
  843.   unsigned char *data, /* out: bits read */
  844. /*      (may be NULL if numBit==0) */
  845.   int numBit) /* in: num bits to read */
  846. /*     [0..8] */
  847. /* returns: */
  848. /*  0=OK  1=error */
  849. {
  850.   long oldCurrentBit;
  851.   int result;
  852.   if (BSdebugLevel >= 3)
  853.     printf("BsGetBitAheadChar: %s  id=%ld  numBit=%dn",
  854.    (stream->file!=NULL)?"file":"buffer",stream->streamId,numBit);
  855.   oldCurrentBit = stream->currentBit;
  856.   result = BsGetBitChar(stream,data,numBit);
  857.   stream->currentBit = oldCurrentBit;
  858.   if (result)
  859.     CommonWarning("BsGetBitAheadChar: error reading bit stream");
  860.   return result;
  861. }
  862. /* BsGetBitAheadShort() */
  863. /* Read bits from bit stream (short). */
  864. /* (Current position in bit stream is NOT advanced !!!) */
  865. int BsGetBitAheadShort (
  866.   BsBitStream *stream, /* in: bit stream */
  867.   unsigned short *data, /* out: bits read */
  868. /*      (may be NULL if numBit==0) */
  869.   int numBit) /* in: num bits to read */
  870. /*     [0..16] */
  871. /* returns: */
  872. /*  0=OK  1=error */
  873. {
  874.   long oldCurrentBit;
  875.   int result;
  876.   if (BSdebugLevel >= 3)
  877.     printf("BsGetBitAheadShort: %s  id=%ld  numBit=%dn",
  878.    (stream->file!=NULL)?"file":"buffer",stream->streamId,numBit);
  879.   oldCurrentBit = stream->currentBit;
  880.   result = BsGetBitShort(stream,data,numBit);
  881.   stream->currentBit = oldCurrentBit;
  882.   if (result)
  883.     CommonWarning("BsGetBitAheadShort: error reading bit stream");
  884.   return result;
  885. }
  886. /* BsGetBitAheadInt() */
  887. /* Read bits from bit stream (int). */
  888. /* (Current position in bit stream is NOT advanced !!!) */
  889. int BsGetBitAheadInt (
  890.   BsBitStream *stream, /* in: bit stream */
  891.   unsigned int *data, /* out: bits read */
  892. /*      (may be NULL if numBit==0) */
  893.   int numBit) /* in: num bits to read */
  894. /*     [0..16] */
  895. /* returns: */
  896. /*  0=OK  1=error */
  897. {
  898.   long oldCurrentBit;
  899.   int result;
  900.   if (BSdebugLevel >= 3)
  901.     printf("BsGetBitAheadInt: %s  id=%ld  numBit=%dn",
  902.    (stream->file!=NULL)?"file":"buffer",stream->streamId,numBit);
  903.   oldCurrentBit = stream->currentBit;
  904.   result = BsGetBitInt(stream,data,numBit);
  905.   stream->currentBit = oldCurrentBit;
  906.   if (result)
  907.     CommonWarning("BsGetBitAheadInt: error reading bit stream");
  908.   return result;
  909. }
  910. long BsGetBufferFullness (BsBitBuffer *buffer)
  911. {
  912.   return (buffer->numBit);
  913. }
  914. /* BsGetBuffer() */
  915. /* Read bits from bit stream to buffer. */
  916. /* (Current position in bit stream is advanced !!!) */
  917. /* (Buffer is cleared first - previous data in buffer is lost !!!) */
  918. int BsGetBuffer (
  919.   BsBitStream *stream, /* in: bit stream */
  920.   BsBitBuffer *buffer, /* out: buffer read */
  921. /*      (may be NULL if numBit==0) */
  922.   long numBit) /* in: num bits to read */
  923. /* returns: */
  924. /*  0=OK  1=error */
  925. {
  926.   long i,numByte,numRemain;
  927.   unsigned long data;
  928.   if (BSdebugLevel >= 2) {
  929.     printf("BsGetBuffer: %s  id=%ld  numBit=%ld  ",
  930.    (stream->file!=NULL)?"file":"buffer",
  931.    stream->streamId,numBit);
  932.       if (buffer != NULL)
  933. printf("bufSize=%ld  bufAddr=0x%lx  ",
  934.        buffer->size,(unsigned long)buffer);
  935.       else
  936. printf("(bufAddr=(NULL)  ");
  937.     printf("curBit=%ldn",stream->currentBit);
  938.   }
  939.   if (stream->write != 0)
  940.     CommonExit(1,"BsGetBuffer: stream not in read mode");
  941.   if (numBit == 0)
  942.     return 0;
  943.   if (stream->buffer[0] == buffer)
  944.     CommonExit(1,"BsGetBuffer: can not get buffer from itself");
  945.   if (numBit < 0 || numBit > buffer->size)
  946.     CommonExit(1,"BsGetBuffer: number of bits out of range (%ld)",numBit);
  947.   BsClearBuffer(buffer);
  948.   numByte = bit2byte(numBit)-1;
  949.   for (i=0; i<numByte; i++) {
  950.     if (BsGetBit(stream,&data,BYTE_NUMBIT)) {
  951.       if ( ! BSaacEOF || BSdebugLevel > 0  )
  952.         CommonWarning("BsGetBuffer: error reading bit stream");
  953.       buffer->numBit = i*BYTE_NUMBIT;
  954.       return 1;
  955.     }
  956.     buffer->data[i] = data;
  957.   }
  958.   numRemain = numBit-numByte*BYTE_NUMBIT;
  959.   if (BsGetBit(stream,&data,numRemain)) {
  960.     if ( ! BSaacEOF || BSdebugLevel > 0  )
  961.       CommonWarning("BsGetBuffer: error reading bit stream");
  962.     buffer->numBit = numByte*BYTE_NUMBIT;
  963.     return 1;
  964.   }
  965.   buffer->data[i] = data<<(BYTE_NUMBIT-numRemain);
  966.   buffer->numBit = numBit;
  967.   return 0;
  968. }
  969. /* BsGetBufferAppend() */
  970. /* Append bits from bit stream to buffer. */
  971. /* (Current position in bit stream is advanced !!!) */
  972. int BsGetBufferAppend (
  973.   BsBitStream *stream, /* in: bit stream */
  974.   BsBitBuffer *buffer, /* out: buffer read */
  975. /*      (may be NULL if numBit==0) */
  976.   int append, /* in: if != 0: append bits to buffer */
  977. /*              (don't clear buffer) */
  978.   long numBit) /* in: num bits to read */
  979. /* returns: */
  980. /*  0=OK  1=error */
  981. {
  982.   long i,numByte,last_byte,numRemain;
  983.   unsigned long data;
  984.   int tmp,shift_cnt,eof;
  985.   if (BSdebugLevel >= 2) {
  986.     printf("BsGetBufferAppend: %s  id=%ld  numBit=%ld  ",
  987.    (stream->file!=NULL)?"file":"buffer",
  988.    stream->streamId,numBit);
  989.     if (buffer != NULL)
  990.       printf("bufSize=%ld  bufAddr=0x%lx  ",
  991.      buffer->size,(unsigned long)buffer);
  992.     else
  993.       printf("(bufAddr=(NULL)  ");
  994.     printf("curBit=%ldn",stream->currentBit);
  995.   }
  996.   if (stream->write != 0)
  997.     CommonExit(1,"BsGetBufferAppend: stream not in read mode");
  998.   if (stream->buffer[0] == buffer)
  999.     CommonExit(1,"BsGetBufferAppend: cannot get buffer from itself");
  1000.   if (numBit < 0)
  1001.     CommonExit(1,"BsGetBufferAppend: number of bits out of range (%ld)",
  1002.        numBit);
  1003. #if 1  /* AI 990528 */    
  1004.   /* check whether number of bits to be read exceeds the end of bitstream */
  1005.   eof = BsEof(stream, numBit);
  1006. /*  if (BsEof(stream, numBit-1)) { */
  1007.   if (eof) {
  1008.     numBit = BYTE_NUMBIT*stream->numByte - stream->currentBit;
  1009.     if (BSdebugLevel >= 2) {
  1010.       printf("*** numBits(modified)=%ldn", numBit);
  1011.     }
  1012.   }
  1013. #endif
  1014.   if (append) {
  1015.     /* append to buffer (don't clear buffer) */
  1016.     if ((numBit+buffer->numBit) > buffer->size)
  1017.       CommonExit(1,"BsGetBufferAppend: number of bits out of range (%ld)",
  1018.  numBit);
  1019.     /* fill up the last possible incomplete byte */
  1020.     tmp = 8 - buffer->numBit%8;
  1021.     if (tmp == 8)
  1022.       tmp = 0;
  1023.     if (tmp <= numBit) {
  1024.       shift_cnt = 0;
  1025.     }
  1026.     else {
  1027.       shift_cnt = tmp - numBit;
  1028.       tmp = numBit;
  1029.     }
  1030.     if (tmp) {
  1031.       if (BsGetBit(stream,&data,tmp)) {
  1032. CommonWarning("BsGetBufferAppend: error reading bit stream");
  1033. return 1;
  1034.       }
  1035.       data <<= shift_cnt;
  1036.       numBit -= tmp;
  1037.       last_byte = buffer->numBit/8;
  1038.       data |= buffer->data[last_byte];
  1039.       buffer->numBit += tmp;
  1040.       buffer->data[last_byte] = data;
  1041.       last_byte++;
  1042.     }
  1043.     else
  1044.       last_byte = buffer->numBit/8;
  1045.   }
  1046.   else { /* if (append) */
  1047.     /* clear buffer */
  1048.     if (numBit > buffer->size)
  1049.       CommonExit(1,"BsGetBufferAppend: number of bits out of range (%ld)",
  1050.                  numBit);
  1051.     BsClearBuffer(buffer);
  1052.     last_byte = 0;
  1053.   }
  1054.   if (numBit > 0) {
  1055.     numByte = bit2byte(numBit)-1;
  1056.     for (i=last_byte; i<last_byte+numByte; i++) {
  1057.       if ((tmp = BsGetBit(stream,&data,BYTE_NUMBIT))) {
  1058. buffer->numBit += (i-last_byte)*BYTE_NUMBIT;
  1059.         if (tmp==-1)
  1060.           return -1; /* end of file */
  1061. CommonWarning("BsGetBufferAppend: error reading bit stream");
  1062. return 1;
  1063.       }
  1064.       buffer->data[i] = data;
  1065.     }
  1066.     numRemain = numBit-numByte*BYTE_NUMBIT;
  1067.     if (BsGetBit(stream,&data,numRemain)) {
  1068.       CommonWarning("BsGetBufferAppend: error reading bit stream");
  1069.       buffer->numBit += numByte*BYTE_NUMBIT;
  1070.       return 1;
  1071.     }
  1072.     buffer->data[i] = data<<(BYTE_NUMBIT-numRemain);
  1073.     buffer->numBit += numBit;
  1074.   }
  1075. #if 1 /* AI 990528 */
  1076.   if ( eof ) {
  1077.     /* just reached to the end of bitstream */
  1078.     if (stream->currentBit == BYTE_NUMBIT*stream->numByte) {
  1079.       if (BSdebugLevel >= 2) {
  1080. printf("*** just reached the end of bitstreamn");
  1081.       }
  1082.       return -1; /* end of file */
  1083.     }
  1084.   }
  1085. #endif
  1086. /*  } */
  1087.   return 0;
  1088. }
  1089. /* BsGetBufferAhead() */
  1090. /* Read bits ahead of current position from bit stream to buffer. */
  1091. /* (Current position in bit stream is NOT advanced !!!) */
  1092. /* (Buffer is cleared first - previous data in buffer is lost !!!) */
  1093. int BsGetBufferAhead (
  1094.   BsBitStream *stream, /* in: bit stream */
  1095.   BsBitBuffer *buffer, /* out: buffer read */
  1096. /*      (may be NULL if numBit==0) */
  1097.   long numBit) /* in: num bits to read */
  1098. /* returns: */
  1099. /*  0=OK  1=error */
  1100. {
  1101.   long oldCurrentBit;
  1102.   int result;
  1103.   if (BSdebugLevel >= 2)
  1104.     printf("BsGetBufferAhead: %s  id=%ld  numBit=%ldn",
  1105.    (stream->file!=NULL)?"file":"buffer",stream->streamId,numBit);
  1106.   if (numBit > stream->buffer[0]->size)
  1107.     CommonExit(1,"BsGetBufferAhead: "
  1108.        "number of bits to look ahead too high (%ld)",numBit);
  1109.   oldCurrentBit = stream->currentBit;
  1110.   result = BsGetBuffer(stream,buffer,numBit);
  1111.   stream->currentBit = oldCurrentBit;
  1112.   if (result)
  1113.     if ( ! BSaacEOF || BSdebugLevel > 0  )
  1114.       CommonWarning("BsGetBufferAhead: error reading bit stream");
  1115.   return result;
  1116. }
  1117. /* BsGetSkip() */
  1118. /* Skip bits in bit stream (read). */
  1119. /* (Current position in bit stream is advanced !!!) */
  1120. int BsGetSkip (
  1121.   BsBitStream *stream, /* in: bit stream */
  1122.   long numBit) /* in: num bits to skip */
  1123. /* returns: */
  1124. /*  0=OK  1=error */
  1125. {
  1126.   if (BSdebugLevel >= 2) {
  1127.     printf("BsGetSkip: %s  id=%ld  numBit=%ld  ",
  1128.    (stream->file!=NULL)?"file":"buffer",
  1129.    stream->streamId,numBit);
  1130.     printf("curBit=%ldn",stream->currentBit);
  1131.   }
  1132.   if (stream->write != 0)
  1133.     CommonExit(1,"BsGetSkip: stream not in read mode");
  1134.   if (numBit < 0)
  1135.     CommonExit(1,"BsGetSkip: number of bits out of range (%ld)",numBit);
  1136.   if (numBit == 0)
  1137.     return 0;
  1138.   if (BsReadAhead(stream,numBit) || BsCheckRead(stream,numBit)) {
  1139.     CommonWarning("BsGetSkip: error reading bit stream");
  1140.     return 1;
  1141.   }
  1142.   stream->currentBit += numBit;
  1143.   return 0;
  1144. }
  1145. /* BsPutBit() */
  1146. /* Write bits to bit stream. */
  1147. int BsPutBit (
  1148.   BsBitStream *stream, /* in: bit stream */
  1149.   unsigned long data, /* in: bits to write */
  1150.   int numBit) /* in: num bits to write */
  1151. /*     [0..32] */
  1152. /* returns: */
  1153. /*  0=OK  1=error */
  1154. {
  1155.   int num,maxNum,curNum;
  1156.   unsigned long bits;
  1157.   if (BSdebugLevel > 3)
  1158.     printf("BsPutBit: %s  id=%ld  numBit=%d  data=0x%lx,%ld  curBit=%ldn",
  1159.    (stream->file!=NULL)?"file":"buffer",
  1160.    stream->streamId,numBit,data,data,stream->currentBit);
  1161.   if (stream->write != 1)
  1162.     CommonExit(1,"BsPutBit: stream not in write mode");
  1163.   if (numBit<0 || numBit>LONG_NUMBIT)
  1164.     CommonExit(1,"BsPutBit: number of bits out of range (%d)",numBit);
  1165.   if (numBit < 32 && data > ((unsigned long)1<<numBit)-1)
  1166.     CommonExit(1,"BsPutBit: data requires more than %d bits (0x%lx)",
  1167.        numBit,data);
  1168.   if (numBit == 0)
  1169.     return 0;
  1170.   /* write bits in packets according to buffer byte boundaries */
  1171.   num = 0;
  1172.   maxNum = BYTE_NUMBIT - stream->currentBit % BYTE_NUMBIT;
  1173.   while (num < numBit) {
  1174.     curNum = min(numBit-num,maxNum);
  1175.     bits = data>>(numBit-num-curNum);
  1176.     if (BsWriteByte(stream,bits,curNum)) {
  1177.       CommonWarning("BsPutBit: error writing bit stream");
  1178.       return 1;
  1179.     }
  1180.     num += curNum;
  1181.     maxNum = BYTE_NUMBIT;
  1182.   }
  1183.   return 0;
  1184. }
  1185. /* BsPutBuffer() */
  1186. /* Write bits from buffer to bit stream. */
  1187. int BsPutBuffer (
  1188.   BsBitStream *stream, /* in: bit stream */
  1189.   BsBitBuffer *buffer) /* in: buffer to write */
  1190. /* returns: */
  1191. /*  0=OK  1=error */
  1192. {
  1193.   long i,numByte,numRemain;
  1194.   if (buffer->numBit == 0)
  1195.     return 0;
  1196.   if (BSdebugLevel >= 2)
  1197.     printf("BsPutBuffer: %s  id=%ld  numBit=%ld  bufAddr=0x%lx  curBit=%ldn",
  1198.    (stream->file!=NULL)?"file":"buffer",
  1199.    stream->streamId,buffer->numBit,(unsigned long)buffer,
  1200.    stream->currentBit);
  1201.   if (stream->write != 1)
  1202.     CommonExit(1,"BsPutBuffer: stream not in write mode");
  1203.   if (stream->buffer[0] == buffer)
  1204.     CommonExit(1,"BsPutBuffer: can not put buffer into itself");
  1205.   numByte = bit2byte(buffer->numBit)-1;
  1206.   for (i=0; i<numByte; i++)
  1207.     if (BsPutBit(stream,buffer->data[i],BYTE_NUMBIT)) {
  1208.       CommonWarning("BsPutBuffer: error writing bit stream");
  1209.       return 1;
  1210.     }
  1211.   numRemain = buffer->numBit-numByte*BYTE_NUMBIT;
  1212.   if (BsPutBit(stream,buffer->data[i]>>(BYTE_NUMBIT-numRemain),numRemain)) {
  1213.     CommonWarning("BsPutBuffer: error reading bit stream");
  1214.     return 1;
  1215.   }
  1216.   return 0;
  1217. }
  1218. /* BsAllocBuffer() */
  1219. /* Allocate bit buffer. */
  1220. BsBitBuffer *BsAllocBuffer (
  1221.   long numBit) /* in: buffer size in bits */
  1222. /* returns: */
  1223. /*  bit buffer (handle) */
  1224. {
  1225.   BsBitBuffer *buffer;
  1226.   if (BSdebugLevel >= 2)
  1227.     printf("BsAllocBuffer: size=%ldn",numBit);
  1228.   if ((buffer=(BsBitBuffer*)malloc(sizeof(BsBitBuffer))) == NULL)
  1229.     CommonExit(1,"BsAllocBuffer: memory allocation error (buffer)");
  1230.   if ((buffer->data=(unsigned char*)malloc(bit2byte(numBit)*sizeof(char)))
  1231.       == NULL)
  1232.     CommonExit(1,"BsAllocBuffer: memory allocation error (data)");
  1233.   buffer->numBit = 0;
  1234.   buffer->size = numBit;
  1235.   if (BSdebugLevel >= 2)
  1236.     printf("BsAllocBuffer: bufAddr=0x%lxn",(unsigned long)buffer);
  1237.   return buffer;
  1238. }
  1239. /* BsFreeBuffer() */
  1240. /*FREE bit buffer. */
  1241. void BsFreeBuffer (
  1242.   BsBitBuffer *buffer) /* in: bit buffer */
  1243. {
  1244.   if (BSdebugLevel >= 2)
  1245.     printf("BsFreeBuffer: size=%ld  bufAddr=0x%lxn",
  1246.    buffer->size,(unsigned long)buffer);
  1247.  FREE(buffer->data);
  1248.  FREE(buffer);
  1249. }
  1250. /* BsBufferNumBit() */
  1251. /* Get number of bits in buffer. */
  1252. long BsBufferNumBit (
  1253.   BsBitBuffer *buffer) /* in: bit buffer */
  1254. /* returns: */
  1255. /*  number of bits in buffer */
  1256. {
  1257.   if (BSdebugLevel >= 2)
  1258.     printf("BsBufferNumBit: numBit=%ld  size=%ld  bufAddr=0x%lxn",
  1259.    buffer->numBit,buffer->size,(unsigned long)buffer);
  1260.   return buffer->numBit ;
  1261. }
  1262. /* BsClearBuffer() */
  1263. /* Clear bit buffer (set numBit to 0). */
  1264. void BsClearBuffer (
  1265.   BsBitBuffer *buffer) /* in: bit buffer */
  1266. {
  1267.   if (BSdebugLevel >= 2)
  1268.     printf("BsClearBuffer: size=%ld  bufAddr=0x%lxn",
  1269.    buffer->size,(unsigned long)buffer);
  1270.   if (buffer->numBit != 0 ) {    
  1271. #if 0 /* removed due to BUG! in mp4dec.c */
  1272.     CommonWarning("BsClearBuffer: Buffer not empty!");    
  1273. #endif /* removed due to BUG! in mp4dec.c */
  1274.   }
  1275.   buffer->numBit = 0;
  1276. }
  1277. /* end of bitstream.c */