From 1229122bc17bb86b6a10e043aa3505715b797347 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Wed, 19 Jun 2013 09:06:55 +0000 Subject: Close #1681: - Added compile-time settings PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE and PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE. The default values are both 64 KB when PJMEDIA_HAS_VIDEO is set, otherwise just zero (socket buffer size uses OS default). The settings will be applied to media transport UDP and ICE. - Also added run-time settings so_sndbuf_size and so_rcvbuf_size into ICE stream transport, STUN socket, and TURN socket. Default values are all zero. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4538 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/config.h | 40 +++++++++++++++++++++++++++++++++++ pjmedia/src/pjmedia/transport_ice.c | 14 ++++++++++++- pjmedia/src/pjmedia/transport_udp.c | 42 +++++++++++++++++++++++++++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) (limited to 'pjmedia') diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h index b3becbc7..d718b659 100644 --- a/pjmedia/include/pjmedia/config.h +++ b/pjmedia/include/pjmedia/config.h @@ -1216,6 +1216,46 @@ #endif +/** + * Specify target value for socket receive buffer size. It will be + * applied to RTP socket of media transport using setsockopt(). When + * transport failed to set the specified size, it will try with lower + * value until the highest possible is successfully set. + * + * Setting this to zero will leave the socket receive buffer size to + * OS default (e.g: usually 8 KB on desktop platforms). + * + * Default: 64 KB when video is enabled, otherwise zero (OS default) + */ +#ifndef PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE +# if PJMEDIA_HAS_VIDEO +# define PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE (64*1024) +# else +# define PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE 0 +# endif +#endif + + +/** + * Specify target value for socket send buffer size. It will be + * applied to RTP socket of media transport using setsockopt(). When + * transport failed to set the specified size, it will try with lower + * value until the highest possible is successfully set. + * + * Setting this to zero will leave the socket send buffer size to + * OS default (e.g: usually 8 KB on desktop platforms). + * + * Default: 64 KB when video is enabled, otherwise zero (OS default) + */ +#ifndef PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE +# if PJMEDIA_HAS_VIDEO +# define PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE (64*1024) +# else +# define PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE 0 +# endif +#endif + + /** * @} */ diff --git a/pjmedia/src/pjmedia/transport_ice.c b/pjmedia/src/pjmedia/transport_ice.c index abd872ae..06eef516 100644 --- a/pjmedia/src/pjmedia/transport_ice.c +++ b/pjmedia/src/pjmedia/transport_ice.c @@ -225,6 +225,7 @@ PJ_DEF(pj_status_t) pjmedia_ice_create3(pjmedia_endpt *endpt, { pj_pool_t *pool; pj_ice_strans_cb ice_st_cb; + pj_ice_strans_cfg ice_st_cfg; struct transport_ice *tp_ice; pj_status_t status; @@ -245,6 +246,7 @@ PJ_DEF(pj_status_t) pjmedia_ice_create3(pjmedia_endpt *endpt, tp_ice->oa_role = ROLE_NONE; tp_ice->use_ice = PJ_FALSE; + pj_memcpy(&ice_st_cfg, cfg, sizeof(pj_ice_strans_cfg)); if (cb) pj_memcpy(&tp_ice->cb, cb, sizeof(pjmedia_ice_cb)); @@ -258,8 +260,18 @@ PJ_DEF(pj_status_t) pjmedia_ice_create3(pjmedia_endpt *endpt, ice_st_cb.on_ice_complete = &ice_on_ice_complete; ice_st_cb.on_rx_data = &ice_on_rx_data; + /* Configure RTP socket buffer settings, if not set */ + if (ice_st_cfg.comp[COMP_RTP-1].so_rcvbuf_size == 0) { + ice_st_cfg.comp[COMP_RTP-1].so_rcvbuf_size = + PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE; + } + if (ice_st_cfg.comp[COMP_RTP-1].so_sndbuf_size == 0) { + ice_st_cfg.comp[COMP_RTP-1].so_sndbuf_size = + PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE; + } + /* Create ICE */ - status = pj_ice_strans_create(name, cfg, comp_cnt, tp_ice, + status = pj_ice_strans_create(name, &ice_st_cfg, comp_cnt, tp_ice, &ice_st_cb, &tp_ice->ice_st); if (status != PJ_SUCCESS) { pj_pool_release(pool); diff --git a/pjmedia/src/pjmedia/transport_udp.c b/pjmedia/src/pjmedia/transport_udp.c index 3e288c74..70f16d6d 100644 --- a/pjmedia/src/pjmedia/transport_udp.c +++ b/pjmedia/src/pjmedia/transport_udp.c @@ -693,6 +693,48 @@ static pj_status_t transport_attach( pjmedia_transport *tp, udp->rtp_src_cnt = 0; udp->rtcp_src_cnt = 0; + /* Set buffer size for RTP socket */ +#if PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE + { + unsigned sobuf_size = PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE; + pj_status_t status; + status = pj_sock_setsockopt_sobuf(udp->rtp_sock, pj_SO_RCVBUF(), + PJ_TRUE, &sobuf_size); + if (status != PJ_SUCCESS) { + pj_perror(3, tp->name, status, "Failed setting SO_RCVBUF"); + } else { + if (sobuf_size < PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE) { + PJ_LOG(4, (tp->name, + "Warning! Cannot set SO_RCVBUF as configured, " + "now=%d, configured=%d", + sobuf_size, PJMEDIA_TRANSPORT_SO_RCVBUF_SIZE)); + } else { + PJ_LOG(5, (tp->name, "SO_RCVBUF set to %d", sobuf_size)); + } + } + } +#endif +#if PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE + { + unsigned sobuf_size = PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE; + pj_status_t status; + status = pj_sock_setsockopt_sobuf(udp->rtp_sock, pj_SO_SNDBUF(), + PJ_TRUE, &sobuf_size); + if (status != PJ_SUCCESS) { + pj_perror(3, tp->name, status, "Failed setting SO_SNDBUF"); + } else { + if (sobuf_size < PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE) { + PJ_LOG(4, (tp->name, + "Warning! Cannot set SO_SNDBUF as configured, " + "now=%d, configured=%d", + sobuf_size, PJMEDIA_TRANSPORT_SO_SNDBUF_SIZE)); + } else { + PJ_LOG(5, (tp->name, "SO_SNDBUF set to %d", sobuf_size)); + } + } + } +#endif + /* Unlock keys */ pj_ioqueue_unlock_key(udp->rtcp_key); pj_ioqueue_unlock_key(udp->rtp_key); -- cgit v1.2.3