1c74663799493f2b1e6123c18def94295d0afab7Kenny Root/* libFLAC - Free Lossless Audio Codec library 2c74663799493f2b1e6123c18def94295d0afab7Kenny Root * Copyright (C) 2000,2001,2002,2003,2004,2005,2006,2007 Josh Coalson 3c74663799493f2b1e6123c18def94295d0afab7Kenny Root * 4c74663799493f2b1e6123c18def94295d0afab7Kenny Root * Redistribution and use in source and binary forms, with or without 5c74663799493f2b1e6123c18def94295d0afab7Kenny Root * modification, are permitted provided that the following conditions 6c74663799493f2b1e6123c18def94295d0afab7Kenny Root * are met: 7c74663799493f2b1e6123c18def94295d0afab7Kenny Root * 8c74663799493f2b1e6123c18def94295d0afab7Kenny Root * - Redistributions of source code must retain the above copyright 9c74663799493f2b1e6123c18def94295d0afab7Kenny Root * notice, this list of conditions and the following disclaimer. 10c74663799493f2b1e6123c18def94295d0afab7Kenny Root * 11c74663799493f2b1e6123c18def94295d0afab7Kenny Root * - Redistributions in binary form must reproduce the above copyright 12c74663799493f2b1e6123c18def94295d0afab7Kenny Root * notice, this list of conditions and the following disclaimer in the 13c74663799493f2b1e6123c18def94295d0afab7Kenny Root * documentation and/or other materials provided with the distribution. 14c74663799493f2b1e6123c18def94295d0afab7Kenny Root * 15c74663799493f2b1e6123c18def94295d0afab7Kenny Root * - Neither the name of the Xiph.org Foundation nor the names of its 16c74663799493f2b1e6123c18def94295d0afab7Kenny Root * contributors may be used to endorse or promote products derived from 17c74663799493f2b1e6123c18def94295d0afab7Kenny Root * this software without specific prior written permission. 18c74663799493f2b1e6123c18def94295d0afab7Kenny Root * 19c74663799493f2b1e6123c18def94295d0afab7Kenny Root * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20c74663799493f2b1e6123c18def94295d0afab7Kenny Root * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21c74663799493f2b1e6123c18def94295d0afab7Kenny Root * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22c74663799493f2b1e6123c18def94295d0afab7Kenny Root * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR 23c74663799493f2b1e6123c18def94295d0afab7Kenny Root * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24c74663799493f2b1e6123c18def94295d0afab7Kenny Root * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25c74663799493f2b1e6123c18def94295d0afab7Kenny Root * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 26c74663799493f2b1e6123c18def94295d0afab7Kenny Root * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 27c74663799493f2b1e6123c18def94295d0afab7Kenny Root * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 28c74663799493f2b1e6123c18def94295d0afab7Kenny Root * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 29c74663799493f2b1e6123c18def94295d0afab7Kenny Root * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30c74663799493f2b1e6123c18def94295d0afab7Kenny Root */ 31c74663799493f2b1e6123c18def94295d0afab7Kenny Root 32c74663799493f2b1e6123c18def94295d0afab7Kenny Root#if HAVE_CONFIG_H 33c74663799493f2b1e6123c18def94295d0afab7Kenny Root# include <config.h> 34c74663799493f2b1e6123c18def94295d0afab7Kenny Root#endif 35c74663799493f2b1e6123c18def94295d0afab7Kenny Root 36c74663799493f2b1e6123c18def94295d0afab7Kenny Root#include "private/crc.h" 37c74663799493f2b1e6123c18def94295d0afab7Kenny Root 38c74663799493f2b1e6123c18def94295d0afab7Kenny Root/* CRC-8, poly = x^8 + x^2 + x^1 + x^0, init = 0 */ 39c74663799493f2b1e6123c18def94295d0afab7Kenny Root 40c74663799493f2b1e6123c18def94295d0afab7Kenny RootFLAC__byte const FLAC__crc8_table[256] = { 41c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15, 42c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D, 43c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65, 44c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D, 45c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5, 46c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD, 47c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85, 48c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD, 49c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2, 50c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA, 51c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2, 52c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A, 53c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32, 54c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A, 55c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42, 56c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A, 57c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C, 58c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4, 59c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC, 60c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4, 61c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C, 62c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44, 63c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C, 64c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34, 65c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B, 66c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63, 67c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B, 68c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13, 69c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB, 70c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83, 71c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB, 72c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3 73c74663799493f2b1e6123c18def94295d0afab7Kenny Root}; 74c74663799493f2b1e6123c18def94295d0afab7Kenny Root 75c74663799493f2b1e6123c18def94295d0afab7Kenny Root/* CRC-16, poly = x^16 + x^15 + x^2 + x^0, init = 0 */ 76c74663799493f2b1e6123c18def94295d0afab7Kenny Root 77c74663799493f2b1e6123c18def94295d0afab7Kenny Rootunsigned FLAC__crc16_table[256] = { 78c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, 79c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, 80c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, 81c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, 82c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, 83c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, 84c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, 85c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, 86c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, 87c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, 88c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, 89c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, 90c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, 91c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, 92c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, 93c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, 94c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, 95c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, 96c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, 97c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, 98c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, 99c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, 100c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, 101c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, 102c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, 103c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, 104c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, 105c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, 106c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, 107c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, 108c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, 109c74663799493f2b1e6123c18def94295d0afab7Kenny Root 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202 110c74663799493f2b1e6123c18def94295d0afab7Kenny Root}; 111c74663799493f2b1e6123c18def94295d0afab7Kenny Root 112c74663799493f2b1e6123c18def94295d0afab7Kenny Root 113c74663799493f2b1e6123c18def94295d0afab7Kenny Rootvoid FLAC__crc8_update(const FLAC__byte data, FLAC__uint8 *crc) 114c74663799493f2b1e6123c18def94295d0afab7Kenny Root{ 115c74663799493f2b1e6123c18def94295d0afab7Kenny Root *crc = FLAC__crc8_table[*crc ^ data]; 116c74663799493f2b1e6123c18def94295d0afab7Kenny Root} 117c74663799493f2b1e6123c18def94295d0afab7Kenny Root 118c74663799493f2b1e6123c18def94295d0afab7Kenny Rootvoid FLAC__crc8_update_block(const FLAC__byte *data, unsigned len, FLAC__uint8 *crc) 119c74663799493f2b1e6123c18def94295d0afab7Kenny Root{ 120c74663799493f2b1e6123c18def94295d0afab7Kenny Root while(len--) 121c74663799493f2b1e6123c18def94295d0afab7Kenny Root *crc = FLAC__crc8_table[*crc ^ *data++]; 122c74663799493f2b1e6123c18def94295d0afab7Kenny Root} 123c74663799493f2b1e6123c18def94295d0afab7Kenny Root 124c74663799493f2b1e6123c18def94295d0afab7Kenny RootFLAC__uint8 FLAC__crc8(const FLAC__byte *data, unsigned len) 125c74663799493f2b1e6123c18def94295d0afab7Kenny Root{ 126c74663799493f2b1e6123c18def94295d0afab7Kenny Root FLAC__uint8 crc = 0; 127c74663799493f2b1e6123c18def94295d0afab7Kenny Root 128c74663799493f2b1e6123c18def94295d0afab7Kenny Root while(len--) 129c74663799493f2b1e6123c18def94295d0afab7Kenny Root crc = FLAC__crc8_table[crc ^ *data++]; 130c74663799493f2b1e6123c18def94295d0afab7Kenny Root 131c74663799493f2b1e6123c18def94295d0afab7Kenny Root return crc; 132c74663799493f2b1e6123c18def94295d0afab7Kenny Root} 133c74663799493f2b1e6123c18def94295d0afab7Kenny Root 134c74663799493f2b1e6123c18def94295d0afab7Kenny Rootunsigned FLAC__crc16(const FLAC__byte *data, unsigned len) 135c74663799493f2b1e6123c18def94295d0afab7Kenny Root{ 136c74663799493f2b1e6123c18def94295d0afab7Kenny Root unsigned crc = 0; 137c74663799493f2b1e6123c18def94295d0afab7Kenny Root 138c74663799493f2b1e6123c18def94295d0afab7Kenny Root while(len--) 139c74663799493f2b1e6123c18def94295d0afab7Kenny Root crc = ((crc<<8) ^ FLAC__crc16_table[(crc>>8) ^ *data++]) & 0xffff; 140c74663799493f2b1e6123c18def94295d0afab7Kenny Root 141c74663799493f2b1e6123c18def94295d0afab7Kenny Root return crc; 142c74663799493f2b1e6123c18def94295d0afab7Kenny Root} 143