summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiza Sulistyo <riza@teluu.com>2016-11-03 09:39:20 +0000
committerRiza Sulistyo <riza@teluu.com>2016-11-03 09:39:20 +0000
commitaaa1f42f8420d8c2ae6b74b93553432038c6abc6 (patch)
treedec55528adb402f9642ef808a7c95f8239e007dc
parentca2a5c2d6759dbe0cc2adbbb6283189a89d4819a (diff)
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
-rw-r--r--pjmedia/include/pjmedia/transport.h96
-rw-r--r--pjmedia/src/pjmedia/stream.c14
-rw-r--r--pjmedia/src/pjmedia/transport_adapter_sample.c54
-rw-r--r--pjmedia/src/pjmedia/vid_stream.c14
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
@@ -241,6 +241,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
*/
typedef enum pjmedia_tranport_media_option
@@ -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);
};
@@ -547,6 +565,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.
*
* @param info Transport info to be initialized.
@@ -604,6 +672,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 <tt>attach2()</tt> member of
+ * the transport if it is implemented, otherwise it calls <tt>attach()</tt>
+ * 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 <tt>attach()</tt> member of
* the transport.
*
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;