FreeCalypso > hg > gsm-codec-lib
view libgsmfr2/full_dec_wrap.c @ 528:f681fb758041
libgsmfr2: add gsmfr_fulldec_rtp_in()
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 19 Sep 2024 07:52:17 +0000 |
parents | |
children |
line wrap: on
line source
/* * This module implements a wrapper around the main processing functions * of our full decoder, handling RTP input per TW-TS-001. */ #include <stdint.h> #include "tw_gsmfr.h" int gsmfr_fulldec_rtp_in(struct gsmfr_fulldec_state *st, const uint8_t *rtp_pl, unsigned rtp_pl_len, int16_t *pcm) { switch (rtp_pl_len) { case 0: /* BFI-no-data, but not an invalid RTP input per se */ gsmfr_fulldec_bfi(st, 0, pcm); return 0; case 1: if ((rtp_pl[0] & 0xF6) != 0xE6) goto bad_rtp_input; /* TW-TS-001 No_Data frame */ gsmfr_fulldec_bfi(st, rtp_pl[0] & 1, pcm); return 0; case GSMFR_RTP_FRAME_LEN: if ((rtp_pl[0] & 0xF0) != 0xD0) goto bad_rtp_input; /* basic RTP format */ gsmfr_fulldec_good_frame(st, rtp_pl, pcm); 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_fulldec_bfi_bits(st, rtp_pl + 1, rtp_pl[0] & 1, pcm); else gsmfr_fulldec_good_frame(st, rtp_pl + 1, pcm); return 0; default: bad_rtp_input: /* * Treat it like BFI-no-data, and tell the caller * that we received an invalid RTP payload. */ gsmfr_fulldec_bfi(st, 0, pcm); return -1; } }