blob: 176460b31b48982f902b7d19033ae10993cdd3f8 [file] [log] [blame]
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001/* $Id:$ */
2/*
3 * Copyright (C) 2003-2008 Benny Prijono <benny@prijono.org>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19#include "test.h"
20#include <pjmedia-codec.h>
21
22/* Define your CPU MIPS here!! */
23
24#ifndef CPU_MIPS
25 /*
26 For complete table see:
27 http://en.wikipedia.org/wiki/Million_instructions_per_second
28
29 Processor IPS/MHz
30 -------------------------------------------
31 PowerPC G3 2.253 MIPS/MHz
32 Intel Pentium III 2.708 MIPS/MHz
33 AMD Athlon 2.967 MIPS/MHz
34 Pentium 4 Extreme Edition 3.039 MIPS/MHz
35 AMD Athlon FX-57 4.285 MIPS/MHz
36
37
38 From: http://en.wikipedia.org/wiki/ARM_architecture
39
40 Family Arch Core IPS/MHz
41 -------------------------------------------------------
42 ARM7TDMI ARMv4T ARM7TDMI 0.892 MIPS/MHz
43 ARM710T 0.900 MIPS/MHz
44 ARM720T 1.003 MIPS/MHz
45 ARM9TDMI ARMv4T ARM920T 1.111 MIPS/MHz
46 ARM9E ARMv5TEJ ARM926EJ-S 1.100 MIPS/MHz
47 XScale ARMv5TE PXA255 1.000 MIPS/MHz (?)
48 PXA27x 1.282 MIPS/MHz
49 Cortex ARMv7-A Cortex-A8 2.000 MIPS/MHz
50 Cortex-A9 2.000 MIPS/MHz
51 ARMv7-M Cortex-M3 1.250 MIPS/MHz
52 */
53
54# define CPU_MHZ (2666.666)
55# define CPU_MIPS (CPU_MHZ * MEGA * 3.039) /* P4 2.6GHz */
56
57//# define CPU_MHZ 700
58//# define CPU_MIPS (700 * MEGA * 2.708) /* P3 700Mhz */
59#endif
60
61
62
63/* Sample speech data, 360ms length, encoded at 8Khz */
64static const pj_int16_t ref_signal[] = {
65 0, -4, 0, 0, 1, 8, 8, 7, 12, 16,
66 20, 29, 28, 48, 40, 48, 56, 76, 68, 76,
67 96, 100, 104, 124, 117, 120, 144, 120, 136, 168,
68 184, 188, 176, 216, 237, 235, 268, 301, 312, 316,
69 367, 356, 384, 400, 344, 409, 392, 416, 380, 432,
70 404, 444, 457, 456, 453, 512, 499, 512, 584, 584,
71 544, 584, 608, 596, 552, 628, 600, 667, 728, 672,
72 681, 755, 736, 764, 752, 764, 724, 769, 792, 840,
73 820, 895, 841, 856, 852, 867, 944, 944, 939, 944,
74 907, 928, 920, 960, 833, 881, 1004, 1007, 1000, 1057,
75 1032, 1056, 1016, 1056, 1072, 1080, 1108, 1028, 1076, 1072,
76 956, 1020, 1080, 1008, 1095, 992, 1056, 1028, 940, 976,
77 1008, 940, 916, 968, 849, 868, 956, 940, 852, 892,
78 968, 860, 777, 904, 825, 716, 764, 708, 635, 728,
79 620, 648, 472, 724, 548, 448, 472, 372, 272, 437,
80 419, 260, 237, 371, 196, 136, 177, 264, 49, 120,
81 40, 124, 32, 136, 71, 120, -95, -20, -76, -140,
82 -304, 12, -148, -168, -192, -63, -212, -36, -288, -232,
83 -352, -128, -397, -308, -431, -280, -675, -497, -761, -336,
84 -760, -471, -1088, 3013, -1596, -2000, 412, -968, 213, -668,
85 -1096, -1048, -1039, -825, -580, -612, -1056, -888, -1324, -1064,
86 -1164, -819, -940, -780, -1236, -688, -1931, -1, -464, -1804,
87 1088, -1605, -1208, -664, -912, -905, -832, -1167, -512, 1832,
88 -924, -60, 660, -2143, 248, -1660, 1496, -3464, -164, 2072,
89 -3040, 539, 2904, 2040, -3488, 2600, 2412, 820, -551, -1401,
90 1068, -385, 397, -2112, -980, 1064, -1244, -736, -1335, 332,
91 -1232, -1852, -12, -1073, -1747, -3328, -796, -2241, -4901, -3248,
92 -3124, -3432, -5892, -3840, -3968, -4752, -5668, -4796, -3580, -5909,
93 -5412, -6144, -5800, -5908, -6696, -6460, -8609, -3804, -5668, -8499,
94 -4636, -5744, -2377, -7132, -3712, -7221, -6608, 1656,-11728, -6656,
95 -3736, -204, -8580, -4808, -591, -5752, -472,-10308, -2116, -257,
96 -4720, -7640, -1279, 6412,-16404, -1495, 6204, -8072, -335, -3877,
97 -2363, 464, 441, -6872, 1447, 7884,-13197, 936, 5009, -4416,
98 -4445, 3956, 2280, -2844, 2036, -4285, 744, 4161, -7216, 5548,
99 172, -964, -2873, 3296, 2184, -7424, 4300, 1855, 1453, -32,
100 1585, 2160, -3440, 448, 4084, -1617, 1928, 3944, -3728, 4699,
101 4556, -5556, 4096, 12928, -8287, -4320, 10739, 3172, -6068, 3684,
102 6484, 1652, -1104, -1820, 11964, -1567, -4117, 7197, 5112, -2608,
103 -2363, 7379, 936, 1596, 217, 6508, 3284, 3960, 0, 2691,
104 11324, -6140, 6720, 6188, 3596, -1120, 5319, 9420, -9360, 5780,
105 5135, 623, -1844, 3473, 8488, -4532, 2844, 8368, 4387, -8628,
106 14180, 3196, -4852, 9092, 5540, -600, 3088, 9864, -4992, 13984,
107 2536, -5932, 10584, 7044, -2548, 388, 12597, -4776, -247, 7728,
108 6048, -6152, 6449, 9644, -8924, 8993, 6319, 877, 1108, 9804,
109 -696, 2584, 9097, -3236, 4308, 5444, -2660, -365, 11427, -6900,
110 -803, 9388, -2444, -1068, 9160, 703, -5632, 12088, -2964, -1077,
111 9804, -1263, -3679, 10161, 3337, -9755, 11601, -160, -6421, 11008,
112 -1952, -3411, 6792, -1665, -1344, 9116, -2545, -4100, 11577, 240,
113 -3612, 5140, 603, -2100, 4284, -784, 108, 968, -1244, 3500,
114 3696, -108, 3780, 3836, -16, 4035, 2772, 1300, -688, 1544,
115 2268, -2144, 1156, -564, 628, -1040, -168, 491, -72, -408,
116 -1812, 3460, -2083, -72, 797, 1436, -3824, 1200, 308, -3512,
117 572, -4060, 540, -84, -4492, -1808, 4644, -4340, -3224, 5832,
118 -2180, -2544, 1475, 2224, -2588, 1312, 1452, -1676, -428, -1596,
119 -860, -116, -4000, -364, 148, -3680, -2229, -1632, 236, -3004,
120 -1917, 124, -1748, -2991, -644, -752, -3691, -1945, -3236, -2005,
121 -4388, -2084, -2052, -3788, -3100, -824, -2432, -3419, -1905, -2520,
122 -2120, -2904, -2200, -1712, -2500, -2796, -1140, -2460, -2955, -984,
123 -1519, -400, -412, 356, 97, -389, 1708, -115, 452, 1140,
124 -820, 1912, 1421, -1604, 556, -632, -1991, -1409, -1904, -3604,
125 -3292, -3405, -5584, -4891, -5436, -8940, -6280, -6604,-11764, -6389,
126 -9081,-10928, -7784, -8492,-11263, -8292, -8829, -9632, -7828, -8920,
127 -10224, -8912, -9836, -7313, -2916,-10240, -3748, 2860, -3308, -1236,
128 6816, 4580, 1585, 9808, 7484, 5612, 6868, 7399, 6244, 5064,
129 3823, 5159, 4940, 316, 4496, 4864, 1020, 3997, 6236, 3316,
130 5712, 7032, 5568, 7329, 6135, 6904, 6431, 3768, 2580, 3724,
131 504, -2213, -661, -3320, -6660, -6696, -7971,-11208,-11316,-11784,
132 -14212,-13651,-16312,-15876,-15984,-20283,-15168, 2073,-23888, -5839,
133 13360, -8568, 1240, 18480, 11440, 4236, 23916, 15388, 14072, 15960,
134 15064, 14840, 9395, 6981, 8584, 6540, -5453, 3568, 928, -7741,
135 -5260, -12, -5692, -7608, 1408, 2136, 776, 1775, 13568, 10992,
136 8445, 17527, 21084, 14851, 15820, 23060, 15988, 11560, 15088, 14164,
137 3376, 4059, 5212, -2520, -5891, -3596, -5080,-11752, -8861, -8124,
138 -12104,-12076,-10028,-12333,-14180,-12516,-16036,-15559,-20416, -4240,
139 -1077,-31052, 14840, 7405,-12660, 11896, 23572, 2829, 10932, 28444,
140 10268, 15412, 13896, 16976, 10161, 6172, 5336, 9639, -2208, -7160,
141 6544, -7188,-11280, -3308, -2428,-13447, -4880, -824, -6664, -1436,
142 4608, 7473, 2688, 14275, 14921, 13564, 15960, 20393, 16976, 14832,
143 17540, 13524, 10744, 6876, 7328, 1772, -2340, -3528, -4516, -9576,
144 -10872, -8640,-13092,-12825,-14076,-12192,-16620,-16207,-17004,-17548,
145 -22088,-21700,-20320, 2836,-29576,-15860, 25811,-22555, -1868, 23624,
146 9872, -4044, 29472, 16037, 7433, 16640, 14577, 13119, 3120, 7072,
147 5828, 2285,-12087, 3180, -4031,-17840, -6349, -5300,-15452,-13852,
148 -2659,-12079, -8568, -4492, -672, 660, 5424, 3040, 16488, 11408,
149 8996, 24976, 15120, 9940, 21400, 16885, 2624, 13939, 8644, -2815,
150 332, -160, -9312,-10172, -8320,-14033,-13056,-16200,-14113,-15712,
151 -18153,-18664,-15937,-21692,-23500,-18597,-25948, -8597,-10368,-32768,
152 16916, -4469,-17121, 18448, 14791, -4252, 18880, 22312, 4347, 17672,
153 12672, 12964, 7384, 5404, 5176, 5668, -7692, -2356, 1148,-14872,
154 -8920, -5593,-12753,-14600, -6429,-10608,-10372, -6757, -4857, -2044,
155 -2720, 8995, 5088, 6516, 18384, 12853, 14952, 18048, 17439, 13920,
156 15512, 10960, 10268, 5136, 2888, 1184, -4271, -7104, -7376, -9688,
157 -14691,-11336,-14073,-17056,-14268,-16776,-17957,-19460,-18068,-23056,
158 -20512,-24004, -3396,-19239,-27272, 22283,-16439, -7300, 19484, 9020,
159 -1088, 22895, 15868, 9640, 17344, 11443, 17912, 6084, 6712, 9988,
160 6104, -8559, 6403, -1196,-13152, -3632, -5388,-11924,-11973, -5748,
161 -10292, -8420, -8468, -2256, -2829, -4132, 6344, 8785, 7444, 9508,
162 22152, 15108, 13151, 22536, 20725, 10672, 17028, 17052, 5536, 6192,
163 7484, 403, -5520, -2132, -5532,-11527,-10644, -9572,-13316,-16124,
164 -10883,-15965,-17335,-17316,-16064,-20436,-21660, -8547, -3732,-32768,
165 14672, 2213,-17200, 17964, 14387, 4232, 14800, 24296, 11288, 21368,
166 11144, 22992, 13599, 6973, 14444, 12312, -2340, 4436, 8060, -9008,
167 -2188, -2164, -5756,-10268, -5076, -6292, -6472, -7916, -2336, 327,
168 -4492, 7144, 7696, 5691, 16352, 14244, 17764, 19852, 17296, 23160,
169 18496, 14197, 19564, 13356, 5779, 10559, 4576, -2736, -528, -3211,
170 -8796, -8428, -9153,-10928,-13296,-12101,-12528,-14985,-16036,-14600,
171 -15888,-18792,-19604, -3176, -8887,-29240, 21405, -6999, -9568, 19052,
172 11952, 3037, 20055, 18376, 14501, 18672, 11023, 24776, 9488, 7921,
173 15896, 11068, -4484, 9667, 4328, -7544, -1240, -1456, -7204, -9192,
174 -5084, -5816, -6864, -9444, 276, -2316, -2852, 4640, 9600, 4412,
175 13300, 16856, 12836, 18892, 17632, 18336, 16031, 14808, 13860, 12052,
176 4284, 7372, 2623, -4284, -2172, -5036,-10163, -9788,-10384,-13205,
177 -13180,-13453,-14460,-15540,-16580,-15472,-17961,-19148,-18824, -8063,
178 -8620,-28300, 14323, -6748,-10204, 13100, 10548, 956, 16056, 14640,
179 12680, 14171, 9672, 19741, 7524, 6615, 11825, 8788, -5080, 7224,
180 1112, -6024, -4176, -1912, -7968, -8576, -7184, -5640, -8200, -9388,
181 -1980, -2064, -4040, 240, 9327, 2192, 8451, 13604, 13124, 10057,
182 16505, 15099, 11008, 10344, 12405, 7244, 1948, 4420, 132, -5312,
183 -6072, -5772,-11608,-11756,-11660,-12684,-14335,-14548,-12400,-15268,
184 -15277,-14949,-14889,-17376,-16640,-15656, -1128,-23476, -6084, 7268,
185 -13880, 400, 10984, 1468, 4388, 14156, 6600, 13684, 5428, 12240,
186 11815, 5460, 3663, 13164, -1269, 772, 3884, -788, -5536, -1652,
187 -4857, -4596, -7912, -6152, -4132, -7201, -6288, -1196, -1332, -4236,
188 5020, 5020, 1648, 8572, 10224, 6256, 9816, 9404, 8124, 6644,
189 4380, 4707, 636, -3300, -3208, -4395, -9716, -7540, -8175, -9980,
190 -10237, -7680,-12172, -9981,-10459, -9712, -8451,-13008,-10196, -9308,
191 -13109,-11700,-11636, -6143, -9472,-12117, 985, -3627, -6120, 2828,
192 5268, 33, 6984, 6488, 7803, 6265, 6992, 8032, 7892, 3408,
193 6021, 6224, 1016, 2053, 2632, -648, -1936, -1796, -2504, -2865,
194 -4400, -2524, -2388, -2524, -1432, 283, 696, 1180, 2912, 3996,
195 3328, 3948, 5101, 4905, 3396, 3500, 3323, 2472, -152, 1580,
196 -860, -2109, -1331, -2460, -2960, -3396, -3476, -2616, -5172, -3352,
197 -4036, -4440, -5480, -4028, -4220, -5876, -4656, -5233, -4621, -5465,
198 -6417, -4936, -5092, -1860, -5651, -2699, 1273, -920, -888, 4279,
199 3260, 2952, 5861, 5584, 5980, 6428, 5732, 6516, 6825, 4156,
200 5000, 5071, 2669, 1764, 3273, 1148, 1312, 880, 1788, 1457,
201 1299, 648, 3172, 2004, 1060, 3544, 1963, 2516, 3192, 3057,
202 2936, 2892, 2896, 2224, 3188, 1524, 1541, 3120, 624, 917,
203 1472, 1128, -317, 687, 400, -1131, 164, -812, -1232, -1120,
204 -1311, -1364, -1500, -1660, -2380, -1835, -2456, -2468, -2168, -2785,
205 -2824, -2408, -3316, -552, -1204, -3153, 1188, 1572, -752, 1756,
206 4108, 2344, 3595, 4504, 4152, 4556, 4224, 3568, 4801, 3165,
207 2776, 2808, 3233, 1300, 2411, 1536, 1828, 1424, 1576, 1412,
208 1880, 895, 1601, 1916, 1763, 944, 2599, 1349, 1873, 1988,
209 1744, 1956, 1667, 1548, 1812, 1048, 1528, 488, 1428, 832,
210 232, 207, 632, -152, -520, 20, 15, -1580, -841, -948,
211 -1120, -1455, -2004, -1244, -1344, -2236, -1312, -1344, -2156, -1420,
212 -1856, -1637, -1847, -1460, -1780, -1372, -508, -1256, -752, 0,
213 600, 859, 1156, 1532, 2364, 2204, 2059, 2269, 2240, 1928,
214 1889, 2055, 1205, 1068, 1268, 892, 1371, 1036, 413, 1552,
215 572, -84, 1364, 260, 624, 820, -160, 1492, 188, 204,
216 796, 468, 552, 945, -504, 697, -936, 284, -1116, -204,
217 -1052, -700, -1637, -673, -2744, -25, -2163, -1728, -1704, -1260,
218 -2228, -2512, -496, -3992, -824, -2699, -2172, -2196, -1684, -3376,
219 -540, -3047, -2220, -376, -3416, 8, -2424, -428, -1111, -927,
220 68, -1152, 640, -1308, 276, 536, 592, -292, 2256, -368,
221 680, 2532, -536, 1548, 780, -92, 1596, 56, 444, 348,
222 356, 500, -2168, 1527, -1632, -677, -980, -904, -868, 480,
223 -1476, -804, -1515, -335, -2472, -1533, -1007, -644, -2308, -1592,
224 -104, -3860, -984, -2364, 0, -1372, -2500, -2548, 1280, -3767,
225 -2228, -440, -2168, -2691, 628, -2013, -3773, -4292, 3796, -6452,
226 -1268, -156, -1320, -3779, 2612, -2924, -864, -619, 1227, -3408,
227 3016, -200, -1432, 2219, -45, -1356, 5744, -2069, 4396, 488,
228 3048, -801, 3876, 857, 2064, 80, 4240, -700, 1928, 1568,
229 -1992, 3431, 600, 2221, 657, -3116, 5888, -2668, 4871, -7963,
230 8016, -4907, 1264, -1969, 3688, -4396, -1276, 2448, -3760, 2156,
231 -3039, -3064, 940, 2384, -7907, 4520, -2876, 2384, -5784, 4484,
232 -5487, 1907, -4064, 1991, -3496, 1304, -4521, 5255, -4189, 1136,
233 -2397, -152, 768, -1671, 2084, -2709, 6413, -1460, 1952, 448,
234 7064, -444, 6256, 600, 8872, 2115, 4672, 7628, 6264, 2993,
235 8920, 2876, 7744, 3956, 4848, 7236, 804, 7684, 5201, 2216,
236 6360, 4900, -340, 6885, 1307, 2468, 1884, 4812, -1376, 4740,
237 1751, 135, 1124, 3284, -3228, 3968, 1748, -4453, 1587, -1515,
238 3084, -3300, -2548, -544, -296, 396, -7808, 4956, -5164, -292,
239 -4947, 212, -4055, -108, -4301, -2088, -2912, 3016, 952, -1888,
240 4972, 4441, 6136, 1464, 9387, 4137, 6812, 6281, 2440, 6940,
241 3928, 2704, -1204, 4260, -2289, -712, -1768, -383, -1195, 920,
242 -1200, -336, 4372, 720, 4392, 1291, 5819, 4528, 7532, 992,
243 8176, 5588, 2760, 2836, 3412, 1132, 531, 2236, -5044, 621,
244 -2916, -3964, -5849, -864, -6300,-10019, -3964, -5524, -7004, -6833,
245 -7236, -9484, -2528,-10112,-12900, -4199, -8580,-12427,-10924, -8604,
246 -11520, -9636, -6560, -1647, -6948, -460, 1752, 2952, 4196, 4360,
247 4215, 8156, 4528, 2464, 2500, 3299, -2224, -3812, -2568, -5875,
248 -5556, -7728, -8288, -5765, -6448, -7620, -5288, -2680, -4368, -972,
249 472, 1716, 2467, 4408, 5141, 4724, 7316, 4132, 3493, 5935,
250 3564, 96, 1068, 868, -2160, -2736, -3449, -5428, -3339, -5200,
251 -7156, -4189, -7928, -8064, -7532, -7999,-12124, -8509, -9888,-12420,
252 -13568,-13187,-15384,-14996,-15152,-15284,-17059,-15292,-11792, -1160,
253 -7300, -8284, 7237, 7241, 1616, 6327, 12064, 7920, 9564, 3556,
254 4612, 6980, 261, -6365, -2028, -1701,-10136, -9573, -6901, -7747,
255 -7868, -8076, -6123, -1508, -100, -3048, 2004, 6704, 4507, 3256,
256 9432, 8672, 7673, 6804, 7632, 8777, 6908, 3332, 3771, 6552,
257 3153, 400, 3029, 4388, 1328, 160, 2304, 2023, 1325, -2640,
258 -2356, -1544, -3436, -8584, -6939, -7180,-10455,-12928,-12296,-14653,
259 -15243,-16436,-15240,-16672,-15476,-14628, 7004, -1360,-10100, 16344,
260 18300, 9108, 12869, 22541, 16119, 17856, 10697, 6720, 12128, 6904,
261 -8184, -3440, 2592,-10440,-11735, -4739, -4455, -5457, -2432, -1476,
262 4520, 10045, 5512, 7988, 17032, 15052, 9211, 13309, 14624, 10324,
263 10488, 7809, 6908, 9896, 5861, 3284, 8348, 10505, 5189, 8144,
264 13280, 11732, 10035, 12559, 12104, 12456, 10148, 6520, 5944, 5603,
265 -1848, -4196, -2544, -5876,-11416,-10032,-10248,-12753,-13344,-14900,
266 -14320,-11265,-14220,-17067, -1440, 20120, -9884, 2783, 32220, 22208,
267 9032, 22661, 26820, 19916, 17747, 5288, 8628, 14293, -3331,-15672,
268 1252, -324,-18236,-11592, -1172, -3384, -3864, 1052, 3640, 13099,
269 13691, 6520, 14320, 22856, 12887, 7152, 14764, 13276, 4060, 2568,
270 2268, 2224, 3312, -3336, -875, 9000, 6180, 1872, 10851, 17464,
271 12312, 11197, 15388, 17816, 12024, 8332, 7119, 8096, 1608, -5611,
272 -5964, -4729,-11317,-14784,-12833,-11272,-14888,-16128,-15012,-12028,
273 -14472,-16227,-15356,-14484,-15056, 11496, 352,-14108, 19216, 24616,
274 3724, 7872, 25948, 13832, 9680, 7492, 2052, 5220, 1188,-16112,
275 -11340, 703,-15400,-21572, -5816, -3320,-12072, -5664, 2296, 3101,
276 6708, 5396, 5735, 13601, 12040, 1924, 6071, 10420, 984, -4904,
277 -204, -1945, -6229, -7460, -5636, 2864, -476, -2832, 6104, 13160,
278 7151, 7148, 13063, 13596, 8796, 5092, 5976, 5668, -431, -7624,
279 -6741, -5676,-14332,-18700,-13396,-12387,-18576,-17516,-14184,-14124,
280 -15972,-17456,-16323,-14712,-18056,-23213,-10744, 12016,-14824,-12636,
281 21656, 14112, -4085, 9255, 20864, 8196, 6384, 1223, 2244, 5304,
282 -6660,-19192, -4961, -2875,-22564,-18400, -3220, -8488,-14544, -5040,
283 -324, 820, 2732, 628, 5484, 11924, 4813, -852, 8656, 7160,
284 -3924, -2955, 1337, -3268, -7359, -2552, -2528, -532, 128, 411,
285 5324, 9301, 5601, 6200, 11684, 10072, 4924, 5508, 6660, 1568,
286 -2332, -4268, -5628, -7987,-12004,-13760,-11567,-12104,-16539,-14437,
287 -12012,-14309,-16736,-14573,-13604,-15468,-18204,-19103, -9140, 10132,
288 -13631, -9568, 22580, 13756, -3548, 12112, 23891, 8144, 5964, 7240,
289 7216, 4284, -4800,-11761, -1308, -3044,-19584,-13808, -759, -7968,
290 -14524, -1503, 3072, -396, 1936, 5900, 9264, 10769, 7240, 5961,
291 13112, 8788, 660, 2807, 7980, -449, -2477, 3940, 2792, 1584,
292 2791, 5603, 7528, 9692, 5924, 9123, 15240, 9636, 4924, 11044,
293 11113, 956, 756, 2812, -1832, -6920, -7120, -7192, -7711, -9717,
294 -12704, -8736, -7508,-12067,-13176, -8133, -9304,-13160,-13437,-13268,
295 -4084, 11400,-12785, -700, 24992, 12168, -1268, 19404, 25183, 8373,
296 10256, 13664, 11200, 5879, -60, -3656, 4556, -2972,-14688, -4932,
297 2432, -9279,-10691, 4280, 3180, -2444, 4088, 9992, 9176, 9156,
298 9520, 11164, 14484, 8608, 4919, 10556, 9792, 2740, 3456, 8840,
299 6424, 2348, 5696, 9420, 6596, 5380, 8364, 10952, 8499, 6800,
300 8728, 9641, 5412, 2340, 3596, 2039, -2864, -5489, -3616, -5596,
301 -9232, -8744, -7788, -9860,-11104, -9356, -9464,-11188,-11312,-11036,
302 -11736,-13564, -6016, 8744,-11784, -1196, 18972, 9512, -572, 17407,
303 20316, 7472, 9784, 13369, 8952, 5092, 1003, -2004, 2755, -3952,
304 -12761, -4648, -744,-11667,-10240, 1556, -1572, -5872, 2196, 6011,
305 3900, 5384, 7529, 8924, 9629, 6324, 5744, 9484, 7829, 3420,
306 4384, 8644, 4360, 1500, 5248, 5921, 2200, 2564, 5212, 5037,
307 2849, 2836, 3985, 3952, 875, -560, 416, -1052, -5228, -5185,
308 -4996, -7820, -9616, -9076,-10644,-11239,-11816,-12360,-12228,-12420,
309 -13560,-12940,-13044,-15648,-11664, 1945, -9676, -9088, 9676, 6708,
310 -3048, 8185, 15520, 4620, 5764, 10716, 6584, 2684, 2276, -1436,
311 -56, -2948, -9140, -6611, -2868, -9897,-10565, -2012, -3948, -7916,
312 -1440, 2420, -241, 1164, 4428, 4932, 5461, 3884, 4476, 6620,
313 7724, 1779, 3172, 8256, 3132, -749, 5192, 4300, -1388, 1192,
314 3575, 789, -228, 1185, 995, 937, -952, -2624, -449, -1992,
315 -6204, -4648, -3000, -7604, -8536, -5868, -9024,-10507,-10064, -9296,
316 -12896,-11120,-11776,-13288,-14137,-12668,-15780,-14157, -8392, -7444,
317 -11156, -2300, 2828, -1747, 1164, 8152, 6280, 4876, 7912, 7604,
318 5609, 5164, 2600, 1620, 1592, -3237, -4441, -2068, -5052, -8268,
319 -4503, -3304, -6332, -4460, -388, -297, -319, 1911, 4071, 4272,
320 4659, 8368, 6933, 6720, 8764, 8640, 6412, 6384, 5927, 3820,
321 3488, 2648, 1104, 1220, 884, -692, 327, 616, -972, -160,
322 713, -593, -652, 179, -651, -2005, -656, -1536, -2968, -3748,
323 -2640, -5052, -5548, -3476, -6151, -6388, -5168, -6099, -7416, -5752,
324 -7579, -8220, -8312, -8472, -5287, -8056, -3527, -2356, -1704, 1892,
325 2408, 2893, 5965, 8121, 5136, 8480, 8928, 7364, 6408, 7960,
326 4315, 4392, 3864, 1353, 928, 1436, -1480, -488, 1640, -380,
327 -36, 3420, 4044, 4432, 5185, 8044, 8740, 7983, 7912, 9588,
328 8588, 6804, 6944, 6700, 4308, 2852, 3252, 2192, -136, 876,
329 1008, 244, 160, 205, 992, 1684, -136, 984, 3312, 853,
330 -772, 2372, 436, -3008, -1024, -136, -3800, -2263, -3212, -2749,
331 -3688, -2424, -5372, -2136, -3288, -4952, -3596, -2028, -4640, -5797,
332 -2696, -4040, -7152, -4055, -2568, -6460, -4228, -1092, -2780, -2492,
333 468, -235, 1620, 3500, 2040, 2840, 6300, 4488, 2488, 5707,
334 5576, 3537, 2291, 4301, 2844, 3364, 1153, 2500, 3340, 3160,
335 1224, 3220, 4016, 2228, 1788, 4199, 3604, 2096, 1763, 3237,
336 2044, -564, 1280, 876, -584, -1904, 24, -60, -2948, -1440,
337 -1228, -1824, -2092, -1945, -3912, -227, -2411, -3219, -2252, -1808,
338 -3044, -1035, -3092, -1456, -3724, -2284, -3149, -3028, -2788, -1804,
339 -3360, -1276, -4097, -2531, -2248, -1635, -3215, -2376, -2468, -2596,
340 -2825, -2792, -1980, -4036, -1721, -2059, -4117, 364, -1452, -2772,
341 -1336, 480, -1043, 244, -2904, 924, -1329, 968, -1891, 523,
342 -624, -464, -564, 187, -852, 584, -764, -260, -147, 160,
343 339, -32, 936, -896, 288, 136, 56, -36, -736, -683,
344 -332, 696, -2319, -259, 564, -2196, -860, 1108, -2177, -728,
345 1344, -2520, -440, 1080, -780, -3513, 3272, -1635, -1597, -188,
346 744, -1944, 140, -636, -1644, -141, -596, -1132, -816, 1168,
347 -2836, 196, 312, 136, -1381, 628, -223, -368, -425, 604,
348 -776, 595, -628, -128, -884, 960, -1092, 76, 144, 8,
349 161, -504, 760, -808, 336, 185, 100, 404, 120, 236,
350 68, -148, -64, 312, 320, -560, 117, -28, 236, -231,
351 -92, 60, 356, -176, 176, 212, 124, -57, -76, 168,
352 88, -140, -37, 160, 0, -92, 96, 24, -84, 0,
353};
354
355#define THIS_FILE "mips_test.c"
356#define DURATION 1000
357#define PTIME 20 /* MUST be 20! */
358#define MEGA 1000000
359#define GIGA 1000000000
360
361enum op
362{
363 OP_GET = 1,
364 OP_PUT = 2,
365 OP_GET_PUT = 4,
366 OP_PUT_GET = 8
367};
368
369enum clock_rate
370{
371 K8 = 1,
372 K16 = 2,
373};
374
375
376struct test_entry
377{
378 const char *title;
379 unsigned valid_op;
380 unsigned valid_clock_rate;
381 pjmedia_port* (*init)(pj_pool_t *pool,
382 unsigned clock_rate,
383 unsigned channel_count,
384 unsigned samples_per_frame,
385 unsigned flags,
386 struct test_entry *);
387 void (*custom_run)(struct test_entry*);
388 void (*custom_deinit)(struct test_entry*);
389
390 void *pdata[4];
391 unsigned idata[4];
392};
393
394
395/***************************************************************************/
396/* pjmedia_port to supply with continuous frames */
397static pjmedia_port* create_gen_port(pj_pool_t *pool,
398 unsigned clock_rate,
399 unsigned channel_count,
400 unsigned samples_per_frame,
401 unsigned pct_level)
402{
403 pjmedia_port *port;
404 pj_status_t status;
405
406 if (pct_level == 100 && channel_count==1) {
407 status = pjmedia_mem_player_create(pool, ref_signal,
408 sizeof(ref_signal), clock_rate,
409 channel_count, samples_per_frame,
410 16, 0, &port);
411 } else {
412 pj_int16_t *buf;
413 unsigned c;
414
415 buf = pj_pool_alloc(pool, sizeof(ref_signal)*channel_count);
416 for (c=0; c<channel_count; ++c) {
417 unsigned i;
418 pj_int16_t *p;
419
420 p = buf+c;
421 for (i=0; i<PJ_ARRAY_SIZE(ref_signal); ++i) {
422 *p = ref_signal[i] * pct_level / 100;
423 p += channel_count;
424 }
425 }
426 status = pjmedia_mem_player_create(pool, buf,
427 sizeof(ref_signal)*channel_count,
428 clock_rate, channel_count,
429 samples_per_frame,
430 16, 0, &port);
431 }
432
433 return status==PJ_SUCCESS? port : NULL;
434}
435
436/***************************************************************************/
437static pjmedia_port* gen_port_test_init(pj_pool_t *pool,
438 unsigned clock_rate,
439 unsigned channel_count,
440 unsigned samples_per_frame,
441 unsigned flags,
442 struct test_entry *te)
443{
444 PJ_UNUSED_ARG(flags);
445 PJ_UNUSED_ARG(te);
446 return create_gen_port(pool, clock_rate, channel_count, samples_per_frame,
447 100);
448}
449
450
451/***************************************************************************/
452static pjmedia_port* init_conf_port(unsigned nb_participant,
453 pj_pool_t *pool,
454 unsigned clock_rate,
455 unsigned channel_count,
456 unsigned samples_per_frame,
457 unsigned flags,
458 struct test_entry *te)
459{
460 pjmedia_conf *conf;
461 unsigned i;
462 pj_status_t status;
463
464 PJ_UNUSED_ARG(flags);
465 PJ_UNUSED_ARG(te);
466
467 /* Create conf */
468 status = pjmedia_conf_create(pool, 2+nb_participant*2, clock_rate,
469 channel_count, samples_per_frame, 16,
470 PJMEDIA_CONF_NO_DEVICE, &conf);
471 if (status != PJ_SUCCESS)
472 return NULL;
473
474 for (i=0; i<nb_participant; ++i) {
475 pjmedia_port *gen_port, *null_port;
476 unsigned slot1, slot2;
477
478 /* Create gen_port for source audio */
479 gen_port = create_gen_port(pool, clock_rate, channel_count,
480 samples_per_frame, 100 / nb_participant);
481 if (!gen_port)
482 return NULL;
483
484 /* Add port */
485 status = pjmedia_conf_add_port(conf, pool, gen_port, NULL, &slot1);
486 if (status != PJ_SUCCESS)
487 return NULL;
488
489 /* Connect gen_port to sound dev */
490 status = pjmedia_conf_connect_port(conf, slot1, 0, 0);
491 if (status != PJ_SUCCESS)
492 return NULL;
493
494 /* Create null sink frame */
495 status = pjmedia_null_port_create(pool, clock_rate, channel_count,
496 samples_per_frame, 16, &null_port);
497 if (status != PJ_SUCCESS)
498 return NULL;
499
500 /* add null port */
501 status = pjmedia_conf_add_port(conf, pool, null_port, NULL, &slot2);
502 if (status != PJ_SUCCESS)
503 return NULL;
504
505 /* connect sound to null sink port */
506 status = pjmedia_conf_connect_port(conf, 0, slot2, 0);
507 if (status != PJ_SUCCESS)
508 return NULL;
509
510 /* connect gen_port to null sink port */
511#if 0
512 status = pjmedia_conf_connect_port(conf, slot1, slot2, 0);
513 if (status != PJ_SUCCESS)
514 return NULL;
515#endif
516 }
517
518 return pjmedia_conf_get_master_port(conf);
519}
520
521
522/***************************************************************************/
523/* Benchmark conf with 1 participant, no mixing */
524static pjmedia_port* conf1_test_init(pj_pool_t *pool,
525 unsigned clock_rate,
526 unsigned channel_count,
527 unsigned samples_per_frame,
528 unsigned flags,
529 struct test_entry *te)
530{
531 return init_conf_port(1, pool, clock_rate, channel_count,
532 samples_per_frame, 0, te);
533}
534
535
536/***************************************************************************/
537/* Benchmark conf with 2 participants, mixing to/from snd dev */
538static pjmedia_port* conf2_test_init(pj_pool_t *pool,
539 unsigned clock_rate,
540 unsigned channel_count,
541 unsigned samples_per_frame,
542 unsigned flags,
543 struct test_entry *te)
544{
545 return init_conf_port(2, pool, clock_rate, channel_count,
546 samples_per_frame, 0, te);
547}
548
549/***************************************************************************/
550/* Benchmark conf with 4 participants, mixing to/from snd dev */
551static pjmedia_port* conf4_test_init(pj_pool_t *pool,
552 unsigned clock_rate,
553 unsigned channel_count,
554 unsigned samples_per_frame,
555 unsigned flags,
556 struct test_entry *te)
557{
558 return init_conf_port(4, pool, clock_rate, channel_count,
559 samples_per_frame, 0, te);
560}
561
562/***************************************************************************/
563/* Benchmark conf with 8 participants, mixing to/from snd dev */
564static pjmedia_port* conf8_test_init(pj_pool_t *pool,
565 unsigned clock_rate,
566 unsigned channel_count,
567 unsigned samples_per_frame,
568 unsigned flags,
569 struct test_entry *te)
570{
571 return init_conf_port(8, pool, clock_rate, channel_count,
572 samples_per_frame, 0, te);
573}
574
575/***************************************************************************/
576/* Benchmark conf with 16 participants, mixing to/from snd dev */
577static pjmedia_port* conf16_test_init(pj_pool_t *pool,
578 unsigned clock_rate,
579 unsigned channel_count,
580 unsigned samples_per_frame,
581 unsigned flags,
582 struct test_entry *te)
583{
584 return init_conf_port(16, pool, clock_rate, channel_count,
585 samples_per_frame, 0, te);
586}
587
588/***************************************************************************/
589/* Up and downsample */
590static pjmedia_port* updown_resample_get(pj_pool_t *pool,
591 pj_bool_t high_quality,
592 pj_bool_t large_filter,
593 unsigned clock_rate,
594 unsigned channel_count,
595 unsigned samples_per_frame,
596 unsigned flags,
597 struct test_entry *te)
598{
599 pjmedia_port *gen_port, *up, *down;
600 unsigned opt = 0;
601 pj_status_t status;
602
603 if (!high_quality)
604 opt |= PJMEDIA_RESAMPLE_USE_LINEAR;
605 if (!large_filter)
606 opt |= PJMEDIA_RESAMPLE_USE_SMALL_FILTER;
607
608 gen_port = create_gen_port(pool, clock_rate, channel_count,
609 samples_per_frame, 100);
610 status = pjmedia_resample_port_create(pool, gen_port, clock_rate*2, opt, &up);
611 if (status != PJ_SUCCESS)
612 return NULL;
613 status = pjmedia_resample_port_create(pool, up, clock_rate, opt, &down);
614 if (status != PJ_SUCCESS)
615 return NULL;
616
617 return down;
618}
619
620/* Linear resampling */
621static pjmedia_port* linear_resample( pj_pool_t *pool,
622 unsigned clock_rate,
623 unsigned channel_count,
624 unsigned samples_per_frame,
625 unsigned flags,
626 struct test_entry *te)
627{
628 return updown_resample_get(pool, PJ_FALSE, PJ_FALSE, clock_rate,
629 channel_count, samples_per_frame, flags, te);
630}
631
632/* Small filter resampling */
633static pjmedia_port* small_filt_resample( pj_pool_t *pool,
634 unsigned clock_rate,
635 unsigned channel_count,
636 unsigned samples_per_frame,
637 unsigned flags,
638 struct test_entry *te)
639{
640 return updown_resample_get(pool, PJ_TRUE, PJ_FALSE, clock_rate,
641 channel_count, samples_per_frame, flags, te);
642}
643
644/* Larger filter resampling */
645static pjmedia_port* large_filt_resample( pj_pool_t *pool,
646 unsigned clock_rate,
647 unsigned channel_count,
648 unsigned samples_per_frame,
649 unsigned flags,
650 struct test_entry *te)
651{
652 return updown_resample_get(pool, PJ_TRUE, PJ_TRUE, clock_rate,
653 channel_count, samples_per_frame, flags, te);
654}
655
656
657/***************************************************************************/
658/* Codec encode/decode */
659
660struct codec_port
661{
662 pjmedia_port base;
663 pjmedia_endpt *endpt;
664 pjmedia_codec *codec;
665 pj_status_t (*codec_deinit)();
666 pj_uint8_t pkt[640];
667 pj_uint16_t pcm[320];
668};
669
670
671static pj_status_t codec_put_frame(struct pjmedia_port *this_port,
672 const pjmedia_frame *frame)
673{
674 struct codec_port *cp = (struct codec_port*)this_port;
675 pjmedia_frame out_frame;
676 pj_status_t status;
677
678 out_frame.buf = cp->pkt;
679 out_frame.size = sizeof(cp->pkt);
680 status = cp->codec->op->encode(cp->codec, frame, sizeof(cp->pkt),
681 &out_frame);
682 pj_assert(status == PJ_SUCCESS);
683
684 if (out_frame.size != 0) {
685 pjmedia_frame parsed_frm[2], pcm_frm;
686 unsigned frame_cnt = PJ_ARRAY_SIZE(parsed_frm);
687 unsigned i;
688
689 status = cp->codec->op->parse(cp->codec, out_frame.buf,
690 out_frame.size, &out_frame.timestamp,
691 &frame_cnt, parsed_frm);
692 pj_assert(status == PJ_SUCCESS);
693
694 for (i=0; i<frame_cnt; ++i) {
695 pcm_frm.buf = cp->pcm;
696 pcm_frm.size = sizeof(cp->pkt);
697 status = cp->codec->op->decode(cp->codec, &parsed_frm[i],
698 sizeof(cp->pcm), &pcm_frm);
699 pj_assert(status == PJ_SUCCESS);
700 }
701 }
702
703 return PJ_SUCCESS;
704}
705
706static pj_status_t codec_on_destroy(struct pjmedia_port *this_port)
707{
708 struct codec_port *cp = (struct codec_port*)this_port;
709
710 cp->codec->op->close(cp->codec);
711 pjmedia_codec_mgr_dealloc_codec(pjmedia_endpt_get_codec_mgr(cp->endpt),
712 cp->codec);
713 cp->codec_deinit();
714 pjmedia_endpt_destroy(cp->endpt);
715 return PJ_SUCCESS;
716}
717
718static pjmedia_port* codec_encode_decode( pj_pool_t *pool,
719 const char *codec,
720 pj_status_t (*codec_init)(pjmedia_endpt*),
721 pj_status_t (*codec_deinit)(),
722 unsigned clock_rate,
723 unsigned channel_count,
724 unsigned samples_per_frame,
725 unsigned flags,
726 struct test_entry *te)
727{
728 struct codec_port *cp;
729 pj_str_t codec_id;
730 const pjmedia_codec_info *ci[1];
731 unsigned count;
732 pjmedia_codec_param codec_param;
733 pj_status_t status;
734
735 codec_id = pj_str((char*)codec);
736 cp = PJ_POOL_ZALLOC_T(pool, struct codec_port);
737 pjmedia_port_info_init(&cp->base.info, &codec_id, 0x123456, clock_rate,
738 channel_count, 16, samples_per_frame);
739 cp->base.put_frame = &codec_put_frame;
740 cp->base.on_destroy = &codec_on_destroy;
741 cp->codec_deinit = codec_deinit;
742
743 status = pjmedia_endpt_create(mem, NULL, 0, &cp->endpt);
744 if (status != PJ_SUCCESS)
745 return NULL;
746
747 status = codec_init(cp->endpt);
748 if (status != PJ_SUCCESS)
749 return NULL;
750
751 count = 1;
752 status = pjmedia_codec_mgr_find_codecs_by_id(pjmedia_endpt_get_codec_mgr(cp->endpt),
753 &codec_id, &count, ci, NULL);
754 if (status != PJ_SUCCESS)
755 return NULL;
756
757 status = pjmedia_codec_mgr_alloc_codec(pjmedia_endpt_get_codec_mgr(cp->endpt),
758 ci[0], &cp->codec);
759 if (status != PJ_SUCCESS)
760 return NULL;
761
762 status = pjmedia_codec_mgr_get_default_param(pjmedia_endpt_get_codec_mgr(cp->endpt),
763 ci[0], &codec_param);
764 if (status != PJ_SUCCESS)
765 return NULL;
766
767 status = (*cp->codec->op->init)(cp->codec, pool);
768 if (status != PJ_SUCCESS)
769 return NULL;
770
771 status = cp->codec->op->open(cp->codec, &codec_param);
772 if (status != PJ_SUCCESS)
773 return NULL;
774
775 return &cp->base;
776}
777
778/* G.711 benchmark */
779static pjmedia_port* g711_encode_decode( pj_pool_t *pool,
780 unsigned clock_rate,
781 unsigned channel_count,
782 unsigned samples_per_frame,
783 unsigned flags,
784 struct test_entry *te)
785{
786 return codec_encode_decode(pool, "pcmu", &pjmedia_codec_g711_init,
787 &pjmedia_codec_g711_deinit,
788 clock_rate, channel_count,
789 samples_per_frame, flags, te);
790}
791
792/* GSM benchmark */
793static pjmedia_port* gsm_encode_decode( pj_pool_t *pool,
794 unsigned clock_rate,
795 unsigned channel_count,
796 unsigned samples_per_frame,
797 unsigned flags,
798 struct test_entry *te)
799{
800 return codec_encode_decode(pool, "gsm", &pjmedia_codec_gsm_init,
801 &pjmedia_codec_gsm_deinit,
802 clock_rate, channel_count,
803 samples_per_frame, flags, te);
804}
805
806static pj_status_t ilbc_init(pjmedia_endpt *endpt)
807{
808 return pjmedia_codec_ilbc_init(endpt, 20);
809}
810
811/* iLBC benchmark */
812static pjmedia_port* ilbc_encode_decode( pj_pool_t *pool,
813 unsigned clock_rate,
814 unsigned channel_count,
815 unsigned samples_per_frame,
816 unsigned flags,
817 struct test_entry *te)
818{
819 return codec_encode_decode(pool, "ilbc", &ilbc_init,
820 &pjmedia_codec_ilbc_deinit, clock_rate,
821 channel_count, samples_per_frame, flags, te);
822}
823
824/* Speex narrowband benchmark */
825static pjmedia_port* speex8_encode_decode(pj_pool_t *pool,
826 unsigned clock_rate,
827 unsigned channel_count,
828 unsigned samples_per_frame,
829 unsigned flags,
830 struct test_entry *te)
831{
832 return codec_encode_decode(pool, "speex/8000",
833 &pjmedia_codec_speex_init_default,
834 &pjmedia_codec_speex_deinit,
835 clock_rate, channel_count,
836 samples_per_frame, flags, te);
837}
838
839/* Speex wideband benchmark */
840static pjmedia_port* speex16_encode_decode(pj_pool_t *pool,
841 unsigned clock_rate,
842 unsigned channel_count,
843 unsigned samples_per_frame,
844 unsigned flags,
845 struct test_entry *te)
846{
847 return codec_encode_decode(pool, "speex/16000",
848 &pjmedia_codec_speex_init_default,
849 &pjmedia_codec_speex_deinit,
850 clock_rate, channel_count,
851 samples_per_frame, flags, te);
852}
853
854/* G.722 benchmark benchmark */
855static pjmedia_port* g722_encode_decode(pj_pool_t *pool,
856 unsigned clock_rate,
857 unsigned channel_count,
858 unsigned samples_per_frame,
859 unsigned flags,
860 struct test_entry *te)
861{
862 return codec_encode_decode(pool, "g722", &pjmedia_codec_g722_init,
863 &pjmedia_codec_g722_deinit,
864 clock_rate, channel_count,
865 samples_per_frame, flags, te);
866}
867
868static pj_status_t init_l16_default(pjmedia_endpt *endpt)
869{
870 return pjmedia_codec_l16_init(endpt, 0);
871}
872
873/* L16/8000/1 benchmark */
874static pjmedia_port* l16_8_encode_decode(pj_pool_t *pool,
875 unsigned clock_rate,
876 unsigned channel_count,
877 unsigned samples_per_frame,
878 unsigned flags,
879 struct test_entry *te)
880{
881 return codec_encode_decode(pool, "L16/8000/1", &init_l16_default,
882 &pjmedia_codec_l16_deinit,
883 clock_rate, channel_count,
884 samples_per_frame, flags, te);
885}
886
887/* L16/16000/1 benchmark */
888static pjmedia_port* l16_16_encode_decode(pj_pool_t *pool,
889 unsigned clock_rate,
890 unsigned channel_count,
891 unsigned samples_per_frame,
892 unsigned flags,
893 struct test_entry *te)
894{
895 return codec_encode_decode(pool, "L16/16000/1", &init_l16_default,
896 &pjmedia_codec_l16_deinit,
897 clock_rate, channel_count,
898 samples_per_frame, flags, te);
899}
900
901/***************************************************************************/
902/* WSOLA PLC mode */
903
904struct wsola_plc_port
905{
906 pjmedia_port base;
907 pjmedia_wsola *wsola;
908 pjmedia_port *gen_port;
909 int loss_pct;
910 pj_bool_t prev_lost;
911};
912
913
914static pj_status_t wsola_plc_get_frame(struct pjmedia_port *this_port,
915 pjmedia_frame *frame)
916{
917 struct wsola_plc_port *wp = (struct wsola_plc_port*)this_port;
918 pj_status_t status;
919
920
921 if ((pj_rand() % 100) > wp->loss_pct) {
922 status = pjmedia_port_get_frame(wp->gen_port, frame);
923 pj_assert(status == PJ_SUCCESS);
924
925 status = pjmedia_wsola_save(wp->wsola, (short*)frame->buf,
926 wp->prev_lost);
927 pj_assert(status == PJ_SUCCESS);
928
929 wp->prev_lost = PJ_FALSE;
930 } else {
931 status = pjmedia_wsola_generate(wp->wsola, (short*)frame->buf);
932 wp->prev_lost = PJ_TRUE;
933 }
934
935 return PJ_SUCCESS;
936}
937
938static pj_status_t wsola_plc_on_destroy(struct pjmedia_port *this_port)
939{
940 struct wsola_plc_port *wp = (struct wsola_plc_port*)this_port;
941 pjmedia_port_destroy(wp->gen_port);
942 pjmedia_wsola_destroy(wp->wsola);
943 return PJ_SUCCESS;
944}
945
946static pjmedia_port* create_wsola_plc(unsigned loss_pct,
947 pj_pool_t *pool,
948 unsigned clock_rate,
949 unsigned channel_count,
950 unsigned samples_per_frame,
951 unsigned flags,
952 struct test_entry *te)
953{
954 struct wsola_plc_port *wp;
955 pj_str_t name = pj_str("wsola");
956 unsigned opt = 0;
957 pj_status_t status;
958
959 wp = PJ_POOL_ZALLOC_T(pool, struct wsola_plc_port);
960 wp->loss_pct = loss_pct;
961 wp->base.get_frame = &wsola_plc_get_frame;
962 wp->base.on_destroy = &wsola_plc_on_destroy;
963 pjmedia_port_info_init(&wp->base.info, &name, 0x4123, clock_rate,
964 channel_count, 16, samples_per_frame);
965
966 if (loss_pct == 0)
967 opt |= PJMEDIA_WSOLA_NO_PLC;
968
969 status = pjmedia_wsola_create(pool, clock_rate, samples_per_frame,
970 channel_count, 0, &wp->wsola);
971 if (status != PJ_SUCCESS)
972 return NULL;
973
974 wp->gen_port = create_gen_port(pool, clock_rate, channel_count,
975 samples_per_frame, 100);
976 if (wp->gen_port == NULL)
977 return NULL;
978
979 return &wp->base;
980}
981
982
983/* WSOLA PLC with 0% packet loss */
984static pjmedia_port* wsola_plc_0( pj_pool_t *pool,
985 unsigned clock_rate,
986 unsigned channel_count,
987 unsigned samples_per_frame,
988 unsigned flags,
989 struct test_entry *te)
990{
991 return create_wsola_plc(0, pool, clock_rate, channel_count,
992 samples_per_frame, flags, te);
993}
994
995
996/* WSOLA PLC with 2% packet loss */
997static pjmedia_port* wsola_plc_2( pj_pool_t *pool,
998 unsigned clock_rate,
999 unsigned channel_count,
1000 unsigned samples_per_frame,
1001 unsigned flags,
1002 struct test_entry *te)
1003{
1004 return create_wsola_plc(2, pool, clock_rate, channel_count,
1005 samples_per_frame, flags, te);
1006}
1007
1008/* WSOLA PLC with 5% packet loss */
1009static pjmedia_port* wsola_plc_5( pj_pool_t *pool,
1010 unsigned clock_rate,
1011 unsigned channel_count,
1012 unsigned samples_per_frame,
1013 unsigned flags,
1014 struct test_entry *te)
1015{
1016 return create_wsola_plc(5, pool, clock_rate, channel_count,
1017 samples_per_frame, flags, te);
1018}
1019
1020/* WSOLA PLC with 10% packet loss */
1021static pjmedia_port* wsola_plc_10(pj_pool_t *pool,
1022 unsigned clock_rate,
1023 unsigned channel_count,
1024 unsigned samples_per_frame,
1025 unsigned flags,
1026 struct test_entry *te)
1027{
1028 return create_wsola_plc(10, pool, clock_rate, channel_count,
1029 samples_per_frame, flags, te);
1030}
1031
1032/* WSOLA PLC with 20% packet loss */
1033static pjmedia_port* wsola_plc_20(pj_pool_t *pool,
1034 unsigned clock_rate,
1035 unsigned channel_count,
1036 unsigned samples_per_frame,
1037 unsigned flags,
1038 struct test_entry *te)
1039{
1040 return create_wsola_plc(20, pool, clock_rate, channel_count,
1041 samples_per_frame, flags, te);
1042}
1043
1044/* WSOLA PLC with 50% packet loss */
1045static pjmedia_port* wsola_plc_50(pj_pool_t *pool,
1046 unsigned clock_rate,
1047 unsigned channel_count,
1048 unsigned samples_per_frame,
1049 unsigned flags,
1050 struct test_entry *te)
1051{
1052 return create_wsola_plc(50, pool, clock_rate, channel_count,
1053 samples_per_frame, flags, te);
1054}
1055
1056
1057
1058/***************************************************************************/
1059/* WSOLA discard mode */
1060enum { CIRC_BUF_FRAME_CNT = 4 };
1061struct wsola_discard_port
1062{
1063 pjmedia_port base;
1064 pjmedia_port *gen_port;
1065 pjmedia_wsola *wsola;
1066 pjmedia_circ_buf *circbuf;
1067 unsigned discard_pct;
1068};
1069
1070
1071static pj_status_t wsola_discard_get_frame(struct pjmedia_port *this_port,
1072 pjmedia_frame *frame)
1073{
1074 struct wsola_discard_port *wp = (struct wsola_discard_port*)this_port;
1075 pj_status_t status;
1076
1077 while (pjmedia_circ_buf_get_len(wp->circbuf) <
1078 wp->base.info.samples_per_frame * (CIRC_BUF_FRAME_CNT-1))
1079 {
1080 status = pjmedia_port_get_frame(wp->gen_port, frame);
1081 pj_assert(status==PJ_SUCCESS);
1082
1083 status = pjmedia_circ_buf_write(wp->circbuf, (short*)frame->buf,
1084 wp->base.info.samples_per_frame);
1085 pj_assert(status==PJ_SUCCESS);
1086 }
1087
1088 if ((pj_rand() % 100) < (int)wp->discard_pct) {
1089 pj_int16_t *reg1, *reg2;
1090 unsigned reg1_len, reg2_len;
1091 unsigned del_cnt;
1092
1093 pjmedia_circ_buf_get_read_regions(wp->circbuf, &reg1, &reg1_len,
1094 &reg2, &reg2_len);
1095
1096 del_cnt = wp->base.info.samples_per_frame;
1097 status = pjmedia_wsola_discard(wp->wsola, reg1, reg1_len, reg2,
1098 reg2_len, &del_cnt);
1099 pj_assert(status==PJ_SUCCESS);
1100
1101 status = pjmedia_circ_buf_adv_read_ptr(wp->circbuf, del_cnt);
1102 pj_assert(status==PJ_SUCCESS);
1103 }
1104
1105 return PJ_SUCCESS;
1106}
1107
1108static pj_status_t wsola_discard_on_destroy(struct pjmedia_port *this_port)
1109{
1110 struct wsola_discard_port *wp = (struct wsola_discard_port*)this_port;
1111 pjmedia_port_destroy(wp->gen_port);
1112 pjmedia_wsola_destroy(wp->wsola);
1113 return PJ_SUCCESS;
1114}
1115
1116
1117static pjmedia_port* create_wsola_discard(unsigned discard_pct,
1118 pj_pool_t *pool,
1119 unsigned clock_rate,
1120 unsigned channel_count,
1121 unsigned samples_per_frame,
1122 unsigned flags,
1123 struct test_entry *te)
1124{
1125 struct wsola_discard_port *wp;
1126 pj_str_t name = pj_str("wsola");
1127 unsigned i, opt = 0;
1128 pj_status_t status;
1129
1130 wp = PJ_POOL_ZALLOC_T(pool, struct wsola_discard_port);
1131 wp->discard_pct = discard_pct;
1132 wp->base.get_frame = &wsola_discard_get_frame;
1133 wp->base.on_destroy = &wsola_discard_on_destroy;
1134 pjmedia_port_info_init(&wp->base.info, &name, 0x4123, clock_rate,
1135 channel_count, 16, samples_per_frame);
1136
1137 if (discard_pct == 0)
1138 opt |= PJMEDIA_WSOLA_NO_DISCARD;
1139
1140 status = pjmedia_wsola_create(pool, clock_rate, samples_per_frame,
1141 channel_count, 0, &wp->wsola);
1142 if (status != PJ_SUCCESS)
1143 return NULL;
1144
1145 wp->gen_port = create_gen_port(pool, clock_rate, channel_count,
1146 samples_per_frame, 100);
1147 if (wp->gen_port == NULL)
1148 return NULL;
1149
1150 status = pjmedia_circ_buf_create(pool, samples_per_frame * CIRC_BUF_FRAME_CNT,
1151 &wp->circbuf);
1152 if (status != PJ_SUCCESS)
1153 return NULL;
1154
1155 /* fill up the circbuf */
1156 for (i=0; i<CIRC_BUF_FRAME_CNT; ++i) {
1157 short pcm[320];
1158 pjmedia_frame frm;
1159
1160 pj_assert(PJ_ARRAY_SIZE(pcm) >= samples_per_frame);
1161 frm.buf = pcm;
1162 frm.size = samples_per_frame * 2;
1163
1164 status = pjmedia_port_get_frame(wp->gen_port, &frm);
1165 pj_assert(status==PJ_SUCCESS);
1166
1167 status = pjmedia_circ_buf_write(wp->circbuf, pcm, samples_per_frame);
1168 pj_assert(status==PJ_SUCCESS);
1169 }
1170
1171 return &wp->base;
1172}
1173
1174
1175/* WSOLA with 2% discard rate */
1176static pjmedia_port* wsola_discard_2( pj_pool_t *pool,
1177 unsigned clock_rate,
1178 unsigned channel_count,
1179 unsigned samples_per_frame,
1180 unsigned flags,
1181 struct test_entry *te)
1182{
1183 return create_wsola_discard(2, pool, clock_rate, channel_count,
1184 samples_per_frame, flags, te);
1185}
1186
1187/* WSOLA with 5% discard rate */
1188static pjmedia_port* wsola_discard_5( pj_pool_t *pool,
1189 unsigned clock_rate,
1190 unsigned channel_count,
1191 unsigned samples_per_frame,
1192 unsigned flags,
1193 struct test_entry *te)
1194{
1195 return create_wsola_discard(5, pool, clock_rate, channel_count,
1196 samples_per_frame, flags, te);
1197}
1198
1199/* WSOLA with 10% discard rate */
1200static pjmedia_port* wsola_discard_10(pj_pool_t *pool,
1201 unsigned clock_rate,
1202 unsigned channel_count,
1203 unsigned samples_per_frame,
1204 unsigned flags,
1205 struct test_entry *te)
1206{
1207 return create_wsola_discard(10, pool, clock_rate, channel_count,
1208 samples_per_frame, flags, te);
1209}
1210
1211/* WSOLA with 20% discard rate */
1212static pjmedia_port* wsola_discard_20(pj_pool_t *pool,
1213 unsigned clock_rate,
1214 unsigned channel_count,
1215 unsigned samples_per_frame,
1216 unsigned flags,
1217 struct test_entry *te)
1218{
1219 return create_wsola_discard(20, pool, clock_rate, channel_count,
1220 samples_per_frame, flags, te);
1221}
1222
1223/* WSOLA with 50% discard rate */
1224static pjmedia_port* wsola_discard_50(pj_pool_t *pool,
1225 unsigned clock_rate,
1226 unsigned channel_count,
1227 unsigned samples_per_frame,
1228 unsigned flags,
1229 struct test_entry *te)
1230{
1231 return create_wsola_discard(50, pool, clock_rate, channel_count,
1232 samples_per_frame, flags, te);
1233}
1234
1235
1236
1237/***************************************************************************/
1238
1239static pjmedia_port* ec_create(unsigned ec_tail_msec,
1240 pj_pool_t *pool,
1241 unsigned clock_rate,
1242 unsigned channel_count,
1243 unsigned samples_per_frame,
1244 unsigned flags,
1245 struct test_entry *te)
1246{
1247 pjmedia_port *gen_port, *ec_port;
1248 pj_status_t status;
1249
1250 gen_port = create_gen_port(pool, clock_rate, channel_count,
1251 samples_per_frame, 100);
1252 if (gen_port == NULL)
1253 return NULL;
1254
1255 status = pjmedia_echo_port_create(pool, gen_port, ec_tail_msec, 0,
1256 0, &ec_port);
1257 if (status != PJ_SUCCESS)
1258 return NULL;
1259
1260 return ec_port;
1261}
1262
1263/* EC with 100ms tail length */
1264static pjmedia_port* ec_create_100(pj_pool_t *pool,
1265 unsigned clock_rate,
1266 unsigned channel_count,
1267 unsigned samples_per_frame,
1268 unsigned flags,
1269 struct test_entry *te)
1270{
1271 return ec_create(100, pool, clock_rate, channel_count, samples_per_frame,
1272 flags, te);
1273}
1274
1275/* EC with 128ms tail length */
1276static pjmedia_port* ec_create_128(pj_pool_t *pool,
1277 unsigned clock_rate,
1278 unsigned channel_count,
1279 unsigned samples_per_frame,
1280 unsigned flags,
1281 struct test_entry *te)
1282{
1283 return ec_create(128, pool, clock_rate, channel_count, samples_per_frame,
1284 flags, te);
1285}
1286
1287/* EC with 200ms tail length */
1288static pjmedia_port* ec_create_200(pj_pool_t *pool,
1289 unsigned clock_rate,
1290 unsigned channel_count,
1291 unsigned samples_per_frame,
1292 unsigned flags,
1293 struct test_entry *te)
1294{
1295 return ec_create(200, pool, clock_rate, channel_count, samples_per_frame,
1296 flags, te);
1297}
1298
1299/* EC with 256ms tail length */
1300static pjmedia_port* ec_create_256(pj_pool_t *pool,
1301 unsigned clock_rate,
1302 unsigned channel_count,
1303 unsigned samples_per_frame,
1304 unsigned flags,
1305 struct test_entry *te)
1306{
1307 return ec_create(256, pool, clock_rate, channel_count, samples_per_frame,
1308 flags, te);
1309}
1310
1311
1312/* EC with 400ms tail length */
1313static pjmedia_port* ec_create_400(pj_pool_t *pool,
1314 unsigned clock_rate,
1315 unsigned channel_count,
1316 unsigned samples_per_frame,
1317 unsigned flags,
1318 struct test_entry *te)
1319{
1320 return ec_create(400, pool, clock_rate, channel_count, samples_per_frame,
1321 flags, te);
1322}
1323
1324/* EC with 500ms tail length */
1325static pjmedia_port* ec_create_500(pj_pool_t *pool,
1326 unsigned clock_rate,
1327 unsigned channel_count,
1328 unsigned samples_per_frame,
1329 unsigned flags,
1330 struct test_entry *te)
1331{
1332 return ec_create(500, pool, clock_rate, channel_count, samples_per_frame,
1333 flags, te);
1334}
1335
1336/* EC with 512ms tail length */
1337static pjmedia_port* ec_create_512(pj_pool_t *pool,
1338 unsigned clock_rate,
1339 unsigned channel_count,
1340 unsigned samples_per_frame,
1341 unsigned flags,
1342 struct test_entry *te)
1343{
1344 return ec_create(512, pool, clock_rate, channel_count, samples_per_frame,
1345 flags, te);
1346}
1347
1348/* EC with 600ms tail length */
1349static pjmedia_port* ec_create_600(pj_pool_t *pool,
1350 unsigned clock_rate,
1351 unsigned channel_count,
1352 unsigned samples_per_frame,
1353 unsigned flags,
1354 struct test_entry *te)
1355{
1356 return ec_create(600, pool, clock_rate, channel_count, samples_per_frame,
1357 flags, te);
1358}
1359
1360/* EC with 800ms tail length */
1361static pjmedia_port* ec_create_800(pj_pool_t *pool,
1362 unsigned clock_rate,
1363 unsigned channel_count,
1364 unsigned samples_per_frame,
1365 unsigned flags,
1366 struct test_entry *te)
1367{
1368 return ec_create(800, pool, clock_rate, channel_count, samples_per_frame,
1369 flags, te);
1370}
1371
1372
1373/***************************************************************************/
1374/* Tone generator, single frequency */
1375static pjmedia_port* create_tonegen(unsigned freq1,
1376 unsigned freq2,
1377 pj_pool_t *pool,
1378 unsigned clock_rate,
1379 unsigned channel_count,
1380 unsigned samples_per_frame,
1381 unsigned flags,
1382 struct test_entry *te)
1383{
1384 pjmedia_port *tonegen;
1385 pjmedia_tone_desc tones[2];
1386 pj_status_t status;
1387
1388 status = pjmedia_tonegen_create(pool, clock_rate, channel_count,
1389 samples_per_frame, 16,
1390 PJMEDIA_TONEGEN_LOOP, &tonegen);
1391 if (status != PJ_SUCCESS)
1392 return NULL;
1393
1394 pj_bzero(tones, sizeof(tones));
1395 tones[0].freq1 = freq1;
1396 tones[0].freq2 = freq2;
1397 tones[0].on_msec = 400;
1398 tones[0].off_msec = 0;
1399 tones[1].freq1 = freq1;
1400 tones[1].freq2 = freq2;
1401 tones[1].on_msec = 400;
1402 tones[1].off_msec = 100;
1403
1404 status = pjmedia_tonegen_play(tonegen, PJ_ARRAY_SIZE(tones), tones,
1405 PJMEDIA_TONEGEN_LOOP);
1406 if (status != PJ_SUCCESS)
1407 return NULL;
1408
1409 return tonegen;
1410}
1411
1412/* Tonegen with single frequency */
1413static pjmedia_port* create_tonegen1(pj_pool_t *pool,
1414 unsigned clock_rate,
1415 unsigned channel_count,
1416 unsigned samples_per_frame,
1417 unsigned flags,
1418 struct test_entry *te)
1419{
1420 return create_tonegen(400, 0, pool, clock_rate, channel_count,
1421 samples_per_frame, flags, te);
1422}
1423
1424/* Tonegen with dual frequency */
1425static pjmedia_port* create_tonegen2(pj_pool_t *pool,
1426 unsigned clock_rate,
1427 unsigned channel_count,
1428 unsigned samples_per_frame,
1429 unsigned flags,
1430 struct test_entry *te)
1431{
1432 return create_tonegen(400, 440, pool, clock_rate, channel_count,
1433 samples_per_frame, flags, te);
1434}
1435
1436
1437
1438/***************************************************************************/
1439/* Stream */
1440
1441struct stream_port
1442{
1443 pjmedia_port base;
1444 pj_status_t (*codec_deinit)();
1445 pjmedia_endpt *endpt;
1446 pjmedia_stream *stream;
1447 pjmedia_transport *transport;
1448};
1449
1450
1451static void stream_port_custom_deinit(struct test_entry *te)
1452{
1453 struct stream_port *sp = (struct stream_port*) te->pdata[0];
1454
1455 pjmedia_stream_destroy(sp->stream);
1456 pjmedia_transport_close(sp->transport);
1457 sp->codec_deinit();
1458 pjmedia_endpt_destroy(sp->endpt);
1459
1460}
1461
1462static pjmedia_port* create_stream( pj_pool_t *pool,
1463 const char *codec,
1464 pj_status_t (*codec_init)(pjmedia_endpt*),
1465 pj_status_t (*codec_deinit)(),
1466 pj_bool_t srtp_enabled,
1467 pj_bool_t srtp_80,
1468 pj_bool_t srtp_auth,
1469 unsigned clock_rate,
1470 unsigned channel_count,
1471 unsigned samples_per_frame,
1472 unsigned flags,
1473 struct test_entry *te)
1474{
1475 struct stream_port *sp;
1476 pj_str_t codec_id;
1477 pjmedia_port *port;
1478 const pjmedia_codec_info *ci[1];
1479 unsigned count;
1480 pjmedia_codec_param codec_param;
1481 pjmedia_stream_info si;
1482 pj_status_t status;
1483
1484 codec_id = pj_str((char*)codec);
1485 sp = PJ_POOL_ZALLOC_T(pool, struct stream_port);
1486 pjmedia_port_info_init(&sp->base.info, &codec_id, 0x123456, clock_rate,
1487 channel_count, 16, samples_per_frame);
1488
1489 te->pdata[0] = sp;
1490 te->custom_deinit = &stream_port_custom_deinit;
1491 sp->codec_deinit = codec_deinit;
1492
1493 status = pjmedia_endpt_create(mem, NULL, 0, &sp->endpt);
1494 if (status != PJ_SUCCESS)
1495 return NULL;
1496
1497 status = codec_init(sp->endpt);
1498 if (status != PJ_SUCCESS)
1499 return NULL;
1500
1501 count = 1;
1502 status = pjmedia_codec_mgr_find_codecs_by_id(pjmedia_endpt_get_codec_mgr(sp->endpt),
1503 &codec_id, &count, ci, NULL);
1504 if (status != PJ_SUCCESS)
1505 return NULL;
1506
1507
1508
1509 status = pjmedia_codec_mgr_get_default_param(pjmedia_endpt_get_codec_mgr(sp->endpt),
1510 ci[0], &codec_param);
1511 if (status != PJ_SUCCESS)
1512 return NULL;
1513
1514 /* Create stream info */
1515 pj_bzero(&si, sizeof(si));
1516 si.type = PJMEDIA_TYPE_AUDIO;
1517 si.proto = PJMEDIA_TP_PROTO_RTP_AVP;
1518 si.dir = PJMEDIA_DIR_ENCODING_DECODING;
1519 pj_sockaddr_in_init(&si.rem_addr.ipv4, NULL, 4000);
1520 pj_sockaddr_in_init(&si.rem_rtcp.ipv4, NULL, 4001);
1521 pj_memcpy(&si.fmt, ci[0], sizeof(pjmedia_codec_info));
1522 si.param = NULL;
1523 si.tx_pt = ci[0]->pt;
1524 si.tx_event_pt = 101;
1525 si.rx_event_pt = 101;
1526 si.ssrc = pj_rand();
1527 si.jb_init = si.jb_min_pre = si.jb_max_pre = si.jb_max = -1;
1528
1529 /* Create loop transport */
1530 status = pjmedia_transport_loop_create(sp->endpt, &sp->transport);
1531 if (status != PJ_SUCCESS)
1532 return NULL;
1533
1534 if (srtp_enabled) {
1535 pjmedia_srtp_setting opt;
1536 pjmedia_srtp_crypto crypto;
1537 pjmedia_transport *srtp;
1538
1539 pjmedia_srtp_setting_default(&opt);
1540 opt.close_member_tp = PJ_TRUE;
1541 opt.use = PJMEDIA_SRTP_MANDATORY;
1542
1543 status = pjmedia_transport_srtp_create(sp->endpt, sp->transport, &opt,
1544 &srtp);
1545 if (status != PJ_SUCCESS)
1546 return NULL;
1547
1548 pj_bzero(&crypto, sizeof(crypto));
1549 if (srtp_80) {
1550 crypto.key = pj_str("123456789012345678901234567890");
1551 crypto.name = pj_str("AES_CM_128_HMAC_SHA1_80");
1552 } else {
1553 crypto.key = pj_str("123456789012345678901234567890");
1554 crypto.name = pj_str("AES_CM_128_HMAC_SHA1_32");
1555 }
1556
1557 if (!srtp_auth)
1558 crypto.flags = PJMEDIA_SRTP_NO_AUTHENTICATION;
1559
1560 status = pjmedia_transport_srtp_start(srtp, &crypto, &crypto);
1561 if (status != PJ_SUCCESS)
1562 return NULL;
1563
1564 sp->transport = srtp;
1565 }
1566
1567 /* Create stream */
1568 status = pjmedia_stream_create(sp->endpt, pool, &si, sp->transport, NULL,
1569 &sp->stream);
1570 if (status != PJ_SUCCESS)
1571 return NULL;
1572
1573 /* Start stream */
1574 status = pjmedia_stream_start(sp->stream);
1575 if (status != PJ_SUCCESS)
1576 return NULL;
1577
1578 status = pjmedia_stream_get_port(sp->stream, &port);
1579 if (status != PJ_SUCCESS)
1580 return NULL;
1581
1582 return port;
1583}
1584
1585/* G.711 stream, no SRTP */
1586static pjmedia_port* create_stream_pcmu( pj_pool_t *pool,
1587 unsigned clock_rate,
1588 unsigned channel_count,
1589 unsigned samples_per_frame,
1590 unsigned flags,
1591 struct test_entry *te)
1592{
1593 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1594 &pjmedia_codec_g711_deinit,
1595 PJ_FALSE, PJ_FALSE, PJ_FALSE,
1596 clock_rate, channel_count,
1597 samples_per_frame, flags, te);
1598}
1599
1600/* G.711 stream, SRTP 32bit key no auth */
1601static pjmedia_port* create_stream_pcmu_srtp32_no_auth( pj_pool_t *pool,
1602 unsigned clock_rate,
1603 unsigned channel_count,
1604 unsigned samples_per_frame,
1605 unsigned flags,
1606 struct test_entry *te)
1607{
1608 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1609 &pjmedia_codec_g711_deinit,
1610 PJ_TRUE, PJ_FALSE, PJ_FALSE,
1611 clock_rate, channel_count,
1612 samples_per_frame, flags, te);
1613}
1614
1615/* G.711 stream, SRTP 32bit key with auth */
1616static pjmedia_port* create_stream_pcmu_srtp32_with_auth(pj_pool_t *pool,
1617 unsigned clock_rate,
1618 unsigned channel_count,
1619 unsigned samples_per_frame,
1620 unsigned flags,
1621 struct test_entry *te)
1622{
1623 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1624 &pjmedia_codec_g711_deinit,
1625 PJ_TRUE, PJ_FALSE, PJ_TRUE,
1626 clock_rate, channel_count,
1627 samples_per_frame, flags, te);
1628}
1629
1630/* G.711 stream, SRTP 80bit key no auth */
1631static pjmedia_port* create_stream_pcmu_srtp80_no_auth( pj_pool_t *pool,
1632 unsigned clock_rate,
1633 unsigned channel_count,
1634 unsigned samples_per_frame,
1635 unsigned flags,
1636 struct test_entry *te)
1637{
1638 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1639 &pjmedia_codec_g711_deinit,
1640 PJ_TRUE, PJ_TRUE, PJ_FALSE,
1641 clock_rate, channel_count,
1642 samples_per_frame, flags, te);
1643}
1644
1645/* G.711 stream, SRTP 80bit key with auth */
1646static pjmedia_port* create_stream_pcmu_srtp80_with_auth(pj_pool_t *pool,
1647 unsigned clock_rate,
1648 unsigned channel_count,
1649 unsigned samples_per_frame,
1650 unsigned flags,
1651 struct test_entry *te)
1652{
1653 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1654 &pjmedia_codec_g711_deinit,
1655 PJ_TRUE, PJ_TRUE, PJ_TRUE,
1656 clock_rate, channel_count,
1657 samples_per_frame, flags, te);
1658}
1659
1660/* GSM stream */
1661static pjmedia_port* create_stream_gsm( pj_pool_t *pool,
1662 unsigned clock_rate,
1663 unsigned channel_count,
1664 unsigned samples_per_frame,
1665 unsigned flags,
1666 struct test_entry *te)
1667{
1668 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1669 &pjmedia_codec_gsm_deinit,
1670 PJ_FALSE, PJ_FALSE, PJ_FALSE,
1671 clock_rate, channel_count,
1672 samples_per_frame, flags, te);
1673}
1674
1675/* GSM stream, SRTP 32bit, no auth */
1676static pjmedia_port* create_stream_gsm_srtp32_no_auth(pj_pool_t *pool,
1677 unsigned clock_rate,
1678 unsigned channel_count,
1679 unsigned samples_per_frame,
1680 unsigned flags,
1681 struct test_entry *te)
1682{
1683 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1684 &pjmedia_codec_gsm_deinit,
1685 PJ_TRUE, PJ_FALSE, PJ_FALSE,
1686 clock_rate, channel_count,
1687 samples_per_frame, flags, te);
1688}
1689
1690/* GSM stream, SRTP 32bit, with auth */
1691static pjmedia_port* create_stream_gsm_srtp32_with_auth(pj_pool_t *pool,
1692 unsigned clock_rate,
1693 unsigned channel_count,
1694 unsigned samples_per_frame,
1695 unsigned flags,
1696 struct test_entry *te)
1697{
1698 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1699 &pjmedia_codec_gsm_deinit,
1700 PJ_TRUE, PJ_FALSE, PJ_TRUE,
1701 clock_rate, channel_count,
1702 samples_per_frame, flags, te);
1703}
1704
1705/* GSM stream, SRTP 80bit, no auth */
1706static pjmedia_port* create_stream_gsm_srtp80_no_auth(pj_pool_t *pool,
1707 unsigned clock_rate,
1708 unsigned channel_count,
1709 unsigned samples_per_frame,
1710 unsigned flags,
1711 struct test_entry *te)
1712{
1713 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1714 &pjmedia_codec_gsm_deinit,
1715 PJ_TRUE, PJ_TRUE, PJ_FALSE,
1716 clock_rate, channel_count,
1717 samples_per_frame, flags, te);
1718}
1719
1720/* GSM stream, SRTP 80bit, with auth */
1721static pjmedia_port* create_stream_gsm_srtp80_with_auth(pj_pool_t *pool,
1722 unsigned clock_rate,
1723 unsigned channel_count,
1724 unsigned samples_per_frame,
1725 unsigned flags,
1726 struct test_entry *te)
1727{
1728 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1729 &pjmedia_codec_gsm_deinit,
1730 PJ_TRUE, PJ_TRUE, PJ_TRUE,
1731 clock_rate, channel_count,
1732 samples_per_frame, flags, te);
1733}
1734
1735/* G722 stream */
1736static pjmedia_port* create_stream_g722( pj_pool_t *pool,
1737 unsigned clock_rate,
1738 unsigned channel_count,
1739 unsigned samples_per_frame,
1740 unsigned flags,
1741 struct test_entry *te)
1742{
1743 return create_stream(pool, "g722", &pjmedia_codec_g722_init,
1744 &pjmedia_codec_g722_deinit,
1745 PJ_FALSE, PJ_FALSE, PJ_FALSE,
1746 clock_rate, channel_count,
1747 samples_per_frame, flags, te);
1748}
1749
1750
1751/***************************************************************************/
1752/* Run test entry, return elapsed time */
1753static pj_timestamp run_entry(unsigned clock_rate, struct test_entry *e)
1754{
1755 pj_pool_t *pool;
1756 pjmedia_port *port;
1757 pj_timestamp t0, t1;
1758 unsigned j, samples_per_frame;
1759 pj_int16_t pcm[16000 * PTIME / 1000];
1760 pjmedia_port *gen_port;
1761 pj_status_t status;
1762
1763 samples_per_frame = clock_rate * PTIME / 1000;
1764
1765 pool = pj_pool_create(mem, "pool", 1024, 1024, NULL);
1766 port = e->init(pool, clock_rate, 1, samples_per_frame, 0, e);
1767 pj_assert(port != NULL);
1768 gen_port = create_gen_port(pool, clock_rate, 1,
1769 samples_per_frame, 100);
1770 pj_assert(gen_port != NULL);
1771
1772 pj_get_timestamp(&t0);
1773 for (j=0; j<DURATION*clock_rate/samples_per_frame/1000; ++j) {
1774 pjmedia_frame frm;
1775
1776 if (e->valid_op==OP_GET_PUT) {
1777 frm.buf = (void*)pcm;
1778 frm.size = samples_per_frame * 2;
1779 frm.type = PJMEDIA_FRAME_TYPE_NONE;
1780
1781 status = pjmedia_port_get_frame(port, &frm);
1782 pj_assert(status == PJ_SUCCESS);
1783
1784 status = pjmedia_port_put_frame(port, &frm);
1785 pj_assert(status == PJ_SUCCESS);
1786
1787 } else if (e->valid_op == OP_GET) {
1788 frm.buf = (void*)pcm;
1789 frm.size = samples_per_frame * 2;
1790 frm.type = PJMEDIA_FRAME_TYPE_NONE;
1791
1792 status = pjmedia_port_get_frame(port, &frm);
1793 pj_assert(status == PJ_SUCCESS);
1794
1795 } else if (e->valid_op == OP_PUT) {
1796 frm.buf = (void*)pcm;
1797 frm.size = samples_per_frame * 2;
1798 frm.type = PJMEDIA_FRAME_TYPE_NONE;
1799
1800 status = pjmedia_port_get_frame(gen_port, &frm);
1801 pj_assert(status == PJ_SUCCESS);
1802
1803 status = pjmedia_port_put_frame(port, &frm);
1804 pj_assert(status == PJ_SUCCESS);
1805
1806 } else if (e->valid_op == OP_PUT_GET) {
1807 frm.buf = (void*)pcm;
1808 frm.size = samples_per_frame * 2;
1809 frm.type = PJMEDIA_FRAME_TYPE_NONE;
1810
1811 status = pjmedia_port_get_frame(gen_port, &frm);
1812 pj_assert(status == PJ_SUCCESS);
1813
1814 status = pjmedia_port_put_frame(port, &frm);
1815 pj_assert(status == PJ_SUCCESS);
1816
1817 status = pjmedia_port_get_frame(port, &frm);
1818 pj_assert(status == PJ_SUCCESS);
1819 }
1820 }
1821 pj_get_timestamp(&t1);
1822
1823 pj_sub_timestamp(&t1, &t0);
1824
1825 if (e->custom_deinit)
1826 e->custom_deinit(e);
1827
1828 pjmedia_port_destroy(port);
1829 pj_pool_release(pool);
1830
1831 return t1;
1832}
1833
1834/***************************************************************************/
1835int mips_test(void)
1836{
1837 struct test_entry entries[] = {
1838 { "get from memplayer", OP_GET, K8|K16, &gen_port_test_init},
1839 { "conference bridge with 1 call", OP_GET_PUT, K8|K16, &conf1_test_init},
1840 { "conference bridge with 2 calls", OP_GET_PUT, K8|K16, &conf2_test_init},
1841 { "conference bridge with 4 calls", OP_GET_PUT, K8|K16, &conf4_test_init},
1842 { "conference bridge with 8 calls", OP_GET_PUT, K8|K16, &conf8_test_init},
1843 { "conference bridge with 16 calls", OP_GET_PUT, K8|K16, &conf16_test_init},
1844 { "upsample+downsample - linear", OP_GET, K8|K16, &linear_resample},
1845 { "upsample+downsample - small filter", OP_GET, K8|K16, &small_filt_resample},
1846 { "upsample+downsample - large filter", OP_GET, K8|K16, &large_filt_resample},
1847 { "WSOLA PLC - 0% loss", OP_GET, K8|K16, &wsola_plc_0},
1848 { "WSOLA PLC - 2% loss", OP_GET, K8|K16, &wsola_plc_2},
1849 { "WSOLA PLC - 5% loss", OP_GET, K8|K16, &wsola_plc_5},
1850 { "WSOLA PLC - 10% loss", OP_GET, K8|K16, &wsola_plc_10},
1851 { "WSOLA PLC - 20% loss", OP_GET, K8|K16, &wsola_plc_20},
1852 { "WSOLA PLC - 50% loss", OP_GET, K8|K16, &wsola_plc_50},
1853 { "WSOLA discard 2% excess", OP_GET, K8|K16, &wsola_discard_2},
1854 { "WSOLA discard 5% excess", OP_GET, K8|K16, &wsola_discard_5},
1855 { "WSOLA discard 10% excess", OP_GET, K8|K16, &wsola_discard_10},
1856 { "WSOLA discard 20% excess", OP_GET, K8|K16, &wsola_discard_20},
1857 { "WSOLA discard 50% excess", OP_GET, K8|K16, &wsola_discard_50},
1858 { "echo canceller 100ms tail len", OP_GET_PUT, K8|K16, &ec_create_100},
1859 { "echo canceller 128ms tail len", OP_GET_PUT, K8|K16, &ec_create_128},
1860 { "echo canceller 200ms tail len", OP_GET_PUT, K8|K16, &ec_create_200},
1861 { "echo canceller 256ms tail len", OP_GET_PUT, K8|K16, &ec_create_256},
1862 { "echo canceller 400ms tail len", OP_GET_PUT, K8|K16, &ec_create_400},
1863 { "echo canceller 500ms tail len", OP_GET_PUT, K8|K16, &ec_create_500},
1864 { "echo canceller 512ms tail len", OP_GET_PUT, K8|K16, &ec_create_512},
1865 { "echo canceller 600ms tail len", OP_GET_PUT, K8|K16, &ec_create_600},
1866 { "echo canceller 800ms tail len", OP_GET_PUT, K8|K16, &ec_create_800},
1867 { "tone generator with single freq", OP_GET, K8|K16, &create_tonegen1},
1868 { "tone generator with dual freq", OP_GET, K8|K16, &create_tonegen2},
1869 { "codec encode/decode - G.711", OP_PUT, K8, &g711_encode_decode},
1870 { "codec encode/decode - G.722", OP_PUT, K16, &g722_encode_decode},
1871 { "codec encode/decode - GSM", OP_PUT, K8, &gsm_encode_decode},
1872 { "codec encode/decode - iLBC", OP_PUT, K8, &ilbc_encode_decode},
1873 { "codec encode/decode - Speex 8Khz", OP_PUT, K8, &speex8_encode_decode},
1874 { "codec encode/decode - Speex 16Khz", OP_PUT, K16, &speex16_encode_decode},
1875 { "codec encode/decode - L16/8000/1", OP_PUT, K8, &l16_8_encode_decode},
1876 { "codec encode/decode - L16/16000/1", OP_PUT, K16, &l16_16_encode_decode},
1877 { "stream TX/RX - G.711", OP_PUT_GET, K8, &create_stream_pcmu},
1878 { "stream TX/RX - G.711 SRTP 32bit", OP_PUT_GET, K8, &create_stream_pcmu_srtp32_no_auth},
1879 { "stream TX/RX - G.711 SRTP 32bit +auth", OP_PUT_GET, K8, &create_stream_pcmu_srtp32_with_auth},
1880 { "stream TX/RX - G.711 SRTP 80bit", OP_PUT_GET, K8, &create_stream_pcmu_srtp80_no_auth},
1881 { "stream TX/RX - G.711 SRTP 80bit +auth", OP_PUT_GET, K8, &create_stream_pcmu_srtp80_with_auth},
1882 { "stream TX/RX - G.722", OP_PUT_GET, K16, &create_stream_g722},
1883 { "stream TX/RX - GSM", OP_PUT_GET, K8, &create_stream_gsm},
1884 { "stream TX/RX - GSM SRTP 32bit", OP_PUT_GET, K8, &create_stream_gsm_srtp32_no_auth},
1885 { "stream TX/RX - GSM SRTP 32bit + auth", OP_PUT_GET, K8, &create_stream_gsm_srtp32_with_auth},
1886 { "stream TX/RX - GSM SRTP 80bit", OP_PUT_GET, K8, &create_stream_gsm_srtp80_no_auth},
1887 { "stream TX/RX - GSM SRTP 80bit + auth", OP_PUT_GET, K8, &create_stream_gsm_srtp80_with_auth},
1888 };
1889 unsigned i, c, k[2] = {K8, K16}, clock_rates[2] = {8000, 16000};
1890
1891 PJ_LOG(3,(THIS_FILE, "MIPS test, with CPU=%7.2fMhz, %f MIPS", CPU_MHZ, CPU_MIPS / 1000000));
1892 PJ_LOG(3,(THIS_FILE, "Clock Item Time CPU MIPS"));
1893 PJ_LOG(3,(THIS_FILE, " Rate (usec) (%%) "));
1894 PJ_LOG(3,(THIS_FILE, "----------------------------------------------------------------------"));
1895
1896 for (c=0; c<PJ_ARRAY_SIZE(clock_rates); ++c) {
1897 for (i=0; i<PJ_ARRAY_SIZE(entries); ++i) {
1898 enum
1899 {
1900 RETRY = 5, /* number of test retries */
1901 };
1902 struct test_entry *e = &entries[i];
1903 pj_timestamp times[RETRY], tzero;
1904 int usec;
1905 float cpu_pct, mips;
1906 unsigned j, clock_rate = clock_rates[c];
1907
1908 if ((e->valid_clock_rate & k[c]) == 0)
1909 continue;
1910
1911 /* Run test */
1912 for (j=0; j<RETRY; ++j) {
1913 pj_thread_sleep(1);
1914 times[j] = run_entry(clock_rate, e);
1915 }
1916
1917 /* Sort ascending */
1918 for (j=0; j<RETRY; ++j) {
1919 unsigned k;
1920 for (k=j+1; k<RETRY; ++k) {
1921 if (times[k].u64 < times[j].u64) {
1922 pj_timestamp tmp = times[j];
1923 times[j] = times[k];
1924 times[k] = tmp;
1925 }
1926 }
1927 }
1928
1929 /* Calculate usec elapsed as average of two best times */
1930 tzero.u32.hi = tzero.u32.lo = 0;
1931 usec = (pj_elapsed_usec(&tzero, &times[0]) +
1932 pj_elapsed_usec(&tzero, &times[1])) / 2;
1933
1934 mips = (float)(CPU_MIPS * usec / 1000000.0 / 1000000);
1935 cpu_pct = (float)(100.0 * usec / 1000000);
1936 PJ_LOG(3,(THIS_FILE, "%2dKHz %-38s % 8d %6.3f %7.2f",
1937 clock_rate/1000, e->title, usec, cpu_pct, mips));
1938
1939 }
1940 }
1941
1942 return 0;
1943}
1944
1945
1946