3 mediastreamer2 library - modular sound and video processing and streaming
4 Copyright (C) 2006 Simon MORLAT (simon.morlat@linphone.org)
6 This program is free software; you can redistribute it and/or
7 modify it under the terms of the GNU General Public License
8 as published by the Free Software Foundation; either version 2
9 of the License, or (at your option) any later version.
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.
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.
22 #include "mediastreamer2/msticker.h"
24 #include "mediastreamer2/msrtp.h"
25 #include "mediastreamer2/msfileplayer.h"
26 #include "mediastreamer2/msfilerec.h"
30 #define MAX_RTP_SIZE 1500
34 static void stop(int signum){
52 int num_session_record;
64 MSList *tsessions; /* list of struct test_session */
67 #define NUM_SESSION 50 /* num of session to start per block */
68 #define NUM_SESSION_RECORD 1
70 struct bench_config cfg[] = {
71 { NUM_SESSION,NUM_SESSION_RECORD,
72 8000,"127.0.0.1",9000,8,8000,20,"test1.wav",NULL,NULL },
73 { NUM_SESSION,NUM_SESSION_RECORD,
74 9000,"127.0.0.1",8000,8,8000,20,"test1.wav",NULL,NULL },
76 { NUM_SESSION,NUM_SESSION_RECORD,
77 10000,"127.0.0.1",11000,8,8000,20,"test1.wav",NULL,NULL },
78 { NUM_SESSION,NUM_SESSION_RECORD,
79 11000,"127.0.0.1",10000,8,8000,20,"test1.wav",NULL,NULL },
81 { 0,0,0,'\0',0,0,0,0,NULL,NULL,NULL },
84 RtpSession *create_duplex_rtpsession(int locport){
86 rtpr=rtp_session_new(RTP_SESSION_SENDRECV);
87 rtp_session_set_recv_buf_size(rtpr,MAX_RTP_SIZE);
88 rtp_session_set_scheduling_mode(rtpr,0);
89 rtp_session_set_blocking_mode(rtpr,0);
90 rtp_session_enable_adaptive_jitter_compensation(rtpr,FALSE);
91 rtp_session_set_symmetric_rtp(rtpr,TRUE);
92 rtp_session_set_local_addr(rtpr,"0.0.0.0",locport);
93 rtp_session_signal_connect(rtpr,"timestamp_jump",(RtpCallback)rtp_session_resync,(long)NULL);
94 rtp_session_signal_connect(rtpr,"ssrc_changed",(RtpCallback)rtp_session_resync,(long)NULL);
98 int init_bench(struct bench_config *bench)
104 bench->ticker=ms_ticker_new();
107 /* creates the couple of encoder/decoder */
108 pt=rtp_profile_get_payload(&av_profile,bench->payload);
110 ms_error("audiostream.c: undefined payload type.");
113 if (pt->clock_rate!=8000 && pt->clock_rate!=16000 && pt->clock_rate!=32000){
114 ms_error("audiostream.c: wrong rate.");
117 for (pos=0;pos<bench->num_session;pos++)
119 struct test_session *ts = (struct test_session *)ortp_malloc(sizeof(struct test_session));
120 memset(ts, 0, sizeof(struct test_session));
122 ts->rtps = create_duplex_rtpsession(bench->port_origin+pos*2);
125 ms_error("bench.c: cannot create rtp_session!");
130 rtp_session_set_payload_type(ts->rtps,bench->payload);
131 rtp_session_set_remote_addr_full(ts->rtps,
132 bench->ip_destination,
133 bench->port_destination+pos*2,
134 bench->port_destination+1+pos*2);
136 ts->fplayer = ms_filter_new(MS_FILE_PLAYER_ID);
137 if (strstr(bench->wavfile, ".au")==NULL)
138 ts->encoder = ms_filter_create_encoder(pt->mime_type);
139 ts->rtpsend = ms_filter_new(MS_RTP_SEND_ID);
141 ts->rtprecv = ms_filter_new(MS_RTP_RECV_ID);
142 ts->decoder = ms_filter_create_decoder(pt->mime_type);
143 ts->frecorder = ms_filter_new(MS_FILE_REC_ID);
145 if ((ts->encoder==NULL && strstr(bench->wavfile, ".au")==NULL)
146 || (ts->decoder==NULL )){
147 ms_error("bench.c: No decoder available for payload %i.",bench->payload);
148 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
149 if (ts->encoder) ms_filter_destroy(ts->encoder);
150 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
151 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
152 if (ts->decoder) ms_filter_destroy(ts->decoder);
153 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
157 if (ts->fplayer==NULL){
158 ms_error("bench.c: missing player filter.");
159 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
160 if (ts->encoder) ms_filter_destroy(ts->encoder);
161 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
162 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
163 if (ts->decoder) ms_filter_destroy(ts->decoder);
164 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
168 if (ts->frecorder==NULL){
169 ms_error("bench.c: missing recorder filter.");
170 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
171 if (ts->encoder) ms_filter_destroy(ts->encoder);
172 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
173 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
174 if (ts->decoder) ms_filter_destroy(ts->decoder);
175 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
179 if (ts->rtpsend==NULL){
180 ms_error("bench.c: missing rtpsend filter.");
181 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
182 if (ts->encoder) ms_filter_destroy(ts->encoder);
183 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
184 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
185 if (ts->decoder) ms_filter_destroy(ts->decoder);
186 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
190 if (ts->rtprecv==NULL){
191 ms_error("bench.c: missing rtprecv filter.");
192 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
193 if (ts->encoder) ms_filter_destroy(ts->encoder);
194 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
195 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
196 if (ts->decoder) ms_filter_destroy(ts->decoder);
197 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
202 ms_filter_call_method(ts->rtpsend,MS_RTP_SEND_SET_SESSION,ts->rtps);
203 ms_filter_call_method(ts->rtprecv,MS_RTP_RECV_SET_SESSION,ts->rtps);
205 ms_filter_call_method (ts->rtprecv, MS_FILTER_SET_SAMPLE_RATE,
208 ms_filter_call_method (ts->frecorder, MS_FILTER_SET_SAMPLE_RATE,
211 val = ms_filter_call_method(ts->fplayer,MS_FILE_PLAYER_OPEN,(void*)bench->wavfile);
214 ms_error("bench.c: Cannot open wav file (%s)", bench->wavfile);
215 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
216 if (ts->encoder) ms_filter_destroy(ts->encoder);
217 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
218 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
219 if (ts->decoder) ms_filter_destroy(ts->decoder);
220 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
226 ms_filter_call_method (ts->fplayer, MS_FILTER_GET_SAMPLE_RATE,
228 if (val!=pt->clock_rate)
230 ms_error("bench.c: unsupported rate for wav file: codec=%i / file=%i",
231 pt->clock_rate, val);
232 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
233 if (ts->encoder) ms_filter_destroy(ts->encoder);
234 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
235 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
236 if (ts->decoder) ms_filter_destroy(ts->decoder);
237 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
241 ms_filter_call_method (ts->fplayer, MS_FILTER_GET_NCHANNELS,
246 ms_error("bench.c: unsupported number of channel for wav file: codec=1 / file=%i",
248 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
249 if (ts->encoder) ms_filter_destroy(ts->encoder);
250 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
251 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
252 if (ts->decoder) ms_filter_destroy(ts->decoder);
253 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
257 ms_filter_call_method_noarg(ts->fplayer,MS_FILE_PLAYER_START);
259 if (strstr(bench->wavfile, ".au")==NULL)
261 ms_filter_link(ts->fplayer,0,ts->encoder,0);
262 ms_filter_link(ts->encoder,0,ts->rtpsend,0);
266 ms_filter_link(ts->fplayer,0,ts->rtpsend,0);
269 ms_filter_link(ts->rtprecv,0,ts->decoder,0);
270 ms_filter_link(ts->decoder,0,ts->frecorder,0);
272 ms_ticker_attach(bench->ticker,ts->fplayer);
273 ms_ticker_attach(bench->ticker,ts->rtprecv);
275 if (pos < bench->num_session_record)
278 snprintf(rec_file, sizeof(rec_file), "rec_%s_%i.wav",
279 bench->ip_destination,
280 bench->port_destination+pos*2);
281 ms_filter_call_method(ts->frecorder,MS_FILE_REC_OPEN,(void*)rec_file);
282 ms_filter_call_method_noarg(ts->frecorder,MS_FILE_REC_START);
285 bench->tsessions = ms_list_append(bench->tsessions, (void*)ts);
292 static int uninit_bench(struct bench_config *bench)
295 for(it=bench->tsessions;it!=NULL;it=bench->tsessions){
296 struct test_session *ts = (struct test_session *)it->data;
297 bench->tsessions = ms_list_remove_link(bench->tsessions, it);
299 ms_ticker_detach(bench->ticker,ts->fplayer);
300 ms_ticker_detach(bench->ticker,ts->rtprecv);
302 ms_filter_call_method_noarg(ts->frecorder,MS_FILE_REC_CLOSE);
304 if (strstr(bench->wavfile, ".au")==NULL)
306 ms_filter_unlink(ts->fplayer,0,ts->encoder,0);
307 ms_filter_unlink(ts->encoder,0,ts->rtpsend,0);
311 ms_filter_unlink(ts->fplayer,0,ts->rtpsend,0);
314 ms_filter_unlink(ts->rtprecv,0,ts->decoder,0);
315 ms_filter_unlink(ts->decoder,0,ts->frecorder,0);
317 if (ts->fplayer) ms_filter_destroy(ts->fplayer);
318 if (ts->encoder) ms_filter_destroy(ts->encoder);
319 if (ts->rtpsend) ms_filter_destroy(ts->rtpsend);
321 if (ts->rtprecv) ms_filter_destroy(ts->rtprecv);
322 if (ts->decoder) ms_filter_destroy(ts->decoder);
323 if (ts->frecorder) ms_filter_destroy(ts->frecorder);
328 ms_ticker_destroy(bench->ticker);
333 int main(int argc, char *argv[]){
337 ortp_set_log_level_mask(ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
339 rtp_profile_set_payload(&av_profile,115,&payload_type_lpc1015);
340 rtp_profile_set_payload(&av_profile,110,&payload_type_speex_nb);
341 rtp_profile_set_payload(&av_profile,111,&payload_type_speex_wb);
342 rtp_profile_set_payload(&av_profile,112,&payload_type_ilbc);
347 for (pos=0;cfg[pos].num_session!=0;pos++)
349 count = count + init_bench(&cfg[pos]);
353 ms_message("Number of session started: %i.", count);
358 for (pos=0;cfg[pos].num_session!=0;pos++)
360 uninit_bench(&cfg[pos]);