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