view amrefr/tseq-enc.c @ 467:ad032051166a

doc: AMR-EFR-hybrid-emu new article
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 12 May 2024 23:54:43 +0000
parents 026bdc1f0dda
children
line wrap: on
line source

/*
 * amrefr-tseq-enc is a test program for our libtwamr-based "alternative EFR"
 * encoder: it functions just like gsmefr-etsi-enc, but uses libtwamr as
 * the encoder engine instead of libgsmefr.  Libgsmefr functions are still
 * used for frame packing, but not for actual encoding.  Note that there is
 * no -d option in this version, and no DTX encoding support: a DTX-capable
 * AMR-EFR hybrid is a beast that is currently outside our capabilities.
 *
 * The byte order is LE by default or BE with -b option.  Practical testing
 * will always require some manual byte-swap conversion: t??_efr.cod files
 * in amr122_efr.zip are shipped in BE, but the corresponding t??.inp files
 * in the 06.74 package are LE.
 */

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

main(argc, argv)
	char **argv;
{
	char *infname, *outfname;
	FILE *inf, *outf;
	struct amr_encoder_state *state;
	int16_t pcm[160];
	struct amr_param_frame amr_frame;
	uint8_t efr_frame[EFR_RTP_FRAME_LEN], bits[250];
	int opt, rc, big_endian = 0;
	extern int optind;

	while ((opt = getopt(argc, argv, "b")) != EOF) {
		switch (opt) {
		case 'b':
			big_endian = 1;
			continue;
		default:
		usage:
			fprintf(stderr, "usage: %s [-b] input.inp output.cod\n",
				argv[0]);
			exit(1);
		}
	}
	if (argc != optind + 2)
		goto usage;
	infname = argv[optind];
	outfname = argv[optind+1];

	inf = fopen(infname, "r");
	if (!inf) {
		perror(infname);
		exit(1);
	}
	outf = fopen(outfname, "w");
	if (!outf) {
		perror(outfname);
		exit(1);
	}
	state = amr_encoder_create(0, 0);
	if (!state) {
		perror("amr_encoder_create()");
		exit(1);
	}
	for (;;) {
		rc = read_input(inf, pcm, infname, big_endian);
		if (!rc)
			break;
		amr_encode_frame(state, MR122, pcm, &amr_frame);
		amr_dhf_subst_efr2(&amr_frame, pcm);
		EFR_params2frame(amr_frame.param, efr_frame);
		frame2bits(efr_frame, bits);
		bits[248] = 1;
		bits[249] = 1;
		emit_output(outf, bits + 4, 246, big_endian);
	}
	fclose(outf);
	exit(0);
}