move 'struct ast_rtp' back to rtp.c where it belongs
authorKevin P. Fleming <kpfleming@digium.com>
Thu, 8 Jun 2006 23:10:45 +0000 (23:10 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Thu, 8 Jun 2006 23:10:45 +0000 (23:10 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@33133 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c
include/asterisk/rtp.h
rtp.c

index 06e728d..d84768c 100644 (file)
@@ -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);
index 4410d7f..b7be53a 100644 (file)
@@ -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 c94fd15..8291374 100644 (file)
--- 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;