Ticket #528: committed ticket528.patch
git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@1944 74dad513-b988-da41-8d7b-12977e46ad98
This commit is contained in:
parent
90f11cbd2f
commit
db9da77fa2
|
@ -305,6 +305,20 @@ struct pjmedia_transport_op
|
||||||
const void *pkt,
|
const void *pkt,
|
||||||
pj_size_t size);
|
pj_size_t size);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function is called by the stream to send RTCP packet using the
|
||||||
|
* transport with destination address other than default specified in
|
||||||
|
* #pjmedia_transport_attach().
|
||||||
|
*
|
||||||
|
* Application should call #pjmedia_transport_send_rtcp2() instead of
|
||||||
|
* calling this function directly.
|
||||||
|
*/
|
||||||
|
pj_status_t (*send_rtcp2)(pjmedia_transport *tp,
|
||||||
|
const pj_sockaddr_t *addr,
|
||||||
|
unsigned addr_len,
|
||||||
|
const void *pkt,
|
||||||
|
pj_size_t size);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This function is called by application to generate the SDP parts
|
* This function is called by application to generate the SDP parts
|
||||||
* related to transport type, e.g: ICE, SRTP.
|
* related to transport type, e.g: ICE, SRTP.
|
||||||
|
@ -586,6 +600,31 @@ PJ_INLINE(pj_status_t) pjmedia_transport_send_rtcp(pjmedia_transport *tp,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send RTCP packet with the specified media transport. This is just a simple
|
||||||
|
* wrapper which calls <tt>send_rtcp2()</tt> member of the transport. The
|
||||||
|
* RTCP packet will be delivered to the destination address specified in
|
||||||
|
* param addr, if addr is NULL, RTCP packet will be delivered to destination
|
||||||
|
* address specified in #pjmedia_transport_attach() function.
|
||||||
|
*
|
||||||
|
* @param tp The media transport.
|
||||||
|
* @param addr The destination address.
|
||||||
|
* @param addr_len Length of destination address.
|
||||||
|
* @param pkt The packet to send.
|
||||||
|
* @param size Size of the packet.
|
||||||
|
*
|
||||||
|
* @return PJ_SUCCESS on success, or the appropriate error code.
|
||||||
|
*/
|
||||||
|
PJ_INLINE(pj_status_t) pjmedia_transport_send_rtcp2(pjmedia_transport *tp,
|
||||||
|
const pj_sockaddr_t *addr,
|
||||||
|
unsigned addr_len,
|
||||||
|
const void *pkt,
|
||||||
|
pj_size_t size)
|
||||||
|
{
|
||||||
|
return (*tp->op->send_rtcp2)(tp, addr, addr_len, pkt, size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generate local SDP parts that are related to the specified media transport.
|
* Generate local SDP parts that are related to the specified media transport.
|
||||||
* Remote SDP might be needed as reference when application is in deciding
|
* Remote SDP might be needed as reference when application is in deciding
|
||||||
|
|
|
@ -75,6 +75,11 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp,
|
||||||
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
||||||
const void *pkt,
|
const void *pkt,
|
||||||
pj_size_t size);
|
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,
|
static pj_status_t transport_media_create(pjmedia_transport *tp,
|
||||||
pj_pool_t *pool,
|
pj_pool_t *pool,
|
||||||
unsigned options,
|
unsigned options,
|
||||||
|
@ -110,6 +115,7 @@ static pjmedia_transport_op transport_ice_op =
|
||||||
&transport_detach,
|
&transport_detach,
|
||||||
&transport_send_rtp,
|
&transport_send_rtp,
|
||||||
&transport_send_rtcp,
|
&transport_send_rtcp,
|
||||||
|
&transport_send_rtcp2,
|
||||||
&transport_media_create,
|
&transport_media_create,
|
||||||
&transport_media_start,
|
&transport_media_start,
|
||||||
&transport_media_stop,
|
&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,
|
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
||||||
const void *pkt,
|
const void *pkt,
|
||||||
pj_size_t size)
|
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;
|
struct transport_ice *tp_ice = (struct transport_ice*)tp;
|
||||||
if (tp_ice->ice_st->comp_cnt > 1) {
|
if (tp_ice->ice_st->comp_cnt > 1) {
|
||||||
return pj_ice_strans_sendto(tp_ice->ice_st, 2,
|
if (addr == NULL) {
|
||||||
pkt, size, &tp_ice->remote_rtcp,
|
addr = &tp_ice->remote_rtcp;
|
||||||
sizeof(pj_sockaddr_in));
|
addr_len = pj_sockaddr_get_len(addr);
|
||||||
|
}
|
||||||
|
return pj_ice_strans_sendto(tp_ice->ice_st, 2, pkt, size,
|
||||||
|
addr, addr_len);
|
||||||
} else {
|
} else {
|
||||||
return PJ_SUCCESS;
|
return PJ_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -145,6 +145,11 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp,
|
||||||
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
||||||
const void *pkt,
|
const void *pkt,
|
||||||
pj_size_t size);
|
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,
|
static pj_status_t transport_media_create(pjmedia_transport *tp,
|
||||||
pj_pool_t *pool,
|
pj_pool_t *pool,
|
||||||
unsigned options,
|
unsigned options,
|
||||||
|
@ -171,6 +176,7 @@ static pjmedia_transport_op transport_srtp_op =
|
||||||
&transport_detach,
|
&transport_detach,
|
||||||
&transport_send_rtp,
|
&transport_send_rtp,
|
||||||
&transport_send_rtcp,
|
&transport_send_rtcp,
|
||||||
|
&transport_send_rtcp2,
|
||||||
&transport_media_create,
|
&transport_media_create,
|
||||||
&transport_media_start,
|
&transport_media_start,
|
||||||
&transport_media_stop,
|
&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,
|
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
||||||
const void *pkt,
|
const void *pkt,
|
||||||
pj_size_t size)
|
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;
|
pj_status_t status;
|
||||||
transport_srtp *srtp = (transport_srtp*) tp;
|
transport_srtp *srtp = (transport_srtp*) tp;
|
||||||
int len = size;
|
int len = size;
|
||||||
err_status_t err;
|
err_status_t err;
|
||||||
|
|
||||||
if (srtp->bypass_srtp)
|
if (srtp->bypass_srtp) {
|
||||||
return pjmedia_transport_send_rtcp(srtp->real_tp, pkt, size);
|
return pjmedia_transport_send_rtcp2(srtp->real_tp, addr, addr_len,
|
||||||
|
pkt, size);
|
||||||
|
}
|
||||||
|
|
||||||
if (!srtp->session_inited)
|
if (!srtp->session_inited)
|
||||||
return PJ_SUCCESS;
|
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);
|
err = srtp_protect_rtcp(srtp->srtp_tx_ctx, srtp->tx_buffer, &len);
|
||||||
|
|
||||||
if (err == err_status_ok) {
|
if (err == err_status_ok) {
|
||||||
status = pjmedia_transport_send_rtcp(srtp->real_tp, srtp->tx_buffer,
|
status = pjmedia_transport_send_rtcp2(srtp->real_tp, addr, addr_len,
|
||||||
len);
|
srtp->tx_buffer, len);
|
||||||
} else {
|
} else {
|
||||||
status = PJMEDIA_ERRNO_FROM_LIBSRTP(err);
|
status = PJMEDIA_ERRNO_FROM_LIBSRTP(err);
|
||||||
}
|
}
|
||||||
|
@ -688,6 +705,7 @@ static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static pj_status_t transport_simulate_lost(pjmedia_transport *tp,
|
static pj_status_t transport_simulate_lost(pjmedia_transport *tp,
|
||||||
pjmedia_dir dir,
|
pjmedia_dir dir,
|
||||||
unsigned pct_lost)
|
unsigned pct_lost)
|
||||||
|
|
|
@ -121,6 +121,11 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp,
|
||||||
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
||||||
const void *pkt,
|
const void *pkt,
|
||||||
pj_size_t size);
|
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,
|
static pj_status_t transport_media_create(pjmedia_transport *tp,
|
||||||
pj_pool_t *pool,
|
pj_pool_t *pool,
|
||||||
unsigned options,
|
unsigned options,
|
||||||
|
@ -146,6 +151,7 @@ static pjmedia_transport_op transport_udp_op =
|
||||||
&transport_detach,
|
&transport_detach,
|
||||||
&transport_send_rtp,
|
&transport_send_rtp,
|
||||||
&transport_send_rtcp,
|
&transport_send_rtcp,
|
||||||
|
&transport_send_rtcp2,
|
||||||
&transport_media_create,
|
&transport_media_create,
|
||||||
&transport_media_start,
|
&transport_media_start,
|
||||||
&transport_media_stop,
|
&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,
|
static pj_status_t transport_send_rtcp(pjmedia_transport *tp,
|
||||||
const void *pkt,
|
const void *pkt,
|
||||||
pj_size_t size)
|
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;
|
struct transport_udp *udp = (struct transport_udp*)tp;
|
||||||
pj_ssize_t sent;
|
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);
|
PJ_ASSERT_RETURN(udp->attached, PJ_EINVALIDOP);
|
||||||
|
|
||||||
|
if (addr == NULL) {
|
||||||
|
addr = &udp->rem_rtcp_addr;
|
||||||
|
addr_len = udp->addr_len;
|
||||||
|
}
|
||||||
|
|
||||||
sent = size;
|
sent = size;
|
||||||
status = pj_ioqueue_sendto( udp->rtcp_key, &udp->rtcp_write_op,
|
status = pj_ioqueue_sendto( udp->rtcp_key, &udp->rtcp_write_op,
|
||||||
pkt, &sent, 0,
|
pkt, &sent, 0, addr, addr_len);
|
||||||
&udp->rem_rtcp_addr, udp->addr_len);
|
|
||||||
|
|
||||||
if (status==PJ_SUCCESS || status==PJ_EPENDING)
|
if (status==PJ_SUCCESS || status==PJ_EPENDING)
|
||||||
return PJ_SUCCESS;
|
return PJ_SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue