if (ts)
{
if ( f && session )
session->lastsent = ts;
return ts;
}
/* Otherwise calculate the timestamp from the current time */
tv = iax_tvnow();
/* Calculate the number of milliseconds since we sent the first packet */
ms = (tv.tv_sec - session->offset.tv_sec) * 1000 +
(tv.tv_usec - session->offset.tv_usec) / 1000;
if (ms < 0)
ms = 0;
if(voice) {
#ifdef USE_VOICE_TS_PREDICTION
/* If we haven't most recently sent silence, and we're
* close in time, use predicted time */
if(session->notsilenttx && abs(ms - session->nextpred) <= 240) {
/* Adjust our txcore, keeping voice and non-voice
* synchronized */
add_ms(&session->offset, (int)(ms - session->nextpred)/10);
if(!session->nextpred)
session->nextpred = ms;
ms = session->nextpred;
} else {
/* in this case, just use the actual time, since
* we're either way off (shouldn't happen), or we're
* ending a silent period -- and seed the next predicted
* time. Also, round ms to the next multiple of
* frame size (so our silent periods are multiples
* of frame size too) */
int diff = ms % (f->samples / 8);
if(diff)
ms += f->samples/8 - diff;
session->nextpred = ms;
}
session->notsilenttx = 1;
#else
if(ms <= session->lastsent)
ms = session->lastsent + 3;
#endif
} else if (video) {
if ((unsigned int)ms <= session->lastsent)
ms = session->lastsent + 3;
} else {
/* On a dataframe, use last value + 3 (to accomodate jitter buffer shrinking)
if appropriate unless it's a genuine frame */
if (genuine) {
if ((unsigned int)ms <= session->lastsent)
ms = session->lastsent + 3;
} else if (abs(ms - session->lastsent) <= 240) {
ms = session->lastsent + 3;
}
}
/* Record the last sent packet for future reference */
/* unless an AST_FRAME_IAX */