00001
00002
00003
00004
00005
00006
00007
00008
00009 #include "private.h"
00010
00011 #include "gsm.h"
00012 #include "proto.h"
00013
00014 void gsm_implode P3((s, source, c), gsm s, gsm_signal * source, gsm_byte * c)
00015 {
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109 # define LARc source
00110 # define Nc *((gsm_signal (*) [17])(source + 8))
00111 # define bc *((gsm_signal (*) [17])(source + 9))
00112 # define Mc *((gsm_signal (*) [17])(source + 10))
00113 # define xmaxc *((gsm_signal (*) [17])(source + 11))
00114
00115 #ifdef WAV49
00116 if (s->wav_fmt) {
00117
00118 uword sr = 0;
00119 if (s->frame_index == 0) {
00120
00121 sr = *c++;
00122 LARc[0] = sr & 0x3f; sr >>= 6;
00123 sr |= (uword)*c++ << 2;
00124 LARc[1] = sr & 0x3f; sr >>= 6;
00125 sr |= (uword)*c++ << 4;
00126 LARc[2] = sr & 0x1f; sr >>= 5;
00127 LARc[3] = sr & 0x1f; sr >>= 5;
00128 sr |= (uword)*c++ << 2;
00129 LARc[4] = sr & 0xf; sr >>= 4;
00130 LARc[5] = sr & 0xf; sr >>= 4;
00131 sr |= (uword)*c++ << 2;
00132 LARc[6] = sr & 0x7; sr >>= 3;
00133 LARc[7] = sr & 0x7; sr >>= 3;
00134 sr |= (uword)*c++ << 4;
00135 Nc[0] = sr & 0x7f; sr >>= 7;
00136 bc[0] = sr & 0x3; sr >>= 2;
00137 Mc[0] = sr & 0x3; sr >>= 2;
00138 sr |= (uword)*c++ << 1;
00139 xmaxc[0] = sr & 0x3f; sr >>= 6;
00140 #undef xmc
00141 #define xmc (source + 12)
00142 xmc[0] = sr & 0x7; sr >>= 3;
00143 sr = *c++;
00144 xmc[1] = sr & 0x7; sr >>= 3;
00145 xmc[2] = sr & 0x7; sr >>= 3;
00146 sr |= (uword)*c++ << 2;
00147 xmc[3] = sr & 0x7; sr >>= 3;
00148 xmc[4] = sr & 0x7; sr >>= 3;
00149 xmc[5] = sr & 0x7; sr >>= 3;
00150 sr |= (uword)*c++ << 1;
00151 xmc[6] = sr & 0x7; sr >>= 3;
00152 xmc[7] = sr & 0x7; sr >>= 3;
00153 xmc[8] = sr & 0x7; sr >>= 3;
00154 sr = *c++;
00155 xmc[9] = sr & 0x7; sr >>= 3;
00156 xmc[10] = sr & 0x7; sr >>= 3;
00157 sr |= (uword)*c++ << 2;
00158 xmc[11] = sr & 0x7; sr >>= 3;
00159 xmc[12] = sr & 0x7; sr >>= 3;
00160 sr |= (uword)*c++ << 4;
00161 Nc[1] = sr & 0x7f; sr >>= 7;
00162 bc[1] = sr & 0x3; sr >>= 2;
00163 Mc[1] = sr & 0x3; sr >>= 2;
00164 sr |= (uword)*c++ << 1;
00165 xmaxc[1] = sr & 0x3f; sr >>= 6;
00166 #undef xmc
00167 #define xmc (source + 29 - 13)
00168 xmc[13] = sr & 0x7; sr >>= 3;
00169 sr = *c++;
00170 xmc[14] = sr & 0x7; sr >>= 3;
00171 xmc[15] = sr & 0x7; sr >>= 3;
00172 sr |= (uword)*c++ << 2;
00173 xmc[16] = sr & 0x7; sr >>= 3;
00174 xmc[17] = sr & 0x7; sr >>= 3;
00175 xmc[18] = sr & 0x7; sr >>= 3;
00176 sr |= (uword)*c++ << 1;
00177 xmc[19] = sr & 0x7; sr >>= 3;
00178 xmc[20] = sr & 0x7; sr >>= 3;
00179 xmc[21] = sr & 0x7; sr >>= 3;
00180 sr = *c++;
00181 xmc[22] = sr & 0x7; sr >>= 3;
00182 xmc[23] = sr & 0x7; sr >>= 3;
00183 sr |= (uword)*c++ << 2;
00184 xmc[24] = sr & 0x7; sr >>= 3;
00185 xmc[25] = sr & 0x7; sr >>= 3;
00186 sr |= (uword)*c++ << 4;
00187 Nc[2] = sr & 0x7f; sr >>= 7;
00188 bc[2] = sr & 0x3; sr >>= 2;
00189 Mc[2] = sr & 0x3; sr >>= 2;
00190 sr |= (uword)*c++ << 1;
00191 xmaxc[2] = sr & 0x3f; sr >>= 6;
00192 #undef xmc
00193 #define xmc (source + 46 - 26)
00194 xmc[26] = sr & 0x7; sr >>= 3;
00195 sr = *c++;
00196 xmc[27] = sr & 0x7; sr >>= 3;
00197 xmc[28] = sr & 0x7; sr >>= 3;
00198 sr |= (uword)*c++ << 2;
00199 xmc[29] = sr & 0x7; sr >>= 3;
00200 xmc[30] = sr & 0x7; sr >>= 3;
00201 xmc[31] = sr & 0x7; sr >>= 3;
00202 sr |= (uword)*c++ << 1;
00203 xmc[32] = sr & 0x7; sr >>= 3;
00204 xmc[33] = sr & 0x7; sr >>= 3;
00205 xmc[34] = sr & 0x7; sr >>= 3;
00206 sr = *c++;
00207 xmc[35] = sr & 0x7; sr >>= 3;
00208 xmc[36] = sr & 0x7; sr >>= 3;
00209 sr |= (uword)*c++ << 2;
00210 xmc[37] = sr & 0x7; sr >>= 3;
00211 xmc[38] = sr & 0x7; sr >>= 3;
00212 sr |= (uword)*c++ << 4;
00213 Nc[3] = sr & 0x7f; sr >>= 7;
00214 bc[3] = sr & 0x3; sr >>= 2;
00215 Mc[3] = sr & 0x3; sr >>= 2;
00216 sr |= (uword)*c++ << 1;
00217 xmaxc[3] = sr & 0x3f; sr >>= 6;
00218 #undef xmc
00219 #define xmc (source + 63 - 39)
00220
00221 xmc[39] = sr & 0x7; sr >>= 3;
00222 sr = *c++;
00223 xmc[40] = sr & 0x7; sr >>= 3;
00224 xmc[41] = sr & 0x7; sr >>= 3;
00225 sr |= (uword)*c++ << 2;
00226 xmc[42] = sr & 0x7; sr >>= 3;
00227 xmc[43] = sr & 0x7; sr >>= 3;
00228 xmc[44] = sr & 0x7; sr >>= 3;
00229 sr |= (uword)*c++ << 1;
00230 xmc[45] = sr & 0x7; sr >>= 3;
00231 xmc[46] = sr & 0x7; sr >>= 3;
00232 xmc[47] = sr & 0x7; sr >>= 3;
00233 sr = *c++;
00234 xmc[48] = sr & 0x7; sr >>= 3;
00235 xmc[49] = sr & 0x7; sr >>= 3;
00236 sr |= (uword)*c++ << 2;
00237 xmc[50] = sr & 0x7; sr >>= 3;
00238 xmc[51] = sr & 0x7; sr >>= 3;
00239
00240 s->frame_chain = sr & 0xf;
00241 }
00242 else {
00243 sr = s->frame_chain;
00244 sr |= (uword)*c++ << 4;
00245 LARc[0] = sr & 0x3f; sr >>= 6;
00246 LARc[1] = sr & 0x3f; sr >>= 6;
00247 sr = *c++;
00248 LARc[2] = sr & 0x1f; sr >>= 5;
00249 sr |= (uword)*c++ << 3;
00250 LARc[3] = sr & 0x1f; sr >>= 5;
00251 LARc[4] = sr & 0xf; sr >>= 4;
00252 sr |= (uword)*c++ << 2;
00253 LARc[5] = sr & 0xf; sr >>= 4;
00254 LARc[6] = sr & 0x7; sr >>= 3;
00255 LARc[7] = sr & 0x7; sr >>= 3;
00256 sr = *c++;
00257 Nc[0] = sr & 0x7f; sr >>= 7;
00258 sr |= (uword)*c++ << 1;
00259 bc[0] = sr & 0x3; sr >>= 2;
00260 Mc[0] = sr & 0x3; sr >>= 2;
00261 sr |= (uword)*c++ << 5;
00262 xmaxc[0] = sr & 0x3f; sr >>= 6;
00263 #undef xmc
00264 #define xmc (source + 12)
00265 xmc[0] = sr & 0x7; sr >>= 3;
00266 xmc[1] = sr & 0x7; sr >>= 3;
00267 sr |= (uword)*c++ << 1;
00268 xmc[2] = sr & 0x7; sr >>= 3;
00269 xmc[3] = sr & 0x7; sr >>= 3;
00270 xmc[4] = sr & 0x7; sr >>= 3;
00271 sr = *c++;
00272 xmc[5] = sr & 0x7; sr >>= 3;
00273 xmc[6] = sr & 0x7; sr >>= 3;
00274 sr |= (uword)*c++ << 2;
00275 xmc[7] = sr & 0x7; sr >>= 3;
00276 xmc[8] = sr & 0x7; sr >>= 3;
00277 xmc[9] = sr & 0x7; sr >>= 3;
00278 sr |= (uword)*c++ << 1;
00279 xmc[10] = sr & 0x7; sr >>= 3;
00280 xmc[11] = sr & 0x7; sr >>= 3;
00281 xmc[12] = sr & 0x7; sr >>= 3;
00282 sr = *c++;
00283 Nc[1] = sr & 0x7f; sr >>= 7;
00284 sr |= (uword)*c++ << 1;
00285 bc[1] = sr & 0x3; sr >>= 2;
00286 Mc[1] = sr & 0x3; sr >>= 2;
00287 sr |= (uword)*c++ << 5;
00288 xmaxc[1] = sr & 0x3f; sr >>= 6;
00289 #undef xmc
00290 #define xmc (source + 29 - 13)
00291 xmc[13] = sr & 0x7; sr >>= 3;
00292 xmc[14] = sr & 0x7; sr >>= 3;
00293 sr |= (uword)*c++ << 1;
00294 xmc[15] = sr & 0x7; sr >>= 3;
00295 xmc[16] = sr & 0x7; sr >>= 3;
00296 xmc[17] = sr & 0x7; sr >>= 3;
00297 sr = *c++;
00298 xmc[18] = sr & 0x7; sr >>= 3;
00299 xmc[19] = sr & 0x7; sr >>= 3;
00300 sr |= (uword)*c++ << 2;
00301 xmc[20] = sr & 0x7; sr >>= 3;
00302 xmc[21] = sr & 0x7; sr >>= 3;
00303 xmc[22] = sr & 0x7; sr >>= 3;
00304 sr |= (uword)*c++ << 1;
00305 xmc[23] = sr & 0x7; sr >>= 3;
00306 xmc[24] = sr & 0x7; sr >>= 3;
00307 xmc[25] = sr & 0x7; sr >>= 3;
00308 sr = *c++;
00309 Nc[2] = sr & 0x7f; sr >>= 7;
00310 sr |= (uword)*c++ << 1;
00311 bc[2] = sr & 0x3; sr >>= 2;
00312 Mc[2] = sr & 0x3; sr >>= 2;
00313 sr |= (uword)*c++ << 5;
00314 xmaxc[2] = sr & 0x3f; sr >>= 6;
00315 #undef xmc
00316 #define xmc (source + 46 - 26)
00317 xmc[26] = sr & 0x7; sr >>= 3;
00318 xmc[27] = sr & 0x7; sr >>= 3;
00319 sr |= (uword)*c++ << 1;
00320 xmc[28] = sr & 0x7; sr >>= 3;
00321 xmc[29] = sr & 0x7; sr >>= 3;
00322 xmc[30] = sr & 0x7; sr >>= 3;
00323 sr = *c++;
00324 xmc[31] = sr & 0x7; sr >>= 3;
00325 xmc[32] = sr & 0x7; sr >>= 3;
00326 sr |= (uword)*c++ << 2;
00327 xmc[33] = sr & 0x7; sr >>= 3;
00328 xmc[34] = sr & 0x7; sr >>= 3;
00329 xmc[35] = sr & 0x7; sr >>= 3;
00330 sr |= (uword)*c++ << 1;
00331 xmc[36] = sr & 0x7; sr >>= 3;
00332 xmc[37] = sr & 0x7; sr >>= 3;
00333 xmc[38] = sr & 0x7; sr >>= 3;
00334 sr = *c++;
00335 Nc[3] = sr & 0x7f; sr >>= 7;
00336 sr |= (uword)*c++ << 1;
00337 bc[3] = sr & 0x3; sr >>= 2;
00338 Mc[3] = sr & 0x3; sr >>= 2;
00339 sr |= (uword)*c++ << 5;
00340 xmaxc[3] = sr & 0x3f; sr >>= 6;
00341 #undef xmc
00342 #define xmc (source + 63 - 39)
00343
00344 xmc[39] = sr & 0x7; sr >>= 3;
00345 xmc[40] = sr & 0x7; sr >>= 3;
00346 sr |= (uword)*c++ << 1;
00347 xmc[41] = sr & 0x7; sr >>= 3;
00348 xmc[42] = sr & 0x7; sr >>= 3;
00349 xmc[43] = sr & 0x7; sr >>= 3;
00350 sr = *c++;
00351 xmc[44] = sr & 0x7; sr >>= 3;
00352 xmc[45] = sr & 0x7; sr >>= 3;
00353 sr |= (uword)*c++ << 2;
00354 xmc[46] = sr & 0x7; sr >>= 3;
00355 xmc[47] = sr & 0x7; sr >>= 3;
00356 xmc[48] = sr & 0x7; sr >>= 3;
00357 sr |= (uword)*c++ << 1;
00358 xmc[49] = sr & 0x7; sr >>= 3;
00359 xmc[50] = sr & 0x7; sr >>= 3;
00360 xmc[51] = sr & 0x7; sr >>= 3;
00361 }
00362 }
00363 else
00364 #endif
00365 {
00366
00367 *c++ = ((GSM_MAGIC & 0xF) << 4)
00368 | ((LARc[0] >> 2) & 0xF);
00369 *c++ = ((LARc[0] & 0x3) << 6)
00370 | (LARc[1] & 0x3F);
00371 *c++ = ((LARc[2] & 0x1F) << 3)
00372 | ((LARc[3] >> 2) & 0x7);
00373 *c++ = ((LARc[3] & 0x3) << 6)
00374 | ((LARc[4] & 0xF) << 2)
00375 | ((LARc[5] >> 2) & 0x3);
00376 *c++ = ((LARc[5] & 0x3) << 6)
00377 | ((LARc[6] & 0x7) << 3)
00378 | (LARc[7] & 0x7);
00379
00380
00381 *c++ = ((Nc[0] & 0x7F) << 1)
00382
00383
00384 | ((bc[0] >> 1) & 0x1);
00385 *c++ = ((bc[0] & 0x1) << 7)
00386
00387
00388 | ((Mc[0] & 0x3) << 5)
00389
00390 | ((xmaxc[0] >> 1) & 0x1F);
00391 *c++ = ((xmaxc[0] & 0x1) << 7)
00392
00393 #undef xmc
00394 #define xmc (source + 12)
00395
00396 | ((xmc[0] & 0x7) << 4)
00397 | ((xmc[1] & 0x7) << 1)
00398 | ((xmc[2] >> 2) & 0x1);
00399 *c++ = ((xmc[2] & 0x3) << 6)
00400 | ((xmc[3] & 0x7) << 3)
00401 | (xmc[4] & 0x7);
00402 *c++ = ((xmc[5] & 0x7) << 5)
00403 | ((xmc[6] & 0x7) << 2)
00404 | ((xmc[7] >> 1) & 0x3);
00405 *c++ = ((xmc[7] & 0x1) << 7)
00406 | ((xmc[8] & 0x7) << 4)
00407 | ((xmc[9] & 0x7) << 1)
00408 | ((xmc[10] >> 2) & 0x1);
00409 *c++ = ((xmc[10] & 0x3) << 6)
00410 | ((xmc[11] & 0x7) << 3)
00411 | (xmc[12] & 0x7);
00412
00413
00414 *c++ = ((Nc[1] & 0x7F) << 1)
00415
00416
00417 | ((bc[1] >> 1) & 0x1);
00418 *c++ = ((bc[1] & 0x1) << 7)
00419
00420
00421 | ((Mc[1] & 0x3) << 5)
00422
00423
00424 | ((xmaxc[1] >> 1) & 0x1F);
00425 *c++ = ((xmaxc[1] & 0x1) << 7)
00426
00427 #undef xmc
00428 #define xmc (source + 29 - 13)
00429
00430 | ((xmc[13] & 0x7) << 4)
00431 | ((xmc[14] & 0x7) << 1)
00432 | ((xmc[15] >> 2) & 0x1);
00433 *c++ = ((xmc[15] & 0x3) << 6)
00434 | ((xmc[16] & 0x7) << 3)
00435 | (xmc[17] & 0x7);
00436 *c++ = ((xmc[18] & 0x7) << 5)
00437 | ((xmc[19] & 0x7) << 2)
00438 | ((xmc[20] >> 1) & 0x3);
00439 *c++ = ((xmc[20] & 0x1) << 7)
00440 | ((xmc[21] & 0x7) << 4)
00441 | ((xmc[22] & 0x7) << 1)
00442 | ((xmc[23] >> 2) & 0x1);
00443 *c++ = ((xmc[23] & 0x3) << 6)
00444 | ((xmc[24] & 0x7) << 3)
00445 | (xmc[25] & 0x7);
00446
00447
00448 *c++ = ((Nc[2] & 0x7F) << 1)
00449
00450
00451 | ((bc[2] >> 1) & 0x1);
00452 *c++ = ((bc[2] & 0x1) << 7)
00453
00454
00455 | ((Mc[2] & 0x3) << 5)
00456
00457
00458 | ((xmaxc[2] >> 1) & 0x1F);
00459 *c++ = ((xmaxc[2] & 0x1) << 7)
00460
00461 #undef xmc
00462 #define xmc (source + 46 - 26)
00463
00464 | ((xmc[26] & 0x7) << 4)
00465 | ((xmc[27] & 0x7) << 1)
00466 | ((xmc[28] >> 2) & 0x1);
00467 *c++ = ((xmc[28] & 0x3) << 6)
00468 | ((xmc[29] & 0x7) << 3)
00469 | (xmc[30] & 0x7);
00470 *c++ = ((xmc[31] & 0x7) << 5)
00471 | ((xmc[32] & 0x7) << 2)
00472 | ((xmc[33] >> 1) & 0x3);
00473 *c++ = ((xmc[33] & 0x1) << 7)
00474 | ((xmc[34] & 0x7) << 4)
00475 | ((xmc[35] & 0x7) << 1)
00476 | ((xmc[36] >> 2) & 0x1);
00477 *c++ = ((xmc[36] & 0x3) << 6)
00478 | ((xmc[37] & 0x7) << 3)
00479 | (xmc[38] & 0x7);
00480
00481
00482 *c++ = ((Nc[3] & 0x7F) << 1)
00483
00484
00485 | ((bc[3] >> 1) & 0x1);
00486 *c++ = ((bc[3] & 0x1) << 7)
00487
00488
00489 | ((Mc[3] & 0x3) << 5)
00490
00491
00492 | ((xmaxc[3] >> 1) & 0x1F);
00493 *c++ = ((xmaxc[3] & 0x1) << 7)
00494
00495 #undef xmc
00496 #define xmc (source + 63 - 39)
00497
00498 | ((xmc[39] & 0x7) << 4)
00499 | ((xmc[40] & 0x7) << 1)
00500 | ((xmc[41] >> 2) & 0x1);
00501 *c++ = ((xmc[41] & 0x3) << 6)
00502 | ((xmc[42] & 0x7) << 3)
00503 | (xmc[43] & 0x7);
00504 *c++ = ((xmc[44] & 0x7) << 5)
00505 | ((xmc[45] & 0x7) << 2)
00506 | ((xmc[46] >> 1) & 0x3);
00507 *c++ = ((xmc[46] & 0x1) << 7)
00508 | ((xmc[47] & 0x7) << 4)
00509 | ((xmc[48] & 0x7) << 1)
00510 | ((xmc[49] >> 2) & 0x1);
00511 *c++ = ((xmc[49] & 0x3) << 6)
00512 | ((xmc[50] & 0x7) << 3)
00513 | (xmc[51] & 0x7);
00514 }
00515 }