# HG changeset patch # User Mychaela Falconia # Date 1726178132 0 # Node ID 796cc2d942046a7992b82c908571719184235051 # Parent 957c20852c7cc92df133d4d1fbae9432a0ef8033 new program v110-dump16 diff -r 957c20852c7c -r 796cc2d94204 .hgignore --- a/.hgignore Thu Sep 12 21:38:22 2024 +0000 +++ b/.hgignore Thu Sep 12 21:55:32 2024 +0000 @@ -22,4 +22,5 @@ ^trau-ul-prep/efrdec2tsrc$ ^trau-ul-prep/gsmx2tsrc$ +^v110/v110-dump16$ ^v110/v110-dump8$ diff -r 957c20852c7c -r 796cc2d94204 v110/Makefile --- a/v110/Makefile Thu Sep 12 21:38:22 2024 +0000 +++ b/v110/Makefile Thu Sep 12 21:55:32 2024 +0000 @@ -1,9 +1,12 @@ CC= gcc CFLAGS= -O2 -PROGS= v110-dump8 +PROGS= v110-dump16 v110-dump8 all: ${PROGS} +v110-dump16: v110-dump16.c + ${CC} ${CFLAGS} -o $@ $@.c + v110-dump8: v110-dump8.c ${CC} ${CFLAGS} -o $@ $@.c diff -r 957c20852c7c -r 796cc2d94204 v110/v110-dump16.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/v110/v110-dump16.c Thu Sep 12 21:55:32 2024 +0000 @@ -0,0 +1,137 @@ +/* + * This program reads a 64 kbit/s timeslot recording file, examines it + * as V.110 with 16 kbit/s intermediate rate, locates 80-bit V.110 frames + * and dumps them in a mostly raw form. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static const uint8_t *filebuf; +static unsigned total_size; + +static void +read_ts_file(filename) + char *filename; +{ + int fd; + struct stat st; + + fd = open(filename, O_RDONLY); + if (fd < 0) { + perror(filename); + exit(1); + } + fstat(fd, &st); + if (!S_ISREG(st.st_mode)) { + fprintf(stderr, "error: %s is not a regular file\n", filename); + exit(1); + } + total_size = st.st_size; + if (total_size < 40) { + fprintf(stderr, "error: %s is too short\n", filename); + exit(1); + } + filebuf = mmap(NULL, total_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (filebuf == MAP_FAILED) { + perror("mmap"); + exit(1); + } + close(fd); +} + +static int +check_sync(pos) + unsigned pos; +{ + const uint8_t *cand = filebuf + pos; + unsigned n; + + for (n = 0; n < 4; n++) { + if (cand[n] & 0xC0) + return 0; + } + for (n = 1; n < 10; n++) { + if (!(cand[n * 4] & 0x80)) + return 0; + } + return 1; +} + +static unsigned +extract_data_byte(pos) + unsigned pos; +{ + const uint8_t *src = filebuf + pos; + unsigned accum; + unsigned n; + + accum = 0; + for (n = 0; n < 4; n++) { + accum <<= 1; + if (*src & 0x80) + accum |= 1; + accum <<= 1; + if (*src & 0x40) + accum |= 1; + src++; + } + return accum; +} + +static void +process_frame(pos) + unsigned pos; +{ + unsigned nb; + + printf("Frame at 0x%x:", pos); + pos += 4; + for (nb = 0; nb < 9; nb++) { + printf(" %02X", extract_data_byte(pos)); + pos += 4; + } + putchar('\n'); +} + +static void +process_filebuf() +{ + unsigned p, endp; + int sync = 0, match; + + endp = total_size - 40; + for (p = 0; p <= endp; ) { + match = check_sync(p); + if (match != sync) { + printf("# %s frame sync at file offset 0x%x\n", + match ? "Acquired" : "Lost", p); + } + if (match) { + process_frame(p); + p += 40; + } else + p++; + sync = match; + } +} + +main(argc, argv) + char **argv; +{ + if (argc != 2) { + fprintf(stderr, "usage: %s binfile\n", argv[0]); + exit(1); + } + read_ts_file(argv[1]); + process_filebuf(); + exit(0); +} diff -r 957c20852c7c -r 796cc2d94204 v110/v110-dump8.c --- a/v110/v110-dump8.c Thu Sep 12 21:38:22 2024 +0000 +++ b/v110/v110-dump8.c Thu Sep 12 21:55:32 2024 +0000 @@ -106,7 +106,7 @@ int sync = 0, match; endp = total_size - 80; - for (p = 0; p < endp; ) { + for (p = 0; p <= endp; ) { match = check_sync(p); if (match != sync) { printf("# %s frame sync at file offset 0x%x\n",