changeset 10:820d88b97924

libtest: implement binary file reader
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 19 Nov 2022 23:57:42 +0000
parents 4229247843c0
children a3aa152c4653
files doc/Binary-file-format libtest/Makefile libtest/binreader.c libtest/binreader.h
diffstat 4 files changed, 65 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/Binary-file-format	Sat Nov 19 23:57:42 2022 +0000
@@ -0,0 +1,21 @@
+We (Themyscira Wireless) define our own binary file format for testing of GSM
+06.10 (FR) and EFR codec functions; this format of ours is an extension of
+classic .gsm format from libgsm/toast.  The original libgsm file format is a
+directly abutted sequence of 33-byte libgsm frames, equivalent to RTP frames
+for GSM FR, with the upper nibble of the first byte in each frame equal to 0xD,
+serving as a signature.  We simply extend this idea: our version is still a
+directly abutted sequence of binary records, but each record is now one of 3
+possibilities:
+
+- a 33-byte GSM FR frame in libgsm/RTP format, 0xD signature
+- a 31-byte GSM EFR frame in RTP format (ETSI TS 101 318), 0xC signature
+- a 2-byte Themyscira-extension BFI marker, 0xBF signature
+
+File reading functions begin by reading only one byte; this byte, once decoded,
+tells us how many more bytes need to be read, and frame synchronization is thus
+maintained.
+
+FR and EFR frames are not expected to be mixed in the same stream recording;
+our low-level binary file reading function will grok such mixing just fine, but
+each higher-level test program is expected to be written for only one codec,
+either FR or EFR.
--- a/libtest/Makefile	Sat Nov 19 23:09:44 2022 +0000
+++ b/libtest/Makefile	Sat Nov 19 23:57:42 2022 +0000
@@ -1,6 +1,6 @@
 CC=	gcc
 CFLAGS=	-O2
-OBJS=	wavreader.o wavwriter.o
+OBJS=	binreader.o wavreader.o wavwriter.o
 LIB=	libtest.a
 
 all:	${LIB}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtest/binreader.c	Sat Nov 19 23:57:42 2022 +0000
@@ -0,0 +1,29 @@
+/*
+ * Here we implement our binfile_read_frame() function.
+ */
+
+#include <stdio.h>
+#include <stdint.h>
+#include "binreader.h"
+
+int binfile_read_frame(FILE *binf, uint8_t *frame)
+{
+	int cc, morelen;
+
+	cc = fread(frame, 1, 1, binf);
+	if (cc != 1)
+		return 0;
+	if (frame[0] == 0xBF)
+		morelen = 1;
+	else if ((frame[0] & 0xF0) == 0xC0)
+		morelen = 30;
+	else if ((frame[0] & 0xF0) == 0xD0)
+		morelen = 32;
+	else
+		return -1;
+	cc = fread(frame+1, 1, morelen, binf);
+	if (cc == morelen)
+		return 1;
+	else
+		return -2;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libtest/binreader.h	Sat Nov 19 23:57:42 2022 +0000
@@ -0,0 +1,14 @@
+/*
+ * This header file defines the interface to our reader function for binary
+ * files recording GSM FR or EFR streams, see ../doc/Binary-file-format.
+ *
+ * binfile_read_frame() return values are:
+ *  1 = successfully read valid frame
+ *  0 = normal EOF
+ * -1 = unrecognized header byte
+ * -2 = EOF in the middle of a frame
+ */
+
+#define	BINFILE_MAX_FRAME	33
+
+extern int binfile_read_frame(FILE *binf, uint8_t *frame);