FreeCalypso > hg > gsm-net-reveng
comparison trau-decode/amr8-common.c @ 104:9cc76853d291
TRAU-AMR-8k: implement MR67 speech decoding
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Thu, 20 Nov 2025 22:09:43 +0000 |
| parents | 4edffa52802d |
| children | 699afc9ef063 |
comparison
equal
deleted
inserted
replaced
| 103:4edffa52802d | 104:9cc76853d291 |
|---|---|
| 257 static void | 257 static void |
| 258 decode_mode_2(c_bits, d_bits) | 258 decode_mode_2(c_bits, d_bits) |
| 259 ubit_t *c_bits, *d_bits; | 259 ubit_t *c_bits, *d_bits; |
| 260 { | 260 { |
| 261 ubit_t crc_collect[34]; | 261 ubit_t crc_collect[34]; |
| 262 int crc1; | 262 int crc_stat; |
| 263 | 263 |
| 264 bcopy(c_bits, crc_collect, 5); | 264 bcopy(c_bits, crc_collect, 5); |
| 265 bcopy(d_bits, crc_collect + 5, 17); | 265 bcopy(d_bits, crc_collect + 5, 17); |
| 266 bcopy(d_bits + 26, crc_collect + 22, 8); | 266 bcopy(d_bits + 26, crc_collect + 22, 8); |
| 267 bcopy(d_bits + 47, crc_collect + 30, 4); | 267 bcopy(d_bits + 47, crc_collect + 30, 4); |
| 268 crc1 = osmo_crc8gen_check_bits(&gsm0860_amr_crc3, crc_collect, 34, | 268 crc_stat = osmo_crc8gen_check_bits(&gsm0860_amr_crc3, crc_collect, 34, |
| 269 d_bits + 51); | 269 d_bits + 51); |
| 270 printf(" CRC %s\n", crc1 ? "bad" : "good"); | 270 printf(" CRC %s\n", crc_stat ? "bad" : "good"); |
| 271 if (crc1) | 271 if (crc_stat) |
| 272 saved_mode_valid = 0; | 272 saved_mode_valid = 0; |
| 273 print_speech_params(d_bits, params_lsf_59_67_74); | 273 print_speech_params(d_bits, params_lsf_59_67_74); |
| 274 print_speech_params(d_bits + 26, params_59_sf13); | 274 print_speech_params(d_bits + 26, params_59_sf13); |
| 275 print_speech_params(d_bits + 59, params_59_sf24); | 275 print_speech_params(d_bits + 59, params_59_sf24); |
| 276 print_speech_params(d_bits + 80, params_59_sf13); | 276 print_speech_params(d_bits + 80, params_59_sf13); |
| 290 unsigned c1_3 = bits_to_num(c_bits, 3); | 290 unsigned c1_3 = bits_to_num(c_bits, 3); |
| 291 unsigned rif = (c1_3 >= 3); | 291 unsigned rif = (c1_3 >= 3); |
| 292 unsigned c4_5 = bits_to_num(c_bits + 3, 2); | 292 unsigned c4_5 = bits_to_num(c_bits + 3, 2); |
| 293 unsigned mode; | 293 unsigned mode; |
| 294 | 294 |
| 295 printf(" Speech: RIF=%u, %s\n", rif, fclass_names[c4_5]); | 295 printf(" Speech: RIF=%u FC=%s\n", rif, fclass_names[c4_5]); |
| 296 if (rif) { | 296 if (rif) { |
| 297 printf(" CMR=%u\n", c1_3 - 3); | 297 printf(" CMR=%u\n", c1_3 - 3); |
| 298 if (!saved_mode_valid) { | 298 if (!saved_mode_valid) { |
| 299 puts(" Mode unknown, cannot decode"); | 299 puts(" Mode unknown, cannot decode"); |
| 300 return; | 300 return; |
| 381 decode_nospeech_frame(c_bits, d_bits); | 381 decode_nospeech_frame(c_bits, d_bits); |
| 382 printf(" T=%u\n", frame_bits[159]); | 382 printf(" T=%u\n", frame_bits[159]); |
| 383 } | 383 } |
| 384 | 384 |
| 385 static void | 385 static void |
| 386 decode_6k7_7k4_common(c_bits, d_bits, mode, cmr_offset) | |
| 387 ubit_t *c_bits, *d_bits; | |
| 388 char *mode; | |
| 389 { | |
| 390 unsigned c1_3 = bits_to_num(c_bits, 3); | |
| 391 unsigned rif, fc, cmr_code; | |
| 392 | |
| 393 printf(" %s speech, C1-C3: %u%u%u\n", mode, c_bits[0], c_bits[1], | |
| 394 c_bits[2]); | |
| 395 switch (c1_3) { | |
| 396 case 0: | |
| 397 rif = 0; | |
| 398 fc = 1; | |
| 399 break; | |
| 400 case 1: | |
| 401 rif = 0; | |
| 402 fc = 3; | |
| 403 break; | |
| 404 case 2: | |
| 405 rif = 1; | |
| 406 fc = 1; | |
| 407 cmr_code = bits_to_num(d_bits + cmr_offset, 3); | |
| 408 break; | |
| 409 default: | |
| 410 rif = 1; | |
| 411 fc = 3; | |
| 412 cmr_code = c1_3; | |
| 413 } | |
| 414 printf(" RIF=%u FC=%s\n", rif, fclass_names[fc]); | |
| 415 if (rif) { | |
| 416 if (cmr_code >= 3) | |
| 417 printf(" CMR=%u\n", cmr_code - 3); | |
| 418 else | |
| 419 puts(" CMR code in data bits is invalid"); | |
| 420 } | |
| 421 } | |
| 422 | |
| 423 static void | |
| 386 handle_amr8_6k7(frame_bits) | 424 handle_amr8_6k7(frame_bits) |
| 387 ubit_t *frame_bits; | 425 ubit_t *frame_bits; |
| 388 { | 426 { |
| 389 puts(" TRAU-AMR-8k MR67 format, decoding to be implemented"); | 427 ubit_t *c_bits = frame_bits + 17; |
| 428 ubit_t d_bits[137], crc_collect[35]; | |
| 429 int crc_stat; | |
| 430 | |
| 431 bcopy(frame_bits + 9, d_bits, 7); | |
| 432 bcopy(frame_bits + 20, d_bits + 7, 4); | |
| 433 bcopy(frame_bits + 25, d_bits + 11, 7); | |
| 434 bcopy(frame_bits + 33, d_bits + 18, 7); | |
| 435 bcopy(frame_bits + 41, d_bits + 25, 7); | |
| 436 bcopy(frame_bits + 49, d_bits + 32, 15); | |
| 437 bcopy(frame_bits + 65, d_bits + 47, 15); | |
| 438 bcopy(frame_bits + 81, d_bits + 62, 15); | |
| 439 bcopy(frame_bits + 97, d_bits + 77, 15); | |
| 440 bcopy(frame_bits + 113, d_bits + 92, 15); | |
| 441 bcopy(frame_bits + 129, d_bits + 107, 15); | |
| 442 bcopy(frame_bits + 145, d_bits + 122, 15); | |
| 443 | |
| 444 decode_6k7_7k4_common(c_bits, d_bits, "MR67", 0); | |
| 445 bcopy(c_bits, crc_collect, 3); | |
| 446 bcopy(d_bits, crc_collect + 3, 17); | |
| 447 crc_collect[20] = d_bits[19]; | |
| 448 crc_collect[21] = d_bits[23]; | |
| 449 bcopy(d_bits + 26, crc_collect + 22, 8); | |
| 450 bcopy(d_bits + 48, crc_collect + 30, 5); | |
| 451 crc_stat = osmo_crc8gen_check_bits(&gsm0860_amr_crc3, crc_collect, 35, | |
| 452 d_bits + 55); | |
| 453 printf(" CRC %s\n", crc_stat ? "bad" : "good"); | |
| 454 print_speech_params(d_bits, params_lsf_59_67_74); | |
| 455 print_speech_params(d_bits + 26, params_67_sf13); | |
| 456 print_speech_params(d_bits + 58, params_67_sf24); | |
| 457 print_speech_params(d_bits + 83, params_67_sf13); | |
| 458 print_speech_params(d_bits + 112, params_67_sf24); | |
| 390 saved_mode_valid = 0; | 459 saved_mode_valid = 0; |
| 391 } | 460 } |
| 392 | 461 |
| 393 static void | 462 static void |
| 394 handle_amr8_7k4(frame_bits) | 463 handle_amr8_7k4(frame_bits) |
