FreeCalypso > hg > gsm-codec-lib
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; + } +}