blob: 6a1bf9fb609741ad42f4bd4680ec446c220fe7cf [file] [log] [blame]
Piotr Krysik9e2e8352018-02-27 12:16:25 +01001/*! \file codec.h */
2
3#pragma once
4
5#include <stdint.h>
6#include <stdbool.h>
7
8#include <osmocom/core/utils.h>
9
10/* TS 101318 Chapter 5.1: 260 bits + 4bit sig */
11#define GSM_FR_BYTES 33
12/* TS 101318 Chapter 5.2: 112 bits, no sig */
13#define GSM_HR_BYTES 14
14/* TS 101318 Chapter 5.3: 244 bits + 4bit sig */
15#define GSM_EFR_BYTES 31
16
17extern const uint16_t gsm610_bitorder[]; /* FR */
18extern const uint16_t gsm620_unvoiced_bitorder[]; /* HR unvoiced */
19extern const uint16_t gsm620_voiced_bitorder[]; /* HR voiced */
20extern const uint16_t gsm660_bitorder[]; /* EFR */
21
22extern const uint16_t gsm690_12_2_bitorder[]; /* AMR 12.2 kbits */
23extern const uint16_t gsm690_10_2_bitorder[]; /* AMR 10.2 kbits */
24extern const uint16_t gsm690_7_95_bitorder[]; /* AMR 7.95 kbits */
25extern const uint16_t gsm690_7_4_bitorder[]; /* AMR 7.4 kbits */
26extern const uint16_t gsm690_6_7_bitorder[]; /* AMR 6.7 kbits */
27extern const uint16_t gsm690_5_9_bitorder[]; /* AMR 5.9 kbits */
28extern const uint16_t gsm690_5_15_bitorder[]; /* AMR 5.15 kbits */
29extern const uint16_t gsm690_4_75_bitorder[]; /* AMR 4.75 kbits */
30
31extern const struct value_string osmo_amr_type_names[];
32
33enum osmo_amr_type {
34 AMR_4_75 = 0,
35 AMR_5_15 = 1,
36 AMR_5_90 = 2,
37 AMR_6_70 = 3,
38 AMR_7_40 = 4,
39 AMR_7_95 = 5,
40 AMR_10_2 = 6,
41 AMR_12_2 = 7,
42 AMR_SID = 8,
43 AMR_GSM_EFR_SID = 9,
44 AMR_TDMA_EFR_SID = 10,
45 AMR_PDC_EFR_SID = 11,
46 AMR_NO_DATA = 15,
47};
48
49enum osmo_amr_quality {
50 AMR_BAD = 0,
51 AMR_GOOD = 1
52};
53
54/*! Check if given AMR Frame Type is a speech frame
55 * \param[in] ft AMR Frame Type
56 * \returns true if AMR with given Frame Type contains voice, false otherwise
57 */
58static inline bool osmo_amr_is_speech(enum osmo_amr_type ft)
59{
60 switch (ft) {
61 case AMR_4_75:
62 case AMR_5_15:
63 case AMR_5_90:
64 case AMR_6_70:
65 case AMR_7_40:
66 case AMR_7_95:
67 case AMR_10_2:
68 case AMR_12_2:
69 return true;
70 default:
71 return false;
72 }
73}
74
75bool osmo_fr_check_sid(const uint8_t *rtp_payload, size_t payload_len);
76bool osmo_hr_check_sid(const uint8_t *rtp_payload, size_t payload_len);
77int osmo_amr_rtp_enc(uint8_t *payload, uint8_t cmr, enum osmo_amr_type ft,
78 enum osmo_amr_quality bfi);
79int osmo_amr_rtp_dec(const uint8_t *payload, int payload_len, uint8_t *cmr,
80 int8_t *cmi, enum osmo_amr_type *ft,
81 enum osmo_amr_quality *bfi, int8_t *sti);