summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2012-07-05 07:26:29 +0000
committerNanang Izzuddin <nanang@teluu.com>2012-07-05 07:26:29 +0000
commit1d8e02448bda3f1bca867c8dc8e0d8feca4c74e1 (patch)
tree804c67c7a0e05d61b742da0f88d060ada3102563 /pjmedia
parente914af2a02fbace89608ca2a72ea990ec8fbb1f5 (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
Diffstat (limited to 'pjmedia')
-rw-r--r--pjmedia/include/pjmedia/config.h10
-rw-r--r--pjmedia/src/pjmedia/transport_srtp.c15
-rw-r--r--pjmedia/src/pjmedia/transport_udp.c6
-rw-r--r--pjmedia/src/pjmedia/vid_stream.c19
4 files changed, 33 insertions, 17 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)