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