libosmocodec 1.11.0.23-fd0d
Osmocom codec library
|
#include <stdint.h>
#include <stdbool.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/bits.h>
Go to the source code of this file.
Macros | |
#define | GSM_FR_BYTES 33 |
#define | GSM_HR_BYTES 14 |
#define | GSM_EFR_BYTES 31 |
#define | GSM_HR_BYTES_RTP_RFC5993 (GSM_HR_BYTES + 1) |
#define | GSM_HR_BYTES_RTP_TS101318 (GSM_HR_BYTES) |
Enumerations | |
enum | osmo_amr_type { AMR_4_75 = 0 , AMR_5_15 = 1 , AMR_5_90 = 2 , AMR_6_70 = 3 , AMR_7_40 = 4 , AMR_7_95 = 5 , AMR_10_2 = 6 , AMR_12_2 = 7 , AMR_SID = 8 , AMR_GSM_EFR_SID = 9 , AMR_TDMA_EFR_SID = 10 , AMR_PDC_EFR_SID = 11 , AMR_NO_DATA = 15 } |
enum | osmo_amr_quality { AMR_BAD = 0 , AMR_GOOD = 1 } |
enum | osmo_gsm631_sid_class { OSMO_GSM631_SID_CLASS_SPEECH = 0 , OSMO_GSM631_SID_CLASS_INVALID = 1 , OSMO_GSM631_SID_CLASS_VALID = 2 } |
Functions | |
static const char * | osmo_amr_type_name (enum osmo_amr_type type) |
int | osmo_amr_s_to_d (ubit_t *out, const ubit_t *in, uint16_t n_bits, enum osmo_amr_type amr_mode) |
Convert from S-bits (codec output) to d-bits. More... | |
int | osmo_amr_d_to_s (ubit_t *out, const ubit_t *in, uint16_t n_bits, enum osmo_amr_type amr_mode) |
Convert from d-bits to s-bits (codec input). More... | |
static bool | osmo_amr_is_speech (enum osmo_amr_type ft) |
Check if given AMR Frame Type is a speech frame. More... | |
bool | osmo_fr_check_sid (const uint8_t *rtp_payload, size_t payload_len) |
Check whether RTP frame contains FR SID code word according to TS 101 318 §5.1.2. More... | |
bool | osmo_hr_check_sid (const uint8_t *rtp_payload, size_t payload_len) |
Check whether RTP frame contains HR SID code word according to TS 101 318 §5.2.2. More... | |
bool | osmo_efr_check_sid (const uint8_t *rtp_payload, size_t payload_len) |
Check whether RTP frame contains EFR SID code word according to TS 101 318 §5.3.2. More... | |
enum osmo_gsm631_sid_class | osmo_fr_sid_classify (const uint8_t *rtp_payload) |
Classify potentially-SID FR codec frame in RTP format according to the rules of GSM 06.31 §6.1.1. More... | |
enum osmo_gsm631_sid_class | osmo_efr_sid_classify (const uint8_t *rtp_payload) |
Classify potentially-SID EFR codec frame in RTP format according to the rules of GSM 06.81 §6.1.1. More... | |
enum osmo_gsm631_sid_class | osmo_hr_sid_classify (const uint8_t *rtp_payload, bool bci_flag, bool *bfi_from_bci) |
static bool | osmo_fr_is_any_sid (const uint8_t *rtp_payload) |
Check if given FR codec frame is any kind of SID, valid or invalid. More... | |
static bool | osmo_efr_is_any_sid (const uint8_t *rtp_payload) |
Check if given EFR codec frame is any kind of SID, valid or invalid. More... | |
bool | osmo_fr_sid_preen (uint8_t *rtp_payload) |
Preen potentially-SID FR codec frame in RTP format, ensuring that it is either a speech frame or a valid SID, and if the latter, making it a perfect, error-free SID frame. More... | |
bool | osmo_efr_sid_preen (uint8_t *rtp_payload) |
Preen potentially-SID EFR codec frame in RTP format, ensuring that it is either a speech frame or a valid SID, and if the latter, making it a perfect, error-free SID frame. More... | |
void | osmo_fr_sid_reset (uint8_t *rtp_payload) |
Reset the SID field and the unused bits of a potentially corrupted, but still valid GSM-FR SID frame in RTP encoding to their pristine state. More... | |
void | osmo_hr_sid_reset (uint8_t *rtp_payload) |
Reset the SID field of a potentially corrupted, but still valid GSM-HR SID frame in TS 101 318 format to its pristine state (full SID codeword). More... | |
void | osmo_efr_sid_reset (uint8_t *rtp_payload) |
Reset the SID field of a potentially corrupted, but still valid GSM-EFR SID frame in RTP encoding to its pristine state (full SID code word). More... | |
int | osmo_amr_rtp_enc (uint8_t *payload, uint8_t cmr, enum osmo_amr_type ft, enum osmo_amr_quality bfi) |
Encode various AMR parameters from RTP payload (RFC 4867) More... | |
int | osmo_amr_rtp_dec (const uint8_t *payload, int payload_len, uint8_t *cmr, int8_t *cmi, enum osmo_amr_type *ft, enum osmo_amr_quality *bfi, int8_t *sti) |
Decode various AMR parameters from RTP payload (RFC 4867) acording to 3GPP TS 26.101. More... | |
Variables | |
const uint16_t | gsm610_bitorder [] |
const uint16_t | gsm620_unvoiced_bitorder [] |
const uint16_t | gsm620_voiced_bitorder [] |
const uint16_t | gsm660_bitorder [] |
const uint16_t | gsm690_12_2_bitorder [] |
const uint16_t | gsm690_10_2_bitorder [] |
const uint16_t | gsm690_7_95_bitorder [] |
const uint16_t | gsm690_7_4_bitorder [] |
const uint16_t | gsm690_6_7_bitorder [] |
const uint16_t | gsm690_5_9_bitorder [] |
const uint16_t | gsm690_5_15_bitorder [] |
const uint16_t | gsm690_4_75_bitorder [] |
const uint8_t | osmo_gsm611_silence_frame [GSM_FR_BYTES] |
const uint8_t | osmo_gsm620_silence_frame [GSM_HR_BYTES] |
const uint8_t | osmo_gsm620_homing_frame [GSM_HR_BYTES] |
const uint8_t | osmo_gsm660_homing_frame [GSM_EFR_BYTES] |
const struct value_string | osmo_amr_type_names [] |
const uint8_t | gsm690_bitlength [AMR_NO_DATA+1] |
These constants refer to the length of one "AMR core frame" as per TS 26.101 Section 4.2.2 / Table 2. More... | |
#define GSM_EFR_BYTES 31 |
#define GSM_FR_BYTES 33 |
#define GSM_HR_BYTES 14 |
#define GSM_HR_BYTES_RTP_RFC5993 (GSM_HR_BYTES + 1) |
#define GSM_HR_BYTES_RTP_TS101318 (GSM_HR_BYTES) |
enum osmo_amr_quality |
enum osmo_amr_type |
int osmo_amr_d_to_s | ( | ubit_t * | out, |
const ubit_t * | in, | ||
uint16_t | n_bits, | ||
enum osmo_amr_type | amr_mode | ||
) |
Convert from d-bits to s-bits (codec input).
[out] | out | user-provided output buffer for generated unpacked s-bits |
[in] | in | input buffer for unpacked d-bits |
[in] | n_bits | number of bits (in both in and out) |
[in] | AMR | mode (0..7) |
References ARRAY_SIZE, ts26101_reorder_table::len, n, ts26101_reorder_table::s_to_d, and ts26101_reorder_tables.
|
inlinestatic |
int osmo_amr_rtp_dec | ( | const uint8_t * | rtppayload, |
int | payload_len, | ||
uint8_t * | cmr, | ||
int8_t * | cmi, | ||
enum osmo_amr_type * | ft, | ||
enum osmo_amr_quality * | bfi, | ||
int8_t * | sti | ||
) |
Decode various AMR parameters from RTP payload (RFC 4867) acording to 3GPP TS 26.101.
[in] | rtppayload | Payload from RTP packet |
[in] | payload_len | length of rtppayload |
[out] | cmr | AMR Codec Mode Request, not filled if NULL |
[out] | cmi | AMR Codec Mode Indicator, -1 if not applicable for this type, not filled if NULL |
[out] | ft | AMR Frame Type, not filled if NULL |
[out] | bfi | AMR Bad Frame Indicator, not filled if NULL |
[out] | sti | AMR SID Type Indicator, -1 if not applicable for this type, not filled if NULL |
References amr_len_by_ft, AMR_SID, ENOTSUP, and type.
int osmo_amr_rtp_enc | ( | uint8_t * | payload, |
uint8_t | cmr, | ||
enum osmo_amr_type | ft, | ||
enum osmo_amr_quality | bfi | ||
) |
Encode various AMR parameters from RTP payload (RFC 4867)
[out] | payload | Payload for RTP packet, contains speech data (if any) except for have 2 first bytes where header will be built |
[in] | cmr | AMR codec Mode Request |
[in] | ft | AMR Frame Type |
[in] | bfi | AMR Bad Frame Indicator |
Note: only octet-aligned mode is supported so the header occupies 2 full bytes. Optional interleaving header is not supported.
References amr_len_by_ft, and ENOTSUP.
int osmo_amr_s_to_d | ( | ubit_t * | out, |
const ubit_t * | in, | ||
uint16_t | n_bits, | ||
enum osmo_amr_type | amr_mode | ||
) |
Convert from S-bits (codec output) to d-bits.
[out] | out | user-provided output buffer for generated unpacked d-bits |
[in] | in | input buffer for unpacked s-bits |
[in] | n_bits | number of bits (in both in and out) |
[in] | AMR | mode (0..7) |
References ARRAY_SIZE, ts26101_reorder_table::len, n, ts26101_reorder_table::s_to_d, and ts26101_reorder_tables.
|
inlinestatic |
References get_value_string(), osmo_amr_type_names, and type.
bool osmo_efr_check_sid | ( | const uint8_t * | rtp_payload, |
size_t | payload_len | ||
) |
Check whether RTP frame contains EFR SID code word according to TS 101 318 §5.3.2.
[in] | rtp_payload | Buffer with RTP payload |
[in] | payload_len | Length of payload |
References ARRAY_SIZE, bitvec_get_bit_pos(), bitvec::data, bitvec::data_len, ONE, and sid_code_word_bits.
|
inlinestatic |
Check if given EFR codec frame is any kind of SID, valid or invalid.
[in] | rtp_payload | Buffer with RTP payload |
References osmo_efr_sid_classify(), and OSMO_GSM631_SID_CLASS_SPEECH.
enum osmo_gsm631_sid_class osmo_efr_sid_classify | ( | const uint8_t * | rtp_payload | ) |
Classify potentially-SID EFR codec frame in RTP format according to the rules of GSM 06.81 §6.1.1.
[in] | rtp_payload | Buffer with RTP payload |
Differences between the more familiar osmo_efr_check_sid() and the present function are:
Which function should one use? The answer depends on the specific circumstances, and needs to be addressed on a case-by-case basis.
References ARRAY_SIZE, bitvec_get_bit_pos(), bitvec::data, bitvec::data_len, GSM_EFR_BYTES, n, ONE, OSMO_GSM631_SID_CLASS_INVALID, OSMO_GSM631_SID_CLASS_SPEECH, OSMO_GSM631_SID_CLASS_VALID, and sid_code_word_bits.
Referenced by osmo_efr_is_any_sid(), and osmo_efr_sid_preen().
bool osmo_efr_sid_preen | ( | uint8_t * | rtp_payload | ) |
Preen potentially-SID EFR codec frame in RTP format, ensuring that it is either a speech frame or a valid SID, and if the latter, making it a perfect, error-free SID frame.
[in] | rtp_payload | Buffer with RTP payload - must be writable! |
References OSMO_ASSERT, osmo_efr_sid_classify(), osmo_efr_sid_reset(), OSMO_GSM631_SID_CLASS_INVALID, OSMO_GSM631_SID_CLASS_SPEECH, and OSMO_GSM631_SID_CLASS_VALID.
void osmo_efr_sid_reset | ( | uint8_t * | rtp_payload | ) |
Reset the SID field of a potentially corrupted, but still valid GSM-EFR SID frame in RTP encoding to its pristine state (full SID code word).
[in] | rtp_payload | Buffer with RTP payload - must be writable! |
Per GSM 06.62 section 5.3, a freshly minted SID frame consists of 58 bits of comfort noise parameters (LSF and 4 times fixed codebook gain), 95 bits of SID code word (all 1s) and 91 unused bits (all 0s). Network elements that receive SID frames from call leg A uplink and need to retransmit them on leg B downlink should "rejuvenate" received SID frames prior to retransmission by resetting the SID field to its pristine state of all 1s; this function does the job.
Potential TODO: it would be nice to also zero out the remaining 91 bits which the spec leaves as reserved, clearing out leg A radio bit errors - but do we really need to?
Referenced by osmo_efr_sid_preen().
bool osmo_fr_check_sid | ( | const uint8_t * | rtp_payload, |
size_t | payload_len | ||
) |
Check whether RTP frame contains FR SID code word according to TS 101 318 §5.1.2.
[in] | rtp_payload | Buffer with RTP payload |
[in] | payload_len | Length of payload |
References ARRAY_SIZE, bitvec_get_bit_pos(), bitvec::data, bitvec::data_len, sid_code_word_bits, and ZERO.
Referenced by conceal_frame().
|
inlinestatic |
Check if given FR codec frame is any kind of SID, valid or invalid.
[in] | rtp_payload | Buffer with RTP payload |
References osmo_fr_sid_classify(), and OSMO_GSM631_SID_CLASS_SPEECH.
enum osmo_gsm631_sid_class osmo_fr_sid_classify | ( | const uint8_t * | rtp_payload | ) |
Classify potentially-SID FR codec frame in RTP format according to the rules of GSM 06.31 §6.1.1.
[in] | rtp_payload | Buffer with RTP payload |
Differences between the more familiar osmo_fr_check_sid() and the present function are:
Which function should one use? The answer depends on the specific circumstances, and needs to be addressed on a case-by-case basis.
References ARRAY_SIZE, bitvec_get_bit_pos(), bitvec::data, bitvec::data_len, GSM_FR_BYTES, n, OSMO_GSM631_SID_CLASS_INVALID, OSMO_GSM631_SID_CLASS_SPEECH, OSMO_GSM631_SID_CLASS_VALID, sid_code_word_bits, and ZERO.
Referenced by fr_ecu_input(), osmo_fr_is_any_sid(), and osmo_fr_sid_preen().
bool osmo_fr_sid_preen | ( | uint8_t * | rtp_payload | ) |
Preen potentially-SID FR codec frame in RTP format, ensuring that it is either a speech frame or a valid SID, and if the latter, making it a perfect, error-free SID frame.
[in] | rtp_payload | Buffer with RTP payload - must be writable! |
References OSMO_ASSERT, osmo_fr_sid_classify(), osmo_fr_sid_reset(), OSMO_GSM631_SID_CLASS_INVALID, OSMO_GSM631_SID_CLASS_SPEECH, and OSMO_GSM631_SID_CLASS_VALID.
void osmo_fr_sid_reset | ( | uint8_t * | rtp_payload | ) |
Reset the SID field and the unused bits of a potentially corrupted, but still valid GSM-FR SID frame in RTP encoding to their pristine state.
[in] | rtp_payload | Buffer with RTP payload - must be writable! |
Per GSM 06.12 section 5.2, a freshly minted SID frame carries 60 bits of comfort noise parameters (LARc and 4 times Xmaxc), while the remaining 200 bits are all zeros; the latter 200 all-0 bits further break down into 95 bits of SID field (checked by receivers to detect SID) and 105 unused bits which receivers are told to ignore. Network elements that receive SID frames from call leg A uplink and need to retransmit them on leg B downlink should "rejuvenate" received SID frames prior to retransmission; this function does the job.
Referenced by osmo_fr_sid_preen().
bool osmo_hr_check_sid | ( | const uint8_t * | rtp_payload, |
size_t | payload_len | ||
) |
Check whether RTP frame contains HR SID code word according to TS 101 318 §5.2.2.
[in] | rtp_payload | Buffer with RTP payload |
[in] | payload_len | Length of payload |
Note that this function checks only for a perfect, error-free SID. Unlike GSM 06.31 for FR or GSM 06.81 for EFR, GSM 06.41 spec for HR does not prescribe exact bit counting rules, hence detection of partially corrupted SID frames in downstream network elements without out-of-band indication is not possible.
References GSM_HR_BYTES.
enum osmo_gsm631_sid_class osmo_hr_sid_classify | ( | const uint8_t * | rtp_payload, |
bool | bci_flag, | ||
bool * | bfi_from_bci | ||
) |
void osmo_hr_sid_reset | ( | uint8_t * | rtp_payload | ) |
Reset the SID field of a potentially corrupted, but still valid GSM-HR SID frame in TS 101 318 format to its pristine state (full SID codeword).
[in] | rtp_payload | Buffer with RTP payload - must be writable! |
Per GSM 06.22 section 5.3, a freshly minted SID frame consists of 33 bits of comfort noise parameters and 79 bits of SID codeword (all 1s). Network elements that receive SID frames from call leg A uplink and need to retransmit them on leg B downlink should "rejuvenate" received SID frames prior to retransmission by resetting the SID field to its pristine state of all 1s; this function does the job.
Important note: because of HR-specific quirks (lack of exact bit counting rules in GSM 06.41 spec compared to 06.31 & 06.81, plus the fact that such bit counting can only be done efficiently in the GSM 05.03 channel decoder prior to bit reordering based on voiced or unvoiced mode), a generic (usable from any network element) SID classification function similar to osmo_{fr,efr}_sid_classify() unfortunately cannot exist for HR. Therefore, the triggering condition for invoking this SID rejuvenation/reset function can only be an out-of-band SID indication, as in GSM 08.61 TRAU frames or RFC 5993 ToC octet.
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
|
extern |
These constants refer to the length of one "AMR core frame" as per TS 26.101 Section 4.2.2 / Table 2.
|
extern |
Referenced by osmo_amr_type_name().
|
extern |
Referenced by fr_ecu_output().
|
extern |
|
extern |
|
extern |