view amrconv/amr_defs.h @ 242:f081a6850fb5

libgsmfrp: new refined implementation The previous implementation exhibited the following defects, which are now fixed: 1) The last received valid SID was cached forever for the purpose of handling future invalid SIDs - we could have received some valid SID ages ago, then lots of speech or NO_DATA, and if we then get an invalid SID, we would resurrect the last valid SID from ancient history - a bad design. In our new design, we handle invalid SID based on the current state, much like BFI. 2) GSM 06.11 spec says clearly that after the second lost SID (received BFI=1 && TAF=1 in CN state) we need to gradually decrease the output level, rather than jump directly to emitting silence frames - we previously failed to implement such logic. 3) Per GSM 06.12 section 5.2, Xmaxc should be the same in all 4 subframes in a SID frame. What should we do if we receive an otherwise valid SID frame with different Xmaxc? Our previous approach would replicate this Xmaxc oddity in every subsequent generated CN frame, which is rather bad. In our new design, the very first CN frame (which can be seen as a transformation of the SID frame itself) retains the original 4 distinct Xmaxc, but all subsequent CN frames are based on the Xmaxc from the last subframe of the most recent SID.
author Mychaela Falconia <falcon@freecalypso.org>
date Tue, 09 May 2023 05:16:31 +0000
parents 934cf92a1c45
children
line wrap: on
line source

/*
 * This header file holds some miscellaneous definitions for AMR,
 * to be used by parsing and conversion debug utilities.
 */

#define	MAX_PRM_SIZE		57	/* max. num. of params      */
#define	MAX_SERIAL_SIZE		244	/* max. num. of serial bits */
#define	MAX_IF1_BYTES		31	/* max bytes in AMR IF1 packing */
#define	IETF_HDR_LEN		6	/* .amr file header bytes */

enum TXFrameType {
	TX_SPEECH_GOOD = 0,
	TX_SID_FIRST,
	TX_SID_UPDATE,
	TX_NO_DATA,
	TX_SPEECH_DEGRADED,
	TX_SPEECH_BAD,
	TX_SID_BAD,
	TX_ONSET,
	TX_N_FRAMETYPES		/* number of frame types */
};

enum Mode {
	MR475 = 0,
	MR515,            
	MR59,
	MR67,
	MR74,
	MR795,
	MR102,
	MR122,            
	MRDTX
};

#define	MODE_NO_DATA		15

/* number of speech bits for all modes */
#define	AMR_NBITS_475		95
#define	AMR_NBITS_515		103
#define	AMR_NBITS_59		118
#define	AMR_NBITS_67		134
#define	AMR_NBITS_74		148
#define	AMR_NBITS_795		159
#define	AMR_NBITS_102		204
#define	AMR_NBITS_122		244
#define	AMR_NBITS_SID		35

/* number of distinct parameters for all modes */
#define	PRMNO_MR475		17
#define	PRMNO_MR515		19
#define	PRMNO_MR59		19
#define	PRMNO_MR67		19
#define	PRMNO_MR74		19
#define	PRMNO_MR795		23
#define	PRMNO_MR102		39
#define	PRMNO_MR122		57
#define	PRMNO_MRDTX		5

/* ETSI/3GPP test sequence file format */
#define	COD_FORMAT_NWORDS	250