diff amrefr/encode-r.c @ 438:1bf1bbcef763

amrefr: implement amrefr-encode-r utility
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 08 May 2024 23:43:26 +0000
parents efrtest/encode-r.c@cab6690535ec
children 0c4e1bc06740
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/amrefr/encode-r.c	Wed May 08 23:43:26 2024 +0000
@@ -0,0 +1,56 @@
+/*
+ * amrefr-encode-r is a counterpart to gsmefr-encode-r, implementing
+ * "alternative EFR" by way of libtwamr.  Unlike standard gsmefr-encode-r,
+ * there is no -d option and no DTX support in this version.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "../libgsmefr/gsm_efr.h"
+#include "../libtwamr/tw_amr.h"
+#include "../libtest/roberead.h"
+
+main(argc, argv)
+	char **argv;
+{
+	FILE *inf, *binf;
+	struct amr_encoder_state *state;
+	int16_t pcm[160];
+	struct amr_param_frame amr_frame;
+	uint8_t efr_frame[EFR_RTP_FRAME_LEN];
+	int rc;
+
+	if (argc != 3) {
+		fprintf(stderr, "usage: %s input.robe output.gsmx\n", argv[0]);
+		exit(1);
+	}
+	inf = fopen(argv[1], "r");
+	if (!inf) {
+		perror(argv[1]);
+		exit(1);
+	}
+	binf = fopen(argv[2], "w");
+	if (!binf) {
+		perror(argv[2]);
+		exit(1);
+	}
+	state = amr_encoder_create(0, 0);
+	if (!state) {
+		perror("amr_encoder_create()");
+		exit(1);
+	}
+	for (;;) {
+		rc = robe_get_pcm_block(inf, pcm);
+		if (!rc)
+			break;
+		amr_encode_frame(state, MR122, pcm, &amr_frame);
+		amr_dhf_subst_efr(&amr_frame);
+		EFR_params2frame(amr_frame.param, efr_frame);
+		fwrite(efr_frame, 1, sizeof efr_frame, binf);
+	}
+	fclose(binf);
+	exit(0);
+}