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