summaryrefslogtreecommitdiff
path: root/pjmedia/src
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2011-05-19 08:05:23 +0000
committerLiong Sauw Ming <ming@teluu.com>2011-05-19 08:05:23 +0000
commitdc02120b2dff4da759a0f20717ec503107447c44 (patch)
tree9934a138792670bf4538e5c02b0ee1e38730f3d3 /pjmedia/src
parentf8901ea61be686ac4f76e86aa6ec550d11388ffb (diff)
Fixed #1268: Option for automatic/manual sending of RTCP SDES/BYE for the stream.
git-svn-id: http://svn.pjsip.org/repos/pjproject/branches/1.x@3571 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r--pjmedia/src/pjmedia/session.c34
-rw-r--r--pjmedia/src/pjmedia/stream.c93
2 files changed, 100 insertions, 27 deletions
diff --git a/pjmedia/src/pjmedia/session.c b/pjmedia/src/pjmedia/session.c
index 34dc19fc..787cbb4c 100644
--- a/pjmedia/src/pjmedia/session.c
+++ b/pjmedia/src/pjmedia/session.c
@@ -813,6 +813,40 @@ PJ_DEF(pj_status_t) pjmedia_session_resume_stream( pjmedia_session *session,
}
/**
+ * Send RTCP SDES for the session.
+ */
+PJ_DEF(pj_status_t)
+pjmedia_session_send_rtcp_sdes( const pjmedia_session *session )
+{
+ unsigned i;
+
+ PJ_ASSERT_RETURN(session, PJ_EINVAL);
+
+ for (i=0; i<session->stream_cnt; ++i) {
+ pjmedia_stream_send_rtcp_sdes(session->stream[i]);
+ }
+
+ return PJ_SUCCESS;
+}
+
+/**
+ * Send RTCP BYE for the session.
+ */
+PJ_DEF(pj_status_t)
+pjmedia_session_send_rtcp_bye( const pjmedia_session *session )
+{
+ unsigned i;
+
+ PJ_ASSERT_RETURN(session, PJ_EINVAL);
+
+ for (i=0; i<session->stream_cnt; ++i) {
+ pjmedia_stream_send_rtcp_bye(session->stream[i]);
+ }
+
+ return PJ_SUCCESS;
+}
+
+/**
* Enumerate media stream in the session.
*/
PJ_DEF(pj_status_t) pjmedia_session_enum_streams(const pjmedia_session *session,
diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c
index 42761c33..61e33d4b 100644
--- a/pjmedia/src/pjmedia/stream.c
+++ b/pjmedia/src/pjmedia/stream.c
@@ -143,6 +143,7 @@ struct pjmedia_stream
pj_uint32_t rtcp_last_tx; /**< RTCP tx time in timestamp */
pj_uint32_t rtcp_interval; /**< Interval, in timestamp. */
pj_bool_t initial_rr; /**< Initial RTCP RR sent */
+ pj_bool_t rtcp_sdes_bye_disabled;/**< Send RTCP SDES/BYE?*/
/* RFC 2833 DTMF transmission queue: */
int tx_event_pt; /**< Outgoing pt for dtmf. */
@@ -1826,19 +1827,24 @@ on_return:
/* Build RR or SR */
pjmedia_rtcp_build_rtcp(&stream->rtcp, &sr_rr_pkt, &len);
- pkt = (pj_uint8_t*) stream->enc->out_pkt;
- pj_memcpy(pkt, sr_rr_pkt, len);
- pkt += len;
-
- /* Append SDES */
- len = create_rtcp_sdes(stream, (pj_uint8_t*)pkt,
- stream->enc->out_pkt_size - len);
- if (len > 0) {
- pkt += len;
- len = ((pj_uint8_t*)pkt) - ((pj_uint8_t*)stream->enc->out_pkt);
- pjmedia_transport_send_rtcp(stream->transport,
- stream->enc->out_pkt, len);
- }
+
+ if (!stream->rtcp_sdes_bye_disabled) {
+ pkt = (pj_uint8_t*) stream->enc->out_pkt;
+ pj_memcpy(pkt, sr_rr_pkt, len);
+ pkt += len;
+
+ /* Append SDES */
+ len = create_rtcp_sdes(stream, (pj_uint8_t*)pkt,
+ stream->enc->out_pkt_size - len);
+ if (len > 0) {
+ pkt += len;
+ len = ((pj_uint8_t*)pkt) - ((pj_uint8_t*)stream->enc->out_pkt);
+ pjmedia_transport_send_rtcp(stream->transport,
+ stream->enc->out_pkt, len);
+ }
+ } else {
+ pjmedia_transport_send_rtcp(stream->transport, ss_rr_pkt, len);
+ }
stream->initial_rr = PJ_TRUE;
}
@@ -1954,7 +1960,7 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt,
enum { M = 32 };
pjmedia_stream *stream;
pj_str_t name;
- unsigned jb_init, jb_max, jb_min_pre, jb_max_pre, len;
+ unsigned jb_init, jb_max, jb_min_pre, jb_max_pre;
char *p;
pj_status_t status;
@@ -1992,6 +1998,7 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt,
stream->user_data = user_data;
stream->rtcp_interval = (PJMEDIA_RTCP_INTERVAL-500 + (pj_rand()%1000)) *
info->fmt.clock_rate / 1000;
+ stream->rtcp_sdes_bye_disabled = info->rtcp_sdes_bye_disabled;
stream->tx_event_pt = info->tx_event_pt ? info->tx_event_pt : -1;
stream->rx_event_pt = info->rx_event_pt ? info->rx_event_pt : -1;
@@ -2305,11 +2312,8 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt,
#endif
/* Send RTCP SDES */
- len = create_rtcp_sdes(stream, (pj_uint8_t*)stream->enc->out_pkt,
- stream->enc->out_pkt_size);
- if (len != 0) {
- pjmedia_transport_send_rtcp(stream->transport,
- stream->enc->out_pkt, len);
+ if (!stream->rtcp_sdes_bye_disabled) {
+ pjmedia_stream_send_rtcp_sdes(stream);
}
#if defined(PJMEDIA_STREAM_ENABLE_KA) && PJMEDIA_STREAM_ENABLE_KA!=0
@@ -2364,7 +2368,6 @@ err_cleanup:
*/
PJ_DEF(pj_status_t) pjmedia_stream_destroy( pjmedia_stream *stream )
{
- unsigned len;
PJ_ASSERT_RETURN(stream != NULL, PJ_EINVAL);
#if defined(PJMEDIA_HAS_RTCP_XR) && (PJMEDIA_HAS_RTCP_XR != 0)
@@ -2406,13 +2409,8 @@ PJ_DEF(pj_status_t) pjmedia_stream_destroy( pjmedia_stream *stream )
#endif
/* Send RTCP BYE */
- if (stream->enc && stream->transport) {
- len = create_rtcp_bye(stream, (pj_uint8_t*)stream->enc->out_pkt,
- stream->enc->out_pkt_size);
- if (len != 0) {
- pjmedia_transport_send_rtcp(stream->transport,
- stream->enc->out_pkt, len);
- }
+ if (!stream->rtcp_sdes_bye_disabled) {
+ pjmedia_stream_send_rtcp_bye(stream);
}
/* Detach from transport
@@ -2760,3 +2758,44 @@ PJ_DEF(pj_status_t) pjmedia_stream_set_dtmf_callback(pjmedia_stream *stream,
return PJ_SUCCESS;
}
+/*
+ * Send RTCP SDES.
+ */
+PJ_DEF(pj_status_t)
+pjmedia_stream_send_rtcp_sdes( pjmedia_stream *stream )
+{
+ unsigned len;
+
+ PJ_ASSERT_RETURN(stream, PJ_EINVAL);
+
+ len = create_rtcp_sdes(stream, (pj_uint8_t*)stream->enc->out_pkt,
+ stream->enc->out_pkt_size);
+ if (len != 0) {
+ return pjmedia_transport_send_rtcp(stream->transport,
+ stream->enc->out_pkt, len);
+ }
+
+ return PJ_SUCCESS;
+}
+
+/*
+ * Send RTCP BYE.
+ */
+PJ_DEF(pj_status_t)
+pjmedia_stream_send_rtcp_bye( pjmedia_stream *stream )
+{
+ PJ_ASSERT_RETURN(stream, PJ_EINVAL);
+
+ if (stream->enc && stream->transport) {
+ unsigned len;
+
+ len = create_rtcp_bye(stream, (pj_uint8_t*)stream->enc->out_pkt,
+ stream->enc->out_pkt_size);
+ if (len != 0) {
+ return pjmedia_transport_send_rtcp(stream->transport,
+ stream->enc->out_pkt, len);
+ }
+ }
+
+ return PJ_SUCCESS;
+}