1ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/****************************************************************************** 2ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * 3ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Copyright (C) 2014 The Android Open Source Project 4ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * 6ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Licensed under the Apache License, Version 2.0 (the "License"); 7ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * you may not use this file except in compliance with the License. 8ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * You may obtain a copy of the License at: 9ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * 10ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * http://www.apache.org/licenses/LICENSE-2.0 11ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * 12ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Unless required by applicable law or agreed to in writing, software 13ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * distributed under the License is distributed on an "AS IS" BASIS, 14ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * See the License for the specific language governing permissions and 16ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * limitations under the License. 17ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * 18ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta ******************************************************************************/ 19ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 20ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/********************************************************************************** 21ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta $Revision: #1 $ 22ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta***********************************************************************************/ 23ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 24ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/** 25ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@file 26ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaChecksum and header-related functions. 27ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 28ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@ingroup codec_internal 29ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta*/ 30ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 31ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/** 32ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@addtogroup codec_internal 33ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@{ 34ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta*/ 35ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 36ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#include "oi_codec_sbc_private.h" 37ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#include "oi_assert.h" 38ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 39ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 40ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/* asdasd */ 41ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 42ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#define USE_NIBBLEWISE_CRC 43ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 44ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/* #define PRINT_SAMPLES */ 45ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/* #define PRINT_SCALEFACTORS */ 46ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/* #define DEBUG_CRC */ 47ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 48ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/* 49ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * CRC-8 table for X^8 + X^4 + X^3 + X^2 + 1; byte-wise lookup 50ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */ 51ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#ifdef USE_WIDE_CRC 52ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/* Save space if a char is 16 bits, such as on the C54x */ 53ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaconst OI_BYTE crc8_wide[128] = { 54ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x001d, 0x3a27, 0x7469, 0x4e53, 0xe8f5, 0xd2cf, 0x9c81, 0xa6bb, 0xcdd0, 0xf7ea, 0xb9a4, 0x839e, 0x2538, 0x1f02, 0x514c, 0x6b76, 0x879a, 0xbda0, 0xf3ee, 0xc9d4, 0x6f72, 0x5548, 0x1b06, 0x213c, 0x4a57, 0x706d, 0x3e23, 0x0419, 0xa2bf, 0x9885, 0xd6cb, 0xecf1, 0x130e, 0x2934, 0x677a, 0x5d40, 0xfbe6, 0xc1dc, 0x8f92, 0xb5a8, 0xdec3, 0xe4f9, 0xaab7, 0x908d, 0x362b, 0x0c11, 0x425f, 0x7865, 0x9489, 0xaeb3, 0xe0fd, 0xdac7, 0x7c61, 0x465b, 0x0815, 0x322f, 0x5944, 0x637e, 0x2d30, 0x170a, 0xb1ac, 0x8b96, 0xc5d8, 0xffe2, 0x263b, 0x1c01, 0x524f, 0x6875, 0xced3, 0xf4e9, 0xbaa7, 0x809d, 0xebf6, 0xd1cc, 0x9f82, 0xa5b8, 0x031e, 0x3924, 0x776a, 0x4d50, 0xa1bc, 0x9b86, 0xd5c8, 0xeff2, 0x4954, 0x736e, 0x3d20, 0x071a, 0x6c71, 0x564b, 0x1805, 0x223f, 0x8499, 0xbea3, 0xf0ed, 0xcad7, 0x3528, 0x0f12, 0x415c, 0x7b66, 0xddc0, 0xe7fa, 0xa9b4, 0x938e, 0xf8e5, 0xc2df, 0x8c91, 0xb6ab, 0x100d, 0x2a37, 0x6479, 0x5e43, 0xb2af, 0x8895, 0xc6db, 0xfce1, 0x5a47, 0x607d, 0x2e33, 0x1409, 0x7f62, 0x4558, 0x0b16, 0x312c, 0x978a, 0xadb0, 0xe3fe, 0xd9c4, 55ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}; 56ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#elif defined(USE_NIBBLEWISE_CRC) 57ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaconst OI_BYTE crc8_narrow[16] = { 58ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb 59ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}; 60ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#else 61ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaconst OI_BYTE crc8_narrow[256] = { 62ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb, 0xcd, 0xd0, 0xf7, 0xea, 0xb9, 0xa4, 0x83, 0x9e, 0x25, 0x38, 0x1f, 0x02, 0x51, 0x4c, 0x6b, 0x76, 0x87, 0x9a, 0xbd, 0xa0, 0xf3, 0xee, 0xc9, 0xd4, 0x6f, 0x72, 0x55, 0x48, 0x1b, 0x06, 0x21, 0x3c, 0x4a, 0x57, 0x70, 0x6d, 0x3e, 0x23, 0x04, 0x19, 0xa2, 0xbf, 0x98, 0x85, 0xd6, 0xcb, 0xec, 0xf1, 0x13, 0x0e, 0x29, 0x34, 0x67, 0x7a, 0x5d, 0x40, 0xfb, 0xe6, 0xc1, 0xdc, 0x8f, 0x92, 0xb5, 0xa8, 0xde, 0xc3, 0xe4, 0xf9, 0xaa, 0xb7, 0x90, 0x8d, 0x36, 0x2b, 0x0c, 0x11, 0x42, 0x5f, 0x78, 0x65, 0x94, 0x89, 0xae, 0xb3, 0xe0, 0xfd, 0xda, 0xc7, 0x7c, 0x61, 0x46, 0x5b, 0x08, 0x15, 0x32, 0x2f, 0x59, 0x44, 0x63, 0x7e, 0x2d, 0x30, 0x17, 0x0a, 0xb1, 0xac, 0x8b, 0x96, 0xc5, 0xd8, 0xff, 0xe2, 0x26, 0x3b, 0x1c, 0x01, 0x52, 0x4f, 0x68, 0x75, 0xce, 0xd3, 0xf4, 0xe9, 0xba, 0xa7, 0x80, 0x9d, 0xeb, 0xf6, 0xd1, 0xcc, 0x9f, 0x82, 0xa5, 0xb8, 0x03, 0x1e, 0x39, 0x24, 0x77, 0x6a, 0x4d, 0x50, 0xa1, 0xbc, 0x9b, 0x86, 0xd5, 0xc8, 0xef, 0xf2, 0x49, 0x54, 0x73, 0x6e, 0x3d, 0x20, 0x07, 0x1a, 0x6c, 0x71, 0x56, 0x4b, 0x18, 0x05, 0x22, 0x3f, 0x84, 0x99, 0xbe, 0xa3, 0xf0, 0xed, 0xca, 0xd7, 0x35, 0x28, 0x0f, 0x12, 0x41, 0x5c, 0x7b, 0x66, 0xdd, 0xc0, 0xe7, 0xfa, 0xa9, 0xb4, 0x93, 0x8e, 0xf8, 0xe5, 0xc2, 0xdf, 0x8c, 0x91, 0xb6, 0xab, 0x10, 0x0d, 0x2a, 0x37, 0x64, 0x79, 0x5e, 0x43, 0xb2, 0xaf, 0x88, 0x95, 0xc6, 0xdb, 0xfc, 0xe1, 0x5a, 0x47, 0x60, 0x7d, 0x2e, 0x33, 0x14, 0x09, 0x7f, 0x62, 0x45, 0x58, 0x0b, 0x16, 0x31, 0x2c, 0x97, 0x8a, 0xad, 0xb0, 0xe3, 0xfe, 0xd9, 0xc4 63ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}; 64ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#endif 65ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaconst OI_UINT32 dequant_long_scaled[17] = { 66ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0, 67ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0, 68ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x1ee9e116, /* bits=2 0.24151243 1/3 * (1/1.38019122262781) (0x00000008)*/ 69ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x0d3fa99c, /* bits=3 0.10350533 1/7 * (1/1.38019122262781) (0x00000013)*/ 70ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x062ec69e, /* bits=4 0.04830249 1/15 * (1/1.38019122262781) (0x00000029)*/ 71ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x02fddbfa, /* bits=5 0.02337217 1/31 * (1/1.38019122262781) (0x00000055)*/ 72ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x0178d9f5, /* bits=6 0.01150059 1/63 * (1/1.38019122262781) (0x000000ad)*/ 73ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00baf129, /* bits=7 0.00570502 1/127 * (1/1.38019122262781) (0x0000015e)*/ 74ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x005d1abe, /* bits=8 0.00284132 1/255 * (1/1.38019122262781) (0x000002bf)*/ 75ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x002e760d, /* bits=9 0.00141788 1/511 * (1/1.38019122262781) (0x00000582)*/ 76ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00173536, /* bits=10 0.00070825 1/1023 * (1/1.38019122262781) (0x00000b07)*/ 77ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x000b9928, /* bits=11 0.00035395 1/2047 * (1/1.38019122262781) (0x00001612)*/ 78ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x0005cc37, /* bits=12 0.00017693 1/4095 * (1/1.38019122262781) (0x00002c27)*/ 79ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x0002e604, /* bits=13 0.00008846 1/8191 * (1/1.38019122262781) (0x00005852)*/ 80ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x000172fc, /* bits=14 0.00004422 1/16383 * (1/1.38019122262781) (0x0000b0a7)*/ 81ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x0000b97d, /* bits=15 0.00002211 1/32767 * (1/1.38019122262781) (0x00016150)*/ 82ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00005cbe, /* bits=16 0.00001106 1/65535 * (1/1.38019122262781) (0x0002c2a5)*/ 83ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}; 84ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 85ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 86ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaconst OI_UINT32 dequant_long_unscaled[17] = { 87ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0, 88ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0, 89ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x2aaaaaab, /* bits=2 0.33333333 1/3 (0x00000005)*/ 90ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x12492492, /* bits=3 0.14285714 1/7 (0x0000000e)*/ 91ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x08888889, /* bits=4 0.06666667 1/15 (0x0000001d)*/ 92ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x04210842, /* bits=5 0.03225806 1/31 (0x0000003e)*/ 93ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x02082082, /* bits=6 0.01587302 1/63 (0x0000007e)*/ 94ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x01020408, /* bits=7 0.00787402 1/127 (0x000000fe)*/ 95ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00808081, /* bits=8 0.00392157 1/255 (0x000001fd)*/ 96ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00402010, /* bits=9 0.00195695 1/511 (0x000003fe)*/ 97ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00200802, /* bits=10 0.00097752 1/1023 (0x000007fe)*/ 98ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00100200, /* bits=11 0.00048852 1/2047 (0x00000ffe)*/ 99ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00080080, /* bits=12 0.00024420 1/4095 (0x00001ffe)*/ 100ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00040020, /* bits=13 0.00012209 1/8191 (0x00003ffe)*/ 101ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00020008, /* bits=14 0.00006104 1/16383 (0x00007ffe)*/ 102ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00010002, /* bits=15 0.00003052 1/32767 (0x0000fffe)*/ 103ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 0x00008001, /* bits=16 0.00001526 1/65535 (0x0001fffc)*/ 104ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta}; 105ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 106ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS) 107ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#include <stdio.h> 108ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#endif 109ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 110ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#ifdef USE_WIDE_CRC 111ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaINLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next) 112ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{ 113ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT crc; 114ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT idx; 115ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta idx = oldcrc^next; 116ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc = crc8_wide[idx >> 1]; 117ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta if (idx%2) { 118ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc &= 0xff; 119ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } else { 120ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc >>= 8; 121ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } 122ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 123ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta return crc; 124ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta} 125ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 126ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaINLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) 127ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{ 128ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT crc; 129ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT idx; 130ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta idx = (oldcrc ^ next) >> 4; 131ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc = crc8_wide[idx>>1]; 132ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta if (idx%2) { 133ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc &= 0xff; 134ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } else { 135ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc >>= 8; 136ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } 137ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 138ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta return (oldcrc << 4) ^ crc; 139ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta} 140ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 141ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#else // USE_WIDE_CRC 142ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 143ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaINLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) 144ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{ 145ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta return (oldcrc << 4) ^ crc8_narrow[(oldcrc^next) >> 4]; 146ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta} 147ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 148ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#ifdef USE_NIBBLEWISE_CRC 149ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaINLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) 150ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{ 151ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc = (crc << 4) ^ crc8_narrow[(crc^next) >> 4]; 152ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc = (crc << 4) ^ crc8_narrow[((crc>>4)^next)&0xf]; 153ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 154ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta return crc; 155ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta} 156ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 157ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#else // USE_NIBBLEWISE_CRC 158ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaINLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) 159ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{ 160ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta return crc8_narrow[crc^next]; 161ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta} 162ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 163ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#endif // USE_NIBBLEWISE_CRC 164ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 165ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#endif // USE_WIDE_CRC 166ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 167ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 168ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaPRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data) 169ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{ 170ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT i; 171ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT8 crc = 0x0f; 172ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta /* Count is the number of whole bytes subject to CRC. Actually, it's one 173ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * more than this number, because data[3] is the CRC field itself, which is 174ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper 175ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * spacewise to include the check in the loop. This shouldn't be much of a 176ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * bottleneck routine in the first place. */ 177ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4; 178ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 179ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 8) { 180ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta count++; 181ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } 182ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 183ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta for (i = 1; i < count; i++) { 184ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta if (i != 3) { 185ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc = crc_iterate(crc,data[i]); 186ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } 187ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } 188ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 189ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 4) { 190ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta crc = crc_iterate_top4(crc, data[i]); 191ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } 192ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 193ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta return crc; 194ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta} 195ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 196ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptavoid OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame) 197ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{ 198ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta frame->nrof_blocks = block_values[frame->blocks]; 199ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta frame->nrof_subbands = band_values[frame->subbands]; 200ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 201ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta frame->frequency = freq_values[frame->freqIndex]; 202ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta frame->nrof_channels = channel_values[frame->mode]; 203ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta} 204ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 205ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/** 206ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory 207ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta */ 208ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#define COPY4WORDS_BACK(_dest, _src) \ 209ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta do { \ 210ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_INT32 _a, _b, _c, _d; \ 211ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta _a = *--_src; \ 212ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta _b = *--_src; \ 213ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta _c = *--_src; \ 214ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta _d = *--_src; \ 215ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *--_dest = _a; \ 216ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *--_dest = _b; \ 217ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *--_dest = _c; \ 218ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta *--_dest = _d; \ 219ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } while (0) 220ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 221ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 222ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY) 223ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#include <string.h> 224ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#endif 225ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant GuptaPRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount) 226ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta{ 227ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#ifdef USE_PLATFORM_MEMMOVE 228ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T)); 229ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#elif defined(USE_PLATFORM_MEMCPY) 230ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount*sizeof(*dest)); 231ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T)); 232ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#else 233ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT n; 234ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_INT32 *d; 235ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_INT32 *s; 236ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta n = wordCount / 4 / (sizeof(OI_INT32)/sizeof(*dest)); 237ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_ASSERT((n * 4 * (sizeof(OI_INT32)/sizeof(*dest))) == wordCount); 238ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 239ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta d = (void*)(dest + wordCount); 240ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta s = (void*)(src + wordCount); 241ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta 242ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta do { 243ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta COPY4WORDS_BACK(d, s); 244ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta } while (--n); 245ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta#endif 246ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta} 247ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta/** 248ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta@} 249ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta*/ 250