MSQosAnalyzer * ms_simple_qos_analyzer_new(RtpSession *session){ MSSimpleQosAnalyzer *obj=ms_new0(MSSimpleQosAnalyzer,1); obj->session=session; obj->parent.desc=&simple_analyzer_desc; obj->parent.type=Simple; obj->lre=ortp_loss_rate_estimator_new(LOSS_RATE_MIN_INTERVAL, rtp_session_get_seq_number(session)); return (MSQosAnalyzer*)obj; }
void ortp_loss_rate_estimator_init(OrtpLossRateEstimator *obj, int min_packet_count_interval, uint64_t min_time_ms_interval, RtpSession *session){ memset(obj,0,sizeof(*obj)); obj->min_packet_count_interval=min_packet_count_interval; obj->last_ext_seq=rtp_session_get_seq_number(session); obj->last_cum_loss=rtp_session_get_cum_loss(session); obj->last_packet_sent_count=session->stats.packet_sent; obj->last_dup_packet_sent_count=session->stats.packet_dup_sent; obj->min_time_ms_interval=min_time_ms_interval; obj->last_estimate_time_ms=(uint64_t)-1; }
static void stateful_analyzer_update(MSQosAnalyzer *objbase){ MSStatefulQosAnalyzer *obj=(MSStatefulQosAnalyzer*)objbase; static time_t last_measure; /* Every seconds, save the bandwidth used. This is needed to know how much bandwidth was used when receiving a receiver report. Since the report contains the "last sequence number", it allows us to precisely know which interval to consider */ if (last_measure != ms_time(0)){ obj->upload_bandwidth_count++; obj->upload_bandwidth_sum+=rtp_session_get_send_bandwidth(obj->session)/1000.0; /* Save bandwidth used at this time */ obj->upload_bandwidth[obj->upload_bandwidth_cur].seq_number = rtp_session_get_seq_number(obj->session); obj->upload_bandwidth[obj->upload_bandwidth_cur].up_bandwidth = rtp_session_get_send_bandwidth(obj->session)/1000.0; obj->upload_bandwidth_cur = (obj->upload_bandwidth_cur+1)%BW_HISTORY; } last_measure = ms_time(0); if (obj->burst_duration_ms>0){ switch (obj->burst_state){ case MSStatefulQosAnalyzerBurstEnable:{ obj->burst_state=MSStatefulQosAnalyzerBurstInProgress; ortp_gettimeofday(&obj->start_time, NULL); rtp_session_set_duplication_ratio(obj->session, obj->burst_ratio); } case MSStatefulQosAnalyzerBurstInProgress: { struct timeval now; float elapsed; ortp_gettimeofday(&now,NULL); elapsed=((now.tv_sec-obj->start_time.tv_sec)*1000.0) + ((now.tv_usec-obj->start_time.tv_usec)/1000.0); if (elapsed > obj->burst_duration_ms){ obj->burst_state=MSStatefulQosAnalyzerBurstDisable; rtp_session_set_duplication_ratio(obj->session, 0); } } case MSStatefulQosAnalyzerBurstDisable: { } } } }