]> git.sesse.net Git - vlc/blobdiff - modules/stream_out/select.c
Qt: don't try to show an uninitialized time tooltip
[vlc] / modules / stream_out / select.c
index 93d8266ed6bc14fe9f37580ef9473e86cf68686a..ffeefcfe39f9ad8e3e3dc9e427affecd68f8d506 100644 (file)
@@ -50,6 +50,10 @@ static void Close   ( vlc_object_t * );
 #define DISABLE_LONGTEXT N_( \
     "Disable ES id at startup." )
 
+#define ENABLE_TEXT N_("Enable ES id")
+#define ENABLE_LONGTEXT N_( \
+    "Only enable ES id at startup." )
+
 #define SOUT_CFG_PREFIX "sout-select-"
 
 vlc_module_begin ()
@@ -58,6 +62,7 @@ vlc_module_begin ()
     set_capability("sout stream", 50 )
     add_integer(SOUT_CFG_PREFIX "port", 5001, PORT_TEXT, PORT_LONGTEXT, true)
     add_integer(SOUT_CFG_PREFIX "disable", -1, DISABLE_TEXT, DISABLE_LONGTEXT, false)
+    add_integer(SOUT_CFG_PREFIX "enable", -1, ENABLE_TEXT, ENABLE_LONGTEXT, false)
     add_shortcut("select")
     set_callbacks(Open, Close)
 vlc_module_end ()
@@ -69,7 +74,7 @@ static sout_stream_id_t *Add   (sout_stream_t *, es_format_t *);
 static int               Del   (sout_stream_t *, sout_stream_id_t *);
 static int               Send  (sout_stream_t *, sout_stream_id_t *, block_t *);
 
-static void* Command(vlc_object_t *);
+static void* Command(void *);
 
 struct sout_stream_id_t
 {
@@ -85,12 +90,15 @@ struct sout_stream_sys_t
     int i_es_num;
 
     vlc_mutex_t es_lock;
+    vlc_thread_t thread;
+
     int i_fd;
     int i_id_disable;
+    int i_id_enable;
 };
 
 static const char *const ppsz_sout_options[] = {
-    "disable", "port", NULL
+    "enable", "disable", "port", NULL
 };
 
 /*****************************************************************************
@@ -115,14 +123,15 @@ static int Open(vlc_object_t *p_this)
     config_ChainParse(p_stream, SOUT_CFG_PREFIX, ppsz_sout_options,
                       p_stream->p_cfg);
 
-    int port = var_CreateGetInteger(p_stream, SOUT_CFG_PREFIX "port");
+    int port = var_GetInteger(p_stream, SOUT_CFG_PREFIX "port");
     p_sys->i_fd = net_ListenUDP1(VLC_OBJECT(p_stream), NULL, port);
     if (p_sys->i_fd < 0)
     {
         free( p_sys );
         return VLC_EGENERIC;
     }
-    p_sys->i_id_disable = var_CreateGetInteger(p_stream, SOUT_CFG_PREFIX "disable");
+    p_sys->i_id_disable = var_GetInteger(p_stream, SOUT_CFG_PREFIX "disable");
+    p_sys->i_id_enable = var_GetInteger(p_stream, SOUT_CFG_PREFIX "enable");
 
     p_sys->pp_es = NULL;
     p_sys->i_es_num = 0;
@@ -135,7 +144,7 @@ static int Open(vlc_object_t *p_this)
 
     vlc_mutex_init(&p_sys->es_lock);
 
-    if (vlc_thread_create(p_stream, Command, VLC_THREAD_PRIORITY_LOW))
+    if(vlc_clone(&p_sys->thread, Command, p_stream, VLC_THREAD_PRIORITY_LOW))
     {
         vlc_mutex_destroy(&p_sys->es_lock);
         free(p_sys);
@@ -156,11 +165,12 @@ static void Close (vlc_object_t * p_this)
     sout_stream_t     *p_stream = (sout_stream_t*)p_this;
     sout_stream_sys_t *p_sys = (sout_stream_sys_t *)p_stream->p_sys;
 
-    net_Close( p_sys->i_fd );
-    p_sys->i_fd = -1;
-
-    vlc_thread_join(p_stream);
+    /* Stop the thread */
+    vlc_cancel(p_sys->thread);
+    vlc_join(p_sys->thread, NULL);
 
