FreeCalypso > hg > gsm-codec-lib
view libgsmhr1/rtp_in_direct.c @ 586:b21ea4ab586d
libgsmhr1: update for TW-TS-002 version 1.2.0
The component of libgsmhr1 being changed is RTP input functions;
the change is accepting FT=1 (invalid SID) frames both with and
without payload data bits.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Mon, 10 Mar 2025 02:03:31 +0000 |
parents | 5bf71b091323 |
children |
line wrap: on
line source
/* * The function implemented in this module takes whatever HRv1 payload format * came in from RTP (can be RFC 5993 with or without TW-TS-002 extensions, * can be bare TS 101 318, can be zero-length or missing payload) and turns it * into the internal input form for the HRv1 decoder. It is logically * equivalent to calling gsmhr_rtp_in_preen() followed by * gsmhr_decoder_twts002_in(), but is more efficient by avoiding the extra * intermediate buffer and copying. */ #include <stdint.h> #include <string.h> #include "tw_gsmhr.h" static void emit_bfi_nodata(int16_t *params) { memset(params, 0, sizeof(int16_t) * GSMHR_NUM_PARAMS); params[18] = 2; /* BFI with no data */ params[19] = 0; /* UFI */ params[20] = 0; /* SID */ params[21] = 0; /* TAF */ } int gsmhr_rtp_in_direct(const uint8_t *rtp_in, unsigned rtp_in_len, int16_t *params) { int ft; switch (rtp_in_len) { case 0: /* BFI-no-data, but not an invalid RTP input per se */ emit_bfi_nodata(params); return 0; case 1: /* * This length is valid only if the payload is in * RFC 5993 or TW-TS-002 format with FT=1 or FT=7. */ if (rtp_in[0] & 0x80) goto bad_rtp_input; ft = rtp_in[0] >> 4; switch (ft) { case 1: if (rtp_in[0] & 0x04) goto bad_rtp_input; /* FALL THRU */ case 7: gsmhr_decoder_twts002_in(rtp_in, params); return 0; default: goto bad_rtp_input; } case GSMHR_FRAME_LEN_RPF: /* * The length is that of a TS 101 318 payload. * No further checks can be done: every possible * bit pattern is a valid payload in this format. * But we do need to check for a perfect SID * (the only kind of SID this format allows) * and mark it accordingly in the output. */ gsmhr_unpack_ts101318(rtp_in, params); params[18] = 0; /* BFI */ params[19] = 0; /* UFI */ params[20] = gsmhr_ts101318_is_perfect_sid(rtp_in); params[21] = 0; /* TAF */ return 0; case GSMHR_FRAME_LEN_5993: /* * This length is valid only if the payload is in * RFC 5993 or TW-TS-002 format with FT=0, FT=2 or FT=6. */ if (rtp_in[0] & 0x80) goto bad_rtp_input; ft = rtp_in[0] >> 4; switch (ft) { case 1: if (!(rtp_in[0] & 0x04)) goto bad_rtp_input; /* FALL THRU */ case 0: case 2: case 6: gsmhr_decoder_twts002_in(rtp_in, params); return 0; default: goto bad_rtp_input; } default: bad_rtp_input: /* * Treat it like BFI-no-data, and tell the caller * that we received an invalid RTP payload. */ emit_bfi_nodata(params); return -1; } }