linphone-users
[Top][All Lists]
Advanced

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

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


From: Iban Lopetegi Zinkunegi
Subject: [Linphone-users] 2 receivers with 2 threads fails to catch packtes
Date: Sun, 18 Apr 2010 12:06:48 +0000

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í

reply via email to

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