stream.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:4k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.  * libmad - MPEG audio decoder library
  3.  */
  4. # ifdef HAVE_CONFIG_H
  5. #  include "config.h"
  6. # endif
  7. # include "global.h"
  8. # include <stdlib.h>
  9. # include "bit.h"
  10. # include "stream.h"
  11. /*
  12.  * NAME: stream->init()
  13.  * DESCRIPTION: initialize stream struct
  14.  */
  15. void mad_stream_init(struct mad_stream *stream)
  16. {
  17.   stream->buffer     = 0;
  18.   stream->bufend     = 0;
  19.   stream->skiplen    = 0;
  20.   stream->sync       = 0;
  21.   stream->freerate   = 0;
  22.   stream->this_frame = 0;
  23.   stream->next_frame = 0;
  24.   mad_bit_init(&stream->ptr, 0);
  25.   mad_bit_init(&stream->anc_ptr, 0);
  26.   stream->anc_bitlen = 0;
  27.   stream->main_data  = 0;
  28.   stream->md_len     = 0;
  29.   stream->options    = 0;
  30.   stream->error      = MAD_ERROR_NONE;
  31. }
  32. /*
  33.  * NAME: stream->finish()
  34.  * DESCRIPTION: deallocate any dynamic memory associated with stream
  35.  */
  36. void mad_stream_finish(struct mad_stream *stream)
  37. {
  38.   if (stream->main_data) {
  39.     free(stream->main_data);
  40.     stream->main_data = 0;
  41.   }
  42.   mad_bit_finish(&stream->anc_ptr);
  43.   mad_bit_finish(&stream->ptr);
  44. }
  45. /*
  46.  * NAME: stream->buffer()
  47.  * DESCRIPTION: set stream buffer pointers
  48.  */
  49. void mad_stream_buffer(struct mad_stream *stream,
  50.        unsigned char const *buffer, unsigned long length)
  51. {
  52.   stream->buffer = buffer;
  53.   stream->bufend = buffer + length;
  54.   stream->this_frame = buffer;
  55.   stream->next_frame = buffer;
  56.   stream->sync = 1;
  57.   mad_bit_init(&stream->ptr, buffer);
  58. }
  59. /*
  60.  * NAME: stream->skip()
  61.  * DESCRIPTION: arrange to skip bytes before the next frame
  62.  */
  63. void mad_stream_skip(struct mad_stream *stream, unsigned long length)
  64. {
  65.   stream->skiplen += length;
  66. }
  67. /*
  68.  * NAME: stream->sync()
  69.  * DESCRIPTION: locate the next stream sync word
  70.  */
  71. int mad_stream_sync(struct mad_stream *stream)
  72. {
  73.   register unsigned char const *ptr, *end;
  74.   ptr = mad_bit_nextbyte(&stream->ptr);
  75.   end = stream->bufend;
  76.   while (ptr < end - 1 &&
  77.  !(ptr[0] == 0xff && (ptr[1] & 0xe0) == 0xe0))
  78.     ++ptr;
  79.   if (end - ptr < MAD_BUFFER_GUARD)
  80.     return -1;
  81.   mad_bit_init(&stream->ptr, ptr);
  82.   return 0;
  83. }
  84. /*
  85.  * NAME: stream->errorstr()
  86.  * DESCRIPTION: return a string description of the current error condition
  87.  */
  88. char const *mad_stream_errorstr(struct mad_stream const *stream)
  89. {
  90.   switch (stream->error) {
  91.   case MAD_ERROR_NONE:  return "no error";
  92.   case MAD_ERROR_BUFLEN:  return "input buffer too small (or EOF)";
  93.   case MAD_ERROR_BUFPTR:  return "invalid (null) buffer pointer";
  94.   case MAD_ERROR_NOMEM:  return "not enough memory";
  95.   case MAD_ERROR_LOSTSYNC:  return "lost synchronization";
  96.   case MAD_ERROR_BADLAYER:  return "reserved header layer value";
  97.   case MAD_ERROR_BADBITRATE:  return "forbidden bitrate value";
  98.   case MAD_ERROR_BADSAMPLERATE:  return "reserved sample frequency value";
  99.   case MAD_ERROR_BADEMPHASIS:  return "reserved emphasis value";
  100.   case MAD_ERROR_BADCRC:  return "CRC check failed";
  101.   case MAD_ERROR_BADBITALLOC:  return "forbidden bit allocation value";
  102.   case MAD_ERROR_BADSCALEFACTOR: return "bad scalefactor index";
  103.   case MAD_ERROR_BADFRAMELEN:  return "bad frame length";
  104.   case MAD_ERROR_BADBIGVALUES:  return "bad big_values count";
  105.   case MAD_ERROR_BADBLOCKTYPE:  return "reserved block_type";
  106.   case MAD_ERROR_BADSCFSI:  return "bad scalefactor selection info";
  107.   case MAD_ERROR_BADDATAPTR:  return "bad main_data_begin pointer";
  108.   case MAD_ERROR_BADPART3LEN:  return "bad audio data length";
  109.   case MAD_ERROR_BADHUFFTABLE:  return "bad Huffman table select";
  110.   case MAD_ERROR_BADHUFFDATA:  return "Huffman data overrun";
  111.   case MAD_ERROR_BADSTEREO:  return "incompatible block_type for JS";
  112.   }
  113.   return 0;
  114. }