1df25739fSMilanka Ringwald /****************************************************************************** 2df25739fSMilanka Ringwald * 3df25739fSMilanka Ringwald * Copyright (C) 2014 The Android Open Source Project 4df25739fSMilanka Ringwald * Copyright 2003 - 2004 Open Interface North America, Inc. All rights reserved. 5df25739fSMilanka Ringwald * 6df25739fSMilanka Ringwald * Licensed under the Apache License, Version 2.0 (the "License"); 7df25739fSMilanka Ringwald * you may not use this file except in compliance with the License. 8df25739fSMilanka Ringwald * You may obtain a copy of the License at: 9df25739fSMilanka Ringwald * 10df25739fSMilanka Ringwald * http://www.apache.org/licenses/LICENSE-2.0 11df25739fSMilanka Ringwald * 12df25739fSMilanka Ringwald * Unless required by applicable law or agreed to in writing, software 13df25739fSMilanka Ringwald * distributed under the License is distributed on an "AS IS" BASIS, 14df25739fSMilanka Ringwald * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15df25739fSMilanka Ringwald * See the License for the specific language governing permissions and 16df25739fSMilanka Ringwald * limitations under the License. 17df25739fSMilanka Ringwald * 18df25739fSMilanka Ringwald ******************************************************************************/ 19df25739fSMilanka Ringwald 20df25739fSMilanka Ringwald /********************************************************************************** 21df25739fSMilanka Ringwald $Revision: #1 $ 22df25739fSMilanka Ringwald ***********************************************************************************/ 23df25739fSMilanka Ringwald 24df25739fSMilanka Ringwald /** 25df25739fSMilanka Ringwald @file 26df25739fSMilanka Ringwald Checksum and header-related functions. 27df25739fSMilanka Ringwald 28df25739fSMilanka Ringwald @ingroup codec_internal 29df25739fSMilanka Ringwald */ 30df25739fSMilanka Ringwald 31df25739fSMilanka Ringwald /** 32df25739fSMilanka Ringwald @addtogroup codec_internal 33df25739fSMilanka Ringwald @{ 34df25739fSMilanka Ringwald */ 35df25739fSMilanka Ringwald 36df25739fSMilanka Ringwald #include "oi_codec_sbc_private.h" 37df25739fSMilanka Ringwald #include "oi_assert.h" 38df25739fSMilanka Ringwald 39df25739fSMilanka Ringwald 40df25739fSMilanka Ringwald /* asdasd */ 41df25739fSMilanka Ringwald 42df25739fSMilanka Ringwald #define USE_NIBBLEWISE_CRC 43df25739fSMilanka Ringwald 44df25739fSMilanka Ringwald /* #define PRINT_SAMPLES */ 45df25739fSMilanka Ringwald /* #define PRINT_SCALEFACTORS */ 46df25739fSMilanka Ringwald /* #define DEBUG_CRC */ 47df25739fSMilanka Ringwald 48df25739fSMilanka Ringwald /* 49df25739fSMilanka Ringwald * CRC-8 table for X^8 + X^4 + X^3 + X^2 + 1; byte-wise lookup 50df25739fSMilanka Ringwald */ 51df25739fSMilanka Ringwald #ifdef USE_WIDE_CRC 52df25739fSMilanka Ringwald /* Save space if a char is 16 bits, such as on the C54x */ 53df25739fSMilanka Ringwald const OI_BYTE crc8_wide[128] = { 54df25739fSMilanka Ringwald 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, 55df25739fSMilanka Ringwald }; 56df25739fSMilanka Ringwald #elif defined(USE_NIBBLEWISE_CRC) 57df25739fSMilanka Ringwald const OI_BYTE crc8_narrow[16] = { 58df25739fSMilanka Ringwald 0x00, 0x1d, 0x3a, 0x27, 0x74, 0x69, 0x4e, 0x53, 0xe8, 0xf5, 0xd2, 0xcf, 0x9c, 0x81, 0xa6, 0xbb 59df25739fSMilanka Ringwald }; 60df25739fSMilanka Ringwald #else 61df25739fSMilanka Ringwald const OI_BYTE crc8_narrow[256] = { 62df25739fSMilanka Ringwald 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 63df25739fSMilanka Ringwald }; 64df25739fSMilanka Ringwald #endif 65df25739fSMilanka Ringwald const OI_UINT32 dequant_long_scaled[17] = { 66df25739fSMilanka Ringwald 0, 67df25739fSMilanka Ringwald 0, 68df25739fSMilanka Ringwald 0x1ee9e116, /* bits=2 0.24151243 1/3 * (1/1.38019122262781) (0x00000008)*/ 69df25739fSMilanka Ringwald 0x0d3fa99c, /* bits=3 0.10350533 1/7 * (1/1.38019122262781) (0x00000013)*/ 70df25739fSMilanka Ringwald 0x062ec69e, /* bits=4 0.04830249 1/15 * (1/1.38019122262781) (0x00000029)*/ 71df25739fSMilanka Ringwald 0x02fddbfa, /* bits=5 0.02337217 1/31 * (1/1.38019122262781) (0x00000055)*/ 72df25739fSMilanka Ringwald 0x0178d9f5, /* bits=6 0.01150059 1/63 * (1/1.38019122262781) (0x000000ad)*/ 73df25739fSMilanka Ringwald 0x00baf129, /* bits=7 0.00570502 1/127 * (1/1.38019122262781) (0x0000015e)*/ 74df25739fSMilanka Ringwald 0x005d1abe, /* bits=8 0.00284132 1/255 * (1/1.38019122262781) (0x000002bf)*/ 75df25739fSMilanka Ringwald 0x002e760d, /* bits=9 0.00141788 1/511 * (1/1.38019122262781) (0x00000582)*/ 76df25739fSMilanka Ringwald 0x00173536, /* bits=10 0.00070825 1/1023 * (1/1.38019122262781) (0x00000b07)*/ 77df25739fSMilanka Ringwald 0x000b9928, /* bits=11 0.00035395 1/2047 * (1/1.38019122262781) (0x00001612)*/ 78df25739fSMilanka Ringwald 0x0005cc37, /* bits=12 0.00017693 1/4095 * (1/1.38019122262781) (0x00002c27)*/ 79df25739fSMilanka Ringwald 0x0002e604, /* bits=13 0.00008846 1/8191 * (1/1.38019122262781) (0x00005852)*/ 80df25739fSMilanka Ringwald 0x000172fc, /* bits=14 0.00004422 1/16383 * (1/1.38019122262781) (0x0000b0a7)*/ 81df25739fSMilanka Ringwald 0x0000b97d, /* bits=15 0.00002211 1/32767 * (1/1.38019122262781) (0x00016150)*/ 82df25739fSMilanka Ringwald 0x00005cbe, /* bits=16 0.00001106 1/65535 * (1/1.38019122262781) (0x0002c2a5)*/ 83df25739fSMilanka Ringwald }; 84df25739fSMilanka Ringwald 85df25739fSMilanka Ringwald 86df25739fSMilanka Ringwald const OI_UINT32 dequant_long_unscaled[17] = { 87df25739fSMilanka Ringwald 0, 88df25739fSMilanka Ringwald 0, 89df25739fSMilanka Ringwald 0x2aaaaaab, /* bits=2 0.33333333 1/3 (0x00000005)*/ 90df25739fSMilanka Ringwald 0x12492492, /* bits=3 0.14285714 1/7 (0x0000000e)*/ 91df25739fSMilanka Ringwald 0x08888889, /* bits=4 0.06666667 1/15 (0x0000001d)*/ 92df25739fSMilanka Ringwald 0x04210842, /* bits=5 0.03225806 1/31 (0x0000003e)*/ 93df25739fSMilanka Ringwald 0x02082082, /* bits=6 0.01587302 1/63 (0x0000007e)*/ 94df25739fSMilanka Ringwald 0x01020408, /* bits=7 0.00787402 1/127 (0x000000fe)*/ 95df25739fSMilanka Ringwald 0x00808081, /* bits=8 0.00392157 1/255 (0x000001fd)*/ 96df25739fSMilanka Ringwald 0x00402010, /* bits=9 0.00195695 1/511 (0x000003fe)*/ 97df25739fSMilanka Ringwald 0x00200802, /* bits=10 0.00097752 1/1023 (0x000007fe)*/ 98df25739fSMilanka Ringwald 0x00100200, /* bits=11 0.00048852 1/2047 (0x00000ffe)*/ 99df25739fSMilanka Ringwald 0x00080080, /* bits=12 0.00024420 1/4095 (0x00001ffe)*/ 100df25739fSMilanka Ringwald 0x00040020, /* bits=13 0.00012209 1/8191 (0x00003ffe)*/ 101df25739fSMilanka Ringwald 0x00020008, /* bits=14 0.00006104 1/16383 (0x00007ffe)*/ 102df25739fSMilanka Ringwald 0x00010002, /* bits=15 0.00003052 1/32767 (0x0000fffe)*/ 103df25739fSMilanka Ringwald 0x00008001, /* bits=16 0.00001526 1/65535 (0x0001fffc)*/ 104df25739fSMilanka Ringwald }; 105df25739fSMilanka Ringwald 106df25739fSMilanka Ringwald #if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS) 107df25739fSMilanka Ringwald #include <stdio.h> 108df25739fSMilanka Ringwald #endif 109df25739fSMilanka Ringwald 110df25739fSMilanka Ringwald #ifdef USE_WIDE_CRC 11108b456cdSMilanka Ringwald INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next); 112df25739fSMilanka Ringwald INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next) 113df25739fSMilanka Ringwald { 114df25739fSMilanka Ringwald OI_UINT crc; 115df25739fSMilanka Ringwald OI_UINT idx; 116df25739fSMilanka Ringwald idx = oldcrc^next; 117df25739fSMilanka Ringwald crc = crc8_wide[idx >> 1]; 118df25739fSMilanka Ringwald if (idx%2) { 119df25739fSMilanka Ringwald crc &= 0xff; 120df25739fSMilanka Ringwald } else { 121df25739fSMilanka Ringwald crc >>= 8; 122df25739fSMilanka Ringwald } 123df25739fSMilanka Ringwald 124df25739fSMilanka Ringwald return crc; 125df25739fSMilanka Ringwald } 126df25739fSMilanka Ringwald 12708b456cdSMilanka Ringwald INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next); 128df25739fSMilanka Ringwald INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) 129df25739fSMilanka Ringwald { 130df25739fSMilanka Ringwald OI_UINT crc; 131df25739fSMilanka Ringwald OI_UINT idx; 132df25739fSMilanka Ringwald idx = (oldcrc ^ next) >> 4; 133df25739fSMilanka Ringwald crc = crc8_wide[idx>>1]; 134df25739fSMilanka Ringwald if (idx%2) { 135df25739fSMilanka Ringwald crc &= 0xff; 136df25739fSMilanka Ringwald } else { 137df25739fSMilanka Ringwald crc >>= 8; 138df25739fSMilanka Ringwald } 139df25739fSMilanka Ringwald 140df25739fSMilanka Ringwald return (oldcrc << 4) ^ crc; 141df25739fSMilanka Ringwald } 142df25739fSMilanka Ringwald 143df25739fSMilanka Ringwald #else // USE_WIDE_CRC 144df25739fSMilanka Ringwald 14508b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next); 146df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next) 147df25739fSMilanka Ringwald { 148df25739fSMilanka Ringwald return (oldcrc << 4) ^ crc8_narrow[(oldcrc^next) >> 4]; 149df25739fSMilanka Ringwald } 150df25739fSMilanka Ringwald 151df25739fSMilanka Ringwald #ifdef USE_NIBBLEWISE_CRC 15208b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next); 153df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) 154df25739fSMilanka Ringwald { 155df25739fSMilanka Ringwald crc = (crc << 4) ^ crc8_narrow[(crc^next) >> 4]; 156df25739fSMilanka Ringwald crc = (crc << 4) ^ crc8_narrow[((crc>>4)^next)&0xf]; 157df25739fSMilanka Ringwald 158df25739fSMilanka Ringwald return crc; 159df25739fSMilanka Ringwald } 160df25739fSMilanka Ringwald 161df25739fSMilanka Ringwald #else // USE_NIBBLEWISE_CRC 16208b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next); 163df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next) 164df25739fSMilanka Ringwald { 165df25739fSMilanka Ringwald return crc8_narrow[crc^next]; 166df25739fSMilanka Ringwald } 167df25739fSMilanka Ringwald 168df25739fSMilanka Ringwald #endif // USE_NIBBLEWISE_CRC 169df25739fSMilanka Ringwald 170df25739fSMilanka Ringwald #endif // USE_WIDE_CRC 171df25739fSMilanka Ringwald 172*fcb08cdbSMilanka Ringwald PRIVATE OI_UINT8 OI_SBC_CalculateChecksum_mSBC(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data) 173*fcb08cdbSMilanka Ringwald { 174*fcb08cdbSMilanka Ringwald OI_UINT i; 175*fcb08cdbSMilanka Ringwald OI_UINT8 crc = 0x0f; 176*fcb08cdbSMilanka Ringwald /* Count is the number of whole bytes subject to CRC. Actually, it's one 177*fcb08cdbSMilanka Ringwald * more than this number, because data[3] is the CRC field itself, which is 178*fcb08cdbSMilanka Ringwald * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper 179*fcb08cdbSMilanka Ringwald * spacewise to include the check in the loop. This shouldn't be much of a 180*fcb08cdbSMilanka Ringwald * bottleneck routine in the first place. */ 181*fcb08cdbSMilanka Ringwald 182*fcb08cdbSMilanka Ringwald // 0 - syncword (skip) 183*fcb08cdbSMilanka Ringwald // 1 - reserved 184*fcb08cdbSMilanka Ringwald crc = crc_iterate(crc,frame->reserved_for_future_use[0]); 185*fcb08cdbSMilanka Ringwald // 2 - reserved 186*fcb08cdbSMilanka Ringwald crc = crc_iterate(crc,frame->reserved_for_future_use[1]); 187*fcb08cdbSMilanka Ringwald // 3 - crc (skip) 188*fcb08cdbSMilanka Ringwald // 4..7 - scale factors (8 x 4 bit = 4 byte) 189*fcb08cdbSMilanka Ringwald for (i = 0; i < 4; i++) { 190*fcb08cdbSMilanka Ringwald crc = crc_iterate(crc,data[4+i]); 191*fcb08cdbSMilanka Ringwald } 192*fcb08cdbSMilanka Ringwald return crc; 193*fcb08cdbSMilanka Ringwald } 194df25739fSMilanka Ringwald 195df25739fSMilanka Ringwald PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data) 196df25739fSMilanka Ringwald { 197df25739fSMilanka Ringwald OI_UINT i; 198df25739fSMilanka Ringwald OI_UINT8 crc = 0x0f; 199df25739fSMilanka Ringwald /* Count is the number of whole bytes subject to CRC. Actually, it's one 200df25739fSMilanka Ringwald * more than this number, because data[3] is the CRC field itself, which is 201df25739fSMilanka Ringwald * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper 202df25739fSMilanka Ringwald * spacewise to include the check in the loop. This shouldn't be much of a 203df25739fSMilanka Ringwald * bottleneck routine in the first place. */ 204*fcb08cdbSMilanka Ringwald 205df25739fSMilanka Ringwald OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4; 206df25739fSMilanka Ringwald 207df25739fSMilanka Ringwald if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 8) { 208df25739fSMilanka Ringwald count++; 209df25739fSMilanka Ringwald } 210df25739fSMilanka Ringwald 211df25739fSMilanka Ringwald for (i = 1; i < count; i++) { 212df25739fSMilanka Ringwald if (i != 3) { 213df25739fSMilanka Ringwald crc = crc_iterate(crc,data[i]); 214df25739fSMilanka Ringwald } 215df25739fSMilanka Ringwald } 216df25739fSMilanka Ringwald 217df25739fSMilanka Ringwald if (frame->mode == SBC_JOINT_STEREO && frame->nrof_subbands == 4) { 218df25739fSMilanka Ringwald crc = crc_iterate_top4(crc, data[i]); 219df25739fSMilanka Ringwald } 220df25739fSMilanka Ringwald 221df25739fSMilanka Ringwald return crc; 222df25739fSMilanka Ringwald } 223df25739fSMilanka Ringwald 224df25739fSMilanka Ringwald void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame) 225df25739fSMilanka Ringwald { 226df25739fSMilanka Ringwald frame->nrof_blocks = block_values[frame->blocks]; 227df25739fSMilanka Ringwald frame->nrof_subbands = band_values[frame->subbands]; 228df25739fSMilanka Ringwald 229df25739fSMilanka Ringwald frame->frequency = freq_values[frame->freqIndex]; 230df25739fSMilanka Ringwald frame->nrof_channels = channel_values[frame->mode]; 231df25739fSMilanka Ringwald } 232df25739fSMilanka Ringwald 233df25739fSMilanka Ringwald /** 234df25739fSMilanka Ringwald * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory 235df25739fSMilanka Ringwald */ 236df25739fSMilanka Ringwald #define COPY4WORDS_BACK(_dest, _src) \ 237df25739fSMilanka Ringwald do { \ 238df25739fSMilanka Ringwald OI_INT32 _a, _b, _c, _d; \ 239df25739fSMilanka Ringwald _a = *--_src; \ 240df25739fSMilanka Ringwald _b = *--_src; \ 241df25739fSMilanka Ringwald _c = *--_src; \ 242df25739fSMilanka Ringwald _d = *--_src; \ 243df25739fSMilanka Ringwald *--_dest = _a; \ 244df25739fSMilanka Ringwald *--_dest = _b; \ 245df25739fSMilanka Ringwald *--_dest = _c; \ 246df25739fSMilanka Ringwald *--_dest = _d; \ 247df25739fSMilanka Ringwald } while (0) 248df25739fSMilanka Ringwald 249df25739fSMilanka Ringwald 250df25739fSMilanka Ringwald #if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY) 251df25739fSMilanka Ringwald #include <string.h> 252df25739fSMilanka Ringwald #endif 253df25739fSMilanka Ringwald PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount) 254df25739fSMilanka Ringwald { 255df25739fSMilanka Ringwald #ifdef USE_PLATFORM_MEMMOVE 256df25739fSMilanka Ringwald memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T)); 257df25739fSMilanka Ringwald #elif defined(USE_PLATFORM_MEMCPY) 258df25739fSMilanka Ringwald OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount*sizeof(*dest)); 259df25739fSMilanka Ringwald memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T)); 260df25739fSMilanka Ringwald #else 261df25739fSMilanka Ringwald OI_UINT n; 262df25739fSMilanka Ringwald OI_INT32 *d; 263df25739fSMilanka Ringwald OI_INT32 *s; 264df25739fSMilanka Ringwald n = wordCount / 4 / (sizeof(OI_INT32)/sizeof(*dest)); 265df25739fSMilanka Ringwald OI_ASSERT((n * 4 * (sizeof(OI_INT32)/sizeof(*dest))) == wordCount); 266df25739fSMilanka Ringwald 267df25739fSMilanka Ringwald d = (OI_INT32*)(dest + wordCount); 268df25739fSMilanka Ringwald s = (OI_INT32*)(src + wordCount); 269df25739fSMilanka Ringwald 270df25739fSMilanka Ringwald do { 271df25739fSMilanka Ringwald COPY4WORDS_BACK(d, s); 272df25739fSMilanka Ringwald } while (--n); 273df25739fSMilanka Ringwald #endif 274df25739fSMilanka Ringwald } 275df25739fSMilanka Ringwald /** 276df25739fSMilanka Ringwald @} 277df25739fSMilanka Ringwald */ 278