Summary:ASTERISK-08310: [patch] DTMF fails and one-way-audio after negative timestamp.
Reporter:Harmen van der Wal (harmen)Labels:
Date Opened:2006-12-08 06:40:49.000-0600Date Closed:2007-01-25 13:25:23.000-0600
Versions:Frequency of
Environment:Attachments:( 0) jb_next.patch
Description:Frames with a negative timestamp can not be dequeued from the
jitterbuffer. Subsequent frames then get stuck behind this frame
too, resulting in DTMF not working or one-way-audio.

This can happen with the following setup:
iaxclient -> asterisk #1 -> asterisk #2,
where asterisk #1 and asterisk #2 both use a (new style)
jitterbuffer. The frames with a negative timestamp originate on
asterisk #1 and become stuck in the jitterbuffer queue on asterisk #2.

Two solutions come to mind:

1) Don't send frames with a negative timestamp.

calc_timestamp@chan_iax2.c calculates the timestamp by taking the difference of the delivery time and the channel offset. Early on in the call this can lead to negative values (which show up in the log as big positive numbers, because they are formatted unsigned).

Tx-Frame Retry[000] -- OSeqno: 001 ISeqno: 001 Type: VOICE   Subclass: 2
  Timestamp: 4294967122ms  SCall: 00002  DCall: 00001 []
Rx-Frame Retry[ No] -- OSeqno: 001 ISeqno: 002 Type: IAX     Subclass: ACK
  Timestamp: 4294967122ms  SCall: 00001  DCall: 00002 []

I guess delivery time is set by the sender and the channel offset is set by the receiver at a slightly later time. I am not quite sure if this is a bug. Besides for the jitterbuffer, the negative timestamps don't appear to cause problems, as far as I can tell.

2) Do dequeue frames with a negative timestamp.

See the attached jb_next.patch.

Queue_next and queue_last@jitterbuffer.c return a timestamp or -1 if the queue is empty. This doesn't work if the timestamp can be -1. Perhaps the timestamp is better modified as an argument pointer, but I don't think it causes problems besides for jb_next.

This the same bug as http://bugs.digium.com/view.php?id=6011.


To consistently reproduce the DTMF problem I made the following
changes to an else default configuration.

asterisk #1 (


exten => 608,1,Dial(IAX2/guest@

asterisk #2 (


Use iaxclient (wx) to call asterisk #1. Hear the demo congratulations
on the asterisk #1. Dial 608 on the dialpad. Hear the demo congratulations
on the asterisk #2. Dial any extension. The DTMF frames are received
on asterisk #2 but do not work.
To consistently reproduce the one-way-audio problem I used the following.

asterisk #1 (


exten => 604,1,Dial(IAX2/guest@||gt)
exten => 604,n,agi(agi://
exten => 604,n,Dial(IAX2/guest@||gt)

asterisk #2 (


exten => 601,1,Playback(demo-echotest);
exten => 602,1,Echo

Run ~/src/asterisk-1.2/agi/fastagi-test

Use iaxclient (wx) to call asterisk #1. Hear the demo
congratulations. Dial extension 604. Hear the demo echo test message
from asterisk #2. Hear the fast-agi test. Try the echo test. It fails.

Comments:By: Nic Bellamy (nic_bellamy) 2006-12-10 15:39:06.000-0600

Related question to this - where are the large timestamps coming from?

I did a search through captures of about 1,500 call-hours of production traffic, and found SIP->IAX2->SIP calls where this happened.

Here's an example:

Mini voice frames are flowing fine, then a full voice packet (line 6) is sent with a whacky timestamp.

This timestamp is interesting:

5       268.346780 -> IAX2 Mini packet, source call# 2, timestamp 34545ms, iLBC Free Compression
6       268.366713 -> IAX2 Voice, source call# 2, timestamp 3758130959ms, iLBC Free Compression
7       268.378125 ->  IAX2 Mini packet, source call# 26, timestamp 34576ms, iLBC Free Compression

Some quick calculations...:

3758130959 = 0xe000870f

0xe000870f - 0xe000000 = 0x870f = 34575

Ie. it appears the three high bits are getting set in the timestamp, in that when you take them off, the timestamp looks perfectly sane again.

Asterisk FYI - too many other things break for us with anything more recent (mainly just waiting on ASTERISK-7849 now).

By: Harmen van der Wal (harmen) 2006-12-11 08:30:22.000-0600

Hm, it appears my "large" timestamps are of a different kind. In my case they're
really small negatives. For instance when delivery = 1165841516sec+988882usec and offset = 1165841517sec+40000usec then the the timestamp is -52.
Because printf("Timestamp: %05lums\n", -52) prints 4294967244ms the log shows:

Tx-Frame Retry[000] -- OSeqno: 001 ISeqno: 001 Type: VOICE   Subclass: 2
  Timestamp: 4294967244ms  SCall: 00002  DCall: 00001 []

I can't explain the three high bits though. I wonder if and how threy're related.

By: Harmen van der Wal (harmen) 2006-12-19 07:57:56.000-0600

I forgot to mention one detail required to reproduce the problem: asterisk #1 and #2 need to be configured for different codecs, or the problem will not occur.

asterisk #1

asterisk #2

The result will be:

   -- IAX2/ answered IAX2/
   -- Attempting native bridge of IAX2/ and IAX2/
   -- Operating with different codecs 2[0x2 (gsm)] 1024[0x400 (ilbc)] , can't native bridge...

By: jeff oconnell (jeff_oconnell) 2006-12-19 23:18:42.000-0600


you marked this as having a closed duplicate ( bug 0006011 ).
does that mean this report ( and  the patch ) won't be considered?

i'm going to do some real-world testing with harmen's patch soon,
and can speed up my test schedule if that'll help get the patch applied.

By: Serge Vecher (serge-v) 2006-12-26 14:41:26.000-0600

jeff_oconnell: successful tests, preferably from several reporters, do help get patches in...

By: Anthony LaMantia (alamantia) 2007-01-05 16:40:05.000-0600

has anyone tested this code?

By: jeff oconnell (jeff_oconnell) 2007-01-07 12:31:16.000-0600

alamantia: i'll be testing this code this week.

By: Joshua C. Colp (jcolp) 2007-01-25 13:25:22.000-0600

Fixed in 1.2 as of revision 52264, 1.4 as of revision 52265, and trunk as of revision 52266. Thanks for the fix - it should knock out some others and your explanation was great.