00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <ortp/ortp.h>
00022 #include "jitterctl.h"
00023 #include "utils.h"
00024 #include "rtpsession_priv.h"
00025
00026 #define SSRC_CHANGED_THRESHOLD 50
00027
00028 void split_and_queue(queue_t *q, int maxrqsz, mblk_t *mp, rtp_header_t *rtp, int *discarded)
00029 {
00030 mblk_t *mdata,*tmp;
00031 int header_size;
00032 *discarded=0;
00033 header_size=RTP_FIXED_HEADER_SIZE+ (4*rtp->cc);
00034 if ((mp->b_wptr - mp->b_rptr)==header_size){
00035 ortp_debug("Rtp packet contains no data.");
00036 (*discarded)++;
00037 freemsg(mp);
00038 return;
00039 }
00040
00041 mdata=dupb(mp);
00042
00043 mp->b_wptr=mp->b_rptr+header_size;
00044 mdata->b_rptr+=header_size;
00045
00046 mp->b_cont=mdata;
00047
00048
00049 rtp_putq(q,mp);
00050
00051 while (q->q_mcount > maxrqsz)
00052 {
00053
00054 tmp=getq(q);
00055 if (mp!=NULL)
00056 {
00057 ortp_debug("rtp_putq: Queue is full. Discarding message with ts=%i",((rtp_header_t*)mp->b_rptr)->timestamp);
00058 freemsg(tmp);
00059 (*discarded)++;
00060 }
00061 }
00062 }
00063
00064 void rtp_session_rtp_parse(RtpSession *session, mblk_t *mp, uint32_t local_str_ts, struct sockaddr *addr, socklen_t addrlen)
00065 {
00066 int i;
00067 rtp_header_t *rtp;
00068 int msgsize;
00069 RtpStream *rtpstream=&session->rtp;
00070 rtp_stats_t *stats=&rtpstream->stats;
00071
00072 msgsize=mp->b_wptr-mp->b_rptr;
00073
00074 if (msgsize<RTP_FIXED_HEADER_SIZE){
00075 ortp_warning("Packet too small to be a rtp packet (%i)!",msgsize);
00076 rtpstream->stats.bad++;
00077 ortp_global_stats.bad++;
00078 freemsg(mp);
00079 return;
00080 }
00081 rtp=(rtp_header_t*)mp->b_rptr;
00082 if (rtp->version!=2)
00083 {
00084
00085 uint16_t stunlen=*((uint16_t*)(mp->b_rptr + sizeof(uint16_t)));
00086 stunlen = ntohs(stunlen);
00087 if (stunlen+20==mp->b_wptr-mp->b_rptr){
00088
00089 if (session->eventqs!=NULL){
00090 OrtpEvent *ev=ortp_event_new(ORTP_EVENT_STUN_PACKET_RECEIVED);
00091 OrtpEventData *ed=ortp_event_get_data(ev);
00092 ed->packet=mp;
00093 ed->ep=rtp_endpoint_new(addr,addrlen);
00094 rtp_session_dispatch_event(session,ev);
00095 return;
00096 }
00097 }else{
00098
00099 ortp_debug("Receiving rtp packet with version number !=2...discarded");
00100 stats->bad++;
00101 ortp_global_stats.bad++;
00102 freemsg(mp);
00103 return;
00104 }
00105 }
00106
00107
00108 ortp_global_stats.packet_recv++;
00109 stats->packet_recv++;
00110 ortp_global_stats.hw_recv+=msgsize;
00111 stats->hw_recv+=msgsize;
00112 session->rtp.hwrcv_since_last_SR++;
00113
00114
00115
00116 rtp->seq_number=ntohs(rtp->seq_number);
00117 rtp->timestamp=ntohl(rtp->timestamp);
00118 rtp->ssrc=ntohl(rtp->ssrc);
00119
00120 if (rtp->cc*sizeof(uint32_t) > (uint32_t) (msgsize-RTP_FIXED_HEADER_SIZE)){
00121 ortp_debug("Receiving too short rtp packet.");
00122 stats->bad++;
00123 ortp_global_stats.bad++;
00124 freemsg(mp);
00125 return;
00126 }
00127
00128 #ifndef PERF
00129
00130 gettimeofday(&session->last_recv_time, NULL);
00131 #endif
00132
00133 for (i=0;i<rtp->cc;i++)
00134 rtp->csrc[i]=ntohl(rtp->csrc[i]);
00135
00136
00137 if (session->ssrc_set){
00138
00139 if (session->rcv.ssrc!=rtp->ssrc){
00140 if (session->inc_ssrc_candidate==rtp->ssrc){
00141 session->inc_same_ssrc_count++;
00142 }else{
00143 session->inc_same_ssrc_count=0;
00144 session->inc_ssrc_candidate=rtp->ssrc;
00145 }
00146 if (session->inc_same_ssrc_count>SSRC_CHANGED_THRESHOLD){
00147 session->rcv.ssrc=rtp->ssrc;
00148 rtp_signal_table_emit(&session->on_ssrc_changed);
00149 }else{
00150
00151 ortp_debug("Receiving packet with unknown ssrc.");
00152 stats->bad++;
00153 ortp_global_stats.bad++;
00154 freemsg(mp);
00155 return;
00156 }
00157 }
00158 }else{
00159 session->ssrc_set=TRUE;
00160 session->rcv.ssrc=rtp->ssrc;
00161 }
00162
00163
00164 {
00165 poly32_t *extseq=(poly32_t*)&rtpstream->hwrcv_extseq;
00166 if (rtp->seq_number>extseq->split.lo){
00167 extseq->split.lo=rtp->seq_number;
00168 }else if (rtp->seq_number<200 && extseq->split.lo>((1<<16) - 200)){
00169
00170 extseq->split.lo=rtp->seq_number;
00171 extseq->split.hi++;
00172 }
00173 }
00174
00175
00176 if (rtp->paytype==session->rcv.telephone_events_pt){
00177 split_and_queue(&session->rtp.tev_rq,session->rtp.max_rq_size,mp,rtp,&i);
00178 stats->discarded+=i;
00179 ortp_global_stats.discarded+=i;
00180 return;
00181 }
00182
00183
00184
00185 if (session->hw_recv_pt!=rtp->paytype){
00186 rtp_session_update_payload_type(session,rtp->paytype);
00187 }
00188
00189 if (session->flags & RTP_SESSION_FIRST_PACKET_DELIVERED) {
00190 int32_t slide=0;
00191 int32_t safe_delay=0;
00192 jitter_control_new_packet(&session->rtp.jittctl,rtp->timestamp,local_str_ts,&slide,&safe_delay);
00193
00194 session->rtp.rcv_diff_ts=session->rtp.hwrcv_diff_ts + slide - safe_delay;
00195 ortp_debug(" rcv_diff_ts=%i", session->rtp.rcv_diff_ts);
00196
00197
00198 if (RTP_TIMESTAMP_IS_NEWER_THAN(rtp->timestamp,session->rtp.rcv_last_ts+session->rtp.ts_jump)){
00199 ortp_debug("rtp_parse: timestamp jump ?");
00200 rtp_signal_table_emit2(&session->on_timestamp_jump,(long)&rtp->timestamp);
00201 }
00202 else if (RTP_TIMESTAMP_IS_STRICTLY_NEWER_THAN(session->rtp.rcv_last_ts,rtp->timestamp)){
00203
00204
00205
00206
00207
00208 if ( RTP_TIMESTAMP_IS_STRICTLY_NEWER_THAN(session->rtp.rcv_last_ts, rtp->timestamp + session->rtp.ts_jump) ){
00209 ortp_warning("rtp_parse: negative timestamp jump");
00210 rtp_signal_table_emit2(&session->on_timestamp_jump,
00211 (long)&rtp->timestamp);
00212 }
00213 ortp_debug("rtp_parse: discarding too old packet (ts=%i)",rtp->timestamp);
00214 freemsg(mp);
00215 stats->outoftime++;
00216 ortp_global_stats.outoftime++;
00217 return;
00218 }
00219
00220 }
00221
00222 split_and_queue(&session->rtp.rq,session->rtp.max_rq_size,mp,rtp,&i);
00223 stats->discarded+=i;
00224 ortp_global_stats.discarded+=i;
00225 }