Mercurial > hg > audiostuff
comparison intercom/gsm/gsm.c @ 2:13be24d74cd2
import intercom-0.4.1
author | Peter Meerwald <pmeerw@cosy.sbg.ac.at> |
---|---|
date | Fri, 25 Jun 2010 09:57:52 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1:9cadc470e3da | 2:13be24d74cd2 |
---|---|
1 | |
2 /* | |
3 RFC3551: | |
4 | |
5 name of sampling default | |
6 encoding sample/frame bits/sample rate ms/frame ms/packet | |
7 __________________________________________________________________ | |
8 GSM frame N/A 8,000 20 20 | |
9 | |
10 | |
11 field field name bits field field name bits | |
12 ________________________________________________ | |
13 1 LARc[0] 6 39 xmc[22] 3 | |
14 2 LARc[1] 6 40 xmc[23] 3 | |
15 3 LARc[2] 5 41 xmc[24] 3 | |
16 4 LARc[3] 5 42 xmc[25] 3 | |
17 5 LARc[4] 4 43 Nc[2] 7 | |
18 6 LARc[5] 4 44 bc[2] 2 | |
19 7 LARc[6] 3 45 Mc[2] 2 | |
20 8 LARc[7] 3 46 xmaxc[2] 6 | |
21 9 Nc[0] 7 47 xmc[26] 3 | |
22 10 bc[0] 2 48 xmc[27] 3 | |
23 11 Mc[0] 2 49 xmc[28] 3 | |
24 12 xmaxc[0] 6 50 xmc[29] 3 | |
25 13 xmc[0] 3 51 xmc[30] 3 | |
26 14 xmc[1] 3 52 xmc[31] 3 | |
27 15 xmc[2] 3 53 xmc[32] 3 | |
28 16 xmc[3] 3 54 xmc[33] 3 | |
29 17 xmc[4] 3 55 xmc[34] 3 | |
30 18 xmc[5] 3 56 xmc[35] 3 | |
31 19 xmc[6] 3 57 xmc[36] 3 | |
32 20 xmc[7] 3 58 xmc[37] 3 | |
33 21 xmc[8] 3 59 xmc[38] 3 | |
34 22 xmc[9] 3 60 Nc[3] 7 | |
35 23 xmc[10] 3 61 bc[3] 2 | |
36 24 xmc[11] 3 62 Mc[3] 2 | |
37 25 xmc[12] 3 63 xmaxc[3] 6 | |
38 26 Nc[1] 7 64 xmc[39] 3 | |
39 27 bc[1] 2 65 xmc[40] 3 | |
40 28 Mc[1] 2 66 xmc[41] 3 | |
41 29 xmaxc[1] 6 67 xmc[42] 3 | |
42 30 xmc[13] 3 68 xmc[43] 3 | |
43 31 xmc[14] 3 69 xmc[44] 3 | |
44 32 xmc[15] 3 70 xmc[45] 3 | |
45 33 xmc[16] 3 71 xmc[46] 3 | |
46 34 xmc[17] 3 72 xmc[47] 3 | |
47 35 xmc[18] 3 73 xmc[48] 3 | |
48 36 xmc[19] 3 74 xmc[49] 3 | |
49 37 xmc[20] 3 75 xmc[50] 3 | |
50 38 xmc[21] 3 76 xmc[51] 3 | |
51 | |
52 Table 2: Ordering of GSM variables | |
53 | |
54 | |
55 Octet Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 | |
56 _____________________________________________________________________ | |
57 0 1 1 0 1 LARc0.0 LARc0.1 LARc0.2 LARc0.3 | |
58 1 LARc0.4 LARc0.5 LARc1.0 LARc1.1 LARc1.2 LARc1.3 LARc1.4 LARc1.5 | |
59 2 LARc2.0 LARc2.1 LARc2.2 LARc2.3 LARc2.4 LARc3.0 LARc3.1 LARc3.2 | |
60 3 LARc3.3 LARc3.4 LARc4.0 LARc4.1 LARc4.2 LARc4.3 LARc5.0 LARc5.1 | |
61 4 LARc5.2 LARc5.3 LARc6.0 LARc6.1 LARc6.2 LARc7.0 LARc7.1 LARc7.2 | |
62 5 Nc0.0 Nc0.1 Nc0.2 Nc0.3 Nc0.4 Nc0.5 Nc0.6 bc0.0 | |
63 6 bc0.1 Mc0.0 Mc0.1 xmaxc00 xmaxc01 xmaxc02 xmaxc03 xmaxc04 | |
64 7 xmaxc05 xmc0.0 xmc0.1 xmc0.2 xmc1.0 xmc1.1 xmc1.2 xmc2.0 | |
65 8 xmc2.1 xmc2.2 xmc3.0 xmc3.1 xmc3.2 xmc4.0 xmc4.1 xmc4.2 | |
66 9 xmc5.0 xmc5.1 xmc5.2 xmc6.0 xmc6.1 xmc6.2 xmc7.0 xmc7.1 | |
67 10 xmc7.2 xmc8.0 xmc8.1 xmc8.2 xmc9.0 xmc9.1 xmc9.2 xmc10.0 | |
68 11 xmc10.1 xmc10.2 xmc11.0 xmc11.1 xmc11.2 xmc12.0 xmc12.1 xcm12.2 | |
69 12 Nc1.0 Nc1.1 Nc1.2 Nc1.3 Nc1.4 Nc1.5 Nc1.6 bc1.0 | |
70 13 bc1.1 Mc1.0 Mc1.1 xmaxc10 xmaxc11 xmaxc12 xmaxc13 xmaxc14 | |
71 14 xmax15 xmc13.0 xmc13.1 xmc13.2 xmc14.0 xmc14.1 xmc14.2 xmc15.0 | |
72 15 xmc15.1 xmc15.2 xmc16.0 xmc16.1 xmc16.2 xmc17.0 xmc17.1 xmc17.2 | |
73 16 xmc18.0 xmc18.1 xmc18.2 xmc19.0 xmc19.1 xmc19.2 xmc20.0 xmc20.1 | |
74 17 xmc20.2 xmc21.0 xmc21.1 xmc21.2 xmc22.0 xmc22.1 xmc22.2 xmc23.0 | |
75 18 xmc23.1 xmc23.2 xmc24.0 xmc24.1 xmc24.2 xmc25.0 xmc25.1 xmc25.2 | |
76 19 Nc2.0 Nc2.1 Nc2.2 Nc2.3 Nc2.4 Nc2.5 Nc2.6 bc2.0 | |
77 20 bc2.1 Mc2.0 Mc2.1 xmaxc20 xmaxc21 xmaxc22 xmaxc23 xmaxc24 | |
78 21 xmaxc25 xmc26.0 xmc26.1 xmc26.2 xmc27.0 xmc27.1 xmc27.2 xmc28.0 | |
79 22 xmc28.1 xmc28.2 xmc29.0 xmc29.1 xmc29.2 xmc30.0 xmc30.1 xmc30.2 | |
80 23 xmc31.0 xmc31.1 xmc31.2 xmc32.0 xmc32.1 xmc32.2 xmc33.0 xmc33.1 | |
81 24 xmc33.2 xmc34.0 xmc34.1 xmc34.2 xmc35.0 xmc35.1 xmc35.2 xmc36.0 | |
82 25 Xmc36.1 xmc36.2 xmc37.0 xmc37.1 xmc37.2 xmc38.0 xmc38.1 xmc38.2 | |
83 26 Nc3.0 Nc3.1 Nc3.2 Nc3.3 Nc3.4 Nc3.5 Nc3.6 bc3.0 | |
84 27 bc3.1 Mc3.0 Mc3.1 xmaxc30 xmaxc31 xmaxc32 xmaxc33 xmaxc34 | |
85 28 xmaxc35 xmc39.0 xmc39.1 xmc39.2 xmc40.0 xmc40.1 xmc40.2 xmc41.0 | |
86 29 xmc41.1 xmc41.2 xmc42.0 xmc42.1 xmc42.2 xmc43.0 xmc43.1 xmc43.2 | |
87 30 xmc44.0 xmc44.1 xmc44.2 xmc45.0 xmc45.1 xmc45.2 xmc46.0 xmc46.1 | |
88 31 xmc46.2 xmc47.0 xmc47.1 xmc47.2 xmc48.0 xmc48.1 xmc48.2 xmc49.0 | |
89 32 xmc49.1 xmc49.2 xmc50.0 xmc50.1 xmc50.2 xmc51.0 xmc51.1 xmc51.2 | |
90 | |
91 Table 3: GSM payload format | |
92 | |
93 In the GSM packing used by RTP, the bits SHALL be packed beginning | |
94 from the most significant bit. Every 160 sample GSM frame is coded | |
95 into one 33 octet (264 bit) buffer. Every such buffer begins with a | |
96 4 bit signature (0xD), followed by the MSB encoding of the fields of | |
97 the frame. The first octet thus contains 1101 in the 4 most | |
98 significant bits (0-3) and the 4 most significant bits of F1 (0-3) in | |
99 the 4 least significant bits (4-7). | |
100 | |
101 | |
102 PT encoding media type clock rate channels | |
103 name (Hz) | |
104 ___________________________________________________ | |
105 3 GSM A 8,000 1 | |
106 | |
107 */ | |
108 | |
109 typedef unsigned char Byte; | |
110 | |
111 static Byte byte; | |
112 static unsigned mask; | |
113 static Byte *packed; | |
114 static int gsmbits[76] = { | |
115 6, 6, 5, 5, 4, 4, 3, 3, 7, 2, 2, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
116 3, 3, 7, 2, 2, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, | |
117 3, 3, 3, 3, 7, 2, 2, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 7, 2, | |
118 2, 6, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 | |
119 }; | |
120 | |
121 static void pack(short data, int len) | |
122 { | |
123 unsigned srcmask; | |
124 | |
125 for (srcmask = (1 << len-1); srcmask > 0; srcmask /= 2) { | |
126 if (data & srcmask) { | |
127 byte += mask; | |
128 } | |
129 mask /= 2; // shift right | |
130 if (0 == mask) { | |
131 *packed = byte; | |
132 ++packed; | |
133 mask = 128; | |
134 byte = 0; | |
135 } | |
136 } | |
137 } | |
138 | |
139 int gsmpack(Byte *gsm_frame, short *rpe_frame) | |
140 { | |
141 int i; | |
142 | |
143 byte = 0; | |
144 mask = 128; | |
145 packed = gsm_frame; | |
146 | |
147 pack(0xD, 4); // GSM signature | |
148 for (i = 0; i < 76; ++i, ++rpe_frame) { | |
149 pack(*rpe_frame, gsmbits[i]); | |
150 } | |
151 *packed = byte; | |
152 | |
153 return 33; | |
154 } | |
155 | |
156 static short unpack(int len) | |
157 { | |
158 unsigned srcmask; | |
159 short data = 0; | |
160 | |
161 for (srcmask = (1 << len-1); srcmask > 0; srcmask /= 2) { | |
162 if ((*packed) & mask) { | |
163 data += srcmask; | |
164 } | |
165 mask /= 2; // shift right | |
166 if (0 == mask) { | |
167 ++packed; | |
168 mask = 128; | |
169 } | |
170 } | |
171 | |
172 // fprintf(stderr, "data =%x\n", data); | |
173 return data; | |
174 } | |
175 | |
176 int gsmunpack(short *rpe_frame, Byte *gsm_frame) | |
177 { | |
178 int i; | |
179 | |
180 byte = 0; | |
181 mask = 128; | |
182 packed = gsm_frame; | |
183 | |
184 if (unpack(4) != 0xD) { | |
185 // fprintf(stderr, "error: gsmunpack\n"); | |
186 return 0; // not GSM signature | |
187 } | |
188 for (i = 0; i < 76; ++i, ++rpe_frame) { | |
189 *rpe_frame = unpack(gsmbits[i]); | |
190 } | |
191 // exit(1) ; | |
192 return 160; // number of PCM samples | |
193 } | |
194 | |
195 | |
196 |