[Mplayerxp-cvslog] SF.net SVN: mplayerxp:[575] mplayerxp/libmpstream2
Brought to you by:
olov
From: <nic...@us...> - 2012-12-18 16:22:49
|
Revision: 575 http://mplayerxp.svn.sourceforge.net/mplayerxp/?rev=575&view=rev Author: nickols_k Date: 2012-12-18 16:22:42 +0000 (Tue, 18 Dec 2012) Log Message: ----------- rename Rtp -> Rtp_Cache Modified Paths: -------------- mplayerxp/libmpstream2/Makefile mplayerxp/libmpstream2/librtsp/rtsp_session.cpp mplayerxp/libmpstream2/librtsp/rtsp_session.h mplayerxp/libmpstream2/network_rtp.cpp mplayerxp/libmpstream2/network_rtp.h Added Paths: ----------- mplayerxp/libmpstream2/rtp_cache.cpp mplayerxp/libmpstream2/rtp_cache.h Removed Paths: ------------- mplayerxp/libmpstream2/rtp.cpp mplayerxp/libmpstream2/rtp.h Modified: mplayerxp/libmpstream2/Makefile =================================================================== --- mplayerxp/libmpstream2/Makefile 2012-12-18 16:07:55 UTC (rev 574) +++ mplayerxp/libmpstream2/Makefile 2012-12-18 16:22:42 UTC (rev 575) @@ -42,7 +42,7 @@ network_rtp.cpp \ network_rtsp.cpp \ pnm.cpp \ - rtp.cpp \ + rtp_cache.cpp \ tcp.cpp \ udp.cpp CXXSRCS += s_ftp.cpp \ Modified: mplayerxp/libmpstream2/librtsp/rtsp_session.cpp =================================================================== --- mplayerxp/libmpstream2/librtsp/rtsp_session.cpp 2012-12-18 16:07:55 UTC (rev 574) +++ mplayerxp/libmpstream2/librtsp/rtsp_session.cpp 2012-12-18 16:22:42 UTC (rev 575) @@ -49,7 +49,6 @@ #include "tcp.h" #include "url.h" -#include "rtp.h" #include "rtsp.h" #include "rtsp_rtp.h" #include "rtsp_session.h" @@ -197,7 +196,7 @@ rtsp_session->rtp_session = Rtp_Rtsp_Session::setup_and_play (*rtsp_session->s); tcp=rtsp_session->rtp_session->get_rtp_socket(); - rtsp_session->rtp = new(zeromem) Rtp(tcp); + rtsp_session->rtp = new(zeromem) Rtp_Cache(tcp); /* neither a Real or an RTP server */ if (!rtsp_session->rtp_session) Modified: mplayerxp/libmpstream2/librtsp/rtsp_session.h =================================================================== --- mplayerxp/libmpstream2/librtsp/rtsp_session.h 2012-12-18 16:07:55 UTC (rev 574) +++ mplayerxp/libmpstream2/librtsp/rtsp_session.h 2012-12-18 16:22:42 UTC (rev 575) @@ -33,7 +33,7 @@ #ifndef HAVE_RTSP_SESSION_H #define HAVE_RTSP_SESSION_H -#include "../rtp.h" +#include "../rtp_cache.h" struct real_rtsp_session_t; namespace mpxp { class Rtp_Rtsp_Session; @@ -51,7 +51,7 @@ Rtsp* s; real_rtsp_session_t*real_session; Rtp_Rtsp_Session* rtp_session; - Rtp* rtp; + Rtp_Cache* rtp; }; } // namespace mpxp #endif Modified: mplayerxp/libmpstream2/network_rtp.cpp =================================================================== --- mplayerxp/libmpstream2/network_rtp.cpp 2012-12-18 16:07:55 UTC (rev 574) +++ mplayerxp/libmpstream2/network_rtp.cpp 2012-12-18 16:22:42 UTC (rev 575) @@ -5,7 +5,6 @@ #include "udp.h" #include "tcp.h" #include "network_rtp.h" -#include "rtp.h" namespace mpxp { int Rtp_Networking::seek(Tcp& tcp, off_t pos) { @@ -31,7 +30,7 @@ rv->prebuffer_size = 64*1024; // KBytes rv->buffering = 0; rv->status = networking_playing_e; - rv->rtp = new(zeromem) Rtp(tcp); + rv->rtp = new(zeromem) Rtp_Cache(tcp); return rv; } Modified: mplayerxp/libmpstream2/network_rtp.h =================================================================== --- mplayerxp/libmpstream2/network_rtp.h 2012-12-18 16:07:55 UTC (rev 574) +++ mplayerxp/libmpstream2/network_rtp.h 2012-12-18 16:22:42 UTC (rev 575) @@ -2,7 +2,7 @@ #define __NETWORK_RP_H_INCLUDED #include "network_nop.h" -#include "rtp.h" +#include "rtp_cache.h" namespace mpxp { struct Rtp_Networking : public Nop_Networking { @@ -14,7 +14,7 @@ virtual int seek( Tcp& fd, off_t pos); private: Rtp_Networking(); - Rtp* rtp; + Rtp_Cache* rtp; }; } // namespace mpxp #endif Deleted: mplayerxp/libmpstream2/rtp.cpp =================================================================== --- mplayerxp/libmpstream2/rtp.cpp 2012-12-18 16:07:55 UTC (rev 574) +++ mplayerxp/libmpstream2/rtp.cpp 2012-12-18 16:22:42 UTC (rev 575) @@ -1,234 +0,0 @@ -#include "mp_config.h" -#include "osdep/mplib.h" -using namespace mpxp; -/* Imported from the dvbstream-0.2 project - * - * Modified for use with MPlayer, for details see the changelog at - * http://svn.mplayerhq.hu/mplayer/trunk/ - * $Id: rtp.c,v 1.4 2007/11/17 12:43:37 nickols_k Exp $ - */ - -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <stdlib.h> -#include <stdio.h> -#include <sys/types.h> -#include <ctype.h> - -#ifndef HAVE_WINSOCK2 -#include <netinet/in.h> -#include <sys/socket.h> -#include <arpa/inet.h> -#define closesocket close -#else -#include <winsock2.h> -#include <ws2tcpip.h> -#endif -#include <errno.h> -#include "stream.h" - -/* MPEG-2 TS RTP stack */ - -#define DEBUG 1 -#include "tcp.h" -#include "rtp.h" -#include "stream_msg.h" - -// RTP reorder routines -// Also handling of repeated UDP packets (a bug of ExtremeNetworks switches firmware) -// rtpreord procedures -// write rtp packets in cache -// get rtp packets reordered - -namespace mpxp { -#define MAXRTPPACKETSIN 32 // The number of max packets being reordered - -struct rtpbits { - unsigned int v:2; /* version: 2 */ - unsigned int p:1; /* is there padding appended: 0 */ - unsigned int x:1; /* number of extension headers: 0 */ - unsigned int cc:4; /* number of CSRC identifiers: 0 */ - unsigned int m:1; /* marker: 0 */ - unsigned int pt:7; /* payload type: 33 for MPEG2 TS - RFC 1890 */ - unsigned int sequence:16; /* sequence number: random */ -}; - -struct rtpheader { /* in network byte order */ - struct rtpbits b; - int timestamp; /* start: random */ - int ssrc; /* random */ -}; - -// RTP Reordering functions -// Algorithm works as follows: -// If next packet is in sequence just copy it to buffer -// Otherwise copy it in cache according to its sequence number -// Cache is a circular array where "rtpbuf.first" points to next sequence slot -// and keeps track of expected sequence - -// Initialize rtp cache -void Rtp::cache_reset(unsigned short seq) { - int i; - - rtp_first = 0; - rtp_seq[0] = ++seq; - - for (i=0; i<MAXRTPPACKETSIN; i++) rtp_len[i] = 0; -} - -// Write in a cache the rtp packet in right rtp sequence order -int Rtp::cache(char *buffer, int length) { - struct rtpheader rh; - int newseq; - char *data; - unsigned short seq; - static int is_first = 1; - - getrtp2(&rh, &data, &length); - if(!length) return 0; - seq = rh.b.sequence; - - newseq = seq - rtp_seq[rtp_first]; - - if ((newseq == 0) || is_first) { - is_first = 0; - - rtp_first = ( 1 + rtp_first ) % MAXRTPPACKETSIN; - rtp_seq[rtp_first] = ++seq; - goto feed; - } - - if (newseq > MAXRTPPACKETSIN) { - MSG_DBG2("Overrun(seq[%d]=%d seq=%d, newseq=%d)\n", rtp_first, rtp_seq[rtp_first], seq, newseq); - 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 (rtp_seq[i] == seq) { - MSG_ERR("Stray packet (seq[%d]=%d seq=%d, newseq=%d found at %d)\n", rtp_first, rtp_seq[rtp_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)) { - MSG_ERR("Too Old packet (seq[%d]=%d seq=%d, newseq=%d)\n", rtp_first, rtp_seq[rtp_first], seq, newseq); - return 0; // Yes, it is! - } - - MSG_ERR("Underrun(seq[%d]=%d seq=%d, newseq=%d)\n", rtp_first, rtp_seq[rtp_first], seq, newseq); - - cache_reset(seq); - goto feed; - } - - MSG_DBG3("Out of Seq (seq[%d]=%d seq=%d, newseq=%d)\n", rtp_first, rtp_seq[rtp_first], seq, newseq); - newseq = ( newseq + rtp_first ) % MAXRTPPACKETSIN; - memcpy (rtp_data[newseq], data, length); - rtp_len[newseq] = length; - rtp_seq[newseq] = seq; - - return 0; - -feed: - memcpy (buffer, data, length); - return length; -} - -// Get next packet in cache -// Look in cache to get first packet in sequence -int Rtp::get_next(char *buffer, int length) { - int i; - unsigned short nextseq; - - // If we have empty buffer we loop to fill it - for (i=0; i < MAXRTPPACKETSIN -3; i++) { - if (rtp_len[rtp_first] != 0) break; - - length = cache(buffer, length); - - // returns on first packet in sequence - if (length > 0) return length; - else if (length < 0) break; - // Only if length == 0 loop continues! - } - - i = rtp_first; - while (rtp_len[i] == 0) { - MSG_ERR("Lost packet %hu\n", rtp_seq[i]); - i = ( 1 + i ) % MAXRTPPACKETSIN; - if (rtp_first == i) break; - } - rtp_first = i; - - // Copy next non empty packet from cache - MSG_DBG3( "Getting rtp from cache [%d] %hu\n", rtp_first, rtp_seq[rtp_first]); - memcpy (buffer, rtp_data[rtp_first], rtp_len[rtp_first]); - length = rtp_len[rtp_first]; // can be zero? - - // Reset fisrt slot and go next in cache - rtp_len[rtp_first] = 0; - nextseq = rtp_seq[rtp_first]; - rtp_first = ( 1 + rtp_first ) % MAXRTPPACKETSIN; - rtp_seq[rtp_first] = nextseq + 1; - - return length; -} - - -// Read next rtp packet using cache -int Rtp::read_from_server(char *buffer, int length) { - // Following test is ASSERT (i.e. uneuseful if code is correct) - if(buffer==NULL || length<STREAM_BUFFER_SIZE) { - MSG_ERR("RTP buffer invalid; no data return from network\n"); - return 0; - } - - // loop just to skip empty packets - while ((length = get_next(buffer, length)) == 0) { - MSG_ERR("Got empty packet from RTP cache!?\n"); - } - return(length); -} - -int Rtp::getrtp2(struct rtpheader *rh, char** data, int* lengthData) const { - static char buf[1600]; - unsigned int intP; - char* charP = (char*) &intP; - int headerSize; - int lengthPacket; - lengthPacket=tcp.read((uint8_t*)(buf),1590); - if (lengthPacket<0) MSG_ERR("rtp: socket read error\n"); - else if (lengthPacket<12) MSG_ERR("rtp: packet too small (%d) to be an rtp frame (>12bytes)\n", lengthPacket); - if(lengthPacket<12) { - *lengthData = 0; - return 0; - } - rh->b.v = (unsigned int) ((buf[0]>>6)&0x03); - rh->b.p = (unsigned int) ((buf[0]>>5)&0x01); - rh->b.x = (unsigned int) ((buf[0]>>4)&0x01); - rh->b.cc = (unsigned int) ((buf[0]>>0)&0x0f); - rh->b.m = (unsigned int) ((buf[1]>>7)&0x01); - rh->b.pt = (unsigned int) ((buf[1]>>0)&0x7f); - intP = 0; - memcpy(charP+2,&buf[2],2); - rh->b.sequence = ntohl(intP); - intP = 0; - memcpy(charP,&buf[4],4); - rh->timestamp = ntohl(intP); - - headerSize = 12 + 4*rh->b.cc; /* in bytes */ - - *lengthData = lengthPacket - headerSize; - *data = (char*) buf + headerSize; - - return 0; -} -Rtp::Rtp(Tcp& _tcp):tcp(_tcp) {} -Rtp::~Rtp() {} -} // namespace mpxp Deleted: mplayerxp/libmpstream2/rtp.h =================================================================== --- mplayerxp/libmpstream2/rtp.h 2012-12-18 16:07:55 UTC (rev 574) +++ mplayerxp/libmpstream2/rtp.h 2012-12-18 16:22:42 UTC (rev 575) @@ -1,41 +0,0 @@ -/* Imported from the dvbstream project - * - * Modified for use with MPlayer, for details see the changelog at - * http://svn.mplayerhq.hu/mplayer/trunk/ - * $Id: rtp.h,v 1.2 2007/11/17 12:43:37 nickols_k Exp $ - */ -#ifndef __RTP_H_INCLUDED -#define __RTP_H_INCLUDED 1 -#include "network.h" -#include "tcp.h" -#include <stdint.h> - -namespace mpxp { -// RTP reorder routines -// Also handling of repeated UDP packets (a bug of ExtremeNetworks switches firmware) -// rtpreord procedures -// write rtp packets in cache -// get rtp packets reordered - -#define MAXRTPPACKETSIN 32 // The number of max packets being reordered - - class Rtp : public Opaque { - public: - Rtp(Tcp& tcp); - virtual ~Rtp(); - - virtual int read_from_server(char *buffer, int length); - private: - void cache_reset(unsigned short seq); - int cache(char *buffer, int length); - int get_next(char *buffer, int length); - int getrtp2(struct rtpheader *rh, char** data, int* lengthData) const; - - Tcp& tcp; - uint8_t rtp_data[MAXRTPPACKETSIN][STREAM_BUFFER_SIZE]; - uint16_t rtp_seq[MAXRTPPACKETSIN]; - uint16_t rtp_len[MAXRTPPACKETSIN]; - uint16_t rtp_first; - }; -} // namespace mpxp -#endif Copied: mplayerxp/libmpstream2/rtp_cache.cpp (from rev 574, mplayerxp/libmpstream2/rtp.cpp) =================================================================== --- mplayerxp/libmpstream2/rtp_cache.cpp (rev 0) +++ mplayerxp/libmpstream2/rtp_cache.cpp 2012-12-18 16:22:42 UTC (rev 575) @@ -0,0 +1,234 @@ +#include "mp_config.h" +#include "osdep/mplib.h" +using namespace mpxp; +/* Imported from the dvbstream-0.2 project + * + * Modified for use with MPlayer, for details see the changelog at + * http://svn.mplayerhq.hu/mplayer/trunk/ + * $Id: rtp.c,v 1.4 2007/11/17 12:43:37 nickols_k Exp $ + */ + +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> +#include <sys/types.h> +#include <ctype.h> + +#ifndef HAVE_WINSOCK2 +#include <netinet/in.h> +#include <sys/socket.h> +#include <arpa/inet.h> +#define closesocket close +#else +#include <winsock2.h> +#include <ws2tcpip.h> +#endif +#include <errno.h> +#include "stream.h" + +/* MPEG-2 TS RTP stack */ + +#define DEBUG 1 +#include "tcp.h" +#include "rtp_cache.h" +#include "stream_msg.h" + +// RTP reorder routines +// Also handling of repeated UDP packets (a bug of ExtremeNetworks switches firmware) +// rtpreord procedures +// write rtp packets in cache +// get rtp packets reordered + +namespace mpxp { +#define MAXRTPPACKETSIN 32 // The number of max packets being reordered + +struct rtpbits { + unsigned int v:2; /* version: 2 */ + unsigned int p:1; /* is there padding appended: 0 */ + unsigned int x:1; /* number of extension headers: 0 */ + unsigned int cc:4; /* number of CSRC identifiers: 0 */ + unsigned int m:1; /* marker: 0 */ + unsigned int pt:7; /* payload type: 33 for MPEG2 TS - RFC 1890 */ + unsigned int sequence:16; /* sequence number: random */ +}; + +struct rtpheader { /* in network byte order */ + struct rtpbits b; + int timestamp; /* start: random */ + int ssrc; /* random */ +}; + +// RTP Reordering functions +// Algorithm works as follows: +// If next packet is in sequence just copy it to buffer +// Otherwise copy it in cache according to its sequence number +// Cache is a circular array where "rtpbuf.first" points to next sequence slot +// and keeps track of expected sequence + +// Initialize rtp cache +void Rtp_Cache::cache_reset(unsigned short seq) { + int i; + + rtp_first = 0; + rtp_seq[0] = ++seq; + + for (i=0; i<MAXRTPPACKETSIN; i++) rtp_len[i] = 0; +} + +// Write in a cache the rtp packet in right rtp sequence order +int Rtp_Cache::cache(char *buffer, int length) { + struct rtpheader rh; + int newseq; + char *data; + unsigned short seq; + static int is_first = 1; + + getrtp2(&rh, &data, &length); + if(!length) return 0; + seq = rh.b.sequence; + + newseq = seq - rtp_seq[rtp_first]; + + if ((newseq == 0) || is_first) { + is_first = 0; + + rtp_first = ( 1 + rtp_first ) % MAXRTPPACKETSIN; + rtp_seq[rtp_first] = ++seq; + goto feed; + } + + if (newseq > MAXRTPPACKETSIN) { + MSG_DBG2("Overrun(seq[%d]=%d seq=%d, newseq=%d)\n", rtp_first, rtp_seq[rtp_first], seq, newseq); + 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 (rtp_seq[i] == seq) { + MSG_ERR("Stray packet (seq[%d]=%d seq=%d, newseq=%d found at %d)\n", rtp_first, rtp_seq[rtp_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)) { + MSG_ERR("Too Old packet (seq[%d]=%d seq=%d, newseq=%d)\n", rtp_first, rtp_seq[rtp_first], seq, newseq); + return 0; // Yes, it is! + } + + MSG_ERR("Underrun(seq[%d]=%d seq=%d, newseq=%d)\n", rtp_first, rtp_seq[rtp_first], seq, newseq); + + cache_reset(seq); + goto feed; + } + + MSG_DBG3("Out of Seq (seq[%d]=%d seq=%d, newseq=%d)\n", rtp_first, rtp_seq[rtp_first], seq, newseq); + newseq = ( newseq + rtp_first ) % MAXRTPPACKETSIN; + memcpy (rtp_data[newseq], data, length); + rtp_len[newseq] = length; + rtp_seq[newseq] = seq; + + return 0; + +feed: + memcpy (buffer, data, length); + return length; +} + +// Get next packet in cache +// Look in cache to get first packet in sequence +int Rtp_Cache::get_next(char *buffer, int length) { + int i; + unsigned short nextseq; + + // If we have empty buffer we loop to fill it + for (i=0; i < MAXRTPPACKETSIN -3; i++) { + if (rtp_len[rtp_first] != 0) break; + + length = cache(buffer, length); + + // returns on first packet in sequence + if (length > 0) return length; + else if (length < 0) break; + // Only if length == 0 loop continues! + } + + i = rtp_first; + while (rtp_len[i] == 0) { + MSG_ERR("Lost packet %hu\n", rtp_seq[i]); + i = ( 1 + i ) % MAXRTPPACKETSIN; + if (rtp_first == i) break; + } + rtp_first = i; + + // Copy next non empty packet from cache + MSG_DBG3( "Getting rtp from cache [%d] %hu\n", rtp_first, rtp_seq[rtp_first]); + memcpy (buffer, rtp_data[rtp_first], rtp_len[rtp_first]); + length = rtp_len[rtp_first]; // can be zero? + + // Reset fisrt slot and go next in cache + rtp_len[rtp_first] = 0; + nextseq = rtp_seq[rtp_first]; + rtp_first = ( 1 + rtp_first ) % MAXRTPPACKETSIN; + rtp_seq[rtp_first] = nextseq + 1; + + return length; +} + + +// Read next rtp packet using cache +int Rtp_Cache::read_from_server(char *buffer, int length) { + // Following test is ASSERT (i.e. uneuseful if code is correct) + if(buffer==NULL || length<STREAM_BUFFER_SIZE) { + MSG_ERR("RTP buffer invalid; no data return from network\n"); + return 0; + } + + // loop just to skip empty packets + while ((length = get_next(buffer, length)) == 0) { + MSG_ERR("Got empty packet from RTP cache!?\n"); + } + return(length); +} + +int Rtp_Cache::getrtp2(struct rtpheader *rh, char** data, int* lengthData) const { + static char buf[1600]; + unsigned int intP; + char* charP = (char*) &intP; + int headerSize; + int lengthPacket; + lengthPacket=tcp.read((uint8_t*)(buf),1590); + if (lengthPacket<0) MSG_ERR("rtp: socket read error\n"); + else if (lengthPacket<12) MSG_ERR("rtp: packet too small (%d) to be an rtp frame (>12bytes)\n", lengthPacket); + if(lengthPacket<12) { + *lengthData = 0; + return 0; + } + rh->b.v = (unsigned int) ((buf[0]>>6)&0x03); + rh->b.p = (unsigned int) ((buf[0]>>5)&0x01); + rh->b.x = (unsigned int) ((buf[0]>>4)&0x01); + rh->b.cc = (unsigned int) ((buf[0]>>0)&0x0f); + rh->b.m = (unsigned int) ((buf[1]>>7)&0x01); + rh->b.pt = (unsigned int) ((buf[1]>>0)&0x7f); + intP = 0; + memcpy(charP+2,&buf[2],2); + rh->b.sequence = ntohl(intP); + intP = 0; + memcpy(charP,&buf[4],4); + rh->timestamp = ntohl(intP); + + headerSize = 12 + 4*rh->b.cc; /* in bytes */ + + *lengthData = lengthPacket - headerSize; + *data = (char*) buf + headerSize; + + return 0; +} +Rtp_Cache::Rtp_Cache(Tcp& _tcp):tcp(_tcp) {} +Rtp_Cache::~Rtp_Cache() {} +} // namespace mpxp Copied: mplayerxp/libmpstream2/rtp_cache.h (from rev 574, mplayerxp/libmpstream2/rtp.h) =================================================================== --- mplayerxp/libmpstream2/rtp_cache.h (rev 0) +++ mplayerxp/libmpstream2/rtp_cache.h 2012-12-18 16:22:42 UTC (rev 575) @@ -0,0 +1,41 @@ +/* Imported from the dvbstream project + * + * Modified for use with MPlayer, for details see the changelog at + * http://svn.mplayerhq.hu/mplayer/trunk/ + * $Id: rtp.h,v 1.2 2007/11/17 12:43:37 nickols_k Exp $ + */ +#ifndef __RTP_CACHE_H_INCLUDED +#define __RTP_CACHE_H_INCLUDED 1 +#include "network.h" +#include "tcp.h" +#include <stdint.h> + +namespace mpxp { +// RTP reorder routines +// Also handling of repeated UDP packets (a bug of ExtremeNetworks switches firmware) +// rtpreord procedures +// write rtp packets in cache +// get rtp packets reordered + +#define MAXRTPPACKETSIN 32 // The number of max packets being reordered + + class Rtp_Cache : public Opaque { + public: + Rtp_Cache(Tcp& tcp); + virtual ~Rtp_Cache(); + + virtual int read_from_server(char *buffer, int length); + private: + void cache_reset(unsigned short seq); + int cache(char *buffer, int length); + int get_next(char *buffer, int length); + int getrtp2(struct rtpheader *rh, char** data, int* lengthData) const; + + Tcp& tcp; + uint8_t rtp_data[MAXRTPPACKETSIN][STREAM_BUFFER_SIZE]; + uint16_t rtp_seq[MAXRTPPACKETSIN]; + uint16_t rtp_len[MAXRTPPACKETSIN]; + uint16_t rtp_first; + }; +} // namespace mpxp +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |