diff trau-decode/parse-amr.c @ 93:fa80ce9b076c default tip

trau-parse AMR: check spare bits and report not-all-1s
author Mychaela Falconia <falcon@freecalypso.org>
date Wed, 05 Mar 2025 02:56:24 +0000
parents 761650771e51
children
line wrap: on
line diff
--- a/trau-decode/parse-amr.c	Wed Mar 05 02:26:11 2025 +0000
+++ b/trau-decode/parse-amr.c	Wed Mar 05 02:56:24 2025 +0000
@@ -111,6 +111,23 @@
 }
 
 static void
+check_spare_bits(bits, nbits, desc)
+	ubit_t *bits;
+	unsigned nbits;
+	char *desc;
+{
+	while (nbits) {
+		if (*bits == 0)
+			break;
+		bits++;
+		nbits--;
+	}
+	if (!nbits)
+		return;
+	printf("    Extra data in bits %s\n", desc);
+}
+
+static void
 decode_mode_0(c_bits, d_bits)
 	ubit_t *c_bits, *d_bits;
 {
@@ -142,6 +159,8 @@
 	print_speech_params(d_bits + 95, params_475_sf24);
 	print_speech_params(d_bits + 111, params_475_sf3);
 	print_speech_params(d_bits + 135, params_475_sf24);
+	check_spare_bits(d_bits, 44, "D1..D44");
+	check_spare_bits(d_bits + 151, 256 - 151, "D152..D256");
 }
 
 static void
@@ -179,6 +198,8 @@
 	print_speech_params(d_bits + 95, params_515_sf234);
 	print_speech_params(d_bits + 117, params_515_sf234);
 	print_speech_params(d_bits + 139, params_515_sf234);
+	check_spare_bits(d_bits, 46, "D1..D46");
+	check_spare_bits(d_bits + 161, 256 - 161, "D162..D256");
 }
 
 static void
@@ -216,6 +237,8 @@
 	print_speech_params(d_bits + 95, params_59_sf24);
 	print_speech_params(d_bits + 119, params_59_sf13);
 	print_speech_params(d_bits + 147, params_59_sf24);
+	check_spare_bits(d_bits, 41, "D1..D41");
+	check_spare_bits(d_bits + 171, 256 - 171, "D172..D256");
 }
 
 static void
@@ -255,6 +278,8 @@
 	print_speech_params(d_bits + 95, params_67_sf24);
 	print_speech_params(d_bits + 123, params_67_sf13);
 	print_speech_params(d_bits + 155, params_67_sf24);
+	check_spare_bits(d_bits, 37, "D1..D37");
+	check_spare_bits(d_bits + 183, 256 - 183, "D184..D256");
 }
 
 static void
@@ -297,6 +322,8 @@
 	print_speech_params(d_bits + 95, params_74_sf24);
 	print_speech_params(d_bits + 127, params_74_sf13);
 	print_speech_params(d_bits + 162, params_74_sf24);
+	check_spare_bits(d_bits, 34, "D1..D34");
+	check_spare_bits(d_bits + 194, 256 - 194, "D195..D256");
 }
 
 static void
@@ -338,6 +365,8 @@
 	print_speech_params(d_bits + 95, params_795_sf24);
 	print_speech_params(d_bits + 130, params_795_sf13);
 	print_speech_params(d_bits + 167, params_795_sf24);
+	check_spare_bits(d_bits, 31, "D1..D31");
+	check_spare_bits(d_bits + 202, 256 - 202, "D203..D256");
 }
 
 static void
@@ -380,6 +409,8 @@
 	print_speech_params(d_bits + 95, params_102_sf24);
 	print_speech_params(d_bits + 141, params_102_sf13);
 	print_speech_params(d_bits + 190, params_102_sf24);
+	check_spare_bits(d_bits, 20, "D1..D20");
+	check_spare_bits(d_bits + 233, 20, "D234..D253");
 }
 
 static void
@@ -480,6 +511,9 @@
 	fputs("    SID", stdout);
 	print_generic_params(d_bits + 57, params_sid);
 	putchar('\n');
+	check_spare_bits(d_bits, 31, "D1..D31");
+	check_spare_bits(d_bits + 43, 14, "D44..D57");
+	check_spare_bits(d_bits + 95, 256 - 95, "D96..D256");
 }
 
 void