From aaa1f42f8420d8c2ae6b74b93553432038c6abc6 Mon Sep 17 00:00:00 2001 From: Riza Sulistyo Date: Thu, 3 Nov 2016 09:39:20 +0000 Subject: Re #1977: Add attach2() and pjmedia_transport_attach2() to pjmedia transport interface. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5478 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/transport.h | 96 +++++++++++++++++++++++++- pjmedia/src/pjmedia/stream.c | 14 ++-- pjmedia/src/pjmedia/transport_adapter_sample.c | 54 ++++++--------- pjmedia/src/pjmedia/vid_stream.c | 14 ++-- 4 files changed, 136 insertions(+), 42 deletions(-) diff --git a/pjmedia/include/pjmedia/transport.h b/pjmedia/include/pjmedia/transport.h index 0e788c51..b4c2e11e 100644 --- a/pjmedia/include/pjmedia/transport.h +++ b/pjmedia/include/pjmedia/transport.h @@ -240,6 +240,11 @@ typedef struct pjmedia_transport pjmedia_transport; */ typedef struct pjmedia_transport_info pjmedia_transport_info; +/** + * Forward declaration for media transport attach param. + */ +typedef struct pjmedia_transport_attach_param pjmedia_transport_attach_param; + /** * This enumeration specifies the general behaviour of media processing */ @@ -303,7 +308,8 @@ struct pjmedia_transport_op * This function is called by the stream when the transport is about * to be used by the stream for the first time, and it tells the transport * about remote RTP address to send the packet and some callbacks to be - * called for incoming packets. + * called for incoming packets. This function exists for backwards + * compatibility. Transports should implement attach2 instead. * * Application should call #pjmedia_transport_attach() instead of * calling this function directly. @@ -433,6 +439,18 @@ struct pjmedia_transport_op * calling this function directly. */ pj_status_t (*destroy)(pjmedia_transport *tp); + + /** + * This function is called by the stream when the transport is about + * to be used by the stream for the first time, and it tells the transport + * about remote RTP address to send the packet and some callbacks to be + * called for incoming packets. + * + * Application should call #pjmedia_transport_attach2() instead of + * calling this function directly. + */ + pj_status_t (*attach2)(pjmedia_transport *tp, + pjmedia_transport_attach_param *att_param); }; @@ -546,6 +564,56 @@ struct pjmedia_transport_info }; +/** + * This structure describes the data passed when calling + * #pjmedia_transport_attach2(). + */ +struct pjmedia_transport_attach_param +{ + /** + * The media stream. + */ + void *stream; + + /** + * Indicate the stream type, either it's audio (PJMEDIA_TYPE_AUDIO) + * or video (PJMEDIA_TYPE_VIDEO). + */ + pjmedia_type media_type; + + /** + * Remote RTP address to send RTP packet to. + */ + pj_sockaddr rem_addr; + + /** + * Optional remote RTCP address. If the argument is NULL + * or if the address is zero, the RTCP address will be + * calculated from the RTP address (which is RTP port plus one). + */ + pj_sockaddr rem_rtcp; + + /** + * Length of the remote address. + */ + unsigned addr_len; + + /** + * Arbitrary user data to be set when the callbacks are called. + */ + void *user_data; + + /** + * Callback to be called when RTP packet is received on the transport. + */ + void (*rtp_cb)(void *user_data, void *pkt, pj_ssize_t); + + /** + * Callback to be called when RTCP packet is received on the transport. + */ + void (*rtcp_cb)(void *user_data, void *pkt, pj_ssize_t); +}; + /** * Initialize transport info. * @@ -602,6 +670,32 @@ PJ_INLINE(void*) pjmedia_transport_info_get_spc_info( } +/** + * Attach callbacks to be called on receipt of incoming RTP/RTCP packets. + * This is just a simple wrapper which calls attach2() member of + * the transport if it is implemented, otherwise it calls attach() + * member of the transport. + * + * @param tp The media transport. + * @param att_param The transport attach param. + * + * @return PJ_SUCCESS on success, or the appropriate error code. + */ +PJ_INLINE(pj_status_t) pjmedia_transport_attach2(pjmedia_transport *tp, + pjmedia_transport_attach_param *att_param) +{ + if (tp->op->attach2) { + return tp->op->attach2(tp, att_param); + } else { + return tp->op->attach(tp, att_param->user_data, + (pj_sockaddr_t*)&att_param->rem_addr, + (pj_sockaddr_t*)&att_param->rem_rtcp, + att_param->addr_len, att_param->rtp_cb, + att_param->rtcp_cb); + } +} + + /** * Attach callbacks to be called on receipt of incoming RTP/RTCP packets. * This is just a simple wrapper which calls attach() member of diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c index 823bfb3d..5b67792d 100644 --- a/pjmedia/src/pjmedia/stream.c +++ b/pjmedia/src/pjmedia/stream.c @@ -2005,6 +2005,7 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt, pj_pool_t *own_pool = NULL; char *p; pj_status_t status; + pjmedia_transport_attach_param att_param; PJ_ASSERT_RETURN(endpt && info && p_stream, PJ_EINVAL); @@ -2346,12 +2347,17 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt, stream->out_rtcp_pkt_size = PJMEDIA_MAX_MTU; stream->out_rtcp_pkt = pj_pool_alloc(pool, stream->out_rtcp_pkt_size); + att_param.stream = stream; + att_param.media_type = PJMEDIA_TYPE_AUDIO; + att_param.user_data = stream; + pj_sockaddr_cp(&att_param.rem_addr, &info->rem_addr); + pj_sockaddr_cp(&att_param.rem_rtcp, &info->rem_rtcp); + att_param.addr_len = pj_sockaddr_get_len(&info->rem_addr); + att_param.rtp_cb = &on_rx_rtp; + att_param.rtcp_cb = &on_rx_rtcp; /* Only attach transport when stream is ready. */ - status = pjmedia_transport_attach(tp, stream, &info->rem_addr, - &info->rem_rtcp, - pj_sockaddr_get_len(&info->rem_addr), - &on_rx_rtp, &on_rx_rtcp); + status = pjmedia_transport_attach2(tp, &att_param); if (status != PJ_SUCCESS) goto err_cleanup; diff --git a/pjmedia/src/pjmedia/transport_adapter_sample.c b/pjmedia/src/pjmedia/transport_adapter_sample.c index a076bdab..0ad733fd 100644 --- a/pjmedia/src/pjmedia/transport_adapter_sample.c +++ b/pjmedia/src/pjmedia/transport_adapter_sample.c @@ -26,17 +26,8 @@ /* Transport functions prototypes */ static pj_status_t transport_get_info (pjmedia_transport *tp, pjmedia_transport_info *info); -static pj_status_t transport_attach (pjmedia_transport *tp, - void *user_data, - const pj_sockaddr_t *rem_addr, - const pj_sockaddr_t *rem_rtcp, - unsigned addr_len, - void (*rtp_cb)(void*, - void*, - pj_ssize_t), - void (*rtcp_cb)(void*, - void*, - pj_ssize_t)); +static pj_status_t transport_attach2 (pjmedia_transport *tp, + pjmedia_transport_attach_param *att_prm); static void transport_detach (pjmedia_transport *tp, void *strm); static pj_status_t transport_send_rtp( pjmedia_transport *tp, @@ -76,7 +67,7 @@ static pj_status_t transport_destroy (pjmedia_transport *tp); static struct pjmedia_transport_op tp_adapter_op = { &transport_get_info, - &transport_attach, + NULL, &transport_detach, &transport_send_rtp, &transport_send_rtcp, @@ -86,7 +77,8 @@ static struct pjmedia_transport_op tp_adapter_op = &transport_media_start, &transport_media_stop, &transport_simulate_lost, - &transport_destroy + &transport_destroy, + &transport_attach2, }; @@ -100,6 +92,7 @@ struct tp_adapter /* Stream information. */ void *stream_user_data; + void *stream_ref; void (*stream_rtp_cb)(void *user_data, void *pkt, pj_ssize_t); @@ -190,22 +183,12 @@ static void transport_rtcp_cb(void *user_data, void *pkt, pj_ssize_t size) adapter->stream_rtcp_cb(adapter->stream_user_data, pkt, size); } - /* - * attach() is called by stream to register callbacks that we should + * attach2() is called by stream to register callbacks that we should * call on receipt of RTP and RTCP packets. */ -static pj_status_t transport_attach(pjmedia_transport *tp, - void *user_data, - const pj_sockaddr_t *rem_addr, - const pj_sockaddr_t *rem_rtcp, - unsigned addr_len, - void (*rtp_cb)(void*, - void*, - pj_ssize_t), - void (*rtcp_cb)(void*, - void*, - pj_ssize_t)) +static pj_status_t transport_attach2(pjmedia_transport *tp, + pjmedia_transport_attach_param *att_param) { struct tp_adapter *adapter = (struct tp_adapter*)tp; pj_status_t status; @@ -215,17 +198,21 @@ static pj_status_t transport_attach(pjmedia_transport *tp, * instead. */ pj_assert(adapter->stream_user_data == NULL); - adapter->stream_user_data = user_data; - adapter->stream_rtp_cb = rtp_cb; - adapter->stream_rtcp_cb = rtcp_cb; - - status = pjmedia_transport_attach(adapter->slave_tp, adapter, rem_addr, - rem_rtcp, addr_len, &transport_rtp_cb, - &transport_rtcp_cb); + adapter->stream_user_data = att_param->user_data; + adapter->stream_rtp_cb = att_param->rtp_cb; + adapter->stream_rtcp_cb = att_param->rtcp_cb; + adapter->stream_ref = att_param->stream; + + att_param->rtp_cb = &transport_rtp_cb; + att_param->rtcp_cb = &transport_rtcp_cb; + att_param->user_data = adapter; + + status = pjmedia_transport_attach2(adapter->slave_tp, att_param); if (status != PJ_SUCCESS) { adapter->stream_user_data = NULL; adapter->stream_rtp_cb = NULL; adapter->stream_rtcp_cb = NULL; + adapter->stream_ref = NULL; return status; } @@ -247,6 +234,7 @@ static void transport_detach(pjmedia_transport *tp, void *strm) adapter->stream_user_data = NULL; adapter->stream_rtp_cb = NULL; adapter->stream_rtcp_cb = NULL; + adapter->stream_ref = NULL; } } diff --git a/pjmedia/src/pjmedia/vid_stream.c b/pjmedia/src/pjmedia/vid_stream.c index 4e0eb634..6f383ed1 100644 --- a/pjmedia/src/pjmedia/vid_stream.c +++ b/pjmedia/src/pjmedia/vid_stream.c @@ -1424,6 +1424,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_create( pjmedia_video_format_detail *vfd_enc, *vfd_dec; char *p; pj_status_t status; + pjmedia_transport_attach_param att_param; if (!pool) { own_pool = pjmedia_endpt_create_pool( endpt, "vstrm%p", @@ -1665,12 +1666,17 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_create( stream->out_rtcp_pkt_size = PJMEDIA_MAX_MTU; stream->out_rtcp_pkt = pj_pool_alloc(pool, stream->out_rtcp_pkt_size); + att_param.stream = stream; + att_param.media_type = PJMEDIA_TYPE_VIDEO; + att_param.user_data = stream; + pj_sockaddr_cp(&att_param.rem_addr, &info->rem_addr); + pj_sockaddr_cp(&att_param.rem_rtcp, &info->rem_rtcp); + att_param.addr_len = pj_sockaddr_get_len(&info->rem_addr); + att_param.rtp_cb = &on_rx_rtp; + att_param.rtcp_cb = &on_rx_rtcp; /* Only attach transport when stream is ready. */ - status = pjmedia_transport_attach(tp, stream, &info->rem_addr, - &info->rem_rtcp, - pj_sockaddr_get_len(&info->rem_addr), - &on_rx_rtp, &on_rx_rtcp); + status = pjmedia_transport_attach2(tp, &att_param); if (status != PJ_SUCCESS) return status; -- cgit v1.2.3