Make sure that full video frames are sent whenever the 15 bit timestamp rolls over.

(closes issue #11923)
Reported by: mihai
Patches:
      asterisk-fullvideo.patch uploaded by mihai (license 94)


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@111014 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.4
Joshua Colp 17 years ago
parent 7bd42528de
commit af904bf602

@ -480,6 +480,8 @@ struct chan_iax2_pvt {
unsigned int last; unsigned int last;
/*! Last sent timestamp - never send the same timestamp twice in a single call */ /*! Last sent timestamp - never send the same timestamp twice in a single call */
unsigned int lastsent; unsigned int lastsent;
/*! Timestamp of the last video frame sent */
unsigned int lastvsent;
/*! Next outgoing timestamp if everything is good */ /*! Next outgoing timestamp if everything is good */
unsigned int nextpred; unsigned int nextpred;
/*! True if the last voice we transmitted was not silence/CNG */ /*! True if the last voice we transmitted was not silence/CNG */
@ -3785,6 +3787,17 @@ static unsigned int calc_timestamp(struct chan_iax2_pvt *p, unsigned int ts, str
p->nextpred = ms; p->nextpred = ms;
p->notsilenttx = 1; 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 { } else {
/* On a dataframe, use last value + 3 (to accomodate jitter buffer shrinking) if appropriate unless /* On a dataframe, use last value + 3 (to accomodate jitter buffer shrinking) if appropriate unless
it's a genuine frame */ it's a genuine frame */
@ -4154,11 +4167,22 @@ static int iax2_send(struct chan_iax2_pvt *pvt, struct ast_frame *f, unsigned in
/* Mark that mini-style frame is appropriate */ /* Mark that mini-style frame is appropriate */
sendmini = 1; sendmini = 1;
} }
if (((fts & 0xFFFF8000L) == (lastsent & 0xFFFF8000L)) && if ( f->frametype == AST_FRAME_VIDEO ) {
(f->frametype == AST_FRAME_VIDEO) && /*
((f->subclass & ~0x1) == pvt->svideoformat)) { * 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; now = 1;
sendmini = 1; sendmini = 1;
} else {
now = 0;
sendmini = 0;
}
pvt->lastvsent = fts;
} }
/* Allocate an iax_frame */ /* Allocate an iax_frame */
if (now) { if (now) {

Loading…
Cancel
Save