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: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/gsm_encode.c,v 1.2 1996/07/02 09:59:05 jutta Exp $ */ 8 9 #include "private.h" 10 #include "gsm.h" 11 #include "proto.h" 12 13 void gsm_encode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c) 14 { 15 word LARc[8], Nc[4], Mc[4], bc[4], xmaxc[4], xmc[13*4]; 16 17 Gsm_Coder(s, source, LARc, Nc, bc, Mc, xmaxc, xmc); 18 19 20 /* variable size 21 22 GSM_MAGIC 4 23 24 LARc[0] 6 25 LARc[1] 6 26 LARc[2] 5 27 LARc[3] 5 28 LARc[4] 4 29 LARc[5] 4 30 LARc[6] 3 31 LARc[7] 3 32 33 Nc[0] 7 34 bc[0] 2 35 Mc[0] 2 36 xmaxc[0] 6 37 xmc[0] 3 38 xmc[1] 3 39 xmc[2] 3 40 xmc[3] 3 41 xmc[4] 3 42 xmc[5] 3 43 xmc[6] 3 44 xmc[7] 3 45 xmc[8] 3 46 xmc[9] 3 47 xmc[10] 3 48 xmc[11] 3 49 xmc[12] 3 50 51 Nc[1] 7 52 bc[1] 2 53 Mc[1] 2 54 xmaxc[1] 6 55 xmc[13] 3 56 xmc[14] 3 57 xmc[15] 3 58 xmc[16] 3 59 xmc[17] 3 60 xmc[18] 3 61 xmc[19] 3 62 xmc[20] 3 63 xmc[21] 3 64 xmc[22] 3 65 xmc[23] 3 66 xmc[24] 3 67 xmc[25] 3 68 69 Nc[2] 7 70 bc[2] 2 71 Mc[2] 2 72 xmaxc[2] 6 73 xmc[26] 3 74 xmc[27] 3 75 xmc[28] 3 76 xmc[29] 3 77 xmc[30] 3 78 xmc[31] 3 79 xmc[32] 3 80 xmc[33] 3 81 xmc[34] 3 82 xmc[35] 3 83 xmc[36] 3 84 xmc[37] 3 85 xmc[38] 3 86 87 Nc[3] 7 88 bc[3] 2 89 Mc[3] 2 90 xmaxc[3] 6 91 xmc[39] 3 92 xmc[40] 3 93 xmc[41] 3 94 xmc[42] 3 95 xmc[43] 3 96 xmc[44] 3 97 xmc[45] 3 98 xmc[46] 3 99 xmc[47] 3 100 xmc[48] 3 101 xmc[49] 3 102 xmc[50] 3 103 xmc[51] 3 104 */ 105 106 #ifdef WAV49 107 108 if (s->wav_fmt) { 109 s->frame_index = !s->frame_index; 110 if (s->frame_index) { 111 112 uword sr; 113 114 sr = 0; 115 sr = sr >> 6 | LARc[0] << 10; 116 sr = sr >> 6 | LARc[1] << 10; 117 *c++ = sr >> 4; 118 sr = sr >> 5 | LARc[2] << 11; 119 *c++ = sr >> 7; 120 sr = sr >> 5 | LARc[3] << 11; 121 sr = sr >> 4 | LARc[4] << 12; 122 *c++ = sr >> 6; 123 sr = sr >> 4 | LARc[5] << 12; 124 sr = sr >> 3 | LARc[6] << 13; 125 *c++ = sr >> 7; 126 sr = sr >> 3 | LARc[7] << 13; 127 sr = sr >> 7 | Nc[0] << 9; 128 *c++ = sr >> 5; 129 sr = sr >> 2 | bc[0] << 14; 130 sr = sr >> 2 | Mc[0] << 14; 131 sr = sr >> 6 | xmaxc[0] << 10; 132 *c++ = sr >> 3; 133 sr = sr >> 3 | xmc[0] << 13; 134 *c++ = sr >> 8; 135 sr = sr >> 3 | xmc[1] << 13; 136 sr = sr >> 3 | xmc[2] << 13; 137 sr = sr >> 3 | xmc[3] << 13; 138 *c++ = sr >> 7; 139 sr = sr >> 3 | xmc[4] << 13; 140 sr = sr >> 3 | xmc[5] << 13; 141 sr = sr >> 3 | xmc[6] << 13; 142 *c++ = sr >> 6; 143 sr = sr >> 3 | xmc[7] << 13; 144 sr = sr >> 3 | xmc[8] << 13; 145 *c++ = sr >> 8; 146 sr = sr >> 3 | xmc[9] << 13; 147 sr = sr >> 3 | xmc[10] << 13; 148 sr = sr >> 3 | xmc[11] << 13; 149 *c++ = sr >> 7; 150 sr = sr >> 3 | xmc[12] << 13; 151 sr = sr >> 7 | Nc[1] << 9; 152 *c++ = sr >> 5; 153 sr = sr >> 2 | bc[1] << 14; 154 sr = sr >> 2 | Mc[1] << 14; 155 sr = sr >> 6 | xmaxc[1] << 10; 156 *c++ = sr >> 3; 157 sr = sr >> 3 | xmc[13] << 13; 158 *c++ = sr >> 8; 159 sr = sr >> 3 | xmc[14] << 13; 160 sr = sr >> 3 | xmc[15] << 13; 161 sr = sr >> 3 | xmc[16] << 13; 162 *c++ = sr >> 7; 163 sr = sr >> 3 | xmc[17] << 13; 164 sr = sr >> 3 | xmc[18] << 13; 165 sr = sr >> 3 | xmc[19] << 13; 166 *c++ = sr >> 6; 167 sr = sr >> 3 | xmc[20] << 13; 168 sr = sr >> 3 | xmc[21] << 13; 169 *c++ = sr >> 8; 170 sr = sr >> 3 | xmc[22] << 13; 171 sr = sr >> 3 | xmc[23] << 13; 172 sr = sr >> 3 | xmc[24] << 13; 173 *c++ = sr >> 7; 174 sr = sr >> 3 | xmc[25] << 13; 175 sr = sr >> 7 | Nc[2] << 9; 176 *c++ = sr >> 5; 177 sr = sr >> 2 | bc[2] << 14; 178 sr = sr >> 2 | Mc[2] << 14; 179 sr = sr >> 6 | xmaxc[2] << 10; 180 *c++ = sr >> 3; 181 sr = sr >> 3 | xmc[26] << 13; 182 *c++ = sr >> 8; 183 sr = sr >> 3 | xmc[27] << 13; 184 sr = sr >> 3 | xmc[28] << 13; 185 sr = sr >> 3 | xmc[29] << 13; 186 *c++ = sr >> 7; 187 sr = sr >> 3 | xmc[30] << 13; 188 sr = sr >> 3 | xmc[31] << 13; 189 sr = sr >> 3 | xmc[32] << 13; 190 *c++ = sr >> 6; 191 sr = sr >> 3 | xmc[33] << 13; 192 sr = sr >> 3 | xmc[34] << 13; 193 *c++ = sr >> 8; 194 sr = sr >> 3 | xmc[35] << 13; 195 sr = sr >> 3 | xmc[36] << 13; 196 sr = sr >> 3 | xmc[37] << 13; 197 *c++ = sr >> 7; 198 sr = sr >> 3 | xmc[38] << 13; 199 sr = sr >> 7 | Nc[3] << 9; 200 *c++ = sr >> 5; 201 sr = sr >> 2 | bc[3] << 14; 202 sr = sr >> 2 | Mc[3] << 14; 203 sr = sr >> 6 | xmaxc[3] << 10; 204 *c++ = sr >> 3; 205 sr = sr >> 3 | xmc[39] << 13; 206 *c++ = sr >> 8; 207 sr = sr >> 3 | xmc[40] << 13; 208 sr = sr >> 3 | xmc[41] << 13; 209 sr = sr >> 3 | xmc[42] << 13; 210 *c++ = sr >> 7; 211 sr = sr >> 3 | xmc[43] << 13; 212 sr = sr >> 3 | xmc[44] << 13; 213 sr = sr >> 3 | xmc[45] << 13; 214 *c++ = sr >> 6; 215 sr = sr >> 3 | xmc[46] << 13; 216 sr = sr >> 3 | xmc[47] << 13; 217 *c++ = sr >> 8; 218 sr = sr >> 3 | xmc[48] << 13; 219 sr = sr >> 3 | xmc[49] << 13; 220 sr = sr >> 3 | xmc[50] << 13; 221 *c++ = sr >> 7; 222 sr = sr >> 3 | xmc[51] << 13; 223 sr = sr >> 4; 224 *c = sr >> 8; 225 s->frame_chain = *c; 226 } 227 else { 228 uword sr; 229 230 sr = 0; 231 sr = sr >> 4 | s->frame_chain << 12; 232 sr = sr >> 6 | LARc[0] << 10; 233 *c++ = sr >> 6; 234 sr = sr >> 6 | LARc[1] << 10; 235 *c++ = sr >> 8; 236 sr = sr >> 5 | LARc[2] << 11; 237 sr = sr >> 5 | LARc[3] << 11; 238 *c++ = sr >> 6; 239 sr = sr >> 4 | LARc[4] << 12; 240 sr = sr >> 4 | LARc[5] << 12; 241 *c++ = sr >> 6; 242 sr = sr >> 3 | LARc[6] << 13; 243 sr = sr >> 3 | LARc[7] << 13; 244 *c++ = sr >> 8; 245 sr = sr >> 7 | Nc[0] << 9; 246 sr = sr >> 2 | bc[0] << 14; 247 *c++ = sr >> 7; 248 sr = sr >> 2 | Mc[0] << 14; 249 sr = sr >> 6 | xmaxc[0] << 10; 250 *c++ = sr >> 7; 251 sr = sr >> 3 | xmc[0] << 13; 252 sr = sr >> 3 | xmc[1] << 13; 253 sr = sr >> 3 | xmc[2] << 13; 254 *c++ = sr >> 6; 255 sr = sr >> 3 | xmc[3] << 13; 256 sr = sr >> 3 | xmc[4] << 13; 257 *c++ = sr >> 8; 258 sr = sr >> 3 | xmc[5] << 13; 259 sr = sr >> 3 | xmc[6] << 13; 260 sr = sr >> 3 | xmc[7] << 13; 261 *c++ = sr >> 7; 262 sr = sr >> 3 | xmc[8] << 13; 263 sr = sr >> 3 | xmc[9] << 13; 264 sr = sr >> 3 | xmc[10] << 13; 265 *c++ = sr >> 6; 266 sr = sr >> 3 | xmc[11] << 13; 267 sr = sr >> 3 | xmc[12] << 13; 268 *c++ = sr >> 8; 269 sr = sr >> 7 | Nc[1] << 9; 270 sr = sr >> 2 | bc[1] << 14; 271 *c++ = sr >> 7; 272 sr = sr >> 2 | Mc[1] << 14; 273 sr = sr >> 6 | xmaxc[1] << 10; 274 *c++ = sr >> 7; 275 sr = sr >> 3 | xmc[13] << 13; 276 sr = sr >> 3 | xmc[14] << 13; 277 sr = sr >> 3 | xmc[15] << 13; 278 *c++ = sr >> 6; 279 sr = sr >> 3 | xmc[16] << 13; 280 sr = sr >> 3 | xmc[17] << 13; 281 *c++ = sr >> 8; 282 sr = sr >> 3 | xmc[18] << 13; 283 sr = sr >> 3 | xmc[19] << 13; 284 sr = sr >> 3 | xmc[20] << 13; 285 *c++ = sr >> 7; 286 sr = sr >> 3 | xmc[21] << 13; 287 sr = sr >> 3 | xmc[22] << 13; 288 sr = sr >> 3 | xmc[23] << 13; 289 *c++ = sr >> 6; 290 sr = sr >> 3 | xmc[24] << 13; 291 sr = sr >> 3 | xmc[25] << 13; 292 *c++ = sr >> 8; 293 sr = sr >> 7 | Nc[2] << 9; 294 sr = sr >> 2 | bc[2] << 14; 295 *c++ = sr >> 7; 296 sr = sr >> 2 | Mc[2] << 14; 297 sr = sr >> 6 | xmaxc[2] << 10; 298 *c++ = sr >> 7; 299 sr = sr >> 3 | xmc[26] << 13; 300 sr = sr >> 3 | xmc[27] << 13; 301 sr = sr >> 3 | xmc[28] << 13; 302 *c++ = sr >> 6; 303 sr = sr >> 3 | xmc[29] << 13; 304 sr = sr >> 3 | xmc[30] << 13; 305 *c++ = sr >> 8; 306 sr = sr >> 3 | xmc[31] << 13; 307 sr = sr >> 3 | xmc[32] << 13; 308 sr = sr >> 3 | xmc[33] << 13; 309 *c++ = sr >> 7; 310 sr = sr >> 3 | xmc[34] << 13; 311 sr = sr >> 3 | xmc[35] << 13; 312 sr = sr >> 3 | xmc[36] << 13; 313 *c++ = sr >> 6; 314 sr = sr >> 3 | xmc[37] << 13; 315 sr = sr >> 3 | xmc[38] << 13; 316 *c++ = sr >> 8; 317 sr = sr >> 7 | Nc[3] << 9; 318 sr = sr >> 2 | bc[3] << 14; 319 *c++ = sr >> 7; 320 sr = sr >> 2 | Mc[3] << 14; 321 sr = sr >> 6 | xmaxc[3] << 10; 322 *c++ = sr >> 7; 323 sr = sr >> 3 | xmc[39] << 13; 324 sr = sr >> 3 | xmc[40] << 13; 325 sr = sr >> 3 | xmc[41] << 13; 326 *c++ = sr >> 6; 327 sr = sr >> 3 | xmc[42] << 13; 328 sr = sr >> 3 | xmc[43] << 13; 329 *c++ = sr >> 8; 330 sr = sr >> 3 | xmc[44] << 13; 331 sr = sr >> 3 | xmc[45] << 13; 332 sr = sr >> 3 | xmc[46] << 13; 333 *c++ = sr >> 7; 334 sr = sr >> 3 | xmc[47] << 13; 335 sr = sr >> 3 | xmc[48] << 13; 336 sr = sr >> 3 | xmc[49] << 13; 337 *c++ = sr >> 6; 338 sr = sr >> 3 | xmc[50] << 13; 339 sr = sr >> 3 | xmc[51] << 13; 340 *c++ = sr >> 8; 341 } 342 } 343 344 else 345 346 #endif /* WAV49 */ 347 { 348 349 *c++ = ((GSM_MAGIC & 0xF) << 4) /* 1 */ 350 | ((LARc[0] >> 2) & 0xF); 351 *c++ = ((LARc[0] & 0x3) << 6) 352 | (LARc[1] & 0x3F); 353 *c++ = ((LARc[2] & 0x1F) << 3) 354 | ((LARc[3] >> 2) & 0x7); 355 *c++ = ((LARc[3] & 0x3) << 6) 356 | ((LARc[4] & 0xF) << 2) 357 | ((LARc[5] >> 2) & 0x3); 358 *c++ = ((LARc[5] & 0x3) << 6) 359 | ((LARc[6] & 0x7) << 3) 360 | (LARc[7] & 0x7); 361 *c++ = ((Nc[0] & 0x7F) << 1) 362 | ((bc[0] >> 1) & 0x1); 363 *c++ = ((bc[0] & 0x1) << 7) 364 | ((Mc[0] & 0x3) << 5) 365 | ((xmaxc[0] >> 1) & 0x1F); 366 *c++ = ((xmaxc[0] & 0x1) << 7) 367 | ((xmc[0] & 0x7) << 4) 368 | ((xmc[1] & 0x7) << 1) 369 | ((xmc[2] >> 2) & 0x1); 370 *c++ = ((xmc[2] & 0x3) << 6) 371 | ((xmc[3] & 0x7) << 3) 372 | (xmc[4] & 0x7); 373 *c++ = ((xmc[5] & 0x7) << 5) /* 10 */ 374 | ((xmc[6] & 0x7) << 2) 375 | ((xmc[7] >> 1) & 0x3); 376 *c++ = ((xmc[7] & 0x1) << 7) 377 | ((xmc[8] & 0x7) << 4) 378 | ((xmc[9] & 0x7) << 1) 379 | ((xmc[10] >> 2) & 0x1); 380 *c++ = ((xmc[10] & 0x3) << 6) 381 | ((xmc[11] & 0x7) << 3) 382 | (xmc[12] & 0x7); 383 *c++ = ((Nc[1] & 0x7F) << 1) 384 | ((bc[1] >> 1) & 0x1); 385 *c++ = ((bc[1] & 0x1) << 7) 386 | ((Mc[1] & 0x3) << 5) 387 | ((xmaxc[1] >> 1) & 0x1F); 388 *c++ = ((xmaxc[1] & 0x1) << 7) 389 | ((xmc[13] & 0x7) << 4) 390 | ((xmc[14] & 0x7) << 1) 391 | ((xmc[15] >> 2) & 0x1); 392 *c++ = ((xmc[15] & 0x3) << 6) 393 | ((xmc[16] & 0x7) << 3) 394 | (xmc[17] & 0x7); 395 *c++ = ((xmc[18] & 0x7) << 5) 396 | ((xmc[19] & 0x7) << 2) 397 | ((xmc[20] >> 1) & 0x3); 398 *c++ = ((xmc[20] & 0x1) << 7) 399 | ((xmc[21] & 0x7) << 4) 400 | ((xmc[22] & 0x7) << 1) 401 | ((xmc[23] >> 2) & 0x1); 402 *c++ = ((xmc[23] & 0x3) << 6) 403 | ((xmc[24] & 0x7) << 3) 404 | (xmc[25] & 0x7); 405 *c++ = ((Nc[2] & 0x7F) << 1) /* 20 */ 406 | ((bc[2] >> 1) & 0x1); 407 *c++ = ((bc[2] & 0x1) << 7) 408 | ((Mc[2] & 0x3) << 5) 409 | ((xmaxc[2] >> 1) & 0x1F); 410 *c++ = ((xmaxc[2] & 0x1) << 7) 411 | ((xmc[26] & 0x7) << 4) 412 | ((xmc[27] & 0x7) << 1) 413 | ((xmc[28] >> 2) & 0x1); 414 *c++ = ((xmc[28] & 0x3) << 6) 415 | ((xmc[29] & 0x7) << 3) 416 | (xmc[30] & 0x7); 417 *c++ = ((xmc[31] & 0x7) << 5) 418 | ((xmc[32] & 0x7) << 2) 419 | ((xmc[33] >> 1) & 0x3); 420 *c++ = ((xmc[33] & 0x1) << 7) 421 | ((xmc[34] & 0x7) << 4) 422 | ((xmc[35] & 0x7) << 1) 423 | ((xmc[36] >> 2) & 0x1); 424 *c++ = ((xmc[36] & 0x3) << 6) 425 | ((xmc[37] & 0x7) << 3) 426 | (xmc[38] & 0x7); 427 *c++ = ((Nc[3] & 0x7F) << 1) 428 | ((bc[3] >> 1) & 0x1); 429 *c++ = ((bc[3] & 0x1) << 7) 430 | ((Mc[3] & 0x3) << 5) 431 | ((xmaxc[3] >> 1) & 0x1F); 432 *c++ = ((xmaxc[3] & 0x1) << 7) 433 | ((xmc[39] & 0x7) << 4) 434 | ((xmc[40] & 0x7) << 1) 435 | ((xmc[41] >> 2) & 0x1); 436 *c++ = ((xmc[41] & 0x3) << 6) /* 30 */ 437 | ((xmc[42] & 0x7) << 3) 438 | (xmc[43] & 0x7); 439 *c++ = ((xmc[44] & 0x7) << 5) 440 | ((xmc[45] & 0x7) << 2) 441 | ((xmc[46] >> 1) & 0x3); 442 *c++ = ((xmc[46] & 0x1) << 7) 443 | ((xmc[47] & 0x7) << 4) 444 | ((xmc[48] & 0x7) << 1) 445 | ((xmc[49] >> 2) & 0x1); 446 *c++ = ((xmc[49] & 0x3) << 6) 447 | ((xmc[50] & 0x7) << 3) 448 | (xmc[51] & 0x7); 449 450 } 451 } 452