view miscutil/gsmx-to-tw5a.c @ 520:785b302992f0

miscutil: new program gsmx-to-tw5a
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 19 Sep 2024 01:06:58 +0000
parents miscutil/gsmrec-dump.c@b5f8ea41362b
children 68fe269b4316
line wrap: on
line source

/*
 * This program converts FR/EFR speech recordings from gsmx binary format
 * into more formally standardized TW-TS-005 Annex A format.
 *
 * FR and EFR frames are written in basic format (no TEH);
 * BFI marker records are converted into TW-TS-001 No_Data frames.
 */

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include "../libgsmfr2/tw_gsmfr.h"
#include "../libgsmefr/gsm_efr.h"
#include "../libtest/binreader.h"

static void
emit_hex_frame(frame, nbytes)
	uint8_t *frame;
	unsigned nbytes;
{
	unsigned n;

	for (n = 0; n < nbytes; n++)
		printf("%02X", frame[n]);
	putchar('\n');
}

main(argc, argv)
	char **argv;
{
	FILE *binf, *outf;
	unsigned frame_index;
	uint8_t frame[BINFILE_MAX_FRAME];
	int rc;

	if (argc != 3) {
		fprintf(stderr, "usage: %s input.gsmx output.hex\n", argv[0]);
		exit(1);
	}
	binf = fopen(argv[1], "r");
	if (!binf) {
		perror(argv[1]);
		exit(1);
	}
	if (strcmp(argv[2], "-")) {
		outf = fopen(argv[2], "w");
		if (!outf) {
			perror(argv[2]);
			exit(1);
		}
	} else
		outf = stdout;
	for (frame_index = 0; ; frame_index++) {
		rc = binfile_read_frame(binf, frame);
		if (rc < 0) {
			fprintf(stderr,
				"error: garbage in %s after %u frames\n",
				argv[1], frame_index);
			exit(1);
		}
		if (!rc)
			break;
		switch (frame[0] & 0xF0) {
		case 0xB0:
			printf("%02X\n", 0xE6 | frame[1] & 1);
			break;
		case 0xC0:
			emit_hex_frame(frame, EFR_RTP_FRAME_LEN);
			break;
		case 0xD0:
			emit_hex_frame(frame, GSMFR_RTP_FRAME_LEN);
			break;
		}
	}
	exit(0);
}