summaryrefslogtreecommitdiff
path: root/src/libmad/bit.c
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-04-30 18:46:58 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-04-30 18:46:58 +0000
commit2031afda7670cbca8ef59221dc95696382e73aa4 (patch)
tree9cc702a0cdf3c7616d460591e359acdace76dae7 /src/libmad/bit.c
parent7cb6e3194a3dfa77ab0f96ce9c3f160204b72d4f (diff)
downloadxine-lib-2031afda7670cbca8ef59221dc95696382e73aa4.tar.gz
xine-lib-2031afda7670cbca8ef59221dc95696382e73aa4.tar.bz2
libmad updated
CVS patchset: 1817 CVS date: 2002/04/30 18:46:58
Diffstat (limited to 'src/libmad/bit.c')
-rwxr-xr-xsrc/libmad/bit.c41
1 files changed, 29 insertions, 12 deletions
diff --git a/src/libmad/bit.c b/src/libmad/bit.c
index e7004ef2f..200e3ab77 100755
--- a/src/libmad/bit.c
+++ b/src/libmad/bit.c
@@ -1,5 +1,5 @@
/*
- * mad - MPEG audio decoder
+ * libmad - MPEG audio decoder library
* Copyright (C) 2000-2001 Robert Leslie
*
* This program is free software; you can redistribute it and/or modify
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * $Id: bit.c,v 1.1 2001/08/12 02:57:55 guenter Exp $
+ * $Id: bit.c,v 1.2 2002/04/30 18:46:58 miguelfreitas Exp $
*/
# ifdef HAVE_CONFIG_H
@@ -197,22 +197,39 @@ void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len,
unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len,
unsigned short init)
{
- register unsigned int crc, data;
+ register unsigned int crc;
-# if CHAR_BIT == 8
- for (crc = init; len >= 8; len -= 8) {
- crc = (crc << 8) ^
- crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
+ for (crc = init; len >= 32; len -= 32) {
+ register unsigned long data;
+
+ data = mad_bit_read(&bitptr, 32);
+
+ crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff];
+ crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff];
+ crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 8)) & 0xff];
+ crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 0)) & 0xff];
+ }
+
+ switch (len / 8) {
+ case 3: crc = (crc << 8) ^
+ crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
+ case 2: crc = (crc << 8) ^
+ crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
+ case 1: crc = (crc << 8) ^
+ crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
+
+ len %= 8;
+
+ case 0: break;
}
-# else
- crc = init;
-# endif
while (len--) {
- data = mad_bit_read(&bitptr, 1) ^ (crc >> 15);
+ register unsigned int msb;
+
+ msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15);
crc <<= 1;
- if (data & 1)
+ if (msb & 1)
crc ^= CRC_POLY;
}