From 2068f13bc42cf3a47374aa2765f82724a5782028 Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Mon, 24 Oct 2011 09:28:13 +0000 Subject: Re #1395: Backport of PJSIP 1.x branch into PJSIP 2.0 trunk * Backport of r3557:r3832 TODO: ticket #1268 (Option for automatic/manual sending of RTCP SDES/BYE for the stream) for video stream. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3841 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/config.h | 71 +++++++++++++++++++++- pjmedia/include/pjmedia/delaybuf.h | 20 +++++- pjmedia/include/pjmedia/echo.h | 10 ++- pjmedia/include/pjmedia/jbuf.h | 52 ++++++++++++---- pjmedia/include/pjmedia/session.h | 20 ++++++ pjmedia/include/pjmedia/stream.h | 23 +++++++ pjmedia/include/pjmedia/transport_adapter_sample.h | 9 ++- 7 files changed, 187 insertions(+), 18 deletions(-) (limited to 'pjmedia/include/pjmedia') diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h index e7d2e149..60930818 100644 --- a/pjmedia/include/pjmedia/config.h +++ b/pjmedia/include/pjmedia/config.h @@ -387,7 +387,7 @@ /** - * Number of packets received from different source IP address from the + * Number of RTP packets received from different source IP address from the * remote address required to make the stream switch transmission * to the source address. */ @@ -396,6 +396,16 @@ #endif +/** + * Number of RTCP packets received from different source IP address from the + * remote address required to make the stream switch RTCP transmission + * to the source address. + */ +#ifndef PJMEDIA_RTCP_NAT_PROBATION_CNT +# define PJMEDIA_RTCP_NAT_PROBATION_CNT 3 +#endif + + /** * Specify whether RTCP should be advertised in SDP. This setting would * affect whether RTCP candidate will be added in SDP when ICE is used. @@ -916,7 +926,7 @@ * Default: 5 seconds */ #ifndef PJMEDIA_STREAM_KA_INTERVAL -# define PJMEDIA_STREAM_KA_INTERVAL 5 +# define PJMEDIA_STREAM_KA_INTERVAL 5 #endif @@ -1056,6 +1066,63 @@ #endif +/** + * Minimum gap between two consecutive discards in jitter buffer, + * in milliseconds. + * + * Default: 200 ms + */ +#ifndef PJMEDIA_JBUF_DISC_MIN_GAP +# define PJMEDIA_JBUF_DISC_MIN_GAP 200 +#endif + + +/** + * Minimum burst level reference used for calculating discard duration + * in jitter buffer progressive discard algorithm, in frames. + * + * Default: 1 frame + */ +#ifndef PJMEDIA_JBUF_PRO_DISC_MIN_BURST +# define PJMEDIA_JBUF_PRO_DISC_MIN_BURST 1 +#endif + + +/** + * Maximum burst level reference used for calculating discard duration + * in jitter buffer progressive discard algorithm, in frames. + * + * Default: 200 frames + */ +#ifndef PJMEDIA_JBUF_PRO_DISC_MAX_BURST +# define PJMEDIA_JBUF_PRO_DISC_MAX_BURST 100 +#endif + + +/** + * Duration for progressive discard algotithm in jitter buffer to discard + * an excessive frame when burst is equal to or lower than + * PJMEDIA_JBUF_PRO_DISC_MIN_BURST, in milliseconds. + * + * Default: 2000 ms + */ +#ifndef PJMEDIA_JBUF_PRO_DISC_T1 +# define PJMEDIA_JBUF_PRO_DISC_T1 2000 +#endif + + +/** + * Duration for progressive discard algotithm in jitter buffer to discard + * an excessive frame when burst is equal to or lower than + * PJMEDIA_JBUF_PRO_DISC_MAX_BURST, in milliseconds. + * + * Default: 10000 ms + */ +#ifndef PJMEDIA_JBUF_PRO_DISC_T2 +# define PJMEDIA_JBUF_PRO_DISC_T2 10000 +#endif + + /** * Video stream will discard old picture from the jitter buffer as soon as * new picture is received, to reduce latency. diff --git a/pjmedia/include/pjmedia/delaybuf.h b/pjmedia/include/pjmedia/delaybuf.h index 9dcad5ee..09b01bbb 100644 --- a/pjmedia/include/pjmedia/delaybuf.h +++ b/pjmedia/include/pjmedia/delaybuf.h @@ -63,6 +63,19 @@ PJ_BEGIN_DECL /** Opaque declaration for delay buffer. */ typedef struct pjmedia_delay_buf pjmedia_delay_buf; +/** + * Delay buffer options. + */ +typedef enum pjmedia_delay_buf_flag +{ + /** + * Use simple FIFO mechanism for the delay buffer, i.e. + * without WSOLA for expanding and shrinking audio samples. + */ + PJMEDIA_DELAY_BUF_SIMPLE_FIFO = 1 + +} pjmedia_delay_buf_flag; + /** * Create the delay buffer. Once the delay buffer is created, it will * enter learning state unless the delay argument is specified, which @@ -79,7 +92,12 @@ typedef struct pjmedia_delay_buf pjmedia_delay_buf; * in ms, if this value is negative or less than * one frame time, default maximum delay used is * 400 ms. - * @param options Option flags, must be zero for now. + * @param options Options. If PJMEDIA_DELAY_BUF_SIMPLE_FIFO is + * specified, then a simple FIFO mechanism + * will be used instead of the adaptive + * implementation (which uses WSOLA to expand + * or shrink audio samples). + * See #pjmedia_delay_buf_flag for other options. * @param p_b Pointer to receive the delay buffer instance. * * @return PJ_SUCCESS if the delay buffer has been diff --git a/pjmedia/include/pjmedia/echo.h b/pjmedia/include/pjmedia/echo.h index f2c2210c..ba7f8897 100644 --- a/pjmedia/include/pjmedia/echo.h +++ b/pjmedia/include/pjmedia/echo.h @@ -88,7 +88,15 @@ typedef enum pjmedia_echo_flag * for the echo canceller, but application will guarantee that echo * canceller will not be called by different threads at the same time. */ - PJMEDIA_ECHO_NO_LOCK = 16 + PJMEDIA_ECHO_NO_LOCK = 16, + + /** + * If PJMEDIA_ECHO_USE_SIMPLE_FIFO flag is specified, the delay buffer + * created for the echo canceller will use simple FIFO mechanism, i.e. + * without using WSOLA to expand and shrink audio samples. + */ + PJMEDIA_ECHO_USE_SIMPLE_FIFO = 32 + } pjmedia_echo_flag; diff --git a/pjmedia/include/pjmedia/jbuf.h b/pjmedia/include/pjmedia/jbuf.h index 2ae4ed6c..2cda3dd9 100644 --- a/pjmedia/include/pjmedia/jbuf.h +++ b/pjmedia/include/pjmedia/jbuf.h @@ -48,7 +48,7 @@ PJ_BEGIN_DECL /** * Types of frame returned by the jitter buffer. */ -enum pjmedia_jb_frame_type +typedef enum pjmedia_jb_frame_type { PJMEDIA_JB_MISSING_FRAME = 0, /**< No frame because it's missing */ PJMEDIA_JB_NORMAL_FRAME = 1, /**< Normal frame is being returned */ @@ -56,13 +56,41 @@ enum pjmedia_jb_frame_type because JB is bufferring. */ PJMEDIA_JB_ZERO_EMPTY_FRAME = 3 /**< Zero frame is being returned because JB is empty. */ -}; +} pjmedia_jb_frame_type; /** - * @see pjmedia_jb_frame_type. + * Enumeration of jitter buffer discard algorithm. The jitter buffer + * continuously calculates the jitter level to get the optimum latency at + * any time and in order to adjust the latency, the jitter buffer may need + * to discard some frames. */ -typedef enum pjmedia_jb_frame_type pjmedia_jb_frame_type; +typedef enum pjmedia_jb_discard_algo +{ + /** + * Jitter buffer should not discard any frame, except when the jitter + * buffer is full and a new frame arrives, one frame will be discarded + * to make space for the new frame. + */ + PJMEDIA_JB_DISCARD_NONE = 0, + + /** + * Only discard one frame in at least 200ms when the latency is considered + * much higher than it should be. When the jitter buffer is full and a new + * frame arrives, one frame will be discarded to make space for the new + * frame. + */ + PJMEDIA_JB_DISCARD_STATIC, + + /** + * The discard rate is dynamically calculated based on actual parameters + * such as jitter level and latency. When the jitter buffer is full and + * a new frame arrives, one frame will be discarded to make space for the + * new frame. + */ + PJMEDIA_JB_DISCARD_PROGRESSIVE + +} pjmedia_jb_discard_algo; /** @@ -107,7 +135,9 @@ typedef struct pjmedia_jbuf pjmedia_jbuf; /** * Create an adaptive jitter buffer according to the specification. If * application wants to have a fixed jitter buffer, it may call - * #pjmedia_jbuf_set_fixed() after the jitter buffer is created. + * #pjmedia_jbuf_set_fixed() after the jitter buffer is created. Also + * if application wants to alter the discard algorithm, which the default + * PJMEDIA_JB_DISCARD_PROGRESSIVE, it may call #pjmedia_jbuf_set_discard(). * * This function may allocate large chunk of memory to keep the frames in * the buffer. @@ -174,16 +204,16 @@ PJ_DECL(pj_status_t) pjmedia_jbuf_set_adaptive( pjmedia_jbuf *jb, /** - * Enable/disable the jitter buffer drift detection and handling mechanism. - * The default behavior is enabled. + * Set the jitter buffer discard algorithm. The default discard algorithm, + * set in jitter buffer creation, is PJMEDIA_JB_DISCARD_PROGRESSIVE. * - * @param jb The jitter buffer - * @param enable Set to PJ_TRUE to enable or PJ_FALSE to disable. + * @param jb The jitter buffer. + * @param algo The discard algorithm to be used. * * @return PJ_SUCCESS on success. */ -PJ_DECL(pj_status_t) pjmedia_jbuf_enable_discard(pjmedia_jbuf *jb, - pj_bool_t enable); +PJ_DECL(pj_status_t) pjmedia_jbuf_set_discard(pjmedia_jbuf *jb, + pjmedia_jb_discard_algo algo); /** diff --git a/pjmedia/include/pjmedia/session.h b/pjmedia/include/pjmedia/session.h index efab853a..44238c56 100644 --- a/pjmedia/include/pjmedia/session.h +++ b/pjmedia/include/pjmedia/session.h @@ -231,6 +231,26 @@ PJ_DECL(pj_status_t) pjmedia_session_resume_stream(pjmedia_session *session, unsigned index, pjmedia_dir dir); +/** + * Send RTCP SDES for the session. + * + * @param session The media session. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) +pjmedia_session_send_rtcp_sdes( const pjmedia_session *session ); + +/** + * Send RTCP BYE for the session. + * + * @param session The media session. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) +pjmedia_session_send_rtcp_bye( const pjmedia_session *session ); + /** * Enumerate media streams in the session. * diff --git a/pjmedia/include/pjmedia/stream.h b/pjmedia/include/pjmedia/stream.h index ea3a1b64..88e5a882 100644 --- a/pjmedia/include/pjmedia/stream.h +++ b/pjmedia/include/pjmedia/stream.h @@ -135,6 +135,9 @@ typedef struct pjmedia_stream_info (see #PJMEDIA_STREAM_ENABLE_KA) is enabled? */ #endif + pj_bool_t rtcp_sdes_bye_disabled; + /**< Disable automatic sending of RTCP + SDES and BYE. */ } pjmedia_stream_info; @@ -403,6 +406,26 @@ pjmedia_stream_set_dtmf_callback(pjmedia_stream *stream, void *user_data); +/** + * Send RTCP SDES for the media stream. + * + * @param stream The media stream. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) +pjmedia_stream_send_rtcp_sdes( pjmedia_stream *stream ); + +/** + * Send RTCP BYE for the media stream. + * + * @param stream The media stream. + * + * @return PJ_SUCCESS on success. + */ +PJ_DECL(pj_status_t) +pjmedia_stream_send_rtcp_bye( pjmedia_stream *stream ); + /** * @} */ diff --git a/pjmedia/include/pjmedia/transport_adapter_sample.h b/pjmedia/include/pjmedia/transport_adapter_sample.h index 6c41a69d..62eb1c0f 100644 --- a/pjmedia/include/pjmedia/transport_adapter_sample.h +++ b/pjmedia/include/pjmedia/transport_adapter_sample.h @@ -49,15 +49,18 @@ PJ_BEGIN_DECL * @param endpt The media endpoint. * @param name Optional name to identify this media transport * for logging purposes. - * @param transport The underlying media transport to send and receive - * RTP/RTCP packets. + * @param base_tp The base/underlying media transport to send and + * receive RTP/RTCP packets. + * @param del_base Specify whether the base transport should also be + * destroyed when destroy() is called upon us. * @param p_tp Pointer to receive the media transport instance. * * @return PJ_SUCCESS on success, or the appropriate error code. */ PJ_DECL(pj_status_t) pjmedia_tp_adapter_create( pjmedia_endpt *endpt, const char *name, - pjmedia_transport *transport, + pjmedia_transport *base_tp, + pj_bool_t del_base, pjmedia_transport **p_tp); PJ_END_DECL -- cgit v1.2.3