RTP: notify demux thread when RTP flow is dead
authorRémi Denis-Courmont <rdenis@simphalempin.com>
Thu, 27 Nov 2008 16:43:15 +0000 (18:43 +0200)
committerRémi Denis-Courmont <rdenis@simphalempin.com>
Thu, 27 Nov 2008 17:12:52 +0000 (19:12 +0200)
modules/access/rtp/input.c
modules/access/rtp/rtp.c
modules/access/rtp/rtp.h

index 995c7ba..dc1110b 100644 (file)
@@ -160,30 +160,32 @@ void *rtp_thread (void *data)
     demux_t *demux = data;
     demux_sys_t *p_sys = demux->p_sys;
 
     demux_t *demux = data;
     demux_sys_t *p_sys = demux->p_sys;
 
-    for (;;)
+    do
     {
         block_t *block = rtp_recv (demux);
     {
         block_t *block = rtp_recv (demux);
-        if (block == NULL)
-            break; /* fatal error: abort */
 
         vlc_mutex_lock (&p_sys->lock);
 
         vlc_mutex_lock (&p_sys->lock);
-
-        /* Autodetect payload type, _before_ rtp_queue() */
-        if (p_sys->autodetect)
+        if (block == NULL)
+            p_sys->dead = true; /* Fatal error: abort */
+        else
         {
         {
-            if (rtp_autodetect (demux, p_sys->session, block))
-            {
-                block_Release (block);
-                continue;
+            if (p_sys->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;
+                }
+                p_sys->autodetect = false;
             }
             }
-            p_sys->autodetect = false;
+            rtp_queue (demux, p_sys->session, block);
         }
         }
-
-        rtp_queue (demux, p_sys->session, block);
         vlc_cond_signal (&p_sys->wait);
         vlc_mutex_unlock (&p_sys->lock);
     }
         vlc_cond_signal (&p_sys->wait);
         vlc_mutex_unlock (&p_sys->lock);
     }
-    /* TODO: return 0 from Demux */
+    while (!p_sys->dead);
+
     return NULL;
 }
 
     return NULL;
 }
 
index 0fb398f..c3b4bd0 100644 (file)
@@ -237,6 +237,7 @@ static int Open (vlc_object_t *obj)
     p_sys->max_misorder = var_CreateGetInteger (obj, "rtp-max-misorder");
     p_sys->autodetect   = true;
     p_sys->framed_rtp   = (tp == IPPROTO_TCP);
     p_sys->max_misorder = var_CreateGetInteger (obj, "rtp-max-misorder");
     p_sys->autodetect   = true;
     p_sys->framed_rtp   = (tp == IPPROTO_TCP);
+    p_sys->dead         = false;
 
     demux->pf_demux   = Demux;
     demux->pf_control = Control;
 
     demux->pf_demux   = Demux;
     demux->pf_control = Control;
index c27c289..9861664 100644 (file)
@@ -63,10 +63,11 @@ struct demux_sys_t
 
     unsigned      caching;
     unsigned      timeout;
 
     unsigned      caching;
     unsigned      timeout;
-    uint8_t       max_src;
-    uint16_t      max_dropout;
-    uint16_t      max_misorder;
-    bool          autodetect;
-    bool          framed_rtp;
+    uint16_t      max_dropout; /**< Max packet forward misordering */
+    uint16_t      max_misorder; /**< Max packet backward misordering */
+    uint8_t       max_src; /**< Max simultaneous RTP sources */
+    bool          autodetect; /**< Payload format autodetection */
+    bool          framed_rtp; /**< Framed RTP packets over TCP */
+    bool          dead; /**< End of stream */
 };
 
 };