# HG changeset patch # User Mychaela Falconia # Date 1727197379 0 # Node ID f977027774cb26236d647a077f9b244c0921f025 # Parent 59d1d15b6f7e0e2da554811900c952bef7309616 trau-parse: add support for D144 decoding diff -r 59d1d15b6f7e -r f977027774cb trau-decode/parse-main.c --- a/trau-decode/parse-main.c Fri Sep 13 17:37:21 2024 +0000 +++ b/trau-decode/parse-main.c Tue Sep 24 17:02:59 2024 +0000 @@ -19,6 +19,11 @@ GOT_8_ZEROS, SYNCED } state; +static enum { + NOT_D144, + D144_SYNC, + D144_EDATA, +} d144_state; static unsigned hunt_for_0_count, frame_pos_count; static uint8_t in_frame_2bit[160], frame_bits[320], d_bits[260]; @@ -165,30 +170,61 @@ case 0x14: fputs(" (D144 sync)", stdout); break; + case 0x1F: + fputs(" (E-TRAU)", stdout); + break; } putchar('\n'); - c6_11 = bits_to_num(frame_bits + 22, 6); - printf(" C6-C11: %u\n", c6_11); - printf(" C12=%u C13=%u C14=%u C15=%u\n", frame_bits[28], - frame_bits[29], frame_bits[30], frame_bits[31]); + if (c1_5 == 0x14) + d144_state = D144_SYNC; + else if (c1_5 == 0x1F && + (d144_state == D144_SYNC || d144_state == D144_EDATA)) + d144_state = D144_EDATA; + else + d144_state = NOT_D144; switch (c1_5) { case 0x02: case 0x1C: + case 0x1A: + c6_11 = bits_to_num(frame_bits + 22, 6); + printf(" C6-C11: %u\n", c6_11); + printf(" C12=%u C13=%u C14=%u C15=%u\n", frame_bits[28], + frame_bits[29], frame_bits[30], frame_bits[31]); collect_d_bits(); - print_fr_frame(d_bits); - break; - case 0x1A: - collect_d_bits(); - check_efr_crc(d_bits); - print_efr_frame(d_bits); break; case 0x08: case 0x09: case 0x16: case 0x17: case 0x14: + printf(" C6-C15: %u%u%u%u%u%u%u%u%u%u\n", frame_bits[22], + frame_bits[23], frame_bits[24], frame_bits[25], + frame_bits[26], frame_bits[27], frame_bits[28], + frame_bits[29], frame_bits[30], frame_bits[31]); print_data_frame(); return; + case 0x1F: + printf(" C6-C13: %u%u%u%u%u%u%u%u\n", frame_bits[22], + frame_bits[23], frame_bits[24], frame_bits[25], + frame_bits[26], frame_bits[27], frame_bits[28], + frame_bits[29]); + printf(" M1=%u M2=%u\n", frame_bits[30], frame_bits[31]); + return; + default: + printf(" C6-C15: %u%u%u%u%u%u%u%u%u%u\n", frame_bits[22], + frame_bits[23], frame_bits[24], frame_bits[25], + frame_bits[26], frame_bits[27], frame_bits[28], + frame_bits[29], frame_bits[30], frame_bits[31]); + } + switch (c1_5) { + case 0x02: + case 0x1C: + print_fr_frame(d_bits); + break; + case 0x1A: + check_efr_crc(d_bits); + print_efr_frame(d_bits); + break; } printf(" C16=%u C17=%u C18=%u C19=%u C20=%u C21=%u\n", frame_bits[310], frame_bits[311], frame_bits[312], @@ -224,7 +260,13 @@ static void check_sync() { - if (check_sync_zeros() && check_sync_ones()) + int sync_res; + + if (d144_state == D144_EDATA) + sync_res = check_sync_zeros() && frame_bits[16]; + else + sync_res = check_sync_zeros() && check_sync_ones(); + if (sync_res) return; printf("Bad frame sync, returning to hunt state\n"); state = HUNT_FOR_0; @@ -315,6 +357,7 @@ } right_shift = (3 - subslot) * 2; state = HUNT_FOR_0; + d144_state = NOT_D144; for (file_offset = 0; ; file_offset++) { inb = getc(inf); if (inb < 0)