FreeCalypso > hg > gsm-codec-lib
view libtwamr/ietf_in.c @ 477:4c9222d95647
libtwamr encoder: always emit frame->mode = mode;
In the original implementation of amr_encode_frame(), the 'mode' member
of the output struct was set to 0xFF if the output frame type is TX_NO_DATA.
This design was made to mimic the mode field (16-bit word) being set to
0xFFFF (or -1) in 3GPP test sequence format - but nothing actually depends
on this struct member being set in any way, and amr_frame_to_tseq()
generates the needed 0xFFFF on its own, based on frame->type being equal
to TX_NO_DATA.
It is simpler and more efficient to always set frame->mode to the actual
encoding mode in amr_encode_frame(), and this new behavior has already
been documented in doc/AMR-library-API description in anticipation of
the present change.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 18 May 2024 22:30:42 +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; }