annotate src/libmad-0.15.1b/bit.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 * libmad - MPEG audio decoder library
Chris@0 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
Chris@0 4 *
Chris@0 5 * This program is free software; you can redistribute it and/or modify
Chris@0 6 * it under the terms of the GNU General Public License as published by
Chris@0 7 * the Free Software Foundation; either version 2 of the License, or
Chris@0 8 * (at your option) any later version.
Chris@0 9 *
Chris@0 10 * This program is distributed in the hope that it will be useful,
Chris@0 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 13 * GNU General Public License for more details.
Chris@0 14 *
Chris@0 15 * You should have received a copy of the GNU General Public License
Chris@0 16 * along with this program; if not, write to the Free Software
Chris@0 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Chris@0 18 *
Chris@0 19 * $Id: bit.c,v 1.12 2004/01/23 09:41:32 rob Exp $
Chris@0 20 */
Chris@0 21
Chris@0 22 # ifdef HAVE_CONFIG_H
Chris@0 23 # include "config.h"
Chris@0 24 # endif
Chris@0 25
Chris@0 26 # include "global.h"
Chris@0 27
Chris@0 28 # ifdef HAVE_LIMITS_H
Chris@0 29 # include <limits.h>
Chris@0 30 # else
Chris@0 31 # define CHAR_BIT 8
Chris@0 32 # endif
Chris@0 33
Chris@0 34 # include "bit.h"
Chris@0 35
Chris@0 36 /*
Chris@0 37 * This is the lookup table for computing the CRC-check word.
Chris@0 38 * As described in section 2.4.3.1 and depicted in Figure A.9
Chris@0 39 * of ISO/IEC 11172-3, the generator polynomial is:
Chris@0 40 *
Chris@0 41 * G(X) = X^16 + X^15 + X^2 + 1
Chris@0 42 */
Chris@0 43 static
Chris@0 44 unsigned short const crc_table[256] = {
Chris@0 45 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
Chris@0 46 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
Chris@0 47 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
Chris@0 48 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
Chris@0 49 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
Chris@0 50 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
Chris@0 51 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
Chris@0 52 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
Chris@0 53
Chris@0 54 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
Chris@0 55 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
Chris@0 56 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
Chris@0 57 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
Chris@0 58 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
Chris@0 59 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
Chris@0 60 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
Chris@0 61 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
Chris@0 62
Chris@0 63 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
Chris@0 64 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
Chris@0 65 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
Chris@0 66 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
Chris@0 67 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
Chris@0 68 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
Chris@0 69 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
Chris@0 70 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
Chris@0 71
Chris@0 72 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
Chris@0 73 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
Chris@0 74 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
Chris@0 75 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
Chris@0 76 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
Chris@0 77 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
Chris@0 78 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
Chris@0 79 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
Chris@0 80 };
Chris@0 81
Chris@0 82 # define CRC_POLY 0x8005
Chris@0 83
Chris@0 84 /*
Chris@0 85 * NAME: bit->init()
Chris@0 86 * DESCRIPTION: initialize bit pointer struct
Chris@0 87 */
Chris@0 88 void mad_bit_init(struct mad_bitptr *bitptr, unsigned char const *byte)
Chris@0 89 {
Chris@0 90 bitptr->byte = byte;
Chris@0 91 bitptr->cache = 0;
Chris@0 92 bitptr->left = CHAR_BIT;
Chris@0 93 }
Chris@0 94
Chris@0 95 /*
Chris@0 96 * NAME: bit->length()
Chris@0 97 * DESCRIPTION: return number of bits between start and end points
Chris@0 98 */
Chris@0 99 unsigned int mad_bit_length(struct mad_bitptr const *begin,
Chris@0 100 struct mad_bitptr const *end)
Chris@0 101 {
Chris@0 102 return begin->left +
Chris@0 103 CHAR_BIT * (end->byte - (begin->byte + 1)) + (CHAR_BIT - end->left);
Chris@0 104 }
Chris@0 105
Chris@0 106 /*
Chris@0 107 * NAME: bit->nextbyte()
Chris@0 108 * DESCRIPTION: return pointer to next unprocessed byte
Chris@0 109 */
Chris@0 110 unsigned char const *mad_bit_nextbyte(struct mad_bitptr const *bitptr)
Chris@0 111 {
Chris@0 112 return bitptr->left == CHAR_BIT ? bitptr->byte : bitptr->byte + 1;
Chris@0 113 }
Chris@0 114
Chris@0 115 /*
Chris@0 116 * NAME: bit->skip()
Chris@0 117 * DESCRIPTION: advance bit pointer
Chris@0 118 */
Chris@0 119 void mad_bit_skip(struct mad_bitptr *bitptr, unsigned int len)
Chris@0 120 {
Chris@0 121 bitptr->byte += len / CHAR_BIT;
Chris@0 122 bitptr->left -= len % CHAR_BIT;
Chris@0 123
Chris@0 124 if (bitptr->left > CHAR_BIT) {
Chris@0 125 bitptr->byte++;
Chris@0 126 bitptr->left += CHAR_BIT;
Chris@0 127 }
Chris@0 128
Chris@0 129 if (bitptr->left < CHAR_BIT)
Chris@0 130 bitptr->cache = *bitptr->byte;
Chris@0 131 }
Chris@0 132
Chris@0 133 /*
Chris@0 134 * NAME: bit->read()
Chris@0 135 * DESCRIPTION: read an arbitrary number of bits and return their UIMSBF value
Chris@0 136 */
Chris@0 137 unsigned long mad_bit_read(struct mad_bitptr *bitptr, unsigned int len)
Chris@0 138 {
Chris@0 139 register unsigned long value;
Chris@0 140
Chris@0 141 if (bitptr->left == CHAR_BIT)
Chris@0 142 bitptr->cache = *bitptr->byte;
Chris@0 143
Chris@0 144 if (len < bitptr->left) {
Chris@0 145 value = (bitptr->cache & ((1 << bitptr->left) - 1)) >>
Chris@0 146 (bitptr->left - len);
Chris@0 147 bitptr->left -= len;
Chris@0 148
Chris@0 149 return value;
Chris@0 150 }
Chris@0 151
Chris@0 152 /* remaining bits in current byte */
Chris@0 153
Chris@0 154 value = bitptr->cache & ((1 << bitptr->left) - 1);
Chris@0 155 len -= bitptr->left;
Chris@0 156
Chris@0 157 bitptr->byte++;
Chris@0 158 bitptr->left = CHAR_BIT;
Chris@0 159
Chris@0 160 /* more bytes */
Chris@0 161
Chris@0 162 while (len >= CHAR_BIT) {
Chris@0 163 value = (value << CHAR_BIT) | *bitptr->byte++;
Chris@0 164 len -= CHAR_BIT;
Chris@0 165 }
Chris@0 166
Chris@0 167 if (len > 0) {
Chris@0 168 bitptr->cache = *bitptr->byte;
Chris@0 169
Chris@0 170 value = (value << len) | (bitptr->cache >> (CHAR_BIT - len));
Chris@0 171 bitptr->left -= len;
Chris@0 172 }
Chris@0 173
Chris@0 174 return value;
Chris@0 175 }
Chris@0 176
Chris@0 177 # if 0
Chris@0 178 /*
Chris@0 179 * NAME: bit->write()
Chris@0 180 * DESCRIPTION: write an arbitrary number of bits
Chris@0 181 */
Chris@0 182 void mad_bit_write(struct mad_bitptr *bitptr, unsigned int len,
Chris@0 183 unsigned long value)
Chris@0 184 {
Chris@0 185 unsigned char *ptr;
Chris@0 186
Chris@0 187 ptr = (unsigned char *) bitptr->byte;
Chris@0 188
Chris@0 189 /* ... */
Chris@0 190 }
Chris@0 191 # endif
Chris@0 192
Chris@0 193 /*
Chris@0 194 * NAME: bit->crc()
Chris@0 195 * DESCRIPTION: compute CRC-check word
Chris@0 196 */
Chris@0 197 unsigned short mad_bit_crc(struct mad_bitptr bitptr, unsigned int len,
Chris@0 198 unsigned short init)
Chris@0 199 {
Chris@0 200 register unsigned int crc;
Chris@0 201
Chris@0 202 for (crc = init; len >= 32; len -= 32) {
Chris@0 203 register unsigned long data;
Chris@0 204
Chris@0 205 data = mad_bit_read(&bitptr, 32);
Chris@0 206
Chris@0 207 crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 24)) & 0xff];
Chris@0 208 crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 16)) & 0xff];
Chris@0 209 crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 8)) & 0xff];
Chris@0 210 crc = (crc << 8) ^ crc_table[((crc >> 8) ^ (data >> 0)) & 0xff];
Chris@0 211 }
Chris@0 212
Chris@0 213 switch (len / 8) {
Chris@0 214 case 3: crc = (crc << 8) ^
Chris@0 215 crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
Chris@0 216 case 2: crc = (crc << 8) ^
Chris@0 217 crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
Chris@0 218 case 1: crc = (crc << 8) ^
Chris@0 219 crc_table[((crc >> 8) ^ mad_bit_read(&bitptr, 8)) & 0xff];
Chris@0 220
Chris@0 221 len %= 8;
Chris@0 222
Chris@0 223 case 0: break;
Chris@0 224 }
Chris@0 225
Chris@0 226 while (len--) {
Chris@0 227 register unsigned int msb;
Chris@0 228
Chris@0 229 msb = mad_bit_read(&bitptr, 1) ^ (crc >> 15);
Chris@0 230
Chris@0 231 crc <<= 1;
Chris@0 232 if (msb & 1)
Chris@0 233 crc ^= CRC_POLY;
Chris@0 234 }
Chris@0 235
Chris@0 236 return crc & 0xffff;
Chris@0 237 }