blob: dfde5fb4f4315d80c2cac9eb1cca84855cb64eb7 [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,
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +0000381 K32 = 4,
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000382};
383
384
385struct test_entry
386{
387 const char *title;
388 unsigned valid_op;
389 unsigned valid_clock_rate;
390 pjmedia_port* (*init)(pj_pool_t *pool,
391 unsigned clock_rate,
392 unsigned channel_count,
393 unsigned samples_per_frame,
394 unsigned flags,
395 struct test_entry *);
396 void (*custom_run)(struct test_entry*);
397 void (*custom_deinit)(struct test_entry*);
398
399 void *pdata[4];
400 unsigned idata[4];
401};
402
403
404/***************************************************************************/
405/* pjmedia_port to supply with continuous frames */
406static pjmedia_port* create_gen_port(pj_pool_t *pool,
407 unsigned clock_rate,
408 unsigned channel_count,
409 unsigned samples_per_frame,
410 unsigned pct_level)
411{
412 pjmedia_port *port;
413 pj_status_t status;
414
415 if (pct_level == 100 && channel_count==1) {
416 status = pjmedia_mem_player_create(pool, ref_signal,
417 sizeof(ref_signal), clock_rate,
418 channel_count, samples_per_frame,
419 16, 0, &port);
420 } else {
421 pj_int16_t *buf;
422 unsigned c;
423
Benny Prijono20da7992008-12-18 16:48:43 +0000424 buf = (pj_int16_t*)
425 pj_pool_alloc(pool, sizeof(ref_signal)*channel_count);
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000426 for (c=0; c<channel_count; ++c) {
427 unsigned i;
428 pj_int16_t *p;
429
430 p = buf+c;
431 for (i=0; i<PJ_ARRAY_SIZE(ref_signal); ++i) {
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000432 *p = (pj_int16_t)(ref_signal[i] * pct_level / 100);
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000433 p += channel_count;
434 }
435 }
436 status = pjmedia_mem_player_create(pool, buf,
437 sizeof(ref_signal)*channel_count,
438 clock_rate, channel_count,
439 samples_per_frame,
440 16, 0, &port);
441 }
442
443 return status==PJ_SUCCESS? port : NULL;
444}
445
446/***************************************************************************/
447static pjmedia_port* gen_port_test_init(pj_pool_t *pool,
448 unsigned clock_rate,
449 unsigned channel_count,
450 unsigned samples_per_frame,
451 unsigned flags,
452 struct test_entry *te)
453{
454 PJ_UNUSED_ARG(flags);
455 PJ_UNUSED_ARG(te);
456 return create_gen_port(pool, clock_rate, channel_count, samples_per_frame,
457 100);
458}
459
460
461/***************************************************************************/
462static pjmedia_port* init_conf_port(unsigned nb_participant,
463 pj_pool_t *pool,
464 unsigned clock_rate,
465 unsigned channel_count,
466 unsigned samples_per_frame,
467 unsigned flags,
468 struct test_entry *te)
469{
470 pjmedia_conf *conf;
471 unsigned i;
472 pj_status_t status;
473
474 PJ_UNUSED_ARG(flags);
475 PJ_UNUSED_ARG(te);
476
477 /* Create conf */
478 status = pjmedia_conf_create(pool, 2+nb_participant*2, clock_rate,
479 channel_count, samples_per_frame, 16,
480 PJMEDIA_CONF_NO_DEVICE, &conf);
481 if (status != PJ_SUCCESS)
482 return NULL;
483
484 for (i=0; i<nb_participant; ++i) {
485 pjmedia_port *gen_port, *null_port;
486 unsigned slot1, slot2;
487
488 /* Create gen_port for source audio */
489 gen_port = create_gen_port(pool, clock_rate, channel_count,
490 samples_per_frame, 100 / nb_participant);
491 if (!gen_port)
492 return NULL;
493
494 /* Add port */
495 status = pjmedia_conf_add_port(conf, pool, gen_port, NULL, &slot1);
496 if (status != PJ_SUCCESS)
497 return NULL;
498
499 /* Connect gen_port to sound dev */
500 status = pjmedia_conf_connect_port(conf, slot1, 0, 0);
501 if (status != PJ_SUCCESS)
502 return NULL;
503
504 /* Create null sink frame */
505 status = pjmedia_null_port_create(pool, clock_rate, channel_count,
506 samples_per_frame, 16, &null_port);
507 if (status != PJ_SUCCESS)
508 return NULL;
509
510 /* add null port */
511 status = pjmedia_conf_add_port(conf, pool, null_port, NULL, &slot2);
512 if (status != PJ_SUCCESS)
513 return NULL;
514
515 /* connect sound to null sink port */
516 status = pjmedia_conf_connect_port(conf, 0, slot2, 0);
517 if (status != PJ_SUCCESS)
518 return NULL;
519
520 /* connect gen_port to null sink port */
521#if 0
522 status = pjmedia_conf_connect_port(conf, slot1, slot2, 0);
523 if (status != PJ_SUCCESS)
524 return NULL;
525#endif
526 }
527
528 return pjmedia_conf_get_master_port(conf);
529}
530
531
532/***************************************************************************/
533/* Benchmark conf with 1 participant, no mixing */
534static pjmedia_port* conf1_test_init(pj_pool_t *pool,
535 unsigned clock_rate,
536 unsigned channel_count,
537 unsigned samples_per_frame,
538 unsigned flags,
539 struct test_entry *te)
540{
541 return init_conf_port(1, pool, clock_rate, channel_count,
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000542 samples_per_frame, flags, te);
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000543}
544
545
546/***************************************************************************/
547/* Benchmark conf with 2 participants, mixing to/from snd dev */
548static pjmedia_port* conf2_test_init(pj_pool_t *pool,
549 unsigned clock_rate,
550 unsigned channel_count,
551 unsigned samples_per_frame,
552 unsigned flags,
553 struct test_entry *te)
554{
555 return init_conf_port(2, pool, clock_rate, channel_count,
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000556 samples_per_frame, flags, te);
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000557}
558
559/***************************************************************************/
560/* Benchmark conf with 4 participants, mixing to/from snd dev */
561static pjmedia_port* conf4_test_init(pj_pool_t *pool,
562 unsigned clock_rate,
563 unsigned channel_count,
564 unsigned samples_per_frame,
565 unsigned flags,
566 struct test_entry *te)
567{
568 return init_conf_port(4, pool, clock_rate, channel_count,
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000569 samples_per_frame, flags, te);
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000570}
571
572/***************************************************************************/
573/* Benchmark conf with 8 participants, mixing to/from snd dev */
574static pjmedia_port* conf8_test_init(pj_pool_t *pool,
575 unsigned clock_rate,
576 unsigned channel_count,
577 unsigned samples_per_frame,
578 unsigned flags,
579 struct test_entry *te)
580{
581 return init_conf_port(8, pool, clock_rate, channel_count,
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000582 samples_per_frame, flags, te);
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000583}
584
585/***************************************************************************/
586/* Benchmark conf with 16 participants, mixing to/from snd dev */
587static pjmedia_port* conf16_test_init(pj_pool_t *pool,
588 unsigned clock_rate,
589 unsigned channel_count,
590 unsigned samples_per_frame,
591 unsigned flags,
592 struct test_entry *te)
593{
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000594 PJ_UNUSED_ARG(flags);
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000595 return init_conf_port(16, pool, clock_rate, channel_count,
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000596 samples_per_frame, flags, te);
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000597}
598
599/***************************************************************************/
600/* Up and downsample */
601static pjmedia_port* updown_resample_get(pj_pool_t *pool,
602 pj_bool_t high_quality,
603 pj_bool_t large_filter,
604 unsigned clock_rate,
605 unsigned channel_count,
606 unsigned samples_per_frame,
607 unsigned flags,
608 struct test_entry *te)
609{
610 pjmedia_port *gen_port, *up, *down;
611 unsigned opt = 0;
612 pj_status_t status;
613
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000614 PJ_UNUSED_ARG(flags);
615 PJ_UNUSED_ARG(te);
616
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000617 if (!high_quality)
618 opt |= PJMEDIA_RESAMPLE_USE_LINEAR;
619 if (!large_filter)
620 opt |= PJMEDIA_RESAMPLE_USE_SMALL_FILTER;
621
622 gen_port = create_gen_port(pool, clock_rate, channel_count,
623 samples_per_frame, 100);
624 status = pjmedia_resample_port_create(pool, gen_port, clock_rate*2, opt, &up);
625 if (status != PJ_SUCCESS)
626 return NULL;
627 status = pjmedia_resample_port_create(pool, up, clock_rate, opt, &down);
628 if (status != PJ_SUCCESS)
629 return NULL;
630
631 return down;
632}
633
634/* Linear resampling */
635static pjmedia_port* linear_resample( pj_pool_t *pool,
636 unsigned clock_rate,
637 unsigned channel_count,
638 unsigned samples_per_frame,
639 unsigned flags,
640 struct test_entry *te)
641{
642 return updown_resample_get(pool, PJ_FALSE, PJ_FALSE, clock_rate,
643 channel_count, samples_per_frame, flags, te);
644}
645
646/* Small filter resampling */
647static pjmedia_port* small_filt_resample( pj_pool_t *pool,
648 unsigned clock_rate,
649 unsigned channel_count,
650 unsigned samples_per_frame,
651 unsigned flags,
652 struct test_entry *te)
653{
654 return updown_resample_get(pool, PJ_TRUE, PJ_FALSE, clock_rate,
655 channel_count, samples_per_frame, flags, te);
656}
657
658/* Larger filter resampling */
659static pjmedia_port* large_filt_resample( pj_pool_t *pool,
660 unsigned clock_rate,
661 unsigned channel_count,
662 unsigned samples_per_frame,
663 unsigned flags,
664 struct test_entry *te)
665{
666 return updown_resample_get(pool, PJ_TRUE, PJ_TRUE, clock_rate,
667 channel_count, samples_per_frame, flags, te);
668}
669
670
671/***************************************************************************/
672/* Codec encode/decode */
673
674struct codec_port
675{
676 pjmedia_port base;
677 pjmedia_endpt *endpt;
678 pjmedia_codec *codec;
679 pj_status_t (*codec_deinit)();
680 pj_uint8_t pkt[640];
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +0000681 pj_uint16_t pcm[32000 * PTIME / 1000];
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000682};
683
684
685static pj_status_t codec_put_frame(struct pjmedia_port *this_port,
686 const pjmedia_frame *frame)
687{
688 struct codec_port *cp = (struct codec_port*)this_port;
689 pjmedia_frame out_frame;
690 pj_status_t status;
691
692 out_frame.buf = cp->pkt;
693 out_frame.size = sizeof(cp->pkt);
694 status = cp->codec->op->encode(cp->codec, frame, sizeof(cp->pkt),
695 &out_frame);
696 pj_assert(status == PJ_SUCCESS);
697
698 if (out_frame.size != 0) {
699 pjmedia_frame parsed_frm[2], pcm_frm;
700 unsigned frame_cnt = PJ_ARRAY_SIZE(parsed_frm);
701 unsigned i;
702
703 status = cp->codec->op->parse(cp->codec, out_frame.buf,
704 out_frame.size, &out_frame.timestamp,
705 &frame_cnt, parsed_frm);
706 pj_assert(status == PJ_SUCCESS);
707
708 for (i=0; i<frame_cnt; ++i) {
709 pcm_frm.buf = cp->pcm;
710 pcm_frm.size = sizeof(cp->pkt);
711 status = cp->codec->op->decode(cp->codec, &parsed_frm[i],
712 sizeof(cp->pcm), &pcm_frm);
713 pj_assert(status == PJ_SUCCESS);
714 }
715 }
716
717 return PJ_SUCCESS;
718}
719
720static pj_status_t codec_on_destroy(struct pjmedia_port *this_port)
721{
722 struct codec_port *cp = (struct codec_port*)this_port;
723
724 cp->codec->op->close(cp->codec);
725 pjmedia_codec_mgr_dealloc_codec(pjmedia_endpt_get_codec_mgr(cp->endpt),
726 cp->codec);
727 cp->codec_deinit();
728 pjmedia_endpt_destroy(cp->endpt);
729 return PJ_SUCCESS;
730}
731
732static pjmedia_port* codec_encode_decode( pj_pool_t *pool,
733 const char *codec,
734 pj_status_t (*codec_init)(pjmedia_endpt*),
735 pj_status_t (*codec_deinit)(),
736 unsigned clock_rate,
737 unsigned channel_count,
738 unsigned samples_per_frame,
739 unsigned flags,
740 struct test_entry *te)
741{
742 struct codec_port *cp;
743 pj_str_t codec_id;
744 const pjmedia_codec_info *ci[1];
745 unsigned count;
746 pjmedia_codec_param codec_param;
747 pj_status_t status;
748
Nanang Izzuddin2c953d42008-08-04 16:03:28 +0000749 PJ_UNUSED_ARG(flags);
750 PJ_UNUSED_ARG(te);
751
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000752 codec_id = pj_str((char*)codec);
753 cp = PJ_POOL_ZALLOC_T(pool, struct codec_port);
754 pjmedia_port_info_init(&cp->base.info, &codec_id, 0x123456, clock_rate,
755 channel_count, 16, samples_per_frame);
756 cp->base.put_frame = &codec_put_frame;
757 cp->base.on_destroy = &codec_on_destroy;
758 cp->codec_deinit = codec_deinit;
759
760 status = pjmedia_endpt_create(mem, NULL, 0, &cp->endpt);
761 if (status != PJ_SUCCESS)
762 return NULL;
763
764 status = codec_init(cp->endpt);
765 if (status != PJ_SUCCESS)
766 return NULL;
767
768 count = 1;
769 status = pjmedia_codec_mgr_find_codecs_by_id(pjmedia_endpt_get_codec_mgr(cp->endpt),
770 &codec_id, &count, ci, NULL);
771 if (status != PJ_SUCCESS)
772 return NULL;
773
774 status = pjmedia_codec_mgr_alloc_codec(pjmedia_endpt_get_codec_mgr(cp->endpt),
775 ci[0], &cp->codec);
776 if (status != PJ_SUCCESS)
777 return NULL;
778
779 status = pjmedia_codec_mgr_get_default_param(pjmedia_endpt_get_codec_mgr(cp->endpt),
780 ci[0], &codec_param);
781 if (status != PJ_SUCCESS)
782 return NULL;
783
784 status = (*cp->codec->op->init)(cp->codec, pool);
785 if (status != PJ_SUCCESS)
786 return NULL;
787
788 status = cp->codec->op->open(cp->codec, &codec_param);
789 if (status != PJ_SUCCESS)
790 return NULL;
791
792 return &cp->base;
793}
794
795/* G.711 benchmark */
796static pjmedia_port* g711_encode_decode( pj_pool_t *pool,
797 unsigned clock_rate,
798 unsigned channel_count,
799 unsigned samples_per_frame,
800 unsigned flags,
801 struct test_entry *te)
802{
803 return codec_encode_decode(pool, "pcmu", &pjmedia_codec_g711_init,
804 &pjmedia_codec_g711_deinit,
805 clock_rate, channel_count,
806 samples_per_frame, flags, te);
807}
808
809/* GSM benchmark */
810static pjmedia_port* gsm_encode_decode( pj_pool_t *pool,
811 unsigned clock_rate,
812 unsigned channel_count,
813 unsigned samples_per_frame,
814 unsigned flags,
815 struct test_entry *te)
816{
817 return codec_encode_decode(pool, "gsm", &pjmedia_codec_gsm_init,
818 &pjmedia_codec_gsm_deinit,
819 clock_rate, channel_count,
820 samples_per_frame, flags, te);
821}
822
823static pj_status_t ilbc_init(pjmedia_endpt *endpt)
824{
825 return pjmedia_codec_ilbc_init(endpt, 20);
826}
827
828/* iLBC benchmark */
829static pjmedia_port* ilbc_encode_decode( pj_pool_t *pool,
830 unsigned clock_rate,
831 unsigned channel_count,
832 unsigned samples_per_frame,
833 unsigned flags,
834 struct test_entry *te)
835{
836 return codec_encode_decode(pool, "ilbc", &ilbc_init,
837 &pjmedia_codec_ilbc_deinit, clock_rate,
838 channel_count, samples_per_frame, flags, te);
839}
840
841/* Speex narrowband benchmark */
842static pjmedia_port* speex8_encode_decode(pj_pool_t *pool,
843 unsigned clock_rate,
844 unsigned channel_count,
845 unsigned samples_per_frame,
846 unsigned flags,
847 struct test_entry *te)
848{
849 return codec_encode_decode(pool, "speex/8000",
850 &pjmedia_codec_speex_init_default,
851 &pjmedia_codec_speex_deinit,
852 clock_rate, channel_count,
853 samples_per_frame, flags, te);
854}
855
856/* Speex wideband benchmark */
857static pjmedia_port* speex16_encode_decode(pj_pool_t *pool,
858 unsigned clock_rate,
859 unsigned channel_count,
860 unsigned samples_per_frame,
861 unsigned flags,
862 struct test_entry *te)
863{
864 return codec_encode_decode(pool, "speex/16000",
865 &pjmedia_codec_speex_init_default,
866 &pjmedia_codec_speex_deinit,
867 clock_rate, channel_count,
868 samples_per_frame, flags, te);
869}
870
871/* G.722 benchmark benchmark */
872static pjmedia_port* g722_encode_decode(pj_pool_t *pool,
873 unsigned clock_rate,
874 unsigned channel_count,
875 unsigned samples_per_frame,
876 unsigned flags,
877 struct test_entry *te)
878{
879 return codec_encode_decode(pool, "g722", &pjmedia_codec_g722_init,
880 &pjmedia_codec_g722_deinit,
881 clock_rate, channel_count,
882 samples_per_frame, flags, te);
883}
884
Benny Prijono2eabad92009-05-06 14:34:13 +0000885#if PJMEDIA_HAS_G7221_CODEC
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +0000886/* G.722.1 benchmark benchmark */
887static pjmedia_port* g7221_encode_decode(pj_pool_t *pool,
888 unsigned clock_rate,
889 unsigned channel_count,
890 unsigned samples_per_frame,
891 unsigned flags,
892 struct test_entry *te)
893{
894 return codec_encode_decode(pool, "g7221/16000",
895 &pjmedia_codec_g7221_init,
896 &pjmedia_codec_g7221_deinit,
897 clock_rate, channel_count,
898 samples_per_frame, flags, te);
899}
900
901/* G.722.1 Annex C benchmark benchmark */
902static pjmedia_port* g7221c_encode_decode(pj_pool_t *pool,
903 unsigned clock_rate,
904 unsigned channel_count,
905 unsigned samples_per_frame,
906 unsigned flags,
907 struct test_entry *te)
908{
909 return codec_encode_decode(pool, "g7221/32000",
910 &pjmedia_codec_g7221_init,
911 &pjmedia_codec_g7221_deinit,
912 clock_rate, channel_count,
913 samples_per_frame, flags, te);
914}
Benny Prijono2eabad92009-05-06 14:34:13 +0000915#endif /* PJMEDIA_HAS_G7221_CODEC */
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +0000916
Benny Prijono06973132009-01-27 10:05:48 +0000917#if defined(PJMEDIA_HAS_L16_CODEC) && PJMEDIA_HAS_L16_CODEC!=0
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000918static pj_status_t init_l16_default(pjmedia_endpt *endpt)
919{
920 return pjmedia_codec_l16_init(endpt, 0);
921}
922
923/* L16/8000/1 benchmark */
924static pjmedia_port* l16_8_encode_decode(pj_pool_t *pool,
925 unsigned clock_rate,
926 unsigned channel_count,
927 unsigned samples_per_frame,
928 unsigned flags,
929 struct test_entry *te)
930{
931 return codec_encode_decode(pool, "L16/8000/1", &init_l16_default,
932 &pjmedia_codec_l16_deinit,
933 clock_rate, channel_count,
934 samples_per_frame, flags, te);
935}
936
937/* L16/16000/1 benchmark */
938static pjmedia_port* l16_16_encode_decode(pj_pool_t *pool,
939 unsigned clock_rate,
940 unsigned channel_count,
941 unsigned samples_per_frame,
942 unsigned flags,
943 struct test_entry *te)
944{
945 return codec_encode_decode(pool, "L16/16000/1", &init_l16_default,
946 &pjmedia_codec_l16_deinit,
947 clock_rate, channel_count,
948 samples_per_frame, flags, te);
949}
Benny Prijono06973132009-01-27 10:05:48 +0000950#endif
Benny Prijono0ff56dc2008-07-04 16:45:17 +0000951
952/***************************************************************************/
953/* WSOLA PLC mode */
954
955struct wsola_plc_port
956{
957 pjmedia_port base;
958 pjmedia_wsola *wsola;
959 pjmedia_port *gen_port;
960 int loss_pct;
961 pj_bool_t prev_lost;
962};
963
964
965static pj_status_t wsola_plc_get_frame(struct pjmedia_port *this_port,
966 pjmedia_frame *frame)
967{
968 struct wsola_plc_port *wp = (struct wsola_plc_port*)this_port;
969 pj_status_t status;
970
971
972 if ((pj_rand() % 100) > wp->loss_pct) {
973 status = pjmedia_port_get_frame(wp->gen_port, frame);
974 pj_assert(status == PJ_SUCCESS);
975
976 status = pjmedia_wsola_save(wp->wsola, (short*)frame->buf,
977 wp->prev_lost);
978 pj_assert(status == PJ_SUCCESS);
979
980 wp->prev_lost = PJ_FALSE;
981 } else {
982 status = pjmedia_wsola_generate(wp->wsola, (short*)frame->buf);
983 wp->prev_lost = PJ_TRUE;
984 }
985
986 return PJ_SUCCESS;
987}
988
989static pj_status_t wsola_plc_on_destroy(struct pjmedia_port *this_port)
990{
991 struct wsola_plc_port *wp = (struct wsola_plc_port*)this_port;
992 pjmedia_port_destroy(wp->gen_port);
993 pjmedia_wsola_destroy(wp->wsola);
994 return PJ_SUCCESS;
995}
996
997static pjmedia_port* create_wsola_plc(unsigned loss_pct,
998 pj_pool_t *pool,
999 unsigned clock_rate,
1000 unsigned channel_count,
1001 unsigned samples_per_frame,
1002 unsigned flags,
1003 struct test_entry *te)
1004{
1005 struct wsola_plc_port *wp;
1006 pj_str_t name = pj_str("wsola");
1007 unsigned opt = 0;
1008 pj_status_t status;
1009
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00001010 PJ_UNUSED_ARG(flags);
1011 PJ_UNUSED_ARG(te);
1012
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001013 wp = PJ_POOL_ZALLOC_T(pool, struct wsola_plc_port);
1014 wp->loss_pct = loss_pct;
1015 wp->base.get_frame = &wsola_plc_get_frame;
1016 wp->base.on_destroy = &wsola_plc_on_destroy;
1017 pjmedia_port_info_init(&wp->base.info, &name, 0x4123, clock_rate,
1018 channel_count, 16, samples_per_frame);
1019
1020 if (loss_pct == 0)
1021 opt |= PJMEDIA_WSOLA_NO_PLC;
1022
1023 status = pjmedia_wsola_create(pool, clock_rate, samples_per_frame,
1024 channel_count, 0, &wp->wsola);
1025 if (status != PJ_SUCCESS)
1026 return NULL;
1027
1028 wp->gen_port = create_gen_port(pool, clock_rate, channel_count,
1029 samples_per_frame, 100);
1030 if (wp->gen_port == NULL)
1031 return NULL;
1032
1033 return &wp->base;
1034}
1035
1036
1037/* WSOLA PLC with 0% packet loss */
1038static pjmedia_port* wsola_plc_0( pj_pool_t *pool,
1039 unsigned clock_rate,
1040 unsigned channel_count,
1041 unsigned samples_per_frame,
1042 unsigned flags,
1043 struct test_entry *te)
1044{
1045 return create_wsola_plc(0, pool, clock_rate, channel_count,
1046 samples_per_frame, flags, te);
1047}
1048
1049
1050/* WSOLA PLC with 2% packet loss */
1051static pjmedia_port* wsola_plc_2( pj_pool_t *pool,
1052 unsigned clock_rate,
1053 unsigned channel_count,
1054 unsigned samples_per_frame,
1055 unsigned flags,
1056 struct test_entry *te)
1057{
1058 return create_wsola_plc(2, pool, clock_rate, channel_count,
1059 samples_per_frame, flags, te);
1060}
1061
1062/* WSOLA PLC with 5% packet loss */
1063static pjmedia_port* wsola_plc_5( pj_pool_t *pool,
1064 unsigned clock_rate,
1065 unsigned channel_count,
1066 unsigned samples_per_frame,
1067 unsigned flags,
1068 struct test_entry *te)
1069{
1070 return create_wsola_plc(5, pool, clock_rate, channel_count,
1071 samples_per_frame, flags, te);
1072}
1073
1074/* WSOLA PLC with 10% packet loss */
1075static pjmedia_port* wsola_plc_10(pj_pool_t *pool,
1076 unsigned clock_rate,
1077 unsigned channel_count,
1078 unsigned samples_per_frame,
1079 unsigned flags,
1080 struct test_entry *te)
1081{
1082 return create_wsola_plc(10, pool, clock_rate, channel_count,
1083 samples_per_frame, flags, te);
1084}
1085
1086/* WSOLA PLC with 20% packet loss */
1087static pjmedia_port* wsola_plc_20(pj_pool_t *pool,
1088 unsigned clock_rate,
1089 unsigned channel_count,
1090 unsigned samples_per_frame,
1091 unsigned flags,
1092 struct test_entry *te)
1093{
1094 return create_wsola_plc(20, pool, clock_rate, channel_count,
1095 samples_per_frame, flags, te);
1096}
1097
1098/* WSOLA PLC with 50% packet loss */
1099static pjmedia_port* wsola_plc_50(pj_pool_t *pool,
1100 unsigned clock_rate,
1101 unsigned channel_count,
1102 unsigned samples_per_frame,
1103 unsigned flags,
1104 struct test_entry *te)
1105{
1106 return create_wsola_plc(50, pool, clock_rate, channel_count,
1107 samples_per_frame, flags, te);
1108}
1109
1110
1111
1112/***************************************************************************/
1113/* WSOLA discard mode */
1114enum { CIRC_BUF_FRAME_CNT = 4 };
1115struct wsola_discard_port
1116{
1117 pjmedia_port base;
1118 pjmedia_port *gen_port;
1119 pjmedia_wsola *wsola;
1120 pjmedia_circ_buf *circbuf;
1121 unsigned discard_pct;
1122};
1123
1124
1125static pj_status_t wsola_discard_get_frame(struct pjmedia_port *this_port,
1126 pjmedia_frame *frame)
1127{
1128 struct wsola_discard_port *wp = (struct wsola_discard_port*)this_port;
1129 pj_status_t status;
1130
1131 while (pjmedia_circ_buf_get_len(wp->circbuf) <
1132 wp->base.info.samples_per_frame * (CIRC_BUF_FRAME_CNT-1))
1133 {
1134 status = pjmedia_port_get_frame(wp->gen_port, frame);
1135 pj_assert(status==PJ_SUCCESS);
1136
1137 status = pjmedia_circ_buf_write(wp->circbuf, (short*)frame->buf,
1138 wp->base.info.samples_per_frame);
1139 pj_assert(status==PJ_SUCCESS);
1140 }
1141
1142 if ((pj_rand() % 100) < (int)wp->discard_pct) {
1143 pj_int16_t *reg1, *reg2;
1144 unsigned reg1_len, reg2_len;
1145 unsigned del_cnt;
1146
1147 pjmedia_circ_buf_get_read_regions(wp->circbuf, &reg1, &reg1_len,
1148 &reg2, &reg2_len);
1149
1150 del_cnt = wp->base.info.samples_per_frame;
1151 status = pjmedia_wsola_discard(wp->wsola, reg1, reg1_len, reg2,
1152 reg2_len, &del_cnt);
1153 pj_assert(status==PJ_SUCCESS);
1154
1155 status = pjmedia_circ_buf_adv_read_ptr(wp->circbuf, del_cnt);
1156 pj_assert(status==PJ_SUCCESS);
1157 }
1158
1159 return PJ_SUCCESS;
1160}
1161
1162static pj_status_t wsola_discard_on_destroy(struct pjmedia_port *this_port)
1163{
1164 struct wsola_discard_port *wp = (struct wsola_discard_port*)this_port;
1165 pjmedia_port_destroy(wp->gen_port);
1166 pjmedia_wsola_destroy(wp->wsola);
1167 return PJ_SUCCESS;
1168}
1169
1170
1171static pjmedia_port* create_wsola_discard(unsigned discard_pct,
1172 pj_pool_t *pool,
1173 unsigned clock_rate,
1174 unsigned channel_count,
1175 unsigned samples_per_frame,
1176 unsigned flags,
1177 struct test_entry *te)
1178{
1179 struct wsola_discard_port *wp;
1180 pj_str_t name = pj_str("wsola");
1181 unsigned i, opt = 0;
1182 pj_status_t status;
1183
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00001184 PJ_UNUSED_ARG(flags);
1185 PJ_UNUSED_ARG(te);
1186
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001187 wp = PJ_POOL_ZALLOC_T(pool, struct wsola_discard_port);
1188 wp->discard_pct = discard_pct;
1189 wp->base.get_frame = &wsola_discard_get_frame;
1190 wp->base.on_destroy = &wsola_discard_on_destroy;
1191 pjmedia_port_info_init(&wp->base.info, &name, 0x4123, clock_rate,
1192 channel_count, 16, samples_per_frame);
1193
1194 if (discard_pct == 0)
1195 opt |= PJMEDIA_WSOLA_NO_DISCARD;
1196
1197 status = pjmedia_wsola_create(pool, clock_rate, samples_per_frame,
1198 channel_count, 0, &wp->wsola);
1199 if (status != PJ_SUCCESS)
1200 return NULL;
1201
1202 wp->gen_port = create_gen_port(pool, clock_rate, channel_count,
1203 samples_per_frame, 100);
1204 if (wp->gen_port == NULL)
1205 return NULL;
1206
1207 status = pjmedia_circ_buf_create(pool, samples_per_frame * CIRC_BUF_FRAME_CNT,
1208 &wp->circbuf);
1209 if (status != PJ_SUCCESS)
1210 return NULL;
1211
1212 /* fill up the circbuf */
1213 for (i=0; i<CIRC_BUF_FRAME_CNT; ++i) {
1214 short pcm[320];
1215 pjmedia_frame frm;
1216
1217 pj_assert(PJ_ARRAY_SIZE(pcm) >= samples_per_frame);
1218 frm.buf = pcm;
1219 frm.size = samples_per_frame * 2;
1220
1221 status = pjmedia_port_get_frame(wp->gen_port, &frm);
1222 pj_assert(status==PJ_SUCCESS);
1223
1224 status = pjmedia_circ_buf_write(wp->circbuf, pcm, samples_per_frame);
1225 pj_assert(status==PJ_SUCCESS);
1226 }
1227
1228 return &wp->base;
1229}
1230
1231
1232/* WSOLA with 2% discard rate */
1233static pjmedia_port* wsola_discard_2( pj_pool_t *pool,
1234 unsigned clock_rate,
1235 unsigned channel_count,
1236 unsigned samples_per_frame,
1237 unsigned flags,
1238 struct test_entry *te)
1239{
1240 return create_wsola_discard(2, pool, clock_rate, channel_count,
1241 samples_per_frame, flags, te);
1242}
1243
1244/* WSOLA with 5% discard rate */
1245static pjmedia_port* wsola_discard_5( pj_pool_t *pool,
1246 unsigned clock_rate,
1247 unsigned channel_count,
1248 unsigned samples_per_frame,
1249 unsigned flags,
1250 struct test_entry *te)
1251{
1252 return create_wsola_discard(5, pool, clock_rate, channel_count,
1253 samples_per_frame, flags, te);
1254}
1255
1256/* WSOLA with 10% discard rate */
1257static pjmedia_port* wsola_discard_10(pj_pool_t *pool,
1258 unsigned clock_rate,
1259 unsigned channel_count,
1260 unsigned samples_per_frame,
1261 unsigned flags,
1262 struct test_entry *te)
1263{
1264 return create_wsola_discard(10, pool, clock_rate, channel_count,
1265 samples_per_frame, flags, te);
1266}
1267
1268/* WSOLA with 20% discard rate */
1269static pjmedia_port* wsola_discard_20(pj_pool_t *pool,
1270 unsigned clock_rate,
1271 unsigned channel_count,
1272 unsigned samples_per_frame,
1273 unsigned flags,
1274 struct test_entry *te)
1275{
1276 return create_wsola_discard(20, pool, clock_rate, channel_count,
1277 samples_per_frame, flags, te);
1278}
1279
1280/* WSOLA with 50% discard rate */
1281static pjmedia_port* wsola_discard_50(pj_pool_t *pool,
1282 unsigned clock_rate,
1283 unsigned channel_count,
1284 unsigned samples_per_frame,
1285 unsigned flags,
1286 struct test_entry *te)
1287{
1288 return create_wsola_discard(50, pool, clock_rate, channel_count,
1289 samples_per_frame, flags, te);
1290}
1291
1292
1293
1294/***************************************************************************/
1295
1296static pjmedia_port* ec_create(unsigned ec_tail_msec,
1297 pj_pool_t *pool,
1298 unsigned clock_rate,
1299 unsigned channel_count,
1300 unsigned samples_per_frame,
1301 unsigned flags,
1302 struct test_entry *te)
1303{
1304 pjmedia_port *gen_port, *ec_port;
1305 pj_status_t status;
1306
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00001307 PJ_UNUSED_ARG(te);
1308
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001309 gen_port = create_gen_port(pool, clock_rate, channel_count,
1310 samples_per_frame, 100);
1311 if (gen_port == NULL)
1312 return NULL;
1313
1314 status = pjmedia_echo_port_create(pool, gen_port, ec_tail_msec, 0,
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001315 flags, &ec_port);
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001316 if (status != PJ_SUCCESS)
1317 return NULL;
1318
1319 return ec_port;
1320}
1321
1322/* EC with 100ms tail length */
1323static pjmedia_port* ec_create_100(pj_pool_t *pool,
1324 unsigned clock_rate,
1325 unsigned channel_count,
1326 unsigned samples_per_frame,
1327 unsigned flags,
1328 struct test_entry *te)
1329{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001330 flags = 0;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001331 return ec_create(100, pool, clock_rate, channel_count, samples_per_frame,
1332 flags, te);
1333}
1334
1335/* EC with 128ms tail length */
1336static pjmedia_port* ec_create_128(pj_pool_t *pool,
1337 unsigned clock_rate,
1338 unsigned channel_count,
1339 unsigned samples_per_frame,
1340 unsigned flags,
1341 struct test_entry *te)
1342{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001343 flags = 0;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001344 return ec_create(128, pool, clock_rate, channel_count, samples_per_frame,
1345 flags, te);
1346}
1347
1348/* EC with 200ms tail length */
1349static pjmedia_port* ec_create_200(pj_pool_t *pool,
1350 unsigned clock_rate,
1351 unsigned channel_count,
1352 unsigned samples_per_frame,
1353 unsigned flags,
1354 struct test_entry *te)
1355{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001356 flags = 0;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001357 return ec_create(200, pool, clock_rate, channel_count, samples_per_frame,
1358 flags, te);
1359}
1360
1361/* EC with 256ms tail length */
1362static pjmedia_port* ec_create_256(pj_pool_t *pool,
1363 unsigned clock_rate,
1364 unsigned channel_count,
1365 unsigned samples_per_frame,
1366 unsigned flags,
1367 struct test_entry *te)
1368{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001369 flags = 0;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001370 return ec_create(256, pool, clock_rate, channel_count, samples_per_frame,
1371 flags, te);
1372}
1373
1374
1375/* EC with 400ms tail length */
1376static pjmedia_port* ec_create_400(pj_pool_t *pool,
1377 unsigned clock_rate,
1378 unsigned channel_count,
1379 unsigned samples_per_frame,
1380 unsigned flags,
1381 struct test_entry *te)
1382{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001383 flags = 0;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001384 return ec_create(400, pool, clock_rate, channel_count, samples_per_frame,
1385 flags, te);
1386}
1387
1388/* EC with 500ms tail length */
1389static pjmedia_port* ec_create_500(pj_pool_t *pool,
1390 unsigned clock_rate,
1391 unsigned channel_count,
1392 unsigned samples_per_frame,
1393 unsigned flags,
1394 struct test_entry *te)
1395{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001396 flags = 0;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001397 return ec_create(500, pool, clock_rate, channel_count, samples_per_frame,
1398 flags, te);
1399}
1400
1401/* EC with 512ms tail length */
1402static pjmedia_port* ec_create_512(pj_pool_t *pool,
1403 unsigned clock_rate,
1404 unsigned channel_count,
1405 unsigned samples_per_frame,
1406 unsigned flags,
1407 struct test_entry *te)
1408{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001409 flags = 0;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001410 return ec_create(512, pool, clock_rate, channel_count, samples_per_frame,
1411 flags, te);
1412}
1413
1414/* EC with 600ms tail length */
1415static pjmedia_port* ec_create_600(pj_pool_t *pool,
1416 unsigned clock_rate,
1417 unsigned channel_count,
1418 unsigned samples_per_frame,
1419 unsigned flags,
1420 struct test_entry *te)
1421{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001422 flags = 0;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001423 return ec_create(600, pool, clock_rate, channel_count, samples_per_frame,
1424 flags, te);
1425}
1426
1427/* EC with 800ms tail length */
1428static pjmedia_port* ec_create_800(pj_pool_t *pool,
1429 unsigned clock_rate,
1430 unsigned channel_count,
1431 unsigned samples_per_frame,
1432 unsigned flags,
1433 struct test_entry *te)
1434{
Benny Prijono0ceb87d2008-08-13 18:21:03 +00001435 flags = 0;
1436 return ec_create(800, pool, clock_rate, channel_count, samples_per_frame,
1437 flags, te);
1438}
1439
1440
1441
1442/* Echo suppressor with 100ms tail length */
1443static pjmedia_port* es_create_100(pj_pool_t *pool,
1444 unsigned clock_rate,
1445 unsigned channel_count,
1446 unsigned samples_per_frame,
1447 unsigned flags,
1448 struct test_entry *te)
1449{
1450 flags = PJMEDIA_ECHO_SIMPLE;
1451 return ec_create(100, pool, clock_rate, channel_count, samples_per_frame,
1452 flags, te);
1453}
1454
1455/* Echo suppressor with 128ms tail length */
1456static pjmedia_port* es_create_128(pj_pool_t *pool,
1457 unsigned clock_rate,
1458 unsigned channel_count,
1459 unsigned samples_per_frame,
1460 unsigned flags,
1461 struct test_entry *te)
1462{
1463 flags = PJMEDIA_ECHO_SIMPLE;
1464 return ec_create(128, pool, clock_rate, channel_count, samples_per_frame,
1465 flags, te);
1466}
1467
1468/* Echo suppressor with 200ms tail length */
1469static pjmedia_port* es_create_200(pj_pool_t *pool,
1470 unsigned clock_rate,
1471 unsigned channel_count,
1472 unsigned samples_per_frame,
1473 unsigned flags,
1474 struct test_entry *te)
1475{
1476 flags = PJMEDIA_ECHO_SIMPLE;
1477 return ec_create(200, pool, clock_rate, channel_count, samples_per_frame,
1478 flags, te);
1479}
1480
1481/* Echo suppressor with 256ms tail length */
1482static pjmedia_port* es_create_256(pj_pool_t *pool,
1483 unsigned clock_rate,
1484 unsigned channel_count,
1485 unsigned samples_per_frame,
1486 unsigned flags,
1487 struct test_entry *te)
1488{
1489 flags = PJMEDIA_ECHO_SIMPLE;
1490 return ec_create(256, pool, clock_rate, channel_count, samples_per_frame,
1491 flags, te);
1492}
1493
1494
1495/* Echo suppressor with 400ms tail length */
1496static pjmedia_port* es_create_400(pj_pool_t *pool,
1497 unsigned clock_rate,
1498 unsigned channel_count,
1499 unsigned samples_per_frame,
1500 unsigned flags,
1501 struct test_entry *te)
1502{
1503 flags = PJMEDIA_ECHO_SIMPLE;
1504 return ec_create(400, pool, clock_rate, channel_count, samples_per_frame,
1505 flags, te);
1506}
1507
1508/* Echo suppressor with 500ms tail length */
1509static pjmedia_port* es_create_500(pj_pool_t *pool,
1510 unsigned clock_rate,
1511 unsigned channel_count,
1512 unsigned samples_per_frame,
1513 unsigned flags,
1514 struct test_entry *te)
1515{
1516 flags = PJMEDIA_ECHO_SIMPLE;
1517 return ec_create(500, pool, clock_rate, channel_count, samples_per_frame,
1518 flags, te);
1519}
1520
1521/* Echo suppressor with 512ms tail length */
1522static pjmedia_port* es_create_512(pj_pool_t *pool,
1523 unsigned clock_rate,
1524 unsigned channel_count,
1525 unsigned samples_per_frame,
1526 unsigned flags,
1527 struct test_entry *te)
1528{
1529 flags = PJMEDIA_ECHO_SIMPLE;
1530 return ec_create(512, pool, clock_rate, channel_count, samples_per_frame,
1531 flags, te);
1532}
1533
1534/* Echo suppressor with 600ms tail length */
1535static pjmedia_port* es_create_600(pj_pool_t *pool,
1536 unsigned clock_rate,
1537 unsigned channel_count,
1538 unsigned samples_per_frame,
1539 unsigned flags,
1540 struct test_entry *te)
1541{
1542 flags = PJMEDIA_ECHO_SIMPLE;
1543 return ec_create(600, pool, clock_rate, channel_count, samples_per_frame,
1544 flags, te);
1545}
1546
1547/* Echo suppressor with 800ms tail length */
1548static pjmedia_port* es_create_800(pj_pool_t *pool,
1549 unsigned clock_rate,
1550 unsigned channel_count,
1551 unsigned samples_per_frame,
1552 unsigned flags,
1553 struct test_entry *te)
1554{
1555 flags = PJMEDIA_ECHO_SIMPLE;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001556 return ec_create(800, pool, clock_rate, channel_count, samples_per_frame,
1557 flags, te);
1558}
1559
1560
1561/***************************************************************************/
1562/* Tone generator, single frequency */
1563static pjmedia_port* create_tonegen(unsigned freq1,
1564 unsigned freq2,
1565 pj_pool_t *pool,
1566 unsigned clock_rate,
1567 unsigned channel_count,
1568 unsigned samples_per_frame,
1569 unsigned flags,
1570 struct test_entry *te)
1571{
1572 pjmedia_port *tonegen;
1573 pjmedia_tone_desc tones[2];
1574 pj_status_t status;
1575
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00001576 PJ_UNUSED_ARG(flags);
1577 PJ_UNUSED_ARG(te);
1578
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001579 status = pjmedia_tonegen_create(pool, clock_rate, channel_count,
1580 samples_per_frame, 16,
1581 PJMEDIA_TONEGEN_LOOP, &tonegen);
1582 if (status != PJ_SUCCESS)
1583 return NULL;
1584
1585 pj_bzero(tones, sizeof(tones));
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00001586 tones[0].freq1 = (short)freq1;
1587 tones[0].freq2 = (short)freq2;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001588 tones[0].on_msec = 400;
1589 tones[0].off_msec = 0;
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00001590 tones[1].freq1 = (short)freq1;
1591 tones[1].freq2 = (short)freq2;
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001592 tones[1].on_msec = 400;
1593 tones[1].off_msec = 100;
1594
1595 status = pjmedia_tonegen_play(tonegen, PJ_ARRAY_SIZE(tones), tones,
1596 PJMEDIA_TONEGEN_LOOP);
1597 if (status != PJ_SUCCESS)
1598 return NULL;
1599
1600 return tonegen;
1601}
1602
1603/* Tonegen with single frequency */
1604static pjmedia_port* create_tonegen1(pj_pool_t *pool,
1605 unsigned clock_rate,
1606 unsigned channel_count,
1607 unsigned samples_per_frame,
1608 unsigned flags,
1609 struct test_entry *te)
1610{
1611 return create_tonegen(400, 0, pool, clock_rate, channel_count,
1612 samples_per_frame, flags, te);
1613}
1614
1615/* Tonegen with dual frequency */
1616static pjmedia_port* create_tonegen2(pj_pool_t *pool,
1617 unsigned clock_rate,
1618 unsigned channel_count,
1619 unsigned samples_per_frame,
1620 unsigned flags,
1621 struct test_entry *te)
1622{
1623 return create_tonegen(400, 440, pool, clock_rate, channel_count,
1624 samples_per_frame, flags, te);
1625}
1626
1627
1628
1629/***************************************************************************/
1630/* Stream */
1631
1632struct stream_port
1633{
1634 pjmedia_port base;
1635 pj_status_t (*codec_deinit)();
1636 pjmedia_endpt *endpt;
1637 pjmedia_stream *stream;
1638 pjmedia_transport *transport;
1639};
1640
1641
1642static void stream_port_custom_deinit(struct test_entry *te)
1643{
1644 struct stream_port *sp = (struct stream_port*) te->pdata[0];
1645
1646 pjmedia_stream_destroy(sp->stream);
1647 pjmedia_transport_close(sp->transport);
1648 sp->codec_deinit();
1649 pjmedia_endpt_destroy(sp->endpt);
1650
1651}
1652
1653static pjmedia_port* create_stream( pj_pool_t *pool,
1654 const char *codec,
1655 pj_status_t (*codec_init)(pjmedia_endpt*),
1656 pj_status_t (*codec_deinit)(),
1657 pj_bool_t srtp_enabled,
1658 pj_bool_t srtp_80,
1659 pj_bool_t srtp_auth,
1660 unsigned clock_rate,
1661 unsigned channel_count,
1662 unsigned samples_per_frame,
1663 unsigned flags,
1664 struct test_entry *te)
1665{
1666 struct stream_port *sp;
1667 pj_str_t codec_id;
1668 pjmedia_port *port;
1669 const pjmedia_codec_info *ci[1];
1670 unsigned count;
1671 pjmedia_codec_param codec_param;
1672 pjmedia_stream_info si;
1673 pj_status_t status;
1674
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00001675 PJ_UNUSED_ARG(flags);
1676
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001677 codec_id = pj_str((char*)codec);
1678 sp = PJ_POOL_ZALLOC_T(pool, struct stream_port);
1679 pjmedia_port_info_init(&sp->base.info, &codec_id, 0x123456, clock_rate,
1680 channel_count, 16, samples_per_frame);
1681
1682 te->pdata[0] = sp;
1683 te->custom_deinit = &stream_port_custom_deinit;
1684 sp->codec_deinit = codec_deinit;
1685
1686 status = pjmedia_endpt_create(mem, NULL, 0, &sp->endpt);
1687 if (status != PJ_SUCCESS)
1688 return NULL;
1689
1690 status = codec_init(sp->endpt);
1691 if (status != PJ_SUCCESS)
1692 return NULL;
1693
1694 count = 1;
1695 status = pjmedia_codec_mgr_find_codecs_by_id(pjmedia_endpt_get_codec_mgr(sp->endpt),
1696 &codec_id, &count, ci, NULL);
1697 if (status != PJ_SUCCESS)
1698 return NULL;
1699
1700
1701
1702 status = pjmedia_codec_mgr_get_default_param(pjmedia_endpt_get_codec_mgr(sp->endpt),
1703 ci[0], &codec_param);
1704 if (status != PJ_SUCCESS)
1705 return NULL;
1706
1707 /* Create stream info */
1708 pj_bzero(&si, sizeof(si));
1709 si.type = PJMEDIA_TYPE_AUDIO;
1710 si.proto = PJMEDIA_TP_PROTO_RTP_AVP;
1711 si.dir = PJMEDIA_DIR_ENCODING_DECODING;
1712 pj_sockaddr_in_init(&si.rem_addr.ipv4, NULL, 4000);
1713 pj_sockaddr_in_init(&si.rem_rtcp.ipv4, NULL, 4001);
1714 pj_memcpy(&si.fmt, ci[0], sizeof(pjmedia_codec_info));
1715 si.param = NULL;
1716 si.tx_pt = ci[0]->pt;
1717 si.tx_event_pt = 101;
1718 si.rx_event_pt = 101;
1719 si.ssrc = pj_rand();
1720 si.jb_init = si.jb_min_pre = si.jb_max_pre = si.jb_max = -1;
1721
1722 /* Create loop transport */
1723 status = pjmedia_transport_loop_create(sp->endpt, &sp->transport);
1724 if (status != PJ_SUCCESS)
1725 return NULL;
1726
1727 if (srtp_enabled) {
1728 pjmedia_srtp_setting opt;
1729 pjmedia_srtp_crypto crypto;
1730 pjmedia_transport *srtp;
1731
1732 pjmedia_srtp_setting_default(&opt);
1733 opt.close_member_tp = PJ_TRUE;
1734 opt.use = PJMEDIA_SRTP_MANDATORY;
1735
1736 status = pjmedia_transport_srtp_create(sp->endpt, sp->transport, &opt,
1737 &srtp);
1738 if (status != PJ_SUCCESS)
1739 return NULL;
1740
1741 pj_bzero(&crypto, sizeof(crypto));
1742 if (srtp_80) {
1743 crypto.key = pj_str("123456789012345678901234567890");
1744 crypto.name = pj_str("AES_CM_128_HMAC_SHA1_80");
1745 } else {
1746 crypto.key = pj_str("123456789012345678901234567890");
1747 crypto.name = pj_str("AES_CM_128_HMAC_SHA1_32");
1748 }
1749
1750 if (!srtp_auth)
1751 crypto.flags = PJMEDIA_SRTP_NO_AUTHENTICATION;
1752
1753 status = pjmedia_transport_srtp_start(srtp, &crypto, &crypto);
1754 if (status != PJ_SUCCESS)
1755 return NULL;
1756
1757 sp->transport = srtp;
1758 }
1759
1760 /* Create stream */
1761 status = pjmedia_stream_create(sp->endpt, pool, &si, sp->transport, NULL,
1762 &sp->stream);
1763 if (status != PJ_SUCCESS)
1764 return NULL;
1765
1766 /* Start stream */
1767 status = pjmedia_stream_start(sp->stream);
1768 if (status != PJ_SUCCESS)
1769 return NULL;
1770
1771 status = pjmedia_stream_get_port(sp->stream, &port);
1772 if (status != PJ_SUCCESS)
1773 return NULL;
1774
1775 return port;
1776}
1777
1778/* G.711 stream, no SRTP */
1779static pjmedia_port* create_stream_pcmu( pj_pool_t *pool,
1780 unsigned clock_rate,
1781 unsigned channel_count,
1782 unsigned samples_per_frame,
1783 unsigned flags,
1784 struct test_entry *te)
1785{
1786 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1787 &pjmedia_codec_g711_deinit,
1788 PJ_FALSE, PJ_FALSE, PJ_FALSE,
1789 clock_rate, channel_count,
1790 samples_per_frame, flags, te);
1791}
1792
1793/* G.711 stream, SRTP 32bit key no auth */
1794static pjmedia_port* create_stream_pcmu_srtp32_no_auth( pj_pool_t *pool,
1795 unsigned clock_rate,
1796 unsigned channel_count,
1797 unsigned samples_per_frame,
1798 unsigned flags,
1799 struct test_entry *te)
1800{
1801 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1802 &pjmedia_codec_g711_deinit,
1803 PJ_TRUE, PJ_FALSE, PJ_FALSE,
1804 clock_rate, channel_count,
1805 samples_per_frame, flags, te);
1806}
1807
1808/* G.711 stream, SRTP 32bit key with auth */
1809static pjmedia_port* create_stream_pcmu_srtp32_with_auth(pj_pool_t *pool,
1810 unsigned clock_rate,
1811 unsigned channel_count,
1812 unsigned samples_per_frame,
1813 unsigned flags,
1814 struct test_entry *te)
1815{
1816 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1817 &pjmedia_codec_g711_deinit,
1818 PJ_TRUE, PJ_FALSE, PJ_TRUE,
1819 clock_rate, channel_count,
1820 samples_per_frame, flags, te);
1821}
1822
1823/* G.711 stream, SRTP 80bit key no auth */
1824static pjmedia_port* create_stream_pcmu_srtp80_no_auth( pj_pool_t *pool,
1825 unsigned clock_rate,
1826 unsigned channel_count,
1827 unsigned samples_per_frame,
1828 unsigned flags,
1829 struct test_entry *te)
1830{
1831 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1832 &pjmedia_codec_g711_deinit,
1833 PJ_TRUE, PJ_TRUE, PJ_FALSE,
1834 clock_rate, channel_count,
1835 samples_per_frame, flags, te);
1836}
1837
1838/* G.711 stream, SRTP 80bit key with auth */
1839static pjmedia_port* create_stream_pcmu_srtp80_with_auth(pj_pool_t *pool,
1840 unsigned clock_rate,
1841 unsigned channel_count,
1842 unsigned samples_per_frame,
1843 unsigned flags,
1844 struct test_entry *te)
1845{
1846 return create_stream(pool, "pcmu", &pjmedia_codec_g711_init,
1847 &pjmedia_codec_g711_deinit,
1848 PJ_TRUE, PJ_TRUE, PJ_TRUE,
1849 clock_rate, channel_count,
1850 samples_per_frame, flags, te);
1851}
1852
1853/* GSM stream */
1854static pjmedia_port* create_stream_gsm( pj_pool_t *pool,
1855 unsigned clock_rate,
1856 unsigned channel_count,
1857 unsigned samples_per_frame,
1858 unsigned flags,
1859 struct test_entry *te)
1860{
1861 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1862 &pjmedia_codec_gsm_deinit,
1863 PJ_FALSE, PJ_FALSE, PJ_FALSE,
1864 clock_rate, channel_count,
1865 samples_per_frame, flags, te);
1866}
1867
1868/* GSM stream, SRTP 32bit, no auth */
1869static pjmedia_port* create_stream_gsm_srtp32_no_auth(pj_pool_t *pool,
1870 unsigned clock_rate,
1871 unsigned channel_count,
1872 unsigned samples_per_frame,
1873 unsigned flags,
1874 struct test_entry *te)
1875{
1876 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1877 &pjmedia_codec_gsm_deinit,
1878 PJ_TRUE, PJ_FALSE, PJ_FALSE,
1879 clock_rate, channel_count,
1880 samples_per_frame, flags, te);
1881}
1882
1883/* GSM stream, SRTP 32bit, with auth */
1884static pjmedia_port* create_stream_gsm_srtp32_with_auth(pj_pool_t *pool,
1885 unsigned clock_rate,
1886 unsigned channel_count,
1887 unsigned samples_per_frame,
1888 unsigned flags,
1889 struct test_entry *te)
1890{
1891 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1892 &pjmedia_codec_gsm_deinit,
1893 PJ_TRUE, PJ_FALSE, PJ_TRUE,
1894 clock_rate, channel_count,
1895 samples_per_frame, flags, te);
1896}
1897
1898/* GSM stream, SRTP 80bit, no auth */
1899static pjmedia_port* create_stream_gsm_srtp80_no_auth(pj_pool_t *pool,
1900 unsigned clock_rate,
1901 unsigned channel_count,
1902 unsigned samples_per_frame,
1903 unsigned flags,
1904 struct test_entry *te)
1905{
1906 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1907 &pjmedia_codec_gsm_deinit,
1908 PJ_TRUE, PJ_TRUE, PJ_FALSE,
1909 clock_rate, channel_count,
1910 samples_per_frame, flags, te);
1911}
1912
1913/* GSM stream, SRTP 80bit, with auth */
1914static pjmedia_port* create_stream_gsm_srtp80_with_auth(pj_pool_t *pool,
1915 unsigned clock_rate,
1916 unsigned channel_count,
1917 unsigned samples_per_frame,
1918 unsigned flags,
1919 struct test_entry *te)
1920{
1921 return create_stream(pool, "gsm", &pjmedia_codec_gsm_init,
1922 &pjmedia_codec_gsm_deinit,
1923 PJ_TRUE, PJ_TRUE, PJ_TRUE,
1924 clock_rate, channel_count,
1925 samples_per_frame, flags, te);
1926}
1927
1928/* G722 stream */
1929static pjmedia_port* create_stream_g722( pj_pool_t *pool,
1930 unsigned clock_rate,
1931 unsigned channel_count,
1932 unsigned samples_per_frame,
1933 unsigned flags,
1934 struct test_entry *te)
1935{
1936 return create_stream(pool, "g722", &pjmedia_codec_g722_init,
1937 &pjmedia_codec_g722_deinit,
1938 PJ_FALSE, PJ_FALSE, PJ_FALSE,
1939 clock_rate, channel_count,
1940 samples_per_frame, flags, te);
1941}
1942
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00001943/* G722.1 stream */
Benny Prijono2eabad92009-05-06 14:34:13 +00001944#if PJMEDIA_HAS_G7221_CODEC
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00001945static pjmedia_port* create_stream_g7221( pj_pool_t *pool,
1946 unsigned clock_rate,
1947 unsigned channel_count,
1948 unsigned samples_per_frame,
1949 unsigned flags,
1950 struct test_entry *te)
1951{
1952 return create_stream(pool, "g7221/16000", &pjmedia_codec_g7221_init,
1953 &pjmedia_codec_g7221_deinit,
1954 PJ_FALSE, PJ_FALSE, PJ_FALSE,
1955 clock_rate, channel_count,
1956 samples_per_frame, flags, te);
1957}
1958
1959/* G722.1 Annex C stream */
1960static pjmedia_port* create_stream_g7221c( 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_stream(pool, "g7221/32000", &pjmedia_codec_g7221_init,
1968 &pjmedia_codec_g7221_deinit,
1969 PJ_FALSE, PJ_FALSE, PJ_FALSE,
1970 clock_rate, channel_count,
1971 samples_per_frame, flags, te);
1972}
Benny Prijono2eabad92009-05-06 14:34:13 +00001973#endif /* PJMEDIA_HAS_G7221_CODEC */
Benny Prijono0ff56dc2008-07-04 16:45:17 +00001974
1975/***************************************************************************/
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00001976/* Delay buffer */
1977enum {DELAY_BUF_MAX_DELAY = 80};
1978struct delaybuf_port
1979{
1980 pjmedia_port base;
1981 pjmedia_delay_buf *delaybuf;
1982 pjmedia_port *gen_port;
1983 int drift_pct;
1984};
1985
1986
1987static pj_status_t delaybuf_get_frame(struct pjmedia_port *this_port,
1988 pjmedia_frame *frame)
1989{
1990 struct delaybuf_port *dp = (struct delaybuf_port*)this_port;
1991 pj_status_t status;
1992
1993 status = pjmedia_delay_buf_get(dp->delaybuf, (pj_int16_t*)frame->buf);
1994 pj_assert(status == PJ_SUCCESS);
1995
1996 /* Additional GET when drift_pct is negative */
1997 if (dp->drift_pct < 0) {
1998 int rnd;
1999 rnd = pj_rand() % 100;
2000
2001 if (rnd < -dp->drift_pct) {
2002 status = pjmedia_delay_buf_get(dp->delaybuf, (pj_int16_t*)frame->buf);
2003 pj_assert(status == PJ_SUCCESS);
2004 }
2005 }
2006
2007 return PJ_SUCCESS;
2008}
2009
2010static pj_status_t delaybuf_put_frame(struct pjmedia_port *this_port,
2011 const pjmedia_frame *frame)
2012{
2013 struct delaybuf_port *dp = (struct delaybuf_port*)this_port;
2014 pj_status_t status;
2015 pjmedia_frame f = *frame;
2016
2017 status = pjmedia_port_get_frame(dp->gen_port, &f);
2018 pj_assert(status == PJ_SUCCESS);
2019 status = pjmedia_delay_buf_put(dp->delaybuf, (pj_int16_t*)f.buf);
2020 pj_assert(status == PJ_SUCCESS);
2021
2022 /* Additional PUT when drift_pct is possitive */
2023 if (dp->drift_pct > 0) {
2024 int rnd;
2025 rnd = pj_rand() % 100;
2026
2027 if (rnd < dp->drift_pct) {
2028 status = pjmedia_port_get_frame(dp->gen_port, &f);
2029 pj_assert(status == PJ_SUCCESS);
2030 status = pjmedia_delay_buf_put(dp->delaybuf, (pj_int16_t*)f.buf);
2031 pj_assert(status == PJ_SUCCESS);
2032 }
2033 }
2034
2035 return PJ_SUCCESS;
2036}
2037
2038static pj_status_t delaybuf_on_destroy(struct pjmedia_port *this_port)
2039{
2040 struct delaybuf_port *dp = (struct delaybuf_port*)this_port;
2041 pjmedia_port_destroy(dp->gen_port);
2042 pjmedia_delay_buf_destroy(dp->delaybuf);
2043 return PJ_SUCCESS;
2044}
2045
2046static pjmedia_port* create_delaybuf(int drift_pct,
2047 pj_pool_t *pool,
2048 unsigned clock_rate,
2049 unsigned channel_count,
2050 unsigned samples_per_frame,
2051 unsigned flags,
2052 struct test_entry *te)
2053{
2054 struct delaybuf_port *dp;
2055 pj_str_t name = pj_str("delaybuf");
2056 unsigned opt = 0;
2057 pj_status_t status;
2058
2059 PJ_UNUSED_ARG(flags);
2060 PJ_UNUSED_ARG(te);
2061
2062 dp = PJ_POOL_ZALLOC_T(pool, struct delaybuf_port);
2063 dp->drift_pct = drift_pct;
2064 dp->base.get_frame = &delaybuf_get_frame;
2065 dp->base.put_frame = &delaybuf_put_frame;
2066 dp->base.on_destroy = &delaybuf_on_destroy;
2067 pjmedia_port_info_init(&dp->base.info, &name, 0x5678, clock_rate,
2068 channel_count, 16, samples_per_frame);
2069
2070 status = pjmedia_delay_buf_create(pool, "mips_test", clock_rate,
2071 samples_per_frame, channel_count,
2072 DELAY_BUF_MAX_DELAY,
2073 opt, &dp->delaybuf);
2074 if (status != PJ_SUCCESS)
2075 return NULL;
2076
2077 dp->gen_port = create_gen_port(pool, clock_rate, channel_count,
2078 samples_per_frame, 100);
2079 if (dp->gen_port == NULL)
2080 return NULL;
2081
2082 return &dp->base;
2083}
2084
2085
2086/* Delay buffer without drift */
2087static pjmedia_port* delaybuf_0( pj_pool_t *pool,
2088 unsigned clock_rate,
2089 unsigned channel_count,
2090 unsigned samples_per_frame,
2091 unsigned flags,
2092 struct test_entry *te)
2093{
2094 return create_delaybuf(0, pool, clock_rate, channel_count,
2095 samples_per_frame, flags, te);
2096}
2097
2098
2099/* Delay buffer with 2% drift */
2100static pjmedia_port* delaybuf_p2( pj_pool_t *pool,
2101 unsigned clock_rate,
2102 unsigned channel_count,
2103 unsigned samples_per_frame,
2104 unsigned flags,
2105 struct test_entry *te)
2106{
2107 return create_delaybuf(2, pool, clock_rate, channel_count,
2108 samples_per_frame, flags, te);
2109}
2110
2111/* Delay buffer with 5% drift */
2112static pjmedia_port* delaybuf_p5( pj_pool_t *pool,
2113 unsigned clock_rate,
2114 unsigned channel_count,
2115 unsigned samples_per_frame,
2116 unsigned flags,
2117 struct test_entry *te)
2118{
2119 return create_delaybuf(5, pool, clock_rate, channel_count,
2120 samples_per_frame, flags, te);
2121}
2122
2123/* Delay buffer with 10% drift */
2124static pjmedia_port* delaybuf_p10(pj_pool_t *pool,
2125 unsigned clock_rate,
2126 unsigned channel_count,
2127 unsigned samples_per_frame,
2128 unsigned flags,
2129 struct test_entry *te)
2130{
2131 return create_delaybuf(10, pool, clock_rate, channel_count,
2132 samples_per_frame, flags, te);
2133}
2134
2135/* Delay buffer with 20% drift */
2136static pjmedia_port* delaybuf_p20(pj_pool_t *pool,
2137 unsigned clock_rate,
2138 unsigned channel_count,
2139 unsigned samples_per_frame,
2140 unsigned flags,
2141 struct test_entry *te)
2142{
2143 return create_delaybuf(20, pool, clock_rate, channel_count,
2144 samples_per_frame, flags, te);
2145}
2146
2147/* Delay buffer with -2% drift */
2148static pjmedia_port* delaybuf_n2( pj_pool_t *pool,
2149 unsigned clock_rate,
2150 unsigned channel_count,
2151 unsigned samples_per_frame,
2152 unsigned flags,
2153 struct test_entry *te)
2154{
2155 return create_delaybuf(-2, pool, clock_rate, channel_count,
2156 samples_per_frame, flags, te);
2157}
2158
2159/* Delay buffer with -5% drift */
2160static pjmedia_port* delaybuf_n5( pj_pool_t *pool,
2161 unsigned clock_rate,
2162 unsigned channel_count,
2163 unsigned samples_per_frame,
2164 unsigned flags,
2165 struct test_entry *te)
2166{
2167 return create_delaybuf(-5, pool, clock_rate, channel_count,
2168 samples_per_frame, flags, te);
2169}
2170
2171/* Delay buffer with -10% drift */
2172static pjmedia_port* delaybuf_n10(pj_pool_t *pool,
2173 unsigned clock_rate,
2174 unsigned channel_count,
2175 unsigned samples_per_frame,
2176 unsigned flags,
2177 struct test_entry *te)
2178{
2179 return create_delaybuf(-10, pool, clock_rate, channel_count,
2180 samples_per_frame, flags, te);
2181}
2182
2183/* Delay buffer with -20% drift */
2184static pjmedia_port* delaybuf_n20(pj_pool_t *pool,
2185 unsigned clock_rate,
2186 unsigned channel_count,
2187 unsigned samples_per_frame,
2188 unsigned flags,
2189 struct test_entry *te)
2190{
2191 return create_delaybuf(-20, pool, clock_rate, channel_count,
2192 samples_per_frame, flags, te);
2193}
2194
2195
2196/***************************************************************************/
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002197/* Run test entry, return elapsed time */
2198static pj_timestamp run_entry(unsigned clock_rate, struct test_entry *e)
2199{
2200 pj_pool_t *pool;
2201 pjmedia_port *port;
2202 pj_timestamp t0, t1;
2203 unsigned j, samples_per_frame;
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002204 pj_int16_t pcm[32000 * PTIME / 1000];
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002205 pjmedia_port *gen_port;
2206 pj_status_t status;
2207
2208 samples_per_frame = clock_rate * PTIME / 1000;
2209
2210 pool = pj_pool_create(mem, "pool", 1024, 1024, NULL);
2211 port = e->init(pool, clock_rate, 1, samples_per_frame, 0, e);
Benny Prijonob1f62f42008-07-04 23:43:10 +00002212 if (port == NULL) {
2213 t0.u64 = 0;
2214 pj_pool_release(pool);
2215 PJ_LOG(1,(THIS_FILE, " init error"));
2216 return t0;
2217 }
2218
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002219 gen_port = create_gen_port(pool, clock_rate, 1,
2220 samples_per_frame, 100);
Benny Prijonob1f62f42008-07-04 23:43:10 +00002221 if (gen_port == NULL) {
2222 t0.u64 = 0;
2223 pj_pool_release(pool);
2224 return t0;
2225 }
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002226
2227 pj_get_timestamp(&t0);
2228 for (j=0; j<DURATION*clock_rate/samples_per_frame/1000; ++j) {
2229 pjmedia_frame frm;
2230
2231 if (e->valid_op==OP_GET_PUT) {
2232 frm.buf = (void*)pcm;
2233 frm.size = samples_per_frame * 2;
2234 frm.type = PJMEDIA_FRAME_TYPE_NONE;
2235
2236 status = pjmedia_port_get_frame(port, &frm);
2237 pj_assert(status == PJ_SUCCESS);
2238
2239 status = pjmedia_port_put_frame(port, &frm);
2240 pj_assert(status == PJ_SUCCESS);
2241
2242 } else if (e->valid_op == OP_GET) {
2243 frm.buf = (void*)pcm;
2244 frm.size = samples_per_frame * 2;
2245 frm.type = PJMEDIA_FRAME_TYPE_NONE;
2246
2247 status = pjmedia_port_get_frame(port, &frm);
2248 pj_assert(status == PJ_SUCCESS);
2249
2250 } else if (e->valid_op == OP_PUT) {
2251 frm.buf = (void*)pcm;
2252 frm.size = samples_per_frame * 2;
2253 frm.type = PJMEDIA_FRAME_TYPE_NONE;
2254
2255 status = pjmedia_port_get_frame(gen_port, &frm);
2256 pj_assert(status == PJ_SUCCESS);
2257
2258 status = pjmedia_port_put_frame(port, &frm);
2259 pj_assert(status == PJ_SUCCESS);
2260
2261 } else if (e->valid_op == OP_PUT_GET) {
2262 frm.buf = (void*)pcm;
2263 frm.size = samples_per_frame * 2;
2264 frm.type = PJMEDIA_FRAME_TYPE_NONE;
2265
2266 status = pjmedia_port_get_frame(gen_port, &frm);
2267 pj_assert(status == PJ_SUCCESS);
2268
2269 status = pjmedia_port_put_frame(port, &frm);
2270 pj_assert(status == PJ_SUCCESS);
2271
2272 status = pjmedia_port_get_frame(port, &frm);
2273 pj_assert(status == PJ_SUCCESS);
2274 }
2275 }
2276 pj_get_timestamp(&t1);
2277
2278 pj_sub_timestamp(&t1, &t0);
2279
2280 if (e->custom_deinit)
2281 e->custom_deinit(e);
2282
2283 pjmedia_port_destroy(port);
2284 pj_pool_release(pool);
2285
2286 return t1;
2287}
2288
2289/***************************************************************************/
2290int mips_test(void)
2291{
2292 struct test_entry entries[] = {
2293 { "get from memplayer", OP_GET, K8|K16, &gen_port_test_init},
2294 { "conference bridge with 1 call", OP_GET_PUT, K8|K16, &conf1_test_init},
2295 { "conference bridge with 2 calls", OP_GET_PUT, K8|K16, &conf2_test_init},
2296 { "conference bridge with 4 calls", OP_GET_PUT, K8|K16, &conf4_test_init},
2297 { "conference bridge with 8 calls", OP_GET_PUT, K8|K16, &conf8_test_init},
2298 { "conference bridge with 16 calls", OP_GET_PUT, K8|K16, &conf16_test_init},
2299 { "upsample+downsample - linear", OP_GET, K8|K16, &linear_resample},
2300 { "upsample+downsample - small filter", OP_GET, K8|K16, &small_filt_resample},
2301 { "upsample+downsample - large filter", OP_GET, K8|K16, &large_filt_resample},
2302 { "WSOLA PLC - 0% loss", OP_GET, K8|K16, &wsola_plc_0},
2303 { "WSOLA PLC - 2% loss", OP_GET, K8|K16, &wsola_plc_2},
2304 { "WSOLA PLC - 5% loss", OP_GET, K8|K16, &wsola_plc_5},
2305 { "WSOLA PLC - 10% loss", OP_GET, K8|K16, &wsola_plc_10},
2306 { "WSOLA PLC - 20% loss", OP_GET, K8|K16, &wsola_plc_20},
2307 { "WSOLA PLC - 50% loss", OP_GET, K8|K16, &wsola_plc_50},
2308 { "WSOLA discard 2% excess", OP_GET, K8|K16, &wsola_discard_2},
2309 { "WSOLA discard 5% excess", OP_GET, K8|K16, &wsola_discard_5},
2310 { "WSOLA discard 10% excess", OP_GET, K8|K16, &wsola_discard_10},
2311 { "WSOLA discard 20% excess", OP_GET, K8|K16, &wsola_discard_20},
2312 { "WSOLA discard 50% excess", OP_GET, K8|K16, &wsola_discard_50},
Nanang Izzuddin2c953d42008-08-04 16:03:28 +00002313 { "Delay buffer", OP_GET_PUT, K8|K16, &delaybuf_0},
2314 { "Delay buffer - drift -2%", OP_GET_PUT, K8|K16, &delaybuf_n2},
2315 { "Delay buffer - drift -5%", OP_GET_PUT, K8|K16, &delaybuf_n5},
2316 { "Delay buffer - drift -10%", OP_GET_PUT, K8|K16, &delaybuf_n10},
2317 { "Delay buffer - drift -20%", OP_GET_PUT, K8|K16, &delaybuf_n20},
2318 { "Delay buffer - drift +2%", OP_GET_PUT, K8|K16, &delaybuf_p2},
2319 { "Delay buffer - drift +5%", OP_GET_PUT, K8|K16, &delaybuf_p5},
2320 { "Delay buffer - drift +10%", OP_GET_PUT, K8|K16, &delaybuf_p10},
2321 { "Delay buffer - drift +20%", OP_GET_PUT, K8|K16, &delaybuf_p20},
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002322 { "echo canceller 100ms tail len", OP_GET_PUT, K8|K16, &ec_create_100},
2323 { "echo canceller 128ms tail len", OP_GET_PUT, K8|K16, &ec_create_128},
2324 { "echo canceller 200ms tail len", OP_GET_PUT, K8|K16, &ec_create_200},
2325 { "echo canceller 256ms tail len", OP_GET_PUT, K8|K16, &ec_create_256},
2326 { "echo canceller 400ms tail len", OP_GET_PUT, K8|K16, &ec_create_400},
2327 { "echo canceller 500ms tail len", OP_GET_PUT, K8|K16, &ec_create_500},
2328 { "echo canceller 512ms tail len", OP_GET_PUT, K8|K16, &ec_create_512},
2329 { "echo canceller 600ms tail len", OP_GET_PUT, K8|K16, &ec_create_600},
2330 { "echo canceller 800ms tail len", OP_GET_PUT, K8|K16, &ec_create_800},
Benny Prijono0ceb87d2008-08-13 18:21:03 +00002331 { "echo suppressor 100ms tail len", OP_GET_PUT, K8|K16, &es_create_100},
2332 { "echo suppressor 128ms tail len", OP_GET_PUT, K8|K16, &es_create_128},
2333 { "echo suppressor 200ms tail len", OP_GET_PUT, K8|K16, &es_create_200},
2334 { "echo suppressor 256ms tail len", OP_GET_PUT, K8|K16, &es_create_256},
2335 { "echo suppressor 400ms tail len", OP_GET_PUT, K8|K16, &es_create_400},
2336 { "echo suppressor 500ms tail len", OP_GET_PUT, K8|K16, &es_create_500},
2337 { "echo suppressor 512ms tail len", OP_GET_PUT, K8|K16, &es_create_512},
2338 { "echo suppressor 600ms tail len", OP_GET_PUT, K8|K16, &es_create_600},
2339 { "echo suppressor 800ms tail len", OP_GET_PUT, K8|K16, &es_create_800},
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002340 { "tone generator with single freq", OP_GET, K8|K16, &create_tonegen1},
2341 { "tone generator with dual freq", OP_GET, K8|K16, &create_tonegen2},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002342#if PJMEDIA_HAS_G711_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002343 { "codec encode/decode - G.711", OP_PUT, K8, &g711_encode_decode},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002344#endif
2345#if PJMEDIA_HAS_G722_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002346 { "codec encode/decode - G.722", OP_PUT, K16, &g722_encode_decode},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002347#endif
2348#if PJMEDIA_HAS_GSM_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002349 { "codec encode/decode - GSM", OP_PUT, K8, &gsm_encode_decode},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002350#endif
2351#if PJMEDIA_HAS_ILBC_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002352 { "codec encode/decode - iLBC", OP_PUT, K8, &ilbc_encode_decode},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002353#endif
2354#if PJMEDIA_HAS_SPEEX_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002355 { "codec encode/decode - Speex 8Khz", OP_PUT, K8, &speex8_encode_decode},
2356 { "codec encode/decode - Speex 16Khz", OP_PUT, K16, &speex16_encode_decode},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002357#endif
2358#if PJMEDIA_HAS_G7221_CODEC
2359 { "codec encode/decode - G.722.1", OP_PUT, K16, &g7221_encode_decode},
2360 { "codec encode/decode - G.722.1c", OP_PUT, K32, &g7221c_encode_decode},
2361#endif
2362#if PJMEDIA_HAS_L16_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002363 { "codec encode/decode - L16/8000/1", OP_PUT, K8, &l16_8_encode_decode},
2364 { "codec encode/decode - L16/16000/1", OP_PUT, K16, &l16_16_encode_decode},
Benny Prijono06973132009-01-27 10:05:48 +00002365#endif
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002366#if PJMEDIA_HAS_G711_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002367 { "stream TX/RX - G.711", OP_PUT_GET, K8, &create_stream_pcmu},
2368 { "stream TX/RX - G.711 SRTP 32bit", OP_PUT_GET, K8, &create_stream_pcmu_srtp32_no_auth},
2369 { "stream TX/RX - G.711 SRTP 32bit +auth", OP_PUT_GET, K8, &create_stream_pcmu_srtp32_with_auth},
2370 { "stream TX/RX - G.711 SRTP 80bit", OP_PUT_GET, K8, &create_stream_pcmu_srtp80_no_auth},
2371 { "stream TX/RX - G.711 SRTP 80bit +auth", OP_PUT_GET, K8, &create_stream_pcmu_srtp80_with_auth},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002372#endif
2373#if PJMEDIA_HAS_G722_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002374 { "stream TX/RX - G.722", OP_PUT_GET, K16, &create_stream_g722},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002375#endif
2376#if PJMEDIA_HAS_GSM_CODEC
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002377 { "stream TX/RX - GSM", OP_PUT_GET, K8, &create_stream_gsm},
2378 { "stream TX/RX - GSM SRTP 32bit", OP_PUT_GET, K8, &create_stream_gsm_srtp32_no_auth},
2379 { "stream TX/RX - GSM SRTP 32bit + auth", OP_PUT_GET, K8, &create_stream_gsm_srtp32_with_auth},
2380 { "stream TX/RX - GSM SRTP 80bit", OP_PUT_GET, K8, &create_stream_gsm_srtp80_no_auth},
2381 { "stream TX/RX - GSM SRTP 80bit + auth", OP_PUT_GET, K8, &create_stream_gsm_srtp80_with_auth},
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002382#endif
2383#if PJMEDIA_HAS_G7221_CODEC
2384 { "stream TX/RX - G.722.1", OP_PUT_GET, K16, &create_stream_g7221},
2385 { "stream TX/RX - G.722.1c", OP_PUT_GET, K32, &create_stream_g7221c},
2386#endif
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002387 };
Nanang Izzuddin7d8043a2009-04-15 17:56:17 +00002388
2389 unsigned i, c, k[3] = {K8, K16, K32}, clock_rates[3] = {8000, 16000, 32000};
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002390
Benny Prijonob1f62f42008-07-04 23:43:10 +00002391 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 +00002392 PJ_LOG(3,(THIS_FILE, "Clock Item Time CPU MIPS"));
2393 PJ_LOG(3,(THIS_FILE, " Rate (usec) (%%) "));
2394 PJ_LOG(3,(THIS_FILE, "----------------------------------------------------------------------"));
2395
2396 for (c=0; c<PJ_ARRAY_SIZE(clock_rates); ++c) {
2397 for (i=0; i<PJ_ARRAY_SIZE(entries); ++i) {
2398 enum
2399 {
2400 RETRY = 5, /* number of test retries */
2401 };
2402 struct test_entry *e = &entries[i];
2403 pj_timestamp times[RETRY], tzero;
2404 int usec;
2405 float cpu_pct, mips;
2406 unsigned j, clock_rate = clock_rates[c];
2407
2408 if ((e->valid_clock_rate & k[c]) == 0)
2409 continue;
2410
2411 /* Run test */
2412 for (j=0; j<RETRY; ++j) {
2413 pj_thread_sleep(1);
2414 times[j] = run_entry(clock_rate, e);
2415 }
2416
2417 /* Sort ascending */
2418 for (j=0; j<RETRY; ++j) {
2419 unsigned k;
2420 for (k=j+1; k<RETRY; ++k) {
2421 if (times[k].u64 < times[j].u64) {
2422 pj_timestamp tmp = times[j];
2423 times[j] = times[k];
2424 times[k] = tmp;
2425 }
2426 }
2427 }
2428
2429 /* Calculate usec elapsed as average of two best times */
2430 tzero.u32.hi = tzero.u32.lo = 0;
2431 usec = (pj_elapsed_usec(&tzero, &times[0]) +
2432 pj_elapsed_usec(&tzero, &times[1])) / 2;
2433
Benny Prijono0ceb87d2008-08-13 18:21:03 +00002434 usec = usec / (DURATION / 1000);
2435
Benny Prijonob1f62f42008-07-04 23:43:10 +00002436 mips = (float)(CPU_IPS * usec / 1000000.0 / 1000000);
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002437 cpu_pct = (float)(100.0 * usec / 1000000);
Benny Prijonob1f62f42008-07-04 23:43:10 +00002438 PJ_LOG(3,(THIS_FILE, "%2dKHz %-38s % 8d %8.3f %7.2f",
Benny Prijono0ff56dc2008-07-04 16:45:17 +00002439 clock_rate/1000, e->title, usec, cpu_pct, mips));
2440
2441 }
2442 }
2443
2444 return 0;
2445}
2446
2447
2448