From 09778b268ea887ef53de4a8dc8f17c5fec615d5c Mon Sep 17 00:00:00 2001 From: "Kevin P. Fleming" Date: Thu, 8 Jun 2006 23:10:45 +0000 Subject: [PATCH] move 'struct ast_rtp' back to rtp.c where it belongs git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@33133 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 41 ++++++++++++-------------- include/asterisk/rtp.h | 62 ++++++---------------------------------- rtp.c | 65 ++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 90 insertions(+), 78 deletions(-) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 06e728d6a8..d84768cba2 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -4112,7 +4112,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) int sendonly = 0; int numberofports; struct ast_channel *bridgepeer = NULL; - struct ast_rtp newaudiortp, newvideortp; /* Buffers for codec handling */ + struct ast_rtp *newaudiortp, *newvideortp; /* Buffers for codec handling */ int newjointcapability; /* Negotiated capability */ int newpeercapability; int newnoncodeccapability; @@ -4125,10 +4125,13 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) } /* Initialize the temporary RTP structures we use to evaluate the offer from the peer */ - memset(&newaudiortp, 0, sizeof(newaudiortp)); - memset(&newvideortp, 0, sizeof(newvideortp)); - ast_rtp_pt_default(&newaudiortp); - ast_rtp_pt_default(&newvideortp); + newaudiortp = alloca(ast_rtp_alloc_size()); + memset(newaudiortp, 0, ast_rtp_alloc_size()); + ast_rtp_pt_default(newaudiortp); + + newvideortp = alloca(ast_rtp_alloc_size()); + memset(newvideortp, 0, ast_rtp_alloc_size()); + ast_rtp_pt_default(newvideortp); /* Update our last rtprx when we receive an SDP, too */ p->lastrtprx = p->lastrtptx = time(NULL); /* XXX why both ? */ @@ -4168,7 +4171,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) numberofmediastreams++; if (p->vrtp) - ast_rtp_pt_clear(&newvideortp); /* Must be cleared in case no m=video line exists */ + ast_rtp_pt_clear(newvideortp); /* Must be cleared in case no m=video line exists */ numberofports = 1; if ((sscanf(m, "audio %d/%d RTP/AVP %n", &x, &numberofports, &len) == 2) || (sscanf(m, "audio %d RTP/AVP %n", &x, &len) == 1)) { @@ -4176,7 +4179,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) /* Found audio stream in this media definition */ portno = x; /* Scan through the RTP payload types specified in a "m=" line: */ - ast_rtp_pt_clear(&newaudiortp); + ast_rtp_pt_clear(newaudiortp); for (codecs = m + len; !ast_strlen_zero(codecs); codecs = ast_skip_blanks(codecs + len)) { if (sscanf(codecs, "%d%n", &codec, &len) != 1) { ast_log(LOG_WARNING, "Error in codec string '%s'\n", codecs); @@ -4184,7 +4187,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) } if (debug) ast_verbose("Found RTP audio format %d\n", codec); - ast_rtp_set_m_type(&newaudiortp, codec); + ast_rtp_set_m_type(newaudiortp, codec); } } else if ((sscanf(m, "video %d/%d RTP/AVP %n", &x, &numberofports, &len) == 2) || (sscanf(m, "video %d RTP/AVP %n", &x, &len) == 1)) { @@ -4199,7 +4202,7 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) } if (debug) ast_verbose("Found RTP video format %d\n", codec); - ast_rtp_set_m_type(&newvideortp, codec); + ast_rtp_set_m_type(newvideortp, codec); } } else ast_log(LOG_WARNING, "Unsupported SDP media type in offer: %s\n", m); @@ -4305,14 +4308,14 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) ast_verbose("Found description format %s for ID %d\n", mimeSubtype, codec); /* Note: should really look at the 'freq' and '#chans' params too */ - ast_rtp_set_rtpmap_type(&newaudiortp, codec, "audio", mimeSubtype); + ast_rtp_set_rtpmap_type(newaudiortp, codec, "audio", mimeSubtype); if (p->vrtp) - ast_rtp_set_rtpmap_type(&newvideortp, codec, "video", mimeSubtype); + ast_rtp_set_rtpmap_type(newvideortp, codec, "video", mimeSubtype); } /* Now gather all of the codecs that we are asked for: */ - ast_rtp_get_current_formats(&newaudiortp, &peercapability, &peernoncodeccapability); - ast_rtp_get_current_formats(&newvideortp, &vpeercapability, &vpeernoncodeccapability); + ast_rtp_get_current_formats(newaudiortp, &peercapability, &peernoncodeccapability); + ast_rtp_get_current_formats(newvideortp, &vpeercapability, &vpeernoncodeccapability); newjointcapability = p->capability & (peercapability | vpeercapability); newpeercapability = (peercapability | vpeercapability); @@ -4346,15 +4349,9 @@ static int process_sdp(struct sip_pvt *p, struct sip_request *req) p->peercapability = newpeercapability; /* The other sides capability in latest offer */ p->noncodeccapability = newnoncodeccapability; /* DTMF capabilities */ - { - int i; - /* Copy payload types from source to destination */ - for (i=0; i < MAX_RTP_PT; ++i) { - p->rtp->current_RTP_PT[i]= newaudiortp.current_RTP_PT[i]; - if (p->vrtp) - p->vrtp->current_RTP_PT[i]= newvideortp.current_RTP_PT[i]; - } - } + ast_rtp_pt_copy(p->rtp, newaudiortp); + if (p->vrtp) + ast_rtp_pt_copy(p->vrtp, newvideortp); if (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_AUTO) { ast_clear_flag(&p->flags[0], SIP_DTMF); diff --git a/include/asterisk/rtp.h b/include/asterisk/rtp.h index 4410d7fb64..b7be53a1ca 100644 --- a/include/asterisk/rtp.h +++ b/include/asterisk/rtp.h @@ -80,59 +80,11 @@ struct rtpPayloadType { int code; }; -/*! \brief RTP session description */ -struct ast_rtp { - int s; - char resp; - struct ast_frame f; - unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET]; - unsigned int ssrc; /*!< Synchronization source, RFC 3550, page 10. */ - unsigned int themssrc; /*!< Their SSRC */ - unsigned int rxssrc; - unsigned int lastts; - unsigned int lastdigitts; - unsigned int lastrxts; - unsigned int lastividtimestamp; - unsigned int lastovidtimestamp; - unsigned int lasteventseqn; - int lastrxseqno; /*!< Last received sequence number */ - unsigned short seedrxseqno; /*!< What sequence number did they start with?*/ - unsigned int seedrxts; /*!< What RTP timestamp did they start with? */ - unsigned int rxcount; /*!< How many packets have we received? */ - unsigned int rxoctetcount; /*!< How many octets have we received? should be rxcount *160*/ - unsigned int txcount; /*!< How many packets have we sent? */ - unsigned int txoctetcount; /*!< How many octets have we sent? (txcount*160)*/ - unsigned int cycles; /*!< Shifted count of sequence number cycles */ - double rxjitter; /*!< Interarrival jitter at the moment */ - double rxtransit; /*!< Relative transit time for previous packet */ - unsigned int lasteventendseqn; - int lasttxformat; - int lastrxformat; - int dtmfcount; - unsigned int dtmfduration; - int nat; - unsigned int flags; - struct sockaddr_in us; /*!< Socket representation of the local endpoint. */ - struct sockaddr_in them; /*!< Socket representation of the remote endpoint. */ - struct timeval rxcore; - struct timeval txcore; - double drxcore; /*!< The double representation of the first received packet */ - struct timeval lastrx; /*!< timeval when we last received a packet */ - struct timeval dtmfmute; - struct ast_smoother *smoother; - int *ioid; - unsigned short seqno; /*!< Sequence number, RFC 3550, page 13. */ - unsigned short rxseqno; - struct sched_context *sched; - struct io_context *io; - void *data; - ast_rtp_callback callback; - struct rtpPayloadType current_RTP_PT[MAX_RTP_PT]; - int rtp_lookup_code_cache_isAstFormat; /*!< a cache for the result of rtp_lookup_code(): */ - int rtp_lookup_code_cache_code; - int rtp_lookup_code_cache_result; - struct ast_rtcp *rtcp; -}; +/*! + * \brief Get the amount of space required to hold an RTP session + * \return number of bytes required + */ +size_t ast_rtp_alloc_size(void); /*! * \brief Initializate a RTP session. @@ -196,6 +148,10 @@ int ast_rtp_settos(struct ast_rtp *rtp, int tos); void ast_rtp_pt_clear(struct ast_rtp* rtp); /*! \brief Set payload types to defaults */ void ast_rtp_pt_default(struct ast_rtp* rtp); + +/*! \brief Copy payload types between RTP structures */ +void ast_rtp_pt_copy(struct ast_rtp *dest, const struct ast_rtp *src); + void ast_rtp_set_m_type(struct ast_rtp* rtp, int pt); void ast_rtp_set_rtpmap_type(struct ast_rtp* rtp, int pt, char* mimeType, char* mimeSubtype); diff --git a/rtp.c b/rtp.c index c94fd15a2a..8291374920 100644 --- a/rtp.c +++ b/rtp.c @@ -90,6 +90,60 @@ static struct sockaddr_in rtcpdebugaddr; /*!< Debug RTCP packets to/from this ho static int nochecksums = 0; #endif +/*! \brief RTP session description */ +struct ast_rtp { + int s; + char resp; + struct ast_frame f; + unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET]; + unsigned int ssrc; /*!< Synchronization source, RFC 3550, page 10. */ + unsigned int themssrc; /*!< Their SSRC */ + unsigned int rxssrc; + unsigned int lastts; + unsigned int lastdigitts; + unsigned int lastrxts; + unsigned int lastividtimestamp; + unsigned int lastovidtimestamp; + unsigned int lasteventseqn; + int lastrxseqno; /*!< Last received sequence number */ + unsigned short seedrxseqno; /*!< What sequence number did they start with?*/ + unsigned int seedrxts; /*!< What RTP timestamp did they start with? */ + unsigned int rxcount; /*!< How many packets have we received? */ + unsigned int rxoctetcount; /*!< How many octets have we received? should be rxcount *160*/ + unsigned int txcount; /*!< How many packets have we sent? */ + unsigned int txoctetcount; /*!< How many octets have we sent? (txcount*160)*/ + unsigned int cycles; /*!< Shifted count of sequence number cycles */ + double rxjitter; /*!< Interarrival jitter at the moment */ + double rxtransit; /*!< Relative transit time for previous packet */ + unsigned int lasteventendseqn; + int lasttxformat; + int lastrxformat; + int dtmfcount; + unsigned int dtmfduration; + int nat; + unsigned int flags; + struct sockaddr_in us; /*!< Socket representation of the local endpoint. */ + struct sockaddr_in them; /*!< Socket representation of the remote endpoint. */ + struct timeval rxcore; + struct timeval txcore; + double drxcore; /*!< The double representation of the first received packet */ + struct timeval lastrx; /*!< timeval when we last received a packet */ + struct timeval dtmfmute; + struct ast_smoother *smoother; + int *ioid; + unsigned short seqno; /*!< Sequence number, RFC 3550, page 13. */ + unsigned short rxseqno; + struct sched_context *sched; + struct io_context *io; + void *data; + ast_rtp_callback callback; + struct rtpPayloadType current_RTP_PT[MAX_RTP_PT]; + int rtp_lookup_code_cache_isAstFormat; /*!< a cache for the result of rtp_lookup_code(): */ + int rtp_lookup_code_cache_code; + int rtp_lookup_code_cache_result; + struct ast_rtcp *rtcp; +}; + /* Forward declarations */ static int ast_rtcp_write(void *data); static void timeval2ntp(struct timeval tv, unsigned int *msw, unsigned int *lsw); @@ -303,6 +357,11 @@ static void stun_req_id(struct stun_header *req) req->id.id[x] = ast_random(); } +size_t ast_rtp_alloc_size(void) +{ + return sizeof(struct ast_rtp); +} + void ast_rtp_stun_request(struct ast_rtp *rtp, struct sockaddr_in *suggestion, const char *username) { struct stun_header *req; @@ -1185,10 +1244,10 @@ void ast_rtp_pt_default(struct ast_rtp* rtp) rtp->rtp_lookup_code_cache_result = 0; } -static void ast_rtp_pt_copy(struct ast_rtp *dest, struct ast_rtp *src) +void ast_rtp_pt_copy(struct ast_rtp *dest, const struct ast_rtp *src) { - int i; - /* Copy payload types from source to destination */ + unsigned int i; + for (i=0; i < MAX_RTP_PT; ++i) { dest->current_RTP_PT[i].isAstFormat = src->current_RTP_PT[i].isAstFormat;