view amrconv/efr2amr.c @ 282:9ee8ad3d4d30

frtest: rm gsmfr-hand-test and gsmfr-max-out utils These hack programs were never properly documented and were written only as part of a debug chase, in pursuit of a bug that ultimately turned out to be in our then-hacky patch to osmo-bts-sysmo, before beginning of proper patches in Osmocom. These hack programs need to be dropped from the present sw package because they depend on old libgsm, and we are eliminating that dependency.
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 14 Apr 2024 05:44:47 +0000
parents b092a510141e
children
line wrap: on
line source

/*
 * Our gsm-efr2amr utility reads in an EFR speech recording in our
 * extended-libgsm file format and converts it to AMR, inserting
 * an AMR NO_DATA frame in the place of every BFI in the input
 * but NOT performing any special handling or even detection of
 * EFR SID frames.
 */

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

extern const uint8_t amr_122_bit_order[244];

static const char amr_file_hdr[] = "#!AMR\n";

main(argc, argv)
	char **argv;
{
	char *infname, *outfname;
	FILE *inf, *outf;
	int wrong_flag;
	uint8_t frm_in[BINFILE_MAX_FRAME], frm_out[32];
	unsigned bit_a, bit_n, outlen;
	int rc, bfi;

	if (argc == 3 && argv[1][0] != '-') {
		wrong_flag = 0;
		infname = argv[1];
		outfname = argv[2];
	} else if (argc == 4 && !strcmp(argv[1], "-w")) {
		wrong_flag = 1;
		infname = argv[2];
		outfname = argv[3];
	} else {
		fprintf(stderr, "usage: %s [-w] input.gsmx output.amr\n",
			argv[0]);
		exit(1);
	}
	inf = fopen(infname, "r");
	if (!inf) {
		perror(infname);
		exit(1);
	}
	outf = fopen(outfname, "w");
	if (!outf) {
		perror(outfname);
		exit(1);
	}
	fwrite(amr_file_hdr, 1, 6, outf);
	for (;;) {
		rc = binfile_read_frame(inf, frm_in);
		if (rc < 0) {
			fprintf(stderr, "error: garbage in %s\n", infname);
			exit(1);
		}
		if (!rc)
			break;
		if (frm_in[0] == 0xBF)
			bfi = 1;
		else if ((frm_in[0] & 0xF0) == 0xC0)
			bfi = 0;
		else {
			fprintf(stderr,
				"error: %s is not in EFR codec format\n",
				infname);
			exit(1);
		}
		if (bfi) {
			frm_out[0] = 0x78;
			outlen = 1;
		} else {
			frm_out[0] = 0x3C;
			frm_out[31] = 0;
			for (bit_a = 0; bit_a < 244; bit_a++) {
				if (wrong_flag)
					bit_n = bit_a;
				else
					bit_n = amr_122_bit_order[bit_a];
				msb_set_bit(frm_out + 1, bit_a,
					    msb_get_bit(frm_in, 4 + bit_n));
			}
			outlen = 32;
		}
		fwrite(frm_out, 1, outlen, outf);
	}
	fclose(outf);
	exit(0);
}