1 /* 2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische 3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for 4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. 5 */ 6 7 /* $Header: /nfshome/cvs/xine-lib/src/libxineadec/gsm610/gsm_decode.c,v 1.1 2002/10/12 19:12:49 tmmm Exp $ */ 8 9 #include "private.h" 10 11 #include "gsm.h" 12 #include "proto.h" 13 14 int gsm_decode P3((s, c, target), gsm s, gsm_byte * c, gsm_signal * target) 15 { 16 word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; 17 18 if (s->wav_fmt) { 19 20 uword sr = 0; 21 22 s->frame_index = !s->frame_index; 23 if (s->frame_index) { 24 25 sr = *c++; 26 LARc[0] = sr & 0x3f; sr >>= 6; 27 sr |= (uword)*c++ << 2; 28 LARc[1] = sr & 0x3f; sr >>= 6; 29 sr |= (uword)*c++ << 4; 30 LARc[2] = sr & 0x1f; sr >>= 5; 31 LARc[3] = sr & 0x1f; sr >>= 5; 32 sr |= (uword)*c++ << 2; 33 LARc[4] = sr & 0xf; sr >>= 4; 34 LARc[5] = sr & 0xf; sr >>= 4; 35 sr |= (uword)*c++ << 2; /* 5 */ 36 LARc[6] = sr & 0x7; sr >>= 3; 37 LARc[7] = sr & 0x7; sr >>= 3; 38 sr |= (uword)*c++ << 4; 39 Nc[0] = sr & 0x7f; sr >>= 7; 40 bc[0] = sr & 0x3; sr >>= 2; 41 Mc[0] = sr & 0x3; sr >>= 2; 42 sr |= (uword)*c++ << 1; 43 xmaxc[0] = sr & 0x3f; sr >>= 6; 44 xmc[0] = sr & 0x7; sr >>= 3; 45 sr = *c++; 46 xmc[1] = sr & 0x7; sr >>= 3; 47 xmc[2] = sr & 0x7; sr >>= 3; 48 sr |= (uword)*c++ << 2; 49 xmc[3] = sr & 0x7; sr >>= 3; 50 xmc[4] = sr & 0x7; sr >>= 3; 51 xmc[5] = sr & 0x7; sr >>= 3; 52 sr |= (uword)*c++ << 1; /* 10 */ 53 xmc[6] = sr & 0x7; sr >>= 3; 54 xmc[7] = sr & 0x7; sr >>= 3; 55 xmc[8] = sr & 0x7; sr >>= 3; 56 sr = *c++; 57 xmc[9] = sr & 0x7; sr >>= 3; 58 xmc[10] = sr & 0x7; sr >>= 3; 59 sr |= (uword)*c++ << 2; 60 xmc[11] = sr & 0x7; sr >>= 3; 61 xmc[12] = sr & 0x7; sr >>= 3; 62 sr |= (uword)*c++ << 4; 63 Nc[1] = sr & 0x7f; sr >>= 7; 64 bc[1] = sr & 0x3; sr >>= 2; 65 Mc[1] = sr & 0x3; sr >>= 2; 66 sr |= (uword)*c++ << 1; 67 xmaxc[1] = sr & 0x3f; sr >>= 6; 68 xmc[13] = sr & 0x7; sr >>= 3; 69 sr = *c++; /* 15 */ 70 xmc[14] = sr & 0x7; sr >>= 3; 71 xmc[15] = sr & 0x7; sr >>= 3; 72 sr |= (uword)*c++ << 2; 73 xmc[16] = sr & 0x7; sr >>= 3; 74 xmc[17] = sr & 0x7; sr >>= 3; 75 xmc[18] = sr & 0x7; sr >>= 3; 76 sr |= (uword)*c++ << 1; 77 xmc[19] = sr & 0x7; sr >>= 3; 78 xmc[20] = sr & 0x7; sr >>= 3; 79 xmc[21] = sr & 0x7; sr >>= 3; 80 sr = *c++; 81 xmc[22] = sr & 0x7; sr >>= 3; 82 xmc[23] = sr & 0x7; sr >>= 3; 83 sr |= (uword)*c++ << 2; 84 xmc[24] = sr & 0x7; sr >>= 3; 85 xmc[25] = sr & 0x7; sr >>= 3; 86 sr |= (uword)*c++ << 4; /* 20 */ 87 Nc[2] = sr & 0x7f; sr >>= 7; 88 bc[2] = sr & 0x3; sr >>= 2; 89 Mc[2] = sr & 0x3; sr >>= 2; 90 sr |= (uword)*c++ << 1; 91 xmaxc[2] = sr & 0x3f; sr >>= 6; 92 xmc[26] = sr & 0x7; sr >>= 3; 93 sr = *c++; 94 xmc[27] = sr & 0x7; sr >>= 3; 95 xmc[28] = sr & 0x7; sr >>= 3; 96 sr |= (uword)*c++ << 2; 97 xmc[29] = sr & 0x7; sr >>= 3; 98 xmc[30] = sr & 0x7; sr >>= 3; 99 xmc[31] = sr & 0x7; sr >>= 3; 100 sr |= (uword)*c++ << 1; 101 xmc[32] = sr & 0x7; sr >>= 3; 102 xmc[33] = sr & 0x7; sr >>= 3; 103 xmc[34] = sr & 0x7; sr >>= 3; 104 sr = *c++; /* 25 */ 105 xmc[35] = sr & 0x7; sr >>= 3; 106 xmc[36] = sr & 0x7; sr >>= 3; 107 sr |= (uword)*c++ << 2; 108 xmc[37] = sr & 0x7; sr >>= 3; 109 xmc[38] = sr & 0x7; sr >>= 3; 110 sr |= (uword)*c++ << 4; 111 Nc[3] = sr & 0x7f; sr >>= 7; 112 bc[3] = sr & 0x3; sr >>= 2; 113 Mc[3] = sr & 0x3; sr >>= 2; 114 sr |= (uword)*c++ << 1; 115 xmaxc[3] = sr & 0x3f; sr >>= 6; 116 xmc[39] = sr & 0x7; sr >>= 3; 117 sr = *c++; 118 xmc[40] = sr & 0x7; sr >>= 3; 119 xmc[41] = sr & 0x7; sr >>= 3; 120 sr |= (uword)*c++ << 2; /* 30 */ 121 xmc[42] = sr & 0x7; sr >>= 3; 122 xmc[43] = sr & 0x7; sr >>= 3; 123 xmc[44] = sr & 0x7; sr >>= 3; 124 sr |= (uword)*c++ << 1; 125 xmc[45] = sr & 0x7; sr >>= 3; 126 xmc[46] = sr & 0x7; sr >>= 3; 127 xmc[47] = sr & 0x7; sr >>= 3; 128 sr = *c++; 129 xmc[48] = sr & 0x7; sr >>= 3; 130 xmc[49] = sr & 0x7; sr >>= 3; 131 sr |= (uword)*c++ << 2; 132 xmc[50] = sr & 0x7; sr >>= 3; 133 xmc[51] = sr & 0x7; sr >>= 3; 134 135 s->frame_chain = sr & 0xf; 136 } 137 else { 138 sr = s->frame_chain; 139 sr |= (uword)*c++ << 4; /* 1 */ 140 LARc[0] = sr & 0x3f; sr >>= 6; 141 LARc[1] = sr & 0x3f; sr >>= 6; 142 sr = *c++; 143 LARc[2] = sr & 0x1f; sr >>= 5; 144 sr |= (uword)*c++ << 3; 145 LARc[3] = sr & 0x1f; sr >>= 5; 146 LARc[4] = sr & 0xf; sr >>= 4; 147 sr |= (uword)*c++ << 2; 148 LARc[5] = sr & 0xf; sr >>= 4; 149 LARc[6] = sr & 0x7; sr >>= 3; 150 LARc[7] = sr & 0x7; sr >>= 3; 151 sr = *c++; /* 5 */ 152 Nc[0] = sr & 0x7f; sr >>= 7; 153 sr |= (uword)*c++ << 1; 154 bc[0] = sr & 0x3; sr >>= 2; 155 Mc[0] = sr & 0x3; sr >>= 2; 156 sr |= (uword)*c++ << 5; 157 xmaxc[0] = sr & 0x3f; sr >>= 6; 158 xmc[0] = sr & 0x7; sr >>= 3; 159 xmc[1] = sr & 0x7; sr >>= 3; 160 sr |= (uword)*c++ << 1; 161 xmc[2] = sr & 0x7; sr >>= 3; 162 xmc[3] = sr & 0x7; sr >>= 3; 163 xmc[4] = sr & 0x7; sr >>= 3; 164 sr = *c++; 165 xmc[5] = sr & 0x7; sr >>= 3; 166 xmc[6] = sr & 0x7; sr >>= 3; 167 sr |= (uword)*c++ << 2; /* 10 */ 168 xmc[7] = sr & 0x7; sr >>= 3; 169 xmc[8] = sr & 0x7; sr >>= 3; 170 xmc[9] = sr & 0x7; sr >>= 3; 171 sr |= (uword)*c++ << 1; 172 xmc[10] = sr & 0x7; sr >>= 3; 173 xmc[11] = sr & 0x7; sr >>= 3; 174 xmc[12] = sr & 0x7; sr >>= 3; 175 sr = *c++; 176 Nc[1] = sr & 0x7f; sr >>= 7; 177 sr |= (uword)*c++ << 1; 178 bc[1] = sr & 0x3; sr >>= 2; 179 Mc[1] = sr & 0x3; sr >>= 2; 180 sr |= (uword)*c++ << 5; 181 xmaxc[1] = sr & 0x3f; sr >>= 6; 182 xmc[13] = sr & 0x7; sr >>= 3; 183 xmc[14] = sr & 0x7; sr >>= 3; 184 sr |= (uword)*c++ << 1; /* 15 */ 185 xmc[15] = sr & 0x7; sr >>= 3; 186 xmc[16] = sr & 0x7; sr >>= 3; 187 xmc[17] = sr & 0x7; sr >>= 3; 188 sr = *c++; 189 xmc[18] = sr & 0x7; sr >>= 3; 190 xmc[19] = sr & 0x7; sr >>= 3; 191 sr |= (uword)*c++ << 2; 192 xmc[20] = sr & 0x7; sr >>= 3; 193 xmc[21] = sr & 0x7; sr >>= 3; 194 xmc[22] = sr & 0x7; sr >>= 3; 195 sr |= (uword)*c++ << 1; 196 xmc[23] = sr & 0x7; sr >>= 3; 197 xmc[24] = sr & 0x7; sr >>= 3; 198 xmc[25] = sr & 0x7; sr >>= 3; 199 sr = *c++; 200 Nc[2] = sr & 0x7f; sr >>= 7; 201 sr |= (uword)*c++ << 1; /* 20 */ 202 bc[2] = sr & 0x3; sr >>= 2; 203 Mc[2] = sr & 0x3; sr >>= 2; 204 sr |= (uword)*c++ << 5; 205 xmaxc[2] = sr & 0x3f; sr >>= 6; 206 xmc[26] = sr & 0x7; sr >>= 3; 207 xmc[27] = sr & 0x7; sr >>= 3; 208 sr |= (uword)*c++ << 1; 209 xmc[28] = sr & 0x7; sr >>= 3; 210 xmc[29] = sr & 0x7; sr >>= 3; 211 xmc[30] = sr & 0x7; sr >>= 3; 212 sr = *c++; 213 xmc[31] = sr & 0x7; sr >>= 3; 214 xmc[32] = sr & 0x7; sr >>= 3; 215 sr |= (uword)*c++ << 2; 216 xmc[33] = sr & 0x7; sr >>= 3; 217 xmc[34] = sr & 0x7; sr >>= 3; 218 xmc[35] = sr & 0x7; sr >>= 3; 219 sr |= (uword)*c++ << 1; /* 25 */ 220 xmc[36] = sr & 0x7; sr >>= 3; 221 xmc[37] = sr & 0x7; sr >>= 3; 222 xmc[38] = sr & 0x7; sr >>= 3; 223 sr = *c++; 224 Nc[3] = sr & 0x7f; sr >>= 7; 225 sr |= (uword)*c++ << 1; 226 bc[3] = sr & 0x3; sr >>= 2; 227 Mc[3] = sr & 0x3; sr >>= 2; 228 sr |= (uword)*c++ << 5; 229 xmaxc[3] = sr & 0x3f; sr >>= 6; 230 xmc[39] = sr & 0x7; sr >>= 3; 231 xmc[40] = sr & 0x7; sr >>= 3; 232 sr |= (uword)*c++ << 1; 233 xmc[41] = sr & 0x7; sr >>= 3; 234 xmc[42] = sr & 0x7; sr >>= 3; 235 xmc[43] = sr & 0x7; sr >>= 3; 236 sr = *c++; /* 30 */ 237 xmc[44] = sr & 0x7; sr >>= 3; 238 xmc[45] = sr & 0x7; sr >>= 3; 239 sr |= (uword)*c++ << 2; 240 xmc[46] = sr & 0x7; sr >>= 3; 241 xmc[47] = sr & 0x7; sr >>= 3; 242 xmc[48] = sr & 0x7; sr >>= 3; 243 sr |= (uword)*c++ << 1; 244 xmc[49] = sr & 0x7; sr >>= 3; 245 xmc[50] = sr & 0x7; sr >>= 3; 246 xmc[51] = sr & 0x7; sr >>= 3; 247 } 248 } 249 else 250 { 251 /* GSM_MAGIC = (*c >> 4) & 0xF; */ 252 253 if (((*c >> 4) & 0x0F) != GSM_MAGIC) return -1; 254 255 LARc[0] = (*c++ & 0xF) << 2; /* 1 */ 256 LARc[0] |= (*c >> 6) & 0x3; 257 LARc[1] = *c++ & 0x3F; 258 LARc[2] = (*c >> 3) & 0x1F; 259 LARc[3] = (*c++ & 0x7) << 2; 260 LARc[3] |= (*c >> 6) & 0x3; 261 LARc[4] = (*c >> 2) & 0xF; 262 LARc[5] = (*c++ & 0x3) << 2; 263 LARc[5] |= (*c >> 6) & 0x3; 264 LARc[6] = (*c >> 3) & 0x7; 265 LARc[7] = *c++ & 0x7; 266 Nc[0] = (*c >> 1) & 0x7F; 267 bc[0] = (*c++ & 0x1) << 1; 268 bc[0] |= (*c >> 7) & 0x1; 269 Mc[0] = (*c >> 5) & 0x3; 270 xmaxc[0] = (*c++ & 0x1F) << 1; 271 xmaxc[0] |= (*c >> 7) & 0x1; 272 xmc[0] = (*c >> 4) & 0x7; 273 xmc[1] = (*c >> 1) & 0x7; 274 xmc[2] = (*c++ & 0x1) << 2; 275 xmc[2] |= (*c >> 6) & 0x3; 276 xmc[3] = (*c >> 3) & 0x7; 277 xmc[4] = *c++ & 0x7; 278 xmc[5] = (*c >> 5) & 0x7; 279 xmc[6] = (*c >> 2) & 0x7; 280 xmc[7] = (*c++ & 0x3) << 1; /* 10 */ 281 xmc[7] |= (*c >> 7) & 0x1; 282 xmc[8] = (*c >> 4) & 0x7; 283 xmc[9] = (*c >> 1) & 0x7; 284 xmc[10] = (*c++ & 0x1) << 2; 285 xmc[10] |= (*c >> 6) & 0x3; 286 xmc[11] = (*c >> 3) & 0x7; 287 xmc[12] = *c++ & 0x7; 288 Nc[1] = (*c >> 1) & 0x7F; 289 bc[1] = (*c++ & 0x1) << 1; 290 bc[1] |= (*c >> 7) & 0x1; 291 Mc[1] = (*c >> 5) & 0x3; 292 xmaxc[1] = (*c++ & 0x1F) << 1; 293 xmaxc[1] |= (*c >> 7) & 0x1; 294 xmc[13] = (*c >> 4) & 0x7; 295 xmc[14] = (*c >> 1) & 0x7; 296 xmc[15] = (*c++ & 0x1) << 2; 297 xmc[15] |= (*c >> 6) & 0x3; 298 xmc[16] = (*c >> 3) & 0x7; 299 xmc[17] = *c++ & 0x7; 300 xmc[18] = (*c >> 5) & 0x7; 301 xmc[19] = (*c >> 2) & 0x7; 302 xmc[20] = (*c++ & 0x3) << 1; 303 xmc[20] |= (*c >> 7) & 0x1; 304 xmc[21] = (*c >> 4) & 0x7; 305 xmc[22] = (*c >> 1) & 0x7; 306 xmc[23] = (*c++ & 0x1) << 2; 307 xmc[23] |= (*c >> 6) & 0x3; 308 xmc[24] = (*c >> 3) & 0x7; 309 xmc[25] = *c++ & 0x7; 310 Nc[2] = (*c >> 1) & 0x7F; 311 bc[2] = (*c++ & 0x1) << 1; /* 20 */ 312 bc[2] |= (*c >> 7) & 0x1; 313 Mc[2] = (*c >> 5) & 0x3; 314 xmaxc[2] = (*c++ & 0x1F) << 1; 315 xmaxc[2] |= (*c >> 7) & 0x1; 316 xmc[26] = (*c >> 4) & 0x7; 317 xmc[27] = (*c >> 1) & 0x7; 318 xmc[28] = (*c++ & 0x1) << 2; 319 xmc[28] |= (*c >> 6) & 0x3; 320 xmc[29] = (*c >> 3) & 0x7; 321 xmc[30] = *c++ & 0x7; 322 xmc[31] = (*c >> 5) & 0x7; 323 xmc[32] = (*c >> 2) & 0x7; 324 xmc[33] = (*c++ & 0x3) << 1; 325 xmc[33] |= (*c >> 7) & 0x1; 326 xmc[34] = (*c >> 4) & 0x7; 327 xmc[35] = (*c >> 1) & 0x7; 328 xmc[36] = (*c++ & 0x1) << 2; 329 xmc[36] |= (*c >> 6) & 0x3; 330 xmc[37] = (*c >> 3) & 0x7; 331 xmc[38] = *c++ & 0x7; 332 Nc[3] = (*c >> 1) & 0x7F; 333 bc[3] = (*c++ & 0x1) << 1; 334 bc[3] |= (*c >> 7) & 0x1; 335 Mc[3] = (*c >> 5) & 0x3; 336 xmaxc[3] = (*c++ & 0x1F) << 1; 337 xmaxc[3] |= (*c >> 7) & 0x1; 338 xmc[39] = (*c >> 4) & 0x7; 339 xmc[40] = (*c >> 1) & 0x7; 340 xmc[41] = (*c++ & 0x1) << 2; 341 xmc[41] |= (*c >> 6) & 0x3; 342 xmc[42] = (*c >> 3) & 0x7; 343 xmc[43] = *c++ & 0x7; /* 30 */ 344 xmc[44] = (*c >> 5) & 0x7; 345 xmc[45] = (*c >> 2) & 0x7; 346 xmc[46] = (*c++ & 0x3) << 1; 347 xmc[46] |= (*c >> 7) & 0x1; 348 xmc[47] = (*c >> 4) & 0x7; 349 xmc[48] = (*c >> 1) & 0x7; 350 xmc[49] = (*c++ & 0x1) << 2; 351 xmc[49] |= (*c >> 6) & 0x3; 352 xmc[50] = (*c >> 3) & 0x7; 353 xmc[51] = *c & 0x7; /* 33 */ 354 } 355 356 Gsm_Decoder(s, LARc, Nc, bc, Mc, xmaxc, xmc, target); 357 358 return 0; 359 } 360