view efrtest/rec2etsi.c @ 122:b33f2168fdec

doc/EFR-rationale article written
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 10 Dec 2022 08:51:01 +0000
parents bd832a456339
children
line wrap: on
line source

/*
 * This program reads in an EFR session recording in our binary format
 * (presumably obtained by converting from an RTP capture on the network
 * side or from a Calypso DSP readout on the mobile side) and converts
 * it into ETSI *.dec format, to be fed to ETSI decoder test program.
 *
 * The output from this program is in the local machine's native byte order.
 */

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

static void
frame2bits(frame, bits)
	uint8_t *frame;
	uint16_t *bits;
{
	unsigned nb, byte, mask, bit;

	for (nb = 0; nb < 31; nb++) {
		byte = *frame++;
		for (mask = 0x80; mask; mask >>= 1) {
			if (byte & mask)
				bit = 1;
			else
				bit = 0;
			*bits++ = bit;
		}
	}
}

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

	if (argc != 3) {
		fprintf(stderr, "usage: %s input.gsmx output.dec\n", argv[0]);
		exit(1);
	}
	binf = fopen(argv[1], "r");
	if (!binf) {
		perror(argv[1]);
		exit(1);
	}
	outf = fopen(argv[2], "w");
	if (!outf) {
		perror(argv[2]);
		exit(1);
	}
	for (;;) {
		rc = binfile_read_frame(binf, frame);
		if (rc < 0) {
			fprintf(stderr, "error: garbage in %s\n", argv[1]);
			exit(1);
		}
		if (!rc)
			break;
		if (frame[0] == 0xBF) {
			bits[3] = 1;			/* BFI */
			bzero(bits + 4, 245 * 2);
			bits[249] = frame[1] & 1;	/* TAF */
		} else if ((frame[0] & 0xF0) == 0xC0) {
			frame2bits(frame, bits);
			bits[248] = EFR_sid_classify(frame);
			bits[249] = 0;			/* TAF */
		} else {
			fprintf(stderr,
				"error: %s is not in EFR codec format\n",
				argv[1]);
			exit(1);
		}
		fwrite(bits + 3, 2, 247, outf);
	}
	fclose(outf);
	exit(0);
}