FreeCalypso > hg > gsm-codec-lib
changeset 532:5a3535470c95
libgsmfr2 TFO: implement DTXd function
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 19 Sep 2024 21:00:18 +0000 |
parents | c7b1e796e91b |
children | 3a617e4e9b27 |
files | libgsmfr2/Makefile libgsmfr2/tfo_dtxd.c |
diffstat | 2 files changed, 33 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/libgsmfr2/Makefile Thu Sep 19 20:35:10 2024 +0000 +++ b/libgsmfr2/Makefile Thu Sep 19 21:00:18 2024 +0000 @@ -2,7 +2,7 @@ enc_homing.o enc_main.o enc_wrap.o full_dec.o full_dec_wrap.o \ long_term.o lpc.o pack_frame.o pack_frame2.o pp_bad.o pp_good.o \ pp_homing.o pp_state.o preprocess.o prng.o rpe.o short_term.o \ - sidclass.o silence_frame.o table.o tfo_main.o unpack_frame.o \ + sidclass.o silence_frame.o table.o tfo_dtxd.o tfo_main.o unpack_frame.o\ unpack_frame2.o xmaxc_mean.o HDRS= ed_internal.h ed_state.h pp_internal.h pp_state.h tw_gsmfr.h typedef.h LIB= libgsmfr2.a
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgsmfr2/tfo_dtxd.c Thu Sep 19 21:00:18 2024 +0000 @@ -0,0 +1,32 @@ +/* + * The function implemented in this module is a post-processor to be invoked + * after Rx DTX preproc functions if the Rx DTX handler block is used as a + * TFO transform with DTXd enabled. It selectively transforms certain + * preproc output frames (CN and silence frames specifically) into SID, + * thereby allowing the network operator to reap the benefits of DTX on + * the radio downlink leg. + */ + +#include <stdint.h> +#include "tw_gsmfr.h" +#include "pp_state.h" + +int gsmfr_tfo_xfrm_dtxd(struct gsmfr_preproc_state *st, uint8_t *frame) +{ + uint8_t *p, sub; + + if (!st->dtxd_sid_flag) + return 1; /* SP=1: output is a speech frame */ + /* turn the output frame into SID */ + p = frame + 5; /* skip magic+LARc */ + for (sub = 0; sub < 4; sub++) { + *p++ = 0; + *p++ &= 0x1F; /* upper 5 bits of Xmaxc field */ + *p++ &= 0x80; /* and the lsb spilling into the next byte */ + *p++ = 0; + *p++ = 0; + *p++ = 0; + *p++ = 0; + } + return 0; /* SP=0: output is SID */ +}