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)