blob: 05da911e14de08a6e55f5c4a57f829d4f59b9c95 [file] [log] [blame]
Sylvain Munaut12ba7782014-06-16 10:13:40 +02001#pragma once
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +02002
3#include <stdint.h>
Maxec8f1922016-05-31 14:50:21 +02004#include <stdbool.h>
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +02005
Max92db1502016-05-25 18:13:51 +02006#include <osmocom/core/utils.h>
7
Diego Elio Pettenò23431c72012-06-29 13:01:27 -07008extern const uint16_t gsm610_bitorder[]; /* FR */
9extern const uint16_t gsm620_unvoiced_bitorder[]; /* HR unvoiced */
10extern const uint16_t gsm620_voiced_bitorder[]; /* HR voiced */
11extern const uint16_t gsm660_bitorder[]; /* EFR */
Sylvain Munaut1a4ea5b2010-10-08 15:09:16 +020012
Diego Elio Pettenò23431c72012-06-29 13:01:27 -070013extern const uint16_t gsm690_12_2_bitorder[]; /* AMR 12.2 kbits */
14extern const uint16_t gsm690_10_2_bitorder[]; /* AMR 10.2 kbits */
15extern const uint16_t gsm690_7_95_bitorder[]; /* AMR 7.95 kbits */
16extern const uint16_t gsm690_7_4_bitorder[]; /* AMR 7.4 kbits */
17extern const uint16_t gsm690_6_7_bitorder[]; /* AMR 6.7 kbits */
18extern const uint16_t gsm690_5_9_bitorder[]; /* AMR 5.9 kbits */
19extern const uint16_t gsm690_5_15_bitorder[]; /* AMR 5.15 kbits */
20extern const uint16_t gsm690_4_75_bitorder[]; /* AMR 4.75 kbits */
Max92db1502016-05-25 18:13:51 +020021
22extern const struct value_string osmo_amr_type_names[];
23
24enum osmo_amr_type {
25 AMR_4_75 = 0,
26 AMR_5_15 = 1,
27 AMR_5_90 = 2,
28 AMR_6_70 = 3,
29 AMR_7_40 = 4,
30 AMR_7_95 = 5,
31 AMR_10_2 = 6,
32 AMR_12_2 = 7,
33 AMR_SID = 8,
34 AMR_GSM_EFR_SID = 9,
35 AMR_TDMA_EFR_SID = 10,
36 AMR_PDC_EFR_SID = 11,
37 AMR_NO_DATA = 15,
38};
39
40enum osmo_amr_quality {
41 AMR_BAD = 0,
42 AMR_GOOD = 1
43};
44
Max74a8f082016-09-27 13:51:51 +020045/*! \brief Check if given AMR Frame Type is a speech frame
46 * \param[in] ft AMR Frame Type
47 * \returns true if AMR with given Frame Type contains voice, false otherwise
48 */
Max2bb65be2016-09-28 15:38:55 +020049static inline bool osmo_amr_is_speech(enum osmo_amr_type ft)
Max74a8f082016-09-27 13:51:51 +020050{
51 switch (ft) {
52 case AMR_4_75:
53 case AMR_5_15:
54 case AMR_5_90:
55 case AMR_6_70:
56 case AMR_7_40:
57 case AMR_7_95:
58 case AMR_10_2:
59 case AMR_12_2:
60 return true;
61 default:
62 return false;
63 }
64}
65
Harald Welte6789ba32017-05-31 02:47:43 +020066bool osmo_fr_check_sid(const uint8_t *rtp_payload, size_t payload_len);
67bool osmo_hr_check_sid(const uint8_t *rtp_payload, size_t payload_len);
Max92db1502016-05-25 18:13:51 +020068int osmo_amr_rtp_enc(uint8_t *payload, uint8_t cmr, enum osmo_amr_type ft,
69 enum osmo_amr_quality bfi);
70int osmo_amr_rtp_dec(const uint8_t *payload, int payload_len, uint8_t *cmr,
71 int8_t *cmi, enum osmo_amr_type *ft,
72 enum osmo_amr_quality *bfi, int8_t *sti);