From 8eaf9a2f864739e6344d6616971cacb7f287e955 Mon Sep 17 00:00:00 2001
From: Maxime Bizon <mbizon@freebox.fr>
Date: Tue, 29 Sep 2020 17:58:00 +0200
Subject: [PATCH 4/4] add option to skip read on media transport udp socket

---
 pjmedia/include/pjmedia/transport_udp.h |  4 +++-
 pjmedia/src/pjmedia/transport_udp.c     | 18 ++++++++++++++++--
 2 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/pjmedia/include/pjmedia/transport_udp.h b/pjmedia/include/pjmedia/transport_udp.h
index 308ef4edb..5490ca565 100644
--- a/pjmedia/include/pjmedia/transport_udp.h
+++ b/pjmedia/include/pjmedia/transport_udp.h
@@ -56,7 +56,9 @@ enum pjmedia_transport_udp_options
      * received.
      * Specifying this option will disable this feature.
      */
-    PJMEDIA_UDP_NO_SRC_ADDR_CHECKING = 1
+    PJMEDIA_UDP_NO_SRC_ADDR_CHECKING = 1,
+
+    PJMEDIA_UDP_SKIP_READ = 2,
 };
 
 
diff --git a/pjmedia/src/pjmedia/transport_udp.c b/pjmedia/src/pjmedia/transport_udp.c
index f3ecff76b..10f6ca522 100644
--- a/pjmedia/src/pjmedia/transport_udp.c
+++ b/pjmedia/src/pjmedia/transport_udp.c
@@ -339,6 +339,9 @@ PJ_DEF(pj_status_t) pjmedia_transport_udp_attach( pjmedia_endpt *endpt,
 		  pj_sockaddr_get_addr_len(&tp->rtp_addr_name));
     }
 
+    if (tp->options & PJMEDIA_UDP_SKIP_READ)
+	    goto done;
+
     /* Setup RTP socket with the ioqueue */
     pj_bzero(&rtp_cb, sizeof(rtp_cb));
     rtp_cb.on_read_complete = &on_rx_rtp;
@@ -374,7 +377,6 @@ PJ_DEF(pj_status_t) pjmedia_transport_udp_attach( pjmedia_endpt *endpt,
 	goto on_error;
 #endif
 
-
     /* Setup RTCP socket with ioqueue */
     pj_bzero(&rtcp_cb, sizeof(rtcp_cb));
     rtcp_cb.on_read_complete = &on_rx_rtcp;
@@ -403,6 +405,7 @@ PJ_DEF(pj_status_t) pjmedia_transport_udp_attach( pjmedia_endpt *endpt,
 	goto on_error;
 #endif	
 
+done:
     tp->ioqueue = ioqueue;
 
     /* Done */
@@ -796,6 +799,8 @@ static pj_status_t tp_attach  	      (pjmedia_transport *tp,
     int rem_addr_len;
     pj_status_t status;
 
+    PJ_ASSERT_RETURN(!(udp->options & PJMEDIA_UDP_SKIP_READ), PJ_EINVAL);
+
     /* Validate arguments */
     PJ_ASSERT_RETURN(tp && rem_addr && addr_len, PJ_EINVAL);
 
@@ -955,7 +960,7 @@ static void transport_detach( pjmedia_transport *tp,
     pj_assert(tp);
 
     //if (udp->attached) {
-    if (1) {
+    if (!(udp->options & PJMEDIA_UDP_SKIP_READ)) {
 	int i;
 
 	/* Lock the ioqueue keys to make sure that callbacks are
@@ -1217,6 +1222,10 @@ static pj_status_t transport_media_start(pjmedia_transport *tp,
     PJ_UNUSED_ARG(sdp_remote);
     PJ_UNUSED_ARG(media_index);
 
+    if (udp->options & PJMEDIA_UDP_SKIP_READ)
+	    goto done;
+
+
     /* Just return success if there is already pending read */
     if (udp->started)
 	return PJ_SUCCESS;
@@ -1242,6 +1251,7 @@ static pj_status_t transport_media_start(pjmedia_transport *tp,
 
     udp->started = PJ_TRUE;
 
+done:
     return PJ_SUCCESS;
 }
 
@@ -1343,6 +1353,9 @@ static pj_status_t transport_restart(pj_bool_t is_rtp,
 				 PJ_TRUE, &sobuf_size);
     }
 #endif
+
+    if (udp->options & PJMEDIA_UDP_SKIP_READ)
+	    goto done;
     pj_bzero(&cb, sizeof(cb));
     if (is_rtp) {
 	cb.on_read_complete = &on_rx_rtp;
@@ -1379,6 +1392,7 @@ static pj_status_t transport_restart(pj_bool_t is_rtp,
 	goto on_error;
 
     udp->started = PJ_TRUE;
+done:
     PJ_LOG(4, (udp->base.name, "Success restarting %s transport", 
 	      (is_rtp)?"RTP":"RTCP"));
     return PJ_SUCCESS;
-- 
2.17.1

