[vlc-devel] commit: RTP: avoid pf_demux. Fix input thread latency ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sun Jul 19 15:06:35 CEST 2009
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Jul 19 16:06:14 2009 +0300| [f4348329b900bda543069e735bc364e73669aaa6] | committer: Rémi Denis-Courmont
RTP: avoid pf_demux. Fix input thread latency
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f4348329b900bda543069e735bc364e73669aaa6
---
modules/access/rtp/input.c | 64 +++++++++++++++++++++--------------------
modules/access/rtp/rtp.c | 14 +--------
modules/access/rtp/rtp.h | 5 ++-
modules/access/rtp/session.c | 2 +
4 files changed, 39 insertions(+), 46 deletions(-)
diff --git a/modules/access/rtp/input.c b/modules/access/rtp/input.c
index 1f0f164..fc58bc5 100644
--- a/modules/access/rtp/input.c
+++ b/modules/access/rtp/input.c
@@ -160,60 +160,62 @@ static block_t *rtp_recv (demux_t *demux)
}
+static void timer_cleanup (void *timer)
+{
+ vlc_timer_destroy (timer);
+}
+
+static void rtp_process (void *data);
+
void *rtp_thread (void *data)
{
demux_t *demux = data;
demux_sys_t *p_sys = demux->p_sys;
- bool autodetect = true;
+ bool autodetect = true, reorder = false;
- do
+ if (vlc_timer_create (&p_sys->timer, rtp_process, data))
+ return NULL;
+ vlc_cleanup_push (timer_cleanup, &p_sys->timer);
+
+ for (;;)
{
block_t *block = rtp_recv (demux);
-
- vlc_mutex_lock (&p_sys->lock);
if (block == NULL)
- p_sys->dead = true; /* Fatal error: abort */
- else
- {
- if (autodetect)
- { /* Autodetect payload type, _before_ rtp_queue() */
- if (rtp_autodetect (demux, p_sys->session, block))
- {
- vlc_mutex_unlock (&p_sys->lock);
- block_Release (block);
- continue;
- }
- autodetect = false;
+ break;
+
+ if (autodetect)
+ { /* Autodetect payload type, _before_ rtp_queue() */
+ /* No need for lock - the queue is empty. */
+ if (rtp_autodetect (demux, p_sys->session, block))
+ {
+ block_Release (block);
+ continue;
}
- rtp_queue (demux, p_sys->session, block);
+ autodetect = false;
}
- vlc_cond_signal (&p_sys->wait);
+
+ vlc_mutex_lock (&p_sys->lock);
+ rtp_queue (demux, p_sys->session, block);
vlc_mutex_unlock (&p_sys->lock);
- }
- while (!p_sys->dead);
+ rtp_process (demux);
+ }
+ vlc_cleanup_run ();
return NULL;
}
/**
* Process one RTP packet from the de-jitter queue.
- * @return 0 on success, -1 on EOF
*/
-int rtp_process (demux_t *demux)
+static void rtp_process (void *data)
{
+ demux_t *demux = data;
demux_sys_t *p_sys = demux->p_sys;
- mtime_t deadline = INT64_MAX;
- int ret;
+ mtime_t deadline;
vlc_mutex_lock (&p_sys->lock);
if (rtp_dequeue (demux, p_sys->session, &deadline))
- /* Pace the demux thread */
- vlc_cond_timedwait (&p_sys->wait, &p_sys->lock, deadline);
- else
- vlc_cond_wait (&p_sys->wait, &p_sys->lock);
- ret = p_sys->dead ? -1 : 0;
+ vlc_timer_schedule (&p_sys->timer, true, deadline, 0);
vlc_mutex_unlock (&p_sys->lock);
-
- return ret;
}
diff --git a/modules/access/rtp/rtp.c b/modules/access/rtp/rtp.c
index 90bbe4f..8d58d2e 100644
--- a/modules/access/rtp/rtp.c
+++ b/modules/access/rtp/rtp.c
@@ -139,7 +139,6 @@ vlc_module_end ()
/*
* Local prototypes
*/
-static int Demux (demux_t *);
static int Control (demux_t *, int i_query, va_list args);
static int extract_port (char **phost);
@@ -236,7 +235,6 @@ static int Open (vlc_object_t *obj)
}
vlc_mutex_init (&p_sys->lock);
- vlc_cond_init (&p_sys->wait);
p_sys->srtp = NULL;
p_sys->fd = fd;
p_sys->rtcp_fd = rtcp_fd;
@@ -246,9 +244,8 @@ static int Open (vlc_object_t *obj)
p_sys->max_dropout = var_CreateGetInteger (obj, "rtp-max-dropout");
p_sys->max_misorder = var_CreateGetInteger (obj, "rtp-max-misorder");
p_sys->framed_rtp = (tp == IPPROTO_TCP);
- p_sys->dead = false;
- demux->pf_demux = Demux;
+ demux->pf_demux = NULL;
demux->pf_control = Control;
demux->p_sys = p_sys;
@@ -303,7 +300,6 @@ static void Close (vlc_object_t *obj)
vlc_cancel (p_sys->thread);
vlc_join (p_sys->thread, NULL);
}
- vlc_cond_destroy (&p_sys->wait);
vlc_mutex_destroy (&p_sys->lock);
if (p_sys->srtp)
@@ -676,11 +672,3 @@ int rtp_autodetect (demux_t *demux, rtp_session_t *session,
* Dynamic payload type handlers
* Hmm, none implemented yet.
*/
-
-/**
- * Processing callback
- */
-static int Demux (demux_t *demux)
-{
- return rtp_process (demux) ? 0 : 1;
-}
diff --git a/modules/access/rtp/rtp.h b/modules/access/rtp/rtp.h
index 86fbc3e..15cbfad 100644
--- a/modules/access/rtp/rtp.h
+++ b/modules/access/rtp/rtp.h
@@ -46,7 +46,6 @@ void rtp_queue (demux_t *, rtp_session_t *, block_t *);
bool rtp_dequeue (demux_t *, const rtp_session_t *, mtime_t *);
int rtp_add_type (demux_t *demux, rtp_session_t *ses, const rtp_pt_t *pt);
-int rtp_process (demux_t *demux);
void *rtp_thread (void *data);
/* Global data */
@@ -57,8 +56,8 @@ struct demux_sys_t
int fd;
int rtcp_fd;
vlc_thread_t thread;
+ vlc_timer_t timer;
vlc_mutex_t lock;
- vlc_cond_t wait;
bool thread_ready;
unsigned caching;
@@ -67,6 +66,8 @@ struct demux_sys_t
uint16_t max_misorder; /**< Max packet backward misordering */
uint8_t max_src; /**< Max simultaneous RTP sources */
bool framed_rtp; /**< Framed RTP packets over TCP */
+#if 0
bool dead; /**< End of stream */
+#endif
};
diff --git a/modules/access/rtp/session.c b/modules/access/rtp/session.c
index c3755d5..3fac50d 100644
--- a/modules/access/rtp/session.c
+++ b/modules/access/rtp/session.c
@@ -453,6 +453,8 @@ bool rtp_dequeue (demux_t *demux, const rtp_session_t *session,
mtime_t now = mdate ();
bool pending = false;
+ *deadlinep = INT64_MAX;
+
for (unsigned i = 0, max = session->srcc; i < max; i++)
{
rtp_source_t *src = session->srcv[i];
More information about the vlc-devel
mailing list