diff amrconv/cod-parse.c @ 211:78d1a6513393

amrconv: new program amr-cod-parse
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 20 Apr 2023 01:30:46 +0000
parents efrtest/cod-parse.c@bbe5669f0f29
children 0beafaa0623f
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/amrconv/cod-parse.c	Thu Apr 20 01:30:46 2023 +0000
@@ -0,0 +1,78 @@
+/*
+ * This program reads an ETSI/3GPP AMR *.cod file and parses it into
+ * a human-readable form.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include "amr_defs.h"
+
+extern char *amr_mode_names[16];
+extern unsigned amr_bit_lengths[9];
+
+static char *type_names[4] = {
+	"Speech",
+	"SID_FIRST",
+	"SID_UPDATE",
+	"NO_DATA"
+};
+
+main(argc, argv)
+	char **argv;
+{
+	char *infname;
+	FILE *inf;
+	int big_endian;
+	unsigned frame_no, type, mode;
+	uint8_t input_bits[COD_FORMAT_NWORDS];
+	uint16_t params[MAX_PRM_SIZE];
+	int rc;
+
+	if (argc == 2 && argv[1][0] != '-') {
+		big_endian = 0;
+		infname = argv[1];
+	} else if (argc == 3 && !strcmp(argv[1], "-b")) {
+		big_endian = 1;
+		infname = argv[2];
+	} else {
+		fprintf(stderr, "usage: %s [-b] file.cod\n", argv[0]);
+		exit(1);
+	}
+	inf = fopen(infname, "r");
+	if (!inf) {
+		perror(infname);
+		exit(1);
+	}
+	for (frame_no = 0; ; frame_no++) {
+		rc = read_cod_bits(inf, big_endian, input_bits, infname);
+		if (!rc)
+			break;
+		type = input_bits[0];
+		mode = input_bits[245];
+		printf("#%u: Type=%u Mode=%u", frame_no, type, mode);
+		if (type > TX_NO_DATA || mode > MR122) {
+			printf(" (unsupported)\n");
+			continue;
+		}
+		printf(" (%s %s)\n", amr_mode_names[mode], type_names[type]);
+		switch (type) {
+		case TX_SPEECH_GOOD:
+			preen_frame_bits(input_bits+1, amr_bit_lengths[mode],
+					 infname, frame_no);
+			reassemble_amr_params(input_bits+1, params, mode);
+			dump_amr_params(params, mode);
+			break;
+		case TX_SID_FIRST:
+		case TX_SID_UPDATE:
+			preen_frame_bits(input_bits+1, AMR_NBITS_SID, infname,
+					 frame_no);
+			reassemble_amr_params(input_bits+1, params, MRDTX);
+			dump_amr_params(params, MRDTX);
+			break;
+		}
+	}
+	exit(0);
+}