view libtwamr/ietf_in.c @ 468:4104b0390fab

efrtest: new program gsmefr-dlcap-sync
author Mychaela Falconia <falcon@freecalypso.org>
date Mon, 13 May 2024 07:21:09 +0000
parents ebe499058c63
children
line wrap: on
line source

/*
 * The function implemented in this module is responsible for parsing
 * an incoming RFC 4867 payload and turning it into struct amr_param_frame
 * for decoding.
 */

#include <stdint.h>
#include "tw_amr.h"
#include "typedef.h"
#include "namespace.h"
#include "cnst.h"
#include "int_defs.h"
#include "if1_func.h"

int amr_frame_from_ietf(const uint8_t *bytes, struct amr_param_frame *frame)
{
	Word16 ft, q, sti;
	Word16 serial[MAX_SERIAL_SIZE];

	ft = (bytes[0] & 0x78) >> 3;
	q  = (bytes[0] & 0x04) >> 2;
	if (ft == AMR_FT_NODATA) {
		frame->type = RX_NO_DATA;
		frame->mode = 0xFF;
		return 0;
	}
	if (ft > MRDTX)
		return -1;
	if1_unpack_bytes(ft, bytes + 1, serial);
	Bits2prm(ft, serial, frame->param);
	if (ft != MRDTX) {
		frame->type = q ? RX_SPEECH_GOOD : RX_SPEECH_BAD;
		frame->mode = ft;
	} else {
		sti = (bytes[5] & 0x10) >> 4;
		frame->mode = 0;
		if (bytes[5] & 0x08)
			frame->mode |= 1;
		if (bytes[5] & 0x04)
			frame->mode |= 2;
		if (bytes[5] & 0x02)
			frame->mode |= 4;
		if (q)
			frame->type = sti ? RX_SID_UPDATE : RX_SID_FIRST;
		else
			frame->type = RX_SID_BAD;
	}
	return 0;
}