# HG changeset patch # User Mychaela Falconia # Date 1726778110 0 # Node ID c7b1e796e91bbef03901c8dc766f015d20fd8408 # Parent 96c4ed5529bfd403d7d84ac72dd228f6bcf1626f libgsmfr2 TFO: implement main entry point function diff -r 96c4ed5529bf -r c7b1e796e91b libgsmfr2/Makefile --- a/libgsmfr2/Makefile Thu Sep 19 20:15:54 2024 +0000 +++ b/libgsmfr2/Makefile Thu Sep 19 20:35:10 2024 +0000 @@ -2,8 +2,8 @@ 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 unpack_frame.o unpack_frame2.o \ - xmaxc_mean.o + sidclass.o silence_frame.o table.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 96c4ed5529bf -r c7b1e796e91b libgsmfr2/tfo_main.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libgsmfr2/tfo_main.c Thu Sep 19 20:35:10 2024 +0000 @@ -0,0 +1,54 @@ +/* + * This module implements a wrapper around the main processing functions + * of our Rx DTX or TFO preprocessor, handling RTP input per TW-TS-001. + */ + +#include +#include +#include "tw_gsmfr.h" + +int gsmfr_tfo_xfrm_main(struct gsmfr_preproc_state *st, const uint8_t *rtp_pl, + unsigned rtp_pl_len, uint8_t *out) +{ + switch (rtp_pl_len) { + case 0: + /* BFI-no-data, but not an invalid RTP input per se */ + gsmfr_preproc_bfi(st, 0, out); + return 0; + case 1: + if ((rtp_pl[0] & 0xF6) != 0xE6) + goto bad_rtp_input; + /* TW-TS-001 No_Data frame */ + gsmfr_preproc_bfi(st, rtp_pl[0] & 1, out); + return 0; + case GSMFR_RTP_FRAME_LEN: + if ((rtp_pl[0] & 0xF0) != 0xD0) + goto bad_rtp_input; + /* basic RTP format */ + memcpy(out, rtp_pl, GSMFR_RTP_FRAME_LEN); + gsmfr_preproc_good_frame_hm(st, out); + return 0; + case GSMFR_RTP_FRAME_LEN+1: + if ((rtp_pl[0] & 0xF4) != 0xE0) + goto bad_rtp_input; + if ((rtp_pl[1] & 0xF0) != 0xD0) + goto bad_rtp_input; + /* extended RTP format (TW-TS-001) */ + if (rtp_pl[0] & 0x02) + gsmfr_preproc_bfi_bits(st, rtp_pl + 1, rtp_pl[0] & 1, + out); + else { + memcpy(out, rtp_pl + 1, GSMFR_RTP_FRAME_LEN); + gsmfr_preproc_good_frame_hm(st, out); + } + return 0; + default: + bad_rtp_input: + /* + * Treat it like BFI-no-data, and tell the caller + * that we received an invalid RTP payload. + */ + gsmfr_preproc_bfi(st, 0, out); + return -1; + } +}