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 "rtpsession_priv.h"
00032 #include <math.h>
00033
00034 #define JC_BETA 0.01
00035 #define JC_GAMMA (JC_BETA)
00036
00037 #include "jitterctl.h"
00038
00039 void jitter_control_init(JitterControl *ctl, int base_jiitt_time, PayloadType *payload){
00040 ctl->count=0;
00041 ctl->slide=0;
00042 ctl->jitter=0;
00043 ctl->inter_jitter=0;
00044 ctl->slide=0;
00045 if (base_jiitt_time!=-1) ctl->jitt_comp = base_jiitt_time;
00046
00047 if (payload!=NULL){
00048 jitter_control_set_payload(ctl,payload);
00049 }
00050 ctl->adapt_jitt_comp_ts=ctl->jitt_comp_ts;
00051 ctl->corrective_slide=0;
00052 }
00053
00054 void jitter_control_enable_adaptive(JitterControl *ctl, bool_t val){
00055 ctl->adaptive=val;
00056 }
00057
00058 void jitter_control_set_payload(JitterControl *ctl, PayloadType *pt){
00059 ctl->jitt_comp_ts =
00060 (int) (((double) ctl->jitt_comp / 1000.0) * (pt->clock_rate));
00061 ctl->corrective_step=(160 * 8000 )/pt->clock_rate;
00062 ctl->adapt_jitt_comp_ts=ctl->jitt_comp_ts;
00063 }
00064
00065
00066 void jitter_control_dump_stats(JitterControl *ctl){
00067 ortp_message("JitterControl:\n\tslide=%g,jitter=%g,count=%i",
00068 ctl->slide,ctl->jitter, ctl->count);
00069 }
00070
00071
00072 void jitter_control_update_corrective_slide(JitterControl *ctl){
00073 int tmp;
00074 tmp=(int)(ctl->slide)-ctl->corrective_slide;
00075 if (tmp>ctl->corrective_step) ctl->corrective_slide+=ctl->corrective_step;
00076 else if (tmp<-ctl->corrective_step) ctl->corrective_slide-=ctl->corrective_step;
00077 }
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087 void jitter_control_new_packet(JitterControl *ctl, uint32_t packet_ts, uint32_t cur_str_ts, int32_t * slide, int32_t *safe_delay){
00088 int diff=packet_ts - cur_str_ts;
00089 float gap;
00090 int d;
00091
00092 if (ctl->count==0){
00093 ctl->slide=diff;
00094 ctl->jitter=0;
00095 }else{
00096 ctl->slide= (float) ((ctl->slide*(1-JC_BETA)) + ((float)diff*JC_BETA));
00097 }
00098 gap=(float) fabs((float)diff - ctl->slide);
00099 ctl->jitter=(float) ((ctl->jitter*(1-JC_GAMMA)) + (gap*JC_GAMMA));
00100 d=diff-ctl->olddiff;
00101 ctl->inter_jitter=(float) (ctl->inter_jitter+ (( (float)abs(d) - ctl->inter_jitter)*(1/16.0)));
00102 ctl->olddiff=diff;
00103 ctl->count++;
00104 if (ctl->adaptive){
00105 if (ctl->count%50==0) {
00106
00107 }
00108
00109
00110
00111 ctl->adapt_jitt_comp_ts=(int) MAX(ctl->jitt_comp_ts,ctl->jitter);
00112
00113 *slide=(int32_t)ctl->slide;
00114 *safe_delay=(int32_t)ctl->adapt_jitt_comp_ts;
00115 }else {
00116 *slide=0;
00117 *safe_delay=(int32_t)ctl->jitt_comp_ts;
00118 }
00119 return ;
00120 }
00121
00122
00131 void
00132 rtp_session_set_jitter_compensation (RtpSession * session, int milisec)
00133 {
00134 PayloadType *payload=NULL;
00135 if (session->rcv.pt!=-1) {
00136 payload = rtp_profile_get_payload (session->rcv.profile,session->rcv.pt);
00137 }
00138 jitter_control_init(&session->rtp.jittctl,milisec,payload);
00139 }
00140
00141 void rtp_session_enable_adaptive_jitter_compensation(RtpSession *session, bool_t val){
00142 jitter_control_enable_adaptive(&session->rtp.jittctl,val);
00143 }
00144
00145 bool_t rtp_session_adaptive_jitter_compensation_enabled(RtpSession *session){
00146 return session->rtp.jittctl.adaptive;
00147 }
00148
00149 void rtp_session_enable_jitter_buffer(RtpSession *session, bool_t enabled){
00150 session->rtp.jittctl.enabled=enabled;
00151 session->flags|=RTP_SESSION_RECV_SYNC;
00152 }
00153
00154 bool_t rtp_session_jitter_buffer_enabled(const RtpSession *session){
00155 return session->rtp.jittctl.enabled;
00156 }
00157
00158 void rtp_session_set_jitter_buffer_params(RtpSession *session, const JBParameters *par){
00159
00160 rtp_session_set_jitter_compensation(session,par->nom_size);
00161 jitter_control_enable_adaptive(&session->rtp.jittctl,par->adaptive);
00162 }
00163
00164 void rtp_session_get_jitter_buffer_params(RtpSession *session, JBParameters *par){
00165 int nom_size=session->rtp.jittctl.jitt_comp;
00166 par->min_size=nom_size;
00167 par->nom_size=nom_size;
00168 par->max_size=-1;
00169 par->adaptive=session->rtp.jittctl.adaptive;
00170 }
00171