FreeCalypso > hg > gsm-codec-lib
view libgsmfr2/tfo_main.c @ 548:583dc4cbee95
efrtest: new program gsmefr-decode-tw5-r
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 04 Oct 2024 20:40:42 +0000 |
parents | c7b1e796e91b |
children |
line wrap: on
line source
/* * 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 <stdint.h> #include <string.h> #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; } }