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
65b0920f25SMilanka Ringwald
66df25739fSMilanka Ringwald const OI_UINT32 dequant_long_scaled[17] = {
67df25739fSMilanka Ringwald 0,
68df25739fSMilanka Ringwald 0,
69df25739fSMilanka Ringwald 0x1ee9e116, /* bits=2 0.24151243 1/3 * (1/1.38019122262781) (0x00000008)*/
70df25739fSMilanka Ringwald 0x0d3fa99c, /* bits=3 0.10350533 1/7 * (1/1.38019122262781) (0x00000013)*/
71df25739fSMilanka Ringwald 0x062ec69e, /* bits=4 0.04830249 1/15 * (1/1.38019122262781) (0x00000029)*/
72df25739fSMilanka Ringwald 0x02fddbfa, /* bits=5 0.02337217 1/31 * (1/1.38019122262781) (0x00000055)*/
73df25739fSMilanka Ringwald 0x0178d9f5, /* bits=6 0.01150059 1/63 * (1/1.38019122262781) (0x000000ad)*/
74df25739fSMilanka Ringwald 0x00baf129, /* bits=7 0.00570502 1/127 * (1/1.38019122262781) (0x0000015e)*/
75df25739fSMilanka Ringwald 0x005d1abe, /* bits=8 0.00284132 1/255 * (1/1.38019122262781) (0x000002bf)*/
76df25739fSMilanka Ringwald 0x002e760d, /* bits=9 0.00141788 1/511 * (1/1.38019122262781) (0x00000582)*/
77df25739fSMilanka Ringwald 0x00173536, /* bits=10 0.00070825 1/1023 * (1/1.38019122262781) (0x00000b07)*/
78df25739fSMilanka Ringwald 0x000b9928, /* bits=11 0.00035395 1/2047 * (1/1.38019122262781) (0x00001612)*/
79df25739fSMilanka Ringwald 0x0005cc37, /* bits=12 0.00017693 1/4095 * (1/1.38019122262781) (0x00002c27)*/
80df25739fSMilanka Ringwald 0x0002e604, /* bits=13 0.00008846 1/8191 * (1/1.38019122262781) (0x00005852)*/
81df25739fSMilanka Ringwald 0x000172fc, /* bits=14 0.00004422 1/16383 * (1/1.38019122262781) (0x0000b0a7)*/
82df25739fSMilanka Ringwald 0x0000b97d, /* bits=15 0.00002211 1/32767 * (1/1.38019122262781) (0x00016150)*/
83df25739fSMilanka Ringwald 0x00005cbe, /* bits=16 0.00001106 1/65535 * (1/1.38019122262781) (0x0002c2a5)*/
84df25739fSMilanka Ringwald };
85df25739fSMilanka Ringwald
86df25739fSMilanka Ringwald
87df25739fSMilanka Ringwald const OI_UINT32 dequant_long_unscaled[17] = {
88df25739fSMilanka Ringwald 0,
89df25739fSMilanka Ringwald 0,
90df25739fSMilanka Ringwald 0x2aaaaaab, /* bits=2 0.33333333 1/3 (0x00000005)*/
91df25739fSMilanka Ringwald 0x12492492, /* bits=3 0.14285714 1/7 (0x0000000e)*/
92df25739fSMilanka Ringwald 0x08888889, /* bits=4 0.06666667 1/15 (0x0000001d)*/
93df25739fSMilanka Ringwald 0x04210842, /* bits=5 0.03225806 1/31 (0x0000003e)*/
94df25739fSMilanka Ringwald 0x02082082, /* bits=6 0.01587302 1/63 (0x0000007e)*/
95df25739fSMilanka Ringwald 0x01020408, /* bits=7 0.00787402 1/127 (0x000000fe)*/
96df25739fSMilanka Ringwald 0x00808081, /* bits=8 0.00392157 1/255 (0x000001fd)*/
97df25739fSMilanka Ringwald 0x00402010, /* bits=9 0.00195695 1/511 (0x000003fe)*/
98df25739fSMilanka Ringwald 0x00200802, /* bits=10 0.00097752 1/1023 (0x000007fe)*/
99df25739fSMilanka Ringwald 0x00100200, /* bits=11 0.00048852 1/2047 (0x00000ffe)*/
100df25739fSMilanka Ringwald 0x00080080, /* bits=12 0.00024420 1/4095 (0x00001ffe)*/
101df25739fSMilanka Ringwald 0x00040020, /* bits=13 0.00012209 1/8191 (0x00003ffe)*/
102df25739fSMilanka Ringwald 0x00020008, /* bits=14 0.00006104 1/16383 (0x00007ffe)*/
103df25739fSMilanka Ringwald 0x00010002, /* bits=15 0.00003052 1/32767 (0x0000fffe)*/
104df25739fSMilanka Ringwald 0x00008001, /* bits=16 0.00001526 1/65535 (0x0001fffc)*/
105df25739fSMilanka Ringwald };
106df25739fSMilanka Ringwald
107df25739fSMilanka Ringwald #if defined(OI_DEBUG) || defined(PRINT_SAMPLES) || defined(PRINT_SCALEFACTORS)
108df25739fSMilanka Ringwald #include <stdio.h>
109df25739fSMilanka Ringwald #endif
110df25739fSMilanka Ringwald
111df25739fSMilanka Ringwald #ifdef USE_WIDE_CRC
11208b456cdSMilanka Ringwald INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next);
crc_iterate(OI_UINT8 oldcrc,OI_UINT8 next)113df25739fSMilanka Ringwald INLINE OI_CHAR crc_iterate(OI_UINT8 oldcrc, OI_UINT8 next)
114df25739fSMilanka Ringwald {
115df25739fSMilanka Ringwald OI_UINT crc;
116df25739fSMilanka Ringwald OI_UINT idx;
117df25739fSMilanka Ringwald idx = oldcrc^next;
118df25739fSMilanka Ringwald crc = crc8_wide[idx >> 1];
119df25739fSMilanka Ringwald if (idx%2) {
120df25739fSMilanka Ringwald crc &= 0xff;
121df25739fSMilanka Ringwald } else {
122df25739fSMilanka Ringwald crc >>= 8;
123df25739fSMilanka Ringwald }
124df25739fSMilanka Ringwald
125df25739fSMilanka Ringwald return crc;
126df25739fSMilanka Ringwald }
127df25739fSMilanka Ringwald
12808b456cdSMilanka Ringwald INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next);
crc_iterate_top4(OI_UINT8 oldcrc,OI_UINT8 next)129df25739fSMilanka Ringwald INLINE OI_CHAR crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next)
130df25739fSMilanka Ringwald {
131df25739fSMilanka Ringwald OI_UINT crc;
132df25739fSMilanka Ringwald OI_UINT idx;
133df25739fSMilanka Ringwald idx = (oldcrc ^ next) >> 4;
134df25739fSMilanka Ringwald crc = crc8_wide[idx>>1];
135df25739fSMilanka Ringwald if (idx%2) {
136df25739fSMilanka Ringwald crc &= 0xff;
137df25739fSMilanka Ringwald } else {
138df25739fSMilanka Ringwald crc >>= 8;
139df25739fSMilanka Ringwald }
140df25739fSMilanka Ringwald
141df25739fSMilanka Ringwald return (oldcrc << 4) ^ crc;
142df25739fSMilanka Ringwald }
143df25739fSMilanka Ringwald
144df25739fSMilanka Ringwald #else // USE_WIDE_CRC
145df25739fSMilanka Ringwald
14608b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next);
crc_iterate_top4(OI_UINT8 oldcrc,OI_UINT8 next)147df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate_top4(OI_UINT8 oldcrc, OI_UINT8 next)
148df25739fSMilanka Ringwald {
149df25739fSMilanka Ringwald return (oldcrc << 4) ^ crc8_narrow[(oldcrc^next) >> 4];
150df25739fSMilanka Ringwald }
151df25739fSMilanka Ringwald
152df25739fSMilanka Ringwald #ifdef USE_NIBBLEWISE_CRC
15308b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next);
crc_iterate(OI_UINT8 crc,OI_UINT8 next)154df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next)
155df25739fSMilanka Ringwald {
156df25739fSMilanka Ringwald crc = (crc << 4) ^ crc8_narrow[(crc^next) >> 4];
157df25739fSMilanka Ringwald crc = (crc << 4) ^ crc8_narrow[((crc>>4)^next)&0xf];
158df25739fSMilanka Ringwald
159df25739fSMilanka Ringwald return crc;
160df25739fSMilanka Ringwald }
161df25739fSMilanka Ringwald
162df25739fSMilanka Ringwald #else // USE_NIBBLEWISE_CRC
16308b456cdSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next);
crc_iterate(OI_UINT8 crc,OI_UINT8 next)164df25739fSMilanka Ringwald INLINE OI_UINT8 crc_iterate(OI_UINT8 crc, OI_UINT8 next)
165df25739fSMilanka Ringwald {
166df25739fSMilanka Ringwald return crc8_narrow[crc^next];
167df25739fSMilanka Ringwald }
168df25739fSMilanka Ringwald
169df25739fSMilanka Ringwald #endif // USE_NIBBLEWISE_CRC
170df25739fSMilanka Ringwald
171df25739fSMilanka Ringwald #endif // USE_WIDE_CRC
172df25739fSMilanka Ringwald
OI_SBC_CalculateChecksum_mSBC(OI_CODEC_SBC_FRAME_INFO * frame,OI_BYTE const * data)173fcb08cdbSMilanka Ringwald PRIVATE OI_UINT8 OI_SBC_CalculateChecksum_mSBC(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data)
174fcb08cdbSMilanka Ringwald {
175fcb08cdbSMilanka Ringwald OI_UINT i;
176fcb08cdbSMilanka Ringwald OI_UINT8 crc = 0x0f;
177fcb08cdbSMilanka Ringwald /* Count is the number of whole bytes subject to CRC. Actually, it's one
178fcb08cdbSMilanka Ringwald * more than this number, because data[3] is the CRC field itself, which is
179fcb08cdbSMilanka Ringwald * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper
180fcb08cdbSMilanka Ringwald * spacewise to include the check in the loop. This shouldn't be much of a
181fcb08cdbSMilanka Ringwald * bottleneck routine in the first place. */
182fcb08cdbSMilanka Ringwald
183fcb08cdbSMilanka Ringwald // 0 - syncword (skip)
184fcb08cdbSMilanka Ringwald // 1 - reserved
185fcb08cdbSMilanka Ringwald crc = crc_iterate(crc,frame->reserved_for_future_use[0]);
186fcb08cdbSMilanka Ringwald // 2 - reserved
187fcb08cdbSMilanka Ringwald crc = crc_iterate(crc,frame->reserved_for_future_use[1]);
188fcb08cdbSMilanka Ringwald // 3 - crc (skip)
189fcb08cdbSMilanka Ringwald // 4..7 - scale factors (8 x 4 bit = 4 byte)
190fcb08cdbSMilanka Ringwald for (i = 0; i < 4; i++) {
191fcb08cdbSMilanka Ringwald crc = crc_iterate(crc,data[4+i]);
192fcb08cdbSMilanka Ringwald }
193fcb08cdbSMilanka Ringwald return crc;
194fcb08cdbSMilanka Ringwald }
195df25739fSMilanka Ringwald
OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO * frame,OI_BYTE const * data)196df25739fSMilanka Ringwald PRIVATE OI_UINT8 OI_SBC_CalculateChecksum(OI_CODEC_SBC_FRAME_INFO *frame, OI_BYTE const *data)
197df25739fSMilanka Ringwald {
198df25739fSMilanka Ringwald OI_UINT i;
199df25739fSMilanka Ringwald OI_UINT8 crc = 0x0f;
200df25739fSMilanka Ringwald /* Count is the number of whole bytes subject to CRC. Actually, it's one
201df25739fSMilanka Ringwald * more than this number, because data[3] is the CRC field itself, which is
202df25739fSMilanka Ringwald * explicitly skipped. Since crc_iterate (should be) inlined, it's cheaper
203df25739fSMilanka Ringwald * spacewise to include the check in the loop. This shouldn't be much of a
204df25739fSMilanka Ringwald * bottleneck routine in the first place. */
205fcb08cdbSMilanka Ringwald
206df25739fSMilanka Ringwald OI_UINT count = (frame->nrof_subbands * frame->nrof_channels / 2u) + 4;
207df25739fSMilanka Ringwald
208*c1ab6cc1SMatthias Ringwald if ((frame->mode == SBC_JOINT_STEREO) && (frame->nrof_subbands == 8)) {
209df25739fSMilanka Ringwald count++;
210df25739fSMilanka Ringwald }
211df25739fSMilanka Ringwald
212df25739fSMilanka Ringwald for (i = 1; i < count; i++) {
213df25739fSMilanka Ringwald if (i != 3) {
214df25739fSMilanka Ringwald crc = crc_iterate(crc,data[i]);
215df25739fSMilanka Ringwald }
216df25739fSMilanka Ringwald }
217df25739fSMilanka Ringwald
218*c1ab6cc1SMatthias Ringwald if ((frame->mode == SBC_JOINT_STEREO) && (frame->nrof_subbands == 4)) {
219df25739fSMilanka Ringwald crc = crc_iterate_top4(crc, data[i]);
220df25739fSMilanka Ringwald }
221df25739fSMilanka Ringwald
222df25739fSMilanka Ringwald return crc;
223df25739fSMilanka Ringwald }
224df25739fSMilanka Ringwald
OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO * frame)225df25739fSMilanka Ringwald void OI_SBC_ExpandFrameFields(OI_CODEC_SBC_FRAME_INFO *frame)
226df25739fSMilanka Ringwald {
227df25739fSMilanka Ringwald frame->nrof_blocks = block_values[frame->blocks];
228df25739fSMilanka Ringwald frame->nrof_subbands = band_values[frame->subbands];
229df25739fSMilanka Ringwald
230df25739fSMilanka Ringwald frame->frequency = freq_values[frame->freqIndex];
231df25739fSMilanka Ringwald frame->nrof_channels = channel_values[frame->mode];
232df25739fSMilanka Ringwald }
233df25739fSMilanka Ringwald
234df25739fSMilanka Ringwald /**
235df25739fSMilanka Ringwald * Unrolled macro to copy 4 32-bit aligned 32-bit values backward in memory
236df25739fSMilanka Ringwald */
237df25739fSMilanka Ringwald #define COPY4WORDS_BACK(_dest, _src) \
238df25739fSMilanka Ringwald do { \
239df25739fSMilanka Ringwald OI_INT32 _a, _b, _c, _d; \
240df25739fSMilanka Ringwald _a = *--_src; \
241df25739fSMilanka Ringwald _b = *--_src; \
242df25739fSMilanka Ringwald _c = *--_src; \
243df25739fSMilanka Ringwald _d = *--_src; \
244df25739fSMilanka Ringwald *--_dest = _a; \
245df25739fSMilanka Ringwald *--_dest = _b; \
246df25739fSMilanka Ringwald *--_dest = _c; \
247df25739fSMilanka Ringwald *--_dest = _d; \
248df25739fSMilanka Ringwald } while (0)
249df25739fSMilanka Ringwald
250df25739fSMilanka Ringwald
251df25739fSMilanka Ringwald #if defined(USE_PLATFORM_MEMMOVE) || defined(USE_PLATFORM_MEMCPY)
252df25739fSMilanka Ringwald #include <string.h>
253df25739fSMilanka Ringwald #endif
shift_buffer(SBC_BUFFER_T * dest,SBC_BUFFER_T * src,OI_UINT wordCount)254df25739fSMilanka Ringwald PRIVATE void shift_buffer(SBC_BUFFER_T *dest, SBC_BUFFER_T *src, OI_UINT wordCount)
255df25739fSMilanka Ringwald {
256df25739fSMilanka Ringwald #ifdef USE_PLATFORM_MEMMOVE
257df25739fSMilanka Ringwald memmove(dest, src, wordCount * sizeof(SBC_BUFFER_T));
258df25739fSMilanka Ringwald #elif defined(USE_PLATFORM_MEMCPY)
259df25739fSMilanka Ringwald OI_ASSERT(((OI_CHAR *)(dest) - (OI_CHAR *)(src)) >= wordCount*sizeof(*dest));
260df25739fSMilanka Ringwald memcpy(dest, src, wordCount * sizeof(SBC_BUFFER_T));
261df25739fSMilanka Ringwald #else
262df25739fSMilanka Ringwald OI_UINT n;
263df25739fSMilanka Ringwald OI_INT32 *d;
264df25739fSMilanka Ringwald OI_INT32 *s;
265df25739fSMilanka Ringwald n = wordCount / 4 / (sizeof(OI_INT32)/sizeof(*dest));
266df25739fSMilanka Ringwald OI_ASSERT((n * 4 * (sizeof(OI_INT32)/sizeof(*dest))) == wordCount);
267df25739fSMilanka Ringwald
268df25739fSMilanka Ringwald d = (OI_INT32*)(dest + wordCount);
269df25739fSMilanka Ringwald s = (OI_INT32*)(src + wordCount);
270df25739fSMilanka Ringwald
271df25739fSMilanka Ringwald do {
272df25739fSMilanka Ringwald COPY4WORDS_BACK(d, s);
273df25739fSMilanka Ringwald } while (--n);
274df25739fSMilanka Ringwald #endif
275df25739fSMilanka Ringwald }
276df25739fSMilanka Ringwald /**
277df25739fSMilanka Ringwald @}
278df25739fSMilanka Ringwald */
279