view frtest/tfo-xfrm.c @ 556:18aca50d68df default tip

doc/Calypso-TCH-downlink: update for FR1 BFI-with-data
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 11 Oct 2024 01:54:00 +0000
parents b26df31124a4
children
line wrap: on
line source

/*
 * This program exercises our ThemWi implementation of TFO transform for
 * GSM-FR.  It reads a stream of radio leg A Rx frames from a TW-TS-005 Annex A
 * hex file and writes the "pristine" stream intended for radio leg B Tx
 * into another TW-TS-005 Annex A hex file.  The output is in basic RTP format.
 */

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include "../libgsmfr2/tw_gsmfr.h"
#include "../libtest/tw5reader.h"
#include "../libtest/tw5writer.h"

main(argc, argv)
	char **argv;
{
	char *infname, *outfname;
	FILE *inf, *outf;
	unsigned lineno;
	struct gsmfr_preproc_state *pp_state;
	uint8_t frame_in[TWTS005_MAX_FRAME], frame_out[GSMFR_RTP_FRAME_LEN];
	unsigned frame_in_len;
	int dtxd, rc;

	if (argc == 3 && argv[1][0] != '-') {
		dtxd = 0;
		infname = argv[1];
		outfname = argv[2];
	} else if (argc == 4 && !strcmp(argv[1], "-d")) {
		dtxd = 1;
		infname = argv[2];
		outfname = argv[3];
	} else {
		fprintf(stderr, "usage: %s [-d] input.hex output.hex\n",
			argv[0]);
		exit(1);
	}
	inf = fopen(infname, "r");
	if (!inf) {
		perror(infname);
		exit(1);
	}
	lineno = 0;
	outf = fopen(outfname, "w");
	if (!outf) {
		perror(outfname);
		exit(1);
	}
	pp_state = gsmfr_preproc_create();
	if (!pp_state) {
		fprintf(stderr, "gsmfr_preproc_create() failed!\n");
		exit(1);
	}
	for (;;) {
		rc = twts005_read_frame(inf, &lineno, frame_in, &frame_in_len);
		if (rc < 0) {
			fprintf(stderr, "%s line %u: not valid TW-TS-005\n",
				argv[1], lineno);
			exit(1);
		}
		if (!rc)
			break;
		rc = gsmfr_tfo_xfrm_main(pp_state, frame_in, frame_in_len,
					 frame_out);
		if (rc < 0) {
			fprintf(stderr,
				"%s line %u: not a valid GSM-FR frame\n",
				argv[1], lineno);
			exit(1);
		}
		if (dtxd)
			gsmfr_tfo_xfrm_dtxd(pp_state, frame_out);
		emit_hex_frame(outf, frame_out, GSMFR_RTP_FRAME_LEN);
	}
	fclose(outf);
	exit(0);
}