From eff8a969db870c51c1d86f82384de086d9186b25 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Fri, 2 May 2008 14:50:07 +0000 Subject: Ticket #528: committed ticket528.patch git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@1944 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia/transport_ice.c | 24 +++++++++++++++++++++--- pjmedia/src/pjmedia/transport_srtp.c | 26 ++++++++++++++++++++++---- pjmedia/src/pjmedia/transport_udp.c | 25 +++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 9 deletions(-) (limited to 'pjmedia/src') 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, @@ -769,12 +775,24 @@ 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) +{ + 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, @@ -656,14 +662,25 @@ 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) +{ + 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, @@ -747,6 +753,17 @@ 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) +{ + 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; @@ -754,10 +771,14 @@ static pj_status_t transport_send_rtcp(pjmedia_transport *tp, 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; -- cgit v1.2.3