libosmo-netif  0.4.0
Osmocom network interface library
 All Data Structures Files Functions Modules
amr.h
1 #ifndef _OSMO_AMR_H_
2 #define _OSMO_AMR_H_
3 
4 #include <osmocom/core/endian.h>
5 
6 /* As defined by RFC3267: Adaptive Multi-Rate (AMR) */
7 
8 /*
9  * +----------------+-------------------+----------------
10  * | payload header | table of contents | speech data ...
11  * +----------------+-------------------+----------------
12  */
13 
14 /*
15  * 4.4. Octet-aligned Mode:
16  *
17  * 4.4.1. The Payload Header:
18  *
19  * 0 1 2 3 4 5 6 7
20  * +-+-+-+-+-+-+-+-+
21  * | CMR |X X X X|
22  * +-+-+-+-+-+-+-+-+
23  *
24  * According to: 3GPP TS 26.201 "AMR Wideband speech codec; Frame Structure",
25  * version 5.0.0 (2001-03), 3rd Generation Partnership Project (3GPP):
26  *
27  * Possible Frame type / CMR values:
28  *
29  * 0-8 for AMR-WB (from 6.60 kbit/s to 23.85 kbit/s)
30  * 9 (SID) confort noise.
31  * 10-13 future use.
32  * 14 means lost speech frame (only available for AMR-WB)
33  * 15 means no data
34  *
35  * 4.4.2. The table of contents:
36  *
37  * 0 1 2 3 4 5 6 7
38  * +-+-+-+-+-+-+-+-+
39  * |F| FT |Q|X X|
40  * +-+-+-+-+-+-+-+-+
41  *
42  * X means padding.
43  */
44 
45 struct amr_hdr {
46 #if OSMO_IS_BIG_ENDIAN
47  /* Payload Header */
48  uint8_t cmr:4, /* Codec Mode Request */
49  pad1:4;
50  /* Table of Contents */
51  uint8_t f:1, /* followed by another speech frame? */
52  ft:4, /* coding mode */
53  q:1, /* OK (not damaged) at origin? */
54  pad2:2;
55 #elif OSMO_IS_LITTLE_ENDIAN
56  /* Payload Header */
57  uint8_t pad1:4,
58  cmr:4;
59  /* Table of Contents */
60  uint8_t pad2:2,
61  q:1,
62  ft:4,
63  f:1;
64 #endif
65 } __attribute__((packed));
66 
67 static inline void *osmo_amr_get_payload(struct amr_hdr *amrh)
68 {
69  return (uint8_t *)amrh + sizeof(struct amr_hdr);
70 }
71 
72 #define AMR_FT_0 0 /* 4.75 */
73 #define AMR_FT_1 1 /* 5.15 */
74 #define AMR_FT_2 2 /* 5.90 */
75 #define AMR_FT_3 3 /* 6.70 */
76 #define AMR_FT_4 4 /* 7.40 */
77 #define AMR_FT_5 5 /* 7.95 */
78 #define AMR_FT_6 6 /* 10.2 */
79 #define AMR_FT_7 7 /* 12.2 */
80 #define AMR_FT_SID 8 /* SID */
81 #define AMR_FT_MAX 9
82 
83 int osmo_amr_ft_valid(uint8_t amr_ft);
84 size_t osmo_amr_bytes(uint8_t amr_cmr);
85 
86 #endif
Definition: amr.h:45