+    /* Free the ressources */
+    net_Close( p_sys->i_fd );
     vlc_mutex_destroy(&p_sys->es_lock);
 
     p_stream->p_sout->i_out_pace_nocontrol--;
@@ -171,18 +181,13 @@ static void Close (vlc_object_t * p_this)
 /****************************************************************************
  * Command Thread:
  ****************************************************************************/
-static void* Command(vlc_object_t *p_this)
+static void* Command(void *p_this)
 {
     sout_stream_t *p_stream = (sout_stream_t *)p_this;
     sout_stream_sys_t *p_sys = p_stream->p_sys;
 
-    int canc = vlc_savecancel();
-
     while (vlc_object_alive(p_stream))
     {
-        if (p_sys->i_fd < 0)
-            break;
-
         char psz_buffer[20];
 
         int i_len = recv(p_sys->i_fd, psz_buffer, sizeof(psz_buffer)-1, 0);
@@ -195,15 +200,14 @@ static void* Command(vlc_object_t *p_this)
         if (strncmp(psz_buffer, "show", 4) == 0)
         {
             vlc_mutex_lock(&p_sys->es_lock);
+            mutex_cleanup_push(&p_sys->es_lock);
             for (int i = 0; i < p_sys->i_es_num; i++)
             {
-                i_len = snprintf(psz_buffer, sizeof(psz_buffer), "%.4s : %d",
+                msg_Info(p_stream, "%.4s : %d",
                                  (char *)&p_sys->pp_es[i]->fmt.i_codec,
                                  p_sys->pp_es[i]->fmt.i_id);
-                psz_buffer[i_len] = '\0';
-                msg_Info(p_stream, psz_buffer);
             }
-            vlc_mutex_unlock(&p_sys->es_lock);
+            vlc_cleanup_pop();
         }
         else
         {
@@ -226,6 +230,7 @@ static void* Command(vlc_object_t *p_this)
             if (b_apply)
             {
                 vlc_mutex_lock(&p_sys->es_lock);
+                mutex_cleanup_push(&p_sys->es_lock);
                 for (int i = 0; i < p_sys->i_es_num; i++)
                 {
                     msg_Info(p_stream, "elementary stream pid %d",
@@ -236,12 +241,11 @@ static void* Command(vlc_object_t *p_this)
                         msg_Info(p_stream, "%s: %d", b_select ? "enable" : "disable", i_pid);
                     }
                 }
-                vlc_mutex_unlock(&p_sys->es_lock);
+                vlc_cleanup_pop();
             }
         }
     }
 
-    vlc_restorecancel(canc);
     return NULL;
 }
 
@@ -255,7 +259,10 @@ static sout_stream_id_t *Add(sout_stream_t *p_stream, es_format_t *p_fmt)
     p_es->fmt = *p_fmt;
     p_es->id = NULL;
     p_es->b_error = false;
-    p_es->b_enabled = (p_es->fmt.i_id == p_sys->i_id_disable) ? false : true;
+    if (p_sys->i_id_disable >= -1)
+        p_es->b_enabled = (p_es->fmt.i_id == p_sys->i_id_disable) ? false : true;
+    else if (p_sys->i_id_enable >= -1)
+        p_es->b_enabled = (p_es->fmt.i_id == p_sys->i_id_enable) ? true: false;
 
     vlc_mutex_lock(&p_sys->es_lock);
     TAB_APPEND(p_sys->i_es_num, p_sys->pp_es, p_es);
@@ -284,7 +291,7 @@ static int Del(sout_stream_t *p_stream, sout_stream_id_t *p_es)
 static int Send(sout_stream_t *p_stream, sout_stream_id_t *p_es,
                 block_t *p_buffer)
 {
-    if (p_es->id == NULL && p_es->b_error != true)
+    if (p_es->id == NULL && !p_es->b_error)
     {
         p_es->id = p_stream->p_next->pf_add(p_stream->p_next, &p_es->fmt);
         if (p_es->id == NULL)
@@ -295,7 +302,7 @@ static int Send(sout_stream_t *p_stream, sout_stream_id_t *p_es,
         }
     }
 
-    if ((p_es->b_error != true) && p_es->b_enabled)
+    if (!p_es->b_error && p_es->b_enabled)
         p_stream->p_next->pf_send(p_stream->p_next, p_es->id, p_buffer);
     else
         block_ChainRelease(p_buffer);