# HG changeset patch # User Mychaela Falconia # Date 1726779618 0 # Node ID 5a3535470c9522bfdc7aad4c52f5f4bafc3efc14 # Parent c7b1e796e91bbef03901c8dc766f015d20fd8408 libgsmfr2 TFO: implement DTXd function diff -r c7b1e796e91b -r 5a3535470c95 libgsmfr2/Makefile --- 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 diff -r c7b1e796e91b -r 5a3535470c95 libgsmfr2/tfo_dtxd.c --- /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 +#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 */ +}