Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv17874/channels

Modified Files:
        chan_iax2.c 
Log Message:
add explanatory comment about timestamp compensation (bug #4763)


Index: chan_iax2.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
retrieving revision 1.322
retrieving revision 1.323
diff -u -d -r1.322 -r1.323
--- chan_iax2.c 20 Jul 2005 22:46:58 -0000      1.322
+++ chan_iax2.c 25 Jul 2005 23:13:20 -0000      1.323
@@ -3420,11 +3420,23 @@
                if (voice) {
                        /* On a voice frame, use predicted values if 
appropriate */
                        if (p->notsilenttx && abs(ms - p->nextpred) <= 
MAX_TIMESTAMP_SKEW) {
-                               /* Adjust our txcore, keeping voice and 
-                                       non-voice synchronized */
-                               /* We need someone who understands this code to 
comment here on
-                                  why the 'adjust' value is handled as if it 
was in units
-                                  of 10,000 microseconds, instead of 
milliseconds
+                               /* Adjust our txcore, keeping voice and 
non-voice synchronized */
+                               /* AN EXPLANATION:
+                                  When we send voice, we usually send 
"calculated" timestamps worked out
+                                  on the basis of the number of samples sent. 
When we send other frames,
+                                  we usually send timestamps worked out from 
the real clock.
+                                  The problem is that they can tend to drift 
out of step because the 
+                                  source channel's clock and our clock may not 
be exactly at the same rate.
+                                  We fix this by continuously "tweaking" 
p->offset.  p->offset is "time zero"
+                                  for this call.  Moving it adjusts timestamps 
for non-voice frames.
+                                  We make the adjustment in the style of a 
moving average.  Each time we
+                                  adjust p->offset by 10% of the difference 
between our clock-derived
+                                  timestamp and the predicted timestamp.  
That's why you see "10000"
+                                  below even though IAX2 timestamps are in 
milliseconds.
+                                  The use of a moving average avoids offset 
moving too radically.
+                                  Generally, "adjust" roams back and forth 
around 0, with offset hardly
+                                  changing at all.  But if a consistent 
different starts to develop it
+                                  will be eliminated over the course of 10 
frames (200-300msecs) 
                                */
                                adjust = (ms - p->nextpred);
                                if (adjust < 0)

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to