diff libgsmefr/dec_main.c @ 94:d80e9f12a1d1

libgsmefr: decoder main function put together
author Mychaela Falconia <falcon@freecalypso.org>
date Sat, 26 Nov 2022 18:52:49 +0000
parents
children 18866c0354ef
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libgsmefr/dec_main.c	Sat Nov 26 18:52:49 2022 +0000
@@ -0,0 +1,90 @@
+/*
+ * This module contains our GSM EFR decoder main function, EFR_decode_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 "cnst.h"
+#include "codec.h"
+#include "sig_proc.h"
+#include "memops.h"
+#include "dec_state.h"
+#include "d_homing.h"
+
+/* These constants define the number of consecutive parameters
+   that function decoder_homing_frame_test() checks */
+
+#define WHOLE_FRAME 57
+#define TO_FIRST_SUBFRAME 18
+
+void EFR_decode_params(struct EFR_decoder_state *st, const int16_t *params,
+			int bfi, int SID_flag, int TAF, int16_t *pcm_out)
+{
+	Word16 *synth = st->synth_buf + M;
+	Word16 Az_dec[AZ_SIZE];
+	Word16 i, temp;
+	Word16 reset_flag;
+
+        if (!bfi)                       /* BFI == 0, perform DHF check */
+        {
+            if (st->reset_flag_old)     /* Check for second and further
+                                           successive DHF (to first subfr.) */
+            {
+                reset_flag = decoder_homing_frame_test (params,
+                                                        TO_FIRST_SUBFRAME);
+            }
+            else
+            {
+                reset_flag = 0;
+            }
+        }
+        else                          /* BFI==1, bypass DHF check (frame
+                                           is taken as not being a DHF) */
+        {
+            reset_flag = 0;
+        }
+
+        if (reset_flag && st->reset_flag_old)
+        {
+            /* Force the output to be the encoder homing frame pattern */
+
+            for (i = 0; i < L_FRAME; i++)
+            {
+                synth[i] = EHF_MASK;
+            }
+        }
+        else
+        {
+            /* Synthesis */
+            Decoder_12k2 (st, bfi, params, synth, Az_dec, TAF, SID_flag);
+
+            Post_Filter (st, synth, Az_dec);                  /* Post-filter */
+
+            for (i = 0; i < L_FRAME; i++) 
+                /* Upscale the 15 bit linear PCM to 16 bits,
+                   then truncate to 13 bits */
+            {
+                temp = synth[i] << 1;
+                synth[i] = temp & 0xfff8;
+            }
+        }                       /* else */
+
+        Copy (synth, pcm_out, L_FRAME);
+
+        /* BFI == 0, perform check for first DHF (whole frame) */
+        if (!bfi && !st->reset_flag_old)
+        {
+            reset_flag = decoder_homing_frame_test (params, WHOLE_FRAME);
+        }
+
+        if (reset_flag)
+        {
+            /* Bring the decoder and receive DTX to the home state */
+            EFR_decoder_reset(st);
+        } else {
+            st->reset_flag_old = 0;
+        }
+}