view efrtest/cod-parse.c @ 122:b33f2168fdec

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

/*
 * This program reads an EFR *.cod file in ETSI test sequence format
 * (output from either ETSI's official coder program or our gsmefr-etsi-enc)
 * and converts it into human-readable format, similar to what one would get
 * from our gsmrec-dump utility.
 */

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

#define	ETSI_ENC_NWORDS	246

static int
read_input(inf, bitvec, filename_for_errs)
	FILE *inf;
	uint8_t *bitvec;
	char *filename_for_errs;
{
	uint8_t file_bytes[ETSI_ENC_NWORDS * 2], *sp;
	int cc;
	unsigned n;

	cc = fread(file_bytes, 2, ETSI_ENC_NWORDS, inf);
	if (cc == 0)
		return 0;
	if (cc != ETSI_ENC_NWORDS) {
		fprintf(stderr, "error: short read from %s\n",
			filename_for_errs);
		exit(1);
	}
	sp = file_bytes;
	for (n = 0; n < ETSI_ENC_NWORDS; n++) {
		if (sp[1]) {
			fprintf(stderr,
		"error in %s: non-zero in what should be LE upper byte\n",
				filename_for_errs);
			exit(1);
		}
		bitvec[n] = sp[0];
		sp += 2;
	}
	return 1;
}

static void
bits2frame(input_bits, frame, filename_for_errs, frame_no)
	uint8_t *input_bits, *frame;
	char *filename_for_errs;
	unsigned frame_no;
{
	uint8_t bits[248], *sp, *dp;
	unsigned nb, byte, mask;

	bits[0] = 1;
	bits[1] = 1;
	bits[2] = 0;
	bits[3] = 0;
	bcopy(input_bits, bits + 4, 244);
	sp = bits;
	dp = frame;
	for (nb = 0; nb < EFR_RTP_FRAME_LEN; nb++) {
		byte = 0;
		for (mask = 0x80; mask; mask >>= 1) {
			if (*sp > 1) {
				fprintf(stderr,
					"error in %s frame #%u: data bit > 1\n",
					filename_for_errs, frame_no);
				exit(1);
			}
			if (*sp)
				byte |= mask;
			sp++;
		}
		*dp++ = byte;
	}
}

main(argc, argv)
	char **argv;
{
	FILE *inf;
	unsigned frame_no;
	uint8_t input_bits[ETSI_ENC_NWORDS], frame[EFR_RTP_FRAME_LEN];
	int16_t params[EFR_NUM_PARAMS];
	int rc, i, j, n;

	if (argc != 2) {
		fprintf(stderr, "usage: %s file.cod\n", argv[0]);
		exit(1);
	}
	inf = fopen(argv[1], "r");
	if (!inf) {
		perror(argv[1]);
		exit(1);
	}
	for (frame_no = 0; ; frame_no++) {
		rc = read_input(inf, input_bits, argv[1]);
		if (!rc)
			break;
		bits2frame(input_bits, frame, argv[1], frame_no);
		printf("#%u: VAD=%u SP=%u SID=%d LPC", frame_no,
			input_bits[244], input_bits[245],
			EFR_sid_classify(frame));
		EFR_frame2params(frame, params);
		n = 0;
		for (i = 0; i < 5; i++)
			printf(" %u", params[n++]);
		putchar('\n');
		for (i = 0; i < 4; i++) {
			putchar(' ');
			for (j = 0; j < 13; j++)
				printf(" %u", params[n++]);
			putchar('\n');
		}
	}
}