static void * outboud_simulator_thread(void *ctx){ RtpSession *session=(RtpSession*)ctx; OrtpNetworkSimulatorCtx *sim=session->net_sim_ctx; ortpTimeSpec sleep_until; set_high_prio(); while(sim->thread_started){ sleep_until.tv_sec=0; sleep_until.tv_nsec=0; rtp_session_schedule_outbound_network_simulator(session, &sleep_until); if (sleep_until.tv_sec!=0) ortp_sleep_until(&sleep_until); else ortp_sleep_ms(1); } return NULL; }
static int wait_next_tick(void *data, uint64_t virt_ticker_time){ MSTicker *s=(MSTicker*)data; uint64_t realtime; int64_t diff; int late; while(1){ realtime=s->get_cur_time_ptr(s->get_cur_time_data)-s->orig; diff=s->time-realtime; if (diff>0){ /* sleep until next tick */ ortp_sleep_ms((int)diff); }else{ late=(int)-diff; break; /*exit the while loop */ } } return late; }
int main(int argc, char *argv[]) { RtpSession *session; unsigned char buffer[160]; int i; FILE *infile; char *ssrc; uint32_t user_ts=0; int clockslide=0; int jitter=0; if (argc<4){ printf("%s", help); return -1; } for(i=4;i<argc;i++){ if (strcmp(argv[i],"--with-clockslide")==0){ i++; if (i>=argc) { printf("%s", help); return -1; } clockslide=atoi(argv[i]); ortp_message("Using clockslide of %i milisecond every 50 packets.",clockslide); }else if (strcmp(argv[i],"--with-jitter")==0){ ortp_message("Jitter will be added to outgoing stream."); i++; if (i>=argc) { printf("%s", help); return -1; } jitter=atoi(argv[i]); } } ortp_init(); ortp_scheduler_init(); ortp_set_log_level_mask(NULL, ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR); session=rtp_session_new(RTP_SESSION_SENDONLY); rtp_session_set_scheduling_mode(session,1); rtp_session_set_blocking_mode(session,1); rtp_session_set_connected_mode(session,TRUE); rtp_session_set_remote_addr(session,argv[2],atoi(argv[3])); rtp_session_set_payload_type(session,0); ssrc=getenv("SSRC"); if (ssrc!=NULL) { printf("using SSRC=%i.\n",atoi(ssrc)); rtp_session_set_ssrc(session,atoi(ssrc)); } #ifndef _WIN32 infile=fopen(argv[1],"r"); #else infile=fopen(argv[1],"rb"); #endif if (infile==NULL) { perror("Cannot open file"); return -1; } signal(SIGINT,stophandler); while( ((i=fread(buffer,1,160,infile))>0) && (runcond) ) { rtp_session_send_with_ts(session,buffer,i,user_ts); user_ts+=160; if (clockslide!=0 && user_ts%(160*50)==0){ ortp_message("Clock sliding of %i miliseconds now",clockslide); rtp_session_make_time_distorsion(session,clockslide); } /*this will simulate a burst of late packets */ if (jitter && (user_ts%(8000)==0)) { ortp_message("Simulating late packets now (%i milliseconds)",jitter); ortp_sleep_ms(jitter); } } fclose(infile); rtp_session_destroy(session); ortp_exit(); ortp_global_stats_display(); return 0; }