linphone-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Linphone-users] 2 receivers with 2 threads fails to catch packtes


From: Simon Morlat
Subject: Re: [Linphone-users] 2 receivers with 2 threads fails to catch packtes
Date: Wed, 21 Apr 2010 17:26:38 +0200

Hi,

If you have one thread per receiver session, you should not use the
session_set api, but use basic receivers as in tests/rtprecv.c.
The two RtpSession objects are independant.

Simon

Le dimanche 18 avril 2010 à 12:06 +0000, Iban Lopetegi Zinkunegi a
écrit :
> Hi all,
> 
> I am trying to use ortp libraries with multiple threads, in other
> words, one thread would just send or receive. I have two rtp receivers
> (2 threads) and one sender (1 thread), which makes in total 3 threads.
> The problem lies on the receivers. I have checked with wireshark that
> the packets correctly arrive to the server (the right port and ip),
> BUT unfortunaly sometimes (almost randomly) one of the receivers gets
> only 2 or 3 packets and then does not capture any more packets (see
> logs at the end). I am using a slight variation of
> rtp_session_recv_with_ts(at the end of the post) in order to capture
> the sequence number of the packet.If I use a single receiver always
> works perfectly, it is only when I have both of them that it fails.  
> 
> can anybody tell what is happening? What i am doing wrong?
> 
> Below parts of the program, thanks
> 
> /*----------------*/
> /*--Main Program--*/
> 
> ortp_init();
> ortp_scheduler_init();
> ...
> pthread_create (&pid_rtp_sender, NULL, &send_rtp, NULL);
> pthread_create (&pid_rtp_receivera, NULL, &receive_rtpa, NULL);
> pthread_create (&pid_rtp_receiverb, NULL, &receive_rtpb, NULL);
> 
> wait until finished.
> 
> /*-------------*/
> /*sender thread*/
> 
> send_session_set=session_set_new();
> session=rtp_session_new(RTP_SESSION_SENDONLY);
> rtp_session_set_scheduling_mode(session,1);
> rtp_session_set_blocking_mode(session,0);
> rtp_session_set_symmetric_rtp(session,FALSE);
> rtp_session_set_local_addr (session, myip, nsrcport);
> rtp_session_set_payload_type(session,0);
> rtp_session_set_remote_addr(session,destip_local,ndestport);
> ...
> 
> while ((rc=fread(obuffer,sizeof(short),160,src))==160)
>       {
>         session_set_set(send_session_set,session);
>         session_set_select(NULL,send_session_set,NULL);
>         upcm_encode(obuffer,buffer,payloadsize);
>         if (session_set_is_set(send_session_set,session)){
>             rtp_session_send_with_ts(session,buffer_ex,rc+5,user_ts);
>         }
>          user_ts+=payloadsize;
>     }
> 
> /*----------------------------------------------------------------*/
> /*receiver_rtp A or B are simply the same but with different ports*/
> 
> recv_session_set=session_set_new();    
> session=rtp_session_new(RTP_SESSION_RECVONLY);
> rtp_session_set_scheduling_mode(session,1);
> rtp_session_set_blocking_mode(session,0);
> rtp_session_set_local_addr(session,myip,nsrcport);
> rtp_session_set_jitter_compensation(session,jittcomp);
> rtp_session_set_symmetric_rtp(session,FALSE);
> rtp_session_enable_adaptive_jitter_compensation(session,TRUE);
> rtp_session_set_payload_type(session,0);
> rtp_session_signal_connect(session,"ssrc_changed",(RtpCallback)ssrc_cb,0);
> rtp_session_signal_connect(session,"ssrc_changed",(RtpCallback)rtp_session_reset,0);
> 
> int ret;
>       /*while((runcond)||(tracker!=0))*/
>     while (runcond)
>       {
>         session_set_set(recv_session_set,session);
>         ret=session_set_select(recv_session_set,NULL,NULL);    
>         if (session_set_is_set(recv_session_set,session)){
>             have_more=1;
>               while (have_more==1)
>               {
> 
>  
> err=my_rtp_session_recv_with_ts(cseq_tmp,session,payload,payloadsize,ts,&have_more);
>                 if (err>0){
>                     printf("rxA seq %d",*cseq_tmp);
>                     *(cdnbuffer[pair].cseq_fa)=*cseq_tmp;
> 
>  memcpy(cdnbuffer[pair].buf_fa,payload,payloadsize);
>                                     
>                 }
>                 else {
>                     /*if (DEBUG) printf("rxA NOT packet c:%d",pair);*/
>                                 
>                 }
>             }    //-- while
>         }
>         ts+=payloadsize;
>       
>     }/*while(runcond)*/
> 
> /*--------------------------------*/
> /* my_rtp_session_recv_with_ts */
> 
> int my_rtp_session_recv_with_ts (int * cseq_tmp,RtpSession * session,
> uint8_t * buffer,
>                    int len, uint32_t ts, int * have_more){
>     mblk_t *mp=NULL;
>     int plen,blen=0;
>     *have_more=0;
>     rtp_header_t *hdr;
> 
>     while(1){
>         if (session->pending){
>             mp=session->pending;
>             session->pending=NULL;
>         }else {
>             mp=rtp_session_recvm_with_ts(session,ts);
>             
>             if (mp!=NULL) {
>                     hdr=(rtp_header_t*)mp->b_rptr;
>                     rtp_get_payload(mp,&mp->b_rptr);
>             }
>         }
>         if (mp){
>             //hdr=(rtp_header_t*)mp->b_rptr;
>             *cseq_tmp=hdr->seq_number;
>             //if (DEBUG)printf("csq%d",*cseq_tmp);
>             plen=mp->b_wptr-mp->b_rptr;
>             if (plen<=len){
>                 memcpy(buffer,mp->b_rptr,plen);
>                 buffer+=plen;
>                 blen+=plen;
>                 len-=plen;
>                 freemsg(mp);
>                 mp=NULL;
>             }else{
>                 memcpy(buffer,mp->b_rptr,len);
>                 mp->b_rptr+=len;
>                 buffer+=len;
>                 blen+=len;
>                 len=0;
>                 session->pending=mp;
>                 *have_more=1;
>                 break;
>             }
>         }else break;
>     }
>     return blen;
> }
> 
> Some logs from these functions when it fails look like this:
> 
> "rxA seq 14rxB seq 12 rxB seq 13 rxB seq 14 rxB seq 15 rxB seq 16 rxB
> seq 17 rxA seq 15rxB seq 18 rxB seq 19 rxB seq 20 rxB seq 21 rxB seq
> 22 rxB seq 23 rxB seq 24 rxB seq 25 rxB seq 26 rxB seq 27 rxB seq 28
> rxB seq 29 rxB seq 30 rxB seq 31 rxB seq 32 rxB seq 33 rxB seq 34 rxB
> seq 35 rxB seq 36 rxB seq 37 rxB seq 38 rxB seq 39 rxB seq 40 rxB seq
> 41 rxB seq 42 rxB seq 43 rxB seq 44 rxB seq 45 rxB seq 46 rxB seq 47
> rxB seq 48 rxB seq 49 rxB seq 50 rxB seq 51 rxB seq 52 rxB seq 53 rxB
> seq 54 rxB seq 55 rxB seq 56 rxB seq 57 rxB seq 58 rxB seq 59 rxB seq
> 60 rxB seq 61 rxB seq 62 rxB seq 63 rxB seq 64 rxB seq 65 rxB seq 66
> rxB seq 67 rxB seq 68 rxB seq 69 rxB seq 70 rxB seq 71 rxB seq 72 rxB
> seq 73 rxB seq 74 rxB seq 75 rxB seq 76 rxB seq 77 rxB seq 78 rxB seq
> 79 rxB seq 80 rxB seq 81 rxB seq 82 rxB seq 83 rxB seq 84 rxB seq 85
> rxB seq 86 rxB seq 87 rxB seq 88 rxB seq 89 rxB seq 90 rxB seq 91 rxB
> seq 92 rxB seq 93 rxB seq 94 rxB seq 95 rxB seq 96 rxB seq 97 rxB seq
> 98 rxB seq 99 rxB seq 100 rxB seq 101 rxB seq 102 rxB seq 103 rxB seq
> 104 rxB seq 105 rxB seq 106 rxB seq 107 rxB seq 108 rxB seq 109 rxB
> seq 110 rxB seq 111 rxB seq 112 rxB seq 113 rxB seq 114 rxB seq 115
> rxB seq 116 rxB seq 117 rxB seq 118 rxB seq 119 rxB seq 120 rxB seq
> 121 rxB seq 122 rxB seq 123 rxB seq 124 rxB seq 125 rxB seq 126 rxB
> seq 127 rxB seq 134 rxB seq 135 rxB seq 136 rxB seq 137 rxB seq 138
> rxB seq 139 rxB seq 140 rxB seq 141 rxB seq 143 rxB seq 144 rxB seq
> 145 rxB seq 146 rxB seq 147 rxB seq 148 rxB seq 149 rxB seq 153 rxB
> seq 154 rxB seq 155 rxB seq 156 rxB seq 157 rxB seq 158 rxB seq 159
> rxB seq 161 rxB seq 162 rxB seq 163 rxB seq 164 rxB seq 165 rxB seq
> 166 rxB seq 167 rxB seq 168 rxB seq 175 rxB seq 176 rxB seq 177 rxB
> seq 178 rxB seq 179 rxB seq 180 rxB seq 181 rxB seq 182 rxB seq 183
> rxB seq 184 rxB seq 185 rxB seq 186 rxB seq 187 rxB seq 188 rxB seq
> 189 rxB seq 191 rxB seq 192 rxB seq 193 rxB seq 194 rxB seq 195 rxB
> seq 196 rxB seq 197 rxB seq 198 rxB seq 199 rxB seq 202 rxB seq 203
> rxB seq 204 rxB seq 205 rxB seq 206 rxB seq 207 rxB ortp-message-Not
> sending rtcp report: sockfd=5, rem_addrlen=0, connected=0
> ortp-message-Not sending rtcp report: sockfd=7, rem_addrlen=0,
> connected=0
> seq 208 rxB seq 209 rxB seq 211 rxB seq 212 rxB seq 213 rxB seq 214
> rxB seq 215 rxB seq 216 rxB seq 217 rxB seq 218 rxB seq 219 rxB seq
> 225 rxB seq 226 rxB seq 227 rxB seq 228 rxB seq 229 rxB seq 230 rxB
> seq 231 rxB seq 232 rxB seq 233 rxB seq 234 rxB seq 235 rxB seq 236
> rxB seq 237 rxB seq 238 rxB seq 239 rxB seq 240 rxB seq 241 rxB seq
> 242 rxB seq 243 rxB seq 245 rxB seq 246 rxB seq 247 rxB seq 248 rxB
> seq 249 rxB seq 250 rxB seq 251 rxB seq 252 rxB seq 253 rxB seq 255
> rxB seq 256 rxB seq 257 rxB seq 258 rxB seq 259 rxB seq 260 rxB seq
> 261 rxB seq 262 rxB seq 263 rxB seq 264 rxB seq 265 rxB seq 266 rxB
> seq 267 rxB seq 268 rxB seq 269 rxB seq 270 rxB seq 271 rxB seq 272
> rxB seq 273 rxB seq 274 rxB seq 275 rxB seq 276 rxB seq 277 rxB seq
> 278 rxB seq 279 rxB seq 280 rxB seq 281 rxB seq 282 rxB seq 283 rxB
> seq 284 rxB seq 285 rxB seq 286 rxB seq 287 rxB seq 288 rxB seq 289
> rxB seq 290 rxB seq 291 rxB seq 292 rxB seq 293 rxB seq 294 rxB seq
> 295 rxB seq 296 rxB seq 297 rxB seq 298 rxB seq 299 rxB seq 300 rxB
> seq 301 rxB seq 302 rxB seq 304 rxB seq 305 rxB seq 306 rxB seq 307
> rxB seq 308 rxB seq 309 rxB seq 310 rxB seq 311 rxB seq 312 rxB seq
> 314 rxB seq 315 rxB seq 316 rxB seq 317 rxB seq 318 rxB seq 319 rxB
> seq 320 rxB seq 321 rxB seq 322 rxB seq 323 rxB seq 324 rxB seq 325
> rxB seq 326 rxB seq 327 rxB seq 328 rxB seq 329 rxB seq 330 rxB seq
> 331 rxB seq 332 rxB seq 338 rxB seq 339 rxB seq 340 rxB seq 341 rxB
> seq 342 rxB seq 343 rxB seq 344 rxB seq 345 rxB seq 346 rxB seq 347
> rxB seq 348 rxB seq 349 rxB seq 350 rxB seq 351 rxB seq 352 rxB seq
> 353 rxB seq 354 rxB seq 355 rxB seq 356 rxB seq 357 rxB seq 358 rxB
> seq 359 rxB seq 360 rxB seq 361 rxB seq 362 rxB seq 363 rxB seq 364
> rxB seq 365 rxB"
> 
> Any idea?
> 
> Thanks
> 
> 
> 
> ______________________________________________________________________
> " ¿Sabes cómo tener tus amigos de Facebook en Messenger?" Entra aquí
> _______________________________________________
> Linphone-users mailing list
> address@hidden
> http://lists.nongnu.org/mailman/listinfo/linphone-users






reply via email to

[Prev in Thread] Current Thread [Next in Thread]