diff options
author | Nanang Izzuddin <nanang@teluu.com> | 2012-07-05 07:26:29 +0000 |
---|---|---|
committer | Nanang Izzuddin <nanang@teluu.com> | 2012-07-05 07:26:29 +0000 |
commit | 1d8e02448bda3f1bca867c8dc8e0d8feca4c74e1 (patch) | |
tree | 804c67c7a0e05d61b742da0f88d060ada3102563 | |
parent | e914af2a02fbace89608ca2a72ea990ec8fbb1f5 (diff) |
Fix #1547:
- Added PJMEDIA_MAX_MRU to specify maximum packet size in receiving direction.
- Added max_pkt_size into pj_turn_sock_cfg, default is PJ_TURN_MAX_PKT_LEN.
- Fixed hardcoded MTU settings in media transport SRTP.
- Added MIN_CHUNKS_PER_FRM constant in video stream.
Notes:
- PJMEDIA_MAX_MTU & PJMEDIA_MAX_MRU to specify max packet size for TX and RX dir.
- For ICE media transport, TURN session limits outgoing packet size to PJ_TURN_MAX_PKT_LEN (the size of internal buffer for inserting TURN overheads).
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4197 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r-- | pjmedia/include/pjmedia/config.h | 10 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_srtp.c | 15 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/transport_udp.c | 6 | ||||
-rw-r--r-- | pjmedia/src/pjmedia/vid_stream.c | 19 | ||||
-rw-r--r-- | pjnath/include/pjnath/stun_sock.h | 4 | ||||
-rw-r--r-- | pjnath/include/pjnath/turn_sock.h | 7 | ||||
-rw-r--r-- | pjnath/src/pjnath/turn_sock.c | 3 | ||||
-rw-r--r-- | pjsip/src/pjsua-lib/pjsua_media.c | 4 |
8 files changed, 49 insertions, 19 deletions
diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h index 3f92a6b9..c37f43cd 100644 --- a/pjmedia/include/pjmedia/config.h +++ b/pjmedia/include/pjmedia/config.h @@ -371,7 +371,7 @@ /** - * Max packet size to support. + * Max packet size for transmitting direction. */ #ifndef PJMEDIA_MAX_MTU # define PJMEDIA_MAX_MTU 1500 @@ -379,6 +379,14 @@ /** + * Max packet size for receiving direction. + */ +#ifndef PJMEDIA_MAX_MRU +# define PJMEDIA_MAX_MRU 2000 +#endif + + +/** * DTMF/telephone-event duration, in timestamp. */ #ifndef PJMEDIA_DTMF_DURATION diff --git a/pjmedia/src/pjmedia/transport_srtp.c b/pjmedia/src/pjmedia/transport_srtp.c index 76bd1518..eb30978b 100644 --- a/pjmedia/src/pjmedia/transport_srtp.c +++ b/pjmedia/src/pjmedia/transport_srtp.c @@ -34,9 +34,11 @@ #define THIS_FILE "transport_srtp.c" -/* Maximum size of packet */ -#define MAX_RTP_BUFFER_LEN 1500 -#define MAX_RTCP_BUFFER_LEN 1500 +/* Maximum size of outgoing packet */ +#define MAX_RTP_BUFFER_LEN PJMEDIA_MAX_MTU +#define MAX_RTCP_BUFFER_LEN PJMEDIA_MAX_MTU + +/* Maximum SRTP crypto key length */ #define MAX_KEY_LEN 32 /* Initial value of probation counter. When probation counter > 0, @@ -777,7 +779,7 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp, if (srtp->bypass_srtp) return pjmedia_transport_send_rtp(srtp->member_tp, pkt, size); - if (size > sizeof(srtp->rtp_tx_buffer)) + if (size > sizeof(srtp->rtp_tx_buffer) - 10) return PJ_ETOOBIG; pj_memcpy(srtp->rtp_tx_buffer, pkt, size); @@ -791,7 +793,8 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp, pj_lock_release(srtp->mutex); if (err == err_status_ok) { - status = pjmedia_transport_send_rtp(srtp->member_tp, srtp->rtp_tx_buffer, len); + status = pjmedia_transport_send_rtp(srtp->member_tp, + srtp->rtp_tx_buffer, len); } else { status = PJMEDIA_ERRNO_FROM_LIBSRTP(err); } @@ -822,7 +825,7 @@ static pj_status_t transport_send_rtcp2(pjmedia_transport *tp, pkt, size); } - if (size > sizeof(srtp->rtcp_tx_buffer)) + if (size > sizeof(srtp->rtcp_tx_buffer) - 10) return PJ_ETOOBIG; pj_memcpy(srtp->rtcp_tx_buffer, pkt, size); diff --git a/pjmedia/src/pjmedia/transport_udp.c b/pjmedia/src/pjmedia/transport_udp.c index 63178599..3e288c74 100644 --- a/pjmedia/src/pjmedia/transport_udp.c +++ b/pjmedia/src/pjmedia/transport_udp.c @@ -29,7 +29,7 @@ /* Maximum size of incoming RTP packet */ -#define RTP_LEN PJMEDIA_MAX_MTU +#define RTP_LEN PJMEDIA_MAX_MRU /* Maximum size of incoming RTCP packet */ #define RTCP_LEN 600 @@ -42,7 +42,7 @@ static const pj_str_t ID_RTP_AVP = { "RTP/AVP", 7 }; /* Pending write buffer */ typedef struct pending_write { - char buffer[RTP_LEN]; + char buffer[PJMEDIA_MAX_MTU]; pj_ioqueue_op_key_t op_key; } pending_write; @@ -752,7 +752,7 @@ static pj_status_t transport_send_rtp( pjmedia_transport *tp, PJ_ASSERT_RETURN(udp->attached, PJ_EINVALIDOP); /* Check that the size is supported */ - PJ_ASSERT_RETURN(size <= RTP_LEN, PJ_ETOOBIG); + PJ_ASSERT_RETURN(size <= PJMEDIA_MAX_MTU, PJ_ETOOBIG); /* Simulate packet lost on TX direction */ if (udp->tx_drop_pct) { diff --git a/pjmedia/src/pjmedia/vid_stream.c b/pjmedia/src/pjmedia/vid_stream.c index 66923fe5..6962a7db 100644 --- a/pjmedia/src/pjmedia/vid_stream.c +++ b/pjmedia/src/pjmedia/vid_stream.c @@ -68,6 +68,13 @@ # define PJMEDIA_VSTREAM_INC 1000 #endif +/* Due to network MTU limitation, a picture bitstream may be splitted into + * several chunks for RTP delivery. The chunk number may vary depend on the + * picture resolution and MTU. This constant specifies the minimum chunk + * number to be allocated to store a picture bitstream in decoding direction. + */ +#define MIN_CHUNKS_PER_FRM 30 + /* Video stream keep-alive feature is currently disabled. */ #if defined(PJMEDIA_STREAM_ENABLE_KA) && PJMEDIA_STREAM_ENABLE_KA != 0 # undef PJMEDIA_STREAM_ENABLE_KA @@ -1357,7 +1364,6 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_create( int frm_ptime, chunks_per_frm; pjmedia_video_format_detail *vfd_enc, *vfd_dec; char *p; - unsigned dec_mtu; pj_status_t status; if (!pool) { @@ -1410,9 +1416,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_create( if (info->codec_param->enc_mtu > PJMEDIA_MAX_MTU) info->codec_param->enc_mtu = PJMEDIA_MAX_MTU; - /* MTU estimation for decoding direction */ - dec_mtu = PJMEDIA_MAX_MTU; - + /* Packet size estimation for decoding direction */ vfd_enc = pjmedia_format_get_video_format_detail( &info->codec_param->enc_fmt, PJ_TRUE); vfd_dec = pjmedia_format_get_video_format_detail( @@ -1528,8 +1532,9 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_create( /* Init jitter buffer parameters: */ frm_ptime = 1000 * vfd_enc->fps.denum / vfd_enc->fps.num; - chunks_per_frm = stream->frame_size / dec_mtu; - if (chunks_per_frm == 0) chunks_per_frm = 1; + chunks_per_frm = stream->frame_size / PJMEDIA_MAX_MRU; + if (chunks_per_frm < MIN_CHUNKS_PER_FRM) + chunks_per_frm = MIN_CHUNKS_PER_FRM; /* JB max count, default 500ms */ if (info->jb_max >= frm_ptime) @@ -1564,7 +1569,7 @@ PJ_DEF(pj_status_t) pjmedia_vid_stream_create( /* Create jitter buffer */ status = pjmedia_jbuf_create(pool, &stream->dec->port.info.name, - dec_mtu + PJMEDIA_STREAM_RESV_PAYLOAD_LEN, + PJMEDIA_MAX_MRU, 1000 * vfd_enc->fps.denum / vfd_enc->fps.num, jb_max, &stream->jb); if (status != PJ_SUCCESS) diff --git a/pjnath/include/pjnath/stun_sock.h b/pjnath/include/pjnath/stun_sock.h index 08b0c711..db7d1d04 100644 --- a/pjnath/include/pjnath/stun_sock.h +++ b/pjnath/include/pjnath/stun_sock.h @@ -218,7 +218,9 @@ typedef struct pj_stun_sock_info typedef struct pj_stun_sock_cfg { /** - * Packet buffer size. Default value is PJ_STUN_SOCK_PKT_LEN. + * Packet buffer size. + * + * Default value is PJ_STUN_SOCK_PKT_LEN. */ unsigned max_pkt_size; diff --git a/pjnath/include/pjnath/turn_sock.h b/pjnath/include/pjnath/turn_sock.h index 6057f39e..c1250856 100644 --- a/pjnath/include/pjnath/turn_sock.h +++ b/pjnath/include/pjnath/turn_sock.h @@ -109,6 +109,13 @@ typedef struct pj_turn_sock_cb typedef struct pj_turn_sock_cfg { /** + * Packet buffer size. + * + * Default value is PJ_TURN_MAX_PKT_LEN. + */ + unsigned max_pkt_size; + + /** * QoS traffic type to be set on this transport. When application wants * to apply QoS tagging to the transport, it's preferable to set this * field rather than \a qos_param fields since this is more portable. diff --git a/pjnath/src/pjnath/turn_sock.c b/pjnath/src/pjnath/turn_sock.c index e841af2c..131c433d 100644 --- a/pjnath/src/pjnath/turn_sock.c +++ b/pjnath/src/pjnath/turn_sock.c @@ -97,6 +97,7 @@ static void timer_cb(pj_timer_heap_t *th, pj_timer_entry *e); PJ_DEF(void) pj_turn_sock_cfg_default(pj_turn_sock_cfg *cfg) { pj_bzero(cfg, sizeof(*cfg)); + cfg->max_pkt_size = PJ_TURN_MAX_PKT_LEN; cfg->qos_type = PJ_QOS_TYPE_BEST_EFFORT; cfg->qos_ignore_error = PJ_TRUE; } @@ -474,7 +475,7 @@ static pj_bool_t on_connect_complete(pj_activesock_t *asock, /* Kick start pending read operation */ status = pj_activesock_start_read(asock, turn_sock->pool, - PJ_TURN_MAX_PKT_LEN, 0); + turn_sock->setting.max_pkt_size, 0); /* Init send_key */ pj_ioqueue_op_key_init(&turn_sock->send_key, sizeof(turn_sock->send_key)); diff --git a/pjsip/src/pjsua-lib/pjsua_media.c b/pjsip/src/pjsua-lib/pjsua_media.c index 1f721c8b..22b363cb 100644 --- a/pjsip/src/pjsua-lib/pjsua_media.c +++ b/pjsip/src/pjsua-lib/pjsua_media.c @@ -720,6 +720,10 @@ static pj_status_t create_ice_media_transport( sizeof(cfg->qos_params)); } + /* Configure packet size for STUN and TURN sockets */ + ice_cfg.stun.cfg.max_pkt_size = PJMEDIA_MAX_MRU; + ice_cfg.turn.cfg.max_pkt_size = PJMEDIA_MAX_MRU; + pj_bzero(&ice_cb, sizeof(pjmedia_ice_cb)); ice_cb.on_ice_complete = &on_ice_complete; pj_ansi_snprintf(name, sizeof(name), "icetp%02d", call_med->idx); |