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