00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include "ortp/rtpsession.h"
00028 #include "ortp/payloadtype.h"
00029 #include "ortp/ortp.h"
00030 #include "utils.h"
00031 #include <math.h>
00032
00033 #define JC_BETA 0.03
00034 #define JC_GAMMA (JC_BETA)
00035
00036 #include "jitterctl.h"
00037
00038 void jitter_control_init(JitterControl *ctl, int base_jiitt_time, PayloadType *payload){
00039 ctl->count=0;
00040 ctl->slide=0;
00041 ctl->jitter=0;
00042 ctl->inter_jitter=0;
00043 ctl->slide=0;
00044 if (base_jiitt_time!=-1) ctl->jitt_comp = base_jiitt_time;
00045
00046 if (payload!=NULL){
00047 jitter_control_set_payload(ctl,payload);
00048 }
00049 ctl->adapt_jitt_comp_ts=ctl->jitt_comp_ts;
00050 ctl->corrective_slide=0;
00051 }
00052
00053 void jitter_control_enable_adaptive(JitterControl *ctl, bool_t val){
00054 ctl->adaptive=val;
00055 }
00056
00057 void jitter_control_set_payload(JitterControl *ctl, PayloadType *pt){
00058 ctl->jitt_comp_ts =
00059 (int) (((double) ctl->jitt_comp / 1000.0) * (pt->clock_rate));
00060 ctl->corrective_step=(160 * 8000 )/pt->clock_rate;
00061 ctl->adapt_jitt_comp_ts=ctl->jitt_comp_ts;
00062 }
00063
00064
00065 void jitter_control_dump_stats(JitterControl *ctl){
00066 ortp_message("JitterControl:\n\tslide=%g,jitter=%g,count=%i",
00067 ctl->slide,ctl->jitter, ctl->count);
00068 }
00069
00070
00071 void jitter_control_update_corrective_slide(JitterControl *ctl){
00072 int tmp;
00073 tmp=(int)(ctl->slide)-ctl->corrective_slide;
00074 if (tmp>ctl->corrective_step) ctl->corrective_slide+=ctl->corrective_step;
00075 else if (tmp<-ctl->corrective_step) ctl->corrective_slide-=ctl->corrective_step;
00076 }
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086 void jitter_control_new_packet(JitterControl *ctl, uint32_t packet_ts, uint32_t cur_str_ts, int32_t * slide, int32_t *safe_delay){
00087 int diff=packet_ts - cur_str_ts;
00088 float gap;
00089 int d;
00090
00091
00092 ctl->count++;
00093 ctl->slide= (float) ((ctl->slide*(1-JC_BETA)) + ((float)diff*JC_BETA));
00094 gap=(float) fabs((float)diff - ctl->slide);
00095 ctl->jitter=(float) ((ctl->jitter*(1-JC_GAMMA)) + (gap*JC_GAMMA));
00096 d=diff-ctl->olddiff;
00097 ctl->inter_jitter=(float) (ctl->inter_jitter+ (( (float)abs(d) - ctl->inter_jitter)*(1/16.0)));
00098 ctl->olddiff=diff;
00099 if (ctl->adaptive){
00100 if (ctl->count%50==0) {
00101
00102 }
00103
00104
00105
00106 ctl->adapt_jitt_comp_ts=(int) MAX(ctl->jitt_comp_ts,ctl->jitter);
00107
00108 *slide=(int32_t)ctl->slide;
00109 *safe_delay=(int32_t)ctl->adapt_jitt_comp_ts;
00110 }else {
00111 *slide=0;
00112 *safe_delay=(int32_t)ctl->jitt_comp_ts;
00113 }
00114 return ;
00115 }
00116
00117
00126 void
00127 rtp_session_set_jitter_compensation (RtpSession * session, int milisec)
00128 {
00129 PayloadType *payload=NULL;
00130 if (session->rcv.pt!=-1) {
00131 payload = rtp_profile_get_payload (session->rcv.profile,session->rcv.pt);
00132 }
00133 jitter_control_init(&session->rtp.jittctl,milisec,payload);
00134 }
00135
00136 void rtp_session_enable_adaptive_jitter_compensation(RtpSession *session, bool_t val){
00137 jitter_control_enable_adaptive(&session->rtp.jittctl,val);
00138 }
00139
00140 bool_t rtp_session_adaptive_jitter_compensation_enabled(RtpSession *session){
00141 return session->rtp.jittctl.adaptive;
00142 }