diff libgsmfr2/tw_gsmfr.h @ 256:a33edf624061

libgsmfr2: start with API definition and port of libgsmfrp code
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 12 Apr 2024 20:49:53 +0000
parents
children bebae251e5ee
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmfr2/tw_gsmfr.h	Fri Apr 12 20:49:53 2024 +0000
@@ -0,0 +1,113 @@
+/*
+ * This header file is the external public interface to libgsmfr2:
+ * Themyscira Wireless implementation of GSM FRv1 speech codec
+ * that includes not only the core transcoding functions of GSM 06.10,
+ * but also Rx DTX functions (substitution and muting per GSM 06.11,
+ * comfort noise per GSM 06.12, overall Rx DTX control per GSM 06.31)
+ * in the decoder direction and the optional homing frame mechanism.
+ *
+ * This header file should be installed in some system include directory
+ * such that it can be included by C sources as <tw_gsmfr.h>.
+ */
+
+#ifndef	__THEMWI_GSMFR_H
+#define	__THEMWI_GSMFR_H
+
+#include <stdint.h>
+
+#define	GSMFR_RTP_FRAME_LEN	33
+#define	GSMFR_NUM_PARAMS	76
+
+/*
+ * GSM 06.10 encoder & decoder portion of the library
+ *
+ * This part is peculiar in that the same state structure is used for
+ * both the encoder and the decoder - however, each given instance
+ * of this state structure must be used for only one of the two.
+ */
+
+struct gsmfr_0610_state;	/* opaque to external users */
+
+struct gsmfr_0610_state *gsmfr_0610_create(void);
+/* use standard free() call to free it afterward */
+
+/* reset state to initial */
+void gsmfr_0610_reset(struct gsmfr_0610_state *state);
+
+/* interface structure for passing frames of codec parameters */
+
+struct gsmfr_param_frame {
+	int16_t	LARc[8];
+	int16_t	Nc[4];
+	int16_t	bc[4];
+	int16_t	Mc[4];
+	int16_t	xmaxc[4];
+	int16_t	xMc[4][13];
+};
+
+/* encoder public functions */
+
+void gsmfr_0610_encode_params(struct gsmfr_0610_state *st, const int16_t *pcm,
+			      struct gsmfr_param_frame *param);
+void gsmfr_0610_encode_frame(struct gsmfr_0610_state *st, const int16_t *pcm,
+			     uint8_t *frame);
+void gsmfr_0610_encoder_homing(struct gsmfr_0610_state *st, const int16_t *pcm);
+
+/* decoder public functions */
+
+void gsmfr_0610_decode_params(struct gsmfr_0610_state *st,
+			      const struct gsmfr_param_frame *param,
+			      int16_t *pcm);
+void gsmfr_0610_decode_frame(struct gsmfr_0610_state *st, const uint8_t *frame,
+			     int16_t *pcm);
+
+/* conversion between RTP packed format and struct gsmfr_param_frame */
+
+void gsmfr_pack_frame(const struct gsmfr_param_frame *param, uint8_t *frame);
+void gsmfr_unpack_frame(const uint8_t *frame, struct gsmfr_param_frame *param);
+
+/* Rx DTX handler preprocessor portion of the library */
+
+struct gsmfr_preproc_state;	/* opaque to external users */
+
+struct gsmfr_preproc_state *gsmfr_preproc_create(void);
+/* use standard free() call to free it afterward */
+
+/* reset state to initial */
+void gsmfr_preproc_reset(struct gsmfr_preproc_state *state);
+
+/* main processing functions */
+void gsmfr_preproc_good_frame(struct gsmfr_preproc_state *state,
+				uint8_t *frame);
+void gsmfr_preproc_bfi(struct gsmfr_preproc_state *state, int taf,
+			uint8_t *frame_out);
+
+/* utility function */
+int gsmfr_preproc_sid_classify(const uint8_t *frame);
+
+/* utility datum */
+extern const uint8_t gsmfr_preproc_silence_frame[GSMFR_RTP_FRAME_LEN];
+
+/*
+ * Full GSM-FR decoder: Rx DTX handler followed by 06.10 decoder,
+ * plus the decoder homing function.
+ */
+
+struct gsmfr_fulldec_state;	/* opaque to external users */
+
+struct gsmfr_fulldec_state *gsmfr_fulldec_create(void);
+/* use standard free() call to free it afterward */
+
+/* reset state to initial */
+void gsmfr_fulldec_reset(struct gsmfr_fulldec_state *state);
+
+/* main processing functions */
+void gsmfr_fulldec_good_frame(struct gsmfr_fulldec_state *state,
+				const uint8_t *frame, int16_t *pcm);
+void gsmfr_fulldec_bfi(struct gsmfr_fulldec_state *state, int taf,
+			int16_t *pcm);
+
+/* utility datum */
+extern const uint8_t gsmfr_decoder_homing_frame[GSMFR_RTP_FRAME_LEN];
+
+#endif	/* include guard */