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