bit.c

00001 /*
00002  * libmad - MPEG audio decoder library
00003  * Copyright (C) 2000-2003 Underbit Technologies, Inc.
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License as published by
00007  * the Free Software Foundation; either version 2 of the License, or
00008  * (at your option) any later version.
00009  *
00010  * This program is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013  * GNU General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU General Public License
00016  * along with this program; if not, write to the Free Software
00017  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00018  *
00019  * $Id: bit.c,v 1.1 2003/08/31 18:59:46 gabest Exp $
00020  */
00021 
00022 # ifdef HAVE_CONFIG_H
00023 #  include "config.h"
00024 # endif
00025 
00026 # include "global.h"
00027 
00028 # ifdef HAVE_LIMITS_H
00029 #  include <limits.h>
00030 # else
00031 #  define CHAR_BIT  8
00032 # endif
00033 
00034 # include "bit.h"
00035 
00036 /*
00037  * This is the lookup table for computing the CRC-check word.
00038  * As described in section 2.4.3.1 and depicted in Figure A.9
00039  * of ISO/IEC 11172-3, the generator polynomial is:
00040  *
00041  * G(X) = X^16 + X^15 + X^2 + 1
00042  */
00043 static
00044 unsigned short const crc_table[256] = {
00045   0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
00046   0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
00047   0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
00048   0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
00049   0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
00050   0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
00051   0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
00052   0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
00053 
00054   0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
00055   0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
00056   0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
00057   0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
00058   0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
00059   0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
00060   0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
00061   0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
00062 
00063   0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
00064   0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
00065   0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
00066   0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
00067   0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
00068   0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
00069   0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
00070   0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
00071 
00072   0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
00073   0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
00074   0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
00075   0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
00076   0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
00077   0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
00078   0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
00079   0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
00080 };
00081 
00082 # define CRC_POLY  0x8005
00083 
00084 /*
00085  * NAME:        bit->init()
00086  * DESCRIPTION: initialize bit pointer struct
00087  */
00088 void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte)
00089 {
00090   bitptr->byte  = byte;
00091   bitptr->cache = 0;
00092   bitptr->left  = CHAR_BIT;
00093 }
00094 
00095 /*
00096  * NAME:        bit->length()
00097  * DESCRIPTION: return number of bits between start and end points
00098  */
00099 unsigned int mad_bit_length(struct mad_bitptr const *begin,
00100                             struct mad_bitptr const *end)
00101 {
00102   return begin->left +
00103     CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left);
00104 }
00105 
00106 /*
00107  * NAME:        bit->nextbyte()
00108  * DESCRIPTION: return pointer to next unprocessed byte
00109  */
00110 unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr)
00111 {
00112   return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1;
00113 }
00114 
00115 /*
00116  * NAME:        bit->skip()
00117  * DESCRIPTION: advance bit pointer
00118  */
00119 void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len)
00120 {
00121   bitptr->byte += len / CHAR_BIT;
00122   bitptr->left -= len % CHAR_BIT;
00123 
00124   if (bitptr->left > CHAR_BIT) {
00125     bitptr->byte++;
00126     bitptr->left += CHAR_BIT;
00127   }
00128 
00129   if (bitptr->left < CHAR_BIT)
00130     bitptr->cache = *bitptr->byte;
00131 }
00132 
00133 /*
00134  * NAME:        bit->read()
00135  * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value
00136  */
00137 unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len)
00138 {
00139   register unsigned long value;
00140 
00141   if (bitptr->left == CHAR_BIT)
00142     bitptr->cache = *bitptr->byte;
00143 
00144   if (len < bitptr->left) {
00145     value = (bitptr->cache & ((1 << bitptr->left) - 1)) >>
00146       (bitptr->left - len);
00147     bitptr->left -= len;
00148 
00149     return value;
00150   }
00151 
00152   /* remaining bits in current byte */
00153 
00154   value = bitptr->cache & ((1 << bitptr->left) - 1);
00155   len  -= bitptr->left;
00156 
00157   bitptr->byte++;
00158   bitptr->left = CHAR_BIT;
00159 
00160   /* more bytes */
00161 
00162   while (len >= CHAR_BIT) {
00163     value = (value << CHAR_BIT) | *bitptr->byte++;
00164     len  -= CHAR_BIT;
00165   }
00166 
00167   if (len > 0) {
00168     bitptr->cache = *bitptr->byte;
00169 
00170     value = (value << len) | (bitptr->cache >> (CHAR_BIT - len));
00171     bitptr->left -= len;
00172   }
00173 
00174   return value;
00175 }
00176 
00177 # if 0
00178 /*
00179  * NAME:        bit->write()
00180  * DESCRIPTION: write an arbitrary number of bits
00181  */
00182 void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len,
00183                    unsigned long value)
00184 {
00185   unsigned char *ptr;
00186 
00187   ptr = (unsigned char *) bitptr->byte;
00188 
00189   /* ... */
00190 }
00191 # endif
00192 
00193 /*
00194  * NAME:        bit->crc()
00195  * DESCRIPTION: compute CRC-check word
00196  */
00197 unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len,
00198                            unsigned short init)
00199 {
00200   register unsigned int crc;
00201 
00202   for (crc = init; len >= 32; len -= 32) {
00203     register unsigned long data;
00204 
00205     data = mad_bit_read(&bitptr, 32);
00206 
00207     crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff];
00208     crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff];
00209     crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >>  8)) & 0xff];
00210     crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >>  0)) & 0xff];
00211   }
00212 
00213   switch (len / 8) {
00214   case 3: crc = (crc << 8) ^
00215             crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
00216   case 2: crc = (crc << 8) ^
00217             crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
00218   case 1: crc = (crc << 8) ^
00219             crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
00220 
00221   len %= 8;
00222 
00223   case 0: break;
00224   }
00225 
00226   while (len--) {
00227     register unsigned int msb;
00228 
00229     msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15);
00230 
00231     crc <<= 1;
00232     if (msb & 1)
00233       crc ^= CRC_POLY;
00234   }
00235 
00236   return crc & 0xffff;
00237 }

Generated on Tue Dec 13 14:47:48 2005 for guliverkli by  doxygen 1.4.5