xref: /btstack/3rd-party/bluedroid/decoder/srce/framing.c (revision fcb08cdb2a5cc54dab8235c104507f6c1550b708)
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