view libgsmfr2/tfo_main.c @ 540:5595293e4f29

gsmx-to-tw5a utility: use emit_hex_frame() in libtest
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 22 Sep 2024 00:36:35 +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;
	}
}