summaryrefslogtreecommitdiff
path: root/pjmedia/src
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2008-05-02 14:50:07 +0000
committerNanang Izzuddin <nanang@teluu.com>2008-05-02 14:50:07 +0000
commiteff8a969db870c51c1d86f82384de086d9186b25 (patch)
tree720d785fe7605ca4752c9fc4a66e18f0240f4f6f /pjmedia/src
parentdc883a480f6dcf1e7c7a389675e3fc312b3f8e24 (diff)
Ticket #528: committed ticket528.patch
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1944 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r--pjmedia/src/pjmedia/transport_ice.c24
-rw-r--r--pjmedia/src/pjmedia/transport_srtp.c26
-rw-r--r--pjmedia/src/pjmedia/transport_udp.c25
3 files changed, 66 insertions, 9 deletions
diff --git a/pjmedia/src/pjmedia/transport_ice.c b/pjmedia/src/pjmedia/transport_ice.c
index 59408dd8..96581ad9 100644
--- a/pjmedia/src/pjmedia/transport_ice.c
+++ b/pjmedia/src/pjmedia/transport_ice.c
@@ -75,6 +75,11 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp,
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
const void *pkt,
pj_size_t size);
+static pj_status_t transport_send_rtcp2(pjmedia_transport *tp,
+ const pj_sockaddr_t *addr,
+ unsigned addr_len,
+ const void *pkt,
+ pj_size_t size);
static pj_status_t transport_media_create(pjmedia_transport *tp,
pj_pool_t *pool,
unsigned options,
@@ -110,6 +115,7 @@ static pjmedia_transport_op transport_ice_op =
&transport_detach,
&transport_send_rtp,
&transport_send_rtcp,
+ &transport_send_rtcp2,
&transport_media_create,
&transport_media_start,
&transport_media_stop,
@@ -770,11 +776,23 @@ static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
const void *pkt,
pj_size_t size)
{
+ return transport_send_rtcp2(tp, NULL, 0, pkt, size);
+}
+
+static pj_status_t transport_send_rtcp2(pjmedia_transport *tp,
+ const pj_sockaddr_t *addr,
+ unsigned addr_len,
+ const void *pkt,
+ pj_size_t size)
+{
struct transport_ice *tp_ice = (struct transport_ice*)tp;
if (tp_ice->ice_st->comp_cnt > 1) {
- return pj_ice_strans_sendto(tp_ice->ice_st, 2,
- pkt, size, &tp_ice->remote_rtcp,
- sizeof(pj_sockaddr_in));
+ if (addr == NULL) {
+ addr = &tp_ice->remote_rtcp;
+ addr_len = pj_sockaddr_get_len(addr);
+ }
+ return pj_ice_strans_sendto(tp_ice->ice_st, 2, pkt, size,
+ addr, addr_len);
} else {
return PJ_SUCCESS;
}
diff --git a/pjmedia/src/pjmedia/transport_srtp.c b/pjmedia/src/pjmedia/transport_srtp.c
index 03470d20..1bcf71f7 100644
--- a/pjmedia/src/pjmedia/transport_srtp.c
+++ b/pjmedia/src/pjmedia/transport_srtp.c
@@ -145,6 +145,11 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp,
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
const void *pkt,
pj_size_t size);
+static pj_status_t transport_send_rtcp2(pjmedia_transport *tp,
+ const pj_sockaddr_t *addr,
+ unsigned addr_len,
+ const void *pkt,
+ pj_size_t size);
static pj_status_t transport_media_create(pjmedia_transport *tp,
pj_pool_t *pool,
unsigned options,
@@ -171,6 +176,7 @@ static pjmedia_transport_op transport_srtp_op =
&transport_detach,
&transport_send_rtp,
&transport_send_rtcp,
+ &transport_send_rtcp2,
&transport_media_create,
&transport_media_start,
&transport_media_stop,
@@ -657,13 +663,24 @@ static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
const void *pkt,
pj_size_t size)
{
+ return transport_send_rtcp2(tp, NULL, 0, pkt, size);
+}
+
+static pj_status_t transport_send_rtcp2(pjmedia_transport *tp,
+ const pj_sockaddr_t *addr,
+ unsigned addr_len,
+ const void *pkt,
+ pj_size_t size)
+{
pj_status_t status;
transport_srtp *srtp = (transport_srtp*) tp;
int len = size;
err_status_t err;
- if (srtp->bypass_srtp)
- return pjmedia_transport_send_rtcp(srtp->real_tp, pkt, size);
+ if (srtp->bypass_srtp) {
+ return pjmedia_transport_send_rtcp2(srtp->real_tp, addr, addr_len,
+ pkt, size);
+ }
if (!srtp->session_inited)
return PJ_SUCCESS;
@@ -677,8 +694,8 @@ static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
err = srtp_protect_rtcp(srtp->srtp_tx_ctx, srtp->tx_buffer, &len);
if (err == err_status_ok) {
- status = pjmedia_transport_send_rtcp(srtp->real_tp, srtp->tx_buffer,
- len);
+ status = pjmedia_transport_send_rtcp2(srtp->real_tp, addr, addr_len,
+ srtp->tx_buffer, len);
} else {
status = PJMEDIA_ERRNO_FROM_LIBSRTP(err);
}
@@ -688,6 +705,7 @@ static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
return status;
}
+
static pj_status_t transport_simulate_lost(pjmedia_transport *tp,
pjmedia_dir dir,
unsigned pct_lost)
diff --git a/pjmedia/src/pjmedia/transport_udp.c b/pjmedia/src/pjmedia/transport_udp.c
index a6c5b68b..0804b8bf 100644
--- a/pjmedia/src/pjmedia/transport_udp.c
+++ b/pjmedia/src/pjmedia/transport_udp.c
@@ -121,6 +121,11 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp,
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
const void *pkt,
pj_size_t size);
+static pj_status_t transport_send_rtcp2(pjmedia_transport *tp,
+ const pj_sockaddr_t *addr,
+ unsigned addr_len,
+ const void *pkt,
+ pj_size_t size);
static pj_status_t transport_media_create(pjmedia_transport *tp,
pj_pool_t *pool,
unsigned options,
@@ -146,6 +151,7 @@ static pjmedia_transport_op transport_udp_op =
&transport_detach,
&transport_send_rtp,
&transport_send_rtcp,
+ &transport_send_rtcp2,
&transport_media_create,
&transport_media_start,
&transport_media_stop,
@@ -748,16 +754,31 @@ static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
const void *pkt,
pj_size_t size)
{
+ return transport_send_rtcp2(tp, NULL, 0, pkt, size);
+}
+
+
+/* Called by application to send RTCP packet */
+static pj_status_t transport_send_rtcp2(pjmedia_transport *tp,
+ const pj_sockaddr_t *addr,
+ unsigned addr_len,
+ const void *pkt,
+ pj_size_t size)
+{
struct transport_udp *udp = (struct transport_udp*)tp;
pj_ssize_t sent;
pj_status_t status;
PJ_ASSERT_RETURN(udp->attached, PJ_EINVALIDOP);
+ if (addr == NULL) {
+ addr = &udp->rem_rtcp_addr;
+ addr_len = udp->addr_len;
+ }
+
sent = size;
status = pj_ioqueue_sendto( udp->rtcp_key, &udp->rtcp_write_op,
- pkt, &sent, 0,
- &udp->rem_rtcp_addr, udp->addr_len);
+ pkt, &sent, 0, addr, addr_len);
if (status==PJ_SUCCESS || status==PJ_EPENDING)
return PJ_SUCCESS;