blob: 5d232bc95dbe1a3be02364d563ec815fa53c0b20 [file] [log] [blame]
Josh Coalson26560dd2001-02-08 00:38:41 +00001/* libFLAC - Free Lossless Audio Codec library
Josh Coalson305ae2e2002-01-26 17:36:39 +00002 * Copyright (C) 2000,2001,2002 Josh Coalson
Josh Coalsonbb7f6b92000-12-10 04:09:52 +00003 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
18 */
19
20#include "private/crc.h"
21
Josh Coalson6351ef62001-03-27 01:14:25 +000022/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */
Josh Coalsonbb7f6b92000-12-10 04:09:52 +000023
Josh Coalson77e3f312001-06-23 03:03:24 +000024FLAC__byte const FLAC__crc8_table[256] = {
Josh Coalson6351ef62001-03-27 01:14:25 +000025 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
26 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
27 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
28 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
29 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
30 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
31 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
32 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
33 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
34 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
35 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
36 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
37 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
38 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
39 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
40 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
41 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
42 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
43 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
44 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
45 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
46 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
47 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
48 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
49 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
50 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
51 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
52 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
53 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
54 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
55 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
56 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
57};
58
59/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */
60
Josh Coalson77e3f312001-06-23 03:03:24 +000061FLAC__uint16 FLAC__crc16_table[256] = {
Josh Coalson6351ef62001-03-27 01:14:25 +000062 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
63 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
64 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
65 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
66 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
67 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
68 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
69 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
70 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
71 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
72 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
73 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
74 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
75 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
76 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
77 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
78 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
79 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
80 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
81 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
82 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
83 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
84 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
85 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
86 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
87 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
88 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
89 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
90 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
91 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
92 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
93 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202
94};
95
96
Josh Coalson77e3f312001-06-23 03:03:24 +000097void FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc)
Josh Coalson6351ef62001-03-27 01:14:25 +000098{
99 *crc = FLAC__crc8_table[*crc ^ data];
100}
101
Josh Coalson77e3f312001-06-23 03:03:24 +0000102void FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc)
Josh Coalson6351ef62001-03-27 01:14:25 +0000103{
104 while(len--)
105 *crc = FLAC__crc8_table[*crc ^ *data++];
106}
107
Josh Coalson77e3f312001-06-23 03:03:24 +0000108FLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len)
Josh Coalson6351ef62001-03-27 01:14:25 +0000109{
Josh Coalson77e3f312001-06-23 03:03:24 +0000110 FLAC__uint8 crc = 0;
Josh Coalson6351ef62001-03-27 01:14:25 +0000111
112 while(len--)
113 crc = FLAC__crc8_table[crc ^ *data++];
114
115 return crc;
116}
117
Josh Coalson77e3f312001-06-23 03:03:24 +0000118void FLAC__crc16_update(const FLAC__byte data, FLAC__uint16 *crc)
Josh Coalson6351ef62001-03-27 01:14:25 +0000119{
120 *crc = (*crc<<8) ^ FLAC__crc16_table[(*crc>>8) ^ data];
121}
122
Josh Coalson77e3f312001-06-23 03:03:24 +0000123void FLAC__crc16_update_block(const FLAC__byte *data, unsigned len, FLAC__uint16 *crc)
Josh Coalson6351ef62001-03-27 01:14:25 +0000124{
125 while(len--)
126 *crc = (*crc<<8) ^ FLAC__crc16_table[(*crc>>8) ^ *data++];
127}
128
Josh Coalson77e3f312001-06-23 03:03:24 +0000129FLAC__uint16 FLAC__crc16(const FLAC__byte *data, unsigned len)
Josh Coalson6351ef62001-03-27 01:14:25 +0000130{
Josh Coalson77e3f312001-06-23 03:03:24 +0000131 FLAC__uint16 crc = 0;
Josh Coalson6351ef62001-03-27 01:14:25 +0000132
133 while(len--)
134 crc = (crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++];
Josh Coalsonbb7f6b92000-12-10 04:09:52 +0000135
136 return crc;
137}