diff options
author | Joshua Colp <jcolp@digium.com> | 2008-03-26 18:42:52 +0000 |
---|---|---|
committer | Joshua Colp <jcolp@digium.com> | 2008-03-26 18:42:52 +0000 |
commit | febd162ed240dda1b21283e2b0977205da027180 (patch) | |
tree | 14cd91ed5682720c2726223108695c045aa1dd91 | |
parent | a46a5e6586ba019f684eea0e906b90340dcdd454 (diff) |
Merged revisions 110628 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4
........
r110628 | file | 2008-03-25 11:37:35 -0300 (Tue, 25 Mar 2008) | 4 lines
Add an option (transmit_silence) which transmits silence during both Record() and DTMF generation. The reason this is an option is that in order to transmit silence we have to setup a translation path. This may not be needed/wanted in all cases.
(closes issue #10058)
Reported by: tracinet
........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@111017 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_iax2.c | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 83ed68fe8..61a24c481 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -488,6 +488,8 @@ struct chan_iax2_pvt { unsigned int last; /*! Last sent timestamp - never send the same timestamp twice in a single call */ unsigned int lastsent; + /*! Timestamp of the last video frame sent */ + unsigned int lastvsent; /*! Next outgoing timestamp if everything is good */ unsigned int nextpred; /*! True if the last voice we transmitted was not silence/CNG */ @@ -4084,6 +4086,17 @@ static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, str p->nextpred = ms; p->notsilenttx = 1; } + } else if ( f->frametype == AST_FRAME_VIDEO ) { + /* + * IAX2 draft 03 says that timestamps MUST be in order. + * It does not say anything about several frames having the same timestamp + * When transporting video, we can have a frame that spans multiple iax packets + * (so called slices), so it would make sense to use the same timestamp for all of + * them + * We do want to make sure that frames don't go backwards though + */ + if ( (unsigned int)ms < p->lastsent ) + ms = p->lastsent; } else { /* On a dataframe, use last value + 3 (to accomodate jitter buffer shrinking) if appropriate unless it's a genuine frame */ @@ -4467,11 +4480,22 @@ static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned in /* Mark that mini-style frame is appropriate */ sendmini = 1; } - if (((fts & 0xFFFF8000L) == (lastsent & 0xFFFF8000L)) && - (f->frametype == AST_FRAME_VIDEO) && - ((f->subclass & ~0x1) == pvt->svideoformat)) { + if ( f->frametype == AST_FRAME_VIDEO ) { + /* + * If the lower 15 bits of the timestamp roll over, or if + * the video format changed then send a full frame. + * Otherwise send a mini video frame + */ + if (((fts & 0xFFFF8000L) == (pvt->lastvsent & 0xFFFF8000L)) && + ((f->subclass & ~0x1) == pvt->svideoformat) + ) { now = 1; sendmini = 1; + } else { + now = 0; + sendmini = 0; + } + pvt->lastvsent = fts; } /* Allocate an iax_frame */ if (now) { |