void dumprtp(int socket, int fd_dvr) { char* buf; struct rtpheader rh; int lengthData; int written; while(1) { getrtp2(socket,&rh, &buf,&lengthData); written = 0; while(written < lengthData){ written += write(fd_dvr,buf+written, lengthData-written); }//end while }//end while }// end dumprtp
// Write in a cache the rtp packet in right rtp sequence order static int rtp_cache(int fd, char *buffer, int length) { struct rtpheader rh; int newseq; char *data; unsigned short seq; static int is_first = 1; getrtp2(fd, &rh, &data, &length); if(!length) return 0; seq = rh.b.sequence; newseq = seq - rtpbuf.seq[rtpbuf.first]; if ((newseq == 0) || is_first) { is_first = 0; //mp_msg(MSGT_NETWORK, MSGL_DBG4, "RTP (seq[%d]=%d seq=%d, newseq=%d)\n", rtpbuf.first, rtpbuf.seq[rtpbuf.first], seq, newseq); rtpbuf.first = ( 1 + rtpbuf.first ) % MAXRTPPACKETSIN; rtpbuf.seq[rtpbuf.first] = ++seq; goto feed; } if (newseq > MAXRTPPACKETSIN) { mp_msg(MSGT_NETWORK, MSGL_DBG2, "Overrun(seq[%d]=%d seq=%d, newseq=%d)\n", rtpbuf.first, rtpbuf.seq[rtpbuf.first], seq, newseq); rtp_cache_reset(seq); goto feed; } if (newseq < 0) { int i; // Is it a stray packet re-sent to network? for (i=0; i<MAXRTPPACKETSIN; i++) { if (rtpbuf.seq[i] == seq) { mp_msg(MSGT_NETWORK, MSGL_ERR, "Stray packet (seq[%d]=%d seq=%d, newseq=%d found at %d)\n", rtpbuf.first, rtpbuf.seq[rtpbuf.first], seq, newseq, i); return 0; // Yes, it is! } } // Some heuristic to decide when to drop packet or to restart everything if (newseq > -(3 * MAXRTPPACKETSIN)) { mp_msg(MSGT_NETWORK, MSGL_ERR, "Too Old packet (seq[%d]=%d seq=%d, newseq=%d)\n", rtpbuf.first, rtpbuf.seq[rtpbuf.first], seq, newseq); return 0; // Yes, it is! } mp_msg(MSGT_NETWORK, MSGL_ERR, "Underrun(seq[%d]=%d seq=%d, newseq=%d)\n", rtpbuf.first, rtpbuf.seq[rtpbuf.first], seq, newseq); rtp_cache_reset(seq); goto feed; } mp_msg(MSGT_NETWORK, MSGL_DBG4, "Out of Seq (seq[%d]=%d seq=%d, newseq=%d)\n", rtpbuf.first, rtpbuf.seq[rtpbuf.first], seq, newseq); newseq = ( newseq + rtpbuf.first ) % MAXRTPPACKETSIN; memcpy (rtpbuf.data[newseq], data, length); rtpbuf.len[newseq] = length; rtpbuf.seq[newseq] = seq; return 0; feed: memcpy (buffer, data, length); return length; }