diff libgsmefr/enc_main.c @ 112:035424a6ca83

libgsmefr: encoder main function put together
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 29 Nov 2022 07:05:59 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmefr/enc_main.c	Tue Nov 29 07:05:59 2022 +0000
@@ -0,0 +1,58 @@
+/*
+ * This module contains our GSM EFR encoder main function, EFR_encode_params(),
+ * that stands at the boundary between our public interface and the guts of
+ * ETSI-based codec.
+ */
+
+#include "gsm_efr.h"
+#include "typedef.h"
+#include "namespace.h"
+#include "basic_op.h"
+#include "cnst.h"
+#include "codec.h"
+#include "sig_proc.h"
+#include "memops.h"
+#include "enc_state.h"
+#include "e_homing.h"
+#include "dtx.h"
+
+void EFR_encode_params(struct EFR_encoder_state *st, const int16_t *pcm_in,
+			int16_t *params, int *sp_out, int *vad_out)
+{
+	Word16 *new_speech = st->old_speech + L_TOTAL - L_FRAME;
+	Word16 syn[L_FRAME];
+	Word16 reset_flag;
+	Word16 i;
+
+        /* Check whether this frame is an encoder homing frame */
+        reset_flag = encoder_homing_frame_test (pcm_in);
+
+        for (i = 0; i < L_FRAME; i++)   /* Delete the 3 LSBs (13-bit input) */
+        {
+            new_speech[i] = pcm_in[i] & 0xfff8;
+        }
+
+        Pre_Process (st, new_speech, L_FRAME);       /* filter + downscaling */
+
+        Coder_12k2 (st, params, syn);    /* Find speech parameters   */
+
+        if ((st->txdtx_ctrl & TX_SP_FLAG) == 0)
+        {
+            /* Write comfort noise parameters into the parameter frame.
+            Use old parameters in case SID frame is not to be updated */
+            CN_encoding (st, params, st->txdtx_ctrl);
+        }
+
+        /* VAD and SP flag outputs */
+        if (vad_out)
+            *vad_out = ((st->txdtx_ctrl & TX_VAD_FLAG) != 0);
+
+        if (sp_out)
+            *sp_out = ((st->txdtx_ctrl & TX_SP_FLAG) != 0);
+
+        if (reset_flag != 0)
+        {
+            /* Bring the encoder, VAD and DTX to the home state */
+            EFR_encoder_reset(st, st->dtx_mode);
+        }
+}